From d092c51df590403dc254e0bf12ad33dff17e4996 Mon Sep 17 00:00:00 2001 From: Silvano Seva Date: Mon, 22 Sep 2025 21:16:18 +0200 Subject: [PATCH] ui: settings: add CTCSS enable to FM settings menu Added the ability to manage CTCSS enablement via the FM settings menu. As part of this, refactored the existing instances of setting and displaying this value on the main vfo screen and on the macro menu. Acked-by: Silvano Seva --- openrtx/include/ui/EnglishStrings.h | 5 ++ openrtx/include/ui/SpanishStrings.h | 5 ++ openrtx/include/ui/ui_default.h | 3 +- openrtx/include/ui/ui_strings.h | 5 ++ openrtx/src/ui/default/ui.c | 71 +++++++++++++++++++---------- openrtx/src/ui/default/ui_main.c | 35 +++++++++----- openrtx/src/ui/default/ui_menu.c | 24 ++++++---- 7 files changed, 102 insertions(+), 46 deletions(-) diff --git a/openrtx/include/ui/EnglishStrings.h b/openrtx/include/ui/EnglishStrings.h index 271a697c..38deda58 100644 --- a/openrtx/include/ui/EnglishStrings.h +++ b/openrtx/include/ui/EnglishStrings.h @@ -98,5 +98,10 @@ const stringsTable_t englishStrings = .noGps = "No GPS", .batteryIcon = "Battery Icon", .CTCSSTone = "CTCSS Frequency", + .CTCSSEn = "CTCSS En.", + .Encode = "Encode", + .Decode = "Decode", + .Both = "Both", + .None = "None" }; #endif // ENGLISHSTRINGS_H diff --git a/openrtx/include/ui/SpanishStrings.h b/openrtx/include/ui/SpanishStrings.h index aa76311c..ac80f7e6 100644 --- a/openrtx/include/ui/SpanishStrings.h +++ b/openrtx/include/ui/SpanishStrings.h @@ -99,5 +99,10 @@ const stringsTable_t spanishStrings = .noGps = "NingĂșn GPS", .batteryIcon = "Icon de batteria", .CTCSSTone = "Tono CTCSS", + .CTCSSEn = "CTCSS En.", + .Encode = "Codificar", + .Decode = "Decodificar", + .Both = "Ambos", + .None = "Ni" }; #endif // SPANISHSTRINGS_H diff --git a/openrtx/include/ui/ui_default.h b/openrtx/include/ui/ui_default.h index 6d058f83..5703fe93 100644 --- a/openrtx/include/ui/ui_default.h +++ b/openrtx/include/ui/ui_default.h @@ -157,7 +157,8 @@ enum settingsM17Items enum settingsFMItems { - CTCSS_Tone + CTCSS_Tone, + CTCSS_Enabled }; /** diff --git a/openrtx/include/ui/ui_strings.h b/openrtx/include/ui/ui_strings.h index 21368809..a3a6e743 100644 --- a/openrtx/include/ui/ui_strings.h +++ b/openrtx/include/ui/ui_strings.h @@ -102,6 +102,11 @@ typedef struct const char* noGps; const char* batteryIcon; const char* CTCSSTone; + const char* CTCSSEn; + const char* Encode; + const char* Decode; + const char* Both; + const char* None; } stringsTable_t; diff --git a/openrtx/src/ui/default/ui.c b/openrtx/src/ui/default/ui.c index ed65f435..f69b7a27 100644 --- a/openrtx/src/ui/default/ui.c +++ b/openrtx/src/ui/default/ui.c @@ -119,7 +119,7 @@ extern void _ui_drawSettingsReset2Defaults(ui_state_t* ui_state); extern void _ui_drawSettingsRadio(ui_state_t* ui_state); extern bool _ui_drawMacroMenu(ui_state_t* ui_state); extern void _ui_reset_menu_anouncement_tracking(); - +// TODO: get these from ui strings / currentLanguage const char *menu_items[] = { "Banks", @@ -188,7 +188,8 @@ const char * settings_m17_items[] = const char* settings_fm_items[] = { - "CTCSS Tone" + "CTCSS Tone", + "CTCSS En." }; const char * settings_accessibility_items[] = @@ -890,6 +891,27 @@ static bool _ui_exitStandby(long long now) return true; } +// TODO: find a better home for this function +int _ui_handleToneSelectScroll(bool direction_up) +{ + bool tone_tx_enable = state.channel.fm.txToneEn; + bool tone_rx_enable = state.channel.fm.rxToneEn; + uint8_t tone_flags = tone_tx_enable << 1 | tone_rx_enable; + + if(direction_up) + tone_flags++; + else + tone_flags--; + + tone_flags %= 4; + tone_tx_enable = tone_flags >> 1; + tone_rx_enable = tone_flags & 1; + state.channel.fm.txToneEn = tone_tx_enable; + state.channel.fm.rxToneEn = tone_rx_enable; + + return 1; +} + static void _ui_fsm_menuMacro(kbd_msg_t msg, bool *sync_rtx) { // If there is no keyboard left and right select the menu entry to edit @@ -913,9 +935,6 @@ static void _ui_fsm_menuMacro(kbd_msg_t msg, bool *sync_rtx) ui_state.input_number = input_getPressedNumber(msg); #endif // CONFIG_UI_NO_KEYBOARD // CTCSS Encode/Decode Selection - bool tone_tx_enable = state.channel.fm.txToneEn; - bool tone_rx_enable = state.channel.fm.rxToneEn; - uint8_t tone_flags = tone_tx_enable << 1 | tone_rx_enable; vpQueueFlags_t queueFlags = vp_getVoiceLevelQueueFlags(); switch(ui_state.input_number) @@ -923,12 +942,7 @@ static void _ui_fsm_menuMacro(kbd_msg_t msg, bool *sync_rtx) case 1: if(state.channel.mode == OPMODE_FM) { - tone_flags++; - tone_flags %= 4; - tone_tx_enable = tone_flags >> 1; - tone_rx_enable = tone_flags & 1; - state.channel.fm.txToneEn = tone_tx_enable; - state.channel.fm.rxToneEn = tone_rx_enable; + _ui_handleToneSelectScroll(true); *sync_rtx = true; vp_announceCTCSS( state.channel.fm.rxToneEn, state.channel.fm.rxTone, @@ -2387,7 +2401,12 @@ void ui_updateFSM(bool *sync_rtx) state.channel.fm.txTone--; } } - + else if (msg.keys & KEY_UP || msg.keys & KNOB_RIGHT) + { + state.channel.fm.txTone++; + } else if (msg.keys & KEY_ENTER) { + ui_state.edit_mode = false; + } state.channel.fm.txTone %= CTCSS_FREQ_NUM; state.channel.fm.rxTone = state.channel.fm.txTone; *sync_rtx = true; @@ -2396,19 +2415,25 @@ void ui_updateFSM(bool *sync_rtx) state.channel.fm.txToneEn, state.channel.fm.txTone, queueFlags); - - if (msg.keys & KEY_UP || msg.keys & KNOB_RIGHT) + break; + case CTCSS_Enabled: + if (msg.keys & KEY_DOWN || msg.keys & KNOB_LEFT) { - state.channel.fm.txTone++; - state.channel.fm.txTone %= CTCSS_FREQ_NUM; - state.channel.fm.rxTone = state.channel.fm.txTone; - *sync_rtx = true; - vp_announceCTCSS(state.channel.fm.rxToneEn, - state.channel.fm.rxTone, - state.channel.fm.txToneEn, - state.channel.fm.txTone, - queueFlags); + _ui_handleToneSelectScroll(true); + } else if (msg.keys & KEY_UP || msg.keys & KNOB_RIGHT) + { + _ui_handleToneSelectScroll(false); + } else if (msg.keys & KEY_ENTER) { + ui_state.edit_mode = false; } + + *sync_rtx = true; + vp_announceCTCSS(state.channel.fm.rxToneEn, + state.channel.fm.rxTone, + state.channel.fm.txToneEn, + state.channel.fm.txTone, + queueFlags | vpqIncludeDescriptions); + break; } } else if (msg.keys & KEY_UP || msg.keys & KNOB_LEFT) diff --git a/openrtx/src/ui/default/ui_main.c b/openrtx/src/ui/default/ui_main.c index 22e9d122..5f7ed801 100644 --- a/openrtx/src/ui/default/ui_main.c +++ b/openrtx/src/ui/default/ui_main.c @@ -78,10 +78,31 @@ void _ui_drawBankChannel() b, last_state.channel_index + 1, last_state.channel.name); } +const char* _ui_getToneEnabledString(bool tone_tx_enable, bool tone_rx_enable, + bool use_abbreviation) +{ + const char *strings[2][4] = { + { + currentLanguage->None, + currentLanguage->Encode, + currentLanguage->Decode, + currentLanguage->Both, + }, { + "N", + "T", + "R", + "B" + } + }; + + + uint8_t index = (tone_rx_enable << 1) | (tone_tx_enable); + return strings[use_abbreviation][index]; +} + void _ui_drawModeInfo(ui_state_t* ui_state) { char bw_str[8] = { 0 }; - char encdec_str[9] = { 0 }; switch(last_state.channel.mode) { @@ -96,23 +117,13 @@ void _ui_drawModeInfo(ui_state_t* ui_state) // Get encdec string bool tone_tx_enable = last_state.channel.fm.txToneEn; bool tone_rx_enable = last_state.channel.fm.rxToneEn; - - if (tone_tx_enable && tone_rx_enable) - sniprintf(encdec_str, 9, "ED"); - else if (tone_tx_enable && !tone_rx_enable) - sniprintf(encdec_str, 9, " E"); - else if (!tone_tx_enable && tone_rx_enable) - sniprintf(encdec_str, 9, " D"); - else - sniprintf(encdec_str, 9, " "); - // Print Bandwidth, Tone and encdec info if (tone_tx_enable || tone_rx_enable) { uint16_t tone = ctcss_tone[last_state.channel.fm.txTone]; gfx_print(layout.line2_pos, layout.line2_font, TEXT_ALIGN_CENTER, color_white, "%s %d.%d %s", bw_str, (tone / 10), - (tone % 10), encdec_str); + (tone % 10), _ui_getToneEnabledString(tone_tx_enable, tone_rx_enable, true)); } else { diff --git a/openrtx/src/ui/default/ui_menu.c b/openrtx/src/ui/default/ui_menu.c index e8c1f954..bcabb081 100644 --- a/openrtx/src/ui/default/ui_menu.c +++ b/openrtx/src/ui/default/ui_menu.c @@ -38,6 +38,8 @@ /* UI main screen helper functions, their implementation is in "ui_main.c" */ extern void _ui_drawMainBottom(); +extern const char* _ui_getToneEnabledString(bool tone_tx_enable, + bool tone_rx_enable, bool use_abbreviation); static char priorSelectedMenuName[MAX_ENTRY_LEN] = "\0"; static char priorSelectedMenuValue[MAX_ENTRY_LEN] = "\0"; @@ -466,6 +468,13 @@ int _ui_getFMValueName(char* buf, uint8_t max_len, uint8_t index) sniprintf(buf, max_len, "%d.%d", (tone / 10), (tone % 10)); break; } + + case CTCSS_Enabled: + sniprintf(buf, max_len, "%s", + _ui_getToneEnabledString(last_state.channel.fm.txToneEn, + last_state.channel.fm.rxToneEn, + false)); + break; } return 0; @@ -1139,16 +1148,11 @@ bool _ui_drawMacroMenu(ui_state_t* ui_state) if (last_state.channel.mode == OPMODE_FM) { char encdec_str[9] = {0}; - bool tone_tx_enable = last_state.channel.fm.txToneEn; - bool tone_rx_enable = last_state.channel.fm.rxToneEn; - if (tone_tx_enable && tone_rx_enable) - sniprintf(encdec_str, 9, " B "); - else if (tone_tx_enable && !tone_rx_enable) - sniprintf(encdec_str, 9, " E "); - else if (!tone_tx_enable && tone_rx_enable) - sniprintf(encdec_str, 9, " D "); - else - sniprintf(encdec_str, 9, " N "); + sniprintf(encdec_str, 9, " %s", + _ui_getToneEnabledString(last_state.channel.fm.txToneEn, + last_state.channel.fm.rxToneEn, + true)); + gfx_print(layout.line1_pos, layout.top_font, TEXT_ALIGN_LEFT, color_white, encdec_str); uint16_t tone = ctcss_tone[last_state.channel.fm.txTone];