From a60fc80296a701f725d48e53ddbab03e48de04b8 Mon Sep 17 00:00:00 2001 From: OneOfEleven Date: Wed, 18 Oct 2023 00:27:52 +0100 Subject: [PATCH] Flash light on DTMF call + menu sorting fixed --- Makefile | 4 + README.md | 1 + app/app.c | 11 +- app/menu.c | 296 +++++++++++++++---------------- firmware.bin | Bin 61208 -> 61296 bytes firmware.packed.bin | Bin 61226 -> 61314 bytes frequencies.c | 2 + frequencies.h | 11 +- helper/battery.c | 2 +- radio.c | 4 +- ui/main.c | 2 +- ui/menu.c | 415 +++++++++++++++++++++++--------------------- ui/menu.h | 131 +++++++------- 13 files changed, 459 insertions(+), 420 deletions(-) diff --git a/Makefile b/Makefile index fd5754e..7afef6c 100644 --- a/Makefile +++ b/Makefile @@ -32,6 +32,7 @@ ENABLE_F_CAL_MENU := 0 ENABLE_TX_UNLOCK := 0 ENABLE_CTCSS_TAIL_PHASE_SHIFT := 1 ENABLE_BOOT_BEEPS := 0 +ENABLE_DTMF_CALL_FLASH_LIGHT := 1 ENABLE_SHOW_CHARGE_LEVEL := 0 ENABLE_REVERSE_BAT_SYMBOL := 1 ENABLE_FREQ_SEARCH_TIMEOUT := 0 @@ -320,6 +321,9 @@ endif ifeq ($(ENABLE_BOOT_BEEPS),1) CFLAGS += -DENABLE_BOOT_BEEPS endif +ifeq ($(ENABLE_DTMF_CALL_FLASH_LIGHT),1) + CFLAGS += -DENABLE_DTMF_CALL_FLASH_LIGHT +endif ifeq ($(ENABLE_SHOW_CHARGE_LEVEL),1) CFLAGS += -DENABLE_SHOW_CHARGE_LEVEL endif diff --git a/README.md b/README.md index a7936d5..12a7043 100644 --- a/README.md +++ b/README.md @@ -63,6 +63,7 @@ ENABLE_F_CAL_MENU := 0 enable/disable the radios hidden fre ENABLE_TX_UNLOCK := 0 '1' = allow TX everywhere EXCEPT airband (108~136) .. TX harmonic content will cause interference to other services, do so entirely at your own risk ! ENABLE_CTCSS_TAIL_PHASE_SHIFT := 1 standard CTCSS tail phase shift rather than QS's own 55Hz tone method ENABLE_BOOT_BEEPS := 0 gives user audio feedback on volume knob position at boot-up +ENABLE_DTMF_CALL_FLASH_LIGHT := 1 flash the flash light LED when a DTMF call is received ENABLE_SHOW_CHARGE_LEVEL := 0 show the charge level when the radio is on charge ENABLE_REVERSE_BAT_SYMBOL := 1 mirror the battery symbol on the status bar (+ pole on the right) ENABLE_FREQ_SEARCH_TIMEOUT := 1 timeout if FREQ not found when using F+4 search function diff --git a/app/app.c b/app/app.c index abd66e8..05339f5 100644 --- a/app/app.c +++ b/app/app.c @@ -2062,7 +2062,7 @@ void APP_time_slice_500ms(void) g_css_scan_mode == CSS_SCAN_MODE_OFF && g_screen_to_display != DISPLAY_AIRCOPY) { - if (g_screen_to_display != DISPLAY_MENU || g_menu_cursor != MENU_ABR) // don't turn off backlight if user is in backlight menu option + if (g_screen_to_display != DISPLAY_MENU || g_menu_cursor != MENU_AUTO_BACKLITE) // don't turn off backlight if user is in backlight menu option if (--g_backlight_count_down == 0) if (g_eeprom.backlight < (ARRAY_SIZE(g_sub_menu_backlight) - 1)) GPIO_ClearBit(&GPIOB->DATA, GPIOB_PIN_BACKLIGHT); // turn backlight off @@ -2277,7 +2277,16 @@ void APP_time_slice_500ms(void) if (g_dtmf_decode_ring_count_down_500ms > 0) { // make "ring-ring" sound g_dtmf_decode_ring_count_down_500ms--; + + #ifdef ENABLE_DTMF_CALL_FLASH_LIGHT + GPIO_SetBit(&GPIOC->DATA, GPIOC_PIN_FLASHLIGHT); // light on + #endif + AUDIO_PlayBeep(BEEP_880HZ_200MS); + + #ifdef ENABLE_DTMF_CALL_FLASH_LIGHT + GPIO_ClearBit(&GPIOC->DATA, GPIOC_PIN_FLASHLIGHT); // light off + #endif } } else diff --git a/app/menu.c b/app/menu.c index 143dd6d..bb3e1b7 100644 --- a/app/menu.c +++ b/app/menu.c @@ -81,7 +81,7 @@ void MENU_start_css_scan(int8_t Direction) g_css_scan_mode = CSS_SCAN_MODE_SCANNING; g_update_status = true; - g_menu_scroll_direction = Direction; + g_MENU_SCRAMBLERoll_direction = Direction; RADIO_select_vfos(); @@ -112,7 +112,7 @@ int MENU_GetLimits(uint8_t Cursor, int32_t *pMin, int32_t *pMax) *pMax = ARRAY_SIZE(STEP_FREQ_TABLE) - 1; break; - case MENU_ABR: + case MENU_AUTO_BACKLITE: *pMin = 0; *pMax = ARRAY_SIZE(g_sub_menu_backlight) - 1; break; @@ -122,24 +122,24 @@ int MENU_GetLimits(uint8_t Cursor, int32_t *pMin, int32_t *pMax) *pMax = ARRAY_SIZE(g_sub_menu_freq_lock) - 1; break; - case MENU_MDF: + case MENU_MEM_DISP: *pMin = 0; - *pMax = ARRAY_SIZE(g_sub_menu_mdf) - 1; + *pMax = ARRAY_SIZE(g_sub_MENU_MEM_DISP) - 1; break; - case MENU_TXP: + case MENU_TX_POWER: *pMin = 0; - *pMax = ARRAY_SIZE(g_sub_menu_txp) - 1; + *pMax = ARRAY_SIZE(g_sub_MENU_TX_POWER) - 1; break; - case MENU_SFT_D: + case MENU_SHIFT_DIR: *pMin = 0; *pMax = ARRAY_SIZE(g_sub_menu_shift_dir) - 1; break; - case MENU_TDR: + case MENU_DUAL_WATCH: *pMin = 0; -// *pMax = ARRAY_SIZE(g_sub_menu_tdr) - 1; +// *pMax = ARRAY_SIZE(g_sub_MENU_DUAL_WATCH) - 1; *pMax = ARRAY_SIZE(g_sub_menu_off_on) - 1; break; @@ -148,9 +148,9 @@ int MENU_GetLimits(uint8_t Cursor, int32_t *pMin, int32_t *pMax) *pMax = 20; break; - case MENU_XB: + case MENU_CROSS_VFO: *pMin = 0; - *pMax = ARRAY_SIZE(g_sub_menu_xb) - 1; + *pMax = ARRAY_SIZE(g_sub_MENU_CROSS_VFO) - 1; break; #ifdef ENABLE_VOICE @@ -160,43 +160,43 @@ int MENU_GetLimits(uint8_t Cursor, int32_t *pMin, int32_t *pMax) break; #endif - case MENU_SC_REV: + case MENU_SCAN_CAR_RESUME: *pMin = 0; - *pMax = ARRAY_SIZE(g_sub_menu_sc_rev) - 1; + *pMax = ARRAY_SIZE(g_sub_MENU_SCAN_CAR_RESUME) - 1; break; - case MENU_ROGER: + case MENU_ROGER_MODE: *pMin = 0; - *pMax = ARRAY_SIZE(g_sub_menu_roger_mode) - 1; + *pMax = ARRAY_SIZE(g_sub_MENU_ROGER_MODE_mode) - 1; break; - case MENU_PONMSG: + case MENU_PON_MSG: *pMin = 0; *pMax = ARRAY_SIZE(g_sub_menu_pwr_on_msg) - 1; break; - case MENU_R_DCS: - case MENU_T_DCS: + case MENU_RX_CDCSS: + case MENU_TX_CDCSS: *pMin = 0; *pMax = 208; //*pMax = (ARRAY_SIZE(DCS_OPTIONS) * 2); break; - case MENU_R_CTCS: - case MENU_T_CTCS: + case MENU_RX_CTCSS: + case MENU_TX_CTCSS: *pMin = 0; *pMax = ARRAY_SIZE(CTCSS_OPTIONS) - 1; break; - case MENU_W_N: + case MENU_BANDWIDTH: *pMin = 0; - *pMax = ARRAY_SIZE(g_sub_menu_w_n) - 1; + *pMax = ARRAY_SIZE(g_sub_MENU_BANDWIDTH) - 1; break; #ifdef ENABLE_ALARM - case MENU_AL_MOD: + case MENU_ALARM_MODE: *pMin = 0; - *pMax = ARRAY_SIZE(g_sub_menu_AL_MOD) - 1; + *pMax = ARRAY_SIZE(g_sub_MENU_ALARM_MODE) - 1; break; #endif @@ -214,7 +214,7 @@ int MENU_GetLimits(uint8_t Cursor, int32_t *pMin, int32_t *pMax) break; case MENU_COMPAND: - case MENU_ABR_ON_TX_RX: + case MENU_AUTO_BACKLITE_ON_TX_RX: *pMin = 0; *pMax = ARRAY_SIZE(g_sub_menu_rx_tx) - 1; break; @@ -229,7 +229,7 @@ int MENU_GetLimits(uint8_t Cursor, int32_t *pMin, int32_t *pMax) #ifdef ENABLE_AM_FIX_TEST1 case MENU_AM_FIX_TEST1: *pMin = 0; - *pMax = ARRAY_SIZE(g_sub_menu_AM_fix_test1) - 1; + *pMax = ARRAY_SIZE(g_sub_MENU_AM_FIX_test1) - 1; break; #endif @@ -242,41 +242,41 @@ int MENU_GetLimits(uint8_t Cursor, int32_t *pMin, int32_t *pMax) #ifdef ENABLE_RSSI_BAR case MENU_RX_BAR: #endif - case MENU_BCL: + case MENU_BUSY_CHAN_LOCK: case MENU_BEEP: - case MENU_AUTOLK: + case MENU_AUTO_KEY_LOCK: case MENU_S_ADD1: case MENU_S_ADD2: case MENU_STE: - case MENU_D_ST: - case MENU_D_DCD: - case MENU_D_LIVE_DEC: - case MENU_AM: + case MENU_DTMF_ST: + case MENU_DTMF_DCD: + case MENU_DTMF_LIVE_DEC: + case MENU_MOD_MODE: *pMin = 0; *pMax = ARRAY_SIZE(g_sub_menu_off_on) - 1; break; #ifdef ENABLE_NOAA - case MENU_NOAA_S: + case MENU_NOAA_SCAN: #endif - case MENU_350TX: - case MENU_174TX: - case MENU_470TX: - case MENU_350EN: - case MENU_SCREN: + case MENU_350_TX: + case MENU_174_TX: + case MENU_470_TX: + case MENU_350_EN: + case MENU_SCRAMBLER_EN: case MENU_TX_EN: *pMin = 0; *pMax = ARRAY_SIZE(g_sub_menu_DIS_EN) - 1; break; - case MENU_SCR: + case MENU_SCRAMBLER: *pMin = 0; - *pMax = ARRAY_SIZE(g_sub_menu_SCRAMBLER) - 1; + *pMax = ARRAY_SIZE(g_sub_MENU_SCRAMBLERAMBLER) - 1; break; - case MENU_TOT: + case MENU_TX_TO: *pMin = 0; - *pMax = ARRAY_SIZE(g_sub_menu_TOT) - 1; + *pMax = ARRAY_SIZE(g_sub_MENU_TX_TO) - 1; break; #ifdef ENABLE_VOX @@ -287,9 +287,9 @@ int MENU_GetLimits(uint8_t Cursor, int32_t *pMin, int32_t *pMax) *pMax = 10; break; - case MENU_MEM_CH: + case MENU_MEM_SAVE: case MENU_1_CALL: - case MENU_DEL_CH: + case MENU_MEM_DEL: case MENU_MEM_NAME: *pMin = 0; *pMax = USER_CHANNEL_LAST; @@ -301,12 +301,12 @@ int MENU_GetLimits(uint8_t Cursor, int32_t *pMin, int32_t *pMax) *pMax = USER_CHANNEL_LAST; break; - case MENU_SAVE: + case MENU_BAT_SAVE: *pMin = 0; - *pMax = ARRAY_SIZE(g_sub_menu_SAVE) - 1; + *pMax = ARRAY_SIZE(g_sub_MENU_BAT_SAVE) - 1; break; - case MENU_MIC: + case MENU_MIC_GAIN: *pMin = 0; *pMax = 4; break; @@ -317,9 +317,9 @@ int MENU_GetLimits(uint8_t Cursor, int32_t *pMin, int32_t *pMax) *pMax = 2; break; - case MENU_D_RSP: + case MENU_DTMF_RSP: *pMin = 0; - *pMax = ARRAY_SIZE(g_sub_menu_D_RSP) - 1; + *pMax = ARRAY_SIZE(g_sub_MENU_DTMF_RSP) - 1; break; case MENU_PTT_ID: @@ -332,17 +332,17 @@ int MENU_GetLimits(uint8_t Cursor, int32_t *pMin, int32_t *pMax) *pMax = ARRAY_SIZE(g_sub_menu_BAT_TXT) - 1; break; - case MENU_D_HOLD: + case MENU_DTMF_HOLD: *pMin = DTMF_HOLD_MIN; *pMax = DTMF_HOLD_MAX; break; - case MENU_D_PRE: + case MENU_DTMF_PRE: *pMin = 3; *pMax = 99; break; - case MENU_D_LIST: + case MENU_DTMF_LIST: *pMin = 1; *pMax = 16; break; @@ -354,7 +354,7 @@ int MENU_GetLimits(uint8_t Cursor, int32_t *pMin, int32_t *pMax) break; #endif - case MENU_BATCAL: + case MENU_BAT_CAL: *pMin = 1600; // 0 *pMax = 2200; // 2300 break; @@ -399,17 +399,17 @@ void MENU_AcceptSetting(void) } return; - case MENU_TXP: + case MENU_TX_POWER: g_tx_vfo->output_power = g_sub_menu_selection; g_request_save_channel = 1; return; - case MENU_T_DCS: + case MENU_TX_CDCSS: pConfig = &g_tx_vfo->freq_config_tx; // Fallthrough - case MENU_R_DCS: + case MENU_RX_CDCSS: if (g_sub_menu_selection == 0) { if (pConfig->code_type != CODE_TYPE_DIGITAL && pConfig->code_type != CODE_TYPE_REVERSE_DIGITAL) @@ -439,9 +439,9 @@ void MENU_AcceptSetting(void) #pragma GCC diagnostic push #pragma GCC diagnostic ignored "-Wimplicit-fallthrough=" - case MENU_T_CTCS: + case MENU_TX_CTCSS: pConfig = &g_tx_vfo->freq_config_tx; - case MENU_R_CTCS: + case MENU_RX_CTCSS: if (g_sub_menu_selection == 0) { if (pConfig->code_type != CODE_TYPE_CONTINUOUS_TONE) @@ -469,7 +469,7 @@ void MENU_AcceptSetting(void) #pragma GCC diagnostic pop - case MENU_SFT_D: + case MENU_SHIFT_DIR: g_tx_vfo->tx_offset_freq_dir = g_sub_menu_selection; g_request_save_channel = 1; return; @@ -479,12 +479,12 @@ void MENU_AcceptSetting(void) g_request_save_channel = 1; return; - case MENU_W_N: + case MENU_BANDWIDTH: g_tx_vfo->channel_bandwidth = g_sub_menu_selection; g_request_save_channel = 1; return; - case MENU_SCR: + case MENU_SCRAMBLER: g_tx_vfo->scrambling_type = g_sub_menu_selection; #if 0 if (g_sub_menu_selection > 0 && g_setting_scramble_enable) @@ -495,12 +495,12 @@ void MENU_AcceptSetting(void) g_request_save_channel= 1; return; - case MENU_BCL: + case MENU_BUSY_CHAN_LOCK: g_tx_vfo->busy_channel_lock = g_sub_menu_selection; g_request_save_channel = 1; return; - case MENU_MEM_CH: + case MENU_MEM_SAVE: g_tx_vfo->channel_save = g_sub_menu_selection; #if 0 g_eeprom.user_channel[0] = g_sub_menu_selection; @@ -529,7 +529,7 @@ void MENU_AcceptSetting(void) g_flag_reconfigure_vfos = true; return; - case MENU_SAVE: + case MENU_BAT_SAVE: g_eeprom.battery_save = g_sub_menu_selection; break; @@ -544,11 +544,11 @@ void MENU_AcceptSetting(void) break; #endif - case MENU_ABR: + case MENU_AUTO_BACKLITE: g_eeprom.backlight = g_sub_menu_selection; break; - case MENU_ABR_ON_TX_RX: + case MENU_AUTO_BACKLITE_ON_TX_RX: g_setting_backlight_on_tx_rx = g_sub_menu_selection; break; @@ -557,7 +557,7 @@ void MENU_AcceptSetting(void) ST7565_SetContrast(g_setting_contrast); break; - case MENU_TDR: + case MENU_DUAL_WATCH: // g_eeprom.dual_watch = g_sub_menu_selection; g_eeprom.dual_watch = (g_sub_menu_selection > 0) ? 1 + g_eeprom.tx_vfo : DUAL_WATCH_OFF; @@ -569,7 +569,7 @@ void MENU_AcceptSetting(void) g_eeprom.scan_hold_time_500ms = g_sub_menu_selection; break; - case MENU_XB: + case MENU_CROSS_VFO: if (IS_NOAA_CHANNEL(g_eeprom.screen_channel[0])) return; if (IS_NOAA_CHANNEL(g_eeprom.screen_channel[1])) @@ -584,7 +584,7 @@ void MENU_AcceptSetting(void) g_eeprom.beep_control = g_sub_menu_selection; break; - case MENU_TOT: + case MENU_TX_TO: g_eeprom.tx_timeout_timer = g_sub_menu_selection; break; @@ -595,15 +595,15 @@ void MENU_AcceptSetting(void) break; #endif - case MENU_SC_REV: + case MENU_SCAN_CAR_RESUME: g_eeprom.scan_resume_mode = g_sub_menu_selection; break; - case MENU_MDF: + case MENU_MEM_DISP: g_eeprom.channel_display_mode = g_sub_menu_selection; break; - case MENU_AUTOLK: + case MENU_AUTO_KEY_LOCK: g_eeprom.auto_keypad_lock = g_sub_menu_selection; g_key_lock_count_down_500ms = key_lock_timeout_500ms; break; @@ -630,7 +630,7 @@ void MENU_AcceptSetting(void) g_eeprom.repeater_tail_tone_elimination = g_sub_menu_selection; break; - case MENU_MIC: + case MENU_MIC_GAIN: g_eeprom.mic_sensitivity = g_sub_menu_selection; BOARD_EEPROM_LoadCalibration(); g_flag_reconfigure_vfos = true; @@ -667,24 +667,24 @@ void MENU_AcceptSetting(void) break; #ifdef ENABLE_ALARM - case MENU_AL_MOD: + case MENU_ALARM_MODE: g_eeprom.alarm_mode = g_sub_menu_selection; break; #endif - case MENU_D_ST: + case MENU_DTMF_ST: g_eeprom.dtmf_side_tone = g_sub_menu_selection; break; - case MENU_D_RSP: + case MENU_DTMF_RSP: g_eeprom.dtmf_decode_response = g_sub_menu_selection; break; - case MENU_D_HOLD: + case MENU_DTMF_HOLD: g_eeprom.dtmf_auto_reset_time = g_sub_menu_selection; break; - case MENU_D_PRE: + case MENU_DTMF_PRE: g_eeprom.dtmf_preload_time = g_sub_menu_selection * 10; break; @@ -704,13 +704,13 @@ void MENU_AcceptSetting(void) g_setting_battery_text = g_sub_menu_selection; break; - case MENU_D_DCD: + case MENU_DTMF_DCD: g_tx_vfo->dtmf_decoding_enable = g_sub_menu_selection; DTMF_clear_RX(); g_request_save_channel = 1; return; - case MENU_D_LIVE_DEC: + case MENU_DTMF_LIVE_DEC: g_setting_live_dtmf_decoder = g_sub_menu_selection; g_dtmf_rx_live_timeout = 0; memset(g_dtmf_rx_live, 0, sizeof(g_dtmf_rx_live)); @@ -720,7 +720,7 @@ void MENU_AcceptSetting(void) g_update_status = true; break; - case MENU_D_LIST: + case MENU_DTMF_LIST: g_dtmf_chosen_contact = g_sub_menu_selection - 1; if (g_dtmf_is_contact_valid) { @@ -732,11 +732,11 @@ void MENU_AcceptSetting(void) } return; - case MENU_PONMSG: + case MENU_PON_MSG: g_eeprom.pwr_on_display_mode = g_sub_menu_selection; break; - case MENU_ROGER: + case MENU_ROGER_MODE: g_eeprom.roger_mode = g_sub_menu_selection; if (g_eeprom.roger_mode != ROGER_MODE_OFF) { @@ -750,7 +750,7 @@ void MENU_AcceptSetting(void) } break; - case MENU_AM: + case MENU_MOD_MODE: g_tx_vfo->am_mode = g_sub_menu_selection; g_request_save_channel = 1; return; @@ -772,13 +772,13 @@ void MENU_AcceptSetting(void) #endif #ifdef ENABLE_NOAA - case MENU_NOAA_S: + case MENU_NOAA_SCAN: g_eeprom.noaa_auto_scan = g_sub_menu_selection; g_flag_reconfigure_vfos = true; break; #endif - case MENU_DEL_CH: + case MENU_MEM_DEL: SETTINGS_UpdateChannel(g_sub_menu_selection, NULL, false); g_vfo_configure_mode = VFO_CONFIGURE_RELOAD; g_flag_reset_vfos = true; @@ -804,7 +804,7 @@ void MENU_AcceptSetting(void) BOARD_FactoryReset(g_sub_menu_selection); return; - case MENU_350TX: + case MENU_350_TX: g_setting_350_tx_enable = g_sub_menu_selection; break; @@ -812,21 +812,21 @@ void MENU_AcceptSetting(void) g_setting_freq_lock = g_sub_menu_selection; break; - case MENU_174TX: + case MENU_174_TX: g_setting_174_tx_enable = g_sub_menu_selection; break; - case MENU_470TX: + case MENU_470_TX: g_setting_470_tx_enable = g_sub_menu_selection; break; - case MENU_350EN: + case MENU_350_EN: g_setting_350_enable = g_sub_menu_selection; g_vfo_configure_mode = VFO_CONFIGURE_RELOAD; g_flag_reset_vfos = true; break; - case MENU_SCREN: + case MENU_SCRAMBLER_EN: g_setting_scramble_enable = g_sub_menu_selection; g_flag_reconfigure_vfos = true; break; @@ -841,7 +841,7 @@ void MENU_AcceptSetting(void) return; #endif - case MENU_BATCAL: + case MENU_BAT_CAL: { uint16_t buf[4]; @@ -869,18 +869,18 @@ void MENU_SelectNextCode(void) { int32_t UpperLimit; - if (g_menu_cursor == MENU_R_DCS) + if (g_menu_cursor == MENU_RX_CDCSS) UpperLimit = 208; //UpperLimit = ARRAY_SIZE(DCS_OPTIONS); else - if (g_menu_cursor == MENU_R_CTCS) + if (g_menu_cursor == MENU_RX_CTCSS) UpperLimit = ARRAY_SIZE(CTCSS_OPTIONS) - 1; else return; - g_sub_menu_selection = NUMBER_AddWithWraparound(g_sub_menu_selection, g_menu_scroll_direction, 1, UpperLimit); + g_sub_menu_selection = NUMBER_AddWithWraparound(g_sub_menu_selection, g_MENU_SCRAMBLERoll_direction, 1, UpperLimit); - if (g_menu_cursor == MENU_R_DCS) + if (g_menu_cursor == MENU_RX_CDCSS) { if (g_sub_menu_selection > 104) { @@ -934,11 +934,11 @@ void MENU_ShowCurrentSetting(void) g_sub_menu_selection = g_tx_vfo->step_setting; break; - case MENU_TXP: + case MENU_TX_POWER: g_sub_menu_selection = g_tx_vfo->output_power; break; - case MENU_R_DCS: + case MENU_RX_CDCSS: switch (g_tx_vfo->freq_config_rx.code_type) { case CODE_TYPE_DIGITAL: @@ -957,11 +957,11 @@ void MENU_ShowCurrentSetting(void) g_sub_menu_selection = 0; break; - case MENU_R_CTCS: + case MENU_RX_CTCSS: g_sub_menu_selection = (g_tx_vfo->freq_config_rx.code_type == CODE_TYPE_CONTINUOUS_TONE) ? g_tx_vfo->freq_config_rx.code + 1 : 0; break; - case MENU_T_DCS: + case MENU_TX_CDCSS: switch (g_tx_vfo->freq_config_tx.code_type) { case CODE_TYPE_DIGITAL: @@ -976,11 +976,11 @@ void MENU_ShowCurrentSetting(void) } break; - case MENU_T_CTCS: + case MENU_TX_CTCSS: g_sub_menu_selection = (g_tx_vfo->freq_config_tx.code_type == CODE_TYPE_CONTINUOUS_TONE) ? g_tx_vfo->freq_config_tx.code + 1 : 0; break; - case MENU_SFT_D: + case MENU_SHIFT_DIR: g_sub_menu_selection = g_tx_vfo->tx_offset_freq_dir; break; @@ -988,19 +988,19 @@ void MENU_ShowCurrentSetting(void) g_sub_menu_selection = g_tx_vfo->tx_offset_freq; break; - case MENU_W_N: + case MENU_BANDWIDTH: g_sub_menu_selection = g_tx_vfo->channel_bandwidth; break; - case MENU_SCR: + case MENU_SCRAMBLER: g_sub_menu_selection = g_tx_vfo->scrambling_type; break; - case MENU_BCL: + case MENU_BUSY_CHAN_LOCK: g_sub_menu_selection = g_tx_vfo->busy_channel_lock; break; - case MENU_MEM_CH: + case MENU_MEM_SAVE: #if 0 g_sub_menu_selection = g_eeprom.user_channel[0]; #else @@ -1012,7 +1012,7 @@ void MENU_ShowCurrentSetting(void) g_sub_menu_selection = g_eeprom.user_channel[g_eeprom.tx_vfo]; break; - case MENU_SAVE: + case MENU_BAT_SAVE: g_sub_menu_selection = g_eeprom.battery_save; break; @@ -1022,14 +1022,14 @@ void MENU_ShowCurrentSetting(void) break; #endif - case MENU_ABR: + case MENU_AUTO_BACKLITE: g_sub_menu_selection = g_eeprom.backlight; g_backlight_count_down = 0; GPIO_SetBit(&GPIOB->DATA, GPIOB_PIN_BACKLIGHT); // turn the backlight ON while in backlight menu break; - case MENU_ABR_ON_TX_RX: + case MENU_AUTO_BACKLITE_ON_TX_RX: g_sub_menu_selection = g_setting_backlight_on_tx_rx; break; @@ -1037,7 +1037,7 @@ void MENU_ShowCurrentSetting(void) g_sub_menu_selection = g_setting_contrast; break; - case MENU_TDR: + case MENU_DUAL_WATCH: // g_sub_menu_selection = g_eeprom.dual_watch; g_sub_menu_selection = (g_eeprom.dual_watch == DUAL_WATCH_OFF) ? 0 : 1; break; @@ -1046,7 +1046,7 @@ void MENU_ShowCurrentSetting(void) g_sub_menu_selection = g_eeprom.scan_hold_time_500ms; break; - case MENU_XB: + case MENU_CROSS_VFO: g_sub_menu_selection = g_eeprom.cross_vfo_rx_tx; break; @@ -1054,7 +1054,7 @@ void MENU_ShowCurrentSetting(void) g_sub_menu_selection = g_eeprom.beep_control; break; - case MENU_TOT: + case MENU_TX_TO: g_sub_menu_selection = g_eeprom.tx_timeout_timer; break; @@ -1064,15 +1064,15 @@ void MENU_ShowCurrentSetting(void) break; #endif - case MENU_SC_REV: + case MENU_SCAN_CAR_RESUME: g_sub_menu_selection = g_eeprom.scan_resume_mode; break; - case MENU_MDF: + case MENU_MEM_DISP: g_sub_menu_selection = g_eeprom.channel_display_mode; break; - case MENU_AUTOLK: + case MENU_AUTO_KEY_LOCK: g_sub_menu_selection = g_eeprom.auto_keypad_lock; break; @@ -1092,7 +1092,7 @@ void MENU_ShowCurrentSetting(void) g_sub_menu_selection = g_eeprom.repeater_tail_tone_elimination; break; - case MENU_MIC: + case MENU_MIC_GAIN: g_sub_menu_selection = g_eeprom.mic_sensitivity; break; @@ -1129,20 +1129,20 @@ void MENU_ShowCurrentSetting(void) break; #ifdef ENABLE_ALARM - case MENU_AL_MOD: + case MENU_ALARM_MODE: g_sub_menu_selection = g_eeprom.alarm_mode; break; #endif - case MENU_D_ST: + case MENU_DTMF_ST: g_sub_menu_selection = g_eeprom.dtmf_side_tone; break; - case MENU_D_RSP: + case MENU_DTMF_RSP: g_sub_menu_selection = g_eeprom.dtmf_decode_response; break; - case MENU_D_HOLD: + case MENU_DTMF_HOLD: g_sub_menu_selection = g_eeprom.dtmf_auto_reset_time; if (g_sub_menu_selection <= DTMF_HOLD_MIN) @@ -1170,7 +1170,7 @@ void MENU_ShowCurrentSetting(void) break; - case MENU_D_PRE: + case MENU_DTMF_PRE: g_sub_menu_selection = g_eeprom.dtmf_preload_time / 10; break; @@ -1182,27 +1182,27 @@ void MENU_ShowCurrentSetting(void) g_sub_menu_selection = g_setting_battery_text; return; - case MENU_D_DCD: + case MENU_DTMF_DCD: g_sub_menu_selection = g_tx_vfo->dtmf_decoding_enable; break; - case MENU_D_LIST: + case MENU_DTMF_LIST: g_sub_menu_selection = g_dtmf_chosen_contact + 1; break; - case MENU_D_LIVE_DEC: + case MENU_DTMF_LIVE_DEC: g_sub_menu_selection = g_setting_live_dtmf_decoder; break; - case MENU_PONMSG: + case MENU_PON_MSG: g_sub_menu_selection = g_eeprom.pwr_on_display_mode; break; - case MENU_ROGER: + case MENU_ROGER_MODE: g_sub_menu_selection = g_eeprom.roger_mode; break; - case MENU_AM: + case MENU_MOD_MODE: g_sub_menu_selection = g_tx_vfo->am_mode; break; @@ -1219,12 +1219,12 @@ void MENU_ShowCurrentSetting(void) #endif #ifdef ENABLE_NOAA - case MENU_NOAA_S: + case MENU_NOAA_SCAN: g_sub_menu_selection = g_eeprom.noaa_auto_scan; break; #endif - case MENU_DEL_CH: + case MENU_MEM_DEL: #if 0 g_sub_menu_selection = RADIO_FindNextChannel(g_eeprom.user_channel[0], 1, false, 1); #else @@ -1248,7 +1248,7 @@ void MENU_ShowCurrentSetting(void) g_sub_menu_selection = g_eeprom.key2_long_press_action; break; - case MENU_350TX: + case MENU_350_TX: g_sub_menu_selection = g_setting_350_tx_enable; break; @@ -1256,19 +1256,19 @@ void MENU_ShowCurrentSetting(void) g_sub_menu_selection = g_setting_freq_lock; break; - case MENU_174TX: + case MENU_174_TX: g_sub_menu_selection = g_setting_174_tx_enable; break; - case MENU_470TX: + case MENU_470_TX: g_sub_menu_selection = g_setting_470_tx_enable; break; - case MENU_350EN: + case MENU_350_EN: g_sub_menu_selection = g_setting_350_enable; break; - case MENU_SCREN: + case MENU_SCRAMBLER_EN: g_sub_menu_selection = g_setting_scramble_enable; break; @@ -1282,7 +1282,7 @@ void MENU_ShowCurrentSetting(void) break; #endif - case MENU_BATCAL: + case MENU_BAT_CAL: g_sub_menu_selection = g_battery_calibration[3]; break; @@ -1401,8 +1401,8 @@ static void MENU_Key_0_to_9(key_code_t Key, bool key_pressed, bool key_held) return; } - if (g_menu_cursor == MENU_MEM_CH || - g_menu_cursor == MENU_DEL_CH || + if (g_menu_cursor == MENU_MEM_SAVE || + g_menu_cursor == MENU_MEM_DEL || g_menu_cursor == MENU_1_CALL || g_menu_cursor == MENU_MEM_NAME) { // enter 3-digit channel number @@ -1535,12 +1535,12 @@ static void MENU_Key_MENU(const bool key_pressed, const bool key_held) if (!g_is_in_sub_menu) { #ifdef ENABLE_VOICE - if (g_menu_cursor != MENU_SCR) + if (g_menu_cursor != MENU_SCRAMBLER) g_another_voice_id = g_menu_list[g_menu_list_sorted[g_menu_cursor]].voice_id; #endif #if 1 - if (g_menu_cursor == MENU_DEL_CH || g_menu_cursor == MENU_MEM_NAME) + if (g_menu_cursor == MENU_MEM_DEL || g_menu_cursor == MENU_MEM_NAME) if (!RADIO_CheckValidChannel(g_sub_menu_selection, false, 0)) return; // invalid channel #endif @@ -1548,7 +1548,7 @@ static void MENU_Key_MENU(const bool key_pressed, const bool key_held) g_ask_for_confirmation = 0; g_is_in_sub_menu = true; -// if (g_menu_cursor != MENU_D_LIST) +// if (g_menu_cursor != MENU_DTMF_LIST) { g_input_box_index = 0; g_edit_index = -1; @@ -1605,8 +1605,8 @@ static void MENU_Key_MENU(const bool key_pressed, const bool key_held) if (g_is_in_sub_menu) { if (g_menu_cursor == MENU_RESET || - g_menu_cursor == MENU_MEM_CH || - g_menu_cursor == MENU_DEL_CH || + g_menu_cursor == MENU_MEM_SAVE || + g_menu_cursor == MENU_MEM_DEL || g_menu_cursor == MENU_MEM_NAME) { switch (g_ask_for_confirmation) @@ -1655,7 +1655,7 @@ static void MENU_Key_MENU(const bool key_pressed, const bool key_held) } #ifdef ENABLE_VOICE - if (g_menu_cursor == MENU_SCR) + if (g_menu_cursor == MENU_SCRAMBLER) g_another_voice_id = (g_sub_menu_selection == 0) ? VOICE_ID_SCRAMBLER_OFF : VOICE_ID_SCRAMBLER_ON; else g_another_voice_id = VOICE_ID_CONFIRM; @@ -1694,7 +1694,7 @@ static void MENU_Key_STAR(const bool key_pressed, const bool key_held) if (IS_NOT_NOAA_CHANNEL(g_rx_vfo->channel_save) && g_rx_vfo->am_mode == 0) { - if (g_menu_cursor == MENU_R_CTCS || g_menu_cursor == MENU_R_DCS) + if (g_menu_cursor == MENU_RX_CTCSS || g_menu_cursor == MENU_RX_CDCSS) { // scan CTCSS or DCS to find the tone/code of the incoming signal if (g_css_scan_mode == CSS_SCAN_MODE_OFF) @@ -1782,7 +1782,7 @@ static void MENU_Key_UP_DOWN(bool key_pressed, bool key_held, int8_t Direction) g_request_display_screen = DISPLAY_MENU; - if (g_menu_cursor != MENU_ABR && g_eeprom.backlight == 0) + if (g_menu_cursor != MENU_AUTO_BACKLITE && g_eeprom.backlight == 0) { g_backlight_count_down = 0; GPIO_ClearBit(&GPIOB->DATA, GPIOB_PIN_BACKLIGHT); // turn the backlight OFF @@ -1814,7 +1814,7 @@ static void MENU_Key_UP_DOWN(bool key_pressed, bool key_held, int8_t Direction) switch (g_menu_cursor) { - case MENU_DEL_CH: + case MENU_MEM_DEL: case MENU_1_CALL: case MENU_MEM_NAME: bCheckScanList = false; @@ -1905,11 +1905,11 @@ void MENU_process_key(key_code_t Key, bool key_pressed, bool key_held) if (g_screen_to_display == DISPLAY_MENU) { - if (g_menu_cursor == MENU_VOL || + if (g_menu_cursor == MENU_VOLTAGE || #ifdef ENABLE_F_CAL_MENU g_menu_cursor == MENU_F_CALI || #endif - g_menu_cursor == MENU_BATCAL) + g_menu_cursor == MENU_BAT_CAL) { g_menu_count_down = menu_timeout_long_500ms; } diff --git a/firmware.bin b/firmware.bin index b7c59dbceb79fc995403818093e8be2134bad89b..f744a92a92f1e5e61d27bf40f4268afdfa6769ed 100644 GIT binary patch delta 13491 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 delta 13590 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 JJWjwE{U3@!aMS<* diff --git a/firmware.packed.bin b/firmware.packed.bin index 97f2127ec99d2d3d02fb822d536cca73763f4c1b..d0799aecc4ee2fac4130855afed6ffa4d2a920cf 100644 GIT binary patch delta 32230 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 bsF)sf!x2EwJ&ACeCfOQwc_!l`-;Mr%EzLPD delta 32142 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 (ARRAY_SIZE(g_sub_menu_SCRAMBLER) - 1)) + if (Tmp > (ARRAY_SIZE(g_sub_MENU_SCRAMBLERAMBLER) - 1)) Tmp = 0; g_eeprom.vfo_info[VFO].scrambling_type = Tmp; @@ -1079,7 +1079,7 @@ void RADIO_PrepareTX(void) if (g_eeprom.tx_timeout_timer == 0) g_tx_timer_count_down_500ms = 60; // 30 sec else - if (g_eeprom.tx_timeout_timer < (ARRAY_SIZE(g_sub_menu_TOT) - 1)) + if (g_eeprom.tx_timeout_timer < (ARRAY_SIZE(g_sub_MENU_TX_TO) - 1)) g_tx_timer_count_down_500ms = 120 * g_eeprom.tx_timeout_timer; // minutes else g_tx_timer_count_down_500ms = 120 * 15; // 15 minutes diff --git a/ui/main.c b/ui/main.c index e23a561..4366799 100644 --- a/ui/main.c +++ b/ui/main.c @@ -91,7 +91,7 @@ void draw_bar(uint8_t *line, const int len, const int max_width) if (g_eeprom.tx_timeout_timer == 0) timeout_secs = 30; // 30 sec else - if (g_eeprom.tx_timeout_timer < (ARRAY_SIZE(g_sub_menu_TOT) - 1)) + if (g_eeprom.tx_timeout_timer < (ARRAY_SIZE(g_sub_MENU_TX_TO) - 1)) timeout_secs = 60 * g_eeprom.tx_timeout_timer; // minutes else timeout_secs = 60 * 15; // 15 minutes diff --git a/ui/menu.c b/ui/menu.c index 64fb552..a9f2526 100644 --- a/ui/menu.c +++ b/ui/menu.c @@ -46,112 +46,121 @@ const t_menu_item g_menu_list[] = { // text, voice ID, menu ID - {"SQL", VOICE_ID_SQUELCH, MENU_SQL }, - {"STEP", VOICE_ID_FREQUENCY_STEP, MENU_STEP }, - {"W/N", VOICE_ID_CHANNEL_BANDWIDTH, MENU_W_N }, - {"Tx PWR", VOICE_ID_POWER, MENU_TXP }, // was "TXP" - {"Rx DCS", VOICE_ID_DCS, MENU_R_DCS }, // was "R_DCS" - {"Rx CTS", VOICE_ID_CTCSS, MENU_R_CTCS }, // was "R_CTCS" - {"Tx DCS", VOICE_ID_DCS, MENU_T_DCS }, // was "T_DCS" - {"Tx CTS", VOICE_ID_CTCSS, MENU_T_CTCS }, // was "T_CTCS" - {"Tx DIR", VOICE_ID_TX_OFFSET_FREQ_DIR, MENU_SFT_D }, // was "SFT_D" - {"Tx OFS", VOICE_ID_TX_OFFSET_FREQ, MENU_OFFSET }, // was "OFFSET" - {"Tx TO", VOICE_ID_TRANSMIT_OVER_TIME, MENU_TOT }, // was "TOT" - {"Tx VFO", VOICE_ID_INVALID, MENU_XB }, // was "WX" - {"Dual W", VOICE_ID_DUAL_STANDBY, MENU_TDR }, // was "TDR" - {"S HOLD", VOICE_ID_INVALID, MENU_SCAN_HOLD }, - {"SCRAM", VOICE_ID_SCRAMBLER_ON, MENU_SCR }, // was "SCR" - {"BCL", VOICE_ID_BUSY_LOCKOUT, MENU_BCL }, - {"CH SAV", VOICE_ID_MEMORY_CHANNEL, MENU_MEM_CH }, // was "MEM-CH" - {"CH NAM", VOICE_ID_INVALID, MENU_MEM_NAME }, - {"CH DEL", VOICE_ID_DELETE_CHANNEL, MENU_DEL_CH }, // was "DEL-CH" - {"CH DIS", VOICE_ID_INVALID, MENU_MDF }, // was "MDF" - {"BatSAV", VOICE_ID_SAVE_MODE, MENU_SAVE }, // was "SAVE" + {"SQL", VOICE_ID_SQUELCH, MENU_SQL }, + {"STEP", VOICE_ID_FREQUENCY_STEP, MENU_STEP }, + {"W/N", VOICE_ID_CHANNEL_BANDWIDTH, MENU_BANDWIDTH }, + {"Tx PWR", VOICE_ID_POWER, MENU_TX_POWER }, // was "TXP" + {"Rx DCS", VOICE_ID_DCS, MENU_RX_CDCSS }, // was "R_DCS" + {"Rx CTS", VOICE_ID_CTCSS, MENU_RX_CTCSS }, // was "R_CTCS" + {"Tx DCS", VOICE_ID_DCS, MENU_TX_CDCSS }, // was "T_DCS" + {"Tx CTS", VOICE_ID_CTCSS, MENU_TX_CTCSS }, // was "T_CTCS" + {"Tx DIR", VOICE_ID_TX_OFFSET_FREQ_DIR, MENU_SHIFT_DIR }, // was "SFT_D" + {"Tx OFS", VOICE_ID_TX_OFFSET_FREQ, MENU_OFFSET }, // was "OFFSET" + {"Tx TO", VOICE_ID_TRANSMIT_OVER_TIME, MENU_TX_TO }, // was "TOT" + {"Tx VFO", VOICE_ID_INVALID, MENU_CROSS_VFO }, // was "WX" + {"Dual W", VOICE_ID_DUAL_STANDBY, MENU_DUAL_WATCH }, // was "TDR" + {"S HOLD", VOICE_ID_INVALID, MENU_SCAN_HOLD }, + {"SCRAM", VOICE_ID_SCRAMBLER_ON, MENU_SCRAMBLER }, // was "SCR" + {"BCL", VOICE_ID_BUSY_LOCKOUT, MENU_BUSY_CHAN_LOCK }, + {"CH SAV", VOICE_ID_MEMORY_CHANNEL, MENU_MEM_SAVE }, // was "MEM-CH" + {"CH NAM", VOICE_ID_INVALID, MENU_MEM_NAME }, + {"CH DEL", VOICE_ID_DELETE_CHANNEL, MENU_MEM_DEL }, // was "DEL-CH" + {"CH DIS", VOICE_ID_INVALID, MENU_MEM_DISP }, // was "MDF" + {"BatSAV", VOICE_ID_SAVE_MODE, MENU_BAT_SAVE }, // was "SAVE" #ifdef ENABLE_VOX - {"VOX", VOICE_ID_VOX, MENU_VOX }, + {"VOX", VOICE_ID_VOX, MENU_VOX }, #endif - {"BL ", VOICE_ID_INVALID, MENU_ABR }, // was "ABR" - {"BL TRX", VOICE_ID_INVALID, MENU_ABR_ON_TX_RX }, - {"CTRAST", VOICE_ID_INVALID, MENU_CONTRAST }, - {"BEEP", VOICE_ID_BEEP_PROMPT, MENU_BEEP }, -#ifdef ENABLE_VOICE - {"VOICE", VOICE_ID_VOICE_PROMPT, MENU_VOICE }, + {"BL ", VOICE_ID_INVALID, MENU_AUTO_BACKLITE }, // was "ABR" + {"BL TRX", VOICE_ID_INVALID, MENU_AUTO_BACKLITE_ON_TX_RX}, + {"CTRAST", VOICE_ID_INVALID, MENU_CONTRAST }, + {"BEEP", VOICE_ID_BEEP_PROMPT, MENU_BEEP }, +#ifdef ENABLE_VOICE + {"VOICE", VOICE_ID_VOICE_PROMPT, MENU_VOICE }, #endif - {"SC REV", VOICE_ID_INVALID, MENU_SC_REV }, // was "SC_REV" - {"KeyLOC", VOICE_ID_INVALID, MENU_AUTOLK }, // was "AUTOLk" - {"S ADD1", VOICE_ID_INVALID, MENU_S_ADD1 }, - {"S ADD2", VOICE_ID_INVALID, MENU_S_ADD2 }, - {"STE", VOICE_ID_INVALID, MENU_STE }, - {"RP STE", VOICE_ID_INVALID, MENU_RP_STE }, - {"MIC GN", VOICE_ID_INVALID, MENU_MIC }, - {"COMPND", VOICE_ID_INVALID, MENU_COMPAND }, -#ifdef ENABLE_AUDIO_BAR - {"Tx BAR", VOICE_ID_INVALID, MENU_TX_BAR }, -#endif -#ifdef ENABLE_RSSI_BAR - {"Rx BAR", VOICE_ID_INVALID, MENU_RX_BAR }, -#endif - {"1 CALL", VOICE_ID_INVALID, MENU_1_CALL }, - {"SLIST", VOICE_ID_INVALID, MENU_S_LIST }, - {"SLIST1", VOICE_ID_INVALID, MENU_SLIST1 }, - {"SLIST2", VOICE_ID_INVALID, MENU_SLIST2 }, + {"SC REV", VOICE_ID_INVALID, MENU_SCAN_CAR_RESUME }, // was "SC_REV" + {"KeyLOC", VOICE_ID_INVALID, MENU_AUTO_KEY_LOCK }, // was "AUTOLk" + {"S ADD1", VOICE_ID_INVALID, MENU_S_ADD1 }, + {"S ADD2", VOICE_ID_INVALID, MENU_S_ADD2 }, + {"STE", VOICE_ID_INVALID, MENU_STE }, + {"RP STE", VOICE_ID_INVALID, MENU_RP_STE }, + {"MIC GN", VOICE_ID_INVALID, MENU_MIC_GAIN }, + {"COMPND", VOICE_ID_INVALID, MENU_COMPAND }, +#ifdef ENABLE_AUDIO_BAR + {"Tx BAR", VOICE_ID_INVALID, MENU_TX_BAR }, +#endif +#ifdef ENABLE_RSSI_BAR + {"Rx BAR", VOICE_ID_INVALID, MENU_RX_BAR }, +#endif + {"1 CALL", VOICE_ID_INVALID, MENU_1_CALL }, + {"SLIST", VOICE_ID_INVALID, MENU_S_LIST }, + {"SLIST1", VOICE_ID_INVALID, MENU_SLIST1 }, + {"SLIST2", VOICE_ID_INVALID, MENU_SLIST2 }, #ifdef ENABLE_ALARM - {"SOS AL", VOICE_ID_INVALID, MENU_AL_MOD }, // was "ALMODE" -#endif - {"ANI ID", VOICE_ID_ANI_CODE, MENU_ANI_ID }, - {"UpCODE", VOICE_ID_INVALID, MENU_UPCODE }, - {"DnCODE", VOICE_ID_INVALID, MENU_DWCODE }, // was "DWCODE" - {"PTT ID", VOICE_ID_INVALID, MENU_PTT_ID }, - {"D ST", VOICE_ID_INVALID, MENU_D_ST }, - {"D RSP", VOICE_ID_INVALID, MENU_D_RSP }, - {"D HOLD", VOICE_ID_INVALID, MENU_D_HOLD }, - {"D PRE", VOICE_ID_INVALID, MENU_D_PRE }, - {"D DCD", VOICE_ID_INVALID, MENU_D_DCD }, - {"D LIST", VOICE_ID_INVALID, MENU_D_LIST }, - {"D LIVE", VOICE_ID_INVALID, MENU_D_LIVE_DEC }, // live DTMF decoder - {"PonMSG", VOICE_ID_INVALID, MENU_PONMSG }, - {"ROGER", VOICE_ID_INVALID, MENU_ROGER }, - {"BatVOL", VOICE_ID_INVALID, MENU_VOL }, // was "VOL" - {"BatTXT", VOICE_ID_INVALID, MENU_BAT_TXT }, - {"MODE", VOICE_ID_INVALID, MENU_AM }, // was "AM" -#ifdef ENABLE_AM_FIX - {"AM FIX", VOICE_ID_INVALID, MENU_AM_FIX }, -#endif -#ifdef ENABLE_AM_FIX_TEST1 - {"AM FT1", VOICE_ID_INVALID, MENU_AM_FIX_TEST1 }, -#endif -#ifdef ENABLE_NOAA - {"NOAA-S", VOICE_ID_INVALID, MENU_NOAA_S }, -#endif - {"Side1S", VOICE_ID_INVALID, MENU_SIDE1_SHORT }, - {"Side1L", VOICE_ID_INVALID, MENU_SIDE1_LONG }, - {"Side2S", VOICE_ID_INVALID, MENU_SIDE2_SHORT }, - {"Side2L", VOICE_ID_INVALID, MENU_SIDE2_LONG }, - {"VER", VOICE_ID_INVALID, MENU_VERSION }, - {"RESET", VOICE_ID_INITIALISATION, MENU_RESET }, // might be better to move this to the hidden menu items ? + {"SOS AL", VOICE_ID_INVALID, MENU_ALARM_MODE }, // was "ALMODE" +#endif + {"ANI ID", VOICE_ID_ANI_CODE, MENU_ANI_ID }, + {"UpCODE", VOICE_ID_INVALID, MENU_UP_CODE }, + {"DnCODE", VOICE_ID_INVALID, MENU_DN_CODE }, // was "DWCODE" + {"PTT ID", VOICE_ID_INVALID, MENU_PTT_ID }, + {"D ST", VOICE_ID_INVALID, MENU_DTMF_ST }, + {"D RSP", VOICE_ID_INVALID, MENU_DTMF_RSP }, + {"D HOLD", VOICE_ID_INVALID, MENU_DTMF_HOLD }, + {"D PRE", VOICE_ID_INVALID, MENU_DTMF_PRE }, + {"D DCD", VOICE_ID_INVALID, MENU_DTMF_DCD }, + {"D LIST", VOICE_ID_INVALID, MENU_DTMF_LIST }, + {"D LIVE", VOICE_ID_INVALID, MENU_DTMF_LIVE_DEC }, // live DTMF decoder + {"PonMSG", VOICE_ID_INVALID, MENU_PON_MSG }, + {"ROGER", VOICE_ID_INVALID, MENU_ROGER_MODE }, + {"BatVOL", VOICE_ID_INVALID, MENU_VOLTAGE }, // was "VOL" + {"BatTXT", VOICE_ID_INVALID, MENU_BAT_TXT }, + {"MODE", VOICE_ID_INVALID, MENU_MOD_MODE }, // was "AM" +#ifdef ENABLE_AM_FIX + {"AM FIX", VOICE_ID_INVALID, MENU_AM_FIX }, +#endif +#ifdef ENABLE_AM_FIX_TEST1 + {"AM FT1", VOICE_ID_INVALID, MENU_AM_FIX_TEST1 }, +#endif +#ifdef ENABLE_NOAA + {"NOAA-S", VOICE_ID_INVALID, MENU_NOAA_SCAN }, +#endif + {"Side1S", VOICE_ID_INVALID, MENU_SIDE1_SHORT }, + {"Side1L", VOICE_ID_INVALID, MENU_SIDE1_LONG }, + {"Side2S", VOICE_ID_INVALID, MENU_SIDE2_SHORT }, + {"Side2L", VOICE_ID_INVALID, MENU_SIDE2_LONG }, + {"VER", VOICE_ID_INVALID, MENU_VERSION }, + {"RESET", VOICE_ID_INITIALISATION, MENU_RESET }, // might be better to move this to the hidden menu items ? + // ************************************ + // ************************************ + // ************************************ // hidden menu items from here on // enabled by pressing both the PTT and upper side button at power-on - {"F LOCK", VOICE_ID_INVALID, MENU_FREQ_LOCK }, // country/area specific - {"Tx 174", VOICE_ID_INVALID, MENU_174TX }, // was "200TX" - {"Tx 350", VOICE_ID_INVALID, MENU_350TX }, // was "350TX" - {"Tx 470", VOICE_ID_INVALID, MENU_470TX }, // was "500TX" - {"350 EN", VOICE_ID_INVALID, MENU_350EN }, // was "350EN" - {"SCR EN", VOICE_ID_INVALID, MENU_SCREN }, // was "SCREN" - {"Tx EN", VOICE_ID_INVALID, MENU_TX_EN }, // enable TX -#ifdef ENABLE_F_CAL_MENU - {"F CAL", VOICE_ID_INVALID, MENU_F_CALI }, // reference xtal calibration -#endif - {"BatCAL", VOICE_ID_INVALID, MENU_BATCAL }, // battery voltage calibration + {"BatCAL", VOICE_ID_INVALID, MENU_BAT_CAL }, // battery voltage calibration + +#ifdef ENABLE_F_CAL_MENU + {"F CAL", VOICE_ID_INVALID, MENU_F_CALI }, // reference xtal calibration +#endif + + {"F LOCK", VOICE_ID_INVALID, MENU_FREQ_LOCK }, // country/area specific + {"Tx 174", VOICE_ID_INVALID, MENU_174_TX }, // was "200TX" + {"Tx 350", VOICE_ID_INVALID, MENU_350_TX }, // was "350TX" + {"Tx 470", VOICE_ID_INVALID, MENU_470_TX }, // was "500TX" + {"350 EN", VOICE_ID_INVALID, MENU_350_EN }, // was "350EN" + {"SCR EN", VOICE_ID_INVALID, MENU_SCRAMBLER_EN }, // was "SCREN" + {"Tx EN", VOICE_ID_INVALID, MENU_TX_EN }, // enable TX + + // ************************************ + // ************************************ + // ************************************ }; -// number of hidden menu items at the end of the list - KEEP THIS UP-TO-DATE +// number of hidden menu items at the end of the list - KEEP THIS CORRECT const unsigned int g_hidden_menu_count = 9; // *************************************************************************************** -const char g_sub_menu_txp[3][5] = +const char g_sub_MENU_TX_POWER[3][5] = { "LOW", "MID", @@ -165,7 +174,7 @@ const char g_sub_menu_shift_dir[3][4] = "-" }; -const char g_sub_menu_w_n[2][7] = +const char g_sub_MENU_BANDWIDTH[2][7] = { "WIDE", "NARROW" @@ -177,7 +186,7 @@ const char g_sub_menu_off_on[2][4] = "ON" }; -const char g_sub_menu_SAVE[5][9] = +const char g_sub_MENU_BAT_SAVE[5][9] = { "OFF", "1:1 50%", @@ -186,7 +195,7 @@ const char g_sub_menu_SAVE[5][9] = "1:4 80%" }; -const char g_sub_menu_TOT[11][7] = +const char g_sub_MENU_TX_TO[11][7] = { "30 sec", "1 min", @@ -201,14 +210,14 @@ const char g_sub_menu_TOT[11][7] = "15 min" }; -const char g_sub_menu_tdr[3][10] = +const char g_sub_MENU_DUAL_WATCH[3][10] = { "OFF", "LOWER\nVFO", "UPPER\nVFO", }; -const char g_sub_menu_xb[3][10] = +const char g_sub_MENU_CROSS_VFO[3][10] = { "RX\nVFO", "UPPER\nVFO", @@ -224,14 +233,14 @@ const char g_sub_menu_xb[3][10] = }; #endif -const char g_sub_menu_sc_rev[3][13] = +const char g_sub_MENU_SCAN_CAR_RESUME[3][13] = { "TIME", "CARRIER", "SEARCH" }; -const char g_sub_menu_mdf[4][15] = +const char g_sub_MENU_MEM_DISP[4][15] = { "FREQ", "CHANNEL\nNUMBER", @@ -240,14 +249,14 @@ const char g_sub_menu_mdf[4][15] = }; #ifdef ENABLE_ALARM - const char g_sub_menu_AL_MOD[2][5] = + const char g_sub_MENU_ALARM_MODE[2][5] = { "SITE", "TONE" }; #endif -const char g_sub_menu_D_RSP[4][9] = +const char g_sub_MENU_DTMF_RSP[4][9] = { "NONE", "RING", @@ -272,7 +281,7 @@ const char g_sub_menu_pwr_on_msg[4][14] = "NONE" }; -const char g_sub_menu_roger_mode[3][16] = +const char g_sub_MENU_ROGER_MODE_mode[3][16] = { "OFF", "TX END\nROGER", @@ -329,7 +338,7 @@ const char g_sub_menu_rx_tx[4][6] = }; #ifdef ENABLE_AM_FIX_TEST1 - const char g_sub_menu_AM_fix_test1[4][8] = + const char g_sub_MENU_AM_FIX_test1[4][8] = { "LNA-S 0", "LNA-S 1", @@ -351,7 +360,7 @@ const char g_sub_menu_DIS_EN[2][9] = "ENABLED" }; -const char g_sub_menu_SCRAMBLER[11][7] = +const char g_sub_MENU_SCRAMBLERAMBLER[11][7] = { "OFF", "2600Hz", @@ -387,7 +396,7 @@ uint8_t g_menu_list_sorted[ARRAY_SIZE(g_menu_list)]; bool g_is_in_sub_menu; uint8_t g_menu_cursor; -int8_t g_menu_scroll_direction; +int8_t g_MENU_SCRAMBLERoll_direction; int32_t g_sub_menu_selection; // edit box @@ -397,6 +406,24 @@ int g_edit_index; // *************************************************************************************** +void sort_list(const unsigned int start, const unsigned int length) +{ + const unsigned int end = start + length; + unsigned int i; + for (i = start; i < end; i++) + { + unsigned int k; + for (k = 0; k < end; k++) + { + if (g_menu_list[k].menu_id == i) + { + g_menu_list_sorted[i] = k; + break; + } + } + } +} + void UI_SortMenu(const bool hide_hidden) { // sort the menu order according to the MENU-ID value (enum list in id/menu.h) @@ -404,7 +431,7 @@ void UI_SortMenu(const bool hide_hidden) // this means the menu order is entirely determined by the enum list (found in id/menu.h) // it now no longer depends on the order of entries in the above const list (they can be any order) - unsigned int i; +// unsigned int i; unsigned int hidden_menu_count = g_hidden_menu_count; @@ -412,30 +439,17 @@ void UI_SortMenu(const bool hide_hidden) hidden_menu_count--; #endif - g_menu_list_count = ARRAY_SIZE(g_menu_list_sorted); + g_menu_list_count = ARRAY_SIZE(g_menu_list); - for (i = 0; i < g_menu_list_count; i++) - g_menu_list_sorted[i] = g_menu_list[i].menu_id; + // linear index array +// for (i = 0; i < ARRAY_SIZE(g_menu_list_sorted); i++) +// g_menu_list_sorted[i] = i; - // don't sort the hidden entries at the end, keep them at the end of the list + // sort non-hidden entries at the beginning + sort_list(0, g_menu_list_count - hidden_menu_count); - for (i = 0; i < (g_menu_list_count - hidden_menu_count - 1); i++) - { - unsigned int k; - unsigned int menu_id1 = g_menu_list_sorted[i]; - for (k = i + 1; k < (g_menu_list_count - hidden_menu_count); k++) - { - unsigned int menu_id2 = g_menu_list_sorted[k]; - if (menu_id2 < menu_id1) - { // swap - const unsigned int id = menu_id1; - menu_id1 = menu_id2; - menu_id2 = id; - g_menu_list_sorted[i] = menu_id1; - g_menu_list_sorted[k] = menu_id2; - } - } - } + // sort the hidden entries at the end + sort_list(g_menu_list_count - hidden_menu_count, hidden_menu_count); if (hide_hidden) g_menu_list_count -= hidden_menu_count; // hide the hidden menu items @@ -523,9 +537,7 @@ void UI_DisplayMenu(void) if (menu_index >= 0 && menu_index < (int)g_menu_list_count) { // current menu item strcpy(String, g_menu_list[g_menu_list_sorted[menu_index]].name); -// strcat(String, ":"); UI_PrintString(String, 0, 0, 0, 8); -// UI_PrintStringSmall(String, 0, 0, 0); } } #endif @@ -545,7 +557,7 @@ void UI_DisplayMenu(void) sprintf(String, "%d", g_sub_menu_selection); break; - case MENU_MIC: + case MENU_MIC_GAIN: { // display the mic gain in actual dB rather than just an index number const uint8_t mic = g_mic_gain_dB_2[g_sub_menu_selection]; sprintf(String, "+%u.%01udB", mic / 2, mic % 2); @@ -556,12 +568,12 @@ void UI_DisplayMenu(void) sprintf(String, "%d.%02ukHz", STEP_FREQ_TABLE[g_sub_menu_selection] / 100, STEP_FREQ_TABLE[g_sub_menu_selection] % 100); break; - case MENU_TXP: - strcpy(String, g_sub_menu_txp[g_sub_menu_selection]); + case MENU_TX_POWER: + strcpy(String, g_sub_MENU_TX_POWER[g_sub_menu_selection]); break; - case MENU_R_DCS: - case MENU_T_DCS: + case MENU_RX_CDCSS: + case MENU_TX_CDCSS: strcpy(String, "CDCSS\n"); if (g_sub_menu_selection == 0) strcat(String, "OFF"); @@ -572,14 +584,14 @@ void UI_DisplayMenu(void) sprintf(String + strlen(String), "D%03oI", DCS_OPTIONS[g_sub_menu_selection - 105]); break; - case MENU_R_CTCS: - case MENU_T_CTCS: + case MENU_RX_CTCSS: + case MENU_TX_CTCSS: { strcpy(String, "CTCSS\n"); #if 1 // set CTCSS as the user adjusts it unsigned int Code; - freq_config_t *pConfig = (g_menu_cursor == MENU_R_CTCS) ? &g_tx_vfo->freq_config_rx : &g_tx_vfo->freq_config_tx; + freq_config_t *pConfig = (g_menu_cursor == MENU_RX_CTCSS) ? &g_tx_vfo->freq_config_rx : &g_tx_vfo->freq_config_tx; if (g_sub_menu_selection == 0) { strcat(String, "OFF"); @@ -613,7 +625,7 @@ void UI_DisplayMenu(void) break; } - case MENU_SFT_D: + case MENU_SHIFT_DIR: strcpy(String, g_sub_menu_shift_dir[g_sub_menu_selection]); break; @@ -643,13 +655,13 @@ void UI_DisplayMenu(void) already_printed = true; break; - case MENU_W_N: - strcpy(String, g_sub_menu_w_n[g_sub_menu_selection]); + case MENU_BANDWIDTH: + strcpy(String, g_sub_MENU_BANDWIDTH[g_sub_menu_selection]); break; - case MENU_SCR: + case MENU_SCRAMBLER: strcpy(String, "INVERT\n"); - strcat(String, g_sub_menu_SCRAMBLER[g_sub_menu_selection]); + strcat(String, g_sub_MENU_SCRAMBLERAMBLER[g_sub_menu_selection]); #if 1 if (g_sub_menu_selection > 0 && g_setting_scramble_enable) @@ -668,28 +680,28 @@ void UI_DisplayMenu(void) break; #endif - case MENU_ABR: + case MENU_AUTO_BACKLITE: strcpy(String, "BACKLITE\n"); strcat(String, g_sub_menu_backlight[g_sub_menu_selection]); break; - case MENU_ABR_ON_TX_RX: + case MENU_AUTO_BACKLITE_ON_TX_RX: strcpy(String, "BACKLITE\n"); strcat(String, g_sub_menu_rx_tx[g_sub_menu_selection]); break; - case MENU_AM: + case MENU_MOD_MODE: strcpy(String, (g_sub_menu_selection == 0) ? "FM" : "AM"); break; #ifdef ENABLE_AM_FIX_TEST1 case MENU_AM_FIX_TEST1: - strcpy(String, g_sub_menu_AM_fix_test1[g_sub_menu_selection]); + strcpy(String, g_sub_MENU_AM_FIX_test1[g_sub_menu_selection]); // g_setting_am_fix = g_sub_menu_selection; break; #endif - case MENU_AUTOLK: + case MENU_AUTO_KEY_LOCK: if (g_sub_menu_selection == 0) strcpy(String, "OFF"); else @@ -722,13 +734,13 @@ void UI_DisplayMenu(void) strcpy(String, g_sub_menu_off_on[g_sub_menu_selection]); break; - case MENU_BCL: + case MENU_BUSY_CHAN_LOCK: strcpy(String, "BSY CH TX\nLOCKOUT\n"); strcat(String, g_sub_menu_off_on[g_sub_menu_selection]); break; - case MENU_D_DCD: - case MENU_D_LIVE_DEC: + case MENU_DTMF_DCD: + case MENU_DTMF_LIVE_DEC: strcpy(String, "DTMF\nDECODE\n"); strcat(String, g_sub_menu_off_on[g_sub_menu_selection]); break; @@ -743,39 +755,39 @@ void UI_DisplayMenu(void) strcat(String + strlen(String), g_sub_menu_off_on[g_sub_menu_selection]); break; - case MENU_D_ST: + case MENU_DTMF_ST: strcpy(String, "DTMF\nSIDETONE\n"); strcat(String, g_sub_menu_off_on[g_sub_menu_selection]); break; #ifdef ENABLE_NOAA - case MENU_NOAA_S: + case MENU_NOAA_SCAN: strcpy(String, "SCAN\n"); strcat(String, g_sub_menu_DIS_EN[g_sub_menu_selection]); break; #endif - case MENU_350TX: + case MENU_350_EN: strcpy(String, "350 ~ 400\n"); strcat(String, g_sub_menu_DIS_EN[g_sub_menu_selection]); break; - case MENU_174TX: - strcpy(String, "174 ~ 350\n"); + case MENU_350_TX: + strcpy(String, "TX\n350 ~ 400\n"); strcat(String, g_sub_menu_DIS_EN[g_sub_menu_selection]); break; - case MENU_470TX: - strcpy(String, "470 ~ 600\n"); + case MENU_174_TX: + strcpy(String, "TX\n174 ~ 350\n"); strcat(String, g_sub_menu_DIS_EN[g_sub_menu_selection]); break; - case MENU_350EN: - strcpy(String, "350 ~ 400\n"); + case MENU_470_TX: + strcpy(String, "TX\n470 ~ 600\n"); strcat(String, g_sub_menu_DIS_EN[g_sub_menu_selection]); break; - case MENU_SCREN: + case MENU_SCRAMBLER_EN: strcpy(String, "SCRAMBLER\n"); strcat(String, g_sub_menu_DIS_EN[g_sub_menu_selection]); break; @@ -785,9 +797,9 @@ void UI_DisplayMenu(void) strcat(String, g_sub_menu_DIS_EN[g_sub_menu_selection]); break; - case MENU_MEM_CH: + case MENU_MEM_SAVE: case MENU_1_CALL: - case MENU_DEL_CH: + case MENU_MEM_DEL: { char s[11]; const bool valid = RADIO_CheckValidChannel(g_sub_menu_selection, false, 0); @@ -848,12 +860,12 @@ void UI_DisplayMenu(void) break; } - case MENU_SAVE: - strcpy(String, g_sub_menu_SAVE[g_sub_menu_selection]); + case MENU_BAT_SAVE: + strcpy(String, g_sub_MENU_BAT_SAVE[g_sub_menu_selection]); break; - case MENU_TDR: -// strcpy(String, g_sub_menu_tdr[g_sub_menu_selection]); + case MENU_DUAL_WATCH: +// strcpy(String, g_sub_MENU_DUAL_WATCH[g_sub_menu_selection]); strcpy(String, g_sub_menu_off_on[g_sub_menu_selection]); break; @@ -862,12 +874,12 @@ void UI_DisplayMenu(void) sprintf(String + strlen(String), "%d.%d sec", g_sub_menu_selection / 2, 5 * (g_sub_menu_selection % 2)); break; - case MENU_XB: - strcpy(String, g_sub_menu_xb[g_sub_menu_selection]); + case MENU_CROSS_VFO: + strcpy(String, g_sub_MENU_CROSS_VFO[g_sub_menu_selection]); break; - case MENU_TOT: - strcpy(String, g_sub_menu_TOT[g_sub_menu_selection]); + case MENU_TX_TO: + strcpy(String, g_sub_MENU_TX_TO[g_sub_menu_selection]); break; #ifdef ENABLE_VOICE @@ -876,13 +888,13 @@ void UI_DisplayMenu(void) break; #endif - case MENU_SC_REV: + case MENU_SCAN_CAR_RESUME: strcpy(String, "SCAN\nRESUME\n"); - strcat(String, g_sub_menu_sc_rev[g_sub_menu_selection]); + strcat(String, g_sub_MENU_SCAN_CAR_RESUME[g_sub_menu_selection]); break; - case MENU_MDF: - strcpy(String, g_sub_menu_mdf[g_sub_menu_selection]); + case MENU_MEM_DISP: + strcpy(String, g_sub_MENU_MEM_DISP[g_sub_menu_selection]); break; case MENU_RP_STE: @@ -900,9 +912,9 @@ void UI_DisplayMenu(void) break; #ifdef ENABLE_ALARM - case MENU_AL_MOD: + case MENU_ALARM_MODE: strcpy(String, "TX ALARM\n"); - sprintf(String + strlen(String), g_sub_menu_AL_MOD[g_sub_menu_selection]); + sprintf(String + strlen(String), g_sub_MENU_ALARM_MODE[g_sub_menu_selection]); break; #endif @@ -911,22 +923,22 @@ void UI_DisplayMenu(void) strcat(String, g_eeprom.ani_dtmf_id); break; - case MENU_UPCODE: + case MENU_UP_CODE: strcpy(String, "PTT DTMF\nBEGIN\n"); strcat(String, g_eeprom.dtmf_key_up_code); break; - case MENU_DWCODE: + case MENU_DN_CODE: strcpy(String, "PTT DTMF\nEND\n"); strcat(String, g_eeprom.dtmf_key_down_code); break; - case MENU_D_RSP: + case MENU_DTMF_RSP: strcpy(String, "DTMF\nRESPONSE\n"); - strcat(String, g_sub_menu_D_RSP[g_sub_menu_selection]); + strcat(String, g_sub_MENU_DTMF_RSP[g_sub_menu_selection]); break; - case MENU_D_HOLD: + case MENU_DTMF_HOLD: // only allow 5, 10, 20, 30, 40, 50 or "STAY ON SCREEN" (60) switch (g_sub_menu_selection) { @@ -954,7 +966,7 @@ void UI_DisplayMenu(void) break; - case MENU_D_PRE: + case MENU_DTMF_PRE: strcpy(String, "TX DTMF\nDELAY\n"); // sprintf(String + strlen(String), "%d*10ms", g_sub_menu_selection); sprintf(String + strlen(String), "%dms", 10 * g_sub_menu_selection); @@ -969,7 +981,7 @@ void UI_DisplayMenu(void) strcpy(String, g_sub_menu_BAT_TXT[g_sub_menu_selection]); break; - case MENU_D_LIST: + case MENU_DTMF_LIST: g_dtmf_is_contact_valid = DTMF_GetContact((int)g_sub_menu_selection - 1, Contact); strcpy(String, "DTMF\n"); if (!g_dtmf_is_contact_valid) @@ -985,15 +997,15 @@ void UI_DisplayMenu(void) } break; - case MENU_PONMSG: + case MENU_PON_MSG: strcpy(String, g_sub_menu_pwr_on_msg[g_sub_menu_selection]); break; - case MENU_ROGER: - strcpy(String, g_sub_menu_roger_mode[g_sub_menu_selection]); + case MENU_ROGER_MODE: + strcpy(String, g_sub_MENU_ROGER_MODE_mode[g_sub_menu_selection]); break; - case MENU_VOL: + case MENU_VOLTAGE: sprintf(String, "%u.%02uV\n%u%%\ncurr %u", g_battery_voltage_average / 100, g_battery_voltage_average % 100, BATTERY_VoltsToPercent(g_battery_voltage_average), @@ -1050,7 +1062,10 @@ void UI_DisplayMenu(void) break; case MENU_FREQ_LOCK: - strcpy(String, g_sub_menu_freq_lock[g_sub_menu_selection]); + if (g_sub_menu_selection == 0) + strcpy(String, "136 ~ 174\n400 ~ 470\n+ other\noptions"); + else + strcpy(String, g_sub_menu_freq_lock[g_sub_menu_selection]); break; #ifdef ENABLE_F_CAL_MENU @@ -1068,7 +1083,7 @@ void UI_DisplayMenu(void) break; #endif - case MENU_BATCAL: + case MENU_BAT_CAL: { const uint16_t vol = (uint32_t)g_battery_voltage_average * g_battery_calibration[3] / g_sub_menu_selection; sprintf(String, "%u.%02uV\n%u", vol / 100, vol % 100, g_sub_menu_selection); @@ -1179,33 +1194,33 @@ void UI_DisplayMenu(void) } } - if ((g_menu_cursor == MENU_R_CTCS || g_menu_cursor == MENU_R_DCS) && g_css_scan_mode != CSS_SCAN_MODE_OFF) + if ((g_menu_cursor == MENU_RX_CTCSS || g_menu_cursor == MENU_RX_CDCSS) && g_css_scan_mode != CSS_SCAN_MODE_OFF) UI_PrintString("SCAN", menu_item_x1, menu_item_x2, 4, 8); - if (g_menu_cursor == MENU_UPCODE) + if (g_menu_cursor == MENU_UP_CODE) if (strlen(g_eeprom.dtmf_key_up_code) > 8) UI_PrintString(g_eeprom.dtmf_key_up_code + 8, menu_item_x1, menu_item_x2, 4, 8); - if (g_menu_cursor == MENU_DWCODE) + if (g_menu_cursor == MENU_DN_CODE) if (strlen(g_eeprom.dtmf_key_down_code) > 8) UI_PrintString(g_eeprom.dtmf_key_down_code + 8, menu_item_x1, menu_item_x2, 4, 8); - if (g_menu_cursor == MENU_R_CTCS || - g_menu_cursor == MENU_T_CTCS || - g_menu_cursor == MENU_R_DCS || - g_menu_cursor == MENU_T_DCS || - g_menu_cursor == MENU_D_LIST) + if (g_menu_cursor == MENU_RX_CTCSS || + g_menu_cursor == MENU_TX_CTCSS || + g_menu_cursor == MENU_RX_CDCSS || + g_menu_cursor == MENU_TX_CDCSS || + g_menu_cursor == MENU_DTMF_LIST) { unsigned int Offset; NUMBER_ToDigits(g_sub_menu_selection, String); - Offset = (g_menu_cursor == MENU_D_LIST) ? 2 : 3; + Offset = (g_menu_cursor == MENU_DTMF_LIST) ? 2 : 3; UI_Displaysmall_digits(Offset, String + (8 - Offset), 105, 0, false); } if ((g_menu_cursor == MENU_RESET || - g_menu_cursor == MENU_MEM_CH || + g_menu_cursor == MENU_MEM_SAVE || g_menu_cursor == MENU_MEM_NAME || - g_menu_cursor == MENU_DEL_CH) && g_ask_for_confirmation) + g_menu_cursor == MENU_MEM_DEL) && g_ask_for_confirmation) { // display confirmation strcpy(String, (g_ask_for_confirmation == 1) ? "SURE?" : "WAIT!"); UI_PrintString(String, menu_item_x1, menu_item_x2, 5, 8); diff --git a/ui/menu.h b/ui/menu.h index cc3cc7a..e410830 100644 --- a/ui/menu.h +++ b/ui/menu.h @@ -42,42 +42,42 @@ enum MENU_SQL = 0, MENU_STEP, - MENU_W_N, - MENU_TXP, - MENU_R_DCS, - MENU_R_CTCS, - MENU_T_DCS, - MENU_T_CTCS, - MENU_SFT_D, + MENU_BANDWIDTH, + MENU_TX_POWER, + MENU_RX_CDCSS, + MENU_RX_CTCSS, + MENU_TX_CDCSS, + MENU_TX_CTCSS, + MENU_SHIFT_DIR, MENU_OFFSET, - MENU_TOT, - MENU_XB, - MENU_TDR, + MENU_TX_TO, + MENU_CROSS_VFO, + MENU_DUAL_WATCH, MENU_SCAN_HOLD, - MENU_SCR, - MENU_BCL, - MENU_MEM_CH, + MENU_SCRAMBLER, + MENU_BUSY_CHAN_LOCK, + MENU_MEM_SAVE, MENU_MEM_NAME, - MENU_DEL_CH, - MENU_MDF, - MENU_SAVE, + MENU_MEM_DEL, + MENU_MEM_DISP, + MENU_BAT_SAVE, #ifdef ENABLE_VOX MENU_VOX, #endif - MENU_ABR, - MENU_ABR_ON_TX_RX, + MENU_AUTO_BACKLITE, + MENU_AUTO_BACKLITE_ON_TX_RX, MENU_CONTRAST, MENU_BEEP, #ifdef ENABLE_VOICE MENU_VOICE, #endif - MENU_SC_REV, - MENU_AUTOLK, + MENU_SCAN_CAR_RESUME, + MENU_AUTO_KEY_LOCK, MENU_S_ADD1, MENU_S_ADD2, MENU_STE, MENU_RP_STE, - MENU_MIC, + MENU_MIC_GAIN, MENU_COMPAND, #ifdef ENABLE_AUDIO_BAR MENU_TX_BAR, @@ -90,24 +90,24 @@ enum MENU_SLIST1, MENU_SLIST2, #ifdef ENABLE_ALARM - MENU_AL_MOD, + MENU_ALARM_MODE, #endif MENU_ANI_ID, - MENU_UPCODE, - MENU_DWCODE, + MENU_UP_CODE, + MENU_DN_CODE, MENU_PTT_ID, - MENU_D_ST, - MENU_D_RSP, - MENU_D_HOLD, - MENU_D_PRE, - MENU_D_DCD, - MENU_D_LIST, - MENU_D_LIVE_DEC, - MENU_PONMSG, - MENU_ROGER, - MENU_VOL, + MENU_DTMF_ST, + MENU_DTMF_RSP, + MENU_DTMF_HOLD, + MENU_DTMF_PRE, + MENU_DTMF_DCD, + MENU_DTMF_LIST, + MENU_DTMF_LIVE_DEC, + MENU_PON_MSG, + MENU_ROGER_MODE, + MENU_VOLTAGE, MENU_BAT_TXT, - MENU_AM, + MENU_MOD_MODE, #ifdef ENABLE_AM_FIX MENU_AM_FIX, #endif @@ -115,7 +115,7 @@ enum MENU_AM_FIX_TEST1, #endif #ifdef ENABLE_NOAA - MENU_NOAA_S, + MENU_NOAA_SCAN, #endif MENU_SIDE1_SHORT, MENU_SIDE1_LONG, @@ -124,50 +124,53 @@ enum MENU_VERSION, MENU_RESET, + // ************************************ + // ************************************ // ************************************ // items after here are normally hidden - MENU_FREQ_LOCK, - MENU_174TX, - MENU_350TX, - MENU_470TX, - MENU_350EN, - MENU_SCREN, - - MENU_TX_EN, // enable TX -#ifdef ENABLE_F_CAL_MENU - MENU_F_CALI, // reference xtal calibration -#endif - MENU_BATCAL, // battery voltage calibration + MENU_BAT_CAL, // battery voltage calibration +#ifdef ENABLE_F_CAL_MENU + MENU_F_CALI, // 26MHz reference xtal calibration +#endif + + MENU_SCRAMBLER_EN, // scrambler enable/disable + MENU_FREQ_LOCK, // lock to a selected region + MENU_174_TX, // 174~350MHz TX enable/disable + MENU_350_EN, // 350~400MHz enable/disable + MENU_350_TX, // 350~400MHz TX enable/disable + MENU_470_TX, // 470MHz and up TX enable/disable + MENU_TX_EN, // can disable the TX entirely + + // ************************************ + // ************************************ // ************************************ }; -extern const unsigned int g_hidden_menu_count; - extern const t_menu_item g_menu_list[]; extern uint8_t g_menu_list_sorted[]; -extern const char g_sub_menu_txp[3][5]; +extern const char g_sub_MENU_TX_POWER[3][5]; extern const char g_sub_menu_shift_dir[3][4]; -extern const char g_sub_menu_w_n[2][7]; +extern const char g_sub_MENU_BANDWIDTH[2][7]; extern const char g_sub_menu_off_on[2][4]; -extern const char g_sub_menu_SAVE[5][9]; -extern const char g_sub_menu_TOT[11][7]; -extern const char g_sub_menu_tdr[3][10]; -extern const char g_sub_menu_xb[3][10]; +extern const char g_sub_MENU_BAT_SAVE[5][9]; +extern const char g_sub_MENU_TX_TO[11][7]; +extern const char g_sub_MENU_DUAL_WATCH[3][10]; +extern const char g_sub_MENU_CROSS_VFO[3][10]; #ifdef ENABLE_VOICE extern const char g_sub_menu_voice[3][4]; #endif -extern const char g_sub_menu_sc_rev[3][13]; -extern const char g_sub_menu_mdf[4][15]; +extern const char g_sub_MENU_SCAN_CAR_RESUME[3][13]; +extern const char g_sub_MENU_MEM_DISP[4][15]; #ifdef ENABLE_ALARM - extern const char g_sub_menu_AL_MOD[2][5]; + extern const char g_sub_MENU_ALARM_MODE[2][5]; #endif -extern const char g_sub_menu_D_RSP[4][9]; +extern const char g_sub_MENU_DTMF_RSP[4][9]; extern const char g_sub_menu_PTT_ID[5][15]; extern const char g_sub_menu_pwr_on_msg[4][14]; -extern const char g_sub_menu_roger_mode[3][16]; +extern const char g_sub_MENU_ROGER_MODE_mode[3][16]; extern const char g_sub_menu_RESET[2][4]; #ifdef ENABLE_TX_UNLOCK extern const char g_sub_menu_freq_lock[7][9]; @@ -177,17 +180,17 @@ extern const char g_sub_menu_RESET[2][4]; extern const char g_sub_menu_backlight[8][7]; extern const char g_sub_menu_rx_tx[4][6]; #ifdef ENABLE_AM_FIX_TEST1 - extern const char g_sub_menu_AM_fix_test1[4][8]; + extern const char g_sub_MENU_AM_FIX_test1[4][8]; #endif extern const char g_sub_menu_BAT_TXT[3][8]; extern const char g_sub_menu_DIS_EN[2][9]; -extern const char g_sub_menu_SCRAMBLER[11][7]; +extern const char g_sub_MENU_SCRAMBLERAMBLER[11][7]; extern const char g_sub_menu_SIDE_BUTT[9][16]; extern bool g_is_in_sub_menu; extern uint8_t g_menu_cursor; -extern int8_t g_menu_scroll_direction; +extern int8_t g_MENU_SCRAMBLERoll_direction; extern int32_t g_sub_menu_selection; extern char g_edit_original[17];