diff --git a/openrtx/src/ui/ui.c b/openrtx/src/ui/ui.c index fe834e85..34eb4bab 100644 --- a/openrtx/src/ui/ui.c +++ b/openrtx/src/ui/ui.c @@ -87,7 +87,9 @@ extern void _ui_drawMainMEM(state_t* last_state); extern void _ui_drawMenuList(point_t pos, const char *entries[], uint8_t num_entries, uint8_t selected); extern void _ui_drawChannelList(point_t pos, uint8_t selected); extern void _ui_drawMenuTop(ui_state_t* ui_state); +extern void _ui_drawMenuZone(ui_state_t* ui_state); extern void _ui_drawMenuChannel(ui_state_t* ui_state); +extern void _ui_drawMenuContacts(ui_state_t* ui_state); extern void _ui_drawMenuSettings(ui_state_t* ui_state); #ifdef HAS_RTC extern void _ui_drawSettingsTimeDate(state_t* last_state); @@ -700,10 +702,16 @@ void ui_updateFSM(event_t event, bool *sync_rtx) // Open selected menu item switch(ui_state.menu_selected) { - // TODO: Add missing submenu states + case 0: + state.ui_screen = MENU_ZONE; + break; case 1: state.ui_screen = MENU_CHANNEL; break; + case 2: + state.ui_screen = MENU_CONTACTS; + break; + // TODO: Add missing submenu states case 5: state.ui_screen = MENU_SETTINGS; break; @@ -721,6 +729,32 @@ void ui_updateFSM(event_t event, bool *sync_rtx) ui_state.menu_selected = 0; } break; + // Zone menu screen + case MENU_ZONE: + if(msg.keys & KEY_UP) + { + if(ui_state.menu_selected > 0) + ui_state.menu_selected -= 1; + } + else if(msg.keys & KEY_DOWN) + { + zone_t zone; + if(nvm_readZoneData(&zone, ui_state.menu_selected + 1) != -1) + ui_state.menu_selected += 1; + } + else if(msg.keys & KEY_ESC) + { + // Return to top menu + state.ui_screen = MENU_TOP; + // Reset menu selection + ui_state.menu_selected = 0; + } + else if(msg.keys & KEY_MONI) + { + // Open Macro Menu + state.ui_screen = MENU_MACRO; + } + break; // Channel menu screen case MENU_CHANNEL: if(msg.keys & KEY_UP) @@ -747,6 +781,32 @@ void ui_updateFSM(event_t event, bool *sync_rtx) state.ui_screen = MENU_MACRO; } break; + // Contacts menu screen + case MENU_CONTACTS: + if(msg.keys & KEY_UP) + { + if(ui_state.menu_selected > 0) + ui_state.menu_selected -= 1; + } + else if(msg.keys & KEY_DOWN) + { + contact_t contact; + if(nvm_readContactData(&contact, ui_state.menu_selected + 1) != -1) + ui_state.menu_selected += 1; + } + else if(msg.keys & KEY_ESC) + { + // Return to top menu + state.ui_screen = MENU_TOP; + // Reset menu selection + ui_state.menu_selected = 0; + } + else if(msg.keys & KEY_MONI) + { + // Open Macro Menu + state.ui_screen = MENU_MACRO; + } + break; // Macro menu case MENU_MACRO: _ui_drawDarkOverlay(); @@ -863,10 +923,18 @@ void ui_updateGUI(state_t last_state) case MENU_TOP: _ui_drawMenuTop(&ui_state); break; + // Zone menu screen + case MENU_ZONE: + _ui_drawMenuZone(&ui_state); + break; // Channel menu screen case MENU_CHANNEL: _ui_drawMenuChannel(&ui_state); break; + // Contacts menu screen + case MENU_CONTACTS: + _ui_drawMenuContacts(&ui_state); + break; // Macro menu case MENU_MACRO: _ui_drawMenuMacro(&last_state); diff --git a/openrtx/src/ui/ui_menu.c b/openrtx/src/ui/ui_menu.c index f8f02187..2edd6c73 100644 --- a/openrtx/src/ui/ui_menu.c +++ b/openrtx/src/ui/ui_menu.c @@ -52,6 +52,39 @@ void _ui_drawMenuList(point_t pos, const char *entries[], } } +void _ui_drawZoneList(point_t pos, 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] = ""; + int result = 0; + zone_t zone; + for(int item=0; (result == 0) && (pos.y < SCREEN_HEIGHT); item++) + { + // If selection is off the screen, scroll screen + if(selected >= entries_in_screen) + scroll = selected - entries_in_screen + 1; + result = nvm_readZoneData(&zone, item + scroll); + if(result != -1) + { + snprintf(entry_buf, sizeof(entry_buf), "%s", zone.name); + if(item + scroll == selected) + { + // Draw rectangle under selected item, compensating for text height + point_t rect_pos = {0, pos.y - layout.top_h + 3}; + 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; + } + } +} + void _ui_drawChannelList(point_t pos, uint8_t selected) { // Number of menu entries that fit in the screen height @@ -66,19 +99,55 @@ void _ui_drawChannelList(point_t pos, uint8_t selected) if(selected >= entries_in_screen) scroll = selected - entries_in_screen + 1; result = nvm_readChannelData(&channel, item + scroll); - snprintf(entry_buf, sizeof(entry_buf), "%s", channel.name); - if(item + scroll == selected) + if(result != -1) { - // Draw rectangle under selected item, compensating for text height - point_t rect_pos = {0, pos.y - layout.top_h + 3}; - 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); + snprintf(entry_buf, sizeof(entry_buf), "%s", channel.name); + if(item + scroll == selected) + { + // Draw rectangle under selected item, compensating for text height + point_t rect_pos = {0, pos.y - layout.top_h + 3}; + 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; } - else + } +} + +void _ui_drawContactList(point_t pos, 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] = ""; + int result = 0; + contact_t contact; + for(int item=0; (result == 0) && (pos.y < SCREEN_HEIGHT); item++) + { + // If selection is off the screen, scroll screen + if(selected >= entries_in_screen) + scroll = selected - entries_in_screen + 1; + result = nvm_readContactData(&contact, item + scroll); + if(result != -1) { - gfx_print(pos, entry_buf, layout.top_font, TEXT_ALIGN_LEFT, color_white); + snprintf(entry_buf, sizeof(entry_buf), "%s", contact.name); + if(item + scroll == selected) + { + // Draw rectangle under selected item, compensating for text height + point_t rect_pos = {0, pos.y - layout.top_h + 3}; + 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; } - pos.y += layout.top_h; } } @@ -92,16 +161,36 @@ void _ui_drawMenuTop(ui_state_t* ui_state) _ui_drawMenuList(layout.line1_left, menu_items, menu_num, ui_state->menu_selected); } +void _ui_drawMenuZone(ui_state_t* ui_state) +{ + gfx_clearScreen(); + // Print "Zone" on top bar + gfx_print(layout.top_left, "Zone", layout.top_font, + TEXT_ALIGN_CENTER, color_white); + // Print zone entries + _ui_drawZoneList(layout.line1_left, ui_state->menu_selected); +} + void _ui_drawMenuChannel(ui_state_t* ui_state) { gfx_clearScreen(); // Print "Channel" on top bar - gfx_print(layout.top_left, "Channel", layout.top_font, + gfx_print(layout.top_left, "Channels", layout.top_font, TEXT_ALIGN_CENTER, color_white); // Print channel entries _ui_drawChannelList(layout.line1_left, ui_state->menu_selected); } +void _ui_drawMenuContacts(ui_state_t* ui_state) +{ + gfx_clearScreen(); + // Print "Contacts" on top bar + gfx_print(layout.top_left, "Contacts", layout.top_font, + TEXT_ALIGN_CENTER, color_white); + // Print contact entries + _ui_drawContactList(layout.line1_left, ui_state->menu_selected); +} + void _ui_drawMenuSettings(ui_state_t* ui_state) { gfx_clearScreen();