From 4e4868c212d7539f526375580294db5a79bf73c8 Mon Sep 17 00:00:00 2001 From: OneOfEleven Date: Mon, 9 Oct 2023 17:01:26 +0100 Subject: [PATCH] Timeout added to the code scan part of F+4 freq/code scan operation --- Makefile | 14 ++- README.md | 3 +- app/action.c | 2 +- app/app.c | 297 ++++++++++++++++++++++++-------------------- app/app.h | 2 +- app/main.c | 2 +- app/scanner.c | 288 +++++++++++++++++++++--------------------- app/scanner.h | 39 +++--- firmware.bin | Bin 0 -> 60048 bytes firmware.packed.bin | Bin 0 -> 60066 bytes functions.c | 2 +- misc.c | 1 + misc.h | 7 ++ radio.c | 4 +- radio.h | 3 +- ui/scanner.c | 142 ++++++++++++++++----- 16 files changed, 464 insertions(+), 342 deletions(-) create mode 100644 firmware.bin create mode 100644 firmware.packed.bin diff --git a/Makefile b/Makefile index 70af838..b86b256 100644 --- a/Makefile +++ b/Makefile @@ -8,7 +8,7 @@ ENABLE_SWD := 0 ENABLE_OVERLAY := 0 ENABLE_LTO := 1 ENABLE_UART := 1 -ENABLE_UART_DEBUG := 0 +ENABLE_UART_DEBUG := 1 ENABLE_AIRCOPY := 1 ENABLE_FMRADIO := 1 ENABLE_NOAA := 1 @@ -29,6 +29,7 @@ ENABLE_BOOT_BEEPS := 0 ENABLE_SHOW_CHARGE_LEVEL := 1 ENABLE_REVERSE_BAT_SYMBOL := 1 ENABLE_CODE_SCAN_TIMEOUT := 0 +ENABLE_FREQ_CODE_SCAN_TIMEOUT := 1 ENABLE_AM_FIX := 1 ENABLE_AM_FIX_SHOW_DATA := 1 ENABLE_SQUELCH_MORE_SENSITIVE := 1 @@ -44,6 +45,10 @@ ENABLE_COPY_CHAN_TO_VFO := 1 TARGET = firmware +ifeq ($(ENABLE_UART), 0) + ENABLE_UART_DEBUG := 0 +endif + ifeq ($(ENABLE_CLANG),1) # GCC's linker, ld, doesn't understand LLVM's generated bytecode ENABLE_LTO := 0 @@ -59,10 +64,6 @@ ifeq ($(ENABLE_SHOW_TX_TIMEOUT),1) ENABLE_AUDIO_BAR := 0 endif -ifeq ($(ENABLE_UART_DEBUG),1) - ENABLE_UART := 1 -endif - BSP_DEFINITIONS := $(wildcard hardware/*/*.def) BSP_HEADERS := $(patsubst hardware/%,bsp/%,$(BSP_DEFINITIONS)) BSP_HEADERS := $(patsubst %.def,%.h,$(BSP_HEADERS)) @@ -296,6 +297,9 @@ endif ifeq ($(ENABLE_CODE_SCAN_TIMEOUT),1) CFLAGS += -DENABLE_CODE_SCAN_TIMEOUT endif +ifeq ($(ENABLE_FREQ_CODE_SCAN_TIMEOUT),1) + CFLAGS += -DENABLE_FREQ_CODE_SCAN_TIMEOUT +endif ifeq ($(ENABLE_AM_FIX),1) CFLAGS += -DENABLE_AM_FIX endif diff --git a/README.md b/README.md index 0600291..b411c3e 100644 --- a/README.md +++ b/README.md @@ -55,7 +55,8 @@ ENABLE_CTCSS_TAIL_PHASE_SHIFT := 1 standard CTCSS tail phase shift rather ENABLE_BOOT_BEEPS := 0 gives user audio feedback on volume knob position at boot-up ENABLE_SHOW_CHARGE_LEVEL := 0 show the charge level when the radio is on charge ENABLE_REVERSE_BAT_SYMBOL := 1 mirror the battery symbol on the status bar (+ pole on the right) -ENABLE_CODE_SCAN_TIMEOUT := 0 enable/disable 32-sec CTCSS/DCS scan timeout (press exit butt instead of time-out to end scan) +ENABLE_CODE_SCAN_TIMEOUT := 0 timeout if CTCSS/CDCSS is not found +ENABLE_FREQ_CODE_SCAN_TIMEOUT := 1 timeout if CTCSS/CDCSS is not found after a successful frequency scan ENABLE_AM_FIX := 1 dynamically adjust the front end gains when in AM mode to helo prevent AM demodulator saturation, ignore the on-screen RSSI level (for now) ENABLE_AM_FIX_SHOW_DATA := 1 show debug data for the AM fix (still tweaking it) ENABLE_SQUELCH_MORE_SENSITIVE := 1 make squelch levels a little bit more sensitive - I plan to let user adjust the values themselves diff --git a/app/action.c b/app/action.c index 21840f4..2e73ace 100644 --- a/app/action.c +++ b/app/action.c @@ -92,7 +92,7 @@ void ACTION_Monitor(void) { g_scan_pause_delay_in_10ms = scan_pause_delay_in_1_10ms; g_schedule_scan_listen = false; - gScanPauseMode = true; + g_scan_pause_mode = true; } #ifdef ENABLE_NOAA diff --git a/app/app.c b/app/app.c index 1a87824..a6dc854 100644 --- a/app/app.c +++ b/app/app.c @@ -495,11 +495,11 @@ void APP_StartListening(function_type_t Function, const bool reset_am_fix) switch (g_eeprom.scan_resume_mode) { case SCAN_RESUME_TO: - if (!gScanPauseMode) + if (!g_scan_pause_mode) { g_scan_pause_delay_in_10ms = scan_pause_delay_in_1_10ms; g_schedule_scan_listen = false; - gScanPauseMode = true; + g_scan_pause_mode = true; } break; @@ -510,7 +510,7 @@ void APP_StartListening(function_type_t Function, const bool reset_am_fix) break; } - bScanKeepFrequency = true; + g_scan_keep_frequency = true; } #ifdef ENABLE_NOAA @@ -637,7 +637,7 @@ static void FREQ_NextChannel(void) g_scan_pause_delay_in_10ms = scan_pause_delay_in_6_10ms; #endif - bScanKeepFrequency = false; + g_scan_keep_frequency = false; g_update_display = true; } @@ -737,7 +737,7 @@ static void USER_NextChannel(void) g_scan_pause_delay_in_10ms = scan_pause_delay_in_3_10ms; #endif - bScanKeepFrequency = false; + g_scan_keep_frequency = false; if (enabled) if (++g_current_scan_list >= SCAN_NEXT_NUM) @@ -1094,7 +1094,7 @@ void APP_Update(void) USER_NextChannel(); // switch to next channel } - gScanPauseMode = false; + g_scan_pause_mode = false; g_rx_reception_mode = RX_MODE_NONE; g_schedule_scan_listen = false; } @@ -1149,7 +1149,7 @@ void APP_Update(void) GUI_SelectNextDisplay(DISPLAY_MAIN); g_rx_vfo_is_active = false; - gScanPauseMode = false; + g_scan_pause_mode = false; g_rx_reception_mode = RX_MODE_NONE; g_schedule_dual_watch = false; } @@ -1330,7 +1330,7 @@ void APP_CheckKeys(void) g_ptt_debounce_counter = 0; // ***************** - + // scan the hardware keys Key = KEYBOARD_Poll(); @@ -1350,7 +1350,7 @@ void APP_CheckKeys(void) g_boot_counter_10ms = 0; // cancel the boot-up screen return; // the PC is uploading/downloading config } - + if (g_key_reading_0 != Key) { // new key pressed @@ -1557,10 +1557,12 @@ void APP_TimeSlice10ms(void) if (g_screen_to_display == DISPLAY_SCANNER) { - uint32_t Result; - int32_t Delta; + uint32_t Result; + int32_t Delta; + uint16_t CtcssFreq; BK4819_CSS_scan_result_t ScanResult; - uint16_t CtcssFreq; + + g_scan_freq_css_timer_10ms++; if (g_scan_delay_10ms > 0) { @@ -1571,58 +1573,95 @@ void APP_TimeSlice10ms(void) } } - if (gScannerEditState != SCAN_EDIT_STATE_NONE) + if (g_scanner_edit_state != SCAN_EDIT_STATE_NONE) { APP_CheckKeys(); return; } - switch (gScanCssState) + g_update_display = true; + GUI_SelectNextDisplay(DISPLAY_SCANNER); + + switch (g_scan_css_state) { case SCAN_CSS_STATE_OFF: + if (g_scan_freq_css_timer_10ms >= scan_freq_css_timeout_10ms) + { // freq/css scan timeout + #ifdef ENABLE_CODE_SCAN_TIMEOUT + BK4819_DisableFrequencyScan(); + g_scan_css_state = SCAN_CSS_STATE_FREQ_FAILED; + g_update_status = true; + g_update_display = true; + break; + #endif + } + if (!BK4819_GetFrequencyScanResult(&Result)) - break; + break; // still scanning // accept only within 1kHz - Delta = Result - gScanFrequency; - gScanHitCount = (abs(Delta) < 100) ? gScanHitCount + 1 : 0; + Delta = Result - g_scan_frequency; + g_scan_hit_count = (abs(Delta) < 100) ? g_scan_hit_count + 1 : 0; BK4819_DisableFrequencyScan(); #if 0 - gScanFrequency = Result; + g_scan_frequency = Result; #else { // round to nearest step multiple const uint32_t step = STEP_FREQ_TABLE[g_step_setting]; - gScanFrequency = ((Result + (step / 2)) / step) * step; + g_scan_frequency = ((Result + (step / 2)) / step) * step; } #endif - if (gScanHitCount < 3) + if (g_scan_hit_count < 3) { // keep scanning for an RF carrier BK4819_EnableFrequencyScan(); } else - { // RF carrier found .. stop RF scanning - BK4819_SetScanFrequency(gScanFrequency); + { // RF carrier found + // stop RF the scan and move on too the CTCSS/CDCSS scan - // start CTCSS/CTDSS scanning - gScanCssResultCode = 0xFF; - gScanCssResultType = 0xFF; - gScanHitCount = 0; - gScanUseCssResult = false; - gScanProgressIndicator = 0; - gScanCssState = SCAN_CSS_STATE_SCANNING; + BK4819_SetScanFrequency(g_scan_frequency); + + g_scan_css_result_code = 0xFF; + g_scan_css_result_type = 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; GUI_SelectNextDisplay(DISPLAY_SCANNER); - g_update_status = true; + g_update_status = true; + g_update_display = true; } g_scan_delay_10ms = scan_freq_css_delay_10ms; break; case SCAN_CSS_STATE_SCANNING: + + if (g_scan_freq_css_timer_10ms >= scan_freq_css_timeout_10ms) + { // timeout + #if defined(ENABLE_CODE_SCAN_TIMEOUT) + BK4819_Disable(); + g_scan_css_state = SCAN_CSS_STATE_FAILED; + g_update_status = true; + g_update_display = true; + break; + #elif defined(ENABLE_FREQ_CODE_SCAN_TIMEOUT) + if (!g_scan_single_frequency) + { + BK4819_Disable(); + g_scan_css_state = SCAN_CSS_STATE_FAILED; + g_update_status = true; + g_update_display = true; + break; + } + #endif + } + ScanResult = BK4819_GetCxCSSScanResult(&Result, &CtcssFreq); if (ScanResult == BK4819_CSS_RESULT_NOT_FOUND) break; @@ -1634,46 +1673,52 @@ void APP_TimeSlice10ms(void) const uint8_t Code = DCS_GetCdcssCode(Result); if (Code != 0xFF) { - gScanCssResultCode = Code; - gScanCssResultType = CODE_TYPE_DIGITAL; - gScanCssState = SCAN_CSS_STATE_FOUND; - gScanUseCssResult = true; - g_update_status = true; + 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_update_status = true; + g_update_display = true; } } else if (ScanResult == BK4819_CSS_RESULT_CTCSS) { - const uint8_t Code = DCS_GetCtcssCode(CtcssFreq); - if (Code != 0xFF) + const uint8_t code = DCS_GetCtcssCode(CtcssFreq); + if (code != 0xFF) { - if (Code == gScanCssResultCode && gScanCssResultType == CODE_TYPE_CONTINUOUS_TONE) + if (code == g_scan_css_result_code && + g_scan_css_result_type == CODE_TYPE_CONTINUOUS_TONE) { - if (++gScanHitCount >= 2) + if (++g_scan_hit_count >= 2) { - gScanCssState = SCAN_CSS_STATE_FOUND; - gScanUseCssResult = true; - g_update_status = true; + g_scan_css_state = SCAN_CSS_STATE_FOUND; + g_scan_use_css_result = true; + g_update_status = true; + g_update_display = true; } } else - gScanHitCount = 0; + g_scan_hit_count = 0; - gScanCssResultType = CODE_TYPE_CONTINUOUS_TONE; - gScanCssResultCode = Code; + g_scan_css_result_type = CODE_TYPE_CONTINUOUS_TONE; + g_scan_css_result_code = code; } } - if (gScanCssState == SCAN_CSS_STATE_OFF || gScanCssState == SCAN_CSS_STATE_SCANNING) + if (g_scan_css_state == SCAN_CSS_STATE_OFF || + g_scan_css_state == SCAN_CSS_STATE_SCANNING) { // re-start scan - BK4819_SetScanFrequency(gScanFrequency); + BK4819_SetScanFrequency(g_scan_frequency); g_scan_delay_10ms = scan_freq_css_delay_10ms; - break; } GUI_SelectNextDisplay(DISPLAY_SCANNER); break; + //case SCAN_CSS_STATE_FOUND: + //case SCAN_CSS_STATE_FAILED: + //case SCAN_CSS_STATE_FREQ_FAILED: default: break; } @@ -1835,75 +1880,80 @@ void APP_TimeSlice500ms(void) #endif { #ifdef ENABLE_AIRCOPY - if (g_scan_state_dir == SCAN_OFF && g_screen_to_display != DISPLAY_AIRCOPY && (g_screen_to_display != DISPLAY_SCANNER || gScanCssState >= SCAN_CSS_STATE_FOUND)) - #else - if (g_scan_state_dir == SCAN_OFF && (g_screen_to_display != DISPLAY_SCANNER || gScanCssState >= SCAN_CSS_STATE_FOUND)) + if (g_screen_to_display != DISPLAY_AIRCOPY) #endif - { - if (g_eeprom.auto_keypad_lock && g_key_lock_count_down > 0 && !g_dtmf_input_mode) + { + if (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_FREQ_FAILED)) { - if (--g_key_lock_count_down == 0) - g_eeprom.key_lock = true; // lock the keyboard - g_update_status = true; // lock symbol needs showing - } - - if (exit_menu) - { - g_menu_count_down = 0; - - if (g_eeprom.backlight == 0) + if (g_eeprom.auto_keypad_lock && g_key_lock_count_down > 0 && !g_dtmf_input_mode) { - g_backlight_count_down = 0; - GPIO_ClearBit(&GPIOB->DATA, GPIOB_PIN_BACKLIGHT); // turn the backlight OFF + if (--g_key_lock_count_down == 0) + g_eeprom.key_lock = true; // lock the keyboard + g_update_status = true; // lock symbol needs showing } - - 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 (exit_menu) { - BK4819_StopScan(); - - RADIO_ConfigureChannel(0, VFO_CONFIGURE_RELOAD); - RADIO_ConfigureChannel(1, VFO_CONFIGURE_RELOAD); - - RADIO_SetupRegisters(true); - } -*/ - DTMF_clear_input_box(); - - g_f_key_was_pressed = false; - g_input_box_index = 0; - - g_ask_to_save = false; - g_ask_to_delete = false; - - g_update_status = true; - g_update_display = true; - - { - gui_display_type_t disp = DISPLAY_INVALID; - - #ifdef ENABLE_FMRADIO - if (g_fm_radio_mode && - g_current_function != FUNCTION_RECEIVE && - g_current_function != FUNCTION_MONITOR && - g_current_function != FUNCTION_TRANSMIT) - { - disp = DISPLAY_FM; - } - #endif - - if (disp == DISPLAY_INVALID) + g_menu_count_down = 0; + + if (g_eeprom.backlight == 0) { - #ifndef ENABLE_CODE_SCAN_TIMEOUT - if (g_screen_to_display != DISPLAY_SCANNER) - #endif - disp = DISPLAY_MAIN; + g_backlight_count_down = 0; + GPIO_ClearBit(&GPIOB->DATA, GPIOB_PIN_BACKLIGHT); // turn the backlight OFF + } + + 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) + { + BK4819_StopScan(); + + RADIO_ConfigureChannel(0, VFO_CONFIGURE_RELOAD); + RADIO_ConfigureChannel(1, VFO_CONFIGURE_RELOAD); + + RADIO_SetupRegisters(true); + } +*/ + DTMF_clear_input_box(); + + g_f_key_was_pressed = false; + g_input_box_index = 0; + + g_ask_to_save = false; + g_ask_to_delete = false; + + g_update_status = true; + g_update_display = true; + + { + gui_display_type_t disp = DISPLAY_INVALID; + + #ifdef ENABLE_FMRADIO + if (g_fm_radio_mode && + g_current_function != FUNCTION_RECEIVE && + g_current_function != FUNCTION_MONITOR && + g_current_function != FUNCTION_TRANSMIT) + { + disp = DISPLAY_FM; + } + #endif + + if (disp == DISPLAY_INVALID) + { + #ifndef ENABLE_CODE_SCAN_TIMEOUT + if (g_screen_to_display != DISPLAY_SCANNER) + #endif + disp = DISPLAY_MAIN; + } + + if (disp != DISPLAY_INVALID) + GUI_SelectNextDisplay(disp); } - - if (disp != DISPLAY_INVALID) - GUI_SelectNextDisplay(disp); } } } @@ -1983,27 +2033,6 @@ void APP_TimeSlice500ms(void) } } - if (g_screen_to_display == DISPLAY_SCANNER && - gScannerEditState == SCAN_EDIT_STATE_NONE && - gScanCssState < SCAN_CSS_STATE_FOUND) - { - gScanProgressIndicator++; - - #ifdef ENABLE_CODE_SCAN_TIMEOUT - if (gScanProgressIndicator > 32) - { - if (gScanCssState == SCAN_CSS_STATE_SCANNING && !g_scan_single_frequency) - gScanCssState = SCAN_CSS_STATE_FOUND; - else - gScanCssState = SCAN_CSS_STATE_FAILED; - - g_update_status = true; - } - #endif - - g_update_display = true; - } - if (g_current_function != FUNCTION_TRANSMIT) { if (g_dtmf_decode_ring_count_down_500ms > 0) @@ -2080,7 +2109,7 @@ void APP_TimeSlice500ms(void) } #endif -void CHANNEL_Next(const bool flag, const int8_t scan_direction) +void CHANNEL_Next(const bool flag, const scan_state_dir_t scan_direction) { RADIO_SelectVfos(); @@ -2104,8 +2133,8 @@ void CHANNEL_Next(const bool flag, const int8_t scan_direction) g_scan_pause_delay_in_10ms = scan_pause_delay_in_2_10ms; g_schedule_scan_listen = false; g_rx_reception_mode = RX_MODE_NONE; - gScanPauseMode = false; - bScanKeepFrequency = false; + g_scan_pause_mode = false; + g_scan_keep_frequency = false; } static void APP_ProcessKey(const key_code_t Key, const bool key_pressed, const bool key_held) diff --git a/app/app.h b/app/app.h index 64231be..0727828 100644 --- a/app/app.h +++ b/app/app.h @@ -29,7 +29,7 @@ extern const uint8_t orig_mixer; extern const uint8_t orig_pga; void APP_EndTransmission(void); -void CHANNEL_Next(const bool flag, const int8_t scan_direction); +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); diff --git a/app/main.c b/app/main.c index 4853ca9..ca92f79 100644 --- a/app/main.c +++ b/app/main.c @@ -709,7 +709,7 @@ static void MAIN_Key_STAR(bool key_pressed, bool key_held) g_update_status = true; } -static void MAIN_Key_UP_DOWN(bool key_pressed, bool key_held, int8_t Direction) +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]; diff --git a/app/scanner.c b/app/scanner.c index 2ea9488..d59af5b 100644 --- a/app/scanner.c +++ b/app/scanner.c @@ -26,103 +26,103 @@ #include "ui/inputbox.h" #include "ui/ui.h" -dcs_code_type_t gScanCssResultType; -uint8_t gScanCssResultCode; +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 gScannerEditState; -uint8_t gScanChannel; -uint32_t gScanFrequency; -bool gScanPauseMode; -SCAN_CssState_t gScanCssState; +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; -uint8_t gScanProgressIndicator; -uint8_t gScanHitCount; -bool gScanUseCssResult; -int8_t g_scan_state_dir; -bool bScanKeepFrequency; +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; static void SCANNER_Key_DIGITS(key_code_t Key, bool key_pressed, bool key_held) { - if (!key_held && key_pressed) + if (key_held || !key_pressed) + return; + + if (g_scanner_edit_state == SCAN_EDIT_STATE_BUSY) { - if (gScannerEditState == SCAN_EDIT_STATE_BUSY) + uint16_t Channel; + + g_beep_to_play = BEEP_1KHZ_60MS_OPTIONAL; + + INPUTBOX_Append(Key); + + g_request_display_screen = DISPLAY_SCANNER; + + if (g_input_box_index < 3) { - uint16_t Channel; - - g_beep_to_play = BEEP_1KHZ_60MS_OPTIONAL; - - INPUTBOX_Append(Key); - - g_request_display_screen = DISPLAY_SCANNER; - - if (g_input_box_index < 3) - { - #ifdef ENABLE_VOICE - g_another_voice_id = (voice_id_t)Key; - #endif - return; - } - - g_input_box_index = 0; - - Channel = ((g_input_box[0] * 100) + (g_input_box[1] * 10) + g_input_box[2]) - 1; - if (Channel <= USER_CHANNEL_LAST) - { - #ifdef ENABLE_VOICE - g_another_voice_id = (voice_id_t)Key; - #endif - g_show_chan_prefix = RADIO_CheckValidChannel(Channel, false, 0); - gScanChannel = (uint8_t)Channel; - return; - } + #ifdef ENABLE_VOICE + g_another_voice_id = (voice_id_t)Key; + #endif + return; } - g_beep_to_play = BEEP_500HZ_60MS_DOUBLE_BEEP_OPTIONAL; + g_input_box_index = 0; + + Channel = ((g_input_box[0] * 100) + (g_input_box[1] * 10) + g_input_box[2]) - 1; + if (Channel <= USER_CHANNEL_LAST) + { + #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; + return; + } } + + g_beep_to_play = BEEP_500HZ_60MS_DOUBLE_BEEP_OPTIONAL; } static void SCANNER_Key_EXIT(bool key_pressed, bool key_held) { - if (!key_held && key_pressed) + if (key_held || !key_pressed) + return; + + g_beep_to_play = BEEP_1KHZ_60MS_OPTIONAL; + + switch (g_scanner_edit_state) { - g_beep_to_play = BEEP_1KHZ_60MS_OPTIONAL; + case SCAN_EDIT_STATE_NONE: + g_request_display_screen = DISPLAY_MAIN; - switch (gScannerEditState) - { - case SCAN_EDIT_STATE_NONE: - g_request_display_screen = DISPLAY_MAIN; + 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; + #ifdef ENABLE_VOICE + g_another_voice_id = VOICE_ID_CANCEL; + #endif + break; - 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; - #ifdef ENABLE_VOICE - g_another_voice_id = VOICE_ID_CANCEL; - #endif + case SCAN_EDIT_STATE_BUSY: + if (g_input_box_index > 0) + { + g_input_box[--g_input_box_index] = 10; + g_request_display_screen = DISPLAY_SCANNER; break; + } - case SCAN_EDIT_STATE_BUSY: - if (g_input_box_index > 0) - { - g_input_box[--g_input_box_index] = 10; - g_request_display_screen = DISPLAY_SCANNER; - break; - } + // Fallthrough - // Fallthrough - - case SCAN_EDIT_STATE_DONE: - gScannerEditState = SCAN_EDIT_STATE_NONE; - #ifdef ENABLE_VOICE - g_another_voice_id = VOICE_ID_CANCEL; - #endif - g_request_display_screen = DISPLAY_SCANNER; - break; - } + case SCAN_EDIT_STATE_DONE: + g_scanner_edit_state = SCAN_EDIT_STATE_NONE; + #ifdef ENABLE_VOICE + g_another_voice_id = VOICE_ID_CANCEL; + #endif + g_request_display_screen = DISPLAY_SCANNER; + break; } } @@ -136,13 +136,13 @@ static void SCANNER_Key_MENU(bool key_pressed, bool key_held) if (!key_pressed) return; - if (gScanCssState == SCAN_CSS_STATE_OFF && !g_scan_single_frequency) + if (g_scan_css_state == SCAN_CSS_STATE_OFF && !g_scan_single_frequency) { g_beep_to_play = BEEP_500HZ_60MS_DOUBLE_BEEP_OPTIONAL; return; } - if (gScanCssState == SCAN_CSS_STATE_SCANNING) + if (g_scan_css_state == SCAN_CSS_STATE_SCANNING) { if (g_scan_single_frequency) { @@ -151,7 +151,7 @@ static void SCANNER_Key_MENU(bool key_pressed, bool key_held) } } - if (gScanCssState == SCAN_CSS_STATE_FAILED) + if (g_scan_css_state == SCAN_CSS_STATE_FAILED) { g_beep_to_play = BEEP_500HZ_60MS_DOUBLE_BEEP_OPTIONAL; return; @@ -159,17 +159,17 @@ static void SCANNER_Key_MENU(bool key_pressed, bool key_held) g_beep_to_play = BEEP_1KHZ_60MS_OPTIONAL; - switch (gScannerEditState) + switch (g_scanner_edit_state) { case SCAN_EDIT_STATE_NONE: if (!g_scan_single_frequency) { #if 0 - uint32_t Freq250 = FREQUENCY_FloorToStep(gScanFrequency, 250, 0); - uint32_t Freq625 = FREQUENCY_FloorToStep(gScanFrequency, 625, 0); + uint32_t Freq250 = FREQUENCY_FloorToStep(g_scan_frequency, 250, 0); + uint32_t Freq625 = FREQUENCY_FloorToStep(g_scan_frequency, 625, 0); - int16_t Delta250 = (int16_t)gScanFrequency - (int16_t)Freq250; + int16_t Delta250 = (int16_t)g_scan_frequency - (int16_t)Freq250; int16_t Delta625; if (125 < Delta250) @@ -178,7 +178,7 @@ static void SCANNER_Key_MENU(bool key_pressed, bool key_held) Freq250 += 250; } - Delta625 = (int16_t)gScanFrequency - (int16_t)Freq625; + Delta625 = (int16_t)g_scan_frequency - (int16_t)Freq625; if (312 < Delta625) { @@ -189,12 +189,12 @@ static void SCANNER_Key_MENU(bool key_pressed, bool key_held) if (Delta625 < Delta250) { g_step_setting = STEP_6_25kHz; - gScanFrequency = Freq625; + g_scan_frequency = Freq625; } else { g_step_setting = STEP_2_5kHz; - gScanFrequency = Freq250; + g_scan_frequency = Freq250; } #else @@ -209,11 +209,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(gScanFrequency, small_step_freq, 0); - uint32_t freq_big_step = FREQUENCY_FloorToStep(gScanFrequency, big_step_freq, 0); + 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); - int32_t delta_small_step = (int32_t)gScanFrequency - freq_small_step; - int32_t delta_big_step = (int32_t)gScanFrequency - freq_big_step; + 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; if (delta_small_step > 125) { @@ -221,7 +221,7 @@ static void SCANNER_Key_MENU(bool key_pressed, bool key_held) freq_big_step += small_step_freq; } - delta_big_step = (int32_t)gScanFrequency - freq_big_step; + delta_big_step = (int32_t)g_scan_frequency - freq_big_step; if (delta_big_step > 312) { @@ -232,28 +232,28 @@ static void SCANNER_Key_MENU(bool key_pressed, bool key_held) if (delta_small_step >= delta_big_step) { g_step_setting = small_step; - gScanFrequency = freq_small_step; + g_scan_frequency = freq_small_step; } else { g_step_setting = big_step; - gScanFrequency = freq_big_step; + g_scan_frequency = freq_big_step; } #endif } if (g_tx_vfo->channel_save <= USER_CHANNEL_LAST) { - gScannerEditState = SCAN_EDIT_STATE_BUSY; - gScanChannel = g_tx_vfo->channel_save; + g_scanner_edit_state = SCAN_EDIT_STATE_BUSY; + g_scan_channel = g_tx_vfo->channel_save; g_show_chan_prefix = RADIO_CheckValidChannel(g_tx_vfo->channel_save, false, 0); } else { - gScannerEditState = SCAN_EDIT_STATE_DONE; + g_scanner_edit_state = SCAN_EDIT_STATE_DONE; } - gScanCssState = SCAN_CSS_STATE_FOUND; + g_scan_css_state = SCAN_CSS_STATE_FOUND; #ifdef ENABLE_VOICE g_another_voice_id = VOICE_ID_MEMORY_CHANNEL; @@ -268,19 +268,19 @@ static void SCANNER_Key_MENU(bool key_pressed, bool key_held) { g_beep_to_play = BEEP_1KHZ_60MS_OPTIONAL; g_request_display_screen = DISPLAY_SCANNER; - gScannerEditState = SCAN_EDIT_STATE_DONE; + g_scanner_edit_state = SCAN_EDIT_STATE_DONE; } break; case SCAN_EDIT_STATE_DONE: if (!g_scan_single_frequency) { - RADIO_InitInfo(g_tx_vfo, g_tx_vfo->channel_save, gScanFrequency); + RADIO_InitInfo(g_tx_vfo, g_tx_vfo->channel_save, g_scan_frequency); - if (gScanUseCssResult) + if (g_scan_use_css_result) { - g_tx_vfo->freq_config_rx.code_type = gScanCssResultType; - g_tx_vfo->freq_config_rx.code = gScanCssResultCode; + 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_tx = g_tx_vfo->freq_config_rx; @@ -291,15 +291,15 @@ static void SCANNER_Key_MENU(bool key_pressed, bool key_held) RADIO_ConfigureChannel(0, VFO_CONFIGURE_RELOAD); RADIO_ConfigureChannel(1, VFO_CONFIGURE_RELOAD); - g_tx_vfo->freq_config_rx.code_type = gScanCssResultType; - g_tx_vfo->freq_config_rx.code = gScanCssResultCode; - g_tx_vfo->freq_config_tx.code_type = gScanCssResultType; - g_tx_vfo->freq_config_tx.code = gScanCssResultCode; + 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_tx.code_type = g_scan_css_result_type; + g_tx_vfo->freq_config_tx.code = g_scan_css_result_code; } if (g_tx_vfo->channel_save <= USER_CHANNEL_LAST) { - Channel = gScanChannel; + Channel = g_scan_channel; g_eeprom.user_channel[g_eeprom.tx_vfo] = Channel; } else @@ -316,7 +316,7 @@ static void SCANNER_Key_MENU(bool key_pressed, bool key_held) g_another_voice_id = VOICE_ID_CONFIRM; #endif - gScannerEditState = SCAN_EDIT_STATE_NONE; + g_scanner_edit_state = SCAN_EDIT_STATE_NONE; g_request_display_screen = DISPLAY_SCANNER; break; @@ -329,12 +329,11 @@ static void SCANNER_Key_MENU(bool key_pressed, bool key_held) static void SCANNER_Key_STAR(bool key_pressed, bool key_held) { - if (!key_held && key_pressed) - { - g_beep_to_play = BEEP_1KHZ_60MS_OPTIONAL; - g_flag_start_scan = true; - } - return; + if (key_held || !key_pressed) + return; + + g_beep_to_play = BEEP_1KHZ_60MS_OPTIONAL; + g_flag_start_scan = true; } static void SCANNER_Key_UP_DOWN(bool key_pressed, bool pKeyHeld, int8_t Direction) @@ -353,10 +352,10 @@ static void SCANNER_Key_UP_DOWN(bool key_pressed, bool pKeyHeld, int8_t Directio g_beep_to_play = BEEP_1KHZ_60MS_OPTIONAL; } - if (gScannerEditState == SCAN_EDIT_STATE_BUSY) + if (g_scanner_edit_state == SCAN_EDIT_STATE_BUSY) { - gScanChannel = NUMBER_AddWithWraparound(gScanChannel, Direction, 0, USER_CHANNEL_LAST); - g_show_chan_prefix = RADIO_CheckValidChannel(gScanChannel, false, 0); + 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; } else @@ -423,8 +422,8 @@ void SCANNER_Start(void) RADIO_InitInfo(g_rx_vfo, g_rx_vfo->channel_save, g_rx_vfo->pRX->frequency); - g_rx_vfo->step_setting = BackupStep; - g_rx_vfo->step_freq = BackupStepFreq; + g_rx_vfo->step_setting = BackupStep; + g_rx_vfo->step_freq = BackupStepFreq; RADIO_SetupRegisters(true); @@ -434,17 +433,17 @@ void SCANNER_Start(void) if (g_scan_single_frequency) { - gScanCssState = SCAN_CSS_STATE_SCANNING; - gScanFrequency = g_rx_vfo->pRX->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; - BK4819_PickRXFilterPathBasedOnFrequency(gScanFrequency); - BK4819_SetScanFrequency(gScanFrequency); + BK4819_PickRXFilterPathBasedOnFrequency(g_scan_frequency); + BK4819_SetScanFrequency(g_scan_frequency); } else { - gScanCssState = SCAN_CSS_STATE_OFF; - gScanFrequency = 0xFFFFFFFF; + g_scan_css_state = SCAN_CSS_STATE_OFF; + g_scan_frequency = 0xFFFFFFFF; BK4819_PickRXFilterPathBasedOnFrequency(0xFFFFFFFF); BK4819_EnableFrequencyScan(); @@ -452,22 +451,22 @@ void SCANNER_Start(void) DTMF_clear_RX(); - g_scan_delay_10ms = scan_freq_css_delay_10ms; - gScanCssResultCode = 0xFF; - gScanCssResultType = 0xFF; - gScanHitCount = 0; - gScanUseCssResult = 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; - gScannerEditState = SCAN_EDIT_STATE_NONE; - gScanProgressIndicator = 0; -// g_flag_start_scan = false; + g_scan_delay_10ms = scan_freq_css_delay_10ms; + g_scan_css_result_code = 0xFF; + g_scan_css_result_type = 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; g_update_status = true; } @@ -477,15 +476,15 @@ void SCANNER_Stop(void) const uint8_t Previous = g_restore_channel; if (g_scan_state_dir == SCAN_OFF) - return; // but, but, we weren't ! - + return; // but, but, we weren't doing anything ! + g_scan_state_dir = SCAN_OFF; - if (!bScanKeepFrequency) + 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.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); @@ -493,10 +492,13 @@ void SCANNER_Stop(void) 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; } diff --git a/app/scanner.h b/app/scanner.h index 3123b75..65fee6e 100644 --- a/app/scanner.h +++ b/app/scanner.h @@ -20,45 +20,48 @@ #include "dcs.h" #include "driver/keyboard.h" -enum SCAN_CssState_e +enum scan_css_state_e { SCAN_CSS_STATE_OFF = 0, +// SCAN_CSS_STATE_FREQ_SCANNING, SCAN_CSS_STATE_SCANNING, SCAN_CSS_STATE_FOUND, - SCAN_CSS_STATE_FAILED + SCAN_CSS_STATE_FAILED, + SCAN_CSS_STATE_FREQ_FAILED }; -typedef enum SCAN_CssState_e SCAN_CssState_t; +typedef enum scan_css_state_e scan_css_state_t; -enum { +enum scan_state_dir_e { SCAN_REV = -1, SCAN_OFF = 0, SCAN_FWD = +1 }; +typedef enum scan_state_dir_e scan_state_dir_t; -enum SCAN_edit_state_e { +enum scan_edit_state_e { SCAN_EDIT_STATE_NONE = 0, SCAN_EDIT_STATE_BUSY, SCAN_EDIT_STATE_DONE }; -typedef enum SCAN_edit_state_e SCAN_edit_state_t; +typedef enum scan_edit_state_e scan_edit_state_t; -extern dcs_code_type_t gScanCssResultType; -extern uint8_t gScanCssResultCode; +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 gScannerEditState; -extern uint8_t gScanChannel; -extern uint32_t gScanFrequency; -extern bool gScanPauseMode; -extern SCAN_CssState_t gScanCssState; +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 uint8_t gScanProgressIndicator; -extern uint8_t gScanHitCount; -extern bool gScanUseCssResult; -extern int8_t g_scan_state_dir; -extern bool bScanKeepFrequency; +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); diff --git a/firmware.bin b/firmware.bin new file mode 100644 index 0000000000000000000000000000000000000000..c3625ccb03a64292f129a5d344dd588a62dd1c94 GIT binary patch literal 60048 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 AnE(I) literal 0 HcmV?d00001 diff --git a/firmware.packed.bin b/firmware.packed.bin new file mode 100644 index 0000000000000000000000000000000000000000..10aaf0fabe1926263b6683fecf69a4f774dca32b GIT binary patch literal 60066 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 l3a`l?)Fh(!?N@2<>DBXV&Qc-4;v;Z0eQ^Y$dQ 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 Wfc_HO=wEm+#^|9uZ%oe5^Zx)l3vy%t literal 0 HcmV?d00001 diff --git a/functions.c b/functions.c index 336a229..7f5e71f 100644 --- a/functions.c +++ b/functions.c @@ -209,7 +209,7 @@ void FUNCTION_Select(function_type_t Function) DTMF_Reply(); if (g_current_vfo->dtmf_ptt_id_tx_mode == PTT_ID_APOLLO) - BK4819_PlaySingleTone(2525, 250, 0, g_eeprom.dtmf_side_tone); + BK4819_PlaySingleTone(APOLLO_TONE1_HZ, APOLLO_TONE_MS, 0, g_eeprom.dtmf_side_tone); #if defined(ENABLE_ALARM) || defined(ENABLE_TX1750) if (g_alarm_state != ALARM_STATE_OFF) diff --git a/misc.c b/misc.c index cdba1c1..88e03b1 100644 --- a/misc.c +++ b/misc.c @@ -42,6 +42,7 @@ const uint16_t key_repeat_delay_10ms = 400 / 10; // 400ms const uint16_t key_repeat_10ms = 80 / 10; // 80ms .. MUST be less than 'key_repeat_delay' const uint16_t key_debounce_10ms = 20 / 10; // 20ms +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 const uint16_t dual_watch_count_after_tx_10ms = 3600 / 10; // 3.6 sec after TX ends diff --git a/misc.h b/misc.h index 499dfe4..bec5f42 100644 --- a/misc.h +++ b/misc.h @@ -39,6 +39,12 @@ #define IS_NOAA_CHANNEL(x) ((x) >= NOAA_CHANNEL_FIRST && (x) <= NOAA_CHANNEL_LAST) #define IS_NOT_NOAA_CHANNEL(x) ((x) >= USER_CHANNEL_FIRST && (x) <= FREQ_CHANNEL_LAST) +// PTT key-up/key-down audio tone freq's used in NASA's apollo rides to the moon +#define APOLLO_TONE_MS 200 // slightly shorter tone length +//#define APOLLO_TONE_MS 250 // NASA tone length +#define APOLLO_TONE1_HZ 2525 +#define APOLLO_TONE2_HZ 2475 + enum { USER_CHANNEL_FIRST = 0, USER_CHANNEL_LAST = 199u, @@ -115,6 +121,7 @@ extern const uint16_t key_repeat_delay_10ms; extern const uint16_t key_repeat_10ms; extern const uint16_t key_debounce_10ms; +extern const uint16_t scan_freq_css_timeout_10ms; extern const uint8_t scan_freq_css_delay_10ms; extern const uint16_t battery_save_count_10ms; diff --git a/radio.c b/radio.c index 049dc47..2840f43 100644 --- a/radio.c +++ b/radio.c @@ -93,7 +93,7 @@ bool RADIO_CheckValidChannel(uint16_t Channel, bool bCheckScanList, uint8_t VFO) return true; } -uint8_t RADIO_FindNextChannel(uint8_t Channel, int8_t Direction, bool bCheckScanList, uint8_t VFO) +uint8_t RADIO_FindNextChannel(uint8_t Channel, scan_state_dir_t Direction, bool bCheckScanList, uint8_t VFO) { unsigned int i; @@ -1090,7 +1090,7 @@ void RADIO_SendEndOfTransmission(void) BK4819_PlayRogerMDC(); if (g_current_vfo->dtmf_ptt_id_tx_mode == PTT_ID_APOLLO) - BK4819_PlaySingleTone(2475, 250, 28, g_eeprom.dtmf_side_tone); + BK4819_PlaySingleTone(APOLLO_TONE2_HZ, APOLLO_TONE_MS, 28, g_eeprom.dtmf_side_tone); if (g_dtmf_call_state == DTMF_CALL_STATE_NONE && (g_current_vfo->dtmf_ptt_id_tx_mode == PTT_ID_TX_DOWN || g_current_vfo->dtmf_ptt_id_tx_mode == PTT_ID_BOTH)) diff --git a/radio.h b/radio.h index 874e2c6..ce55344 100644 --- a/radio.h +++ b/radio.h @@ -20,6 +20,7 @@ #include #include +#include "app/scanner.h" #include "dcs.h" #include "frequencies.h" @@ -128,7 +129,7 @@ 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); -uint8_t RADIO_FindNextChannel(uint8_t ChNum, int8_t Direction, bool bCheckScanList, uint8_t RadioNum); +uint8_t RADIO_FindNextChannel(uint8_t ChNum, scan_state_dir_t Direction, bool bCheckScanList, uint8_t RadioNum); void RADIO_InitInfo(vfo_info_t *pInfo, const uint8_t ChannelSave, const uint32_t Frequency); void RADIO_ConfigureChannel(const unsigned int VFO, const unsigned int configure); void RADIO_ConfigureSquelchAndOutputPower(vfo_info_t *pInfo); diff --git a/ui/scanner.c b/ui/scanner.c index cbaf998..d673242 100644 --- a/ui/scanner.c +++ b/ui/scanner.c @@ -26,62 +26,133 @@ #include "radio.h" #include "ui/helper.h" #include "ui/scanner.h" +#include "ui/ui.h" void UI_DisplayScanner(void) { - char String[16]; - bool text_centered = false; + char String[16]; + bool text_centered = false; + if (g_screen_to_display != DISPLAY_SCANNER) + return; + + // clear display buffer memset(g_frame_buffer, 0, sizeof(g_frame_buffer)); - memset(String, 0, sizeof(String)); - if (g_scan_single_frequency || (gScanCssState != SCAN_CSS_STATE_OFF && gScanCssState != SCAN_CSS_STATE_FAILED)) + // *********************************** + // frequency text line + + switch (g_scan_css_state) { - const uint32_t freq = gScanFrequency; - sprintf(String, "FREQ %u.%05u", freq / 100000, freq % 100000); - } - else - { - strcpy(String, "FREQ scanning"); + default: + case SCAN_CSS_STATE_OFF: + if (!g_scan_single_frequency) + { + strcpy(String, "FREQ scanning"); + break; + } + + case SCAN_CSS_STATE_SCANNING: + case SCAN_CSS_STATE_FOUND: + case SCAN_CSS_STATE_FAILED: + { + const uint32_t freq = g_scan_frequency; + sprintf(String, "FREQ %u.%05u", freq / 100000, freq % 100000); + } + break; + + case SCAN_CSS_STATE_FREQ_FAILED: + strcpy(String, "FREQ not found"); + break; } + UI_PrintString(String, 2, 0, 1, 8); + // *********************************** + // CODE text line + memset(String, 0, sizeof(String)); - if (gScanCssState < SCAN_CSS_STATE_FOUND || !gScanUseCssResult) - strcpy(String, "CODE scanning"); - else - if (gScanCssResultType == CODE_TYPE_CONTINUOUS_TONE) - sprintf(String, " CTC %u.%uHz", CTCSS_OPTIONS[gScanCssResultCode] / 10, CTCSS_OPTIONS[gScanCssResultCode] % 10); - else - sprintf(String, " DCS D%03oN", DCS_OPTIONS[gScanCssResultCode]); + + switch (g_scan_css_state) + { + default: + case SCAN_CSS_STATE_OFF: + case SCAN_CSS_STATE_FREQ_FAILED: + strcpy(String, "CODE"); + break; + + case SCAN_CSS_STATE_SCANNING: + strcpy(String, "CODE scanning"); + break; + + case SCAN_CSS_STATE_FOUND: + + switch (g_scan_css_result_type) + { + default: + case CODE_TYPE_OFF: + strcpy(String, "CODE ???"); + 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); + break; + case CODE_TYPE_DIGITAL: + case CODE_TYPE_REVERSE_DIGITAL: + sprintf(String, "CDCSS D%03oN", DCS_OPTIONS[g_scan_css_result_code]); + break; + } + break; + + case SCAN_CSS_STATE_FAILED: + strcpy(String, "CODE not found"); + break; + } + UI_PrintString(String, 2, 0, 3, 8); + // *********************************** + // bottom text line + memset(String, 0, sizeof(String)); - switch (gScannerEditState) + + switch (g_scanner_edit_state) { default: case SCAN_EDIT_STATE_NONE: - if (gScanCssState < SCAN_CSS_STATE_FOUND) - { // rolling indicator - memset(String, 0, sizeof(String)); - memset(String, '.', 15); - String[gScanProgressIndicator % 15] = '#'; - } - else - if (gScanCssState == SCAN_CSS_STATE_FOUND) + + switch (g_scan_css_state) { - strcpy(String, "* repeat M save"); - text_centered = true; - } - else - { - strcpy(String, "SCAN FAIL"); + default: + case SCAN_CSS_STATE_OFF: + case SCAN_CSS_STATE_SCANNING: // rolling indicator + memset(String, 0, sizeof(String)); + memset(String, '.', 15); + String[(g_scan_freq_css_timer_10ms / 32) % 15] = '#'; + break; + + case SCAN_CSS_STATE_FOUND: + strcpy(String, "* repeat M save"); + text_centered = true; + break; + + case SCAN_CSS_STATE_FAILED: + if (g_scan_single_frequency) + { + strcpy(String, "* repeat M save"); + text_centered = true; + break; + } + + case SCAN_CSS_STATE_FREQ_FAILED: + strcpy(String, "* repeat"); + text_centered = true; + break; } break; case SCAN_EDIT_STATE_BUSY: strcpy(String, "SAVE "); - UI_GenerateChannelStringEx(String + 5, g_show_chan_prefix, gScanChannel); + UI_GenerateChannelStringEx(String + strlen(String), g_show_chan_prefix, g_scan_channel); break; case SCAN_EDIT_STATE_DONE: @@ -89,7 +160,10 @@ void UI_DisplayScanner(void) strcpy(String, "SAVE ?"); break; } + UI_PrintString(String, text_centered ? 0 : 2, text_centered ? 127 : 0, 5, 8); - + + // *********************************** + ST7565_BlitFullScreen(); }