Documentation ¶
Index ¶
- Variables
- func GetErrorFrame(dimensions image.Rectangle, d *Device, inputErr string) (frame image.Image, err error)
- func GetFrame(dimensions image.Rectangle, d *Device) (frame image.Image, err error)
- type Conversation
- type CursorIcon
- type Device
- func (d *Device) BytesToMessage(input []byte) (output Message, err error)
- func (d *Device) ChangeLEDAnimationWithContinue(newAnimation *LEDAnimation) (err error)
- func (d *Device) ChangeLEDAnimationWithoutContinue(newAnimation *LEDAnimation) (err error)
- func (d *Device) ChangeStateWithHistory(newState *State) (err error)
- func (d *Device) ChangeStateWithoutHistory(newState *State) (err error)
- func (d *Device) GoBackState() (err error)
- func (d *Device) MesageToBytes(input Message) (output []byte, err error)
- func (d *Device) NewConversation(p Person) (c *Conversation)
- func (d *Device) ProcessConversationInputEventNumber(button *KeyboardButton) (err error)
- func (d *Device) ProcessConversationInputEventNumber0() (err error)
- func (d *Device) ProcessConversationInputEventNumber1() (err error)
- func (d *Device) ProcessConversationInputEventNumber2() (err error)
- func (d *Device) ProcessConversationInputEventNumber3() (err error)
- func (d *Device) ProcessConversationInputEventNumber4() (err error)
- func (d *Device) ProcessConversationInputEventNumber5() (err error)
- func (d *Device) ProcessConversationInputEventNumber6() (err error)
- func (d *Device) ProcessConversationInputEventNumber7() (err error)
- func (d *Device) ProcessConversationInputEventNumber8() (err error)
- func (d *Device) ProcessConversationInputEventNumber9() (err error)
- func (d *Device) ProcessInputEvent(inputEvent InputEvent) (err error)
- func (d *Device) ProcessInputEventAccept() (err error)
- func (d *Device) ProcessInputEventDown() (err error)
- func (d *Device) ProcessInputEventUp() (err error)
- func (d *Device) ReceiveFromRadio(packetPayload []byte) (err error)
- func (d *Device) UpdateConversationsMenu()
- type InputEvent
- type KeyboardButton
- type LEDAnimation
- type MenuItem
- type Message
- type Person
- type State
Constants ¶
This section is empty.
Variables ¶
var ( ErrCursorIconBoxBoolTypeError = errors.New("data is not a bool") ErrDefaultMenuItem = errors.New("this error should not appear, if it does please tell us") ErrRadioSendNotDefined = errors.New("radio send function not defined by user") ErrConversationReaderAcceptDisallowed = errors.New("cannot accept in conversation reader") ErrGoBackStateRootState = errors.New("already at root state") ErrInvalidMessage = errors.New("invalid message, prefix incorrect") )
Define errors
var ( KeyboardButton1 = &KeyboardButton{[]string{"1", "2"}, time.Time{}, 0} KeyboardButton2 = &KeyboardButton{[]string{"a", "b", "c"}, time.Time{}, 0} KeyboardButton3 = &KeyboardButton{[]string{"d", "e", "f"}, time.Time{}, 0} KeyboardButton4 = &KeyboardButton{[]string{"g", "h", "i"}, time.Time{}, 0} KeyboardButton5 = &KeyboardButton{[]string{"j", "k", "l"}, time.Time{}, 0} KeyboardButton6 = &KeyboardButton{[]string{"m", "n", "o"}, time.Time{}, 0} KeyboardButton7 = &KeyboardButton{[]string{"p", "q", "r", "s"}, time.Time{}, 0} KeyboardButton8 = &KeyboardButton{[]string{"t", "u", "v"}, time.Time{}, 0} KeyboardButton9 = &KeyboardButton{[]string{"w", "x", "y", "z"}, time.Time{}, 0} KeyboardButton0 = &KeyboardButton{[]string{" "}, time.Time{}, 0} )
Define the Keyboard Buttons
var ( // CursorIconRightArrow is a cursor that is a right arrow. It does not need any data. CursorIconRightArrow = func(img *image.RGBA, x int, y int, data any) (err error) { col := color.RGBA{255, 255, 255, 255} img.Set(x+0, y+0, col) img.Set(x+1, y+1, col) img.Set(x+2, y+2, col) img.Set(x+3, y+3, col) img.Set(x+2, y+4, col) img.Set(x+1, y+5, col) img.Set(x+0, y+6, col) return nil } // CursorIconLeftArrow is a cursor that is a left arrow. It does not need any data. CursorIconLeftArrow = func(img *image.RGBA, x int, y int, data any) (err error) { col := color.RGBA{255, 255, 255, 255} img.Set(x+6, y+0, col) img.Set(x+5, y+1, col) img.Set(x+4, y+2, col) img.Set(x+3, y+3, col) img.Set(x+4, y+4, col) img.Set(x+5, y+5, col) img.Set(x+6, y+6, col) return nil } // CursorIconBox is a cursor that is a box. It takes in a bool as data. If the bool is true, the box will be filled in. If the bool is false, the box will be empty. CursorIconBox = func(img *image.RGBA, x int, y int, data any) (err error) { isChecked, ok := data.(bool) if !ok { return ErrCursorIconBoxBoolTypeError } for i := 0; i < 7; i++ { for j := 0; j < 7; j++ { img.Set(x+i, y+j, color.RGBA{255, 255, 255, 255}) } } if !isChecked { for i := 1; i < 6; i++ { for j := 1; j < 6; j++ { img.Set(x+i, y+j, color.RGBA{0, 0, 0, 255}) } } } return nil } )
Define Cursors
var ( // StateDefault is a State that does nothing. It is used as a placeholder for the default State of the Device. StateDefault = State{ Title: "DefaultState", Content: []MenuItem{MenuItemDefault}, HighlightedItemIndex: 0, } // StateConversationReader is a special State that is used when reading a Conversation. StateConversationReader = State{ Title: "", Content: []MenuItem{}, } // StateMainMenu is a State that shows the main menu. StateMainMenu = State{ Title: "Main Menu", Content: []MenuItem{MainMenuItemConversations, MainMenuItemPeople, MainMenuItemGames, MainMenuItemDemos, MainMenuItemTools, MainMenuItemSettings}, HighlightedItemIndex: 0, } // StateConversationsMenu is a State that shows the conversations menu. StateConversationsMenu = State{ Title: "Conversations", Content: []MenuItem{GlobalMenuItemGoBack, ConversationsMenuItemNew}, HighlightedItemIndex: 0, } // StateConversationsMenuOld is a copy of StateConversationsMenu that can be used as a starting point to reset StateConversationsMenu. StateConversationsMenuOld = StateConversationsMenu // StateNewConversation is a special State that is used when creating a new Conversation. StateNewConversation = State{ Title: "New Conversation", Content: []MenuItem{GlobalMenuItemGoBack}, HighlightedItemIndex: 0, } // StatePeopleMenu is a State that shows the people menu. StatePeopleMenu = State{ Title: "People", Content: []MenuItem{GlobalMenuItemGoBack}, HighlightedItemIndex: 0, } // StateGamesMenu is a State that shows the games menu. StateGamesMenu = State{ Title: "Games", Content: []MenuItem{GlobalMenuItemGoBack}, HighlightedItemIndex: 0, } // StateDemosMenu is a State that shows the demos menu. StateDemosMenu = State{ Title: "Demos", Content: []MenuItem{GlobalMenuItemGoBack, DemoMenuItemRGB}, HighlightedItemIndex: 0, } // StateToolsMenu is a State that shows the tools menu. StateToolsMenu = State{ Title: "Tools", Content: []MenuItem{GlobalMenuItemGoBack, ToolsMenuItemSOS}, HighlightedItemIndex: 0, } // StateSettingsMenu is a State that shows the settings menu. StateSettingsMenu = State{ Title: "Settings", Content: []MenuItem{GlobalMenuItemGoBack}, HighlightedItemIndex: 0, } )
Define States
var ( // LEDAnimationDefault is the default LED animation. It is used when no other animation is active and is simply black. LEDAnimationDefault = LEDAnimation{ FrameDuration: 100 * time.Millisecond, CurrentFrame: 0, Frames: [][6]color.RGBA{ {color.RGBA{0, 0, 0, 0}, color.RGBA{0, 0, 0, 0}, color.RGBA{0, 0, 0, 0}, color.RGBA{0, 0, 0, 0}, color.RGBA{0, 0, 0, 0}, color.RGBA{0, 0, 0, 0}}, }, } // LEDAnimationSOS is an LED animation that shows the SOS message in morse code. LEDAnimationSOS = LEDAnimation{ FrameDuration: 200 * time.Millisecond, CurrentFrame: 0, Frames: [][6]color.RGBA{ {color.RGBA{255, 255, 255, 255}, color.RGBA{255, 255, 255, 255}, color.RGBA{255, 255, 255, 255}, color.RGBA{255, 255, 255, 255}, color.RGBA{255, 255, 255, 255}, color.RGBA{255, 255, 255, 255}}, {color.RGBA{0, 0, 0, 0}, color.RGBA{0, 0, 0, 0}, color.RGBA{0, 0, 0, 0}, color.RGBA{0, 0, 0, 0}, color.RGBA{0, 0, 0, 0}, color.RGBA{0, 0, 0, 0}}, {color.RGBA{255, 255, 255, 255}, color.RGBA{255, 255, 255, 255}, color.RGBA{255, 255, 255, 255}, color.RGBA{255, 255, 255, 255}, color.RGBA{255, 255, 255, 255}, color.RGBA{255, 255, 255, 255}}, {color.RGBA{0, 0, 0, 0}, color.RGBA{0, 0, 0, 0}, color.RGBA{0, 0, 0, 0}, color.RGBA{0, 0, 0, 0}, color.RGBA{0, 0, 0, 0}, color.RGBA{0, 0, 0, 0}}, {color.RGBA{255, 255, 255, 255}, color.RGBA{255, 255, 255, 255}, color.RGBA{255, 255, 255, 255}, color.RGBA{255, 255, 255, 255}, color.RGBA{255, 255, 255, 255}, color.RGBA{255, 255, 255, 255}}, {color.RGBA{0, 0, 0, 0}, color.RGBA{0, 0, 0, 0}, color.RGBA{0, 0, 0, 0}, color.RGBA{0, 0, 0, 0}, color.RGBA{0, 0, 0, 0}, color.RGBA{0, 0, 0, 0}}, {color.RGBA{0, 0, 0, 0}, color.RGBA{0, 0, 0, 0}, color.RGBA{0, 0, 0, 0}, color.RGBA{0, 0, 0, 0}, color.RGBA{0, 0, 0, 0}, color.RGBA{0, 0, 0, 0}}, {color.RGBA{255, 255, 255, 255}, color.RGBA{255, 255, 255, 255}, color.RGBA{255, 255, 255, 255}, color.RGBA{255, 255, 255, 255}, color.RGBA{255, 255, 255, 255}, color.RGBA{255, 255, 255, 255}}, {color.RGBA{255, 255, 255, 255}, color.RGBA{255, 255, 255, 255}, color.RGBA{255, 255, 255, 255}, color.RGBA{255, 255, 255, 255}, color.RGBA{255, 255, 255, 255}, color.RGBA{255, 255, 255, 255}}, {color.RGBA{255, 255, 255, 255}, color.RGBA{255, 255, 255, 255}, color.RGBA{255, 255, 255, 255}, color.RGBA{255, 255, 255, 255}, color.RGBA{255, 255, 255, 255}, color.RGBA{255, 255, 255, 255}}, {color.RGBA{0, 0, 0, 0}, color.RGBA{0, 0, 0, 0}, color.RGBA{0, 0, 0, 0}, color.RGBA{0, 0, 0, 0}, color.RGBA{0, 0, 0, 0}, color.RGBA{0, 0, 0, 0}}, {color.RGBA{255, 255, 255, 255}, color.RGBA{255, 255, 255, 255}, color.RGBA{255, 255, 255, 255}, color.RGBA{255, 255, 255, 255}, color.RGBA{255, 255, 255, 255}, color.RGBA{255, 255, 255, 255}}, {color.RGBA{255, 255, 255, 255}, color.RGBA{255, 255, 255, 255}, color.RGBA{255, 255, 255, 255}, color.RGBA{255, 255, 255, 255}, color.RGBA{255, 255, 255, 255}, color.RGBA{255, 255, 255, 255}}, {color.RGBA{255, 255, 255, 255}, color.RGBA{255, 255, 255, 255}, color.RGBA{255, 255, 255, 255}, color.RGBA{255, 255, 255, 255}, color.RGBA{255, 255, 255, 255}, color.RGBA{255, 255, 255, 255}}, {color.RGBA{0, 0, 0, 0}, color.RGBA{0, 0, 0, 0}, color.RGBA{0, 0, 0, 0}, color.RGBA{0, 0, 0, 0}, color.RGBA{0, 0, 0, 0}, color.RGBA{0, 0, 0, 0}}, {color.RGBA{255, 255, 255, 255}, color.RGBA{255, 255, 255, 255}, color.RGBA{255, 255, 255, 255}, color.RGBA{255, 255, 255, 255}, color.RGBA{255, 255, 255, 255}, color.RGBA{255, 255, 255, 255}}, {color.RGBA{255, 255, 255, 255}, color.RGBA{255, 255, 255, 255}, color.RGBA{255, 255, 255, 255}, color.RGBA{255, 255, 255, 255}, color.RGBA{255, 255, 255, 255}, color.RGBA{255, 255, 255, 255}}, {color.RGBA{255, 255, 255, 255}, color.RGBA{255, 255, 255, 255}, color.RGBA{255, 255, 255, 255}, color.RGBA{255, 255, 255, 255}, color.RGBA{255, 255, 255, 255}, color.RGBA{255, 255, 255, 255}}, {color.RGBA{0, 0, 0, 0}, color.RGBA{0, 0, 0, 0}, color.RGBA{0, 0, 0, 0}, color.RGBA{0, 0, 0, 0}, color.RGBA{0, 0, 0, 0}, color.RGBA{0, 0, 0, 0}}, {color.RGBA{0, 0, 0, 0}, color.RGBA{0, 0, 0, 0}, color.RGBA{0, 0, 0, 0}, color.RGBA{0, 0, 0, 0}, color.RGBA{0, 0, 0, 0}, color.RGBA{0, 0, 0, 0}}, {color.RGBA{255, 255, 255, 255}, color.RGBA{255, 255, 255, 255}, color.RGBA{255, 255, 255, 255}, color.RGBA{255, 255, 255, 255}, color.RGBA{255, 255, 255, 255}, color.RGBA{255, 255, 255, 255}}, {color.RGBA{0, 0, 0, 0}, color.RGBA{0, 0, 0, 0}, color.RGBA{0, 0, 0, 0}, color.RGBA{0, 0, 0, 0}, color.RGBA{0, 0, 0, 0}, color.RGBA{0, 0, 0, 0}}, {color.RGBA{255, 255, 255, 255}, color.RGBA{255, 255, 255, 255}, color.RGBA{255, 255, 255, 255}, color.RGBA{255, 255, 255, 255}, color.RGBA{255, 255, 255, 255}, color.RGBA{255, 255, 255, 255}}, {color.RGBA{0, 0, 0, 0}, color.RGBA{0, 0, 0, 0}, color.RGBA{0, 0, 0, 0}, color.RGBA{0, 0, 0, 0}, color.RGBA{0, 0, 0, 0}, color.RGBA{0, 0, 0, 0}}, {color.RGBA{255, 255, 255, 255}, color.RGBA{255, 255, 255, 255}, color.RGBA{255, 255, 255, 255}, color.RGBA{255, 255, 255, 255}, color.RGBA{255, 255, 255, 255}, color.RGBA{255, 255, 255, 255}}, {color.RGBA{0, 0, 0, 0}, color.RGBA{0, 0, 0, 0}, color.RGBA{0, 0, 0, 0}, color.RGBA{0, 0, 0, 0}, color.RGBA{0, 0, 0, 0}, color.RGBA{0, 0, 0, 0}}, {color.RGBA{0, 0, 0, 0}, color.RGBA{0, 0, 0, 0}, color.RGBA{0, 0, 0, 0}, color.RGBA{0, 0, 0, 0}, color.RGBA{0, 0, 0, 0}, color.RGBA{0, 0, 0, 0}}, {color.RGBA{0, 0, 0, 0}, color.RGBA{0, 0, 0, 0}, color.RGBA{0, 0, 0, 0}, color.RGBA{0, 0, 0, 0}, color.RGBA{0, 0, 0, 0}, color.RGBA{0, 0, 0, 0}}, {color.RGBA{0, 0, 0, 0}, color.RGBA{0, 0, 0, 0}, color.RGBA{0, 0, 0, 0}, color.RGBA{0, 0, 0, 0}, color.RGBA{0, 0, 0, 0}, color.RGBA{0, 0, 0, 0}}, {color.RGBA{0, 0, 0, 0}, color.RGBA{0, 0, 0, 0}, color.RGBA{0, 0, 0, 0}, color.RGBA{0, 0, 0, 0}, color.RGBA{0, 0, 0, 0}, color.RGBA{0, 0, 0, 0}}, {color.RGBA{0, 0, 0, 0}, color.RGBA{0, 0, 0, 0}, color.RGBA{0, 0, 0, 0}, color.RGBA{0, 0, 0, 0}, color.RGBA{0, 0, 0, 0}, color.RGBA{0, 0, 0, 0}}, {color.RGBA{0, 0, 0, 0}, color.RGBA{0, 0, 0, 0}, color.RGBA{0, 0, 0, 0}, color.RGBA{0, 0, 0, 0}, color.RGBA{0, 0, 0, 0}, color.RGBA{0, 0, 0, 0}}, }, } // LEDAnimationDemo is an LED animation that shows off the capabilities of the LED animation system. LEDAnimationDemo = LEDAnimation{ FrameDuration: 1 * time.Millisecond, CurrentFrame: 0, Frames: [][6]color.RGBA{ {color.RGBA{0, 0, 0, 0}, color.RGBA{0, 0, 0, 0}, color.RGBA{0, 0, 0, 0}, color.RGBA{0, 0, 0, 0}, color.RGBA{0, 0, 0, 0}, color.RGBA{0, 0, 0, 0}}, {color.RGBA{0, 255, 0, 0}, color.RGBA{0, 0, 0, 0}, color.RGBA{0, 0, 0, 0}, color.RGBA{0, 0, 0, 0}, color.RGBA{0, 0, 0, 0}, color.RGBA{0, 0, 0, 0}}, {color.RGBA{0, 0, 255, 0}, color.RGBA{0, 255, 0, 0}, color.RGBA{0, 0, 0, 0}, color.RGBA{0, 0, 0, 0}, color.RGBA{0, 0, 0, 0}, color.RGBA{0, 0, 0, 0}}, {color.RGBA{255, 0, 0, 0}, color.RGBA{0, 0, 255, 0}, color.RGBA{0, 255, 0, 0}, color.RGBA{0, 0, 0, 0}, color.RGBA{0, 0, 0, 0}, color.RGBA{0, 0, 0, 0}}, {color.RGBA{0, 0, 255, 0}, color.RGBA{255, 0, 0, 0}, color.RGBA{0, 0, 255, 0}, color.RGBA{0, 255, 0, 0}, color.RGBA{0, 0, 0, 0}, color.RGBA{0, 0, 0, 0}}, {color.RGBA{255, 0, 0, 0}, color.RGBA{0, 0, 255, 0}, color.RGBA{255, 0, 0, 0}, color.RGBA{0, 0, 255, 0}, color.RGBA{0, 255, 0, 0}, color.RGBA{0, 0, 0, 0}}, {color.RGBA{0, 0, 255, 0}, color.RGBA{255, 0, 0, 0}, color.RGBA{0, 0, 255, 0}, color.RGBA{255, 0, 0, 0}, color.RGBA{0, 0, 255, 0}, color.RGBA{0, 255, 0, 0}}, {color.RGBA{0, 0, 0, 0}, color.RGBA{0, 0, 255, 0}, color.RGBA{255, 0, 0, 0}, color.RGBA{0, 0, 255, 0}, color.RGBA{255, 0, 0, 0}, color.RGBA{0, 0, 255, 0}}, {color.RGBA{0, 0, 0, 0}, color.RGBA{0, 0, 0, 0}, color.RGBA{0, 0, 255, 0}, color.RGBA{255, 0, 0, 0}, color.RGBA{0, 0, 255, 0}, color.RGBA{255, 0, 0, 0}}, {color.RGBA{0, 0, 0, 0}, color.RGBA{0, 0, 0, 0}, color.RGBA{0, 0, 0, 0}, color.RGBA{0, 0, 255, 0}, color.RGBA{255, 0, 0, 0}, color.RGBA{0, 0, 255, 0}}, {color.RGBA{0, 0, 0, 0}, color.RGBA{0, 0, 0, 0}, color.RGBA{0, 0, 0, 0}, color.RGBA{0, 0, 0, 0}, color.RGBA{0, 0, 255, 0}, color.RGBA{255, 0, 0, 0}}, {color.RGBA{0, 0, 0, 0}, color.RGBA{0, 0, 0, 0}, color.RGBA{0, 0, 0, 0}, color.RGBA{0, 0, 0, 0}, color.RGBA{0, 0, 0, 0}, color.RGBA{0, 0, 255, 0}}, {color.RGBA{0, 0, 0, 0}, color.RGBA{0, 0, 0, 0}, color.RGBA{0, 0, 0, 0}, color.RGBA{0, 0, 0, 0}, color.RGBA{0, 0, 0, 0}, color.RGBA{0, 0, 0, 0}}, {color.RGBA{0, 0, 0, 0}, color.RGBA{0, 0, 0, 0}, color.RGBA{0, 0, 0, 0}, color.RGBA{0, 0, 0, 0}, color.RGBA{0, 0, 0, 0}, color.RGBA{0, 0, 0, 0}}, {color.RGBA{0, 0, 0, 0}, color.RGBA{0, 0, 0, 0}, color.RGBA{0, 0, 0, 0}, color.RGBA{0, 0, 0, 0}, color.RGBA{0, 0, 0, 0}, color.RGBA{0, 0, 0, 0}}, {color.RGBA{0, 0, 0, 0}, color.RGBA{0, 0, 0, 0}, color.RGBA{0, 0, 0, 0}, color.RGBA{0, 0, 0, 0}, color.RGBA{0, 0, 0, 0}, color.RGBA{0, 0, 0, 0}}, {color.RGBA{50, 50, 50, 0}, color.RGBA{50, 50, 50, 0}, color.RGBA{50, 50, 50, 0}, color.RGBA{50, 50, 50, 0}, color.RGBA{50, 50, 50, 0}, color.RGBA{50, 50, 50, 0}}, {color.RGBA{100, 100, 100, 0}, color.RGBA{100, 100, 100, 0}, color.RGBA{100, 100, 100, 0}, color.RGBA{100, 100, 100, 0}, color.RGBA{100, 100, 100, 0}, color.RGBA{100, 100, 100, 0}}, {color.RGBA{150, 150, 150, 0}, color.RGBA{150, 150, 150, 0}, color.RGBA{150, 150, 150, 0}, color.RGBA{150, 150, 150, 0}, color.RGBA{150, 150, 150, 0}, color.RGBA{150, 150, 150, 0}}, {color.RGBA{200, 200, 200, 0}, color.RGBA{200, 200, 200, 0}, color.RGBA{200, 200, 200, 0}, color.RGBA{200, 200, 200, 0}, color.RGBA{200, 200, 200, 0}, color.RGBA{200, 200, 200, 0}}, {color.RGBA{255, 255, 255, 0}, color.RGBA{255, 255, 255, 0}, color.RGBA{255, 255, 255, 0}, color.RGBA{255, 255, 255, 0}, color.RGBA{255, 255, 255, 0}, color.RGBA{255, 255, 255, 0}}, {color.RGBA{200, 200, 200, 0}, color.RGBA{200, 200, 200, 0}, color.RGBA{200, 200, 200, 0}, color.RGBA{200, 200, 200, 0}, color.RGBA{200, 200, 200, 0}, color.RGBA{200, 200, 200, 0}}, {color.RGBA{150, 150, 150, 0}, color.RGBA{150, 150, 150, 0}, color.RGBA{150, 150, 150, 0}, color.RGBA{150, 150, 150, 0}, color.RGBA{150, 150, 150, 0}, color.RGBA{150, 150, 150, 0}}, {color.RGBA{100, 100, 100, 0}, color.RGBA{100, 100, 100, 0}, color.RGBA{100, 100, 100, 0}, color.RGBA{100, 100, 100, 0}, color.RGBA{100, 100, 100, 0}, color.RGBA{100, 100, 100, 0}}, {color.RGBA{50, 50, 50, 0}, color.RGBA{50, 50, 50, 0}, color.RGBA{50, 50, 50, 0}, color.RGBA{50, 50, 50, 0}, color.RGBA{50, 50, 50, 0}, color.RGBA{50, 50, 50, 0}}, {color.RGBA{0, 0, 0, 0}, color.RGBA{0, 0, 0, 0}, color.RGBA{0, 0, 0, 0}, color.RGBA{0, 0, 0, 0}, color.RGBA{0, 0, 0, 0}, color.RGBA{0, 0, 0, 0}}, {color.RGBA{0, 0, 0, 0}, color.RGBA{0, 0, 0, 0}, color.RGBA{0, 0, 0, 0}, color.RGBA{0, 0, 0, 0}, color.RGBA{0, 0, 0, 0}, color.RGBA{0, 0, 0, 0}}, {color.RGBA{0, 0, 0, 0}, color.RGBA{0, 0, 0, 0}, color.RGBA{0, 0, 0, 0}, color.RGBA{0, 0, 0, 0}, color.RGBA{0, 0, 0, 0}, color.RGBA{0, 0, 0, 0}}, {color.RGBA{0, 0, 0, 0}, color.RGBA{0, 0, 0, 0}, color.RGBA{0, 0, 0, 0}, color.RGBA{0, 0, 0, 0}, color.RGBA{0, 0, 0, 0}, color.RGBA{0, 0, 0, 0}}, {color.RGBA{50, 0, 0, 0}, color.RGBA{50, 0, 0, 0}, color.RGBA{50, 0, 0, 0}, color.RGBA{50, 0, 0, 0}, color.RGBA{50, 0, 0, 0}, color.RGBA{50, 0, 0, 0}}, {color.RGBA{100, 0, 0, 0}, color.RGBA{100, 0, 0, 0}, color.RGBA{100, 0, 0, 0}, color.RGBA{100, 0, 0, 0}, color.RGBA{100, 0, 0, 0}, color.RGBA{100, 0, 0, 0}}, {color.RGBA{150, 0, 0, 0}, color.RGBA{150, 0, 0, 0}, color.RGBA{150, 0, 0, 0}, color.RGBA{150, 0, 0, 0}, color.RGBA{150, 0, 0, 0}, color.RGBA{150, 0, 0, 0}}, {color.RGBA{200, 0, 0, 0}, color.RGBA{200, 0, 0, 0}, color.RGBA{200, 0, 0, 0}, color.RGBA{200, 0, 0, 0}, color.RGBA{200, 0, 0, 0}, color.RGBA{200, 0, 0, 0}}, {color.RGBA{255, 0, 0, 0}, color.RGBA{255, 0, 0, 0}, color.RGBA{255, 0, 0, 0}, color.RGBA{255, 0, 0, 0}, color.RGBA{255, 0, 0, 0}, color.RGBA{255, 0, 0, 0}}, {color.RGBA{200, 0, 0, 0}, color.RGBA{200, 0, 0, 0}, color.RGBA{200, 0, 0, 0}, color.RGBA{200, 0, 0, 0}, color.RGBA{200, 0, 0, 0}, color.RGBA{200, 0, 0, 0}}, {color.RGBA{150, 0, 0, 0}, color.RGBA{150, 0, 0, 0}, color.RGBA{150, 0, 0, 0}, color.RGBA{150, 0, 0, 0}, color.RGBA{150, 0, 0, 0}, color.RGBA{150, 0, 0, 0}}, {color.RGBA{100, 0, 0, 0}, color.RGBA{100, 0, 0, 0}, color.RGBA{100, 0, 0, 0}, color.RGBA{100, 0, 0, 0}, color.RGBA{100, 0, 0, 0}, color.RGBA{100, 0, 0, 0}}, {color.RGBA{50, 0, 0, 0}, color.RGBA{50, 0, 0, 0}, color.RGBA{50, 0, 0, 0}, color.RGBA{50, 0, 0, 0}, color.RGBA{50, 0, 0, 0}, color.RGBA{50, 0, 0, 0}}, {color.RGBA{0, 0, 0, 0}, color.RGBA{0, 0, 0, 0}, color.RGBA{0, 0, 0, 0}, color.RGBA{0, 0, 0, 0}, color.RGBA{0, 0, 0, 0}, color.RGBA{0, 0, 0, 0}}, {color.RGBA{0, 0, 0, 0}, color.RGBA{0, 0, 0, 0}, color.RGBA{0, 0, 0, 0}, color.RGBA{0, 0, 0, 0}, color.RGBA{0, 0, 0, 0}, color.RGBA{0, 0, 0, 0}}, {color.RGBA{0, 0, 0, 0}, color.RGBA{0, 0, 0, 0}, color.RGBA{0, 0, 0, 0}, color.RGBA{0, 0, 0, 0}, color.RGBA{0, 0, 0, 0}, color.RGBA{0, 0, 0, 0}}, {color.RGBA{0, 0, 0, 0}, color.RGBA{0, 0, 0, 0}, color.RGBA{0, 0, 0, 0}, color.RGBA{0, 0, 0, 0}, color.RGBA{0, 0, 0, 0}, color.RGBA{0, 0, 0, 0}}, {color.RGBA{0, 050, 0, 0}, color.RGBA{0, 050, 0, 0}, color.RGBA{0, 050, 0, 0}, color.RGBA{0, 050, 0, 0}, color.RGBA{0, 050, 0, 0}, color.RGBA{0, 050, 0, 0}}, {color.RGBA{0, 100, 0, 0}, color.RGBA{0, 100, 0, 0}, color.RGBA{0, 100, 0, 0}, color.RGBA{0, 100, 0, 0}, color.RGBA{0, 100, 0, 0}, color.RGBA{0, 100, 0, 0}}, {color.RGBA{0, 150, 0, 0}, color.RGBA{0, 150, 0, 0}, color.RGBA{0, 150, 0, 0}, color.RGBA{0, 150, 0, 0}, color.RGBA{0, 150, 0, 0}, color.RGBA{0, 150, 0, 0}}, {color.RGBA{0, 200, 0, 0}, color.RGBA{0, 200, 0, 0}, color.RGBA{0, 200, 0, 0}, color.RGBA{0, 200, 0, 0}, color.RGBA{0, 200, 0, 0}, color.RGBA{0, 200, 0, 0}}, {color.RGBA{0, 255, 0, 0}, color.RGBA{0, 255, 0, 0}, color.RGBA{0, 255, 0, 0}, color.RGBA{0, 255, 0, 0}, color.RGBA{0, 255, 0, 0}, color.RGBA{0, 255, 0, 0}}, {color.RGBA{0, 200, 0, 0}, color.RGBA{0, 200, 0, 0}, color.RGBA{0, 200, 0, 0}, color.RGBA{0, 200, 0, 0}, color.RGBA{0, 200, 0, 0}, color.RGBA{0, 200, 0, 0}}, {color.RGBA{0, 150, 0, 0}, color.RGBA{0, 150, 0, 0}, color.RGBA{0, 150, 0, 0}, color.RGBA{0, 150, 0, 0}, color.RGBA{0, 150, 0, 0}, color.RGBA{0, 150, 0, 0}}, {color.RGBA{0, 100, 0, 0}, color.RGBA{0, 100, 0, 0}, color.RGBA{0, 100, 0, 0}, color.RGBA{0, 100, 0, 0}, color.RGBA{0, 100, 0, 0}, color.RGBA{0, 100, 0, 0}}, {color.RGBA{0, 050, 0, 0}, color.RGBA{0, 050, 0, 0}, color.RGBA{0, 050, 0, 0}, color.RGBA{0, 050, 0, 0}, color.RGBA{0, 050, 0, 0}, color.RGBA{0, 050, 0, 0}}, {color.RGBA{0, 0, 0, 0}, color.RGBA{0, 0, 0, 0}, color.RGBA{0, 0, 0, 0}, color.RGBA{0, 0, 0, 0}, color.RGBA{0, 0, 0, 0}, color.RGBA{0, 0, 0, 0}}, {color.RGBA{0, 0, 0, 0}, color.RGBA{0, 0, 0, 0}, color.RGBA{0, 0, 0, 0}, color.RGBA{0, 0, 0, 0}, color.RGBA{0, 0, 0, 0}, color.RGBA{0, 0, 0, 0}}, {color.RGBA{0, 0, 0, 0}, color.RGBA{0, 0, 0, 0}, color.RGBA{0, 0, 0, 0}, color.RGBA{0, 0, 0, 0}, color.RGBA{0, 0, 0, 0}, color.RGBA{0, 0, 0, 0}}, {color.RGBA{0, 0, 0, 0}, color.RGBA{0, 0, 0, 0}, color.RGBA{0, 0, 0, 0}, color.RGBA{0, 0, 0, 0}, color.RGBA{0, 0, 0, 0}, color.RGBA{0, 0, 0, 0}}, {color.RGBA{0, 0, 050, 0}, color.RGBA{0, 0, 050, 0}, color.RGBA{0, 0, 050, 0}, color.RGBA{0, 0, 050, 0}, color.RGBA{0, 0, 050, 0}, color.RGBA{0, 0, 050, 0}}, {color.RGBA{0, 0, 100, 0}, color.RGBA{0, 0, 100, 0}, color.RGBA{0, 0, 100, 0}, color.RGBA{0, 0, 100, 0}, color.RGBA{0, 0, 100, 0}, color.RGBA{0, 0, 100, 0}}, {color.RGBA{0, 0, 150, 0}, color.RGBA{0, 0, 150, 0}, color.RGBA{0, 0, 150, 0}, color.RGBA{0, 0, 150, 0}, color.RGBA{0, 0, 150, 0}, color.RGBA{0, 0, 150, 0}}, {color.RGBA{0, 0, 200, 0}, color.RGBA{0, 0, 200, 0}, color.RGBA{0, 0, 200, 0}, color.RGBA{0, 0, 200, 0}, color.RGBA{0, 0, 200, 0}, color.RGBA{0, 0, 200, 0}}, {color.RGBA{0, 0, 255, 0}, color.RGBA{0, 0, 255, 0}, color.RGBA{0, 0, 255, 0}, color.RGBA{0, 0, 255, 0}, color.RGBA{0, 0, 255, 0}, color.RGBA{0, 0, 255, 0}}, {color.RGBA{0, 0, 200, 0}, color.RGBA{0, 0, 200, 0}, color.RGBA{0, 0, 200, 0}, color.RGBA{0, 0, 200, 0}, color.RGBA{0, 0, 200, 0}, color.RGBA{0, 0, 200, 0}}, {color.RGBA{0, 0, 150, 0}, color.RGBA{0, 0, 150, 0}, color.RGBA{0, 0, 150, 0}, color.RGBA{0, 0, 150, 0}, color.RGBA{0, 0, 150, 0}, color.RGBA{0, 0, 150, 0}}, {color.RGBA{0, 0, 100, 0}, color.RGBA{0, 0, 100, 0}, color.RGBA{0, 0, 100, 0}, color.RGBA{0, 0, 100, 0}, color.RGBA{0, 0, 100, 0}, color.RGBA{0, 0, 100, 0}}, {color.RGBA{0, 0, 050, 0}, color.RGBA{0, 0, 050, 0}, color.RGBA{0, 0, 050, 0}, color.RGBA{0, 0, 050, 0}, color.RGBA{0, 0, 050, 0}, color.RGBA{0, 0, 050, 0}}, {color.RGBA{0, 0, 0, 0}, color.RGBA{0, 0, 0, 0}, color.RGBA{0, 0, 0, 0}, color.RGBA{0, 0, 0, 0}, color.RGBA{0, 0, 0, 0}, color.RGBA{0, 0, 0, 0}}, {color.RGBA{0, 0, 0, 0}, color.RGBA{0, 0, 0, 0}, color.RGBA{0, 0, 0, 0}, color.RGBA{0, 0, 0, 0}, color.RGBA{0, 0, 0, 0}, color.RGBA{0, 0, 0, 0}}, {color.RGBA{0, 0, 0, 0}, color.RGBA{0, 0, 0, 0}, color.RGBA{0, 0, 0, 0}, color.RGBA{0, 0, 0, 0}, color.RGBA{0, 0, 0, 0}, color.RGBA{0, 0, 0, 0}}, {color.RGBA{0, 0, 0, 0}, color.RGBA{0, 0, 0, 0}, color.RGBA{0, 0, 0, 0}, color.RGBA{0, 0, 0, 0}, color.RGBA{0, 0, 0, 0}, color.RGBA{0, 0, 0, 0}}, }} )
Define LED animations. They are made of multiple frames of 6 colors.
var PersonYou = Person{"You", 0}
PersonYou is a default person that is used for your self identity. Do not use this to identify yourself, use d.SelfIdentity instead.
Functions ¶
Types ¶
type Conversation ¶
type Conversation struct { Messages []Message HighlightedMessageIndex int KeyboardBuffer string Name string People []Person }
Conversation is a conversation with a person. It contains a list of Messages and a Person that the conversation is with.
type CursorIcon ¶
CursorIcon is a function that draws a cursor icon based on the data at a location.
type Device ¶
type Device struct { State *State StateHistory []*State LEDAnimation *LEDAnimation Conversations []*Conversation CurrentConversationIndex int SelfIdentity Person CurrentKeyboardButton *KeyboardButton SendUsingRadio func(packet []byte) (err error) }
Device is the main structure that holds all the information about the device. It has a State, a StateHistory, and an LEDAnimation.
func (*Device) BytesToMessage ¶
BytesToMessage converts a compressed byte array to a Message.
func (*Device) ChangeLEDAnimationWithContinue ¶
func (d *Device) ChangeLEDAnimationWithContinue(newAnimation *LEDAnimation) (err error)
ChangeLEDAnimation changes the current LED animation of the device and continues from the last time it was played.
func (*Device) ChangeLEDAnimationWithoutContinue ¶
func (d *Device) ChangeLEDAnimationWithoutContinue(newAnimation *LEDAnimation) (err error)
ChangeLEDAnimationWithoutContinue changes the current LED animation of the device without continuing from the last time it was played.
func (*Device) ChangeStateWithHistory ¶
ChangeStateWithHistory will take in a State and update the Device while adding the State to the StateHistory.
func (*Device) ChangeStateWithoutHistory ¶
ChangeStateWithoutHistory will take in a State and update the Device.
func (*Device) GoBackState ¶
GoBackState will use the StateHistory to return to the upwards state in the tree.
func (*Device) MesageToBytes ¶
MesageToBytes converts a Message to a compressed byte array.
func (*Device) NewConversation ¶
func (d *Device) NewConversation(p Person) (c *Conversation)
NewConversation creates a blank new Conversation with a person and adds it to the Device. It also returns a pointer to that Conversation.
func (*Device) ProcessConversationInputEventNumber ¶
func (d *Device) ProcessConversationInputEventNumber(button *KeyboardButton) (err error)
func (*Device) ProcessConversationInputEventNumber0 ¶
func (*Device) ProcessConversationInputEventNumber1 ¶
func (*Device) ProcessConversationInputEventNumber2 ¶
func (*Device) ProcessConversationInputEventNumber3 ¶
func (*Device) ProcessConversationInputEventNumber4 ¶
func (*Device) ProcessConversationInputEventNumber5 ¶
func (*Device) ProcessConversationInputEventNumber6 ¶
func (*Device) ProcessConversationInputEventNumber7 ¶
func (*Device) ProcessConversationInputEventNumber8 ¶
func (*Device) ProcessConversationInputEventNumber9 ¶
func (*Device) ProcessInputEvent ¶
func (d *Device) ProcessInputEvent(inputEvent InputEvent) (err error)
ProcessInputEvent will take in an InputEvent and run appropriate actions based on the event.
func (*Device) ProcessInputEventAccept ¶
func (*Device) ProcessInputEventDown ¶
func (*Device) ProcessInputEventUp ¶
func (*Device) ReceiveFromRadio ¶
RecieveFromRadio takes in the payload of a radio packet, usually recieved from the RFM9x radio.
func (*Device) UpdateConversationsMenu ¶
func (d *Device) UpdateConversationsMenu()
type InputEvent ¶
type InputEvent string
InputEvent is a string that represents a button press.
const ( InputEventUp InputEvent = "up" InputEventDown InputEvent = "down" InputEventLeft InputEvent = "left" InputEventRight InputEvent = "right" InputEventAccept InputEvent = "accept" InputEventFunction1 InputEvent = "function1" InputEventFunction2 InputEvent = "function2" InputEventFunction3 InputEvent = "function3" InputEventFunction4 InputEvent = "function4" InputEventOpenSettings InputEvent = "openSettings" InputEventOpenPeople InputEvent = "openPeople" InputEventOpenConversations InputEvent = "openConversations" InputEventOpenMainMenu InputEvent = "openMainMenu" InputEventNumber1 InputEvent = "number1" InputEventNumber2 InputEvent = "number2" InputEventNumber3 InputEvent = "number3" InputEventNumber4 InputEvent = "number4" InputEventNumber5 InputEvent = "number5" InputEventNumber6 InputEvent = "number6" InputEventNumber7 InputEvent = "number7" InputEventNumber8 InputEvent = "number8" InputEventNumber9 InputEvent = "number9" InputEventNumber0 InputEvent = "number0" InputEventStar InputEvent = "star" InputEventPound InputEvent = "pound" )
type KeyboardButton ¶
type LEDAnimation ¶
LEDAnimation is a structure that holds information about an LED animation.
type MenuItem ¶
type MenuItem struct { Text string Action func(d *Device) (err error) GetCursorData func(d *Device) (data any, err error) CursorIcon CursorIcon }
MenuItem is a structure that holds data that can be displayed on the screen. It contains a title and an action that is run when the item is selected.
var ( // MenuItemDefault is a MenuItem that does nothing. It is used as a placeholder for the default State of the device. MenuItemDefault MenuItem = MenuItem{ Text: "DefaultMenuItem", Action: func(d *Device) (err error) { return ErrDefaultMenuItem }, CursorIcon: CursorIconRightArrow, } // GlobalMenuItemGoBack is a MenuItem that goes back to the previous state in the StateHistory. GlobalMenuItemGoBack MenuItem = MenuItem{ Text: "Go Back", Action: func(d *Device) (err error) { err = d.GoBackState() if err != nil { return err } return nil }, CursorIcon: CursorIconLeftArrow, } // MainMenuItemConversations is a MenuItem that goes to the StateConversations menu. MainMenuItemConversations MenuItem = MenuItem{ Text: "Conversations", Action: func(d *Device) (err error) { err = d.ChangeStateWithHistory(&StateConversationsMenu) if err != nil { return err } return nil }, CursorIcon: CursorIconRightArrow, } // MainMenuItemPeople is a MenuItem that goes to the People menu. MainMenuItemPeople MenuItem = MenuItem{ Text: "People", Action: func(d *Device) (err error) { err = d.ChangeStateWithHistory(&StatePeopleMenu) if err != nil { return err } return nil }, CursorIcon: CursorIconRightArrow, } // MainMenuItemGames is a MenuItem that goes to the Games menu. MainMenuItemGames MenuItem = MenuItem{ Text: "Games", Action: func(d *Device) (err error) { err = d.ChangeStateWithHistory(&StateGamesMenu) if err != nil { return err } return nil }, CursorIcon: CursorIconRightArrow, } // MainMenuItemDemos is a MenuItem that goes to the Demos menu. MainMenuItemDemos MenuItem = MenuItem{ Text: "Demo", Action: func(d *Device) (err error) { err = d.ChangeStateWithHistory(&StateDemosMenu) if err != nil { return err } return nil }, CursorIcon: CursorIconRightArrow, } // MainMenuItemTools is a MenuItem that goes to the Tools menu. MainMenuItemTools MenuItem = MenuItem{ Text: "Tools", Action: func(d *Device) (err error) { err = d.ChangeStateWithHistory(&StateToolsMenu) if err != nil { return err } return nil }, CursorIcon: CursorIconRightArrow, } // MainMenuItemSettings is a MenuItem that goes to the Settings menu. MainMenuItemSettings MenuItem = MenuItem{ Text: "Settings", Action: func(d *Device) (err error) { err = d.ChangeStateWithHistory(&StateSettingsMenu) if err != nil { return err } return nil }, CursorIcon: CursorIconRightArrow, } // DemoMenuItemRGB is a MenuItem that toggles a demo of the RGB LEDs. DemoMenuItemRGB MenuItem = MenuItem{ Text: "RGB Demo", Action: func(d *Device) (err error) { if d.LEDAnimation != &LEDAnimationDemo { err = d.ChangeLEDAnimationWithoutContinue(&LEDAnimationDemo) if err != nil { return err } } else { err = d.ChangeLEDAnimationWithoutContinue(&LEDAnimationDefault) if err != nil { return err } } return nil }, GetCursorData: func(d *Device) (data any, err error) { return d.LEDAnimation == &LEDAnimationDemo, nil }, CursorIcon: CursorIconBox, } // ToolsMenuItemSOS is a MenuItem that toggles a SOS message shown in morse code through the RGB LEDs. ToolsMenuItemSOS MenuItem = MenuItem{ Text: "SOS Mode", Action: func(d *Device) (err error) { if d.LEDAnimation != &LEDAnimationSOS { err = d.ChangeLEDAnimationWithoutContinue(&LEDAnimationSOS) if err != nil { return err } } else { err = d.ChangeLEDAnimationWithoutContinue(&LEDAnimationDefault) if err != nil { return err } } return nil }, GetCursorData: func(d *Device) (data any, err error) { return d.LEDAnimation == &LEDAnimationSOS, nil }, CursorIcon: CursorIconBox, } // Conversation Menu Items ConversationsMenuItemNew MenuItem = MenuItem{ Text: "New Conversation", Action: func(d *Device) (err error) { d.ChangeStateWithHistory(&StateNewConversation) return nil }, CursorIcon: CursorIconRightArrow, } )
Define MenuItems
type Message ¶
Message is a message sent inside a Conversation. It contains the time it was sent, the time it was recieved and the content of the message.