picodoomsdaymessenger

package module
v0.0.0-...-cf5cf58 Latest Latest
Warning

This package is not in the latest version of its module.

Go to latest
Published: Jan 8, 2023 License: GPL-3.0 Imports: 10 Imported by: 0

README

test status CodeFactor GitHub go.mod Go version GitHub Repo stars

picoDoomsdayMessenger

A device made using an RP2040 that sends messages over LoRaWAN.

Progress tracking

The current progress of the project can be found here

Hardware Used

Documentation

Index

Constants

This section is empty.

Variables

View Source
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

View Source
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

View Source
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

View Source
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

View Source
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.

View Source
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

func GetErrorFrame

func GetErrorFrame(dimensions image.Rectangle, d *Device, inputErr string) (frame image.Image, err error)

GetErrorFrame will take in a string version of an error and return an image with that error in.

func GetFrame

func GetFrame(dimensions image.Rectangle, d *Device) (frame image.Image, err error)

GetFrame will take in a Device and return an image based on the state.

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

type CursorIcon func(img *image.RGBA, x int, y int, data any) (err error)

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 NewDevice

func NewDevice() (d *Device, err error)

NewDevice returns a new Device with default parameters.

func (*Device) BytesToMessage

func (d *Device) BytesToMessage(input []byte) (output Message, err error)

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

func (d *Device) ChangeStateWithHistory(newState *State) (err error)

ChangeStateWithHistory will take in a State and update the Device while adding the State to the StateHistory.

func (*Device) ChangeStateWithoutHistory

func (d *Device) ChangeStateWithoutHistory(newState *State) (err error)

ChangeStateWithoutHistory will take in a State and update the Device.

func (*Device) GoBackState

func (d *Device) GoBackState() (err error)

GoBackState will use the StateHistory to return to the upwards state in the tree.

func (*Device) MesageToBytes

func (d *Device) MesageToBytes(input Message) (output []byte, err error)

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 (d *Device) ProcessConversationInputEventNumber0() (err error)

func (*Device) ProcessConversationInputEventNumber1

func (d *Device) ProcessConversationInputEventNumber1() (err error)

func (*Device) ProcessConversationInputEventNumber2

func (d *Device) ProcessConversationInputEventNumber2() (err error)

func (*Device) ProcessConversationInputEventNumber3

func (d *Device) ProcessConversationInputEventNumber3() (err error)

func (*Device) ProcessConversationInputEventNumber4

func (d *Device) ProcessConversationInputEventNumber4() (err error)

func (*Device) ProcessConversationInputEventNumber5

func (d *Device) ProcessConversationInputEventNumber5() (err error)

func (*Device) ProcessConversationInputEventNumber6

func (d *Device) ProcessConversationInputEventNumber6() (err error)

func (*Device) ProcessConversationInputEventNumber7

func (d *Device) ProcessConversationInputEventNumber7() (err error)

func (*Device) ProcessConversationInputEventNumber8

func (d *Device) ProcessConversationInputEventNumber8() (err error)

func (*Device) ProcessConversationInputEventNumber9

func (d *Device) ProcessConversationInputEventNumber9() (err error)

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 (d *Device) ProcessInputEventAccept() (err error)

func (*Device) ProcessInputEventDown

func (d *Device) ProcessInputEventDown() (err error)

func (*Device) ProcessInputEventUp

func (d *Device) ProcessInputEventUp() (err error)

func (*Device) ReceiveFromRadio

func (d *Device) ReceiveFromRadio(packetPayload []byte) (err error)

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 KeyboardButton struct {
	Characters            []string
	LastPress             time.Time
	CurrentCharacterIndex int
}

type LEDAnimation

type LEDAnimation struct {
	FrameDuration time.Duration
	CurrentFrame  int
	Frames        [][6]color.RGBA
}

LEDAnimation is a structure that holds information about an LED animation.

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

type Message struct {
	Text     string
	Person   Person
	TimeSent time.Time
}

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.

type Person

type Person struct {
	Name string
	ID   int
}

Person is a representation of another device. A Person has a name and a unique identifier

type State

type State struct {
	Title                string
	Content              []MenuItem
	HighlightedItemIndex int
	LoadAction           func(d *Device) (err error)
}

State is the current state of the device. It contains all the information about what is currently being displayed.

Directories

Path Synopsis

Jump to

Keyboard shortcuts

? : This menu
/ : Search site
f or F : Jump to
y or Y : Canonical URL