diff --git a/Makefile b/Makefile index 33133a5..d13ab3f 100644 --- a/Makefile +++ b/Makefile @@ -20,6 +20,7 @@ ENABLE_BIG_FREQ := 0 ENABLE_SMALL_BOLD := 1 ENABLE_KEEP_MEM_NAME := 1 ENABLE_WIDE_RX := 1 +ENABLE_1250HZ_STEP := 1 ENABLE_TX_WHEN_AM := 0 ENABLE_F_CAL_MENU := 0 ENABLE_CTCSS_TAIL_PHASE_SHIFT := 1 @@ -254,6 +255,9 @@ endif ifeq ($(ENABLE_WIDE_RX),1) CFLAGS += -DENABLE_WIDE_RX endif +ifeq ($(ENABLE_1250HZ_STEP),1) + CFLAGS += -DENABLE_1250HZ_STEP +endif ifeq ($(ENABLE_TX_WHEN_AM),1) CFLAGS += -DENABLE_TX_WHEN_AM endif diff --git a/README.md b/README.md index c3b7a1a..a3ffcf2 100644 --- a/README.md +++ b/README.md @@ -47,6 +47,7 @@ ENABLE_BIG_FREQ := 0 big font frequencies (like original QS ENABLE_SMALL_BOLD := 1 bold channel name/no. (when name + freq channel display mode) ENABLE_KEEP_MEM_NAME := 1 maintain channel name when (re)saving memory channel ENABLE_WIDE_RX := 1 full 18MHz to 1300MHz RX (though front-end/PA not designed for full range) +ENABLE_1250HZ_STEP := 1 enable smaller 1.25kHz frequency steps ENABLE_TX_WHEN_AM := 0 allow TX (always FM) when RX is set to AM ENABLE_F_CAL_MENU := 0 enable/disable the radios hidden frequency calibration menu ENABLE_CTCSS_TAIL_PHASE_SHIFT := 1 standard CTCSS tail phase shift rather than QS's own 55Hz tone method diff --git a/app/app.c b/app/app.c index 8578416..55604fa 100644 --- a/app/app.c +++ b/app/app.c @@ -15,6 +15,7 @@ */ #include +#include // abs() #include "app/action.h" #ifdef ENABLE_AIRCOPY @@ -657,7 +658,7 @@ static void MR_NextChannel(void) { case SCAN_NEXT_CHAN_SCANLIST1: prev_mr_chan = gNextMrChannel; - + if (chan1 >= 0) { if (RADIO_CheckValidChannel(chan1, false, 0)) @@ -667,7 +668,7 @@ static void MR_NextChannel(void) break; } } - + case SCAN_NEXT_CHAN_SCANLIST2: if (chan2 >= 0) { @@ -678,7 +679,7 @@ static void MR_NextChannel(void) break; } } - + // this bit doesn't yet work if the other VFO is a frequency case SCAN_NEXT_CHAN_DUAL_WATCH: // dual watch is enabled - include the other VFO in the scan @@ -710,11 +711,11 @@ static void MR_NextChannel(void) chan = RADIO_FindNextChannel(gNextMrChannel + gScanStateDir, gScanStateDir, (gEeprom.SCAN_LIST_DEFAULT < 2) ? true : false, gEeprom.SCAN_LIST_DEFAULT); if (chan == 0xFF) { // no valid channel found - + chan = MR_CHANNEL_FIRST; // return; } - + gNextMrChannel = chan; } @@ -873,7 +874,7 @@ void APP_CheckRadioInterrupts(void) { g_VOX_Lost = true; gVoxPauseCountdown = 10; - + if (gEeprom.VOX_SWITCH) { if (gCurrentFunction == FUNCTION_POWER_SAVE && !gRxIdleMode) @@ -881,12 +882,12 @@ void APP_CheckRadioInterrupts(void) gPowerSave_10ms = power_save2_10ms; gPowerSaveCountdownExpired = 0; } - + if (gEeprom.DUAL_WATCH != DUAL_WATCH_OFF && (gScheduleDualWatch || gDualWatchCountdown_10ms < dual_watch_count_after_vox_10ms)) { gDualWatchCountdown_10ms = dual_watch_count_after_vox_10ms; gScheduleDualWatch = false; - + // let the user see DW is not active gDualWatchActive = false; gUpdateStatus = true; @@ -959,7 +960,7 @@ void APP_EndTransmission(void) { if (gSetting_KILLED) return; - + if (gVoxResumeCountdown == 0) { if (gVoxPauseCountdown) @@ -970,18 +971,18 @@ void APP_EndTransmission(void) g_VOX_Lost = false; gVoxPauseCountdown = 0; } - + #ifdef ENABLE_FMRADIO if (gFmRadioMode) return; #endif - + if (gCurrentFunction == FUNCTION_RECEIVE || gCurrentFunction == FUNCTION_MONITOR) return; - + if (gScanStateDir != SCAN_OFF || gCssScanMode != CSS_SCAN_MODE_OFF) return; - + if (gVOX_NoiseDetected) { if (g_VOX_Lost) @@ -989,7 +990,7 @@ void APP_EndTransmission(void) else if (gVoxStopCountdown_10ms == 0) gVOX_NoiseDetected = false; - + if (gCurrentFunction == FUNCTION_TRANSMIT && !gPttIsPressed && !gVOX_NoiseDetected) { if (gFlagEndTransmission) @@ -1000,7 +1001,7 @@ void APP_EndTransmission(void) else { APP_EndTransmission(); - + if (gEeprom.REPEATER_TAIL_TONE_ELIMINATION == 0) { //if (gCurrentFunction != FUNCTION_FOREGROUND) @@ -1009,21 +1010,21 @@ void APP_EndTransmission(void) else gRTTECountdown = gEeprom.REPEATER_TAIL_TONE_ELIMINATION * 10; } - + gUpdateStatus = true; gUpdateDisplay = true; gFlagEndTransmission = false; } return; } - + if (g_VOX_Lost) { gVOX_NoiseDetected = true; - + if (gCurrentFunction == FUNCTION_POWER_SAVE) FUNCTION_Select(FUNCTION_FOREGROUND); - + if (gCurrentFunction != FUNCTION_TRANSMIT && gSerialConfigCountDown_500ms == 0) { gDTMF_ReplyState = DTMF_REPLY_NONE; @@ -1076,7 +1077,7 @@ void APP_Update(void) if (gScreenToDisplay != DISPLAY_SCANNER && gScanStateDir != SCAN_OFF && gScheduleScanListen && !gPttIsPressed) #endif { // scanning - + if (IS_FREQ_CHANNEL(gNextMrChannel)) { if (gCurrentFunction == FUNCTION_INCOMING) @@ -1369,7 +1370,7 @@ void APP_CheckKeys(void) if (gDebounceCounter < key_repeat_delay_10ms) return; - + // key is being held pressed if (gDebounceCounter == key_repeat_delay_10ms) @@ -1455,7 +1456,7 @@ void APP_TimeSlice10ms(void) #ifdef ENABLE_VOX if (gVoxResumeCountdown > 0) gVoxResumeCountdown--; - + if (gVoxPauseCountdown > 0) gVoxPauseCountdown--; #endif @@ -1553,7 +1554,7 @@ void APP_TimeSlice10ms(void) return; } - if (gScannerEditState != 0) + if (gScannerEditState != SCAN_EDIT_STATE_NONE) { APP_CheckKeys(); return; @@ -1576,15 +1577,13 @@ void APP_TimeSlice10ms(void) { const uint32_t step = StepFrequencyTable[gStepSetting]; gScanFrequency = ((Result + (step / 2)) / step) * step; // round to nearest step multiple +// gScanFrequency = (Result / step) * step; // round down } #endif - - if (Delta < 0) - Delta = -Delta; - if (Delta < 100) - gScanHitCount++; - else - gScanHitCount = 0; + + Delta = abs(Delta); + + gScanHitCount = (Delta < 100) ? gScanHitCount + 1 : 0; BK4819_DisableFrequencyScan(); @@ -1730,7 +1729,7 @@ void APP_TimeSlice500ms(void) } } } - + if (gDTMF_RX_live_timeout > 0) { #ifdef ENABLE_RSSI_BAR @@ -1748,7 +1747,7 @@ void APP_TimeSlice500ms(void) } } } - + if (gMenuCountdown > 0) if (--gMenuCountdown == 0) exit_menu = (gScreenToDisplay == DISPLAY_MENU); // exit menu mode @@ -1872,7 +1871,7 @@ void APP_TimeSlice500ms(void) { GUI_DisplayType_t disp = DISPLAY_INVALID; - + #ifdef ENABLE_FMRADIO if (gFmRadioMode && gCurrentFunction != FUNCTION_RECEIVE && @@ -1882,7 +1881,7 @@ void APP_TimeSlice500ms(void) disp = DISPLAY_FM; } #endif - + if (disp == DISPLAY_INVALID) { #ifndef ENABLE_CODE_SCAN_TIMEOUT @@ -1890,7 +1889,7 @@ void APP_TimeSlice500ms(void) #endif disp = DISPLAY_MAIN; } - + if (disp != DISPLAY_INVALID) GUI_SelectNextDisplay(disp); } @@ -1972,7 +1971,9 @@ void APP_TimeSlice500ms(void) } } - if (gScreenToDisplay == DISPLAY_SCANNER && gScannerEditState == 0 && gScanCssState < SCAN_CSS_STATE_FOUND) + if (gScreenToDisplay == DISPLAY_SCANNER && + gScannerEditState == SCAN_EDIT_STATE_NONE && + gScanCssState < SCAN_CSS_STATE_FOUND) { gScanProgressIndicator++; @@ -2271,20 +2272,20 @@ static void APP_ProcessKey(KEY_Code_t Key, bool bKeyPressed, bool bKeyHeld) Code = DTMF_GetCharacter(Key - KEY_0); if (Code == 0xFF) goto Skip; - + // transmit DTMF keys } - + if (!bKeyPressed || bKeyHeld) { if (!bKeyPressed) { GPIO_ClearBit(&GPIOC->DATA, GPIOC_PIN_AUDIO_PATH); - + gEnableSpeaker = false; - + BK4819_ExitDTMF_TX(false); - + if (gCurrentVfo->SCRAMBLING_TYPE == 0 || !gSetting_ScrambleEnable) BK4819_DisableScramble(); else @@ -2298,9 +2299,9 @@ static void APP_ProcessKey(KEY_Code_t Key, bool bKeyPressed, bool bKeyHeld) GPIO_SetBit(&GPIOC->DATA, GPIOC_PIN_AUDIO_PATH); gEnableSpeaker = true; } - + BK4819_DisableScramble(); - + if (Code == 0xFE) BK4819_TransmitTone(gEeprom.DTMF_SIDE_TONE, 1750); else diff --git a/app/main.c b/app/main.c index 83d971a..1a14d3e 100644 --- a/app/main.c +++ b/app/main.c @@ -702,8 +702,6 @@ static void MAIN_Key_STAR(bool bKeyPressed, bool bKeyHeld) gScanSingleFrequency = true; gBackupCROSS_BAND_RX_TX = gEeprom.CROSS_BAND_RX_TX; gEeprom.CROSS_BAND_RX_TX = CROSS_BAND_OFF; - - ACTION_Scan(false); } gPttWasReleased = true; diff --git a/app/scanner.c b/app/scanner.c index e79d378..07c95fd 100644 --- a/app/scanner.c +++ b/app/scanner.c @@ -31,7 +31,7 @@ uint8_t gScanCssResultCode; bool gFlagStartScan; bool gFlagStopScan; bool gScanSingleFrequency; -uint8_t gScannerEditState; +SCAN_edit_state_t gScannerEditState; uint8_t gScanChannel; uint32_t gScanFrequency; bool gScanPauseMode; @@ -48,7 +48,7 @@ static void SCANNER_Key_DIGITS(KEY_Code_t Key, bool bKeyPressed, bool bKeyHeld) { if (!bKeyHeld && bKeyPressed) { - if (gScannerEditState == 1) + if (gScannerEditState == SCAN_EDIT_STATE_BUSY) { uint16_t Channel; @@ -92,9 +92,9 @@ static void SCANNER_Key_EXIT(bool bKeyPressed, bool bKeyHeld) switch (gScannerEditState) { - case 0: + case SCAN_EDIT_STATE_NONE: gRequestDisplayScreen = DISPLAY_MAIN; - + gEeprom.CROSS_BAND_RX_TX = gBackupCROSS_BAND_RX_TX; gUpdateStatus = true; gFlagStopScan = true; @@ -105,7 +105,7 @@ static void SCANNER_Key_EXIT(bool bKeyPressed, bool bKeyHeld) #endif break; - case 1: + case SCAN_EDIT_STATE_BUSY: if (gInputBoxIndex > 0) { gInputBox[--gInputBoxIndex] = 10; @@ -115,8 +115,8 @@ static void SCANNER_Key_EXIT(bool bKeyPressed, bool bKeyHeld) // Fallthrough - case 2: - gScannerEditState = 0; + case SCAN_EDIT_STATE_DONE: + gScannerEditState = SCAN_EDIT_STATE_NONE; #ifdef ENABLE_VOICE gAnotherVoiceID = VOICE_ID_CANCEL; #endif @@ -161,49 +161,97 @@ static void SCANNER_Key_MENU(bool bKeyPressed, bool bKeyHeld) switch (gScannerEditState) { - case 0: + case SCAN_EDIT_STATE_NONE: if (!gScanSingleFrequency) { - int16_t Delta625; - uint32_t Freq250 = FREQUENCY_FloorToStep(gScanFrequency, 250, 0); - uint32_t Freq625 = FREQUENCY_FloorToStep(gScanFrequency, 625, 0); - int16_t Delta250 = (int16_t)gScanFrequency - (int16_t)Freq250; - if (125 < Delta250) - { - Delta250 = 250 - Delta250; - Freq250 += 250; - } + #if 0 + // can't make head nor tail of what's being done here :( - Delta625 = (int16_t)gScanFrequency - (int16_t)Freq625; + uint32_t Freq250 = FREQUENCY_FloorToStep(gScanFrequency, 250, 0); + uint32_t Freq625 = FREQUENCY_FloorToStep(gScanFrequency, 625, 0); - if (312 < Delta625) - { - Delta625 = 625 - Delta625; - Freq625 += 625; - } + int16_t Delta250 = (int16_t)gScanFrequency - (int16_t)Freq250; + int16_t Delta625; - if (Delta625 < Delta250) - { - gStepSetting = STEP_6_25kHz; - gScanFrequency = Freq625; - } - else - { - gStepSetting = STEP_2_5kHz; - gScanFrequency = Freq250; - } + if (125 < Delta250) + { + Delta250 = 250 - Delta250; + Freq250 += 250; + } + + Delta625 = (int16_t)gScanFrequency - (int16_t)Freq625; + + if (312 < Delta625) + { + Delta625 = 625 - Delta625; + Freq625 += 625; + } + + if (Delta625 < Delta250) + { + gStepSetting = STEP_6_25kHz; + gScanFrequency = Freq625; + } + else + { + gStepSetting = STEP_2_5kHz; + gScanFrequency = Freq250; + } + #else + + #ifdef ENABLE_1250HZ_STEP + const STEP_Setting_t small_step = STEP_1_25kHz; + const STEP_Setting_t big_step = STEP_6_25kHz; + #else + const STEP_Setting_t small_step = STEP_2_5kHz; + const STEP_Setting_t big_step = STEP_6_25kHz; + #endif + const uint32_t small_step_freq = StepFrequencyTable[small_step]; + const uint32_t big_step_freq = StepFrequencyTable[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); + + int32_t delta_small_step = (int32_t)gScanFrequency - freq_small_step; + int32_t delta_big_step = (int32_t)gScanFrequency - freq_big_step; + + if (delta_small_step > 125) + { + delta_small_step = StepFrequencyTable[small_step] - delta_small_step; + freq_big_step += small_step_freq; + } + + delta_big_step = (int32_t)gScanFrequency - freq_big_step; + + if (delta_big_step > 312) + { + delta_big_step = big_step_freq - delta_big_step; + freq_big_step += big_step_freq; + } + + if (delta_small_step >= delta_big_step) + { + gStepSetting = small_step; + gScanFrequency = freq_small_step; + } + else + { + gStepSetting = big_step; + gScanFrequency = freq_big_step; + } + #endif } if (gTxVfo->CHANNEL_SAVE <= MR_CHANNEL_LAST) { - gScannerEditState = 1; + gScannerEditState = SCAN_EDIT_STATE_BUSY; gScanChannel = gTxVfo->CHANNEL_SAVE; gShowChPrefix = RADIO_CheckValidChannel(gTxVfo->CHANNEL_SAVE, false, 0); } else { - gScannerEditState = 2; + gScannerEditState = SCAN_EDIT_STATE_DONE; } gScanCssState = SCAN_CSS_STATE_FOUND; @@ -211,20 +259,20 @@ static void SCANNER_Key_MENU(bool bKeyPressed, bool bKeyHeld) gAnotherVoiceID = VOICE_ID_MEMORY_CHANNEL; #endif gRequestDisplayScreen = DISPLAY_SCANNER; - + gUpdateStatus = true; break; - case 1: + case SCAN_EDIT_STATE_BUSY: if (gInputBoxIndex == 0) { gBeepToPlay = BEEP_1KHZ_60MS_OPTIONAL; gRequestDisplayScreen = DISPLAY_SCANNER; - gScannerEditState = 2; + gScannerEditState = SCAN_EDIT_STATE_DONE; } break; - case 2: + case SCAN_EDIT_STATE_DONE: if (!gScanSingleFrequency) { RADIO_InitInfo(gTxVfo, gTxVfo->CHANNEL_SAVE, gScanFrequency); @@ -235,8 +283,8 @@ static void SCANNER_Key_MENU(bool bKeyPressed, bool bKeyHeld) gTxVfo->freq_config_RX.Code = gScanCssResultCode; } - gTxVfo->freq_config_TX = gTxVfo->freq_config_RX; - gTxVfo->STEP_SETTING = gStepSetting; + gTxVfo->freq_config_TX = gTxVfo->freq_config_RX; + gTxVfo->STEP_SETTING = gStepSetting; } else { @@ -251,23 +299,26 @@ static void SCANNER_Key_MENU(bool bKeyPressed, bool bKeyHeld) if (gTxVfo->CHANNEL_SAVE <= MR_CHANNEL_LAST) { - Channel = gScanChannel; + Channel = gScanChannel; gEeprom.MrChannel[gEeprom.TX_VFO] = Channel; } else { - Channel = gTxVfo->Band + FREQ_CHANNEL_FIRST; + Channel = gTxVfo->Band + FREQ_CHANNEL_FIRST; gEeprom.FreqChannel[gEeprom.TX_VFO] = Channel; } - gTxVfo->CHANNEL_SAVE = Channel; + gTxVfo->CHANNEL_SAVE = Channel; gEeprom.ScreenChannel[gEeprom.TX_VFO] = Channel; + gRequestSaveChannel = 2; + #ifdef ENABLE_VOICE - gAnotherVoiceID = VOICE_ID_CONFIRM; + gAnotherVoiceID = VOICE_ID_CONFIRM; #endif - gRequestDisplayScreen = DISPLAY_SCANNER; - gRequestSaveChannel = 2; - gScannerEditState = 0; + + gScannerEditState = SCAN_EDIT_STATE_NONE; + + gRequestDisplayScreen = DISPLAY_SCANNER; break; default: @@ -302,7 +353,7 @@ static void SCANNER_Key_UP_DOWN(bool bKeyPressed, bool pKeyHeld, int8_t Directio gBeepToPlay = BEEP_1KHZ_60MS_OPTIONAL; } - if (gScannerEditState == 1) + if (gScannerEditState == SCAN_EDIT_STATE_BUSY) { gScanChannel = NUMBER_AddWithWraparound(gScanChannel, Direction, 0, MR_CHANNEL_LAST); gShowChPrefix = RADIO_CheckValidChannel(gScanChannel, false, 0); @@ -389,8 +440,6 @@ void SCANNER_Start(void) BK4819_PickRXFilterPathBasedOnFrequency(gScanFrequency); BK4819_SetScanFrequency(gScanFrequency); - - gUpdateStatus = true; } else { @@ -399,8 +448,6 @@ void SCANNER_Start(void) BK4819_PickRXFilterPathBasedOnFrequency(0xFFFFFFFF); BK4819_EnableFrequencyScan(); - - gUpdateStatus = true; } DTMF_clear_RX(); @@ -418,8 +465,10 @@ void SCANNER_Start(void) g_VOX_Lost = false; #endif g_SquelchLost = false; - gScannerEditState = 0; + gScannerEditState = SCAN_EDIT_STATE_NONE; gScanProgressIndicator = 0; + + gUpdateStatus = true; } void SCANNER_Stop(void) diff --git a/app/scanner.h b/app/scanner.h index 8730ea6..d0d4630 100644 --- a/app/scanner.h +++ b/app/scanner.h @@ -20,29 +20,34 @@ #include "dcs.h" #include "driver/keyboard.h" -enum SCAN_CssState_t +enum SCAN_CssState_e { SCAN_CSS_STATE_OFF = 0, SCAN_CSS_STATE_SCANNING, SCAN_CSS_STATE_FOUND, SCAN_CSS_STATE_FAILED }; +typedef enum SCAN_CssState_e SCAN_CssState_t; -typedef enum SCAN_CssState_t SCAN_CssState_t; - -enum -{ +enum { SCAN_REV = -1, SCAN_OFF = 0, SCAN_FWD = +1 }; +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; + extern DCS_CodeType_t gScanCssResultType; extern uint8_t gScanCssResultCode; extern bool gFlagStartScan; extern bool gFlagStopScan; extern bool gScanSingleFrequency; -extern uint8_t gScannerEditState; +extern SCAN_edit_state_t gScannerEditState; extern uint8_t gScanChannel; extern uint32_t gScanFrequency; extern bool gScanPauseMode; diff --git a/firmware.bin b/firmware.bin index b598b40..607fe74 100644 Binary files a/firmware.bin and b/firmware.bin differ diff --git a/firmware.packed.bin b/firmware.packed.bin index 5c7a47f..0967d1f 100644 Binary files a/firmware.packed.bin and b/firmware.packed.bin differ diff --git a/frequencies.c b/frequencies.c index b16f9e5..6cfb270 100644 --- a/frequencies.c +++ b/frequencies.c @@ -61,12 +61,12 @@ const freq_band_table_t frequencyBandTable[7] = }; #endif -#ifndef ENABLE_12_5KHZ_STEP - // QS steps (*10 Hz) - const uint16_t StepFrequencyTable[7] = {250, 500, 625, 1000, 1250, 2500, 833}; -#else +#ifdef ENABLE_1250HZ_STEP // includes 1.25kHz step const uint16_t StepFrequencyTable[7] = {125, 250, 625, 1000, 1250, 2500, 833}; +#else + // QS steps (*10 Hz) + const uint16_t StepFrequencyTable[7] = {250, 500, 625, 1000, 1250, 2500, 833}; #endif FREQUENCY_Band_t FREQUENCY_GetBand(uint32_t Frequency) diff --git a/frequencies.h b/frequencies.h index 5b38dd7..f7b07cb 100644 --- a/frequencies.h +++ b/frequencies.h @@ -19,8 +19,6 @@ #include -#define ENABLE_12_5KHZ_STEP - typedef struct { const uint32_t lower; const uint32_t upper; @@ -43,22 +41,22 @@ enum FREQUENCY_Band_t { }; typedef enum FREQUENCY_Band_t FREQUENCY_Band_t; -#ifndef ENABLE_12_5KHZ_STEP - // QS steps +#ifdef ENABLE_1250HZ_STEP + // includes 1.25kHz step enum STEP_Setting_t { - STEP_2_5kHz = 0, - STEP_5_0kHz, + STEP_1_25kHz = 0, + STEP_2_5kHz, STEP_6_25kHz, STEP_10_0kHz, STEP_12_5kHz, STEP_25_0kHz, STEP_8_33kHz - }; +}; #else - // includes 1.25kHz step + // QS steps enum STEP_Setting_t { - STEP_1_25kHz = 0, - STEP_2_5kHz, + STEP_2_5kHz = 0, + STEP_5_0kHz, STEP_6_25kHz, STEP_10_0kHz, STEP_12_5kHz, diff --git a/ui/menu.c b/ui/menu.c index deb9250..3a5f9a6 100644 --- a/ui/menu.c +++ b/ui/menu.c @@ -341,6 +341,7 @@ const char gSubMenu_SCRAMBLER[11][7] = }; const char gSubMenu_SIDE_BUTT[9][16] = +//const char gSubMenu_SIDE_BUTT[10][16] = { "NONE", "FLASH\nLIGHT", @@ -350,7 +351,8 @@ const char gSubMenu_SIDE_BUTT[9][16] = "VOX\non\\off", "ALARM\non\\off", "FM RADIO\non\\off", - "TX\n1750Hz" + "TX\n1750Hz", +// "2nd PTT", }; // *************************************************************************************** diff --git a/ui/scanner.c b/ui/scanner.c index a055a95..74a5e98 100644 --- a/ui/scanner.c +++ b/ui/scanner.c @@ -30,8 +30,7 @@ void UI_DisplayScanner(void) { char String[16]; - bool bCentered; - uint8_t Start; + bool text_centered = false; memset(gFrameBuffer, 0, sizeof(gFrameBuffer)); @@ -49,7 +48,7 @@ void UI_DisplayScanner(void) memset(String, 0, sizeof(String)); if (gScanCssState < SCAN_CSS_STATE_FOUND || !gScanUseCssResult) - strcpy(String, " CTC scanning"); + strcpy(String, "CODE scanning"); else if (gScanCssResultType == CODE_TYPE_CONTINUOUS_TONE) sprintf(String, " CTC %u.%uHz", CTCSS_Options[gScanCssResultCode] / 10, CTCSS_Options[gScanCssResultCode] % 10); @@ -58,42 +57,40 @@ void UI_DisplayScanner(void) UI_PrintString(String, 2, 0, 3, 8); memset(String, 0, sizeof(String)); - if (gScannerEditState == 2) + switch (gScannerEditState) { - strcpy(String, "SAVE ?"); + 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) + { +// strcpy(String, "SCAN COMPLETE"); + strcpy(String, "* repeat M save"); + text_centered = true; + } + else + { + strcpy(String, "SCAN FAIL"); + } + break; - Start = 0; - bCentered = 1; - } - else - { - if (gScannerEditState == 1) - { + case SCAN_EDIT_STATE_BUSY: strcpy(String, "SAVE "); UI_GenerateChannelStringEx(String + 5, gShowChPrefix, gScanChannel); - } - else - if (gScanCssState < SCAN_CSS_STATE_FOUND) - { - memset(String, 0, sizeof(String)); - memset(String, '.', 15); - String[gScanProgressIndicator % 15] = '#'; - } - else - if (gScanCssState == SCAN_CSS_STATE_FOUND) - { -// strcpy(String, "SCAN CMP"); - strcpy(String, " '*' to save"); - } - else - { - strcpy(String, "SCAN FAIL"); - } - - Start = 2; - bCentered = 0; + break; + + case SCAN_EDIT_STATE_DONE: + text_centered = true; + strcpy(String, "SAVE ?"); + break; } - UI_PrintString(String, Start, bCentered ? 127 : 0, 5, 8); + UI_PrintString(String, text_centered ? 0 : 2, text_centered ? 127 : 0, 5, 8); ST7565_BlitFullScreen(); }