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 0000000..c3625cc Binary files /dev/null and b/firmware.bin differ diff --git a/firmware.packed.bin b/firmware.packed.bin new file mode 100644 index 0000000..10aaf0f Binary files /dev/null and b/firmware.packed.bin differ 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(); }