From 7f7c9490ebb0564010b6fe1732c14527fcc24b4f Mon Sep 17 00:00:00 2001 From: OneOfEleven Date: Fri, 13 Oct 2023 15:12:32 +0100 Subject: [PATCH] Fix F+3 and F+* search freq step size when saving result --- app/action.c | 22 +-- app/aircopy.c | 2 +- app/app.c | 338 +++++++++++++++++++++++++------------------- app/app.h | 1 + app/dtmf.c | 2 +- app/generic.c | 12 +- app/main.c | 76 +++++----- app/menu.c | 2 +- app/scanner.c | 325 ++++++++++++++++++++---------------------- app/scanner.h | 75 +++++----- app/spectrum.c | 4 +- app/uart.c | 4 +- board.c | 49 ++++++- board.h | 24 ++-- firmware.bin | Bin 59732 -> 59752 bytes firmware.packed.bin | Bin 59750 -> 59770 bytes frequencies.c | 16 +-- frequencies.h | 40 +++--- functions.c | 8 +- misc.c | 25 ++-- misc.h | 31 ++-- radio.c | 61 ++++---- radio.h | 8 +- scheduler.c | 8 +- ui/main.c | 6 +- ui/scanner.c | 70 ++++----- ui/scanner.h | 2 +- ui/status.c | 4 +- ui/ui.c | 6 +- ui/ui.h | 2 +- 30 files changed, 652 insertions(+), 571 deletions(-) diff --git a/app/action.c b/app/action.c index b747c47..19f937f 100644 --- a/app/action.c +++ b/app/action.c @@ -88,10 +88,10 @@ void ACTION_Monitor(void) g_monitor_enabled = false; - if (g_scan_state_dir != SCAN_OFF) + if (g_scan_state_dir != SCAN_STATE_DIR_OFF) { g_scan_pause_delay_in_10ms = scan_pause_delay_in_1_10ms; - g_schedule_scan_listen = false; + g_scan_schedule_scan_listen = false; g_scan_pause_mode = true; } @@ -171,7 +171,7 @@ void ACTION_Scan(bool bRestart) } #endif - if (g_screen_to_display != DISPLAY_SCANNER) + if (g_screen_to_display != DISPLAY_SEARCH) { // not scanning g_monitor_enabled = false; @@ -189,10 +189,10 @@ void ACTION_Scan(bool bRestart) { GUI_SelectNextDisplay(DISPLAY_MAIN); - if (g_scan_state_dir != SCAN_OFF) + if (g_scan_state_dir != SCAN_STATE_DIR_OFF) { // already scanning - if (g_next_channel <= USER_CHANNEL_LAST) + if (g_scan_next_channel <= USER_CHANNEL_LAST) { // channel mode // keep scanning but toggle between scan lists @@ -201,14 +201,14 @@ void ACTION_Scan(bool bRestart) // jump to the next channel CHANNEL_Next(true, g_scan_state_dir); g_scan_pause_delay_in_10ms = 1; - g_schedule_scan_listen = false; + g_scan_schedule_scan_listen = false; g_update_status = true; } else { // stop scanning - SCANNER_Stop(); + SCAN_Stop(); #ifdef ENABLE_VOICE g_another_voice_id = VOICE_ID_SCANNING_STOP; @@ -218,7 +218,7 @@ void ACTION_Scan(bool bRestart) else { // start scanning - CHANNEL_Next(true, SCAN_FWD); + CHANNEL_Next(true, SCAN_STATE_DIR_FORWARD); #ifdef ENABLE_VOICE AUDIO_SetVoiceID(0, VOICE_ID_SCANNING_BEGIN); @@ -236,14 +236,14 @@ void ACTION_Scan(bool bRestart) } else // if (!bRestart) - if (!bRestart && g_next_channel <= USER_CHANNEL_LAST) + 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_schedule_scan_listen = false; + g_scan_schedule_scan_listen = false; g_update_status = true; } @@ -251,7 +251,7 @@ void ACTION_Scan(bool bRestart) { // stop scanning g_monitor_enabled = false; - SCANNER_Stop(); + SCAN_Stop(); #ifdef ENABLE_VOICE g_another_voice_id = VOICE_ID_SCANNING_STOP; diff --git a/app/aircopy.c b/app/aircopy.c index 7aa5505..dd6301b 100644 --- a/app/aircopy.c +++ b/app/aircopy.c @@ -84,7 +84,7 @@ void AIRCOPY_start_FSK_tx(const uint8_t request_packet) // TX the packet RADIO_SetTxParameters(); - BK4819_SetupPowerAmplifier(0, g_current_vfo->pTX->frequency); // VERY low TX power + BK4819_SetupPowerAmplifier(0, g_current_vfo->p_tx->frequency); // VERY low TX power // turn the RED LED on BK4819_set_GPIO_pin(BK4819_GPIO1_PIN29_RED, true); diff --git a/app/app.c b/app/app.c index 6b31e79..f4bee7e 100644 --- a/app/app.c +++ b/app/app.c @@ -97,14 +97,14 @@ static void APP_CheckForIncoming(void) // squelch is open - if (g_scan_state_dir == SCAN_OFF) + if (g_scan_state_dir == SCAN_STATE_DIR_OFF) { // not RF scanning if (g_css_scan_mode != CSS_SCAN_MODE_OFF && g_rx_reception_mode == RX_MODE_NONE) { // CTCSS/DTS scanning g_scan_pause_delay_in_10ms = scan_pause_delay_in_5_10ms; - g_schedule_scan_listen = false; + g_scan_schedule_scan_listen = false; g_rx_reception_mode = RX_MODE_DETECTED; } @@ -169,7 +169,7 @@ static void APP_CheckForIncoming(void) } g_scan_pause_delay_in_10ms = scan_pause_delay_in_3_10ms; - g_schedule_scan_listen = false; + g_scan_schedule_scan_listen = false; } g_rx_reception_mode = RX_MODE_DETECTED; @@ -202,7 +202,7 @@ static void APP_HandleIncoming(void) return; } - flag = (g_scan_state_dir == SCAN_OFF && g_current_code_type == CODE_TYPE_NONE); + flag = (g_scan_state_dir == SCAN_STATE_DIR_OFF && g_current_code_type == CODE_TYPE_NONE); #ifdef ENABLE_NOAA if (IS_NOAA_CHANNEL(g_rx_vfo->channel_save) && g_noaa_count_down_10ms > 0) @@ -212,13 +212,13 @@ static void APP_HandleIncoming(void) } #endif - if (g_CTCSS_lost && g_current_code_type == CODE_TYPE_CONTINUOUS_TONE) + if (g_ctcss_lost && g_current_code_type == CODE_TYPE_CONTINUOUS_TONE) { flag = true; g_found_CTCSS = false; } - if (g_CDCSS_lost && g_CDCSS_code_type == CDCSS_POSITIVE_CODE && (g_current_code_type == CODE_TYPE_DIGITAL || g_current_code_type == CODE_TYPE_REVERSE_DIGITAL)) + if (g_cdcss_lost && g_cdcss_code_type == CDCSS_POSITIVE_CODE && (g_current_code_type == CODE_TYPE_DIGITAL || g_current_code_type == CODE_TYPE_REVERSE_DIGITAL)) { g_found_CDCSS = false; } @@ -226,7 +226,7 @@ static void APP_HandleIncoming(void) if (!flag) return; - if (g_scan_state_dir == SCAN_OFF && g_css_scan_mode == CSS_SCAN_MODE_OFF) + 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) { // DTMF DCD is enabled @@ -270,7 +270,7 @@ static void APP_HandleReceive(void) goto Skip; } - if (g_scan_state_dir != SCAN_OFF && IS_FREQ_CHANNEL(g_next_channel)) + if (g_scan_state_dir != SCAN_STATE_DIR_OFF && IS_FREQ_CHANNEL(g_scan_next_channel)) { if (g_squelch_lost) return; @@ -320,16 +320,16 @@ static void APP_HandleReceive(void) case CODE_TYPE_NONE: if (g_eeprom.squelch_level) { - if (g_CxCSS_tail_found) + if (g_cxcss_tail_found) { Mode = END_OF_RX_MODE_TTE; - g_CxCSS_tail_found = false; + g_cxcss_tail_found = false; } } break; case CODE_TYPE_CONTINUOUS_TONE: - if (g_CTCSS_lost) + if (g_ctcss_lost) { g_found_CTCSS = false; } @@ -340,16 +340,16 @@ static void APP_HandleReceive(void) g_found_CTCSS_count_down_10ms = 100; // 1 sec } - if (g_CxCSS_tail_found) + if (g_cxcss_tail_found) { Mode = END_OF_RX_MODE_TTE; - g_CxCSS_tail_found = false; + g_cxcss_tail_found = false; } break; case CODE_TYPE_DIGITAL: case CODE_TYPE_REVERSE_DIGITAL: - if (g_CDCSS_lost && g_CDCSS_code_type == CDCSS_POSITIVE_CODE) + if (g_cdcss_lost && g_cdcss_code_type == CDCSS_POSITIVE_CODE) { g_found_CDCSS = false; } @@ -360,12 +360,12 @@ static void APP_HandleReceive(void) g_found_CDCSS_count_down_10ms = 100; // 1 sec } - if (g_CxCSS_tail_found) + if (g_cxcss_tail_found) { if (BK4819_GetCTCType() == 1) Mode = END_OF_RX_MODE_TTE; - g_CxCSS_tail_found = false; + g_cxcss_tail_found = false; } break; @@ -405,7 +405,7 @@ Skip: g_update_display = true; - if (g_scan_state_dir != SCAN_OFF) + if (g_scan_state_dir != SCAN_STATE_DIR_OFF) { switch (g_eeprom.scan_resume_mode) { @@ -414,11 +414,11 @@ Skip: case SCAN_RESUME_CO: g_scan_pause_delay_in_10ms = scan_pause_delay_in_7_10ms; - g_schedule_scan_listen = false; + g_scan_schedule_scan_listen = false; break; case SCAN_RESUME_SE: - SCANNER_Stop(); + SCAN_Stop(); break; } } @@ -494,7 +494,7 @@ void APP_StartListening(function_type_t Function, const bool reset_am_fix) if (g_setting_backlight_on_tx_rx >= 2) backlight_turn_on(); - if (g_scan_state_dir != SCAN_OFF) + if (g_scan_state_dir != SCAN_STATE_DIR_OFF) { switch (g_eeprom.scan_resume_mode) { @@ -502,7 +502,7 @@ void APP_StartListening(function_type_t Function, const bool reset_am_fix) if (!g_scan_pause_mode) { g_scan_pause_delay_in_10ms = scan_pause_delay_in_1_10ms; - g_schedule_scan_listen = false; + g_scan_schedule_scan_listen = false; g_scan_pause_mode = true; } break; @@ -510,7 +510,7 @@ void APP_StartListening(function_type_t Function, const bool reset_am_fix) case SCAN_RESUME_CO: case SCAN_RESUME_SE: g_scan_pause_delay_in_10ms = 0; - g_schedule_scan_listen = false; + g_scan_schedule_scan_listen = false; break; } @@ -521,8 +521,8 @@ 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->pRX->frequency = NoaaFrequencyTable[g_noaa_channel]; - g_rx_vfo->pTX->frequency = NoaaFrequencyTable[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_schedule_noaa = false; @@ -532,7 +532,7 @@ void APP_StartListening(function_type_t Function, const bool reset_am_fix) if (g_css_scan_mode != CSS_SCAN_MODE_OFF) g_css_scan_mode = CSS_SCAN_MODE_FOUND; - if (g_scan_state_dir == SCAN_OFF && + 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 @@ -632,6 +632,51 @@ uint32_t APP_SetFrequencyByStep(vfo_info_t *pInfo, int8_t Step) return Frequency; } +void SCAN_Stop(void) +{ + const uint8_t Previous = g_scan_restore_channel; + + if (g_scan_state_dir == SCAN_STATE_DIR_OFF) + return; // but, but, we weren't doing anything ! + + g_scan_state_dir = SCAN_STATE_DIR_OFF; + + if (!g_scan_keep_frequency) + { + if (g_scan_next_channel <= USER_CHANNEL_LAST) + { + g_eeprom.user_channel[g_eeprom.rx_vfo] = g_scan_restore_channel; + g_eeprom.screen_channel[g_eeprom.rx_vfo] = Previous; + + RADIO_ConfigureChannel(g_eeprom.rx_vfo, VFO_CONFIGURE_RELOAD); + } + else + { + g_rx_vfo->freq_config_rx.frequency = g_scan_restore_frequency; + + RADIO_ApplyOffset(g_rx_vfo); + RADIO_ConfigureSquelchAndOutputPower(g_rx_vfo); + } + + RADIO_SetupRegisters(true); + + g_update_display = true; + return; + } + + if (g_rx_vfo->channel_save > USER_CHANNEL_LAST) + { + RADIO_ApplyOffset(g_rx_vfo); + RADIO_ConfigureSquelchAndOutputPower(g_rx_vfo); + SETTINGS_SaveChannel(g_rx_vfo->channel_save, g_eeprom.rx_vfo, g_rx_vfo, 1); + return; + } + + SETTINGS_SaveVfoIndices(); + + g_update_status = true; +} + static void FREQ_NextChannel(void) { g_rx_vfo->freq_config_rx.frequency = APP_SetFrequencyByStep(g_rx_vfo, g_scan_state_dir); @@ -656,7 +701,7 @@ static void USER_NextChannel(void) const bool enabled = (g_eeprom.scan_list_default < 2) ? g_eeprom.scan_list_enabled[g_eeprom.scan_list_default] : true; const int chan1 = (g_eeprom.scan_list_default < 2) ? g_eeprom.scan_list_priority_ch1[g_eeprom.scan_list_default] : -1; const int chan2 = (g_eeprom.scan_list_default < 2) ? g_eeprom.scan_list_priority_ch2[g_eeprom.scan_list_default] : -1; - const unsigned int prev_chan = g_next_channel; + const unsigned int prev_chan = g_scan_next_channel; unsigned int chan = 0; if (enabled) @@ -664,17 +709,17 @@ static void USER_NextChannel(void) #pragma GCC diagnostic push #pragma GCC diagnostic ignored "-Wimplicit-fallthrough=" - switch (g_current_scan_list) + switch (g_scan_current_scan_list) { case SCAN_NEXT_CHAN_SCANLIST1: - prevChannel = g_next_channel; + prevChannel = g_scan_next_channel; if (chan1 >= 0) { if (RADIO_CheckValidChannel(chan1, false, 0)) { - g_current_scan_list = SCAN_NEXT_CHAN_SCANLIST1; - g_next_channel = chan1; + g_scan_current_scan_list = SCAN_NEXT_CHAN_SCANLIST1; + g_scan_next_channel = chan1; break; } } @@ -684,8 +729,8 @@ static void USER_NextChannel(void) { if (RADIO_CheckValidChannel(chan2, false, 0)) { - g_current_scan_list = SCAN_NEXT_CHAN_SCANLIST2; - g_next_channel = chan2; + g_scan_current_scan_list = SCAN_NEXT_CHAN_SCANLIST2; + g_scan_next_channel = chan2; break; } } @@ -699,16 +744,16 @@ static void USER_NextChannel(void) // chan = g_eeprom.screen_channel[chan]; // if (chan <= USER_CHANNEL_LAST) // { -// g_current_scan_list = SCAN_NEXT_CHAN_DUAL_WATCH; -// g_next_channel = chan; +// g_scan_current_scan_list = SCAN_NEXT_CHAN_DUAL_WATCH; +// g_scan_next_channel = chan; // break; // } // } default: case SCAN_NEXT_CHAN_USER: - g_current_scan_list = SCAN_NEXT_CHAN_USER; - g_next_channel = prevChannel; + g_scan_current_scan_list = SCAN_NEXT_CHAN_USER; + g_scan_next_channel = prevChannel; chan = 0xff; break; } @@ -718,7 +763,7 @@ static void USER_NextChannel(void) if (!enabled || chan == 0xff) { - chan = RADIO_FindNextChannel(g_next_channel + g_scan_state_dir, g_scan_state_dir, (g_eeprom.scan_list_default < 2) ? true : false, g_eeprom.scan_list_default); + chan = RADIO_FindNextChannel(g_scan_next_channel + g_scan_state_dir, g_scan_state_dir, (g_eeprom.scan_list_default < 2) ? true : false, g_eeprom.scan_list_default); if (chan == 0xFF) { // no valid channel found @@ -726,13 +771,13 @@ static void USER_NextChannel(void) // return; } - g_next_channel = chan; + g_scan_next_channel = chan; } - if (g_next_channel != prev_chan) + if (g_scan_next_channel != prev_chan) { - g_eeprom.user_channel[g_eeprom.rx_vfo] = g_next_channel; - g_eeprom.screen_channel[g_eeprom.rx_vfo] = g_next_channel; + g_eeprom.user_channel[g_eeprom.rx_vfo] = g_scan_next_channel; + g_eeprom.screen_channel[g_eeprom.rx_vfo] = g_scan_next_channel; RADIO_ConfigureChannel(g_eeprom.rx_vfo, VFO_CONFIGURE_RELOAD); RADIO_SetupRegisters(true); @@ -749,14 +794,14 @@ static void USER_NextChannel(void) g_scan_keep_frequency = false; if (enabled) - if (++g_current_scan_list >= SCAN_NEXT_NUM) - g_current_scan_list = SCAN_NEXT_CHAN_SCANLIST1; // back round we go + if (++g_scan_current_scan_list >= SCAN_NEXT_NUM) + g_scan_current_scan_list = SCAN_NEXT_CHAN_SCANLIST1; // back round we go } #ifdef ENABLE_NOAA static void NOAA_IncreaseChannel(void) { - if (++g_noaa_channel >= ARRAY_SIZE(NoaaFrequencyTable)) + if (++g_noaa_channel >= ARRAY_SIZE(NOAA_FREQUENCY_TABLE)) g_noaa_channel = 0; } #endif @@ -800,7 +845,7 @@ static void DUALWATCH_Alternate(void) void APP_CheckRadioInterrupts(void) { - if (g_screen_to_display == DISPLAY_SCANNER) + if (g_screen_to_display == DISPLAY_SEARCH) return; while (BK4819_ReadRegister(BK4819_REG_0C) & 1u) @@ -820,7 +865,7 @@ void APP_CheckRadioInterrupts(void) // 3 = 240deg phase shift // const uint8_t ctcss_shift = BK4819_GetCTCShift(); // if (ctcss_shift > 0) -// g_CTCSS_lost = true; +// g_ctcss_lost = true; if (interrupt_status_bits & BK4819_REG_02_DTMF_5TONE_FOUND) { // save the RX'ed DTMF character @@ -862,22 +907,22 @@ void APP_CheckRadioInterrupts(void) } if (interrupt_status_bits & BK4819_REG_02_CxCSS_TAIL) - g_CxCSS_tail_found = true; + g_cxcss_tail_found = true; if (interrupt_status_bits & BK4819_REG_02_CDCSS_LOST) { - g_CDCSS_lost = true; - g_CDCSS_code_type = BK4819_get_CDCSS_code_type(); + g_cdcss_lost = true; + g_cdcss_code_type = BK4819_get_CDCSS_code_type(); } if (interrupt_status_bits & BK4819_REG_02_CDCSS_FOUND) - g_CDCSS_lost = false; + g_cdcss_lost = false; if (interrupt_status_bits & BK4819_REG_02_CTCSS_LOST) - g_CTCSS_lost = true; + g_ctcss_lost = true; if (interrupt_status_bits & BK4819_REG_02_CTCSS_FOUND) - g_CTCSS_lost = false; + g_ctcss_lost = false; #ifdef ENABLE_VOX if (interrupt_status_bits & BK4819_REG_02_VOX_LOST) @@ -942,7 +987,7 @@ void APP_EndTransmission(void) RADIO_SendEndOfTransmission(); - if (g_current_vfo->pTX->code_type != CODE_TYPE_NONE) + if (g_current_vfo->p_tx->code_type != CODE_TYPE_NONE) { // CTCSS/DCS is enabled //if (g_eeprom.tail_note_elimination && g_eeprom.repeater_tail_tone_elimination > 0) @@ -988,7 +1033,7 @@ void APP_EndTransmission(void) if (g_current_function == FUNCTION_RECEIVE || g_current_function == FUNCTION_MONITOR) return; - if (g_scan_state_dir != SCAN_OFF || g_css_scan_mode != CSS_SCAN_MODE_OFF) + if (g_scan_state_dir != SCAN_STATE_DIR_OFF || g_css_scan_mode != CSS_SCAN_MODE_OFF) return; if (g_vox_noise_detected) @@ -1084,13 +1129,13 @@ void APP_Update(void) if (g_voice_write_index == 0) #endif { - if (g_screen_to_display != DISPLAY_SCANNER && - g_scan_state_dir != SCAN_OFF && - g_schedule_scan_listen && + if (g_screen_to_display != DISPLAY_SEARCH && + g_scan_state_dir != SCAN_STATE_DIR_OFF && + g_scan_schedule_scan_listen && !g_ptt_is_pressed) { // scanning - if (IS_FREQ_CHANNEL(g_next_channel)) + if (IS_FREQ_CHANNEL(g_scan_next_channel)) { if (g_current_function == FUNCTION_INCOMING) APP_StartListening(g_monitor_enabled ? FUNCTION_MONITOR : FUNCTION_RECEIVE, true); @@ -1107,19 +1152,19 @@ void APP_Update(void) g_scan_pause_mode = false; g_rx_reception_mode = RX_MODE_NONE; - g_schedule_scan_listen = false; + g_scan_schedule_scan_listen = false; } } #ifdef ENABLE_VOICE - if (g_css_scan_mode == CSS_SCAN_MODE_SCANNING && g_schedule_scan_listen && g_voice_write_index == 0) + 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_schedule_scan_listen) + if (g_css_scan_mode == CSS_SCAN_MODE_SCANNING && g_scan_schedule_scan_listen) #endif { MENU_SelectNextCode(); - g_schedule_scan_listen = false; + g_scan_schedule_scan_listen = false; } #ifdef ENABLE_NOAA @@ -1139,7 +1184,7 @@ void APP_Update(void) #endif // toggle between the VFO's if dual watch is enabled - if (g_screen_to_display != DISPLAY_SCANNER && g_eeprom.dual_watch != DUAL_WATCH_OFF) + if (g_screen_to_display != DISPLAY_SEARCH && g_eeprom.dual_watch != DUAL_WATCH_OFF) { #if defined(ENABLE_UART) && defined(ENABLE_UART_DEBUG) //UART_SendText("dual watch\r\n"); @@ -1151,7 +1196,7 @@ void APP_Update(void) { if (g_schedule_dual_watch) { - if (g_scan_state_dir == SCAN_OFF && g_css_scan_mode == CSS_SCAN_MODE_OFF) + if (g_scan_state_dir == SCAN_STATE_DIR_OFF && g_css_scan_mode == CSS_SCAN_MODE_OFF) { #ifdef ENABLE_FMRADIO if (!g_fm_radio_mode) @@ -1204,7 +1249,7 @@ void APP_Update(void) g_ptt_is_pressed || g_key_held || g_eeprom.battery_save == 0 || - g_scan_state_dir != SCAN_OFF || + 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) @@ -1230,7 +1275,7 @@ void APP_Update(void) g_ptt_is_pressed || g_key_held || g_eeprom.battery_save == 0 || - g_scan_state_dir != SCAN_OFF || + 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) @@ -1266,7 +1311,7 @@ void APP_Update(void) #endif if (g_eeprom.dual_watch != DUAL_WATCH_OFF && - g_scan_state_dir == SCAN_OFF && + 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(); @@ -1281,7 +1326,7 @@ void APP_Update(void) } else if (g_eeprom.dual_watch == DUAL_WATCH_OFF || - g_scan_state_dir != SCAN_OFF || + g_scan_state_dir != SCAN_STATE_DIR_OFF || g_css_scan_mode != CSS_SCAN_MODE_OFF || g_update_rssi) { // dual watch mode, go back to sleep @@ -1723,46 +1768,46 @@ void APP_TimeSlice10ms(void) } #endif - if (g_screen_to_display == DISPLAY_SCANNER) + if (g_screen_to_display == DISPLAY_SEARCH) { uint32_t Result; int32_t Delta; uint16_t CtcssFreq; BK4819_CSS_scan_result_t ScanResult; - g_scan_freq_css_timer_10ms++; + g_search_freq_css_timer_10ms++; - if (g_scan_delay_10ms > 0) + if (g_search_delay_10ms > 0) { - if (--g_scan_delay_10ms > 0) + if (--g_search_delay_10ms > 0) { APP_CheckKeys(); return; } } - if (g_scanner_edit_state != SCAN_EDIT_STATE_NONE) + if (g_search_edit_state != SEARCH_EDIT_STATE_NONE) { // waiting for user input choice APP_CheckKeys(); return; } g_update_display = true; - GUI_SelectNextDisplay(DISPLAY_SCANNER); + GUI_SelectNextDisplay(DISPLAY_SEARCH); - switch (g_scan_css_state) + switch (g_search_css_state) { - case SCAN_CSS_STATE_OFF: + case SEARCH_CSS_STATE_OFF: - if (g_scan_freq_css_timer_10ms >= scan_freq_css_timeout_10ms) + if (g_search_freq_css_timer_10ms >= scan_freq_css_timeout_10ms) { // FREQ/CTCSS/CDCSS search timeout - if (!g_scan_single_frequency) + if (!g_search_single_frequency) { // FREQ search timeout #ifdef ENABLE_FREQ_SEARCH_TIMEOUT BK4819_DisableFrequencyScan(); - g_scan_css_state = SCAN_CSS_STATE_FREQ_FAILED; + g_search_css_state = SEARCH_CSS_STATE_FREQ_FAILED; AUDIO_PlayBeep(BEEP_880HZ_60MS_TRIPLE_BEEP); g_update_status = true; @@ -1775,7 +1820,7 @@ void APP_TimeSlice10ms(void) #ifdef ENABLE_CODE_SEARCH_TIMEOUT BK4819_DisableFrequencyScan(); - g_scan_css_state = SCAN_CSS_STATE_FREQ_FAILED; + g_search_css_state = SEARCH_CSS_STATE_FREQ_FAILED; AUDIO_PlayBeep(BEEP_880HZ_60MS_TRIPLE_BEEP); g_update_status = true; @@ -1789,14 +1834,14 @@ void APP_TimeSlice10ms(void) break; // still scanning // accept only within 1kHz - Delta = Result - g_scan_frequency; - g_scan_hit_count = (abs(Delta) < 100) ? g_scan_hit_count + 1 : 0; + Delta = Result - g_search_frequency; + g_search_hit_count = (abs(Delta) < 100) ? g_search_hit_count + 1 : 0; BK4819_DisableFrequencyScan(); - g_scan_frequency = Result; + g_search_frequency = Result; - if (g_scan_hit_count < 3) + if (g_search_hit_count < 3) { // keep scanning for an RF carrier BK4819_EnableFrequencyScan(); } @@ -1804,32 +1849,32 @@ void APP_TimeSlice10ms(void) { // RF carrier found // stop RF the scan and move on too the CTCSS/CDCSS scan - BK4819_SetScanFrequency(g_scan_frequency); + BK4819_SetScanFrequency(g_search_frequency); - g_scan_css_result_type = CODE_TYPE_NONE; - g_scan_css_result_code = 0xff; - g_scan_hit_count = 0; - g_scan_use_css_result = false; - g_scan_freq_css_timer_10ms = 0; - g_scan_css_state = SCAN_CSS_STATE_SCANNING; + g_search_css_result_type = CODE_TYPE_NONE; + g_search_css_result_code = 0xff; + g_search_hit_count = 0; + g_search_use_css_result = false; + g_search_freq_css_timer_10ms = 0; + g_search_css_state = SEARCH_CSS_STATE_SCANNING; - GUI_SelectNextDisplay(DISPLAY_SCANNER); + GUI_SelectNextDisplay(DISPLAY_SEARCH); g_update_status = true; g_update_display = true; } - g_scan_delay_10ms = scan_freq_css_delay_10ms; + g_search_delay_10ms = scan_freq_css_delay_10ms; break; - case SCAN_CSS_STATE_SCANNING: + case SEARCH_CSS_STATE_SCANNING: - if (g_scan_freq_css_timer_10ms >= scan_freq_css_timeout_10ms) + if (g_search_freq_css_timer_10ms >= scan_freq_css_timeout_10ms) { // CTCSS/CDCSS search timeout #if defined(ENABLE_CODE_SEARCH_TIMEOUT) BK4819_Disable(); - g_scan_css_state = SCAN_CSS_STATE_FAILED; + g_search_css_state = SEARCH_CSS_STATE_FAILED; AUDIO_PlayBeep(BEEP_880HZ_60MS_TRIPLE_BEEP); g_update_status = true; @@ -1837,10 +1882,10 @@ void APP_TimeSlice10ms(void) break; #else - if (!g_scan_single_frequency) + if (!g_search_single_frequency) { BK4819_Disable(); - g_scan_css_state = SCAN_CSS_STATE_FAILED; + g_search_css_state = SEARCH_CSS_STATE_FAILED; AUDIO_PlayBeep(BEEP_880HZ_60MS_TRIPLE_BEEP); g_update_status = true; @@ -1861,10 +1906,10 @@ void APP_TimeSlice10ms(void) const uint8_t Code = DCS_GetCdcssCode(Result); if (Code != 0xFF) { - g_scan_css_result_code = Code; - g_scan_css_result_type = CODE_TYPE_DIGITAL; - g_scan_css_state = SCAN_CSS_STATE_FOUND; - g_scan_use_css_result = true; + g_search_css_result_code = Code; + g_search_css_result_type = CODE_TYPE_DIGITAL; + g_search_css_state = SEARCH_CSS_STATE_FOUND; + g_search_use_css_result = true; AUDIO_PlayBeep(BEEP_880HZ_60MS_TRIPLE_BEEP); g_update_status = true; @@ -1877,13 +1922,13 @@ void APP_TimeSlice10ms(void) const uint8_t code = DCS_GetCtcssCode(CtcssFreq); if (code != 0xFF) { - if (code == g_scan_css_result_code && - g_scan_css_result_type == CODE_TYPE_CONTINUOUS_TONE) + if (code == g_search_css_result_code && + g_search_css_result_type == CODE_TYPE_CONTINUOUS_TONE) { - if (++g_scan_hit_count >= 2) + if (++g_search_hit_count >= 2) { - g_scan_css_state = SCAN_CSS_STATE_FOUND; - g_scan_use_css_result = true; + g_search_css_state = SEARCH_CSS_STATE_FOUND; + g_search_use_css_result = true; AUDIO_PlayBeep(BEEP_880HZ_60MS_TRIPLE_BEEP); g_update_status = true; @@ -1891,26 +1936,26 @@ void APP_TimeSlice10ms(void) } } else - g_scan_hit_count = 0; + g_search_hit_count = 0; - g_scan_css_result_type = CODE_TYPE_CONTINUOUS_TONE; - g_scan_css_result_code = code; + g_search_css_result_type = CODE_TYPE_CONTINUOUS_TONE; + g_search_css_result_code = code; } } - if (g_scan_css_state == SCAN_CSS_STATE_OFF || - g_scan_css_state == SCAN_CSS_STATE_SCANNING) + if (g_search_css_state == SEARCH_CSS_STATE_OFF || + g_search_css_state == SEARCH_CSS_STATE_SCANNING) { // re-start scan - BK4819_SetScanFrequency(g_scan_frequency); - g_scan_delay_10ms = scan_freq_css_delay_10ms; + BK4819_SetScanFrequency(g_search_frequency); + g_search_delay_10ms = scan_freq_css_delay_10ms; } - GUI_SelectNextDisplay(DISPLAY_SCANNER); + GUI_SelectNextDisplay(DISPLAY_SEARCH); break; - //case SCAN_CSS_STATE_FOUND: - //case SCAN_CSS_STATE_FAILED: - //case SCAN_CSS_STATE_REPEAT: + //case SEARCH_CSS_STATE_FOUND: + //case SEARCH_CSS_STATE_FAILED: + //case SEARCH_CSS_STATE_REPEAT: default: break; } @@ -2077,11 +2122,11 @@ void APP_TimeSlice500ms(void) #endif { if (g_css_scan_mode == CSS_SCAN_MODE_OFF && - g_scan_state_dir == SCAN_OFF && - (g_screen_to_display != DISPLAY_SCANNER || - g_scan_css_state == SCAN_CSS_STATE_FOUND || - g_scan_css_state == SCAN_CSS_STATE_FAILED || - g_scan_css_state == SCAN_CSS_STATE_REPEAT)) + 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)) { if (g_eeprom.auto_keypad_lock && @@ -2110,7 +2155,7 @@ void APP_TimeSlice500ms(void) if (g_input_box_index > 0 || g_dtmf_input_mode) AUDIO_PlayBeep(BEEP_500HZ_60MS_DOUBLE_BEEP_OPTIONAL); /* - if (g_screen_to_display == DISPLAY_SCANNER) + if (g_screen_to_display == DISPLAY_SEARCH) { BK4819_StopScan(); @@ -2147,7 +2192,7 @@ void APP_TimeSlice500ms(void) if (disp == DISPLAY_INVALID) { #ifndef ENABLE_CODE_SEARCH_TIMEOUT - if (g_screen_to_display != DISPLAY_SCANNER) + if (g_screen_to_display != DISPLAY_SEARCH) #endif disp = DISPLAY_MAIN; } @@ -2313,27 +2358,28 @@ void CHANNEL_Next(const bool flag, const scan_state_dir_t scan_direction) { RADIO_SelectVfos(); - g_next_channel = g_rx_vfo->channel_save; - g_current_scan_list = SCAN_NEXT_CHAN_SCANLIST1; + g_scan_next_channel = g_rx_vfo->channel_save; + g_scan_current_scan_list = SCAN_NEXT_CHAN_SCANLIST1; g_scan_state_dir = scan_direction; - if (g_next_channel <= USER_CHANNEL_LAST) + if (g_scan_next_channel <= USER_CHANNEL_LAST) { // channel mode if (flag) - g_restore_channel = g_next_channel; + g_scan_restore_channel = g_scan_next_channel; USER_NextChannel(); } else { // frequency mode if (flag) - g_restore_frequency = g_rx_vfo->freq_config_rx.frequency; + g_scan_restore_frequency = g_rx_vfo->freq_config_rx.frequency; FREQ_NextChannel(); } - g_scan_pause_delay_in_10ms = scan_pause_delay_in_2_10ms; - g_schedule_scan_listen = false; - g_rx_reception_mode = RX_MODE_NONE; - g_scan_pause_mode = false; + 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; } @@ -2457,7 +2503,7 @@ static void APP_ProcessKey(const key_code_t Key, const bool key_pressed, const b #pragma GCC diagnostic push #pragma GCC diagnostic ignored "-Wtype-limits" - if (g_scan_state_dir != SCAN_OFF || g_css_scan_mode != CSS_SCAN_MODE_OFF) + if (g_scan_state_dir != SCAN_STATE_DIR_OFF || g_css_scan_mode != CSS_SCAN_MODE_OFF) { // FREQ/CTCSS/CDCSS scanning if ((Key >= KEY_0 && Key <= KEY_9) || Key == KEY_F) @@ -2603,8 +2649,8 @@ static void APP_ProcessKey(const key_code_t Key, const bool key_pressed, const b MENU_ProcessKeys(Key, key_pressed, key_held); break; - case DISPLAY_SCANNER: - SCANNER_ProcessKeys(Key, key_pressed, key_held); + case DISPLAY_SEARCH: + SEARCH_ProcessKeys(Key, key_pressed, key_held); break; #ifdef ENABLE_AIRCOPY @@ -2620,9 +2666,9 @@ static void APP_ProcessKey(const key_code_t Key, const bool key_pressed, const b } else #ifdef ENABLE_AIRCOPY - if (g_screen_to_display != DISPLAY_SCANNER && g_screen_to_display != DISPLAY_AIRCOPY) + if (g_screen_to_display != DISPLAY_SEARCH && g_screen_to_display != DISPLAY_AIRCOPY) #else - if (g_screen_to_display != DISPLAY_SCANNER) + if (g_screen_to_display != DISPLAY_SEARCH) #endif { ACTION_Handle(Key, key_pressed, key_held); @@ -2654,10 +2700,10 @@ Skip: g_flag_AcceptSetting = false; } - if (g_flag_stop_scan) + if (g_search_flag_stop_scan) { BK4819_StopScan(); - g_flag_stop_scan = false; + g_search_flag_stop_scan = false; } if (g_request_save_settings) @@ -2696,7 +2742,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_SCANNER) + 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 g_vfo_configure_mode = VFO_CONFIGURE; } @@ -2761,9 +2807,9 @@ Skip: MENU_ShowCurrentSetting(); } - if (g_flag_start_scan) + if (g_search_flag_start_scan) { - g_flag_start_scan = false; + g_search_flag_start_scan = false; g_monitor_enabled = false; @@ -2772,9 +2818,7 @@ Skip: AUDIO_PlaySingleVoice(true); #endif - SCANNER_Start(); - - g_request_display_screen = DISPLAY_SCANNER; + SEARCH_Start(); } if (g_flag_prepare_tx) diff --git a/app/app.h b/app/app.h index 0727828..dad6636 100644 --- a/app/app.h +++ b/app/app.h @@ -29,6 +29,7 @@ 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); diff --git a/app/dtmf.c b/app/dtmf.c index 662b52e..d2ecc3e 100644 --- a/app/dtmf.c +++ b/app/dtmf.c @@ -209,7 +209,7 @@ void DTMF_HandleRequest(void) if (!g_dtmf_rx_pending) return; // nothing new received - if (g_scan_state_dir != SCAN_OFF || g_css_scan_mode != CSS_SCAN_MODE_OFF) + if (g_scan_state_dir != SCAN_STATE_DIR_OFF || g_css_scan_mode != CSS_SCAN_MODE_OFF) { // we're busy scanning DTMF_clear_RX(); return; diff --git a/app/generic.c b/app/generic.c index e77bee6..c84e2be 100644 --- a/app/generic.c +++ b/app/generic.c @@ -138,22 +138,22 @@ void GENERIC_Key_PTT(bool key_pressed) // UART_printf("gene key 1 %u\r\n", key_pressed); #endif - if (g_scan_state_dir != SCAN_OFF || // frequency/channel scanning - g_screen_to_display == DISPLAY_SCANNER || // CTCSS/CDCSS scanning + if (g_scan_state_dir != SCAN_STATE_DIR_OFF || // frequency/channel scanning + g_screen_to_display == DISPLAY_SEARCH || // CTCSS/CDCSS scanning g_css_scan_mode != CSS_SCAN_MODE_OFF) // " " { // we're scanning .. stop - if (g_screen_to_display == DISPLAY_SCANNER) + if (g_screen_to_display == DISPLAY_SEARCH) { // CTCSS/CDCSS scanning .. stop g_eeprom.cross_vfo_rx_tx = g_backup_cross_vfo_rx_tx; - g_flag_stop_scan = true; + g_search_flag_stop_scan = true; g_vfo_configure_mode = VFO_CONFIGURE_RELOAD; g_flag_reset_vfos = true; } else - if (g_scan_state_dir != SCAN_OFF) + if (g_scan_state_dir != SCAN_STATE_DIR_OFF) { // frequency/channel scanning . .stop - SCANNER_Stop(); + SCAN_Stop(); } else if (g_css_scan_mode != CSS_SCAN_MODE_OFF) diff --git a/app/main.c b/app/main.c index 25ed5ec..15f8f53 100644 --- a/app/main.c +++ b/app/main.c @@ -41,7 +41,7 @@ void toggle_chan_scanlist(void) { // toggle the selected channels scanlist setting - if (g_screen_to_display == DISPLAY_SCANNER || !IS_USER_CHANNEL(g_tx_vfo->channel_save)) + if (g_screen_to_display == DISPLAY_SEARCH || !IS_USER_CHANNEL(g_tx_vfo->channel_save)) return; if (g_tx_vfo->scanlist_1_participation) @@ -78,7 +78,8 @@ static void processFKeyFunction(const key_code_t Key) switch (Key) { - case KEY_0: + case KEY_0: // FM + #ifdef ENABLE_FMRADIO ACTION_FM(); #else @@ -90,12 +91,13 @@ static void processFKeyFunction(const key_code_t Key) #endif break; - case KEY_1: + case KEY_1: // BAND + if (!IS_FREQ_CHANNEL(g_tx_vfo->channel_save)) { - g_fkey_pressed = false; - g_update_status = true; - g_beep_to_play = BEEP_1KHZ_60MS_OPTIONAL; + g_fkey_pressed = false; + g_update_status = true; + g_beep_to_play = BEEP_1KHZ_60MS_OPTIONAL; return; } @@ -120,7 +122,8 @@ static void processFKeyFunction(const key_code_t Key) g_request_display_screen = DISPLAY_MAIN; break; - case KEY_2: + 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 @@ -143,7 +146,7 @@ static void processFKeyFunction(const key_code_t Key) g_request_display_screen = DISPLAY_MAIN; break; - case KEY_3: + case KEY_3: // VFO/MR #ifdef ENABLE_NOAA if (g_eeprom.vfo_open && IS_NOT_NOAA_CHANNEL(g_tx_vfo->channel_save)) #else @@ -190,10 +193,11 @@ static void processFKeyFunction(const key_code_t Key) break; - case KEY_4: + case KEY_4: // FC + g_fkey_pressed = false; - g_flag_start_scan = true; - g_scan_single_frequency = false; + g_search_flag_start_scan = true; + g_search_single_frequency = false; g_backup_cross_vfo_rx_tx = g_eeprom.cross_vfo_rx_tx; g_eeprom.cross_vfo_rx_tx = CROSS_BAND_OFF; g_update_status = true; @@ -201,7 +205,8 @@ static void processFKeyFunction(const key_code_t Key) g_beep_to_play = BEEP_1KHZ_60MS_OPTIONAL; break; - case KEY_5: + case KEY_5: // NOAA + #ifdef ENABLE_NOAA if (IS_NOT_NOAA_CHANNEL(g_tx_vfo->channel_save)) @@ -227,12 +232,14 @@ static void processFKeyFunction(const key_code_t Key) g_beep_to_play = BEEP_1KHZ_60MS_OPTIONAL; break; - case KEY_6: + case KEY_6: // H/M/L + ACTION_Power(); g_beep_to_play = BEEP_1KHZ_60MS_OPTIONAL; break; - case KEY_7: + case KEY_7: // VOX + #ifdef ENABLE_VOX ACTION_Vox(); #else @@ -241,13 +248,15 @@ static void processFKeyFunction(const key_code_t Key) g_beep_to_play = BEEP_1KHZ_60MS_OPTIONAL; break; - case KEY_8: + 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: + case KEY_9: // CALL + if (RADIO_CheckValidChannel(g_eeprom.chan_1_call, false, 0)) { g_eeprom.user_channel[Vfo] = g_eeprom.chan_1_call; @@ -268,6 +277,7 @@ static void processFKeyFunction(const key_code_t Key) default: g_update_status = true; g_fkey_pressed = false; + g_fkey_pressed = false; #ifdef ENABLE_FMRADIO if (!g_fm_radio_mode) @@ -382,10 +392,10 @@ static void MAIN_Key_DIGITS(key_code_t Key, bool key_pressed, bool key_held) Frequency = FREQ_BAND_TABLE[0].lower; } else - if (Frequency >= BX4819_band1.upper && Frequency < BX4819_band2.lower) + if (Frequency >= BX4819_BAND1.upper && Frequency < BX4819_BAND2.lower) { - const uint32_t center = (BX4819_band1.upper + BX4819_band2.lower) / 2; - Frequency = (Frequency < center) ? BX4819_band1.upper : BX4819_band2.lower; + const uint32_t center = (BX4819_BAND1.upper + BX4819_BAND2.lower) / 2; + Frequency = (Frequency < center) ? BX4819_BAND1.upper : BX4819_BAND2.lower; } else if (Frequency > FREQ_BAND_TABLE[ARRAY_SIZE(FREQ_BAND_TABLE) - 1].upper) @@ -394,7 +404,7 @@ static void MAIN_Key_DIGITS(key_code_t Key, bool key_pressed, bool key_held) } { - const FREQUENCY_Band_t band = FREQUENCY_GetBand(Frequency); + const frequency_band_t band = FREQUENCY_GetBand(Frequency); #ifdef ENABLE_VOICE g_another_voice_id = (voice_id_t)Key; @@ -416,10 +426,10 @@ static void MAIN_Key_DIGITS(key_code_t Key, bool key_pressed, bool key_held) Frequency = FREQUENCY_FloorToStep(Frequency, g_tx_vfo->step_freq, FREQ_BAND_TABLE[g_tx_vfo->band].lower); - if (Frequency >= BX4819_band1.upper && Frequency < BX4819_band2.lower) + if (Frequency >= BX4819_BAND1.upper && Frequency < BX4819_BAND2.lower) { // clamp the frequency to the limit - const uint32_t center = (BX4819_band1.upper + BX4819_band2.lower) / 2; - Frequency = (Frequency < center) ? BX4819_band1.upper - g_tx_vfo->step_freq : BX4819_band2.lower; + const uint32_t center = (BX4819_BAND1.upper + BX4819_BAND2.lower) / 2; + Frequency = (Frequency < center) ? BX4819_BAND1.upper - g_tx_vfo->step_freq : BX4819_BAND2.lower; } g_tx_vfo->freq_config_rx.frequency = Frequency; @@ -448,7 +458,7 @@ static void MAIN_Key_DIGITS(key_code_t Key, bool key_pressed, bool key_held) g_input_box_index = 0; Channel = (g_input_box[0] * 10) + g_input_box[1]; - if (Channel >= 1 && Channel <= ARRAY_SIZE(NoaaFrequencyTable)) + if (Channel >= 1 && Channel <= ARRAY_SIZE(NOAA_FREQUENCY_TABLE)) { Channel += NOAA_CHANNEL_FIRST; #ifdef ENABLE_VOICE @@ -492,7 +502,7 @@ static void MAIN_Key_EXIT(bool key_pressed, bool key_held) if (!g_fm_radio_mode) #endif { - if (g_scan_state_dir == SCAN_OFF) + if (g_scan_state_dir == SCAN_STATE_DIR_OFF) { if (g_input_box_index == 0) return; @@ -507,7 +517,7 @@ static void MAIN_Key_EXIT(bool key_pressed, bool key_held) } else { - SCANNER_Stop(); + SCAN_Stop(); #ifdef ENABLE_VOICE g_another_voice_id = VOICE_ID_SCANNING_STOP; @@ -570,7 +580,7 @@ static void MAIN_Key_MENU(const bool key_pressed, const bool key_held) if (g_eeprom.vfo_open && g_css_scan_mode == CSS_SCAN_MODE_OFF) { - if (g_scan_state_dir != SCAN_OFF) + if (g_scan_state_dir != SCAN_STATE_DIR_OFF) { if (g_current_function != FUNCTION_INCOMING || g_rx_reception_mode == RX_MODE_NONE || @@ -672,9 +682,9 @@ static void MAIN_Key_STAR(bool key_pressed, bool key_held) { // pressed without the F-key #ifdef ENABLE_NOAA - if (g_scan_state_dir == SCAN_OFF && IS_NOT_NOAA_CHANNEL(g_tx_vfo->channel_save)) + 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_OFF) + if (g_scan_state_dir == SCAN_STATE_DIR_OFF) #endif { // start entering a DTMF string @@ -703,8 +713,8 @@ static void MAIN_Key_STAR(bool key_pressed, bool key_held) #endif // scan the CTCSS/DCS code - g_flag_start_scan = true; - g_scan_single_frequency = true; + 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; } @@ -751,7 +761,7 @@ static void MAIN_Key_UP_DOWN(bool key_pressed, bool key_held, scan_state_dir_t D g_beep_to_play = BEEP_1KHZ_60MS_OPTIONAL; } - if (g_scan_state_dir == SCAN_OFF) + if (g_scan_state_dir == SCAN_STATE_DIR_OFF) { #ifdef ENABLE_NOAA if (IS_NOT_NOAA_CHANNEL(Channel)) @@ -810,7 +820,7 @@ static void MAIN_Key_UP_DOWN(bool key_pressed, bool key_held, scan_state_dir_t D // jump to the next channel CHANNEL_Next(false, Direction); g_scan_pause_delay_in_10ms = 1; - g_schedule_scan_listen = false; + g_scan_schedule_scan_listen = false; // g_ptt_was_released = true; // why is this being set ? } diff --git a/app/menu.c b/app/menu.c index 7b21193..297dec8 100644 --- a/app/menu.c +++ b/app/menu.c @@ -88,7 +88,7 @@ void MENU_StartCssScan(int8_t Direction) MENU_SelectNextCode(); g_scan_pause_delay_in_10ms = scan_pause_delay_in_2_10ms; - g_schedule_scan_listen = false; + g_scan_schedule_scan_listen = false; } void MENU_StopCssScan(void) diff --git a/app/scanner.c b/app/scanner.c index 64bade8..ab37572 100644 --- a/app/scanner.c +++ b/app/scanner.c @@ -18,6 +18,7 @@ #include "app/generic.h" #include "app/scanner.h" #include "audio.h" +#include "board.h" #include "driver/bk4819.h" #include "driver/uart.h" #include "frequencies.h" @@ -27,30 +28,33 @@ #include "ui/inputbox.h" #include "ui/ui.h" -dcs_code_type_t g_scan_css_result_type; -uint8_t g_scan_css_result_code; -bool g_flag_start_scan; -bool g_flag_stop_scan; -bool g_scan_single_frequency; -scan_edit_state_t g_scanner_edit_state; -uint8_t g_scan_channel; -uint32_t g_scan_frequency; -bool g_scan_pause_mode; -scan_css_state_t g_scan_css_state; -volatile bool g_schedule_scan_listen = true; -volatile uint16_t g_scan_pause_delay_in_10ms; -uint16_t g_scan_freq_css_timer_10ms; -uint8_t g_scan_hit_count; -bool g_scan_use_css_result; -scan_state_dir_t g_scan_state_dir; -bool g_scan_keep_frequency; +search_css_state_t g_search_css_state; +bool g_search_use_css_result; +dcs_code_type_t g_search_css_result_type; +uint8_t g_search_css_result_code; -static void SCANNER_Key_DIGITS(key_code_t Key, bool key_pressed, bool key_held) +bool g_search_flag_start_scan; +bool g_search_flag_stop_scan; + +uint8_t g_search_show_chan_prefix; + +bool g_search_single_frequency; +uint16_t g_search_freq_css_timer_10ms; +uint8_t g_search_delay_10ms; +uint8_t g_search_hit_count; + +search_edit_state_t g_search_edit_state; + +uint8_t g_search_channel; +uint32_t g_search_frequency; +step_setting_t g_search_step_setting; + +static void SEARCH_Key_DIGITS(key_code_t Key, bool key_pressed, bool key_held) { if (key_held || key_pressed) return; - if (g_scanner_edit_state == SCAN_EDIT_STATE_SAVE_CHAN) + if (g_search_edit_state == SEARCH_EDIT_STATE_SAVE_CHAN) { uint16_t Channel; @@ -58,7 +62,7 @@ static void SCANNER_Key_DIGITS(key_code_t Key, bool key_pressed, bool key_held) INPUTBOX_Append(Key); - g_request_display_screen = DISPLAY_SCANNER; + g_request_display_screen = DISPLAY_SEARCH; if (g_input_box_index < 3) { @@ -76,8 +80,8 @@ static void SCANNER_Key_DIGITS(key_code_t Key, bool key_pressed, bool key_held) #ifdef ENABLE_VOICE g_another_voice_id = (voice_id_t)Key; #endif - g_show_chan_prefix = RADIO_CheckValidChannel(Channel, false, 0); - g_scan_channel = (uint8_t)Channel; + g_search_show_chan_prefix = RADIO_CheckValidChannel(Channel, false, 0); + g_search_channel = (uint8_t)Channel; return; } } @@ -85,21 +89,24 @@ static void SCANNER_Key_DIGITS(key_code_t Key, bool key_pressed, bool key_held) g_beep_to_play = BEEP_500HZ_60MS_DOUBLE_BEEP_OPTIONAL; } -static void SCANNER_Key_EXIT(bool key_pressed, bool key_held) +static void SEARCH_Key_EXIT(bool key_pressed, bool key_held) { if (key_held || key_pressed) return; g_beep_to_play = BEEP_1KHZ_60MS_OPTIONAL; - switch (g_scanner_edit_state) + #pragma GCC diagnostic push + #pragma GCC diagnostic ignored "-Wimplicit-fallthrough=" + + switch (g_search_edit_state) { - case SCAN_EDIT_STATE_NONE: + case SEARCH_EDIT_STATE_NONE: g_eeprom.cross_vfo_rx_tx = g_backup_cross_vfo_rx_tx; g_update_status = true; - g_flag_stop_scan = true; g_vfo_configure_mode = VFO_CONFIGURE_RELOAD; g_flag_reset_vfos = true; + g_search_flag_stop_scan = true; #ifdef ENABLE_VOICE g_another_voice_id = VOICE_ID_CANCEL; @@ -109,20 +116,18 @@ static void SCANNER_Key_EXIT(bool key_pressed, bool key_held) g_update_display = true; break; - case SCAN_EDIT_STATE_SAVE_CHAN: + case SEARCH_EDIT_STATE_SAVE_CHAN: if (g_input_box_index > 0) { g_input_box[--g_input_box_index] = 10; - g_request_display_screen = DISPLAY_SCANNER; + g_request_display_screen = DISPLAY_SEARCH; g_update_display = true; break; } - // Fallthrough - - case SCAN_EDIT_STATE_SAVE_CONFIRM: - g_scanner_edit_state = SCAN_EDIT_STATE_NONE; + case SEARCH_EDIT_STATE_SAVE_CONFIRM: + g_search_edit_state = SEARCH_EDIT_STATE_NONE; #ifdef ENABLE_VOICE g_another_voice_id = VOICE_ID_CANCEL; @@ -132,31 +137,33 @@ static void SCANNER_Key_EXIT(bool key_pressed, bool key_held) g_update_display = true; break; } + + #pragma GCC diagnostic pop } -static void SCANNER_Key_MENU(bool key_pressed, bool key_held) +static void SEARCH_Key_MENU(bool key_pressed, bool key_held) { uint8_t Channel; if (key_held || key_pressed) return; - if (g_scan_css_state == SCAN_CSS_STATE_OFF && !g_scan_single_frequency) + if (g_search_css_state == SEARCH_CSS_STATE_OFF && !g_search_single_frequency) { g_beep_to_play = BEEP_500HZ_60MS_DOUBLE_BEEP_OPTIONAL; return; } - if (g_scan_css_state == SCAN_CSS_STATE_SCANNING) + if (g_search_css_state == SEARCH_CSS_STATE_SCANNING) { - if (g_scan_single_frequency) + if (g_search_single_frequency) { g_beep_to_play = BEEP_500HZ_60MS_DOUBLE_BEEP_OPTIONAL; return; } } - if (g_scan_css_state == SCAN_CSS_STATE_FAILED && g_scan_single_frequency) + if (g_search_css_state == SEARCH_CSS_STATE_FAILED && g_search_single_frequency) { g_beep_to_play = BEEP_500HZ_60MS_DOUBLE_BEEP_OPTIONAL; return; @@ -167,17 +174,18 @@ static void SCANNER_Key_MENU(bool key_pressed, bool key_held) #pragma GCC diagnostic push #pragma GCC diagnostic ignored "-Wimplicit-fallthrough=" - switch (g_scanner_edit_state) + switch (g_search_edit_state) { - case SCAN_EDIT_STATE_NONE: - if (!g_scan_single_frequency) + case SEARCH_EDIT_STATE_NONE: + + if (!g_search_single_frequency) { #if 0 - uint32_t Freq250 = FREQUENCY_FloorToStep(g_scan_frequency, 250, 0); - uint32_t Freq625 = FREQUENCY_FloorToStep(g_scan_frequency, 625, 0); + uint32_t Freq250 = FREQUENCY_FloorToStep(g_search_frequency, 250, 0); + uint32_t Freq625 = FREQUENCY_FloorToStep(g_search_frequency, 625, 0); - int16_t Delta250 = (int16_t)g_scan_frequency - (int16_t)Freq250; + int16_t Delta250 = (int16_t)g_search_frequency - (int16_t)Freq250; int16_t Delta625; if (125 < Delta250) @@ -186,7 +194,7 @@ static void SCANNER_Key_MENU(bool key_pressed, bool key_held) Freq250 += 250; } - Delta625 = (int16_t)g_scan_frequency - (int16_t)Freq625; + Delta625 = (int16_t)g_search_frequency - (int16_t)Freq625; if (312 < Delta625) { @@ -196,16 +204,16 @@ static void SCANNER_Key_MENU(bool key_pressed, bool key_held) if (Delta625 < Delta250) { - g_step_setting = STEP_6_25kHz; - g_scan_frequency = Freq625; + g_search_step_setting = STEP_6_25kHz; + g_search_frequency = Freq625; } else { - g_step_setting = STEP_2_5kHz; - g_scan_frequency = Freq250; + g_search_step_setting = STEP_2_5kHz; + g_search_frequency = Freq250; } - #elif 1 + #elif 0 #ifdef ENABLE_1250HZ_STEP const step_setting_t small_step = STEP_1_25kHz; @@ -218,11 +226,11 @@ static void SCANNER_Key_MENU(bool key_pressed, bool key_held) const uint32_t small_step_freq = STEP_FREQ_TABLE[small_step]; const uint32_t big_step_freq = STEP_FREQ_TABLE[big_step]; - uint32_t freq_small_step = FREQUENCY_FloorToStep(g_scan_frequency, small_step_freq, 0); - uint32_t freq_big_step = FREQUENCY_FloorToStep(g_scan_frequency, big_step_freq, 0); + uint32_t freq_small_step = FREQUENCY_FloorToStep(g_search_frequency, small_step_freq, 0); + uint32_t freq_big_step = FREQUENCY_FloorToStep(g_search_frequency, big_step_freq, 0); - int32_t delta_small_step = (int32_t)g_scan_frequency - freq_small_step; - int32_t delta_big_step = (int32_t)g_scan_frequency - freq_big_step; + int32_t delta_small_step = (int32_t)g_search_frequency - freq_small_step; + int32_t delta_big_step = (int32_t)g_search_frequency - freq_big_step; if (delta_small_step > 125) { @@ -230,7 +238,7 @@ static void SCANNER_Key_MENU(bool key_pressed, bool key_held) freq_big_step += small_step_freq; } - delta_big_step = (int32_t)g_scan_frequency - freq_big_step; + delta_big_step = (int32_t)g_search_frequency - freq_big_step; if (delta_big_step > 312) { @@ -240,13 +248,24 @@ static void SCANNER_Key_MENU(bool key_pressed, bool key_held) if (delta_small_step >= delta_big_step) { - g_step_setting = small_step; - g_scan_frequency = freq_small_step; + g_search_step_setting = small_step; + g_search_frequency = freq_small_step; } else { - g_step_setting = big_step; - g_scan_frequency = freq_big_step; + g_search_step_setting = big_step; + g_search_frequency = freq_big_step; + } + + #else + + // determine what the current step size is for the detected frequency + // use the 7 VFO channels/bands to determine it + const unsigned int band = (unsigned int)FREQUENCY_GetBand(g_search_frequency); + g_search_step_setting = BOARD_fetchFrequencyStepSetting(band, g_eeprom.tx_vfo); + { // round to nearest step size + const uint16_t step_size = STEP_FREQ_TABLE[g_search_step_setting]; + g_search_frequency = ((g_search_frequency + (step_size / 2)) / step_size) * step_size; } #endif @@ -254,30 +273,30 @@ static void SCANNER_Key_MENU(bool key_pressed, bool key_held) if (g_tx_vfo->channel_save <= USER_CHANNEL_LAST) { // save to channel - g_scan_channel = g_tx_vfo->channel_save; - g_show_chan_prefix = RADIO_CheckValidChannel(g_tx_vfo->channel_save, false, 0); - g_scanner_edit_state = SCAN_EDIT_STATE_SAVE_CHAN; + g_search_channel = g_tx_vfo->channel_save; + g_search_show_chan_prefix = RADIO_CheckValidChannel(g_tx_vfo->channel_save, false, 0); + g_search_edit_state = SEARCH_EDIT_STATE_SAVE_CHAN; } else { // save to VFO - g_scanner_edit_state = SCAN_EDIT_STATE_SAVE_CONFIRM; + g_search_edit_state = SEARCH_EDIT_STATE_SAVE_CONFIRM; } #if defined(ENABLE_UART) && defined(ENABLE_UART_DEBUG) //UART_SendText("edit none\r\n"); #endif - g_scan_css_state = SCAN_CSS_STATE_FOUND; + g_search_css_state = SEARCH_CSS_STATE_FOUND; #ifdef ENABLE_VOICE g_another_voice_id = VOICE_ID_MEMORY_CHANNEL; #endif - g_request_display_screen = DISPLAY_SCANNER; + g_request_display_screen = DISPLAY_SEARCH; g_update_status = true; break; - case SCAN_EDIT_STATE_SAVE_CHAN: + case SEARCH_EDIT_STATE_SAVE_CHAN: #if defined(ENABLE_UART) && defined(ENABLE_UART_DEBUG) UART_SendText("edit save chan\r\n"); #endif @@ -287,52 +306,52 @@ static void SCANNER_Key_MENU(bool key_pressed, bool key_held) if (g_input_box_index == 0) { - g_scanner_edit_state = SCAN_EDIT_STATE_SAVE_CONFIRM; + g_search_edit_state = SEARCH_EDIT_STATE_SAVE_CONFIRM; g_beep_to_play = BEEP_1KHZ_60MS_OPTIONAL; - g_request_display_screen = DISPLAY_SCANNER; + g_request_display_screen = DISPLAY_SEARCH; } // break; - case SCAN_EDIT_STATE_SAVE_CONFIRM: + case SEARCH_EDIT_STATE_SAVE_CONFIRM: #if defined(ENABLE_UART) && defined(ENABLE_UART_DEBUG) UART_SendText("edit save confirm\r\n"); #endif - if (!g_scan_single_frequency) - { - RADIO_InitInfo(g_tx_vfo, g_tx_vfo->channel_save, g_scan_frequency); + if (!g_search_single_frequency) + { // save to VFO + RADIO_InitInfo(g_tx_vfo, g_tx_vfo->channel_save, g_search_frequency); - if (g_scan_use_css_result) + if (g_search_use_css_result) { - g_tx_vfo->freq_config_rx.code_type = g_scan_css_result_type; - g_tx_vfo->freq_config_rx.code = g_scan_css_result_code; + g_tx_vfo->freq_config_rx.code_type = g_search_css_result_type; + g_tx_vfo->freq_config_rx.code = g_search_css_result_code; } g_tx_vfo->freq_config_tx = g_tx_vfo->freq_config_rx; - g_tx_vfo->step_setting = g_step_setting; + g_tx_vfo->step_setting = g_search_step_setting; } else { RADIO_ConfigureChannel(0, VFO_CONFIGURE_RELOAD); RADIO_ConfigureChannel(1, VFO_CONFIGURE_RELOAD); - g_tx_vfo->freq_config_rx.code_type = g_scan_css_result_type; - g_tx_vfo->freq_config_rx.code = g_scan_css_result_code; + g_tx_vfo->freq_config_rx.code_type = g_search_css_result_type; + g_tx_vfo->freq_config_rx.code = g_search_css_result_code; - g_tx_vfo->freq_config_tx.code_type = g_scan_css_result_type; - g_tx_vfo->freq_config_tx.code = g_scan_css_result_code; + g_tx_vfo->freq_config_tx.code_type = g_search_css_result_type; + g_tx_vfo->freq_config_tx.code = g_search_css_result_code; } if (g_tx_vfo->channel_save <= USER_CHANNEL_LAST) { - Channel = g_scan_channel; + Channel = g_search_channel; g_eeprom.user_channel[g_eeprom.tx_vfo] = Channel; } else { - Channel = g_tx_vfo->band + FREQ_CHANNEL_FIRST; + Channel = FREQ_CHANNEL_FIRST + g_tx_vfo->band; g_eeprom.freq_channel[g_eeprom.tx_vfo] = Channel; } @@ -344,16 +363,16 @@ static void SCANNER_Key_MENU(bool key_pressed, bool key_held) g_another_voice_id = VOICE_ID_CONFIRM; #endif - if (!g_scan_single_frequency) + if (!g_search_single_frequency) { // FREQ/CTCSS/CDCSS search mode .. do another search - g_scan_css_state = SCAN_CSS_STATE_REPEAT; - g_scanner_edit_state = SCAN_EDIT_STATE_NONE; - g_request_display_screen = DISPLAY_SCANNER; + g_search_css_state = SEARCH_CSS_STATE_REPEAT; + g_search_edit_state = SEARCH_EDIT_STATE_NONE; + g_request_display_screen = DISPLAY_SEARCH; } else { // CTCSS/CDCSS search mode .. only do a single search - g_scan_css_state = SCAN_CSS_STATE_OFF; - g_scanner_edit_state = SCAN_EDIT_STATE_NONE; + g_search_css_state = SEARCH_CSS_STATE_OFF; + g_search_edit_state = SEARCH_EDIT_STATE_NONE; g_request_display_screen = DISPLAY_MAIN; } @@ -369,16 +388,16 @@ static void SCANNER_Key_MENU(bool key_pressed, bool key_held) #pragma GCC diagnostic pop } -static void SCANNER_Key_STAR(bool key_pressed, bool key_held) +static void SEARCH_Key_STAR(bool key_pressed, bool key_held) { if (key_held || key_pressed) return; - g_beep_to_play = BEEP_1KHZ_60MS_OPTIONAL; - g_flag_start_scan = true; + g_beep_to_play = BEEP_1KHZ_60MS_OPTIONAL; + g_search_flag_start_scan = true; } -static void SCANNER_Key_UP_DOWN(bool key_pressed, bool pKeyHeld, int8_t Direction) +static void SEARCH_Key_UP_DOWN(bool key_pressed, bool pKeyHeld, int8_t Direction) { if (pKeyHeld) { @@ -394,17 +413,17 @@ static void SCANNER_Key_UP_DOWN(bool key_pressed, bool pKeyHeld, int8_t Directio g_beep_to_play = BEEP_1KHZ_60MS_OPTIONAL; } - if (g_scanner_edit_state == SCAN_EDIT_STATE_SAVE_CHAN) + if (g_search_edit_state == SEARCH_EDIT_STATE_SAVE_CHAN) { - g_scan_channel = NUMBER_AddWithWraparound(g_scan_channel, Direction, 0, USER_CHANNEL_LAST); - g_show_chan_prefix = RADIO_CheckValidChannel(g_scan_channel, false, 0); - g_request_display_screen = DISPLAY_SCANNER; + g_search_channel = NUMBER_AddWithWraparound(g_search_channel, Direction, 0, USER_CHANNEL_LAST); + g_search_show_chan_prefix = RADIO_CheckValidChannel(g_search_channel, false, 0); + g_request_display_screen = DISPLAY_SEARCH; } else g_beep_to_play = BEEP_500HZ_60MS_DOUBLE_BEEP_OPTIONAL; } -void SCANNER_ProcessKeys(key_code_t Key, bool key_pressed, bool key_held) +void SEARCH_ProcessKeys(key_code_t Key, bool key_pressed, bool key_held) { switch (Key) { @@ -418,22 +437,22 @@ void SCANNER_ProcessKeys(key_code_t Key, bool key_pressed, bool key_held) case KEY_7: case KEY_8: case KEY_9: - SCANNER_Key_DIGITS(Key, key_pressed, key_held); + SEARCH_Key_DIGITS(Key, key_pressed, key_held); break; case KEY_MENU: - SCANNER_Key_MENU(key_pressed, key_held); + SEARCH_Key_MENU(key_pressed, key_held); break; case KEY_UP: - SCANNER_Key_UP_DOWN(key_pressed, key_held, 1); + SEARCH_Key_UP_DOWN(key_pressed, key_held, 1); break; case KEY_DOWN: - SCANNER_Key_UP_DOWN(key_pressed, key_held, -1); + SEARCH_Key_UP_DOWN(key_pressed, key_held, -1); break; case KEY_EXIT: - SCANNER_Key_EXIT(key_pressed, key_held); + SEARCH_Key_EXIT(key_pressed, key_held); break; case KEY_STAR: - SCANNER_Key_STAR(key_pressed, key_held); + SEARCH_Key_STAR(key_pressed, key_held); break; case KEY_PTT: GENERIC_Key_PTT(key_pressed); @@ -445,7 +464,7 @@ void SCANNER_ProcessKeys(key_code_t Key, bool key_pressed, bool key_held) } } -void SCANNER_Start(void) +void SEARCH_Start(void) { uint8_t BackupStep; uint16_t BackupStepFreq; @@ -462,7 +481,7 @@ void SCANNER_Start(void) BackupStep = g_rx_vfo->step_setting; BackupStepFreq = g_rx_vfo->step_freq; - RADIO_InitInfo(g_rx_vfo, g_rx_vfo->channel_save, g_rx_vfo->pRX->frequency); + RADIO_InitInfo(g_rx_vfo, g_rx_vfo->channel_save, g_rx_vfo->p_rx->frequency); g_rx_vfo->step_setting = BackupStep; g_rx_vfo->step_freq = BackupStepFreq; @@ -473,19 +492,19 @@ void SCANNER_Start(void) g_is_noaa_mode = false; #endif - if (g_scan_single_frequency) + if (g_search_single_frequency) { - g_scan_css_state = SCAN_CSS_STATE_SCANNING; - g_scan_frequency = g_rx_vfo->pRX->frequency; - g_step_setting = g_rx_vfo->step_setting; + g_search_css_state = SEARCH_CSS_STATE_SCANNING; + g_search_frequency = g_rx_vfo->p_rx->frequency; + g_search_step_setting = g_rx_vfo->step_setting; - BK4819_PickRXFilterPathBasedOnFrequency(g_scan_frequency); - BK4819_SetScanFrequency(g_scan_frequency); + BK4819_PickRXFilterPathBasedOnFrequency(g_search_frequency); + BK4819_SetScanFrequency(g_search_frequency); } else { - g_scan_css_state = SCAN_CSS_STATE_OFF; - g_scan_frequency = 0xFFFFFFFF; + g_search_css_state = SEARCH_CSS_STATE_OFF; + g_search_frequency = 0xFFFFFFFF; BK4819_PickRXFilterPathBasedOnFrequency(0xFFFFFFFF); BK4819_EnableFrequencyScan(); @@ -493,67 +512,25 @@ void SCANNER_Start(void) DTMF_clear_RX(); - g_scan_delay_10ms = scan_freq_css_delay_10ms; - g_scan_css_result_type = CODE_TYPE_NONE; - g_scan_css_result_code = 0xff; - g_scan_hit_count = 0; - g_scan_use_css_result = false; - g_CxCSS_tail_found = false; - g_CDCSS_lost = false; - g_CDCSS_code_type = 0; - g_CTCSS_lost = false; - #ifdef ENABLE_VOX - g_vox_lost = false; - #endif - g_squelch_lost = false; - g_scanner_edit_state = SCAN_EDIT_STATE_NONE; - g_scan_freq_css_timer_10ms = 0; -// g_flag_start_scan = false; + #ifdef ENABLE_VOX + g_vox_lost = false; + #endif - g_update_status = true; -} - -void SCANNER_Stop(void) -{ - const uint8_t Previous = g_restore_channel; - - if (g_scan_state_dir == SCAN_OFF) - return; // but, but, we weren't doing anything ! - - g_scan_state_dir = SCAN_OFF; - - if (!g_scan_keep_frequency) - { - if (g_next_channel <= USER_CHANNEL_LAST) - { - g_eeprom.user_channel[g_eeprom.rx_vfo] = g_restore_channel; - g_eeprom.screen_channel[g_eeprom.rx_vfo] = Previous; - - RADIO_ConfigureChannel(g_eeprom.rx_vfo, VFO_CONFIGURE_RELOAD); - } - else - { - g_rx_vfo->freq_config_rx.frequency = g_restore_frequency; - - RADIO_ApplyOffset(g_rx_vfo); - RADIO_ConfigureSquelchAndOutputPower(g_rx_vfo); - } - - RADIO_SetupRegisters(true); - - g_update_display = true; - return; - } - - if (g_rx_vfo->channel_save > USER_CHANNEL_LAST) - { - RADIO_ApplyOffset(g_rx_vfo); - RADIO_ConfigureSquelchAndOutputPower(g_rx_vfo); - SETTINGS_SaveChannel(g_rx_vfo->channel_save, g_eeprom.rx_vfo, g_rx_vfo, 1); - return; - } - - SETTINGS_SaveVfoIndices(); - - g_update_status = true; + g_cxcss_tail_found = false; + g_cdcss_lost = false; + g_cdcss_code_type = 0; + g_ctcss_lost = false; + + g_squelch_lost = false; + g_search_delay_10ms = scan_freq_css_delay_10ms; + g_search_css_result_type = CODE_TYPE_NONE; + g_search_css_result_code = 0xff; + g_search_hit_count = 0; + g_search_use_css_result = false; + g_search_edit_state = SEARCH_EDIT_STATE_NONE; + g_search_freq_css_timer_10ms = 0; +// g_search_flag_start_scan = false; + + g_request_display_screen = DISPLAY_SEARCH; + g_update_status = true; } diff --git a/app/scanner.h b/app/scanner.h index 8d2de3f..5db8def 100644 --- a/app/scanner.h +++ b/app/scanner.h @@ -14,58 +14,49 @@ * limitations under the License. */ -#ifndef APP_SCANNER_H -#define APP_SCANNER_H +#ifndef APP_SEARCH_H +#define APP_SEARCH_H #include "dcs.h" #include "driver/keyboard.h" +#include "frequencies.h" -enum scan_css_state_e +enum search_css_state_e { - SCAN_CSS_STATE_OFF = 0, - SCAN_CSS_STATE_SCANNING, - SCAN_CSS_STATE_FOUND, - SCAN_CSS_STATE_FAILED, - SCAN_CSS_STATE_FREQ_FAILED, - SCAN_CSS_STATE_REPEAT + SEARCH_CSS_STATE_OFF = 0, + SEARCH_CSS_STATE_SCANNING, + SEARCH_CSS_STATE_FOUND, + SEARCH_CSS_STATE_FAILED, + SEARCH_CSS_STATE_FREQ_FAILED, + SEARCH_CSS_STATE_REPEAT }; -typedef enum scan_css_state_e scan_css_state_t; +typedef enum search_css_state_e search_css_state_t; -enum scan_state_dir_e { - SCAN_REV = -1, - SCAN_OFF = 0, - SCAN_FWD = +1 +enum search_edit_state_e { + SEARCH_EDIT_STATE_NONE = 0, + SEARCH_EDIT_STATE_SAVE_CHAN, + SEARCH_EDIT_STATE_SAVE_CONFIRM }; -typedef enum scan_state_dir_e scan_state_dir_t; +typedef enum search_edit_state_e search_edit_state_t; -enum scan_edit_state_e { - SCAN_EDIT_STATE_NONE = 0, - SCAN_EDIT_STATE_SAVE_CHAN, - SCAN_EDIT_STATE_SAVE_CONFIRM -}; -typedef enum scan_edit_state_e scan_edit_state_t; +extern search_css_state_t g_search_css_state; +extern dcs_code_type_t g_search_css_result_type; +extern uint8_t g_search_css_result_code; +extern bool g_search_flag_start_scan; +extern bool g_search_flag_stop_scan; +extern uint8_t g_search_show_chan_prefix; +extern bool g_search_single_frequency; +extern search_edit_state_t g_search_edit_state; +extern uint8_t g_search_channel; +extern uint32_t g_search_frequency; +extern step_setting_t g_search_step_setting; +extern uint16_t g_search_freq_css_timer_10ms; +extern uint8_t g_search_delay_10ms; +extern uint8_t g_search_hit_count; +extern bool g_search_use_css_result; -extern dcs_code_type_t g_scan_css_result_type; -extern uint8_t g_scan_css_result_code; -extern bool g_flag_start_scan; -extern bool g_flag_stop_scan; -extern bool g_scan_single_frequency; -extern scan_edit_state_t g_scanner_edit_state; -extern uint8_t g_scan_channel; -extern uint32_t g_scan_frequency; -extern bool g_scan_pause_mode; -extern scan_css_state_t g_scan_css_state; -extern volatile bool g_schedule_scan_listen; -extern volatile uint16_t g_scan_pause_delay_in_10ms; -extern uint16_t g_scan_freq_css_timer_10ms; -extern uint8_t g_scan_hit_count; -extern bool g_scan_use_css_result; -extern scan_state_dir_t g_scan_state_dir; -extern bool g_scan_keep_frequency; - -void SCANNER_ProcessKeys(key_code_t Key, bool key_pressed, bool key_held); -void SCANNER_Start(void); -void SCANNER_Stop(void); +void SEARCH_ProcessKeys(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 c4823d1..e1f7e03 100644 --- a/app/spectrum.c +++ b/app/spectrum.c @@ -416,7 +416,7 @@ static void ToggleTX(bool on) { RegBackupSet(BK4819_REG_51, 0x0000); BK4819_SetupPowerAmplifier(gCurrentVfo->TXP_CalculatedSetting, - gCurrentVfo->pTX->Frequency); + gCurrentVfo->p_tx->Frequency); } else { RADIO_SendEndOfTransmission(); RADIO_EnableCxCSS(); @@ -1328,7 +1328,7 @@ void APP_RunSpectrum() { BackupRegisters(); // TX here coz it always? set to active VFO VFO_Info_t vfo = g_eeprom.vfo_info[g_eeprom.TX_CHANNEL]; - initialFreq = vfo.pRX->Frequency; + initialFreq = vfo.p_rx->Frequency; currentFreq = initialFreq; settings.scanStepIndex = gStepSettingToIndex[vfo.STEP_SETTING]; settings.listenBw = vfo.CHANNEL_BANDWIDTH == BANDWIDTH_WIDE diff --git a/app/uart.c b/app/uart.c index 027effe..fa13ed8 100644 --- a/app/uart.c +++ b/app/uart.c @@ -452,8 +452,8 @@ static void cmd_052F(const uint8_t *pBuffer) g_eeprom.rx_vfo = 0; g_eeprom.dtmf_side_tone = false; g_eeprom.vfo_info[0].frequency_reverse = false; - g_eeprom.vfo_info[0].pRX = &g_eeprom.vfo_info[0].freq_config_rx; - g_eeprom.vfo_info[0].pTX = &g_eeprom.vfo_info[0].freq_config_tx; + g_eeprom.vfo_info[0].p_rx = &g_eeprom.vfo_info[0].freq_config_rx; + g_eeprom.vfo_info[0].p_tx = &g_eeprom.vfo_info[0].freq_config_tx; g_eeprom.vfo_info[0].tx_offset_freq_dir = TX_OFFSET_FREQ_DIR_OFF; g_eeprom.vfo_info[0].dtmf_ptt_id_tx_mode = PTT_ID_OFF; g_eeprom.vfo_info[0].dtmf_decoding_enable = false; diff --git a/board.c b/board.c index 30297ea..d157733 100644 --- a/board.c +++ b/board.c @@ -840,11 +840,57 @@ uint32_t BOARD_fetchChannelFrequency(const int channel) uint32_t offset; } __attribute__((packed)) info; + if (channel < 0 || channel > (int)FREQ_CHANNEL_LAST) + return 0; + + if (!RADIO_CheckValidChannel(channel, false, 0)) + return 0; + EEPROM_ReadBuffer(channel * 16, &info, sizeof(info)); return info.frequency; } +unsigned int BOARD_fetchChannelStepSetting(const int channel) +{ + uint8_t data[8]; + unsigned int step_setting = 0; + + if (channel < 0) + return 0; + + if (channel <= USER_CHANNEL_LAST) + { + EEPROM_ReadBuffer(channel * 16, &data, sizeof(data)); + } + else + if (channel <= FREQ_CHANNEL_LAST) + { + EEPROM_ReadBuffer(channel * 16, &data, sizeof(data)); + } + + step_setting = (data[6] >= ARRAY_SIZE(STEP_FREQ_TABLE)) ? STEP_12_5kHz : data[6]; +// step_size = STEP_FREQ_TABLE[step_setting]; + + return step_setting; +} + +unsigned int BOARD_fetchFrequencyStepSetting(const int channel, const int vfo) +{ + uint8_t data[8]; + unsigned int step_setting = 0; + + if (channel < 0 || channel > (FREQ_CHANNEL_LAST - FREQ_CHANNEL_FIRST) || vfo < 0 || vfo >= 2) + return 0; + + EEPROM_ReadBuffer(FREQ_CHANNEL_FIRST + (channel * 16 * 2) + vfo, &data, sizeof(data)); + + step_setting = (data[6] >= ARRAY_SIZE(STEP_FREQ_TABLE)) ? STEP_12_5kHz : data[6]; +// step_size = STEP_FREQ_TABLE[step_setting]; + + return step_setting; +} + void BOARD_fetchChannelName(char *s, const int channel) { int i; @@ -854,13 +900,12 @@ void BOARD_fetchChannelName(char *s, const int channel) memset(s, 0, 11); // 's' had better be large enough ! - if (channel < 0) + if (channel < 0 || channel > (int)USER_CHANNEL_LAST) return; if (!RADIO_CheckValidChannel(channel, false, 0)) return; - EEPROM_ReadBuffer(0x0F50 + (channel * 16), s + 0, 8); EEPROM_ReadBuffer(0x0F58 + (channel * 16), s + 8, 2); diff --git a/board.h b/board.h index e07cae2..47c7da2 100644 --- a/board.h +++ b/board.h @@ -19,17 +19,19 @@ #include -void BOARD_FLASH_Init(void); -void BOARD_GPIO_Init(void); -void BOARD_PORTCON_Init(void); -void BOARD_ADC_Init(void); -void BOARD_ADC_GetBatteryInfo(uint16_t *pVoltage, uint16_t *pCurrent); -void BOARD_Init(void); -void BOARD_EEPROM_load(void); -void BOARD_EEPROM_LoadMoreSettings(void); -uint32_t BOARD_fetchChannelFrequency(const int channel); -void BOARD_fetchChannelName(char *s, const int channel); -void BOARD_FactoryReset(bool bIsAll); +void BOARD_FLASH_Init(void); +void BOARD_GPIO_Init(void); +void BOARD_PORTCON_Init(void); +void BOARD_ADC_Init(void); +void BOARD_ADC_GetBatteryInfo(uint16_t *pVoltage, uint16_t *pCurrent); +void BOARD_Init(void); +void BOARD_EEPROM_load(void); +void BOARD_EEPROM_LoadMoreSettings(void); +uint32_t BOARD_fetchChannelFrequency(const int channel); +unsigned int BOARD_fetchChannelStepSetting(const int channel); +void BOARD_fetchChannelName(char *s, const int channel); +unsigned int BOARD_fetchFrequencyStepSetting(const int channel, const int vfo); +void BOARD_FactoryReset(bool bIsAll); #endif diff --git a/firmware.bin b/firmware.bin index c58326f9d688605b87fbf8f2152f924cbc3173c0..9b6f79e1240b4c700bfab6640a243bca7129ecf7 100644 GIT binary patch delta 19403 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

^w)cK?af}w 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 kv%E%aG^)S$LiyQ*WW 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 diff --git a/firmware.packed.bin b/firmware.packed.bin index 23b3a02e2d39292f6f1e851b47ebb84de5f1f59d..e07ce7ef3ea85239debc80f5a2e9e06b5cc6e975 100644 GIT binary patch delta 47984 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 0; band--) if (Frequency >= FREQ_BAND_TABLE[band].lower) // if (Frequency < FREQ_BAND_TABLE[band].upper) - return (FREQUENCY_Band_t)band; + return (frequency_band_t)band; return BAND1_50MHz; // return BAND_NONE; @@ -134,7 +134,7 @@ int TX_freq_check(const uint32_t Frequency) if (Frequency < FREQ_BAND_TABLE[0].lower || Frequency > FREQ_BAND_TABLE[ARRAY_SIZE(FREQ_BAND_TABLE) - 1].upper) return -1; // not allowed outside this range - if (Frequency >= BX4819_band1.upper && Frequency < BX4819_band2.lower) + if (Frequency >= BX4819_BAND1.upper && Frequency < BX4819_BAND2.lower) return -1; // BX chip does not work in this range switch (g_setting_freq_lock) @@ -202,7 +202,7 @@ int RX_freq_check(const uint32_t Frequency) if (Frequency < FREQ_BAND_TABLE[0].lower || Frequency > FREQ_BAND_TABLE[ARRAY_SIZE(FREQ_BAND_TABLE) - 1].upper) return -1; - if (Frequency >= BX4819_band1.upper && Frequency < BX4819_band2.lower) + if (Frequency >= BX4819_BAND1.upper && Frequency < BX4819_BAND2.lower) return -1; return 0; // OK frequency diff --git a/frequencies.h b/frequencies.h index 93d45ce..fbea414 100644 --- a/frequencies.h +++ b/frequencies.h @@ -21,19 +21,7 @@ #include "frequencies.h" -typedef struct { - const uint32_t lower; - const uint32_t upper; -} freq_band_table_t; - -extern uint32_t g_aircopy_freq; - -extern const freq_band_table_t BX4819_band1; -extern const freq_band_table_t BX4819_band2; - -extern const freq_band_table_t FREQ_BAND_TABLE[7]; - -enum FREQUENCY_Band_t { +enum frequency_band_e { BAND_NONE = -1, BAND1_50MHz = 0, BAND2_108MHz, @@ -43,11 +31,23 @@ enum FREQUENCY_Band_t { BAND6_400MHz, BAND7_470MHz }; -typedef enum FREQUENCY_Band_t FREQUENCY_Band_t; +typedef enum frequency_band_e frequency_band_t; + +typedef struct { + const uint32_t lower; + const uint32_t upper; +} freq_band_table_t; + +extern uint32_t g_aircopy_freq; + +extern const freq_band_table_t BX4819_BAND1; +extern const freq_band_table_t BX4819_BAND2; + +extern const freq_band_table_t FREQ_BAND_TABLE[7]; #ifdef ENABLE_1250HZ_STEP // includes 1.25kHz step - enum step_setting_t { + enum step_setting_e { STEP_1_25kHz = 0, STEP_2_5kHz, STEP_6_25kHz, @@ -58,7 +58,7 @@ typedef enum FREQUENCY_Band_t FREQUENCY_Band_t; }; #else // QS steps - enum step_setting_t { + enum step_setting_e { STEP_2_5kHz = 0, STEP_5_0kHz, STEP_6_25kHz, @@ -68,15 +68,15 @@ typedef enum FREQUENCY_Band_t FREQUENCY_Band_t; STEP_8_33kHz }; #endif -typedef enum step_setting_t step_setting_t; +typedef enum step_setting_e step_setting_t; -extern const uint16_t STEP_FREQ_TABLE[7]; +extern const uint16_t STEP_FREQ_TABLE[7]; #ifdef ENABLE_NOAA - extern const uint32_t NoaaFrequencyTable[10]; + extern const uint32_t NOAA_FREQUENCY_TABLE[10]; #endif -FREQUENCY_Band_t FREQUENCY_GetBand(uint32_t Frequency); +frequency_band_t FREQUENCY_GetBand(uint32_t Frequency); uint8_t FREQUENCY_CalculateOutputPower(uint8_t TxpLow, uint8_t TxpMid, uint8_t TxpHigh, int32_t LowerLimit, int32_t Middle, int32_t UpperLimit, int32_t Frequency); uint32_t FREQUENCY_FloorToStep(uint32_t Upper, uint32_t Step, uint32_t Lower); diff --git a/functions.c b/functions.c index 9eecdca..c3fd8be 100644 --- a/functions.c +++ b/functions.c @@ -49,7 +49,7 @@ void FUNCTION_Init(void) { 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->pRX->code_type; + g_current_code_type = g_rx_vfo->am_mode ? CODE_TYPE_NONE : g_rx_vfo->p_rx->code_type; } #ifdef ENABLE_NOAA else @@ -58,9 +58,9 @@ void FUNCTION_Init(void) DTMF_clear_RX(); - g_CxCSS_tail_found = false; - g_CDCSS_lost = false; - g_CTCSS_lost = false; + g_cxcss_tail_found = false; + g_cdcss_lost = false; + g_ctcss_lost = false; #ifdef ENABLE_VOX g_vox_lost = false; diff --git a/misc.c b/misc.c index 7f2690b..019bde6 100644 --- a/misc.c +++ b/misc.c @@ -156,6 +156,11 @@ volatile bool g_tx_timeout_reached; volatile uint16_t g_tail_tone_elimination_count_down_10ms; +bool g_scan_pause_mode; +volatile bool g_scan_schedule_scan_listen = true; +volatile uint16_t g_scan_pause_delay_in_10ms; +scan_state_dir_t g_scan_state_dir; + #ifdef ENABLE_NOAA volatile uint16_t g_noaa_count_down_10ms; #endif @@ -201,10 +206,10 @@ bool g_flag_save_channel; #ifdef ENABLE_FMRADIO bool g_flag_SaveFM; #endif -bool g_CDCSS_lost; -uint8_t g_CDCSS_code_type; -bool g_CTCSS_lost; -bool g_CxCSS_tail_found; +bool g_cdcss_lost; +uint8_t g_cdcss_code_type; +bool g_ctcss_lost; +bool g_cxcss_tail_found; #ifdef ENABLE_VOX bool g_vox_lost; bool g_vox_noise_detected; @@ -216,12 +221,13 @@ uint8_t g_flash_light_state; volatile uint16_t g_flash_light_blink_counter; bool g_flag_end_tx; uint16_t g_low_batteryCountdown; -uint8_t g_next_channel; reception_mode_t g_rx_reception_mode; -uint8_t g_restore_channel; -scan_next_chan_t g_current_scan_list; -uint32_t g_restore_frequency; +uint8_t g_scan_next_channel; +uint8_t g_scan_restore_channel; +scan_next_chan_t g_scan_current_scan_list; +uint32_t g_scan_restore_frequency; +bool g_scan_keep_frequency; bool g_rx_vfo_is_active; #ifdef ENABLE_ALARM @@ -230,7 +236,6 @@ bool g_rx_vfo_is_active; #endif uint8_t g_menu_list_count; uint8_t g_backup_cross_vfo_rx_tx; -uint8_t g_scan_delay_10ms; #ifdef ENABLE_NOAA bool g_is_noaa_mode; @@ -241,8 +246,6 @@ bool g_update_display; bool g_unhide_hidden = false; -uint8_t g_show_chan_prefix; - volatile bool g_next_time_slice; volatile uint8_t g_found_CDCSS_count_down_10ms; volatile uint8_t g_found_CTCSS_count_down_10ms; diff --git a/misc.h b/misc.h index b816e29..44ffb05 100644 --- a/misc.h +++ b/misc.h @@ -101,6 +101,13 @@ enum scan_next_chan_e { }; typedef enum scan_next_chan_e scan_next_chan_t; +enum scan_state_dir_e { + SCAN_STATE_DIR_REVERSE = -1, + SCAN_STATE_DIR_OFF = 0, + SCAN_STATE_DIR_FORWARD = +1 +}; +typedef enum scan_state_dir_e scan_state_dir_t; + extern const uint8_t obfuscate_array[16]; extern const uint8_t fm_resume_countdown_500ms; @@ -231,6 +238,11 @@ extern volatile bool g_tx_timeout_reached; extern volatile uint16_t g_tail_tone_elimination_count_down_10ms; +extern bool g_scan_pause_mode; +extern volatile bool g_scan_schedule_scan_listen; +extern volatile uint16_t g_scan_pause_delay_in_10ms; +extern scan_state_dir_t g_scan_state_dir; + #ifdef ENABLE_FMRADIO extern volatile uint16_t g_fm_play_count_down_10ms; #endif @@ -276,10 +288,10 @@ extern bool g_flag_save_channel; #ifdef ENABLE_FMRADIO extern bool g_flag_SaveFM; #endif -extern bool g_CDCSS_lost; -extern uint8_t g_CDCSS_code_type; -extern bool g_CTCSS_lost; -extern bool g_CxCSS_tail_found; +extern bool g_cdcss_lost; +extern uint8_t g_cdcss_code_type; +extern bool g_ctcss_lost; +extern bool g_cxcss_tail_found; #ifdef ENABLE_VOX extern bool g_vox_lost; extern bool g_vox_noise_detected; @@ -291,19 +303,19 @@ extern uint8_t g_flash_light_state; extern volatile uint16_t g_flash_light_blink_counter; extern bool g_flag_end_tx; extern uint16_t g_low_batteryCountdown; -extern uint8_t g_next_channel; extern reception_mode_t g_rx_reception_mode; -extern uint8_t g_restore_channel; -extern scan_next_chan_t g_current_scan_list; -extern uint32_t g_restore_frequency; +extern uint8_t g_scan_next_channel; +extern uint8_t g_scan_restore_channel; +extern scan_next_chan_t g_scan_current_scan_list; +extern uint32_t g_scan_restore_frequency; +extern bool g_scan_keep_frequency; extern bool g_rx_vfo_is_active; extern uint8_t g_alarm_tone_counter; extern uint16_t g_alarm_running_counter; extern uint8_t g_menu_list_count; extern uint8_t g_backup_cross_vfo_rx_tx; -extern uint8_t g_scan_delay_10ms; #ifdef ENABLE_NOAA extern bool g_is_noaa_mode; extern uint8_t g_noaa_channel; @@ -314,7 +326,6 @@ extern bool g_unhide_hidden; #ifdef ENABLE_FMRADIO extern uint8_t g_fm_channel_position; #endif -extern uint8_t g_show_chan_prefix; extern volatile uint8_t g_found_CDCSS_count_down_10ms; extern volatile uint8_t g_found_CTCSS_count_down_10ms; #ifdef ENABLE_VOX diff --git a/radio.c b/radio.c index 600f99a..1ec4ccb 100644 --- a/radio.c +++ b/radio.c @@ -41,7 +41,6 @@ vfo_info_t *g_current_vfo; dcs_code_type_t g_selected_code_type; dcs_code_type_t g_current_code_type; uint8_t g_selected_code; -step_setting_t g_step_setting; vfo_state_t g_vfo_state[2]; bool RADIO_CheckValidChannel(uint16_t Channel, bool bCheckScanList, uint8_t VFO) @@ -119,17 +118,17 @@ void RADIO_InitInfo(vfo_info_t *pInfo, const uint8_t ChannelSave, const uint32_t memset(pInfo, 0, sizeof(*pInfo)); pInfo->band = FREQUENCY_GetBand(Frequency); - pInfo->scanlist_1_participation = true; - pInfo->scanlist_2_participation = true; + pInfo->scanlist_1_participation = true; + pInfo->scanlist_2_participation = true; pInfo->step_setting = STEP_12_5kHz; - pInfo->step_freq = STEP_FREQ_TABLE[pInfo->step_setting]; + pInfo->step_freq = STEP_FREQ_TABLE[pInfo->step_setting]; pInfo->channel_save = ChannelSave; - pInfo->frequency_reverse = false; + pInfo->frequency_reverse = false; pInfo->output_power = OUTPUT_POWER_LOW; pInfo->freq_config_rx.frequency = Frequency; pInfo->freq_config_tx.frequency = Frequency; - pInfo->pRX = &pInfo->freq_config_rx; - pInfo->pTX = &pInfo->freq_config_tx; + pInfo->p_rx = &pInfo->freq_config_rx; + pInfo->p_tx = &pInfo->freq_config_tx; pInfo->compander = 0; // off if (ChannelSave == (FREQ_CHANNEL_FIRST + BAND2_108MHz)) @@ -164,7 +163,7 @@ void RADIO_ConfigureChannel(const unsigned int VFO, const unsigned int configure #ifdef ENABLE_NOAA if (Channel >= NOAA_CHANNEL_FIRST) { - RADIO_InitInfo(pRadio, g_eeprom.screen_channel[VFO], NoaaFrequencyTable[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; @@ -178,7 +177,7 @@ void RADIO_ConfigureChannel(const unsigned int VFO, const unsigned int configure if (Channel <= USER_CHANNEL_LAST) { - Channel = RADIO_FindNextChannel(Channel, SCAN_FWD, false, VFO); + Channel = RADIO_FindNextChannel(Channel, SCAN_STATE_DIR_FORWARD, false, VFO); if (Channel == 0xFF) { Channel = g_eeprom.freq_channel[VFO]; @@ -394,18 +393,18 @@ void RADIO_ConfigureChannel(const unsigned int VFO, const unsigned int configure if (!g_eeprom.vfo_info[VFO].frequency_reverse) { - g_eeprom.vfo_info[VFO].pRX = &g_eeprom.vfo_info[VFO].freq_config_rx; - g_eeprom.vfo_info[VFO].pTX = &g_eeprom.vfo_info[VFO].freq_config_tx; + g_eeprom.vfo_info[VFO].p_rx = &g_eeprom.vfo_info[VFO].freq_config_rx; + g_eeprom.vfo_info[VFO].p_tx = &g_eeprom.vfo_info[VFO].freq_config_tx; } else { - g_eeprom.vfo_info[VFO].pRX = &g_eeprom.vfo_info[VFO].freq_config_tx; - g_eeprom.vfo_info[VFO].pTX = &g_eeprom.vfo_info[VFO].freq_config_rx; + g_eeprom.vfo_info[VFO].p_rx = &g_eeprom.vfo_info[VFO].freq_config_tx; + g_eeprom.vfo_info[VFO].p_tx = &g_eeprom.vfo_info[VFO].freq_config_rx; } if (!g_setting_350_enable) { - freq_config_t *pConfig = g_eeprom.vfo_info[VFO].pRX; + freq_config_t *pConfig = g_eeprom.vfo_info[VFO].p_rx; if (pConfig->frequency >= 35000000 && pConfig->frequency < 40000000) // not allowed in this range pConfig->frequency = 43300000; // hop onto the ham band } @@ -426,12 +425,12 @@ void RADIO_ConfigureChannel(const unsigned int VFO, const unsigned int configure void RADIO_ConfigureSquelchAndOutputPower(vfo_info_t *pInfo) { uint8_t TX_power[3]; - FREQUENCY_Band_t Band; + frequency_band_t Band; // ******************************* // squelch - Band = FREQUENCY_GetBand(pInfo->pRX->frequency); + Band = FREQUENCY_GetBand(pInfo->p_rx->frequency); uint16_t Base = (Band < BAND4_174MHz) ? 0x1E60 : 0x1E00; if (g_eeprom.squelch_level == 0) @@ -522,7 +521,7 @@ void RADIO_ConfigureSquelchAndOutputPower(vfo_info_t *pInfo) // 1F20 5A 5A 5A 64 64 64 8F 91 8A FF FF FF FF FF FF FF .. 400 MHz // 1F30 32 32 32 64 64 64 8C 8C 8C FF FF FF FF FF FF FF .. 470 MHz - Band = FREQUENCY_GetBand(pInfo->pTX->frequency); + Band = FREQUENCY_GetBand(pInfo->p_tx->frequency); EEPROM_ReadBuffer(0x1ED0 + (Band * 16) + (pInfo->output_power * 3), TX_power, 3); @@ -533,7 +532,7 @@ void RADIO_ConfigureSquelchAndOutputPower(vfo_info_t *pInfo) FREQ_BAND_TABLE[Band].lower, (FREQ_BAND_TABLE[Band].lower + FREQ_BAND_TABLE[Band].upper) / 2, FREQ_BAND_TABLE[Band].upper, - pInfo->pTX->frequency); + pInfo->p_tx->frequency); // ******************************* } @@ -633,11 +632,11 @@ void RADIO_SetupRegisters(bool bSwitchToFunction0) #ifdef ENABLE_NOAA if (IS_NOT_NOAA_CHANNEL(g_rx_vfo->channel_save) || !g_is_noaa_mode) - Frequency = g_rx_vfo->pRX->frequency; + Frequency = g_rx_vfo->p_rx->frequency; else - Frequency = NoaaFrequencyTable[g_noaa_channel]; + Frequency = NOAA_FREQUENCY_TABLE[g_noaa_channel]; #else - Frequency = g_rx_vfo->pRX->frequency; + Frequency = g_rx_vfo->p_rx->frequency; #endif BK4819_SetFrequency(Frequency); @@ -666,8 +665,8 @@ void RADIO_SetupRegisters(bool bSwitchToFunction0) uint8_t Code = g_selected_code; if (g_css_scan_mode == CSS_SCAN_MODE_OFF) { - code_type = g_rx_vfo->pRX->code_type; - Code = g_rx_vfo->pRX->code; + code_type = g_rx_vfo->p_rx->code_type; + Code = g_rx_vfo->p_rx->code; } switch (code_type) @@ -865,7 +864,7 @@ void RADIO_SetTxParameters(void) #pragma GCC diagnostic pop - BK4819_SetFrequency(g_current_vfo->pTX->frequency); + BK4819_SetFrequency(g_current_vfo->p_tx->frequency); // TX compressor BK4819_SetCompander((g_rx_vfo->am_mode == 0 && (g_rx_vfo->compander == 1 || g_rx_vfo->compander >= 3)) ? g_rx_vfo->compander : 0); @@ -874,17 +873,17 @@ void RADIO_SetTxParameters(void) SYSTEM_DelayMs(10); - BK4819_PickRXFilterPathBasedOnFrequency(g_current_vfo->pTX->frequency); + BK4819_PickRXFilterPathBasedOnFrequency(g_current_vfo->p_tx->frequency); BK4819_set_GPIO_pin(BK4819_GPIO5_PIN1, true); SYSTEM_DelayMs(5); - BK4819_SetupPowerAmplifier(g_current_vfo->txp_calculated_setting, g_current_vfo->pTX->frequency); + BK4819_SetupPowerAmplifier(g_current_vfo->txp_calculated_setting, g_current_vfo->p_tx->frequency); SYSTEM_DelayMs(10); - switch (g_current_vfo->pTX->code_type) + switch (g_current_vfo->p_tx->code_type) { default: case CODE_TYPE_NONE: @@ -892,12 +891,12 @@ void RADIO_SetTxParameters(void) break; case CODE_TYPE_CONTINUOUS_TONE: - BK4819_SetCTCSSFrequency(CTCSS_OPTIONS[g_current_vfo->pTX->code]); + 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->pTX->code_type, g_current_vfo->pTX->code)); + BK4819_SetCDCSSCodeWord(DCS_GetGolayCodeWord(g_current_vfo->p_tx->code_type, g_current_vfo->p_tx->code)); break; } } @@ -981,7 +980,7 @@ void RADIO_PrepareTX(void) State = VFO_STATE_TX_DISABLE; } else - if (TX_freq_check(g_current_vfo->pTX->frequency) == 0) + if (TX_freq_check(g_current_vfo->p_tx->frequency) == 0) { // TX frequency is allowed if (g_current_vfo->busy_channel_lock && g_current_function == FUNCTION_RECEIVE) State = VFO_STATE_BUSY; // busy RX'ing a station @@ -1052,7 +1051,7 @@ void RADIO_PrepareTX(void) void RADIO_EnableCxCSS(void) { - switch (g_current_vfo->pTX->code_type) + switch (g_current_vfo->p_tx->code_type) { default: case CODE_TYPE_NONE: diff --git a/radio.h b/radio.h index 6637517..b5d5cd6 100644 --- a/radio.h +++ b/radio.h @@ -20,7 +20,7 @@ #include #include -#include "app/scanner.h" +#include "misc.h" #include "dcs.h" #include "frequencies.h" @@ -74,8 +74,8 @@ typedef struct vfo_info_t { freq_config_t freq_config_rx; freq_config_t freq_config_tx; - freq_config_t *pRX; - freq_config_t *pTX; + freq_config_t *p_rx; + freq_config_t *p_tx; uint32_t tx_offset_freq; uint16_t step_freq; @@ -124,8 +124,6 @@ extern dcs_code_type_t g_selected_code_type; extern dcs_code_type_t g_current_code_type; extern uint8_t g_selected_code; -extern step_setting_t g_step_setting; - extern vfo_state_t g_vfo_state[2]; bool RADIO_CheckValidChannel(uint16_t ChNum, bool bCheckScanList, uint8_t RadioNum); diff --git a/scheduler.c b/scheduler.c index 1080777..d44b6e6 100644 --- a/scheduler.c +++ b/scheduler.c @@ -78,20 +78,20 @@ void SystickHandler(void) if (g_current_function == FUNCTION_POWER_SAVE) DECREMENT_AND_TRIGGER(g_power_save_10ms, g_power_save_expired); - if (g_scan_state_dir == SCAN_OFF && g_css_scan_mode == CSS_SCAN_MODE_OFF && g_eeprom.dual_watch != DUAL_WATCH_OFF) + if (g_scan_state_dir == SCAN_STATE_DIR_OFF && g_css_scan_mode == CSS_SCAN_MODE_OFF && g_eeprom.dual_watch != DUAL_WATCH_OFF) if (g_current_function != FUNCTION_MONITOR && g_current_function != FUNCTION_TRANSMIT && g_current_function != FUNCTION_RECEIVE) DECREMENT_AND_TRIGGER(g_dual_watch_count_down_10ms, g_schedule_dual_watch); #ifdef ENABLE_NOAA - if (g_scan_state_dir == SCAN_OFF && g_css_scan_mode == CSS_SCAN_MODE_OFF && g_eeprom.dual_watch == DUAL_WATCH_OFF) + if (g_scan_state_dir == SCAN_STATE_DIR_OFF && g_css_scan_mode == CSS_SCAN_MODE_OFF && g_eeprom.dual_watch == DUAL_WATCH_OFF) if (g_is_noaa_mode && g_current_function != FUNCTION_MONITOR && g_current_function != FUNCTION_TRANSMIT) if (g_current_function != FUNCTION_RECEIVE) DECREMENT_AND_TRIGGER(g_noaa_count_down_10ms, g_schedule_noaa); #endif - if (g_scan_state_dir != SCAN_OFF || g_css_scan_mode == CSS_SCAN_MODE_SCANNING) + if (g_scan_state_dir != SCAN_STATE_DIR_OFF || g_css_scan_mode == CSS_SCAN_MODE_SCANNING) if (g_current_function != FUNCTION_MONITOR && g_current_function != FUNCTION_TRANSMIT) - DECREMENT_AND_TRIGGER(g_scan_pause_delay_in_10ms, g_schedule_scan_listen); + DECREMENT_AND_TRIGGER(g_scan_pause_delay_in_10ms, g_scan_schedule_scan_listen); DECREMENT_AND_TRIGGER(g_tail_tone_elimination_count_down_10ms, g_flag_tail_tone_elimination_complete); diff --git a/ui/main.c b/ui/main.c index a0d17e7..f1ee89d 100644 --- a/ui/main.c +++ b/ui/main.c @@ -599,12 +599,12 @@ void UI_DisplayMain(void) } else { - uint32_t frequency = g_eeprom.vfo_info[vfo_num].pRX->frequency; + uint32_t frequency = g_eeprom.vfo_info[vfo_num].p_rx->frequency; if (g_current_function == FUNCTION_TRANSMIT) { // transmitting channel = (g_eeprom.cross_vfo_rx_tx == CROSS_BAND_OFF) ? g_eeprom.rx_vfo : g_eeprom.tx_vfo; if (channel == vfo_num) - frequency = g_eeprom.vfo_info[vfo_num].pTX->frequency; + frequency = g_eeprom.vfo_info[vfo_num].p_tx->frequency; } if (g_eeprom.screen_channel[vfo_num] <= USER_CHANNEL_LAST) @@ -741,7 +741,7 @@ void UI_DisplayMain(void) } else { // or show the CTCSS/DCS symbol - const freq_config_t *pConfig = (mode == 1) ? g_eeprom.vfo_info[vfo_num].pTX : g_eeprom.vfo_info[vfo_num].pRX; + const freq_config_t *pConfig = (mode == 1) ? g_eeprom.vfo_info[vfo_num].p_tx : g_eeprom.vfo_info[vfo_num].p_rx; const unsigned int code_type = pConfig->code_type; const char *code_list[] = {"", "CT", "DCS", "DCR"}; if (code_type < ARRAY_SIZE(code_list)) diff --git a/ui/scanner.c b/ui/scanner.c index bc5e9b0..9e8e94a 100644 --- a/ui/scanner.c +++ b/ui/scanner.c @@ -29,12 +29,12 @@ #include "ui/scanner.h" #include "ui/ui.h" -void UI_DisplayScanner(void) +void UI_DisplaySearch(void) { char String[17]; bool text_centered = false; - if (g_screen_to_display != DISPLAY_SCANNER) + if (g_screen_to_display != DISPLAY_SEARCH) return; // clear display buffer @@ -46,27 +46,27 @@ void UI_DisplayScanner(void) #pragma GCC diagnostic push #pragma GCC diagnostic ignored "-Wimplicit-fallthrough=" - switch (g_scan_css_state) + switch (g_search_css_state) { default: - case SCAN_CSS_STATE_OFF: - if (!g_scan_single_frequency) + case SEARCH_CSS_STATE_OFF: + if (!g_search_single_frequency) { strcpy(String, "FREQ scanning"); break; } - case SCAN_CSS_STATE_SCANNING: - case SCAN_CSS_STATE_FOUND: - case SCAN_CSS_STATE_FAILED: - case SCAN_CSS_STATE_REPEAT: + case SEARCH_CSS_STATE_SCANNING: + case SEARCH_CSS_STATE_FOUND: + case SEARCH_CSS_STATE_FAILED: + case SEARCH_CSS_STATE_REPEAT: { - const uint32_t freq = g_scan_frequency; + const uint32_t freq = g_search_frequency; sprintf(String, "FREQ %u.%05u", freq / 100000, freq % 100000); } break; - case SCAN_CSS_STATE_FREQ_FAILED: + case SEARCH_CSS_STATE_FREQ_FAILED: strcpy(String, "FREQ none found"); break; } @@ -80,37 +80,37 @@ void UI_DisplayScanner(void) memset(String, 0, sizeof(String)); - switch (g_scan_css_state) + switch (g_search_css_state) { default: - case SCAN_CSS_STATE_OFF: + case SEARCH_CSS_STATE_OFF: strcpy(String, "CODE"); break; - case SCAN_CSS_STATE_SCANNING: + case SEARCH_CSS_STATE_SCANNING: strcpy(String, "CODE scanning"); break; - case SCAN_CSS_STATE_FOUND: - case SCAN_CSS_STATE_REPEAT: + case SEARCH_CSS_STATE_FOUND: + case SEARCH_CSS_STATE_REPEAT: - switch (g_scan_css_result_type) + switch (g_search_css_result_type) { default: case CODE_TYPE_NONE: strcpy(String, "CODE none found"); break; case CODE_TYPE_CONTINUOUS_TONE: - sprintf(String, "CTCSS %u.%uHz", CTCSS_OPTIONS[g_scan_css_result_code] / 10, CTCSS_OPTIONS[g_scan_css_result_code] % 10); + sprintf(String, "CTCSS %u.%uHz", CTCSS_OPTIONS[g_search_css_result_code] / 10, CTCSS_OPTIONS[g_search_css_result_code] % 10); break; case CODE_TYPE_DIGITAL: case CODE_TYPE_REVERSE_DIGITAL: - sprintf(String, "CDCSS D%03oN", DCS_OPTIONS[g_scan_css_result_code]); + sprintf(String, "CDCSS D%03oN", DCS_OPTIONS[g_search_css_result_code]); break; } break; - case SCAN_CSS_STATE_FAILED: + case SEARCH_CSS_STATE_FAILED: strcpy(String, "CODE none found"); break; } @@ -125,36 +125,36 @@ void UI_DisplayScanner(void) #pragma GCC diagnostic push #pragma GCC diagnostic ignored "-Wimplicit-fallthrough=" - switch (g_scanner_edit_state) + switch (g_search_edit_state) { default: - case SCAN_EDIT_STATE_NONE: + case SEARCH_EDIT_STATE_NONE: - switch (g_scan_css_state) + switch (g_search_css_state) { default: - case SCAN_CSS_STATE_OFF: - case SCAN_CSS_STATE_SCANNING: // rolling indicator + case SEARCH_CSS_STATE_OFF: + case SEARCH_CSS_STATE_SCANNING: // rolling indicator memset(String, 0, sizeof(String)); memset(String, '.', 15); - String[(g_scan_freq_css_timer_10ms / 32) % 15] = '#'; + String[(g_search_freq_css_timer_10ms / 32) % 15] = '#'; break; - case SCAN_CSS_STATE_FOUND: + case SEARCH_CSS_STATE_FOUND: strcpy(String, "* repeat M save"); text_centered = true; break; - case SCAN_CSS_STATE_FAILED: - if (!g_scan_single_frequency) + case SEARCH_CSS_STATE_FAILED: + if (!g_search_single_frequency) { strcpy(String, "* repeat M save"); text_centered = true; break; } - case SCAN_CSS_STATE_FREQ_FAILED: - case SCAN_CSS_STATE_REPEAT: + case SEARCH_CSS_STATE_FREQ_FAILED: + case SEARCH_CSS_STATE_REPEAT: strcpy(String, "* repeat"); text_centered = true; break; @@ -162,18 +162,18 @@ void UI_DisplayScanner(void) break; - case SCAN_EDIT_STATE_SAVE_CHAN: + case SEARCH_EDIT_STATE_SAVE_CHAN: strcpy(String, "SAVE "); { char s[11]; - BOARD_fetchChannelName(s, g_scan_channel); + BOARD_fetchChannelName(s, g_search_channel); if (s[0] == 0) - UI_GenerateChannelStringEx(s, g_show_chan_prefix ? "CH-" : "", g_scan_channel); + UI_GenerateChannelStringEx(s, g_search_show_chan_prefix ? "CH-" : "", g_search_channel); strcat(String, s); } break; - case SCAN_EDIT_STATE_SAVE_CONFIRM: + case SEARCH_EDIT_STATE_SAVE_CONFIRM: strcpy(String, "* repeat Save ?"); text_centered = true; break; diff --git a/ui/scanner.h b/ui/scanner.h index ab04aff..9eefa4e 100644 --- a/ui/scanner.h +++ b/ui/scanner.h @@ -17,7 +17,7 @@ #ifndef UI_SCANNER_H #define UI_SCANNER_H -void UI_DisplayScanner(void); +void UI_DisplaySearch(void); #endif diff --git a/ui/status.c b/ui/status.c index d0d4799..d6e2090 100644 --- a/ui/status.c +++ b/ui/status.c @@ -95,9 +95,9 @@ void UI_DisplayStatus(const bool test_display) else #endif // SCAN indicator - if (g_scan_state_dir != SCAN_OFF || g_screen_to_display == DISPLAY_SCANNER || test_display) + if (g_scan_state_dir != SCAN_STATE_DIR_OFF || g_screen_to_display == DISPLAY_SEARCH || test_display) { - if (g_next_channel <= USER_CHANNEL_LAST) + if (g_scan_next_channel <= USER_CHANNEL_LAST) { // channel mode if (g_eeprom.scan_list_default == 0) UI_PrintStringSmallBuffer("1", line + x); diff --git a/ui/ui.c b/ui/ui.c index 94507a4..d889e35 100644 --- a/ui/ui.c +++ b/ui/ui.c @@ -61,8 +61,8 @@ void GUI_DisplayScreen(void) UI_DisplayMenu(); break; - case DISPLAY_SCANNER: - UI_DisplayScanner(); + case DISPLAY_SEARCH: + UI_DisplaySearch(); break; #ifdef ENABLE_AIRCOPY @@ -88,7 +88,7 @@ void GUI_SelectNextDisplay(gui_display_type_t Display) g_input_box_index = 0; g_is_in_sub_menu = false; g_css_scan_mode = CSS_SCAN_MODE_OFF; - g_scan_state_dir = SCAN_OFF; + g_scan_state_dir = SCAN_STATE_DIR_OFF; #ifdef ENABLE_FMRADIO g_fm_scan_state = FM_SCAN_OFF; #endif diff --git a/ui/ui.h b/ui/ui.h index 664bb13..0a7c006 100644 --- a/ui/ui.h +++ b/ui/ui.h @@ -25,7 +25,7 @@ enum gui_display_type_e DISPLAY_MAIN = 0, DISPLAY_FM, DISPLAY_MENU, - DISPLAY_SCANNER, + DISPLAY_SEARCH, DISPLAY_AIRCOPY, DISPLAY_INVALID // 0xff };