From 244c4f1091e2642dcbbc635d64821bf1a4caab40 Mon Sep 17 00:00:00 2001 From: OneOfEleven Date: Mon, 16 Oct 2023 06:43:42 +0100 Subject: [PATCH] Try up/down butts with squelch off/monitor enabled --- app/action.c | 116 +++++++------ app/aircopy.c | 4 +- app/aircopy.h | 2 +- app/app.c | 413 ++++++++++++++++++++++---------------------- app/app.h | 16 +- app/dtmf.c | 10 +- app/fm.c | 2 +- app/fm.h | 2 +- app/generic.c | 4 +- app/main.c | 154 +++++++++-------- app/main.h | 2 +- app/menu.c | 46 +++-- app/menu.h | 2 +- app/search.c | 6 +- app/search.h | 2 +- app/spectrum.c | 4 +- board.c | 6 +- driver/bk4819.c | 28 ++- driver/bk4819.h | 2 +- firmware.bin | Bin 60984 -> 61208 bytes firmware.packed.bin | Bin 61002 -> 61226 bytes frequencies.c | 4 +- functions.c | 10 +- main.c | 10 +- misc.c | 10 +- misc.h | 7 +- radio.c | 147 +++++++--------- radio.h | 4 +- settings.c | 34 ++-- settings.h | 115 ++++++------ ui/main.c | 4 +- ui/main.h | 2 +- ui/menu.c | 23 ++- ui/menu.h | 4 +- ui/status.c | 15 +- 35 files changed, 623 insertions(+), 587 deletions(-) diff --git a/app/action.c b/app/action.c index e14750b..14178b0 100644 --- a/app/action.c +++ b/app/action.c @@ -76,13 +76,13 @@ void ACTION_Monitor(void) { if (g_current_function != FUNCTION_MONITOR) { // enable the monitor - RADIO_SelectVfos(); - #ifdef g_power_save_expired + RADIO_select_vfos(); + #ifdef ENABLE_NOAA if (g_rx_vfo->channel_save >= NOAA_CHANNEL_FIRST && g_is_noaa_mode) g_noaa_channel = g_rx_vfo->channel_save - NOAA_CHANNEL_FIRST; #endif - RADIO_SetupRegisters(true); - APP_StartListening(FUNCTION_MONITOR, false); + RADIO_setup_registers(true); + APP_start_listening(FUNCTION_MONITOR, false); return; } @@ -90,9 +90,9 @@ void ACTION_Monitor(void) if (g_scan_state_dir != SCAN_STATE_DIR_OFF) { - g_scan_pause_delay_in_10ms = scan_pause_delay_in_1_10ms; - g_scan_schedule_scan_listen = false; - g_scan_pause_mode = true; + g_scan_pause_delay_in_10ms = scan_pause_delay_in_1_10ms; + g_scan_schedule_scan_listen = false; + g_scan_pause_mode = true; } #ifdef g_power_save_expired @@ -103,7 +103,7 @@ void ACTION_Monitor(void) } #endif - RADIO_SetupRegisters(true); + RADIO_setup_registers(true); #ifdef ENABLE_FMRADIO if (g_fm_radio_mode) @@ -139,19 +139,18 @@ void ACTION_Scan(bool bRestart) #endif } else - { + { // start scanning uint16_t Frequency; if (bRestart) - { // going to scan and auto store what we find + { // scan with auto store FM_EraseChannels(); - g_fm_auto_scan = true; g_fm_channel_position = 0; Frequency = FM_RADIO_BAND.lower; } else - { + { // scan without auto store g_fm_auto_scan = false; g_fm_channel_position = 0; Frequency = g_eeprom.fm_frequency_playing; @@ -172,7 +171,7 @@ void ACTION_Scan(bool bRestart) #endif if (g_screen_to_display != DISPLAY_SEARCH) - { // not scanning + { // not in freq/ctcss/cdcss search mode g_monitor_enabled = false; @@ -181,69 +180,78 @@ void ACTION_Scan(bool bRestart) g_dtmf_rx_live_timeout = 0; memset(g_dtmf_rx_live, 0, sizeof(g_dtmf_rx_live)); - RADIO_SelectVfos(); + RADIO_select_vfos(); - #ifdef g_power_save_expired - if (IS_NOT_NOAA_CHANNEL(g_rx_vfo->channel_save)) - #endif + if (IS_NOT_NOAA_CHANNEL(g_rx_vfo->channel_save)) { GUI_SelectNextDisplay(DISPLAY_MAIN); if (g_scan_state_dir != SCAN_STATE_DIR_OFF) - { // already scanning + { // currently scanning if (g_scan_next_channel <= USER_CHANNEL_LAST) { // channel mode - // keep scanning but toggle between scan lists - g_eeprom.scan_list_default = (g_eeprom.scan_list_default + 1) % 3; + if (g_eeprom.scan_list_default < 2) + { // keep scanning but toggle between scan lists - // jump to the next channel - CHANNEL_Next(true, g_scan_state_dir); - g_scan_pause_delay_in_10ms = 1; - g_scan_schedule_scan_listen = false; + //g_eeprom.scan_list_default = (g_eeprom.scan_list_default + 1) % 3; + g_eeprom.scan_list_default++; - g_update_status = true; - } - else - { // stop scanning - - SCAN_Stop(); - - #ifdef ENABLE_VOICE - g_another_voice_id = VOICE_ID_SCANNING_STOP; - #endif - } - } - else - { // start scanning + // jump to the next channel + APP_channel_next(true, g_scan_state_dir); + g_scan_pause_delay_in_10ms = 1; + g_scan_schedule_scan_listen = false; - CHANNEL_Next(true, SCAN_STATE_DIR_FORWARD); + g_update_status = true; + return; + } + } + + // stop scanning + + APP_stop_scan(); #ifdef ENABLE_VOICE - AUDIO_SetVoiceID(0, VOICE_ID_SCANNING_BEGIN); - AUDIO_PlaySingleVoice(true); + g_another_voice_id = VOICE_ID_SCANNING_STOP; #endif - // clear the other vfo's rssi level (to hide the antenna symbol) - g_vfo_rssi_bar_level[(g_eeprom.rx_vfo + 1) & 1u] = 0; - - // let the user see DW is not active - g_dual_watch_active = false; - g_update_status = true; + return; } + + // start scanning + + APP_channel_next(true, SCAN_STATE_DIR_FORWARD); + + #ifdef ENABLE_VOICE + AUDIO_SetVoiceID(0, VOICE_ID_SCANNING_BEGIN); + AUDIO_PlaySingleVoice(true); + #endif + + // clear the other vfo's rssi level (to hide the antenna symbol) + g_vfo_rssi_bar_level[(g_eeprom.rx_vfo + 1) & 1u] = 0; + + g_update_status = true; } + + return; } - else + + // freq/ctcss/cdcss/search mode + + + // TODO: fixme + + // if (!bRestart) if (!bRestart && g_scan_next_channel <= USER_CHANNEL_LAST) { // channel mode, keep scanning but toggle between scan lists g_eeprom.scan_list_default = (g_eeprom.scan_list_default + 1) % 3; // jump to the next channel - CHANNEL_Next(true, g_scan_state_dir); - g_scan_pause_delay_in_10ms = 1; - g_scan_schedule_scan_listen = false; + APP_channel_next(true, g_scan_state_dir); + g_scan_pause_delay_in_10ms = 1; + g_scan_schedule_scan_listen = false; g_update_status = true; } @@ -251,7 +259,7 @@ void ACTION_Scan(bool bRestart) { // stop scanning g_monitor_enabled = false; - SCAN_Stop(); + APP_stop_scan(); #ifdef ENABLE_VOICE g_another_voice_id = VOICE_ID_SCANNING_STOP; @@ -320,8 +328,8 @@ void ACTION_Scan(bool bRestart) g_monitor_enabled = false; - RADIO_SelectVfos(); - RADIO_SetupRegisters(true); + RADIO_select_vfos(); + RADIO_setup_registers(true); FM_Start(); diff --git a/app/aircopy.c b/app/aircopy.c index 7785dba..c02f716 100644 --- a/app/aircopy.c +++ b/app/aircopy.c @@ -70,7 +70,7 @@ void AIRCOPY_init(void) // turn the backlight ON GPIO_SetBit(&GPIOB->DATA, GPIOB_PIN_BACKLIGHT); - RADIO_SetupRegisters(true); + RADIO_setup_registers(true); BK4819_SetupAircopy(AIRCOPY_DATA_PACKET_SIZE); @@ -762,7 +762,7 @@ static void AIRCOPY_Key_MENU(bool key_pressed, bool key_held) } } -void AIRCOPY_ProcessKey(key_code_t Key, bool key_pressed, bool key_held) +void AIRCOPY_process_key(key_code_t Key, bool key_pressed, bool key_held) { switch (Key) { diff --git a/app/aircopy.h b/app/aircopy.h index 26e1d70..beac0ba 100644 --- a/app/aircopy.h +++ b/app/aircopy.h @@ -42,6 +42,6 @@ extern uint16_t g_fsk_tx_timeout_10ms; void AIRCOPY_init(void); void AIRCOPY_process_fsk_tx_10ms(void); void AIRCOPY_process_fsk_rx_10ms(void); -void AIRCOPY_ProcessKey(key_code_t key, bool key_pressed, bool key_held); +void AIRCOPY_process_key(key_code_t key, bool key_pressed, bool key_held); #endif diff --git a/app/app.c b/app/app.c index 3ff5147..bef0779 100644 --- a/app/app.c +++ b/app/app.c @@ -70,9 +70,9 @@ const uint8_t orig_lna = 2; // -14dB const uint8_t orig_mixer = 3; // 0dB const uint8_t orig_pga = 6; // -3dB -static void APP_ProcessKey(const key_code_t Key, const bool key_pressed, const bool key_held); +static void APP_process_key(const key_code_t Key, const bool key_pressed, const bool key_held); -static void updateRSSI(const int vfo) +static void APP_update_rssi(const int vfo) { int16_t rssi = BK4819_GetRSSI(); @@ -87,13 +87,13 @@ static void updateRSSI(const int vfo) g_current_rssi[vfo] = rssi; - UI_UpdateRSSI(rssi, vfo); + UI_update_rssi(rssi, vfo); } -static void APP_CheckForIncoming(void) +static void APP_check_for_incoming_rx(void) { if (!g_squelch_lost) - return; // squelch is closed + return; // squelch is open @@ -124,7 +124,7 @@ static void APP_CheckForIncoming(void) FUNCTION_Select(FUNCTION_INCOMING); //g_update_display = true; - updateRSSI(g_eeprom.rx_vfo); + APP_update_rssi(g_eeprom.rx_vfo); g_update_rssi = true; } @@ -140,18 +140,16 @@ static void APP_CheckForIncoming(void) FUNCTION_Select(FUNCTION_INCOMING); //g_update_display = true; - updateRSSI(g_eeprom.rx_vfo); + APP_update_rssi(g_eeprom.rx_vfo); g_update_rssi = true; } return; } g_dual_watch_count_down_10ms = dual_watch_count_after_rx_10ms; - g_schedule_dual_watch = false; + g_schedule_dual_watch = false; - // let the user see DW is not active - g_dual_watch_active = false; - g_update_status = true; + g_update_status = true; } else { // RF scanning @@ -162,7 +160,7 @@ static void APP_CheckForIncoming(void) FUNCTION_Select(FUNCTION_INCOMING); //g_update_display = true; - updateRSSI(g_eeprom.rx_vfo); + APP_update_rssi(g_eeprom.rx_vfo); g_update_rssi = true; } return; @@ -179,12 +177,12 @@ static void APP_CheckForIncoming(void) FUNCTION_Select(FUNCTION_INCOMING); //g_update_display = true; - updateRSSI(g_eeprom.rx_vfo); + APP_update_rssi(g_eeprom.rx_vfo); g_update_rssi = true; } } -static void APP_HandleIncoming(void) +static void APP_process_incoming_rx(void) { bool flag; @@ -214,7 +212,7 @@ static void APP_HandleIncoming(void) if (g_ctcss_lost && g_current_code_type == CODE_TYPE_CONTINUOUS_TONE) { - flag = true; + flag = true; g_found_ctcss = false; } @@ -228,7 +226,8 @@ static void APP_HandleIncoming(void) if (g_scan_state_dir == SCAN_STATE_DIR_OFF && g_css_scan_mode == CSS_SCAN_MODE_OFF) { // not scanning - if (g_rx_vfo->dtmf_decoding_enable || g_setting_killed) + + if (g_rx_vfo->dtmf_decoding_enable || g_setting_radio_disabled) { // DTMF DCD is enabled DTMF_HandleRequest(); @@ -238,31 +237,32 @@ static void APP_HandleIncoming(void) if (g_rx_reception_mode == RX_MODE_DETECTED) { g_dual_watch_count_down_10ms = dual_watch_count_after_1_10ms; - g_schedule_dual_watch = false; + g_schedule_dual_watch = false; g_rx_reception_mode = RX_MODE_LISTENING; - // let the user see DW is not active - g_dual_watch_active = false; - g_update_status = true; - + g_update_status = true; g_update_display = true; + return; } } } } - APP_StartListening(g_monitor_enabled ? FUNCTION_MONITOR : FUNCTION_RECEIVE, false); + APP_start_listening(g_monitor_enabled ? FUNCTION_MONITOR : FUNCTION_RECEIVE, false); } -static void APP_HandleReceive(void) -{ - #define END_OF_RX_MODE_SKIP 0 - #define END_OF_RX_MODE_END 1 - #define END_OF_RX_MODE_TTE 2 +enum end_of_rx_mode_e { + END_OF_RX_MODE_SKIP = 0, + END_OF_RX_MODE_END, + END_OF_RX_MODE_TTE +}; +typedef enum end_of_rx_mode_e end_of_rx_mode_t; - uint8_t Mode = END_OF_RX_MODE_SKIP; +static void APP_process_rx(void) +{ + end_of_rx_mode_t Mode = END_OF_RX_MODE_SKIP; if (g_flag_tail_tone_elimination_complete) { @@ -309,11 +309,7 @@ static void APP_HandleReceive(void) if (g_squelch_lost) { - #ifdef ENABLE_NOAA - if (!g_end_of_rx_detected_maybe && IS_NOT_NOAA_CHANNEL(g_rx_vfo->channel_save)) - #else - if (!g_end_of_rx_detected_maybe) - #endif + if (!g_end_of_rx_detected_maybe && IS_NOT_NOAA_CHANNEL(g_rx_vfo->channel_save)) { switch (g_current_code_type) { @@ -396,11 +392,11 @@ Skip: break; case END_OF_RX_MODE_END: - RADIO_SetupRegisters(true); + RADIO_setup_registers(true); #ifdef ENABLE_NOAA if (IS_NOAA_CHANNEL(g_rx_vfo->channel_save)) - g_noaa_count_down_10ms = 300; // 3 sec + g_noaa_count_down_10ms = 3000 / 10; // 3 sec #endif g_update_display = true; @@ -413,12 +409,12 @@ Skip: break; case SCAN_RESUME_CO: - g_scan_pause_delay_in_10ms = scan_pause_delay_in_7_10ms; - g_scan_schedule_scan_listen = false; + g_scan_pause_delay_in_10ms = scan_pause_delay_in_7_10ms; + g_scan_schedule_scan_listen = false; break; case SCAN_RESUME_SE: - SCAN_Stop(); + APP_stop_scan(); break; } } @@ -432,19 +428,19 @@ Skip: g_tail_tone_elimination_count_down_10ms = 20; g_flag_tail_tone_elimination_complete = false; - g_end_of_rx_detected_maybe = true; - g_enable_speaker = false; + g_end_of_rx_detected_maybe = true; + g_enable_speaker = false; } break; } } -static void APP_HandleFunction(void) +static void APP_process_function(void) { switch (g_current_function) { case FUNCTION_FOREGROUND: - APP_CheckForIncoming(); + APP_check_for_incoming_rx(); break; case FUNCTION_TRANSMIT: @@ -454,16 +450,16 @@ static void APP_HandleFunction(void) break; case FUNCTION_INCOMING: - APP_HandleIncoming(); + APP_process_incoming_rx(); break; case FUNCTION_RECEIVE: - APP_HandleReceive(); + APP_process_rx(); break; case FUNCTION_POWER_SAVE: if (!g_rx_idle_mode) - APP_CheckForIncoming(); + APP_check_for_incoming_rx(); break; case FUNCTION_BAND_SCOPE: @@ -471,12 +467,12 @@ static void APP_HandleFunction(void) } } -void APP_StartListening(function_type_t Function, const bool reset_am_fix) +void APP_start_listening(function_type_t Function, const bool reset_am_fix) { const unsigned int chan = g_eeprom.rx_vfo; // const unsigned int chan = g_rx_vfo->channel_save; - if (g_setting_killed) + if (g_setting_radio_disabled) return; #ifdef ENABLE_FMRADIO @@ -495,22 +491,23 @@ void APP_StartListening(function_type_t Function, const bool reset_am_fix) backlight_turn_on(); if (g_scan_state_dir != SCAN_STATE_DIR_OFF) - { + { // we're scanning + switch (g_eeprom.scan_resume_mode) { case SCAN_RESUME_TO: if (!g_scan_pause_mode) { - g_scan_pause_delay_in_10ms = scan_pause_delay_in_1_10ms; - g_scan_schedule_scan_listen = false; - g_scan_pause_mode = true; + g_scan_pause_delay_in_10ms = scan_pause_delay_in_1_10ms; + g_scan_schedule_scan_listen = false; + g_scan_pause_mode = true; } break; case SCAN_RESUME_CO: case SCAN_RESUME_SE: - g_scan_pause_delay_in_10ms = 0; - g_scan_schedule_scan_listen = false; + g_scan_pause_delay_in_10ms = 0; + g_scan_schedule_scan_listen = false; break; } @@ -521,10 +518,10 @@ void APP_StartListening(function_type_t Function, const bool reset_am_fix) if (IS_NOAA_CHANNEL(g_rx_vfo->channel_save) && g_is_noaa_mode) { g_rx_vfo->channel_save = g_noaa_channel + NOAA_CHANNEL_FIRST; - g_rx_vfo->p_rx->frequency = NOAA_FREQUENCY_TABLE[g_noaa_channel]; - g_rx_vfo->p_tx->frequency = NOAA_FREQUENCY_TABLE[g_noaa_channel]; + g_rx_vfo->p_rx->frequency = NOAA_FREQUENCY_TABLE[g_noaa_channel]; + g_rx_vfo->p_tx->frequency = NOAA_FREQUENCY_TABLE[g_noaa_channel]; g_eeprom.screen_channel[chan] = g_rx_vfo->channel_save; - g_noaa_count_down_10ms = 500; // 5 sec + g_noaa_count_down_10ms = 5000 / 10; // 5 sec g_schedule_noaa = false; } #endif @@ -535,16 +532,14 @@ void APP_StartListening(function_type_t Function, const bool reset_am_fix) if (g_scan_state_dir == SCAN_STATE_DIR_OFF && g_css_scan_mode == CSS_SCAN_MODE_OFF && g_eeprom.dual_watch != DUAL_WATCH_OFF) - { // not scanning, dual watch is enabled + { // not scanning, but dual watch is enabled g_dual_watch_count_down_10ms = dual_watch_count_after_2_10ms; - g_schedule_dual_watch = false; + g_schedule_dual_watch = false; g_rx_vfo_is_active = true; - // let the user see DW is not active - g_dual_watch_active = false; - g_update_status = true; + g_update_status = true; } { // RF RX front end gain @@ -559,7 +554,7 @@ void APP_StartListening(function_type_t Function, const bool reset_am_fix) if (g_rx_vfo->am_mode && g_setting_am_fix) { // AM RX mode if (reset_am_fix) - AM_fix_reset(chan); // TODO: only reset it when moving channel/frequency + AM_fix_reset(chan); // TODO: only reset it when moving channel/frequency .. or do we ??? AM_fix_10ms(chan); } else @@ -573,8 +568,8 @@ void APP_StartListening(function_type_t Function, const bool reset_am_fix) // AF gain - original QS values BK4819_WriteRegister(BK4819_REG_48, - (11u << 12) | // ??? .. 0 to 15, doesn't seem to make any difference - ( 0u << 10) | // AF Rx Gain-1 + (11u << 12) | // ??? .. 0 to 15, doesn't seem to make any difference + ( 0u << 10) | // AF Rx Gain-1 (g_eeprom.volume_gain << 4) | // AF Rx Gain-2 (g_eeprom.dac_gain << 0)); // AF DAC Gain (after Gain-1 and Gain-2) @@ -606,7 +601,7 @@ void APP_StartListening(function_type_t Function, const bool reset_am_fix) g_update_status = true; } -uint32_t APP_SetFrequencyByStep(vfo_info_t *pInfo, int8_t Step) +uint32_t APP_set_frequency_by_step(vfo_info_t *pInfo, int8_t Step) { uint32_t Frequency = pInfo->freq_config_rx.frequency + (Step * pInfo->step_freq); @@ -632,7 +627,7 @@ uint32_t APP_SetFrequencyByStep(vfo_info_t *pInfo, int8_t Step) return Frequency; } -void SCAN_Stop(void) +void APP_stop_scan(void) { const uint8_t Previous = g_scan_restore_channel; @@ -658,7 +653,7 @@ void SCAN_Stop(void) RADIO_ConfigureSquelchAndOutputPower(g_rx_vfo); } - RADIO_SetupRegisters(true); + RADIO_setup_registers(true); g_update_display = true; return; @@ -677,13 +672,13 @@ void SCAN_Stop(void) g_update_status = true; } -static void FREQ_NextChannel(void) +static void APP_next_freq(void) { - g_rx_vfo->freq_config_rx.frequency = APP_SetFrequencyByStep(g_rx_vfo, g_scan_state_dir); + g_rx_vfo->freq_config_rx.frequency = APP_set_frequency_by_step(g_rx_vfo, g_scan_state_dir); RADIO_ApplyOffset(g_rx_vfo); RADIO_ConfigureSquelchAndOutputPower(g_rx_vfo); - RADIO_SetupRegisters(true); + RADIO_setup_registers(true); #ifdef ENABLE_FASTER_CHANNEL_SCAN g_scan_pause_delay_in_10ms = 9; // 90ms @@ -692,10 +687,10 @@ static void FREQ_NextChannel(void) #endif g_scan_keep_frequency = false; - g_update_display = true; + g_update_display = true; } -static void USER_NextChannel(void) +static void APP_next_channel(void) { static unsigned int prevChannel = 0; const bool enabled = (g_eeprom.scan_list_default < 2) ? g_eeprom.scan_list_enabled[g_eeprom.scan_list_default] : true; @@ -780,7 +775,7 @@ static void USER_NextChannel(void) g_eeprom.screen_channel[g_eeprom.rx_vfo] = g_scan_next_channel; RADIO_ConfigureChannel(g_eeprom.rx_vfo, VFO_CONFIGURE_RELOAD); - RADIO_SetupRegisters(true); + RADIO_setup_registers(true); g_update_display = true; } @@ -799,14 +794,14 @@ static void USER_NextChannel(void) } #ifdef ENABLE_NOAA - static void NOAA_IncreaseChannel(void) + static void APP_next_noaa(void) { if (++g_noaa_channel >= ARRAY_SIZE(NOAA_FREQUENCY_TABLE)) g_noaa_channel = 0; } #endif -static void DUALWATCH_Alternate(void) +static void APP_toggle_dual_watch_vfo(void) { #ifdef ENABLE_NOAA if (g_is_noaa_mode) @@ -819,22 +814,17 @@ static void DUALWATCH_Alternate(void) g_rx_vfo = &g_eeprom.vfo_info[g_eeprom.rx_vfo]; if (g_eeprom.vfo_info[0].channel_save >= NOAA_CHANNEL_FIRST) - NOAA_IncreaseChannel(); + APP_next_noaa(); } else #endif { // toggle between VFO's g_eeprom.rx_vfo = (g_eeprom.rx_vfo + 1) & 1; - g_rx_vfo = &g_eeprom.vfo_info[g_eeprom.rx_vfo]; - - if (!g_dual_watch_active) - { // let the user see DW is active - g_dual_watch_active = true; - g_update_status = true; - } + g_rx_vfo = &g_eeprom.vfo_info[g_eeprom.rx_vfo]; + g_update_status = true; } - RADIO_SetupRegisters(false); + RADIO_setup_registers(false); #ifdef ENABLE_NOAA g_dual_watch_count_down_10ms = g_is_noaa_mode ? dual_watch_count_noaa_10ms : dual_watch_count_toggle_10ms; @@ -843,7 +833,7 @@ static void DUALWATCH_Alternate(void) #endif } -void APP_CheckRadioInterrupts(void) +void APP_process_radio_interrupts(void) { if (g_screen_to_display == DISPLAY_SEARCH) return; @@ -875,7 +865,7 @@ void APP_CheckRadioInterrupts(void) g_update_display = true; } - if (g_rx_vfo->dtmf_decoding_enable || g_setting_killed) + if (g_rx_vfo->dtmf_decoding_enable || g_setting_radio_disabled) { if (g_dtmf_rx_index >= (sizeof(g_dtmf_rx) - 1)) { // make room @@ -931,9 +921,7 @@ void APP_CheckRadioInterrupts(void) g_dual_watch_count_down_10ms = dual_watch_count_after_vox_10ms; g_schedule_dual_watch = false; - // let the user see DW is not active - g_dual_watch_active = false; - g_update_status = true; + g_update_status = true; } } } @@ -959,7 +947,7 @@ void APP_CheckRadioInterrupts(void) } } -void APP_EndTransmission(void) +void APP_end_tx(void) { // back to RX mode RADIO_SendEndOfTransmission(); @@ -982,13 +970,13 @@ void APP_EndTransmission(void) #endif } - RADIO_SetupRegisters(false); + RADIO_setup_registers(false); } #ifdef ENABLE_VOX - static void APP_HandleVox(void) + static void APP_process_vox(void) { - if (g_setting_killed) + if (g_setting_radio_disabled) return; if (g_vox_resume_count_down == 0) @@ -1032,7 +1020,7 @@ void APP_EndTransmission(void) } else { - APP_EndTransmission(); + APP_end_tx(); if (g_eeprom.repeater_tail_tone_elimination == 0) { @@ -1067,25 +1055,24 @@ void APP_EndTransmission(void) } #endif -void APP_Update(void) +void APP_process(void) { #ifdef ENABLE_VOICE if (g_flag_play_queued_voice) { - AUDIO_PlayQueuedVoice(); g_flag_play_queued_voice = false; + AUDIO_PlayQueuedVoice(); } #endif if (g_current_function == FUNCTION_TRANSMIT && (g_tx_timeout_reached || g_serial_config_count_down_500ms > 0)) { // transmitter timed out or must de-key + g_tx_timeout_reached = false; + g_flag_end_tx = true; - g_flag_end_tx = true; - APP_EndTransmission(); - + APP_end_tx(); AUDIO_PlayBeep(BEEP_880HZ_60MS_TRIPLE_BEEP); - RADIO_Setg_vfo_state(VFO_STATE_TIMEOUT); GUI_DisplayScreen(); @@ -1095,7 +1082,7 @@ void APP_Update(void) return; if (g_current_function != FUNCTION_TRANSMIT) - APP_HandleFunction(); + APP_process_function(); #ifdef ENABLE_FMRADIO if (g_fm_radio_mode && g_fm_radio_count_down_500ms > 0) @@ -1115,35 +1102,35 @@ void APP_Update(void) if (IS_FREQ_CHANNEL(g_scan_next_channel)) { if (g_current_function == FUNCTION_INCOMING) - APP_StartListening(g_monitor_enabled ? FUNCTION_MONITOR : FUNCTION_RECEIVE, true); + APP_start_listening(g_monitor_enabled ? FUNCTION_MONITOR : FUNCTION_RECEIVE, true); else - FREQ_NextChannel(); // switch to next frequency + APP_next_freq(); // switch to next frequency } else { if (g_current_code_type == CODE_TYPE_NONE && g_current_function == FUNCTION_INCOMING) - APP_StartListening(g_monitor_enabled ? FUNCTION_MONITOR : FUNCTION_RECEIVE, true); + APP_start_listening(g_monitor_enabled ? FUNCTION_MONITOR : FUNCTION_RECEIVE, true); else - USER_NextChannel(); // switch to next channel + APP_next_channel(); // switch to next channel } - g_scan_pause_mode = false; - g_rx_reception_mode = RX_MODE_NONE; + g_scan_pause_mode = false; + g_rx_reception_mode = RX_MODE_NONE; g_scan_schedule_scan_listen = false; } } #ifdef ENABLE_VOICE - if (g_css_scan_mode == CSS_SCAN_MODE_SCANNING && g_scan_schedule_scan_listen && g_voice_write_index == 0) - #else - if (g_css_scan_mode == CSS_SCAN_MODE_SCANNING && g_scan_schedule_scan_listen) + if (g_voice_write_index == 0) #endif { - MENU_SelectNextCode(); - - g_scan_schedule_scan_listen = false; + if (g_css_scan_mode == CSS_SCAN_MODE_SCANNING && g_scan_schedule_scan_listen) + { + MENU_SelectNextCode(); + g_scan_schedule_scan_listen = false; + } } - + #ifdef ENABLE_NOAA #ifdef ENABLE_VOICE if (g_voice_write_index == 0) @@ -1151,8 +1138,8 @@ void APP_Update(void) { if (g_eeprom.dual_watch == DUAL_WATCH_OFF && g_is_noaa_mode && g_schedule_noaa) { - NOAA_IncreaseChannel(); - RADIO_SetupRegisters(false); + APP_next_noaa(); + RADIO_setup_registers(false); g_noaa_count_down_10ms = 7; // 70ms g_schedule_noaa = false; @@ -1183,12 +1170,12 @@ void APP_Update(void) g_dtmf_call_state == DTMF_CALL_STATE_NONE && g_current_function != FUNCTION_POWER_SAVE) { - DUALWATCH_Alternate(); // toggle between the two VFO's + APP_toggle_dual_watch_vfo(); // toggle between the two VFO's if (g_rx_vfo_is_active && g_screen_to_display == DISPLAY_MAIN) GUI_SelectNextDisplay(DISPLAY_MAIN); - g_rx_vfo_is_active = false; + g_rx_vfo_is_active = false; g_scan_pause_mode = false; g_rx_reception_mode = RX_MODE_NONE; g_schedule_dual_watch = false; @@ -1213,7 +1200,7 @@ void APP_Update(void) #ifdef ENABLE_VOX if (g_eeprom.vox_switch) - APP_HandleVox(); + APP_process_vox(); #endif if (g_schedule_power_save) @@ -1221,14 +1208,14 @@ void APP_Update(void) #ifdef ENABLE_NOAA if ( #ifdef ENABLE_FMRADIO - g_fm_radio_mode || + g_fm_radio_mode || #endif - g_ptt_is_pressed || - g_key_held || - g_eeprom.battery_save == 0 || - g_scan_state_dir != SCAN_STATE_DIR_OFF || - g_css_scan_mode != CSS_SCAN_MODE_OFF || - g_screen_to_display != DISPLAY_MAIN || + g_ptt_is_pressed || + g_key_held || + g_eeprom.battery_save == 0 || + g_scan_state_dir != SCAN_STATE_DIR_OFF || + g_css_scan_mode != CSS_SCAN_MODE_OFF || + g_screen_to_display != DISPLAY_MAIN || g_dtmf_call_state != DTMF_CALL_STATE_NONE) { g_battery_save_count_down_10ms = battery_save_count_10ms; @@ -1247,14 +1234,14 @@ void APP_Update(void) #else if ( #ifdef ENABLE_FMRADIO - g_fm_radio_mode || + g_fm_radio_mode || #endif - g_ptt_is_pressed || - g_key_held || - g_eeprom.battery_save == 0 || - g_scan_state_dir != SCAN_STATE_DIR_OFF || - g_css_scan_mode != CSS_SCAN_MODE_OFF || - g_screen_to_display != DISPLAY_MAIN || + g_ptt_is_pressed || + g_key_held || + g_eeprom.battery_save == 0 || + g_scan_state_dir != SCAN_STATE_DIR_OFF || + g_css_scan_mode != CSS_SCAN_MODE_OFF || + g_screen_to_display != DISPLAY_MAIN || g_dtmf_call_state != DTMF_CALL_STATE_NONE) { g_battery_save_count_down_10ms = battery_save_count_10ms; @@ -1291,7 +1278,7 @@ void APP_Update(void) g_scan_state_dir == SCAN_STATE_DIR_OFF && g_css_scan_mode == CSS_SCAN_MODE_OFF) { // dual watch mode, toggle between the two VFO's - DUALWATCH_Alternate(); + APP_toggle_dual_watch_vfo(); g_update_rssi = false; } @@ -1299,16 +1286,16 @@ void APP_Update(void) FUNCTION_Init(); g_power_save_10ms = power_save1_10ms; // come back here in a bit - g_rx_idle_mode = false; // RX is awake + g_rx_idle_mode = false; // RX is awake } else - if (g_eeprom.dual_watch == DUAL_WATCH_OFF || + if (g_eeprom.dual_watch == DUAL_WATCH_OFF || g_scan_state_dir != SCAN_STATE_DIR_OFF || - g_css_scan_mode != CSS_SCAN_MODE_OFF || + g_css_scan_mode != CSS_SCAN_MODE_OFF || g_update_rssi) { // dual watch mode, go back to sleep - updateRSSI(g_eeprom.rx_vfo); + APP_update_rssi(g_eeprom.rx_vfo); // go back to sleep @@ -1325,7 +1312,7 @@ void APP_Update(void) else { // toggle between the two VFO's - DUALWATCH_Alternate(); + APP_toggle_dual_watch_vfo(); g_update_rssi = true; g_power_save_10ms = power_save1_10ms; @@ -1337,13 +1324,13 @@ void APP_Update(void) } // called every 10ms -void APP_CheckKeys(void) +void APP_check_keys(void) { const bool ptt_pressed = !GPIO_CheckBit(&GPIOC->DATA, GPIOC_PIN_PTT) && (g_serial_config_count_down_500ms == 0) && g_setting_tx_enable; key_code_t key; - if (g_setting_killed) + if (g_setting_radio_disabled) return; // ***************** @@ -1352,9 +1339,9 @@ void APP_CheckKeys(void) if (ptt_pressed) { // PTT pressed #ifdef ENABLE_AIRCOPY - if (!g_setting_killed && !g_ptt_is_pressed && g_screen_to_display != DISPLAY_AIRCOPY) + if (!g_setting_radio_disabled && !g_ptt_is_pressed && g_screen_to_display != DISPLAY_AIRCOPY) #else - if (!g_setting_killed && !g_ptt_is_pressed) + if (!g_setting_radio_disabled && !g_ptt_is_pressed) #endif { if (++g_ptt_debounce >= 3) // 30ms @@ -1365,7 +1352,7 @@ void APP_CheckKeys(void) g_ptt_was_released = false; g_ptt_debounce = 0; - APP_ProcessKey(KEY_PTT, true, false); + APP_process_key(KEY_PTT, true, false); #if defined(ENABLE_UART) && defined(ENABLE_UART_DEBUG) // UART_printf(" ptt key %3u %u %u\r\n", KEY_PTT, g_ptt_is_pressed, g_ptt_was_released); @@ -1386,7 +1373,7 @@ void APP_CheckKeys(void) g_ptt_was_released = true; g_ptt_debounce = 0; - APP_ProcessKey(KEY_PTT, false, false); + APP_process_key(KEY_PTT, false, false); #if defined(ENABLE_UART) && defined(ENABLE_UART_DEBUG) // UART_printf(" ptt key %3u %u %u\r\n", KEY_PTT, g_ptt_is_pressed, g_ptt_was_released); @@ -1430,11 +1417,11 @@ void APP_CheckKeys(void) #ifdef ENABLE_AIRCOPY if (g_screen_to_display != DISPLAY_AIRCOPY) - APP_ProcessKey(g_key_prev, false, g_key_held); + APP_process_key(g_key_prev, false, g_key_held); else - AIRCOPY_ProcessKey(g_key_prev, false, g_key_held); + AIRCOPY_process_key(g_key_prev, false, g_key_held); #else - APP_ProcessKey(g_key_prev, false, g_key_held); + APP_process_key(g_key_prev, false, g_key_held); #endif g_key_debounce_press = 0; @@ -1470,11 +1457,11 @@ void APP_CheckKeys(void) #ifdef ENABLE_AIRCOPY if (g_screen_to_display != DISPLAY_AIRCOPY) - APP_ProcessKey(g_key_prev, true, g_key_held); + APP_process_key(g_key_prev, true, g_key_held); else - AIRCOPY_ProcessKey(g_key_prev, true, g_key_held); + AIRCOPY_process_key(g_key_prev, true, g_key_held); #else - APP_ProcessKey(g_key_prev, true, g_key_held); + APP_process_key(g_key_prev, true, g_key_held); #endif g_update_status = true; @@ -1495,11 +1482,11 @@ void APP_CheckKeys(void) #ifdef ENABLE_AIRCOPY if (g_screen_to_display != DISPLAY_AIRCOPY) - APP_ProcessKey(g_key_prev, true, g_key_held); + APP_process_key(g_key_prev, true, g_key_held); else - AIRCOPY_ProcessKey(g_key_prev, true, g_key_held); + AIRCOPY_process_key(g_key_prev, true, g_key_held); #else - APP_ProcessKey(g_key_prev, true, g_key_held); + APP_process_key(g_key_prev, true, g_key_held); #endif //g_update_status = true; @@ -1519,11 +1506,11 @@ void APP_CheckKeys(void) #ifdef ENABLE_AIRCOPY if (g_screen_to_display != DISPLAY_AIRCOPY) - APP_ProcessKey(g_key_prev, true, g_key_held); + APP_process_key(g_key_prev, true, g_key_held); else - AIRCOPY_ProcessKey(g_key_prev, true, g_key_held); + AIRCOPY_process_key(g_key_prev, true, g_key_held); #else - APP_ProcessKey(g_key_prev, true, g_key_held); + APP_process_key(g_key_prev, true, g_key_held); #endif //g_update_status = true; @@ -1535,7 +1522,7 @@ void APP_CheckKeys(void) // ***************** } -void APP_TimeSlice10ms(void) +void APP_time_slice_10ms(void) { g_flash_light_blink_counter++; @@ -1574,7 +1561,7 @@ void APP_TimeSlice10ms(void) g_flag_save_channel = false; RADIO_ConfigureChannel(g_eeprom.tx_vfo, VFO_CONFIGURE); - RADIO_SetupRegisters(true); + RADIO_setup_registers(true); GUI_SelectNextDisplay(DISPLAY_MAIN); } @@ -1609,7 +1596,7 @@ void APP_TimeSlice10ms(void) AIRCOPY_process_fsk_rx_10ms(); - APP_CheckKeys(); + APP_check_keys(); if (g_update_display) GUI_DisplayScreen(); @@ -1628,7 +1615,7 @@ void APP_TimeSlice10ms(void) #endif if (g_current_function != FUNCTION_POWER_SAVE || !g_rx_idle_mode) - APP_CheckRadioInterrupts(); + APP_process_radio_interrupts(); if (g_current_function == FUNCTION_TRANSMIT) { // transmitting @@ -1751,14 +1738,14 @@ void APP_TimeSlice10ms(void) { if (--g_search_delay_10ms > 0) { - APP_CheckKeys(); + APP_check_keys(); return; } } if (g_search_edit_state != SEARCH_EDIT_STATE_NONE) { // waiting for user input choice - APP_CheckKeys(); + APP_check_keys(); return; } @@ -1950,10 +1937,10 @@ void APP_TimeSlice10ms(void) } } - APP_CheckKeys(); + APP_check_keys(); } -void cancelUserInputModes(void) +void APP_cancel_user_input_modes(void) { if (g_ask_to_save) { @@ -1991,7 +1978,7 @@ void cancelUserInputModes(void) } // this is called once every 500ms -void APP_TimeSlice500ms(void) +void APP_time_slice_500ms(void) { bool exit_menu = false; @@ -2010,7 +1997,7 @@ void APP_TimeSlice500ms(void) { if (--g_key_input_count_down == 0) { - cancelUserInputModes(); + APP_cancel_user_input_modes(); if (g_beep_to_play != BEEP_NONE) { @@ -2115,9 +2102,9 @@ void APP_TimeSlice500ms(void) if (g_screen_to_display != DISPLAY_AIRCOPY) #endif { - if (g_css_scan_mode == CSS_SCAN_MODE_OFF && - g_scan_state_dir == SCAN_STATE_DIR_OFF && - (g_screen_to_display != DISPLAY_SEARCH || + if (g_css_scan_mode == CSS_SCAN_MODE_OFF && + g_scan_state_dir == SCAN_STATE_DIR_OFF && + (g_screen_to_display != DISPLAY_SEARCH || g_search_css_state == SEARCH_CSS_STATE_FOUND || g_search_css_state == SEARCH_CSS_STATE_FAILED || g_search_css_state == SEARCH_CSS_STATE_REPEAT)) @@ -2156,7 +2143,7 @@ void APP_TimeSlice500ms(void) RADIO_ConfigureChannel(0, VFO_CONFIGURE_RELOAD); RADIO_ConfigureChannel(1, VFO_CONFIGURE_RELOAD); - RADIO_SetupRegisters(true); + RADIO_setup_registers(true); } */ DTMF_clear_input_box(); @@ -2200,7 +2187,7 @@ void APP_TimeSlice500ms(void) } if (g_current_function != FUNCTION_POWER_SAVE && g_current_function != FUNCTION_TRANSMIT) - updateRSSI(g_eeprom.rx_vfo); + APP_update_rssi(g_eeprom.rx_vfo); #ifdef ENABLE_FMRADIO if (!g_ptt_is_pressed && g_fm_resume_count_down_500ms > 0) @@ -2322,7 +2309,7 @@ void APP_TimeSlice500ms(void) } #if defined(ENABLE_ALARM) || defined(ENABLE_TX1750) - static void ALARM_Off(void) + static void APP_alarm_off(void) { g_alarm_state = ALARM_STATE_OFF; @@ -2341,43 +2328,43 @@ void APP_TimeSlice500ms(void) SYSTEM_DelayMs(5); - RADIO_SetupRegisters(true); + RADIO_setup_registers(true); if (g_screen_to_display != DISPLAY_MENU) // 1of11 .. don't close the menu g_request_display_screen = DISPLAY_MAIN; } #endif -void CHANNEL_Next(const bool flag, const scan_state_dir_t scan_direction) +void APP_channel_next(const bool flag, const scan_state_dir_t scan_direction) { - RADIO_SelectVfos(); + RADIO_select_vfos(); - g_scan_next_channel = g_rx_vfo->channel_save; + g_scan_next_channel = g_rx_vfo->channel_save; g_scan_current_scan_list = SCAN_NEXT_CHAN_SCANLIST1; - g_scan_state_dir = scan_direction; + g_scan_state_dir = scan_direction; if (g_scan_next_channel <= USER_CHANNEL_LAST) { // channel mode if (flag) g_scan_restore_channel = g_scan_next_channel; - USER_NextChannel(); + APP_next_channel(); } else { // frequency mode if (flag) g_scan_restore_frequency = g_rx_vfo->freq_config_rx.frequency; - FREQ_NextChannel(); + APP_next_freq(); } g_scan_pause_delay_in_10ms = scan_pause_delay_in_2_10ms; g_scan_schedule_scan_listen = false; g_scan_pause_mode = false; - g_rx_reception_mode = RX_MODE_NONE; - - g_scan_keep_frequency = false; + g_scan_keep_frequency = false; + + g_rx_reception_mode = RX_MODE_NONE; } -static void APP_ProcessKey(const key_code_t Key, const bool key_pressed, const bool key_held) +static void APP_process_key(const key_code_t Key, const bool key_pressed, const bool key_held) { bool flag = false; @@ -2482,7 +2469,7 @@ static void APP_ProcessKey(const key_code_t Key, const bool key_pressed, const b } // cancel user input - cancelUserInputModes(); + APP_cancel_user_input_modes(); } if (key_pressed && g_screen_to_display == DISPLAY_MENU) @@ -2622,7 +2609,7 @@ static void APP_ProcessKey(const key_code_t Key, const bool key_pressed, const b else if ((!key_held && key_pressed) || (g_alarm_state == ALARM_STATE_TX1750 && key_held && !key_pressed)) { - ALARM_Off(); + APP_alarm_off(); if (g_eeprom.repeater_tail_tone_elimination == 0) FUNCTION_Select(FUNCTION_FOREGROUND); @@ -2643,26 +2630,26 @@ static void APP_ProcessKey(const key_code_t Key, const bool key_pressed, const b switch (g_screen_to_display) { case DISPLAY_MAIN: - MAIN_ProcessKeys(Key, key_pressed, key_held); + MAIN_process_key(Key, key_pressed, key_held); break; #ifdef ENABLE_FMRADIO case DISPLAY_FM: - FM_ProcessKeys(Key, key_pressed, key_held); + FM_process_key(Key, key_pressed, key_held); break; #endif case DISPLAY_MENU: - MENU_ProcessKeys(Key, key_pressed, key_held); + MENU_process_key(Key, key_pressed, key_held); break; case DISPLAY_SEARCH: - SEARCH_ProcessKeys(Key, key_pressed, key_held); + SEARCH_process_key(Key, key_pressed, key_held); break; #ifdef ENABLE_AIRCOPY case DISPLAY_AIRCOPY: - AIRCOPY_ProcessKey(Key, key_pressed, key_held); + AIRCOPY_process_key(Key, key_pressed, key_held); break; #endif @@ -2703,8 +2690,8 @@ Skip: MENU_AcceptSetting(); - g_flag_refresh_menu = true; - g_flag_accept_setting = false; + g_flag_refresh_menu = true; + g_flag_accept_setting = false; } if (g_search_flag_stop_scan) @@ -2719,8 +2706,9 @@ Skip: SETTINGS_SaveSettings(); else g_flag_save_settings = 1; + g_request_save_settings = false; - g_update_status = true; + g_update_status = true; } #ifdef ENABLE_FMRADIO @@ -2730,6 +2718,7 @@ Skip: SETTINGS_SaveFM(); else g_flag_save_fm = true; + g_request_save_fm = false; } #endif @@ -2740,6 +2729,7 @@ Skip: SETTINGS_SaveVfoIndices(); else g_flag_save_vfo = true; + g_request_save_vfo = false; } @@ -2750,7 +2740,7 @@ Skip: SETTINGS_SaveChannel(g_tx_vfo->channel_save, g_eeprom.tx_vfo, g_tx_vfo, g_request_save_channel); if (g_screen_to_display != DISPLAY_SEARCH) - if (g_vfo_configure_mode == VFO_CONFIGURE_NONE) // 'if' is so as we don't wipe out previously setting this variable elsewhere + if (g_vfo_configure_mode == VFO_CONFIGURE_NONE) // don't wipe previous variable setting g_vfo_configure_mode = VFO_CONFIGURE; } else @@ -2766,14 +2756,20 @@ Skip: if (g_vfo_configure_mode != VFO_CONFIGURE_NONE) { + #if defined(ENABLE_UART) && defined(ENABLE_UART_DEBUG) + UART_printf("audio gap\r\n"); + #endif + if (g_flag_reset_vfos) { RADIO_ConfigureChannel(0, g_vfo_configure_mode); RADIO_ConfigureChannel(1, g_vfo_configure_mode); } else + { RADIO_ConfigureChannel(g_eeprom.tx_vfo, g_vfo_configure_mode); - + } + if (g_request_display_screen == DISPLAY_INVALID) g_request_display_screen = DISPLAY_MAIN; @@ -2784,23 +2780,23 @@ Skip: if (g_flag_reconfigure_vfos) { - RADIO_SelectVfos(); + RADIO_select_vfos(); #ifdef ENABLE_NOAA RADIO_ConfigureNOAA(); #endif - RADIO_SetupRegisters(true); + RADIO_setup_registers(true); - g_dtmf_auto_reset_time_500ms = 0; - g_dtmf_call_state = DTMF_CALL_STATE_NONE; + g_dtmf_auto_reset_time_500ms = 0; + g_dtmf_call_state = DTMF_CALL_STATE_NONE; g_dtmf_tx_stop_count_down_500ms = 0; - g_dtmf_is_tx = false; + g_dtmf_is_tx = false; - g_vfo_rssi_bar_level[0] = 0; - g_vfo_rssi_bar_level[1] = 0; + g_vfo_rssi_bar_level[0] = 0; + g_vfo_rssi_bar_level[1] = 0; - g_flag_reconfigure_vfos = false; + g_flag_reconfigure_vfos= false; if (g_monitor_enabled) ACTION_Monitor(); // 1of11 @@ -2809,7 +2805,7 @@ Skip: if (g_flag_refresh_menu) { g_flag_refresh_menu = false; - g_menu_count_down = menu_timeout_500ms; + g_menu_count_down = menu_timeout_500ms; MENU_ShowCurrentSetting(); } @@ -2817,8 +2813,7 @@ Skip: if (g_search_flag_start_scan) { g_search_flag_start_scan = false; - - g_monitor_enabled = false; + g_monitor_enabled = false; #ifdef ENABLE_VOICE AUDIO_SetVoiceID(0, VOICE_ID_SCANNING_BEGIN); @@ -2845,7 +2840,7 @@ Skip: #endif GUI_SelectNextDisplay(g_request_display_screen); - g_request_display_screen = DISPLAY_INVALID; - g_update_display = true; + g_request_display_screen = DISPLAY_INVALID; + g_update_display = true; } diff --git a/app/app.h b/app/app.h index dad6636..b922d50 100644 --- a/app/app.h +++ b/app/app.h @@ -28,14 +28,14 @@ extern const uint8_t orig_lna; extern const uint8_t orig_mixer; extern const uint8_t orig_pga; -void APP_EndTransmission(void); -void SCAN_Stop(void); -void CHANNEL_Next(const bool flag, const scan_state_dir_t scan_direction); -void APP_StartListening(function_type_t Function, const bool reset_am_fix); -uint32_t APP_SetFrequencyByStep(vfo_info_t *pInfo, int8_t Step); -void APP_Update(void); -void APP_TimeSlice10ms(void); -void APP_TimeSlice500ms(void); +void APP_end_tx(void); +void APP_stop_scan(void); +void APP_channel_next(const bool flag, const scan_state_dir_t scan_direction); +void APP_start_listening(function_type_t Function, const bool reset_am_fix); +uint32_t APP_set_frequency_by_step(vfo_info_t *pInfo, int8_t Step); +void APP_process(void); +void APP_time_slice_10ms(void); +void APP_time_slice_500ms(void); #endif diff --git a/app/dtmf.c b/app/dtmf.c index bd1d91a..c86240e 100644 --- a/app/dtmf.c +++ b/app/dtmf.c @@ -215,7 +215,7 @@ void DTMF_HandleRequest(void) return; } - if (!g_rx_vfo->dtmf_decoding_enable && !g_setting_killed) + if (!g_rx_vfo->dtmf_decoding_enable && !g_setting_radio_disabled) { // D-DCD is disabled or we're alive DTMF_clear_RX(); return; @@ -235,7 +235,7 @@ void DTMF_HandleRequest(void) if (g_eeprom.permit_remote_kill) { - g_setting_killed = true; // oooerr ! + g_setting_radio_disabled = true; // oooerr ! DTMF_clear_RX(); @@ -274,7 +274,7 @@ void DTMF_HandleRequest(void) if (DTMF_CompareMessage(g_dtmf_rx + Offset, String, strlen(String), true)) { // shit, we're back ! - g_setting_killed = false; + g_setting_radio_disabled = false; DTMF_clear_RX(); @@ -328,8 +328,8 @@ void DTMF_HandleRequest(void) } } - if (g_setting_killed || g_dtmf_call_state != DTMF_CALL_STATE_NONE) - { // we've been killed or expecting a reply + if (g_setting_radio_disabled || g_dtmf_call_state != DTMF_CALL_STATE_NONE) + { // we've been disabled, or expecting a reply return; } diff --git a/app/fm.c b/app/fm.c index 17d1392..f2e802e 100644 --- a/app/fm.c +++ b/app/fm.c @@ -605,7 +605,7 @@ Bail: g_request_display_screen = DISPLAY_FM; } -void FM_ProcessKeys(key_code_t Key, bool key_pressed, bool key_held) +void FM_process_key(key_code_t Key, bool key_pressed, bool key_held) { switch (Key) { diff --git a/app/fm.h b/app/fm.h index 7cc0a40..a7d3628 100644 --- a/app/fm.h +++ b/app/fm.h @@ -50,7 +50,7 @@ void FM_Tune(uint16_t Frequency, int8_t Step, bool bFlag); void FM_PlayAndUpdate(void); int FM_CheckFrequencyLock(uint16_t Frequency, uint16_t LowerLimit); -void FM_ProcessKeys(key_code_t Key, bool bKeyPressed, bool bKeyHeld); +void FM_process_key(key_code_t Key, bool bKeyPressed, bool bKeyHeld); void FM_Play(void); void FM_Start(void); diff --git a/app/generic.c b/app/generic.c index d9bfe9e..df9c7c0 100644 --- a/app/generic.c +++ b/app/generic.c @@ -109,7 +109,7 @@ void GENERIC_Key_PTT(bool key_pressed) } else { - APP_EndTransmission(); + APP_end_tx(); if (g_eeprom.repeater_tail_tone_elimination == 0) FUNCTION_Select(FUNCTION_FOREGROUND); @@ -153,7 +153,7 @@ void GENERIC_Key_PTT(bool key_pressed) else if (g_scan_state_dir != SCAN_STATE_DIR_OFF) { // frequency/channel scanning . .stop - SCAN_Stop(); + APP_stop_scan(); } else if (g_css_scan_mode != CSS_SCAN_MODE_OFF) diff --git a/app/main.c b/app/main.c index c1cbab9..5b91c5f 100644 --- a/app/main.c +++ b/app/main.c @@ -80,7 +80,7 @@ static void processFKeyFunction(const key_code_t Key) switch (Key) { case KEY_0: // FM - + #ifdef ENABLE_FMRADIO ACTION_FM(); #else @@ -93,7 +93,7 @@ static void processFKeyFunction(const key_code_t Key) break; case KEY_1: // BAND - + if (!IS_FREQ_CHANNEL(g_tx_vfo->channel_save)) { g_fkey_pressed = false; @@ -124,7 +124,7 @@ static void processFKeyFunction(const key_code_t Key) break; case KEY_2: // A/B - + if (g_eeprom.cross_vfo_rx_tx == CROSS_BAND_CHAN_A) g_eeprom.cross_vfo_rx_tx = CROSS_BAND_CHAN_B; else @@ -148,11 +148,7 @@ static void processFKeyFunction(const key_code_t Key) break; case KEY_3: // VFO/MR - #ifdef ENABLE_NOAA - if (g_eeprom.vfo_open && IS_NOT_NOAA_CHANNEL(g_tx_vfo->channel_save)) - #else - if (g_eeprom.vfo_open) - #endif + if (g_eeprom.vfo_open && IS_NOT_NOAA_CHANNEL(g_tx_vfo->channel_save)) { uint8_t Channel; @@ -195,7 +191,7 @@ static void processFKeyFunction(const key_code_t Key) break; case KEY_4: // FC - + g_fkey_pressed = false; g_search_flag_start_scan = true; g_search_single_frequency = false; @@ -207,7 +203,7 @@ static void processFKeyFunction(const key_code_t Key) break; case KEY_5: // NOAA - + #ifdef ENABLE_NOAA if (IS_NOT_NOAA_CHANNEL(g_tx_vfo->channel_save)) @@ -234,13 +230,13 @@ static void processFKeyFunction(const key_code_t Key) break; case KEY_6: // H/M/L - + ACTION_Power(); // g_beep_to_play = BEEP_1KHZ_60MS_OPTIONAL; break; case KEY_7: // VOX - + #ifdef ENABLE_VOX ACTION_Vox(); #else @@ -250,14 +246,14 @@ static void processFKeyFunction(const key_code_t Key) break; case KEY_8: // R - + g_tx_vfo->frequency_reverse = g_tx_vfo->frequency_reverse == false; g_request_save_channel = 1; // g_beep_to_play = BEEP_1KHZ_60MS_OPTIONAL; break; case KEY_9: // CALL - + if (RADIO_CheckValidChannel(g_eeprom.chan_1_call, false, 0)) { g_eeprom.user_channel[Vfo] = g_eeprom.chan_1_call; @@ -461,14 +457,14 @@ static void MAIN_Key_DIGITS(key_code_t Key, bool key_pressed, bool key_held) Channel = (g_input_box[0] * 10) + g_input_box[1]; if (Channel >= 1 && Channel <= ARRAY_SIZE(NOAA_FREQUENCY_TABLE)) { - Channel += NOAA_CHANNEL_FIRST; + Channel += NOAA_CHANNEL_FIRST; #ifdef ENABLE_VOICE - g_another_voice_id = (voice_id_t)Key; + g_another_voice_id = (voice_id_t)Key; #endif g_eeprom.noaa_channel[Vfo] = Channel; g_eeprom.screen_channel[Vfo] = Channel; - g_request_save_vfo = true; - g_vfo_configure_mode = VFO_CONFIGURE_RELOAD; + g_request_save_vfo = true; + g_vfo_configure_mode = VFO_CONFIGURE_RELOAD; return; } } @@ -518,7 +514,7 @@ static void MAIN_Key_EXIT(bool key_pressed, bool key_held) } else { - SCAN_Stop(); + APP_stop_scan(); #ifdef ENABLE_VOICE g_another_voice_id = VOICE_ID_SCANNING_STOP; @@ -573,8 +569,8 @@ static void MAIN_Key_MENU(const bool key_pressed, const bool key_held) g_request_display_screen = DISPLAY_MAIN; } - g_fkey_pressed = false; - g_update_status = true; + g_fkey_pressed = false; + g_update_status = true; #ifdef ENABLE_COPY_CHAN_TO_VFO @@ -584,7 +580,7 @@ static void MAIN_Key_MENU(const bool key_pressed, const bool key_held) if (g_scan_state_dir != SCAN_STATE_DIR_OFF) { if (g_current_function != FUNCTION_INCOMING || - g_rx_reception_mode == RX_MODE_NONE || + g_rx_reception_mode == RX_MODE_NONE || g_scan_pause_delay_in_10ms == 0) { // scan is running (not paused) return; @@ -598,14 +594,14 @@ static void MAIN_Key_MENU(const bool key_pressed, const bool key_held) const unsigned int channel = FREQ_CHANNEL_FIRST + g_eeprom.vfo_info[vfo].band; - g_eeprom.screen_channel[vfo] = channel; + g_eeprom.screen_channel[vfo] = channel; g_eeprom.vfo_info[vfo].channel_save = channel; - g_eeprom.tx_vfo = vfo; + g_eeprom.tx_vfo = vfo; - RADIO_SelectVfos(); + RADIO_select_vfos(); RADIO_ApplyOffset(g_rx_vfo); RADIO_ConfigureSquelchAndOutputPower(g_rx_vfo); - RADIO_SetupRegisters(true); + RADIO_setup_registers(true); g_request_save_vfo = true; @@ -629,8 +625,10 @@ static void MAIN_Key_MENU(const bool key_pressed, const bool key_held) if (!key_pressed && !g_dtmf_input_mode) { // menu key released + const bool flag = (g_input_box_index == 0); - g_input_box_index = 0; + + g_input_box_index = 0; if (flag) { @@ -654,15 +652,18 @@ static void MAIN_Key_STAR(bool key_pressed, bool key_held) if (g_input_box_index > 0) { // entering a frequency or DTMF string + if (!key_held && key_pressed) g_beep_to_play = BEEP_500HZ_60MS_DOUBLE_BEEP_OPTIONAL; + return; } if (key_held && !g_fkey_pressed) { // long press .. toggle scanning + if (!key_pressed) - return; // released + return; // released ACTION_Scan(false); @@ -672,31 +673,23 @@ static void MAIN_Key_STAR(bool key_pressed, bool key_held) if (key_pressed) { // just pressed -// g_beep_to_play = BEEP_1KHZ_60MS_OPTIONAL; - g_beep_to_play = BEEP_880HZ_40MS_OPTIONAL; + g_beep_to_play = BEEP_1KHZ_60MS_OPTIONAL; return; } - // just released - if (!g_fkey_pressed) { // pressed without the F-key - #ifdef ENABLE_NOAA - if (g_scan_state_dir == SCAN_STATE_DIR_OFF && IS_NOT_NOAA_CHANNEL(g_tx_vfo->channel_save)) - #else - if (g_scan_state_dir == SCAN_STATE_DIR_OFF) - #endif + if (g_scan_state_dir == SCAN_STATE_DIR_OFF && IS_NOT_NOAA_CHANNEL(g_tx_vfo->channel_save)) { // start entering a DTMF string - memmove( - g_dtmf_input_box, - g_dtmf_string, + memmove( g_dtmf_input_box, g_dtmf_string, (sizeof(g_dtmf_input_box) <= (sizeof(g_dtmf_string) - 1)) ? sizeof(g_dtmf_input_box) : sizeof(g_dtmf_string) - 1); + g_dtmf_input_box_index = 0; g_dtmf_input_mode = true; - g_key_input_count_down = key_input_timeout_500ms; + g_key_input_count_down = key_input_timeout_500ms; g_request_display_screen = DISPLAY_MAIN; } @@ -705,30 +698,38 @@ static void MAIN_Key_STAR(bool key_pressed, bool key_held) { // with the F-key g_fkey_pressed = false; - #ifdef ENABLE_NOAA - if (IS_NOAA_CHANNEL(g_tx_vfo->channel_save)) - { - g_beep_to_play = BEEP_500HZ_60MS_DOUBLE_BEEP_OPTIONAL; - return; - } - #endif + if (IS_NOAA_CHANNEL(g_tx_vfo->channel_save)) + { + g_beep_to_play = BEEP_500HZ_60MS_DOUBLE_BEEP_OPTIONAL; + return; + } // scan the CTCSS/DCS code - g_search_flag_start_scan = true; - g_search_single_frequency = true; - g_backup_cross_vfo_rx_tx = g_eeprom.cross_vfo_rx_tx; - g_eeprom.cross_vfo_rx_tx = CROSS_BAND_OFF; + g_search_flag_start_scan = true; + g_search_single_frequency = true; + g_backup_cross_vfo_rx_tx = g_eeprom.cross_vfo_rx_tx; + g_eeprom.cross_vfo_rx_tx = CROSS_BAND_OFF; } -// g_ptt_was_released = true; // why is this being set ? + g_ptt_was_released = true; - g_update_status = true; + g_update_status = true; } static void MAIN_Key_UP_DOWN(bool key_pressed, bool key_held, scan_state_dir_t Direction) { uint8_t Channel = g_eeprom.screen_channel[g_eeprom.tx_vfo]; + // only update eeprom when the key is released (saves wear and tear) + if (!key_pressed && g_scan_state_dir == SCAN_STATE_DIR_OFF && IS_NOT_NOAA_CHANNEL(Channel) && IS_FREQ_CHANNEL(Channel)) + { + SETTINGS_SaveChannel(g_tx_vfo->channel_save, g_eeprom.tx_vfo, g_tx_vfo, 1); + + #if defined(ENABLE_UART) && defined(ENABLE_UART_DEBUG) +// UART_printf("save chan\r\n"); + #endif + } + if (key_held || !key_pressed) { // long press @@ -759,20 +760,23 @@ static void MAIN_Key_UP_DOWN(bool key_pressed, bool key_held, scan_state_dir_t D return; } - g_beep_to_play = BEEP_1KHZ_60MS_OPTIONAL; +// g_beep_to_play = BEEP_1KHZ_60MS_OPTIONAL; } if (g_scan_state_dir == SCAN_STATE_DIR_OFF) - { - #ifdef ENABLE_NOAA - if (IS_NOT_NOAA_CHANNEL(Channel)) - #endif + { // not scanning + + if (IS_NOT_NOAA_CHANNEL(Channel)) { uint8_t Next; if (IS_FREQ_CHANNEL(Channel)) { // step/down in frequency - const uint32_t frequency = APP_SetFrequencyByStep(g_tx_vfo, Direction); + + const frequency_band_t old_band = FREQUENCY_GetBand(g_tx_vfo->freq_config_rx.frequency); + frequency_band_t new_band; + + const uint32_t frequency = APP_set_frequency_by_step(g_tx_vfo, Direction); if (RX_freq_check(frequency) < 0) { // frequency not allowed @@ -780,9 +784,20 @@ static void MAIN_Key_UP_DOWN(bool key_pressed, bool key_held, scan_state_dir_t D return; } + new_band = FREQUENCY_GetBand(frequency); + g_tx_vfo->freq_config_rx.frequency = frequency; - g_request_save_channel = 1; + if (new_band != old_band) + { + g_request_save_channel = 1; + } + else + { // don't need to go through all the other stuff + BK4819_set_rf_frequency(frequency, true); + //BK4819_PickRXFilterPathBasedOnFrequency(frequency); + } + return; } @@ -815,23 +830,24 @@ static void MAIN_Key_UP_DOWN(bool key_pressed, bool key_held, scan_state_dir_t D g_request_save_vfo = true; g_vfo_configure_mode = VFO_CONFIGURE_RELOAD; + return; } // jump to the next channel - CHANNEL_Next(false, Direction); - g_scan_pause_delay_in_10ms = 1; - g_scan_schedule_scan_listen = false; + APP_channel_next(false, Direction); + g_scan_pause_delay_in_10ms = 1; + g_scan_schedule_scan_listen = false; -// g_ptt_was_released = true; // why is this being set ? + g_ptt_was_released = true; } -void MAIN_ProcessKeys(key_code_t key, bool key_pressed, bool key_held) +void MAIN_process_key(key_code_t key, bool key_pressed, bool key_held) { #if defined(ENABLE_UART) && defined(ENABLE_UART_DEBUG) - UART_printf(" main 1 key %2u %u %u %u\r\n", key, key_pressed, key_held); +// UART_printf(" main 1 key %2u %u %u %u\r\n", key, key_pressed, key_held); #endif - + #ifdef ENABLE_FMRADIO if (g_fm_radio_mode && key != KEY_PTT && key != KEY_EXIT) { @@ -850,7 +866,7 @@ void MAIN_ProcessKeys(key_code_t key, bool key_pressed, bool key_held) { DTMF_Append(Character); g_key_input_count_down = key_input_timeout_500ms; - //g_ptt_was_released = true; // why is this being set ? + g_ptt_was_released = true; g_beep_to_play = BEEP_1KHZ_60MS_OPTIONAL; g_request_display_screen = DISPLAY_MAIN; } diff --git a/app/main.h b/app/main.h index b2efa69..04ac80a 100644 --- a/app/main.h +++ b/app/main.h @@ -19,7 +19,7 @@ #include "driver/keyboard.h" -void MAIN_ProcessKeys(key_code_t Key, bool bKeyPressed, bool bKeyHeld); +void MAIN_process_key(key_code_t Key, bool bKeyPressed, bool bKeyHeld); #endif diff --git a/app/menu.c b/app/menu.c index 642e5ba..ffede43 100644 --- a/app/menu.c +++ b/app/menu.c @@ -83,7 +83,7 @@ void MENU_StartCssScan(int8_t Direction) g_menu_scroll_direction = Direction; - RADIO_SelectVfos(); + RADIO_select_vfos(); MENU_SelectNextCode(); @@ -96,7 +96,7 @@ void MENU_StopCssScan(void) g_css_scan_mode = CSS_SCAN_MODE_OFF; g_update_status = true; - RADIO_SetupRegisters(true); + RADIO_setup_registers(true); } int MENU_GetLimits(uint8_t Cursor, int32_t *pMin, int32_t *pMax) @@ -253,8 +253,8 @@ int MENU_GetLimits(uint8_t Cursor, int32_t *pMin, int32_t *pMax) case MENU_NOAA_S: #endif case MENU_350TX: - case MENU_200TX: - case MENU_500TX: + case MENU_174TX: + case MENU_470TX: case MENU_350EN: case MENU_SCREN: case MENU_TX_EN: @@ -559,12 +559,10 @@ void MENU_AcceptSetting(void) break; case MENU_XB: - #ifdef ENABLE_NOAA - if (IS_NOAA_CHANNEL(g_eeprom.screen_channel[0])) - return; - if (IS_NOAA_CHANNEL(g_eeprom.screen_channel[1])) - return; - #endif + if (IS_NOAA_CHANNEL(g_eeprom.screen_channel[0])) + return; + if (IS_NOAA_CHANNEL(g_eeprom.screen_channel[1])) + return; g_eeprom.cross_vfo_rx_tx = g_sub_menu_selection; g_flag_reconfigure_vfos = true; @@ -795,12 +793,12 @@ void MENU_AcceptSetting(void) g_setting_freq_lock = g_sub_menu_selection; break; - case MENU_200TX: - g_setting_200_tx_enable = g_sub_menu_selection; + case MENU_174TX: + g_setting_174_tx_enable = g_sub_menu_selection; break; - case MENU_500TX: - g_setting_500_tx_enable = g_sub_menu_selection; + case MENU_470TX: + g_setting_470_tx_enable = g_sub_menu_selection; break; case MENU_350EN: @@ -883,7 +881,7 @@ void MENU_SelectNextCode(void) g_selected_code = g_sub_menu_selection - 1; } - RADIO_SetupRegisters(true); + RADIO_setup_registers(true); g_scan_pause_delay_in_10ms = (g_selected_code_type == CODE_TYPE_CONTINUOUS_TONE) ? scan_pause_delay_in_3_10ms : scan_pause_delay_in_4_10ms; @@ -1229,12 +1227,12 @@ void MENU_ShowCurrentSetting(void) g_sub_menu_selection = g_setting_freq_lock; break; - case MENU_200TX: - g_sub_menu_selection = g_setting_200_tx_enable; + case MENU_174TX: + g_sub_menu_selection = g_setting_174_tx_enable; break; - case MENU_500TX: - g_sub_menu_selection = g_setting_500_tx_enable; + case MENU_470TX: + g_sub_menu_selection = g_setting_470_tx_enable; break; case MENU_350EN: @@ -1663,13 +1661,9 @@ static void MENU_Key_STAR(const bool key_pressed, const bool key_held) return; } - RADIO_SelectVfos(); + RADIO_select_vfos(); - #ifdef ENABLE_NOAA - if (IS_NOT_NOAA_CHANNEL(g_rx_vfo->channel_save) && g_rx_vfo->am_mode == 0) - #else - if (g_rx_vfo->am_mode == 0) - #endif + 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) { // scan CTCSS or DCS to find the tone/code of the incoming signal @@ -1818,7 +1812,7 @@ static void MENU_Key_UP_DOWN(bool key_pressed, bool key_held, int8_t Direction) g_request_display_screen = DISPLAY_MENU; } -void MENU_ProcessKeys(key_code_t Key, bool key_pressed, bool key_held) +void MENU_process_key(key_code_t Key, bool key_pressed, bool key_held) { switch (Key) { diff --git a/app/menu.h b/app/menu.h index a2df065..ec5e185 100644 --- a/app/menu.h +++ b/app/menu.h @@ -30,7 +30,7 @@ void MENU_ShowCurrentSetting(void); void MENU_StartCssScan(int8_t Direction); void MENU_StopCssScan(void); -void MENU_ProcessKeys(key_code_t Key, bool key_pressed, bool key_held); +void MENU_process_key(key_code_t Key, bool key_pressed, bool key_held); #endif diff --git a/app/search.c b/app/search.c index 79c436d..87e0a2b 100644 --- a/app/search.c +++ b/app/search.c @@ -423,7 +423,7 @@ static void SEARCH_Key_UP_DOWN(bool key_pressed, bool pKeyHeld, int8_t Direction g_beep_to_play = BEEP_500HZ_60MS_DOUBLE_BEEP_OPTIONAL; } -void SEARCH_ProcessKeys(key_code_t Key, bool key_pressed, bool key_held) +void SEARCH_process_key(key_code_t Key, bool key_pressed, bool key_held) { switch (Key) { @@ -471,7 +471,7 @@ void SEARCH_Start(void) BK4819_StopScan(); - RADIO_SelectVfos(); + RADIO_select_vfos(); #ifdef ENABLE_NOAA if (IS_NOAA_CHANNEL(g_rx_vfo->channel_save)) @@ -486,7 +486,7 @@ void SEARCH_Start(void) g_rx_vfo->step_setting = BackupStep; g_rx_vfo->step_freq = BackupStepFreq; - RADIO_SetupRegisters(true); + RADIO_setup_registers(true); #ifdef ENABLE_NOAA g_is_noaa_mode = false; diff --git a/app/search.h b/app/search.h index 5db8def..922d7bc 100644 --- a/app/search.h +++ b/app/search.h @@ -55,7 +55,7 @@ extern uint8_t g_search_delay_10ms; extern uint8_t g_search_hit_count; extern bool g_search_use_css_result; -void SEARCH_ProcessKeys(key_code_t Key, bool key_pressed, bool key_held); +void SEARCH_process_key(key_code_t Key, bool key_pressed, bool key_held); void SEARCH_Start(void); #endif diff --git a/app/spectrum.c b/app/spectrum.c index e1f7e03..84e0e49 100644 --- a/app/spectrum.c +++ b/app/spectrum.c @@ -202,7 +202,7 @@ static void SetModulation(ModulationType type) static void SetF(uint32_t f) { fMeasure = f; - BK4819_SetFrequency(fMeasure); + BK4819_set_rf_frequency(fMeasure); BK4819_PickRXFilterPathBasedOnFrequency(fMeasure); uint16_t reg = BK4819_ReadRegister(BK4819_REG_30); BK4819_WriteRegister(BK4819_REG_30, 0); @@ -211,7 +211,7 @@ static void SetF(uint32_t f) { static void SetTxF(uint32_t f) { fTx = f; - BK4819_SetFrequency(f); + BK4819_set_rf_frequency(f); BK4819_PickRXFilterPathBasedOnFrequency(f); uint16_t reg = BK4819_ReadRegister(BK4819_REG_30); BK4819_WriteRegister(BK4819_REG_30, 0); diff --git a/board.c b/board.c index bb8b39a..8b011ea 100644 --- a/board.c +++ b/board.c @@ -729,9 +729,9 @@ void BOARD_EEPROM_load(void) g_setting_freq_lock = (Data[0] < 6) ? Data[0] : FREQ_LOCK_NORMAL; #endif g_setting_350_tx_enable = (Data[1] < 2) ? Data[1] : false; // was true - g_setting_killed = (Data[2] < 2) ? Data[2] : false; - g_setting_200_tx_enable = (Data[3] < 2) ? Data[3] : false; - g_setting_500_tx_enable = (Data[4] < 2) ? Data[4] : false; + g_setting_radio_disabled = (Data[2] < 2) ? Data[2] : false; + g_setting_174_tx_enable = (Data[3] < 2) ? Data[3] : false; + g_setting_470_tx_enable = (Data[4] < 2) ? Data[4] : false; g_setting_350_enable = (Data[5] < 2) ? Data[5] : true; g_setting_scramble_enable = (Data[6] < 2) ? Data[6] : true; g_setting_tx_enable = (Data[7] & (1u << 0)) ? true : false; diff --git a/driver/bk4819.c b/driver/bk4819.c index 40e7f93..12e3e76 100644 --- a/driver/bk4819.c +++ b/driver/bk4819.c @@ -704,10 +704,30 @@ void BK4819_SetupPowerAmplifier(const uint8_t bias, const uint32_t frequency) BK4819_WriteRegister(BK4819_REG_36, ((uint16_t)bias << 8) | ((uint16_t)enable << 7) | ((uint16_t)gain << 0)); } -void BK4819_SetFrequency(uint32_t Frequency) +void BK4819_set_rf_frequency(const uint32_t frequency, const bool trigger_update) { - BK4819_WriteRegister(BK4819_REG_38, (Frequency >> 0) & 0xFFFF); - BK4819_WriteRegister(BK4819_REG_39, (Frequency >> 16) & 0xFFFF); + BK4819_WriteRegister(BK4819_REG_38, (frequency >> 0) & 0xFFFF); + BK4819_WriteRegister(BK4819_REG_39, (frequency >> 16) & 0xFFFF); + + if (trigger_update) + { + // <15> 0 VCO Calibration 1 = enable 0 = disable + // <14> ??? + // <13:10> 0 RX Link 15 = enable 0 = disable + // <9> 0 AF DAC 1 = enable 0 = disable + // <8> 0 DISC Mode 1 = enable 0 = disable + // <7:4> 0 PLL/VCO 15 = enable 0 = disable + // <3> 0 PA Gain 1 = enable 0 = disable + // <2> 0 MIC ADC 1 = enable 0 = disable + // <1> 0 TX DSP 1 = enable 0 = disable + // <0> 0 RX DSP 1 = enable 0 = disable + // + // trigger a PLL/VCO update + // + const uint16_t reg = BK4819_ReadRegister(BK4819_REG_30); + BK4819_WriteRegister(BK4819_REG_30, reg & ~(1u << 15) & (15u << 4)); + BK4819_WriteRegister(BK4819_REG_30, reg); + } } void BK4819_SetupSquelch( @@ -1583,7 +1603,7 @@ void BK4819_EnableFrequencyScan(void) void BK4819_SetScanFrequency(uint32_t Frequency) { - BK4819_SetFrequency(Frequency); + BK4819_set_rf_frequency(Frequency, false); // REG_51 // diff --git a/driver/bk4819.h b/driver/bk4819.h index b894f46..acd2652 100644 --- a/driver/bk4819.h +++ b/driver/bk4819.h @@ -77,7 +77,7 @@ void BK4819_SetTailDetection(const uint32_t freq_10Hz); void BK4819_EnableVox(uint16_t Vox1Threshold, uint16_t Vox0Threshold); void BK4819_SetFilterBandwidth(const BK4819_filter_bandwidth_t Bandwidth, const bool weak_no_different); void BK4819_SetupPowerAmplifier(const uint8_t bias, const uint32_t frequency); -void BK4819_SetFrequency(uint32_t Frequency); +void BK4819_set_rf_frequency(const uint32_t frequency, const bool trigger_update); void BK4819_SetupSquelch( uint8_t SquelchOpenRSSIThresh, uint8_t SquelchCloseRSSIThresh, diff --git a/firmware.bin b/firmware.bin index a27eafbe1dd0c41534149d10d73fe09f2dba54e9..d62e32a38f9cbbdd1e56b6345ac9f13c509d3f67 100644 GIT binary patch delta 26466 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 delta 26290 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 13600000 && Frequency < 17400000) return 0; if (Frequency >= 17400000 && Frequency < 35000000) - if (g_setting_200_tx_enable) + if (g_setting_174_tx_enable) return 0; if (Frequency >= 35000000 && Frequency < 40000000) if (g_setting_350_tx_enable && g_setting_350_enable) @@ -160,7 +160,7 @@ int TX_freq_check(const uint32_t Frequency) if (Frequency >= 40000000 && Frequency < 47000000) return 0; if (Frequency >= 47000000 && Frequency <= 60000000) - if (g_setting_500_tx_enable) + if (g_setting_470_tx_enable) return 0; break; diff --git a/functions.c b/functions.c index 1327c07..001337c 100644 --- a/functions.c +++ b/functions.c @@ -43,18 +43,14 @@ function_type_t g_current_function; void FUNCTION_Init(void) { - #ifdef ENABLE_NOAA - if (IS_NOT_NOAA_CHANNEL(g_rx_vfo->channel_save)) - #endif + if (IS_NOT_NOAA_CHANNEL(g_rx_vfo->channel_save)) { g_current_code_type = g_selected_code_type; if (g_css_scan_mode == CSS_SCAN_MODE_OFF) g_current_code_type = g_rx_vfo->am_mode ? CODE_TYPE_NONE : g_rx_vfo->p_rx->code_type; } - #ifdef ENABLE_NOAA - else - g_current_code_type = CODE_TYPE_CONTINUOUS_TONE; - #endif + else + g_current_code_type = CODE_TYPE_CONTINUOUS_TONE; DTMF_clear_RX(); diff --git a/main.c b/main.c index 81062f7..da60626 100644 --- a/main.c +++ b/main.c @@ -95,9 +95,9 @@ void Main(void) RADIO_ConfigureChannel(0, VFO_CONFIGURE_RELOAD); RADIO_ConfigureChannel(1, VFO_CONFIGURE_RELOAD); - RADIO_SelectVfos(); + RADIO_select_vfos(); - RADIO_SetupRegisters(true); + RADIO_setup_registers(true); for (i = 0; i < ARRAY_SIZE(g_battery_voltages); i++) BOARD_ADC_GetBatteryInfo(&g_battery_voltages[i], &g_usb_current); @@ -216,17 +216,17 @@ void Main(void) while (1) { - APP_Update(); + APP_process(); if (g_next_time_slice) { - APP_TimeSlice10ms(); + APP_time_slice_10ms(); g_next_time_slice = false; } if (g_next_time_slice_500ms) { - APP_TimeSlice500ms(); + APP_time_slice_500ms(); g_next_time_slice_500ms = false; } } diff --git a/misc.c b/misc.c index 2c139ae..3fc55d3 100644 --- a/misc.c +++ b/misc.c @@ -46,7 +46,7 @@ const uint8_t key_lock_timeout_500ms = 30000 / 500; // 30 sec const uint8_t key_debounce_10ms = 30 / 10; // 30ms const uint8_t key_long_press_10ms = 300 / 10; // 300ms -const uint8_t key_repeat_10ms = 80 / 10; // 80ms +const uint8_t key_repeat_10ms = 50 / 10; // 50ms const uint16_t scan_freq_css_timeout_10ms = 10000 / 10; // 10 seconds const uint8_t scan_freq_css_delay_10ms = 210 / 10; // 210ms .. don't reduce this @@ -89,9 +89,9 @@ const uint32_t g_default_aes_key[4] = {0x4AA5CC60, 0x0312C const uint8_t g_mic_gain_dB_2[5] = {3, 8, 16, 24, 31}; bool g_setting_350_tx_enable; -bool g_setting_killed; -bool g_setting_200_tx_enable; -bool g_setting_500_tx_enable; +bool g_setting_radio_disabled; +bool g_setting_174_tx_enable; +bool g_setting_470_tx_enable; bool g_setting_350_enable; bool g_setting_tx_enable; uint8_t g_setting_freq_lock; @@ -140,7 +140,6 @@ volatile bool g_schedule_dual_watch = true; volatile uint16_t g_dual_watch_count_down_10ms; volatile bool g_dual_watch_count_down_expired = true; -bool g_dual_watch_active; volatile uint8_t g_serial_config_count_down_500ms; @@ -213,6 +212,7 @@ volatile uint16_t g_flash_light_blink_counter; bool g_flag_end_tx; uint16_t g_low_batteryCountdown; + reception_mode_t g_rx_reception_mode; uint8_t g_scan_next_channel; diff --git a/misc.h b/misc.h index 6908660..5084218 100644 --- a/misc.h +++ b/misc.h @@ -170,9 +170,9 @@ extern const uint16_t scan_pause_delay_in_7_10ms; extern const uint8_t g_mic_gain_dB_2[5]; extern bool g_setting_350_tx_enable; -extern bool g_setting_killed; -extern bool g_setting_200_tx_enable; -extern bool g_setting_500_tx_enable; +extern bool g_setting_radio_disabled; +extern bool g_setting_174_tx_enable; +extern bool g_setting_470_tx_enable; extern bool g_setting_350_enable; extern bool g_setting_tx_enable; extern uint8_t g_setting_freq_lock; @@ -223,7 +223,6 @@ extern volatile bool g_schedule_dual_watch; extern volatile uint16_t g_dual_watch_count_down_10ms; extern volatile bool g_dual_watch_count_down_expired; -extern bool g_dual_watch_active; extern volatile uint8_t g_serial_config_count_down_500ms; diff --git a/radio.c b/radio.c index e82c53b..c77fac1 100644 --- a/radio.c +++ b/radio.c @@ -165,12 +165,9 @@ void RADIO_ConfigureChannel(const unsigned int VFO, const unsigned int configure if (Channel >= NOAA_CHANNEL_FIRST) { RADIO_InitInfo(pRadio, g_eeprom.screen_channel[VFO], NOAA_FREQUENCY_TABLE[Channel - NOAA_CHANNEL_FIRST]); - if (g_eeprom.cross_vfo_rx_tx == CROSS_BAND_OFF) return; - g_eeprom.cross_vfo_rx_tx = CROSS_BAND_OFF; - g_update_status = true; return; } @@ -245,7 +242,7 @@ void RADIO_ConfigureChannel(const unsigned int VFO, const unsigned int configure uint8_t Tmp; uint8_t Data[8]; // t_channel channel; - + // EEPROM_ReadBuffer(Base, channel, sizeof(channel)); // *************** @@ -517,7 +514,7 @@ void RADIO_ConfigureSquelchAndOutputPower(vfo_info_t *pInfo) // my calibration data // - // 1ED0 32 32 32 64 64 64 8C 8C 8C FF FF FF FF FF FF FF .. 50 MHz + // 1ED0 32 32 32 64 64 64 8C 8C 8C FF FF FF FF FF FF FF .. 50 MHz // 1EE0 32 32 32 64 64 64 8C 8C 8C FF FF FF FF FF FF FF .. 108 MHz // 1EF0 5F 5F 5F 69 69 69 91 91 8F FF FF FF FF FF FF FF .. 136 MHz // 1F00 32 32 32 64 64 64 8C 8C 8C FF FF FF FF FF FF FF .. 174 MHz @@ -545,7 +542,7 @@ void RADIO_ConfigureSquelchAndOutputPower(vfo_info_t *pInfo) TX_power[2] /= 3; } #endif - + pInfo->txp_calculated_setting = FREQUENCY_CalculateOutputPower( TX_power[0], TX_power[1], @@ -588,7 +585,7 @@ static void RADIO_SelectCurrentVfo(void) g_current_vfo = (g_eeprom.cross_vfo_rx_tx == CROSS_BAND_OFF) ? g_rx_vfo : &g_eeprom.vfo_info[g_eeprom.tx_vfo]; } -void RADIO_SelectVfos(void) +void RADIO_select_vfos(void) { g_eeprom.tx_vfo = get_TX_VFO(); g_eeprom.rx_vfo = (g_eeprom.cross_vfo_rx_tx == CROSS_BAND_OFF) ? g_eeprom.tx_vfo : (g_eeprom.tx_vfo + 1) & 1u; @@ -599,11 +596,11 @@ void RADIO_SelectVfos(void) RADIO_SelectCurrentVfo(); } -void RADIO_SetupRegisters(bool bSwitchToFunction0) +void RADIO_setup_registers(bool switch_to_function_0) { BK4819_filter_bandwidth_t Bandwidth = g_rx_vfo->channel_bandwidth; - uint16_t InterruptMask; - uint32_t Frequency; + uint16_t interrupt_mask; + uint32_t Frequency; GPIO_ClearBit(&GPIOC->DATA, GPIOC_PIN_AUDIO_PATH); @@ -636,7 +633,7 @@ void RADIO_SetupRegisters(bool bSwitchToFunction0) BK4819_set_GPIO_pin(BK4819_GPIO5_PIN1, false); // ??? while (1) - { // wait for the interrupt to clear ??? + { // wait for the interrupt to clear ? const uint16_t status_bits = BK4819_ReadRegister(BK4819_REG_0C); if ((status_bits & (1u << 0)) == 0) break; @@ -644,20 +641,18 @@ void RADIO_SetupRegisters(bool bSwitchToFunction0) SYSTEM_DelayMs(1); } - BK4819_WriteRegister(BK4819_REG_3F, 0); + BK4819_WriteRegister(BK4819_REG_3F, 0); // disable interrupts // mic gain 0.5dB/step 0 to 31 BK4819_WriteRegister(BK4819_REG_7D, 0xE940 | (g_eeprom.mic_sensitivity_tuning & 0x1f)); #ifdef ENABLE_NOAA - if (IS_NOT_NOAA_CHANNEL(g_rx_vfo->channel_save) || !g_is_noaa_mode) - Frequency = g_rx_vfo->p_rx->frequency; - else + if (IS_NOAA_CHANNEL(g_rx_vfo->channel_save) && g_is_noaa_mode) Frequency = NOAA_FREQUENCY_TABLE[g_noaa_channel]; - #else - Frequency = g_rx_vfo->p_rx->frequency; + else #endif - BK4819_SetFrequency(Frequency); + Frequency = g_rx_vfo->p_rx->frequency; + BK4819_set_rf_frequency(Frequency, false); BK4819_SetupSquelch( g_rx_vfo->squelch_open_rssi_thresh, g_rx_vfo->squelch_close_rssi_thresh, @@ -672,20 +667,19 @@ void RADIO_SetupRegisters(bool bSwitchToFunction0) // AF RX Gain and DAC BK4819_WriteRegister(BK4819_REG_48, 0xB3A8); // 1011 00 111010 1000 - InterruptMask = BK4819_REG_3F_SQUELCH_FOUND | BK4819_REG_3F_SQUELCH_LOST; + interrupt_mask = BK4819_REG_3F_SQUELCH_FOUND | BK4819_REG_3F_SQUELCH_LOST; - #ifdef ENABLE_NOAA - if (IS_NOT_NOAA_CHANNEL(g_rx_vfo->channel_save)) - #endif + if (IS_NOT_NOAA_CHANNEL(g_rx_vfo->channel_save)) { if (g_rx_vfo->am_mode == 0) { // FM uint8_t code_type = g_selected_code_type; - uint8_t Code = g_selected_code; + uint8_t Code = g_selected_code; + if (g_css_scan_mode == CSS_SCAN_MODE_OFF) { code_type = g_rx_vfo->p_rx->code_type; - Code = g_rx_vfo->p_rx->code; + Code = g_rx_vfo->p_rx->code; } switch (code_type) @@ -700,7 +694,7 @@ void RADIO_SetupRegisters(bool bSwitchToFunction0) // BK4819_SetTailDetection(670); // 67Hz //#endif - InterruptMask = BK4819_REG_3F_CxCSS_TAIL | BK4819_REG_3F_SQUELCH_FOUND | BK4819_REG_3F_SQUELCH_LOST; + interrupt_mask = BK4819_REG_3F_CxCSS_TAIL | BK4819_REG_3F_SQUELCH_FOUND | BK4819_REG_3F_SQUELCH_LOST; break; case CODE_TYPE_CONTINUOUS_TONE: @@ -712,24 +706,24 @@ void RADIO_SetupRegisters(bool bSwitchToFunction0) // BK4819_SetTailDetection(CTCSS_OPTIONS[Code]); //#endif - InterruptMask = 0 - | BK4819_REG_3F_CxCSS_TAIL - | BK4819_REG_3F_CTCSS_FOUND - | BK4819_REG_3F_CTCSS_LOST - | BK4819_REG_3F_SQUELCH_FOUND - | BK4819_REG_3F_SQUELCH_LOST; + interrupt_mask = + BK4819_REG_3F_CxCSS_TAIL | + BK4819_REG_3F_CTCSS_FOUND | + BK4819_REG_3F_CTCSS_LOST | + BK4819_REG_3F_SQUELCH_FOUND | + BK4819_REG_3F_SQUELCH_LOST; break; case CODE_TYPE_DIGITAL: case CODE_TYPE_REVERSE_DIGITAL: BK4819_SetCDCSSCodeWord(DCS_GetGolayCodeWord(code_type, Code)); - InterruptMask = 0 - | BK4819_REG_3F_CxCSS_TAIL - | BK4819_REG_3F_CDCSS_FOUND - | BK4819_REG_3F_CDCSS_LOST - | BK4819_REG_3F_SQUELCH_FOUND - | BK4819_REG_3F_SQUELCH_LOST; + interrupt_mask = + BK4819_REG_3F_CxCSS_TAIL | + BK4819_REG_3F_CDCSS_FOUND | + BK4819_REG_3F_CDCSS_LOST | + BK4819_REG_3F_SQUELCH_FOUND | + BK4819_REG_3F_SQUELCH_LOST; break; } @@ -743,55 +737,50 @@ void RADIO_SetupRegisters(bool bSwitchToFunction0) else { BK4819_SetCTCSSFrequency(2625); - InterruptMask = 0 - | BK4819_REG_3F_CTCSS_FOUND - | BK4819_REG_3F_CTCSS_LOST - | BK4819_REG_3F_SQUELCH_FOUND - | BK4819_REG_3F_SQUELCH_LOST; + interrupt_mask = + BK4819_REG_3F_CTCSS_FOUND | + BK4819_REG_3F_CTCSS_LOST | + BK4819_REG_3F_SQUELCH_FOUND | + BK4819_REG_3F_SQUELCH_LOST; } #endif #ifdef ENABLE_VOX - #ifdef ENABLE_NOAA + if ( #ifdef ENABLE_FMRADIO - if (g_eeprom.vox_switch && !g_fm_radio_mode && IS_NOT_NOAA_CHANNEL(g_current_vfo->channel_save) && g_current_vfo->am_mode == 0) - #else - if (g_eeprom.vox_switch && IS_NOT_NOAA_CHANNEL(g_current_vfo->channel_save) && g_current_vfo->am_mode == 0) + !g_fm_radio_mode && #endif - #else - #ifdef ENABLE_FMRADIO - if (g_eeprom.vox_switch && !g_fm_radio_mode && g_current_vfo->am_mode == 0) - #else - if (g_eeprom.vox_switch && g_current_vfo->am_mode == 0) - #endif - #endif + g_eeprom.vox_switch && + !g_fm_radio_mode && + IS_NOT_NOAA_CHANNEL(g_current_vfo->channel_save) && + g_current_vfo->am_mode == 0) { BK4819_EnableVox(g_eeprom.vox1_threshold, g_eeprom.vox0_threshold); - InterruptMask |= BK4819_REG_3F_VOX_FOUND | BK4819_REG_3F_VOX_LOST; + interrupt_mask |= BK4819_REG_3F_VOX_FOUND | BK4819_REG_3F_VOX_LOST; } else #endif - BK4819_DisableVox(); + BK4819_DisableVox(); // RX expander BK4819_SetCompander((g_rx_vfo->am_mode == 0 && g_rx_vfo->compander >= 2) ? g_rx_vfo->compander : 0); #if 0 - if (!g_rx_vfo->dtmf_decoding_enable && !g_setting_killed) + if (!g_rx_vfo->dtmf_decoding_enable && !g_setting_radio_disabled) { BK4819_DisableDTMF(); } else { BK4819_EnableDTMF(); - InterruptMask |= BK4819_REG_3F_DTMF_5TONE_FOUND; + interrupt_mask |= BK4819_REG_3F_DTMF_5TONE_FOUND; } #else if (g_current_function != FUNCTION_TRANSMIT) { BK4819_DisableDTMF(); BK4819_EnableDTMF(); - InterruptMask |= BK4819_REG_3F_DTMF_5TONE_FOUND; + interrupt_mask |= BK4819_REG_3F_DTMF_5TONE_FOUND; } else { @@ -800,11 +789,11 @@ void RADIO_SetupRegisters(bool bSwitchToFunction0) #endif // enable/disable BK4819 selected interrupts - BK4819_WriteRegister(BK4819_REG_3F, InterruptMask); + BK4819_WriteRegister(BK4819_REG_3F, interrupt_mask); FUNCTION_Init(); - if (bSwitchToFunction0) + if (switch_to_function_0) FUNCTION_Select(FUNCTION_FOREGROUND); } @@ -883,7 +872,7 @@ void RADIO_enableTX(const bool fsk_tx) #pragma GCC diagnostic pop - BK4819_SetFrequency(g_current_vfo->p_tx->frequency); + BK4819_set_rf_frequency(g_current_vfo->p_tx->frequency, false); BK4819_SetCompander((!fsk_tx && g_rx_vfo->am_mode == 0 && (g_rx_vfo->compander == 1 || g_rx_vfo->compander >= 3)) ? g_rx_vfo->compander : 0); BK4819_PrepareTransmit(); BK4819_PickRXFilterPathBasedOnFrequency(g_current_vfo->p_tx->frequency); @@ -906,11 +895,11 @@ void RADIO_enableTX(const bool fsk_tx) case CODE_TYPE_NONE: BK4819_ExitSubAu(); break; - + case CODE_TYPE_CONTINUOUS_TONE: BK4819_SetCTCSSFrequency(CTCSS_OPTIONS[g_current_vfo->p_tx->code]); break; - + case CODE_TYPE_DIGITAL: case CODE_TYPE_REVERSE_DIGITAL: BK4819_SetCDCSSCodeWord(DCS_GetGolayCodeWord(g_current_vfo->p_tx->code_type, g_current_vfo->p_tx->code)); @@ -959,29 +948,27 @@ void RADIO_PrepareTX(void) { // dual-RX is enabled g_dual_watch_count_down_10ms = dual_watch_count_after_tx_10ms; - g_schedule_dual_watch = false; + g_schedule_dual_watch = false; #if 0 if (g_rx_vfo_is_active) { // use the TX vfo - g_eeprom.rx_vfo = g_eeprom.tx_vfo; - g_rx_vfo = &g_eeprom.vfo_info[g_eeprom.tx_vfo]; + g_eeprom.rx_vfo = g_eeprom.tx_vfo; + g_rx_vfo = &g_eeprom.vfo_info[g_eeprom.tx_vfo]; g_rx_vfo_is_active = false; } g_current_vfo = g_rx_vfo; #else if (!g_rx_vfo_is_active) { // use the current RX vfo - g_eeprom.rx_vfo = g_eeprom.tx_vfo; - g_rx_vfo = &g_eeprom.vfo_info[g_eeprom.tx_vfo]; + g_eeprom.rx_vfo = g_eeprom.tx_vfo; + g_rx_vfo = &g_eeprom.vfo_info[g_eeprom.tx_vfo]; g_rx_vfo_is_active = true; } g_current_vfo = g_rx_vfo; #endif - - // let the user see that DW is not active '><' symbol - g_dual_watch_active = false; - g_update_status = true; + + g_update_status = true; } RADIO_SelectCurrentVfo(); @@ -1033,8 +1020,8 @@ void RADIO_PrepareTX(void) { if (g_dtmf_call_mode == DTMF_CALL_MODE_DTMF) { - g_dtmf_is_tx = true; - g_dtmf_call_state = DTMF_CALL_STATE_NONE; + g_dtmf_is_tx = true; + g_dtmf_call_state = DTMF_CALL_STATE_NONE; g_dtmf_tx_stop_count_down_500ms = dtmf_txstop_countdown_500ms; } else @@ -1046,7 +1033,7 @@ void RADIO_PrepareTX(void) FUNCTION_Select(FUNCTION_TRANSMIT); - g_tx_timer_count_down_500ms = 0; // no timeout + g_tx_timer_count_down_500ms = 0; // no timeout #if defined(ENABLE_ALARM) || defined(ENABLE_TX1750) if (g_alarm_state == ALARM_STATE_OFF) @@ -1060,11 +1047,11 @@ void RADIO_PrepareTX(void) else g_tx_timer_count_down_500ms = 120 * 15; // 15 minutes } - g_tx_timeout_reached = false; - g_flag_end_tx = false; - g_rtte_count_down = 0; - g_dtmf_reply_state = DTMF_REPLY_NONE; + g_tx_timeout_reached = false; + g_flag_end_tx = false; + g_rtte_count_down = 0; + g_dtmf_reply_state = DTMF_REPLY_NONE; } void RADIO_EnableCxCSS(void) @@ -1095,7 +1082,7 @@ void RADIO_PrepareCssTX(void) SYSTEM_DelayMs(200); RADIO_EnableCxCSS(); - RADIO_SetupRegisters(true); + RADIO_setup_registers(true); } void RADIO_SendEndOfTransmission(void) diff --git a/radio.h b/radio.h index a66dd42..c40b4a8 100644 --- a/radio.h +++ b/radio.h @@ -132,8 +132,8 @@ void RADIO_InitInfo(vfo_info_t *pInfo, const uint8_t ChannelSave, const uint void RADIO_ConfigureChannel(const unsigned int VFO, const unsigned int configure); void RADIO_ConfigureSquelchAndOutputPower(vfo_info_t *pInfo); void RADIO_ApplyOffset(vfo_info_t *pInfo); -void RADIO_SelectVfos(void); -void RADIO_SetupRegisters(bool bSwitchToFunction0); +void RADIO_select_vfos(void); +void RADIO_setup_registers(bool switch_to_function_0); #ifdef ENABLE_NOAA void RADIO_ConfigureNOAA(void); #endif diff --git a/settings.c b/settings.c index ef4a6bc..5429684 100644 --- a/settings.c +++ b/settings.c @@ -310,9 +310,9 @@ void SETTINGS_SaveSettings(void) memset(State, 0xFF, sizeof(State)); State[0] = g_setting_freq_lock; State[1] = g_setting_350_tx_enable; - State[2] = g_setting_killed; - State[3] = g_setting_200_tx_enable; - State[4] = g_setting_500_tx_enable; + State[2] = g_setting_radio_disabled; + State[3] = g_setting_174_tx_enable; + State[4] = g_setting_470_tx_enable; State[5] = g_setting_350_enable; State[6] = g_setting_scramble_enable; if (!g_setting_tx_enable) State[7] &= ~(1u << 0); @@ -335,10 +335,8 @@ void SETTINGS_SaveChannel(uint8_t Channel, uint8_t VFO, const vfo_info_t *pVFO, uint16_t OffsetVFO = OffsetMR; uint8_t State[8]; - #ifdef ENABLE_NOAA - if (IS_NOAA_CHANNEL(Channel)) - return; - #endif + if (IS_NOAA_CHANNEL(Channel)) + return; if (IS_FREQ_CHANNEL(Channel)) { // it's a VFO @@ -374,11 +372,11 @@ void SETTINGS_SaveChannel(uint8_t Channel, uint8_t VFO, const vfo_info_t *pVFO, SETTINGS_UpdateChannel(Channel, pVFO, true); if (Channel > USER_CHANNEL_LAST) - return; // it's not a user channel + return; // it's not a user memory channel #ifndef ENABLE_KEEP_MEM_NAME // clear/reset the channel name - memset(&State, 0x00, sizeof(State)); + memset(&State, 0, sizeof(State)); EEPROM_WriteBuffer(0x0F50 + OffsetMR, State); EEPROM_WriteBuffer(0x0F58 + OffsetMR, State); #else @@ -386,7 +384,7 @@ void SETTINGS_SaveChannel(uint8_t Channel, uint8_t VFO, const vfo_info_t *pVFO, { // save the channel name memmove(State, pVFO->name + 0, 8); EEPROM_WriteBuffer(0x0F50 + OffsetMR, State); - memset(State, 0x00, sizeof(State)); + memset(State, 0, sizeof(State)); memmove(State, pVFO->name + 8, 2); EEPROM_WriteBuffer(0x0F58 + OffsetMR, State); } @@ -399,10 +397,8 @@ void SETTINGS_UpdateChannel(uint8_t Channel, const vfo_info_t *pVFO, bool keep) uint8_t Attributes = 0xFF; // default attributes uint16_t Offset = 0x0D60 + (Channel & ~7u); - #ifdef ENABLE_NOAA - if (IS_NOAA_CHANNEL(Channel)) - return; - #endif + if (IS_NOAA_CHANNEL(Channel)) + return; Attributes &= (uint8_t)(~USER_CH_COMPAND); // default to '0' = compander disabled @@ -412,7 +408,7 @@ void SETTINGS_UpdateChannel(uint8_t Channel, const vfo_info_t *pVFO, bool keep) { Attributes = (pVFO->scanlist_1_participation << 7) | (pVFO->scanlist_2_participation << 6) | (pVFO->compander << 4) | (pVFO->band << 0); if (State[Channel & 7u] == Attributes) - return; // no change in the attributes + return; // no change in the attributes .. don't place wear on the eeprom } State[Channel & 7u] = Attributes; @@ -423,13 +419,12 @@ void SETTINGS_UpdateChannel(uint8_t Channel, const vfo_info_t *pVFO, bool keep) // #ifndef ENABLE_KEEP_MEM_NAME if (Channel <= USER_CHANNEL_LAST) - { // it's a memory channel + { // user memory channel const uint16_t OffsetMR = Channel * 16; if (!keep) { // clear/reset the channel name - //memset(&State, 0xFF, sizeof(State)); - memset(&State, 0x00, sizeof(State)); // follow the QS way + memset(&State, 0, sizeof(State)); EEPROM_WriteBuffer(0x0F50 + OffsetMR, State); EEPROM_WriteBuffer(0x0F58 + OffsetMR, State); } @@ -437,8 +432,7 @@ void SETTINGS_UpdateChannel(uint8_t Channel, const vfo_info_t *pVFO, bool keep) // { // update the channel name // memmove(State, pVFO->name + 0, 8); // EEPROM_WriteBuffer(0x0F50 + OffsetMR, State); -// //memset(State, 0xFF, sizeof(State)); -// memset(State, 0x00, sizeof(State)); // follow the QS way +// memset(State, 0, sizeof(State)); // memmove(State, pVFO->name + 8, 2); // EEPROM_WriteBuffer(0x0F58 + OffsetMR, State); // } diff --git a/settings.h b/settings.h index ae79ee9..b714b37 100644 --- a/settings.h +++ b/settings.h @@ -178,39 +178,39 @@ typedef struct { // 0x1E00 struct { - uint8_t open_rssi_thresh[10]; - uint8_t unused1[6]; - uint8_t close_rssi_thresh[10]; - uint8_t unused2[6]; - uint8_t open_noise_thresh[10]; - uint8_t unused3[6]; - uint8_t close_noise_thresh[10]; - uint8_t unused4[6]; - uint8_t open_glitch_thresh[10]; - uint8_t unused5[6]; - uint8_t close_glitch_thresh[10]; - uint8_t unused6[6]; - } __attribute__((packed)) squelch_band_4567[6]; + uint8_t open_rssi_thresh[10]; // + uint8_t unused1[6]; // 0xff's + uint8_t close_rssi_thresh[10]; // + uint8_t unused2[6]; // 0xff's + uint8_t open_noise_thresh[10]; // + uint8_t unused3[6]; // 0xff's + uint8_t close_noise_thresh[10]; // + uint8_t unused4[6]; // 0xff's + uint8_t open_glitch_thresh[10]; // + uint8_t unused5[6]; // 0xff's + uint8_t close_glitch_thresh[10]; // + uint8_t unused6[6]; // 0xff's + } __attribute__((packed)) squelch_band_4567[6]; // // 0x1E60 struct { - uint8_t open_rssi_thresh[10]; - uint8_t unused1[6]; - uint8_t close_rssi_thresh[10]; - uint8_t unused2[6]; - uint8_t open_noise_thresh[10]; - uint8_t unused3[6]; - uint8_t close_noise_thresh[10]; - uint8_t unused4[6]; - uint8_t open_glitch_thresh[10]; - uint8_t unused5[6]; - uint8_t close_glitch_thresh[10]; - uint8_t unused6[6]; - } __attribute__((packed)) squelch_band_123[6]; + uint8_t open_rssi_thresh[10]; // + uint8_t unused1[6]; // 0xff's + uint8_t close_rssi_thresh[10]; // + uint8_t unused2[6]; // 0xff's + uint8_t open_noise_thresh[10]; // + uint8_t unused3[6]; // 0xff's + uint8_t close_noise_thresh[10]; // + uint8_t unused4[6]; // 0xff's + uint8_t open_glitch_thresh[10]; // + uint8_t unused5[6]; // 0xff's + uint8_t close_glitch_thresh[10]; // + uint8_t unused6[6]; // 0xff's + } __attribute__((packed)) squelch_band_123[6]; // // 0x1EC0 - uint16_t rssi_band_4567[4]; // - uint16_t rssi_band_123[4]; // + uint16_t rssi_band_4567[4]; // RSSI bargraph thresholds .. (dBm + 160) * 2 + uint16_t rssi_band_123[4]; // RSSI bargraph thresholds .. (dBm + 160) * 2 // 0x1ED0 struct @@ -218,18 +218,18 @@ typedef struct { uint8_t low[3]; // uint8_t mid[3]; // uint8_t high[3]; // - uint8_t unused[7]; // + uint8_t unused[7]; // 0xff's } tx_band_power[7]; // // 0x1F40 uint16_t battery[6]; // - uint8_t unused1[4]; // + uint8_t unused1[4]; // 0xff's // 0x1F50 struct { uint16_t threshold[10]; // - uint8_t unused[4]; // + uint8_t unused[4]; // 0xff's } __attribute__((packed)) vox[2]; // // 0x1F80 @@ -241,7 +241,7 @@ typedef struct { uint8_t volume_gain; // uint8_t dac_gain; // - uint8_t unused5[8 * 10]; // + uint8_t unused5[8 * 10]; // 0xff's } __attribute__((packed)) t_calibration; @@ -267,20 +267,20 @@ typedef struct { // 0x0D60 struct { // these channel attribute settings could have been in the t_channel structure ! uint8_t band:4; // why do QS have these 4 bits ? .. band can/is computed from the frequency - uint8_t unused:2; // + uint8_t unused:2; // 0's ? // uint8_t compander:2; // smoved this to the t_channel structure uint8_t scanlist2:1; // set if is in scan list 2 uint8_t scanlist1:1; // set if is in scan list 1 } __attribute__((packed)) channel_attr[200]; // - uint8_t unused1[8]; // + uint8_t unused1[8]; // 0xff's // 0x0E30 - uint8_t unused2[16]; // + uint8_t unused2[16]; // 0xff's // 0x0E40 uint16_t fm_channel[20]; // - uint8_t unused3[8]; // + uint8_t unused3[8]; // 0xff's // 0x0E70 uint8_t call1; // @@ -291,7 +291,11 @@ typedef struct { uint8_t vox_switch; // uint8_t vox_level; // uint8_t mic_sensitivity; // - uint8_t lcd_contrast; // 1of11 + #if 1 + uint8_t lcd_contrast; // 1of11 + #else + uint8_t unused4; // 0xff's + #endif uint8_t channel_display_mode; // uint8_t cross_vfo; // uint8_t battery_save; // @@ -312,7 +316,7 @@ typedef struct { uint8_t fm_selected_frequency; // uint8_t fm_selected_channel; // uint8_t fm_is_channel_mode; // - uint8_t unused5[5]; // + uint8_t unused5[5]; // 0xff's // 0x0E90 uint8_t beep_control; // @@ -324,11 +328,11 @@ typedef struct { uint8_t auto_key_lock; // uint8_t display_mode; // uint32_t power_on_password; // - uint8_t unused6[4]; // + uint8_t unused6[4]; // 0xff's // 0x0EA0 uint8_t voice_prompt; // - uint8_t unused7[7]; // + uint8_t unused7[7]; // 0xff's uint8_t alarm_mode; // uint8_t roger_mode; // uint8_t repeater_tail_tone_elimination; // rp_ste @@ -336,7 +340,7 @@ typedef struct { #ifdef ENABLE_AIRCOPY uint32_t air_copy_freq; // 1of11 #else - uint8_t unused8[4]; // + uint8_t unused8[4]; // 0xff's #endif // 0x0EB0 @@ -355,7 +359,7 @@ typedef struct { uint8_t dtmf_code_time; // uint8_t dtmf_code_interval; // uint8_t dtmf_permit_kill; // - uint8_t unused9[5]; // + uint8_t unused9[5]; // 0xff's // 0x0EE0 uint8_t dtmf_ani_id[8]; // @@ -372,10 +376,10 @@ typedef struct { uint8_t priority2_enable; // uint8_t priority2_channel1; // uint8_t priority2_channel2; // - uint8_t unused10; // + uint8_t unused10; // 0xff's // 0x0F20 - uint8_t unused11[8]; // + uint8_t unused11[8]; // 0xff's // 0x0F30 uint8_t aes_key[16]; // disabled = all 0xff @@ -383,14 +387,14 @@ typedef struct { // 0x0F40 uint8_t freq_lock; // uint8_t enable_tx_350; // 350MHz ~ 400MHz - uint8_t killed; // - uint8_t enable_tx_200; // - uint8_t enable_tx_500; // - uint8_t enable_350; // - uint8_t enable_scrambler; // + uint8_t radio_disabled; // 0 = not radio is not disabled + uint8_t enable_tx_200; // 174MHz ~ 350MHz + uint8_t enable_tx_470; // >= 470MHz disabled + uint8_t enable_350; // 0 = 350HMz ~ 400MHz RX/TX disabled + uint8_t enable_scrambler; // 0 = scrambler disabled, 1 = enabled #if 0 // QS - uint8_t unused12[9]; // + uint8_t unused12[9]; // 0xff's #else // 1of11 uint8_t tx_enable:1; // 0 = completely disable TX, 1 = allow TX @@ -400,14 +404,17 @@ typedef struct { uint8_t am_fix:1; // 1 = RX AM fix uint8_t backlight_on_tx_rx:2; // 0 = no backlight when TX/RX, 1 = when TX, 2 = when RX, 3 = both RX/TX - uint8_t unused12[8]; // + uint8_t unused12[8]; // 0xff's #endif // 0x0F50 - char channel_name[200][16]; // each channels name text (max 10 chars used per channel) - + struct { + char name[10]; + uint8_t unused[6]; // 0xff's + } __attribute__((packed)) channel_name[200]; + // 0x1BD0 - uint8_t unused13[16 * 3]; // free to use + uint8_t unused13[16 * 3]; // 0xff's .. free to use // 0x1C00 struct { diff --git a/ui/main.c b/ui/main.c index 13f44c7..962d1d0 100644 --- a/ui/main.c +++ b/ui/main.c @@ -283,7 +283,7 @@ void UI_drawBars(uint8_t *p, const unsigned int level) } #endif -void UI_UpdateRSSI(const int16_t rssi, const int vfo) +void UI_update_rssi(const int16_t rssi, const int vfo) { #ifdef ENABLE_RSSI_BAR @@ -809,7 +809,7 @@ void UI_DisplayMain(void) } // show the DTMF decoding symbol - if (g_eeprom.vfo_info[vfo_num].dtmf_decoding_enable || g_setting_killed) + if (g_eeprom.vfo_info[vfo_num].dtmf_decoding_enable || g_setting_radio_disabled) UI_PrintStringSmall("DTMF", LCD_WIDTH + 78, 0, line + 1); // show the audio scramble symbol diff --git a/ui/main.h b/ui/main.h index a32c855..c871fae 100644 --- a/ui/main.h +++ b/ui/main.h @@ -37,7 +37,7 @@ extern center_line_t center_line; #ifdef ENABLE_AUDIO_BAR bool UI_DisplayAudioBar(const bool now); #endif -void UI_UpdateRSSI(const int16_t rssi, const int vfo); +void UI_update_rssi(const int16_t rssi, const int vfo); void UI_DisplayMain(void); #endif diff --git a/ui/menu.c b/ui/menu.c index 05794cc..981f66e 100644 --- a/ui/menu.c +++ b/ui/menu.c @@ -130,9 +130,9 @@ const t_menu_item g_menu_list[] = // 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 200", VOICE_ID_INVALID, MENU_200TX }, // was "200TX" + {"Tx 174", VOICE_ID_INVALID, MENU_174TX }, // was "200TX" {"Tx 350", VOICE_ID_INVALID, MENU_350TX }, // was "350TX" - {"Tx 500", VOICE_ID_INVALID, MENU_500TX }, // was "500TX" + {"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 @@ -752,10 +752,23 @@ void UI_DisplayMenu(void) #endif case MENU_350TX: - case MENU_200TX: - case MENU_500TX: + 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"); + strcat(String, g_sub_menu_DIS_EN[g_sub_menu_selection]); + break; + + case MENU_470TX: + strcpy(String, "470 ~ 600\n"); + strcat(String, g_sub_menu_DIS_EN[g_sub_menu_selection]); + break; + case MENU_350EN: - strcpy(String, g_sub_menu_DIS_EN[g_sub_menu_selection]); + strcpy(String, "350 ~ 400\n"); + strcat(String, g_sub_menu_DIS_EN[g_sub_menu_selection]); break; case MENU_SCREN: diff --git a/ui/menu.h b/ui/menu.h index 1b5bd8c..7f9dd99 100644 --- a/ui/menu.h +++ b/ui/menu.h @@ -124,9 +124,9 @@ enum // items after here are normally hidden MENU_FREQ_LOCK, - MENU_200TX, + MENU_174TX, MENU_350TX, - MENU_500TX, + MENU_470TX, MENU_350EN, MENU_SCREN, diff --git a/ui/status.c b/ui/status.c index 0b1cecf..f595333 100644 --- a/ui/status.c +++ b/ui/status.c @@ -79,7 +79,7 @@ void UI_DisplayStatus(const bool test_display) // hmmm, what to put in it's place #endif - if (g_setting_killed) + if (g_setting_radio_disabled) { memset(line + x, 0xFF, 10); x1 = x + 10; @@ -131,10 +131,17 @@ void UI_DisplayStatus(const bool test_display) // DUAL-WATCH indicator if (g_eeprom.dual_watch != DUAL_WATCH_OFF || test_display) { - if (g_dual_watch_active || test_display) - memmove(line + x, BITMAP_TDR1, sizeof(BITMAP_TDR1)); + if (g_scan_state_dir == SCAN_STATE_DIR_OFF || + g_squelch_lost || + g_current_function == FUNCTION_INCOMING || + g_current_function == FUNCTION_MONITOR || + g_screen_to_display == DISPLAY_SEARCH || + test_display) + { + memmove(line + x, BITMAP_TDR1, sizeof(BITMAP_TDR1)); // dual-watch is paused + } else - memmove(line + x, BITMAP_TDR2, sizeof(BITMAP_TDR2)); + memmove(line + x, BITMAP_TDR2, sizeof(BITMAP_TDR2)); // dual-watch is running } x += sizeof(BITMAP_TDR1);