diff --git a/openrtx/include/ui/ui_default.h b/openrtx/include/ui/ui_default.h index ae04781f..7bc6b2ff 100644 --- a/openrtx/include/ui/ui_default.h +++ b/openrtx/include/ui/ui_default.h @@ -90,16 +90,16 @@ enum menuItems enum settingsItems { - S_DISPLAY = 0 + S_DISPLAY = 0, #ifdef RTC_PRESENT - ,S_TIMEDATE + S_TIMEDATE, #endif #ifdef GPS_PRESENT - ,S_GPS + S_GPS, #endif - ,S_M17 - ,S_VOICE - ,S_RESET2DEFAULTS + S_M17, + S_VOICE, + S_RESET2DEFAULTS, }; enum backupRestoreItems @@ -110,11 +110,11 @@ enum backupRestoreItems enum displayItems { - D_BRIGHTNESS = 0 + D_BRIGHTNESS = 0, #ifdef SCREEN_CONTRAST - ,D_CONTRAST + D_CONTRAST, #endif - ,D_TIMER + D_TIMER, }; #ifdef GPS_PRESENT @@ -125,12 +125,19 @@ enum settingsGPSItems G_TIMEZONE }; #endif + enum settingsVoicePromptItems { VP_LEVEL = 0, VP_PHONETIC, }; +enum settingsM17Items +{ + M17_CALLSIGN = 0, + M17_CAN +}; + /** * Struct containing a set of positions and sizes that get * calculated for the selected display size. @@ -205,6 +212,7 @@ extern const char *menu_items[]; extern const char *settings_items[]; extern const char *display_items[]; extern const char *settings_gps_items[]; +extern const char *settings_m17_items[]; extern const char * settings_voice_items[]; extern const char *backup_restore_items[]; @@ -214,6 +222,7 @@ extern const uint8_t menu_num; extern const uint8_t settings_num; extern const uint8_t display_num; extern const uint8_t settings_gps_num; +extern const uint8_t settings_m17_num; extern const uint8_t settings_voice_num; extern const uint8_t backup_restore_num; extern const uint8_t info_num; diff --git a/openrtx/src/ui/default/ui.c b/openrtx/src/ui/default/ui.c index 9179efb2..03a90a12 100644 --- a/openrtx/src/ui/default/ui.c +++ b/openrtx/src/ui/default/ui.c @@ -166,6 +166,13 @@ const char *settings_gps_items[] = "UTC Timezone" }; #endif + +const char * settings_m17_items[] = +{ + "Callsign", + "CAN" +}; + const char * settings_voice_items[] = { "Voice", @@ -238,6 +245,7 @@ const uint8_t display_num = sizeof(display_items)/sizeof(display_items[0]); #ifdef GPS_PRESENT const uint8_t settings_gps_num = sizeof(settings_gps_items)/sizeof(settings_gps_items[0]); #endif +const uint8_t settings_m17_num = sizeof(settings_m17_items)/sizeof(settings_m17_items[0]); const uint8_t settings_voice_num = sizeof(settings_voice_items)/sizeof(settings_voice_items[0]); const uint8_t backup_restore_num = sizeof(backup_restore_items)/sizeof(backup_restore_items[0]); const uint8_t info_num = sizeof(info_items)/sizeof(info_items[0]); @@ -748,6 +756,12 @@ static void _ui_changeTimer(int variation) state.settings.display_timer += variation; } +static inline void _ui_changeM17Can(int variation) +{ + uint8_t can = state.settings.m17_can; + state.settings.m17_can = (can + variation) % 16; +} + static void _ui_changeVoiceLevel(int variation) { if ((state.settings.vpLevel == vpNone && variation < 0) || @@ -1919,48 +1933,81 @@ void ui_updateFSM(bool *sync_rtx) case SETTINGS_M17: if(ui_state.edit_mode) { - if(msg.keys & KEY_ENTER) + if(ui_state.menu_selected == M17_CALLSIGN) { - _ui_textInputConfirm(ui_state.new_callsign); - // Save selected callsign and disable input mode - strncpy(state.settings.callsign, ui_state.new_callsign, 10); - ui_state.edit_mode = false; - *sync_rtx = true; - vp_announceBuffer(¤tLanguage->callsign, - false, true, state.settings.callsign); + // Handle text input for M17 callsign + if(msg.keys & KEY_ENTER) + { + _ui_textInputConfirm(ui_state.new_callsign); + // Save selected callsign and disable input mode + strncpy(state.settings.callsign, ui_state.new_callsign, 10); + ui_state.edit_mode = false; + vp_announceBuffer(¤tLanguage->callsign, + false, true, state.settings.callsign); + } + else if(msg.keys & KEY_ESC) + { + // Discard selected callsign and disable input mode + ui_state.edit_mode = false; + vp_announceBuffer(¤tLanguage->callsign, + false, true, state.settings.callsign); + } + else if(msg.keys & KEY_UP || msg.keys & KEY_DOWN || + msg.keys & KEY_LEFT || msg.keys & KEY_RIGHT) + { + _ui_textInputDel(ui_state.new_callsign); + } + else if(input_isNumberPressed(msg)) + { + _ui_textInputKeypad(ui_state.new_callsign, 9, msg, true); + } + else if (msg.long_press && (msg.keys & KEY_F1) && (state.settings.vpLevel > vpBeep)) + { + vp_announceBuffer(¤tLanguage->callsign, + true, true, ui_state.new_callsign); + f1Handled=true; + } } - else if(msg.keys & KEY_ESC) + else { - // Discard selected callsign and disable input mode - ui_state.edit_mode = false; - vp_announceBuffer(¤tLanguage->callsign, - false, true, state.settings.callsign); - } - else if(msg.keys & KEY_UP || msg.keys & KEY_DOWN || - msg.keys & KEY_LEFT || msg.keys & KEY_RIGHT) - _ui_textInputDel(ui_state.new_callsign); - else if(input_isNumberPressed(msg)) - _ui_textInputKeypad(ui_state.new_callsign, 9, msg, true); - else if (msg.long_press && (msg.keys & KEY_F1) && (state.settings.vpLevel > vpBeep)) - { - vp_announceBuffer(¤tLanguage->callsign, - true, true, ui_state.new_callsign); - f1Handled=true; + if(msg.keys & KEY_DOWN || msg.keys & KNOB_LEFT) + _ui_changeM17Can(-1); + else if(msg.keys & KEY_UP || msg.keys & KNOB_RIGHT) + _ui_changeM17Can(+1); + else if(msg.keys & KEY_ENTER) + ui_state.edit_mode = !ui_state.edit_mode; + else if(msg.keys & KEY_ESC) + ui_state.edit_mode = false; } } else { if(msg.keys & KEY_ENTER) { - // Enable callsign input + // Enable edit mode ui_state.edit_mode = true; - // Reset text input variables - _ui_textInputReset(ui_state.new_callsign); - vp_announceBuffer(¤tLanguage->callsign, - true, true, ui_state.new_callsign); + + // If callsign input, reset text input variables + if(ui_state.menu_selected == M17_CALLSIGN) + { + _ui_textInputReset(ui_state.new_callsign); + vp_announceBuffer(¤tLanguage->callsign, + true, true, ui_state.new_callsign); + } } + else if(msg.keys & KEY_UP || msg.keys & KNOB_LEFT) + _ui_menuUp(settings_m17_num); + else if(msg.keys & KEY_DOWN || msg.keys & KNOB_RIGHT) + _ui_menuDown(settings_m17_num); + else if((msg.keys & KEY_RIGHT) && (ui_state.menu_selected == M17_CAN)) + _ui_changeM17Can(+1); + else if((msg.keys & KEY_LEFT) && (ui_state.menu_selected == M17_CAN)) + _ui_changeM17Can(-1); else if(msg.keys & KEY_ESC) + { + *sync_rtx = true; _ui_menuBack(MENU_SETTINGS); + } } break; case SETTINGS_VOICE: diff --git a/openrtx/src/ui/default/ui_menu.c b/openrtx/src/ui/default/ui_menu.c index a00dd5eb..f62e7df4 100644 --- a/openrtx/src/ui/default/ui_menu.c +++ b/openrtx/src/ui/default/ui_menu.c @@ -330,6 +330,32 @@ int _ui_getSettingsGPSValueName(char *buf, uint8_t max_len, uint8_t index) } #endif +int _ui_getM17EntryName(char *buf, uint8_t max_len, uint8_t index) +{ + if(index >= settings_m17_num) return -1; + snprintf(buf, max_len, "%s", settings_m17_items[index]); + return 0; +} + +int _ui_getM17ValueName(char *buf, uint8_t max_len, uint8_t index) +{ + if(index >= settings_m17_num) + return -1; + + switch(index) + { + case M17_CALLSIGN: + snprintf(buf, max_len, "%s", last_state.settings.callsign); + break; + + case M17_CAN: + snprintf(buf, max_len, "%d", last_state.settings.m17_can); + break; + } + + return 0; +} + int _ui_getVoiceEntryName(char *buf, uint8_t max_len, uint8_t index) { if(index >= settings_voice_num) return -1; @@ -785,7 +811,7 @@ void _ui_drawSettingsM17(ui_state_t* ui_state) gfx_printLine(1, 4, layout.top_h, SCREEN_HEIGHT - layout.bottom_h, layout.horizontal_pad, layout.menu_font, TEXT_ALIGN_LEFT, color_white, currentLanguage->callsign); - if(ui_state->edit_mode) + if((ui_state->edit_mode) && (ui_state->menu_selected == M17_CALLSIGN)) { uint16_t rect_width = SCREEN_WIDTH - (layout.horizontal_pad * 2); uint16_t rect_height = (SCREEN_HEIGHT - (layout.top_h + layout.bottom_h))/2; @@ -799,10 +825,8 @@ void _ui_drawSettingsM17(ui_state_t* ui_state) } else { - // Print M17 current callsign - gfx_printLine(1, 1, layout.top_h, SCREEN_HEIGHT - layout.bottom_h, - layout.horizontal_pad, layout.input_font, - TEXT_ALIGN_CENTER, color_white, last_state.settings.callsign); + _ui_drawMenuListValue(ui_state, ui_state->menu_selected, _ui_getM17EntryName, + _ui_getM17ValueName); } }