#ifndef VELOMETER_GUI_H #define VELOMETER_GUI_H #include "config.h" #include enum ButtonInputType { BUTTON_SHORT_PRESS, BUTTON_LONG_PRESS, }; enum GUIScreen { MAIN_SCREEN, MENU_SCREEN, }; enum DisplayMode { DISPLAY_MODE_SPEED, DISPLAY_MODE_DISTANCE_FROM_POWER_ON, DISPLAY_MODE_TOTAL_DISTANCE, }; enum MenuOptionType { MENU_OPTION_NUMBER, MENU_OPTION_ONOFF, MENU_OPTION_TEXT, MENU_OPTION_LINK, }; #define TEXT_EDIT_STATIC_BUFFER_SIZE 18 struct TextEditState { uint textLength; // number of characters in input uint textByteLength; // number of bytes occupied by characters // fixed-size buffers for most cases char staticTextBuffer[TEXT_EDIT_STATIC_BUFFER_SIZE]; uint8_t staticCharWidthBuffer[TEXT_EDIT_STATIC_BUFFER_SIZE]; // the same thing but in heap for longer input bool heapBufferInUse; char *heapTextBuffer; uint8_t *heapCharWidthBuffer; uint heapTextBufferCapacity; uint heapCharWidthBufferCapacity; // visual edit field properties uint cursorPos; // in characters uint cursorPosCharOffset; // for quicker character addressing inside a UTF-8 string uint scrollOffset; // in pixels }; struct MenuScreenState { enum { MENU_SCREEN_STATE_CHOOSING_OPTION, MENU_SCREEN_STATE_EDITING_OPTION, } subState; union { struct { uint chosenOptionIndex; short scrollAnimationProgress; } choosingOption; struct { uint optionIndex; enum MenuOptionType optionType; union { uint numberValue; bool onOffValue; struct TextEditState textEditState; }; } editingOption; }; }; struct GUIState { uint screen; union { struct { uint displayMode; bool displayModeChanged; } mainScreen; struct MenuScreenState menuScreen; } screenState; uint8_t drawnTimeHours; uint8_t drawnTimeMinutes; uint16_t drawnTimeTextWidth; }; void gui_init(); void on_button_input(short button, enum ButtonInputType type, uint heldButtons); void update_lcd(); #endif