From 2533f3530950cfcc5230473db7464d6938e6af28 Mon Sep 17 00:00:00 2001 From: Federico Amedeo Izzo Date: Tue, 26 Jan 2021 22:04:19 +0100 Subject: [PATCH] UI: Add display settings --- openrtx/include/ui.h | 4 +++- openrtx/src/ui/ui.c | 51 +++++++++++++++++++++++++++++++++++++--- openrtx/src/ui/ui_menu.c | 37 +++++++++++++++++++++++++++++ 3 files changed, 88 insertions(+), 4 deletions(-) diff --git a/openrtx/include/ui.h b/openrtx/include/ui.h index 49d5fa68..9504a6b2 100644 --- a/openrtx/include/ui.h +++ b/openrtx/include/ui.h @@ -50,6 +50,7 @@ enum uiScreen MENU_SETTINGS, SETTINGS_TIMEDATE, SETTINGS_TIMEDATE_SET, + SETTINGS_DISPLAY, LOW_BAT }; @@ -119,7 +120,8 @@ typedef struct ui_state_t extern layout_t layout; extern const char *menu_items[6]; -extern const char *settings_items[1]; +extern const char *settings_items[2]; +extern const char *display_items[2]; extern const uint8_t menu_num; extern const uint8_t settings_num; extern const color_t color_black; diff --git a/openrtx/src/ui/ui.c b/openrtx/src/ui/ui.c index ac5fa847..3557ca00 100644 --- a/openrtx/src/ui/ui.c +++ b/openrtx/src/ui/ui.c @@ -96,6 +96,7 @@ extern void _ui_drawMenuSettings(ui_state_t* ui_state); extern void _ui_drawSettingsTimeDate(state_t* last_state); extern void _ui_drawSettingsTimeDateSet(state_t* last_state, ui_state_t* ui_state); #endif +extern void _ui_drawSettingsDisplay(state_t* last_state, ui_state_t* ui_state); extern bool _ui_drawMacroMenu(state_t* last_state); const char *menu_items[6] = @@ -108,11 +109,18 @@ const char *menu_items[6] = "Settings" }; -const char *settings_items[1] = +const char *settings_items[2] = { #ifdef HAS_RTC - "Time & Date" + "Time & Date", #endif + "Display" +}; + +const char *display_items[2] = +{ + "Brightness", + "Contrast" }; // Calculate number of main menu entries @@ -824,7 +832,21 @@ void ui_updateFSM(event_t event, bool *sync_rtx) break; // Settings menu screen case MENU_SETTINGS: - if(msg.keys & KEY_ENTER) + if(msg.keys & KEY_UP) + { + if(ui_state.menu_selected > 0) + ui_state.menu_selected -= 1; + else + ui_state.menu_selected = settings_num-1; + } + else if(msg.keys & KEY_DOWN) + { + if(ui_state.menu_selected < settings_num-1) + ui_state.menu_selected += 1; + else + ui_state.menu_selected = 0; + } + else if(msg.keys & KEY_ENTER) { // Open selected menu item switch(ui_state.menu_selected) @@ -834,7 +856,12 @@ void ui_updateFSM(event_t event, bool *sync_rtx) case 0: state.ui_screen = SETTINGS_TIMEDATE; break; + case 1: +#else + case 0: #endif + state.ui_screen = SETTINGS_DISPLAY; + break; default: state.ui_screen = MENU_TOP; } @@ -895,6 +922,21 @@ void ui_updateFSM(event_t event, bool *sync_rtx) } break; #endif + case SETTINGS_DISPLAY: + if(msg.keys & KEY_LEFT) + { + } + else if(msg.keys & KEY_RIGHT) + { + } + else if(msg.keys & KEY_ESC) + { + // Return to settings menu + state.ui_screen = MENU_SETTINGS; + // Reset menu selection + ui_state.menu_selected = 0; + } + break; } } } @@ -955,6 +997,9 @@ void ui_updateGUI(state_t last_state) _ui_drawSettingsTimeDateSet(&last_state, &ui_state); break; #endif + case SETTINGS_DISPLAY: + _ui_drawSettingsDisplay(&last_state, &ui_state); + break; // Low battery screen case LOW_BAT: _ui_drawLowBatteryScreen(); diff --git a/openrtx/src/ui/ui_menu.c b/openrtx/src/ui/ui_menu.c index 9e7ce7f7..cde0c188 100644 --- a/openrtx/src/ui/ui_menu.c +++ b/openrtx/src/ui/ui_menu.c @@ -52,6 +52,33 @@ void _ui_drawMenuList(point_t pos, const char *entries[], } } +void _ui_drawSettingsDisplayList(point_t pos, const char *entries[], + uint8_t num_entries, uint8_t selected) +{ + // Number of menu entries that fit in the screen height + uint8_t entries_in_screen = ((SCREEN_HEIGHT - pos.y) / layout.top_h) + 1; + uint8_t scroll = 0; + char entry_buf[MAX_ENTRY_LEN] = ""; + for(int item=0; (item < num_entries) && (pos.y < SCREEN_HEIGHT); item++) + { + // If selection is off the screen, scroll screen + if(selected >= entries_in_screen) + scroll = selected - entries_in_screen + 1; + snprintf(entry_buf, sizeof(entry_buf), "%s", entries[item + scroll]); + if(item + scroll == selected) + { + // Draw rectangle under selected item, compensating for text height + point_t rect_pos = {0, pos.y - layout.top_h + (layout.text_v_offset*2)}; + gfx_drawRect(rect_pos, SCREEN_WIDTH, layout.top_h, color_white, true); + gfx_print(pos, entry_buf, layout.top_font, TEXT_ALIGN_LEFT, color_black); + } + else + { + gfx_print(pos, entry_buf, layout.top_font, TEXT_ALIGN_LEFT, color_white); + } + pos.y += layout.top_h; + } +} int _ui_getZoneName(char *buf, uint8_t max_len, uint8_t index) { zone_t zone; @@ -222,6 +249,16 @@ void _ui_drawSettingsTimeDateSet(state_t* last_state, ui_state_t* ui_state) } #endif +void _ui_drawSettingsDisplay(state_t* last_state, ui_state_t* ui_state) +{ + gfx_clearScreen(); + // Print "Display" on top bar + gfx_print(layout.top_left, "Display", layout.top_font, + TEXT_ALIGN_CENTER, color_white); + // Print menu entries + _ui_drawSettingsDisplayList(layout.line1_left, display_items, settings_num, ui_state->menu_selected); +} + bool _ui_drawMacroMenu(state_t* last_state) { // Header gfx_print(layout.top_left, "Macro Menu", layout.top_font, TEXT_ALIGN_CENTER,