From 05474525895948b4bcb65b04492b95de9462a13d Mon Sep 17 00:00:00 2001 From: OneOfEleven Date: Sun, 8 Oct 2023 11:40:17 +0100 Subject: [PATCH] Edited "D HOLD" times to include "STAY ON SCREEN" option --- app/app.c | 109 ++++--- app/dtmf.h | 8 +- app/generic.c | 238 +++++++------- app/main.c | 42 ++- app/menu.c | 28 +- app/scanner.c | 18 +- app/spectrum.c | 738 ++++++++++++++++++++++++++------------------ app/spectrum.h | 70 ++++- board.c | 20 +- driver/bk4819.c | 123 ++++++-- driver/keyboard.c | 21 +- driver/systick.c | 29 +- firmware.bin | Bin 53740 -> 54308 bytes firmware.packed.bin | Bin 53758 -> 54326 bytes frequencies.c | 38 ++- functions.c | 8 +- misc.c | 4 +- misc.h | 4 +- radio.c | 3 +- scheduler.c | 3 +- ui/inputbox.c | 1 - ui/main.c | 16 +- ui/menu.c | 25 +- ui/scanner.c | 1 - 24 files changed, 947 insertions(+), 600 deletions(-) diff --git a/app/app.c b/app/app.c index 55604fad..c86fdc34 100644 --- a/app/app.c +++ b/app/app.c @@ -1319,7 +1319,7 @@ void APP_CheckKeys(void) { // PTT pressed if (++gPttDebounceCounter >= 3) // 30ms { // start transmitting - boot_counter_10ms = 0; + boot_counter_10ms = 0; // cancel the boot-up screen gPttDebounceCounter = 0; gPttIsPressed = true; APP_ProcessKey(KEY_PTT, true, false); @@ -1333,8 +1333,16 @@ void APP_CheckKeys(void) // scan the hardware keys Key = KEYBOARD_Poll(); - if (Key != KEY_INVALID) - boot_counter_10ms = 0; // cancel boot screen/beeps if any key pressed + if (Key == KEY_INVALID) + { +// gKeyReading0 = KEY_INVALID; +// gKeyReading1 = KEY_INVALID; +// gDebounceCounter = 0; +// gKeyBeingHeld = false; +// return; + } + + boot_counter_10ms = 0; // cancel boot screen/beeps if (gKeyReading0 != Key) { // new key pressed @@ -1549,9 +1557,11 @@ void APP_TimeSlice10ms(void) if (gScanDelay_10ms > 0) { - gScanDelay_10ms--; - APP_CheckKeys(); - return; + if (--gScanDelay_10ms > 0) + { + APP_CheckKeys(); + return; + } } if (gScannerEditState != SCAN_EDIT_STATE_NONE) @@ -1564,36 +1574,33 @@ void APP_TimeSlice10ms(void) { case SCAN_CSS_STATE_OFF: - // must be RF frequency scanning if we're here ? - if (!BK4819_GetFrequencyScanResult(&Result)) break; + // accept only within 1kHz Delta = Result - gScanFrequency; + gScanHitCount = (abs(Delta) < 100) ? gScanHitCount + 1 : 0; + + BK4819_DisableFrequencyScan(); #if 0 gScanFrequency = Result; #else - { + { // round to nearest step multiple const uint32_t step = StepFrequencyTable[gStepSetting]; - gScanFrequency = ((Result + (step / 2)) / step) * step; // round to nearest step multiple -// gScanFrequency = (Result / step) * step; // round down + gScanFrequency = ((Result + (step / 2)) / step) * step; } #endif - Delta = abs(Delta); - - gScanHitCount = (Delta < 100) ? gScanHitCount + 1 : 0; - - BK4819_DisableFrequencyScan(); - if (gScanHitCount < 3) - { + { // keep scanning for an RF carrier BK4819_EnableFrequencyScan(); } else - { + { // RF carrier found .. stop RF scanning BK4819_SetScanFrequency(gScanFrequency); + + // start CTCSS/CTDSS scanning gScanCssResultCode = 0xFF; gScanCssResultType = 0xFF; gScanHitCount = 0; @@ -1602,12 +1609,10 @@ void APP_TimeSlice10ms(void) gScanCssState = SCAN_CSS_STATE_SCANNING; GUI_SelectNextDisplay(DISPLAY_SCANNER); - - gUpdateStatus = true; + gUpdateStatus = true; } - gScanDelay_10ms = scan_delay_10ms; - //gScanDelay_10ms = 1; // 10ms + gScanDelay_10ms = scan_freq_css_delay_10ms; break; case SCAN_CSS_STATE_SCANNING: @@ -1652,10 +1657,10 @@ void APP_TimeSlice10ms(void) } } - if (gScanCssState < SCAN_CSS_STATE_FOUND) - { + if (gScanCssState == SCAN_CSS_STATE_OFF || gScanCssState == SCAN_CSS_STATE_SCANNING) + { // re-start scan BK4819_SetScanFrequency(gScanFrequency); - gScanDelay_10ms = scan_delay_10ms; + gScanDelay_10ms = scan_freq_css_delay_10ms; break; } @@ -1686,22 +1691,22 @@ void APP_TimeSlice10ms(void) void cancelUserInputModes(void) { - gKeyInputCountdown = 0; - - if (gDTMF_InputMode || gDTMF_InputBox_Index > 0 || gInputBoxIndex > 0) + if (gDTMF_InputMode || gDTMF_InputBox_Index > 0) { DTMF_clear_input_box(); - gInputBoxIndex = 0; gBeepToPlay = BEEP_500HZ_60MS_DOUBLE_BEEP_OPTIONAL; gRequestDisplayScreen = DISPLAY_MAIN; gUpdateDisplay = true; } - if (gWasFKeyPressed) + if (gWasFKeyPressed || gKeyInputCountdown > 0 || gInputBoxIndex > 0) { - gWasFKeyPressed = false; - gBeepToPlay = BEEP_500HZ_60MS_DOUBLE_BEEP_OPTIONAL; - gUpdateStatus = true; + gWasFKeyPressed = false; + gInputBoxIndex = 0; + gKeyInputCountdown = 0; + gBeepToPlay = BEEP_500HZ_60MS_DOUBLE_BEEP_OPTIONAL; + gUpdateStatus = true; + gUpdateDisplay = true; } } @@ -1997,7 +2002,6 @@ void APP_TimeSlice500ms(void) if (gDTMF_DecodeRingCountdown_500ms > 0) { // make "ring-ring" sound gDTMF_DecodeRingCountdown_500ms--; - AUDIO_PlayBeep(BEEP_880HZ_200MS); } } @@ -2012,10 +2016,19 @@ void APP_TimeSlice500ms(void) { if (--gDTMF_auto_reset_time_500ms == 0) { - gDTMF_CallState = DTMF_CALL_STATE_NONE; + if (gDTMF_CallState == DTMF_CALL_STATE_RECEIVED && gEeprom.DTMF_auto_reset_time >= DTMF_HOLD_MAX) + gDTMF_CallState = DTMF_CALL_STATE_RECEIVED_STAY; // keep message on-screen till a key is pressed + else + gDTMF_CallState = DTMF_CALL_STATE_NONE; gUpdateDisplay = true; } } + +// if (gDTMF_CallState != DTMF_CALL_STATE_RECEIVED_STAY) +// { +// gDTMF_CallState = DTMF_CALL_STATE_NONE; +// gUpdateDisplay = true; +// } } if (gDTMF_IsTx && gDTMF_TxStopCountdown_500ms > 0) @@ -2083,12 +2096,12 @@ void CHANNEL_Next(const bool bFlag, const int8_t scan_direction) bScanKeepFrequency = false; } -static void APP_ProcessKey(KEY_Code_t Key, bool bKeyPressed, bool bKeyHeld) +static void APP_ProcessKey(const KEY_Code_t Key, const bool bKeyPressed, const bool bKeyHeld) { bool bFlag = false; - if (Key == KEY_INVALID) - return; +// if (Key == KEY_INVALID) +// return; const bool backlight_was_on = GPIO_CheckBit(&GPIOB->DATA, GPIOB_PIN_BACKLIGHT); @@ -2142,7 +2155,7 @@ static void APP_ProcessKey(KEY_Code_t Key, bool bKeyPressed, bool bKeyHeld) } else { - if (Key != KEY_PTT) + if (Key != KEY_PTT || gSetting_backlight_on_tx_rx == 1 || gSetting_backlight_on_tx_rx == 3) BACKLIGHT_TurnOn(); if (Key == KEY_EXIT && bKeyHeld) @@ -2155,6 +2168,9 @@ static void APP_ProcessKey(KEY_Code_t Key, bool bKeyPressed, bool bKeyHeld) gDTMF_RX_live_timeout = 0; gUpdateDisplay = true; } + + // cancel user input + cancelUserInputModes(); } if (gScreenToDisplay == DISPLAY_MENU) // 1of11 @@ -2232,7 +2248,6 @@ static void APP_ProcessKey(KEY_Code_t Key, bool bKeyPressed, bool bKeyHeld) { if (bKeyHeld) bFlag = true; - if (!bKeyPressed) { bFlag = true; @@ -2334,7 +2349,7 @@ static void APP_ProcessKey(KEY_Code_t Key, bool bKeyPressed, bool bKeyHeld) { case DISPLAY_MAIN: MAIN_ProcessKeys(Key, bKeyPressed, bKeyHeld); - bKeyHeld = false; // allow the channel setting to be saved +// bKeyHeld = false; // allow the channel setting to be saved break; #ifdef ENABLE_FMRADIO @@ -2375,9 +2390,6 @@ static void APP_ProcessKey(KEY_Code_t Key, bool bKeyPressed, bool bKeyHeld) if (!bKeyHeld && bKeyPressed) gBeepToPlay = BEEP_500HZ_60MS_DOUBLE_BEEP_OPTIONAL; } - else - if (Key == KEY_EXIT && bKeyHeld) - cancelUserInputModes(); Skip: if (gBeepToPlay != BEEP_NONE) @@ -2399,7 +2411,6 @@ static void APP_ProcessKey(KEY_Code_t Key, bool bKeyPressed, bool bKeyHeld) if (gFlagStopScan) { BK4819_StopScan(); - gFlagStopScan = false; } @@ -2506,6 +2517,8 @@ static void APP_ProcessKey(KEY_Code_t Key, bool bKeyPressed, bool bKeyHeld) if (gFlagStartScan) { + gFlagStartScan = false; + gMonitor = false; #ifdef ENABLE_VOICE @@ -2516,7 +2529,6 @@ static void APP_ProcessKey(KEY_Code_t Key, bool bKeyPressed, bool bKeyHeld) SCANNER_Start(); gRequestDisplayScreen = DISPLAY_SCANNER; - gFlagStartScan = false; } if (gFlagPrepareTX) @@ -2536,6 +2548,7 @@ static void APP_ProcessKey(KEY_Code_t Key, bool bKeyPressed, bool bKeyHeld) #endif GUI_SelectNextDisplay(gRequestDisplayScreen); - gRequestDisplayScreen = DISPLAY_INVALID; + + gUpdateDisplay = true; } diff --git a/app/dtmf.h b/app/dtmf.h index 8fc70a0a..d06ba861 100644 --- a/app/dtmf.h +++ b/app/dtmf.h @@ -33,7 +33,8 @@ typedef enum DTMF_State_t DTMF_State_t; enum DTMF_CallState_t { DTMF_CALL_STATE_NONE = 0, DTMF_CALL_STATE_CALL_OUT, - DTMF_CALL_STATE_RECEIVED + DTMF_CALL_STATE_RECEIVED, + DTMF_CALL_STATE_RECEIVED_STAY }; enum DTMF_DecodeResponse_t { @@ -60,6 +61,11 @@ enum DTMF_CallMode_t { DTMF_CALL_MODE_DTMF }; +enum { // seconds + DTMF_HOLD_MIN = 5, + DTMF_HOLD_MAX = 60 +}; + typedef enum DTMF_CallMode_t DTMF_CallMode_t; extern char gDTMF_String[15]; diff --git a/app/generic.c b/app/generic.c index 0bfa0d86..54a43e4f 100644 --- a/app/generic.c +++ b/app/generic.c @@ -119,158 +119,154 @@ void GENERIC_Key_PTT(bool bKeyPressed) gInputBoxIndex = 0; if (!bKeyPressed || gSerialConfigCountDown_500ms > 0) - { - //if (gScreenToDisplay == DISPLAY_MAIN) - { - if (gCurrentFunction == FUNCTION_TRANSMIT) + { // PTT released + + if (gCurrentFunction == FUNCTION_TRANSMIT) + { // we are transmitting .. stop + + if (gFlagEndTransmission) { - if (gFlagEndTransmission) - { + FUNCTION_Select(FUNCTION_FOREGROUND); + } + else + { + APP_EndTransmission(); + + if (gEeprom.REPEATER_TAIL_TONE_ELIMINATION == 0) FUNCTION_Select(FUNCTION_FOREGROUND); - } else - { - APP_EndTransmission(); - - if (gEeprom.REPEATER_TAIL_TONE_ELIMINATION == 0) - { - FUNCTION_Select(FUNCTION_FOREGROUND); - } - else - gRTTECountdown = gEeprom.REPEATER_TAIL_TONE_ELIMINATION * 10; - } - - gFlagEndTransmission = false; - #ifdef ENABLE_VOX - gVOX_NoiseDetected = false; - #endif + gRTTECountdown = gEeprom.REPEATER_TAIL_TONE_ELIMINATION * 10; } + gFlagEndTransmission = false; + + #ifdef ENABLE_VOX + gVOX_NoiseDetected = false; + #endif + RADIO_SetVfoState(VFO_STATE_NORMAL); if (gScreenToDisplay != DISPLAY_MENU) // 1of11 .. don't close the menu gRequestDisplayScreen = DISPLAY_MAIN; - - return; } - gInputBoxIndex = 0; - return; - } - - if (gScanStateDir != SCAN_OFF) - { - SCANNER_Stop(); - - gPttDebounceCounter = 0; - gPttIsPressed = false; - - if (gScreenToDisplay != DISPLAY_MENU) // 1of11 .. don't close the menu - gRequestDisplayScreen = DISPLAY_MAIN; - return; } - #ifdef ENABLE_FMRADIO - if (gFM_ScanState == FM_SCAN_OFF) - #endif - { - if (gCssScanMode == CSS_SCAN_MODE_OFF) - { - #ifdef ENABLE_FMRADIO - if (gScreenToDisplay == DISPLAY_FM) - { - gRequestDisplayScreen = DISPLAY_MAIN; - gInputBoxIndex = 0; - gPttIsPressed = false; - gPttDebounceCounter = 0; - return; - } - #endif - - if (gScreenToDisplay != DISPLAY_SCANNER) - { - if (gCurrentFunction == FUNCTION_TRANSMIT && gRTTECountdown == 0) - { - gInputBoxIndex = 0; - return; - } + // PTT pressed - if (gScreenToDisplay != DISPLAY_MENU) // 1of11 .. don't close the menu - gRequestDisplayScreen = DISPLAY_MAIN; + if (gScanStateDir != SCAN_OFF || // frequency/channel scanning + gScreenToDisplay == DISPLAY_SCANNER || // CTCSS/CDCSS scanning + gCssScanMode != CSS_SCAN_MODE_OFF) // " " + { // we're scanning .. stop - if (!gDTMF_InputMode) - { - gFlagPrepareTX = true; - gInputBoxIndex = 0; - return; - } - - gDTMF_InputMode = false; -// gUpdateDisplay = true; - - if (gDTMF_InputBox_Index > 0 || gDTMF_PreviousIndex > 0) - { - if (gDTMF_InputBox_Index == 0) - gDTMF_InputBox_Index = gDTMF_PreviousIndex; - - if (gDTMF_InputBox_Index < sizeof(gDTMF_InputBox)) - gDTMF_InputBox[gDTMF_InputBox_Index] = 0; - - #if 0 - // append our DTMF ID to the inputted DTMF code - - // IF the user inputted code is exactly 3 digits long - if (gDTMF_InputBox_Index == 3) - gDTMF_CallMode = DTMF_CheckGroupCall(gDTMF_InputBox, 3); - else - #else - // append our DTMF ID to the inputted DTMF code - - // IF the user inputted code is exactly 3 digits long and D-DCD is enabled - if (gDTMF_InputBox_Index == 3 && gTxVfo->DTMF_DECODING_ENABLE > 0) - gDTMF_CallMode = DTMF_CheckGroupCall(gDTMF_InputBox, 3); - else - #endif - gDTMF_CallMode = DTMF_CALL_MODE_DTMF; - - strcpy(gDTMF_String, gDTMF_InputBox); - gDTMF_PreviousIndex = gDTMF_InputBox_Index; - DTMF_clear_input_box(); - - gDTMF_ReplyState = DTMF_REPLY_ANI; - gDTMF_State = DTMF_STATE_0; - - gFlagPrepareTX = true; - } - - return; - } - - gEeprom.CROSS_BAND_RX_TX = gBackupCROSS_BAND_RX_TX; + if (gScreenToDisplay == DISPLAY_SCANNER) + { // CTCSS/CDCSS scanning .. stop + gEeprom.CROSS_BAND_RX_TX = gBackup_CROSS_BAND_RX_TX; gFlagStopScan = true; gVfoConfigureMode = VFO_CONFIGURE_RELOAD; gFlagResetVfos = true; - - gUpdateStatus = true; } else - { + if (gScanStateDir != SCAN_OFF) + { // frequency/channel scanning . .stop + SCANNER_Stop(); + } + else + if (gCssScanMode != CSS_SCAN_MODE_OFF) + { // CTCSS/CDCSS scanning .. stop MENU_StopCssScan(); - if (gScreenToDisplay != DISPLAY_MENU) // 1of11 .. don't close the menu - gRequestDisplayScreen = DISPLAY_MENU; + #ifdef ENABLE_VOICE + gAnotherVoiceID = VOICE_ID_SCANNING_STOP; + #endif } + + goto cancel_tx; } + #ifdef ENABLE_FMRADIO - else - { + if (gFM_ScanState != FM_SCAN_OFF) + { // FM radio is scanning .. stop FM_PlayAndUpdate(); + #ifdef ENABLE_VOICE + gAnotherVoiceID = VOICE_ID_SCANNING_STOP; + #endif gRequestDisplayScreen = DISPLAY_FM; + goto cancel_tx; } #endif - #ifdef ENABLE_VOICE - gAnotherVoiceID = VOICE_ID_SCANNING_STOP; + #ifdef ENABLE_FMRADIO + if (gScreenToDisplay == DISPLAY_FM) + goto start_tx; // listening to the FM radio .. start TX'ing #endif - gPttWasPressed = true; + if (gCurrentFunction == FUNCTION_TRANSMIT && gRTTECountdown == 0) + { // already transmitting + gInputBoxIndex = 0; + return; + } + + if (gScreenToDisplay != DISPLAY_MENU) // 1of11 .. don't close the menu + gRequestDisplayScreen = DISPLAY_MAIN; + + if (!gDTMF_InputMode && gDTMF_InputBox_Index == 0) + goto start_tx; // wasn't entering a DTMF code .. start TX'ing (maybe) + + // was entering a DTMF string + + if (gDTMF_InputBox_Index > 0 || gDTMF_PreviousIndex > 0) + { // going to transmit a DTMF string + + if (gDTMF_InputBox_Index == 0 && gDTMF_PreviousIndex > 0) + gDTMF_InputBox_Index = gDTMF_PreviousIndex; // use the previous DTMF string + + if (gDTMF_InputBox_Index < sizeof(gDTMF_InputBox)) + gDTMF_InputBox[gDTMF_InputBox_Index] = 0; // NULL term the string + + #if 0 + // append our DTMF ID to the inputted DTMF code - + // IF the user inputted code is exactly 3 digits long + if (gDTMF_InputBox_Index == 3) + gDTMF_CallMode = DTMF_CheckGroupCall(gDTMF_InputBox, 3); + else + gDTMF_CallMode = DTMF_CALL_MODE_DTMF; + #else + // append our DTMF ID to the inputted DTMF code - + // IF the user inputted code is exactly 3 digits long and D-DCD is enabled + if (gDTMF_InputBox_Index == 3 && gTxVfo->DTMF_DECODING_ENABLE > 0) + gDTMF_CallMode = DTMF_CheckGroupCall(gDTMF_InputBox, 3); + else + gDTMF_CallMode = DTMF_CALL_MODE_DTMF; + #endif + + // remember the DTMF string + gDTMF_PreviousIndex = gDTMF_InputBox_Index; + strcpy(gDTMF_String, gDTMF_InputBox); + + gDTMF_ReplyState = DTMF_REPLY_ANI; + gDTMF_State = DTMF_STATE_0; + } + + DTMF_clear_input_box(); + +start_tx: + // request start TX + gFlagPrepareTX = true; + goto done; + +cancel_tx: + if (gPttIsPressed) + { + gPttIsPressed = false; + gPttWasPressed = true; + } + +done: + gPttDebounceCounter = 0; + if (gScreenToDisplay != DISPLAY_MENU && gRequestDisplayScreen != DISPLAY_FM) // 1of11 .. don't close the menu + gRequestDisplayScreen = DISPLAY_MAIN; + gUpdateStatus = true; + gUpdateDisplay = true; } diff --git a/app/main.c b/app/main.c index 1a14d3e3..60404393 100644 --- a/app/main.c +++ b/app/main.c @@ -195,12 +195,12 @@ static void processFKeyFunction(const KEY_Code_t Key, const bool beep) gWasFKeyPressed = false; gFlagStartScan = true; gScanSingleFrequency = false; - gBackupCROSS_BAND_RX_TX = gEeprom.CROSS_BAND_RX_TX; + gBackup_CROSS_BAND_RX_TX = gEeprom.CROSS_BAND_RX_TX; gEeprom.CROSS_BAND_RX_TX = CROSS_BAND_OFF; gUpdateStatus = true; - if (beep) - gBeepToPlay = BEEP_1KHZ_60MS_OPTIONAL; +// if (beep) +// gBeepToPlay = BEEP_1KHZ_60MS_OPTIONAL; break; @@ -700,7 +700,7 @@ static void MAIN_Key_STAR(bool bKeyPressed, bool bKeyHeld) // scan the CTCSS/DCS code gFlagStartScan = true; gScanSingleFrequency = true; - gBackupCROSS_BAND_RX_TX = gEeprom.CROSS_BAND_RX_TX; + gBackup_CROSS_BAND_RX_TX = gEeprom.CROSS_BAND_RX_TX; gEeprom.CROSS_BAND_RX_TX = CROSS_BAND_OFF; } @@ -821,31 +821,25 @@ void MAIN_ProcessKeys(KEY_Code_t Key, bool bKeyPressed, bool bKeyHeld) } #endif - if (gDTMF_InputMode && bKeyPressed) + if (gDTMF_InputMode && bKeyPressed && !bKeyHeld) { - if (!bKeyHeld) - { - const char Character = DTMF_GetCharacter(Key); - if (Character != 0xFF) - { // add key to DTMF string - DTMF_Append(Character); - - gKeyInputCountdown = key_input_timeout_500ms; - - gRequestDisplayScreen = DISPLAY_MAIN; - - gPttWasReleased = true; - gBeepToPlay = BEEP_1KHZ_60MS_OPTIONAL; - return; - } + const char Character = DTMF_GetCharacter(Key); + if (Character != 0xFF) + { // add key to DTMF string + DTMF_Append(Character); + gKeyInputCountdown = key_input_timeout_500ms; + gRequestDisplayScreen = DISPLAY_MAIN; + gPttWasReleased = true; + gBeepToPlay = BEEP_1KHZ_60MS_OPTIONAL; + return; } } // TODO: ??? - if (Key > KEY_PTT) - { - Key = KEY_SIDE2; // what's this doing ??? - } +// if (Key > KEY_PTT) +// { +// Key = KEY_SIDE2; // what's this doing ??? +// } switch (Key) { diff --git a/app/menu.c b/app/menu.c index 6f259f6f..545c696b 100644 --- a/app/menu.c +++ b/app/menu.c @@ -314,8 +314,8 @@ int MENU_GetLimits(uint8_t Cursor, int32_t *pMin, int32_t *pMax) break; case MENU_D_HOLD: - *pMin = 5; - *pMax = 60; + *pMin = DTMF_HOLD_MIN; + *pMax = DTMF_HOLD_MAX; break; case MENU_D_PRE: @@ -1079,6 +1079,30 @@ void MENU_ShowCurrentSetting(void) case MENU_D_HOLD: gSubMenuSelection = gEeprom.DTMF_auto_reset_time; + + if (gSubMenuSelection <= DTMF_HOLD_MIN) + gSubMenuSelection = DTMF_HOLD_MIN; + else + if (gSubMenuSelection <= 10) + gSubMenuSelection = 10; + else + if (gSubMenuSelection <= 20) + gSubMenuSelection = 20; + else + if (gSubMenuSelection <= 30) + gSubMenuSelection = 30; + else + if (gSubMenuSelection <= 40) + gSubMenuSelection = 40; + else + if (gSubMenuSelection <= 50) + gSubMenuSelection = 50; + else + if (gSubMenuSelection < DTMF_HOLD_MAX) + gSubMenuSelection = 50; + else + gSubMenuSelection = DTMF_HOLD_MAX; + break; case MENU_D_PRE: diff --git a/app/scanner.c b/app/scanner.c index 07c95fdf..b0e10469 100644 --- a/app/scanner.c +++ b/app/scanner.c @@ -95,7 +95,7 @@ static void SCANNER_Key_EXIT(bool bKeyPressed, bool bKeyHeld) case SCAN_EDIT_STATE_NONE: gRequestDisplayScreen = DISPLAY_MAIN; - gEeprom.CROSS_BAND_RX_TX = gBackupCROSS_BAND_RX_TX; + gEeprom.CROSS_BAND_RX_TX = gBackup_CROSS_BAND_RX_TX; gUpdateStatus = true; gFlagStopScan = true; gVfoConfigureMode = VFO_CONFIGURE_RELOAD; @@ -166,8 +166,6 @@ static void SCANNER_Key_MENU(bool bKeyPressed, bool bKeyHeld) { #if 0 - // can't make head nor tail of what's being done here :( - uint32_t Freq250 = FREQUENCY_FloorToStep(gScanFrequency, 250, 0); uint32_t Freq625 = FREQUENCY_FloorToStep(gScanFrequency, 625, 0); @@ -207,6 +205,7 @@ static void SCANNER_Key_MENU(bool bKeyPressed, bool bKeyHeld) 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]; @@ -254,12 +253,13 @@ static void SCANNER_Key_MENU(bool bKeyPressed, bool bKeyHeld) gScannerEditState = SCAN_EDIT_STATE_DONE; } - gScanCssState = SCAN_CSS_STATE_FOUND; + gScanCssState = SCAN_CSS_STATE_FOUND; + #ifdef ENABLE_VOICE - gAnotherVoiceID = VOICE_ID_MEMORY_CHANNEL; + gAnotherVoiceID = VOICE_ID_MEMORY_CHANNEL; #endif - gRequestDisplayScreen = DISPLAY_SCANNER; + gRequestDisplayScreen = DISPLAY_SCANNER; gUpdateStatus = true; break; @@ -452,7 +452,7 @@ void SCANNER_Start(void) DTMF_clear_RX(); - gScanDelay_10ms = scan_delay_10ms; + gScanDelay_10ms = scan_freq_css_delay_10ms; gScanCssResultCode = 0xFF; gScanCssResultType = 0xFF; gScanHitCount = 0; @@ -467,6 +467,7 @@ void SCANNER_Start(void) g_SquelchLost = false; gScannerEditState = SCAN_EDIT_STATE_NONE; gScanProgressIndicator = 0; +// gFlagStartScan = false; gUpdateStatus = true; } @@ -475,6 +476,9 @@ void SCANNER_Stop(void) { const uint8_t Previous = gRestoreMrChannel; + if (gScanStateDir == SCAN_OFF) + return; // but, but, we weren't ! + gScanStateDir = SCAN_OFF; if (!bScanKeepFrequency) diff --git a/app/spectrum.c b/app/spectrum.c index 9d00b869..1169f966 100644 --- a/app/spectrum.c +++ b/app/spectrum.c @@ -16,40 +16,23 @@ #include "../app/spectrum.h" -struct FrequencyBandInfo { - uint32_t lower; - uint32_t upper; - uint32_t middle; -}; - -const struct FrequencyBandInfo FrequencyBandTable[7] = { - [BAND1_50MHz ] = {.lower = 1600000, .middle = 6500000, .upper = 7600000}, - [BAND2_108MHz] = {.lower = 10800000, .middle = 12200000, .upper = 13599990}, - [BAND3_136MHz] = {.lower = 13600000, .middle = 15000000, .upper = 17399990}, - [BAND4_174MHz] = {.lower = 17400000, .middle = 26000000, .upper = 34999990}, - [BAND5_350MHz] = {.lower = 35000000, .middle = 37000000, .upper = 39999990}, - [BAND6_400MHz] = {.lower = 40000000, .middle = 43500000, .upper = 46999990}, - [BAND7_470MHz] = {.lower = 47000000, .middle = 55000000, .upper = 130000000}, -}; - - #define F_MIN FrequencyBandTable[0].lower #define F_MAX FrequencyBandTable[ARRAY_SIZE(FrequencyBandTable) - 1].upper const uint16_t RSSI_MAX_VALUE = 65535; -static uint16_t R30, R37, R3D, R43, R47, R48, R7E; static uint32_t initialFreq; static char String[32]; bool isInitialized = false; -bool isListening = true; bool monitorMode = false; bool redrawStatus = true; bool redrawScreen = false; bool newScanStart = true; bool preventKeypress = true; -bool audioState = true; + +bool isListening = false; +bool isTransmitting = false; State currentState = SPECTRUM, previousState = SPECTRUM; @@ -62,123 +45,94 @@ const char *modulationTypeOptions[] = {" FM", " AM", "USB"}; const uint8_t modulationTypeTuneSteps[] = {100, 50, 10}; const uint8_t modTypeReg47Values[] = {1, 7, 5}; -SpectrumSettings settings = {stepsCount: STEPS_64, - scanStepIndex: S_STEP_25_0kHz, - frequencyChangeStep: 80000, - scanDelay: 3200, - rssiTriggerLevel: 150, - backlightState: true, - bw: BK4819_FILTER_BW_WIDE, - listenBw: BK4819_FILTER_BW_WIDE, - modulationType: false, - dbMin: -130, - dbMax: -50}; +SpectrumSettings settings = { + .stepsCount = STEPS_64, + .scanStepIndex = S_STEP_25_0kHz, + .frequencyChangeStep = 80000, + .scanDelay = 3200, + .rssiTriggerLevel = 150, + .backlightState = true, + .bw = BK4819_FILTER_BW_WIDE, + .listenBw = BK4819_FILTER_BW_WIDE, + .modulationType = false, +}; uint32_t fMeasure = 0; +uint32_t fTx = 0; uint32_t currentFreq, tempFreq; -uint16_t rssiHistory[128] = {}; +uint16_t rssiHistory[128] = {0}; +bool blacklist[128] = {false}; + +static const RegisterSpec afOutRegSpec = {"AF OUT", 0x47, 8, 0xF, 1}; +static const RegisterSpec afDacGainRegSpec = {"AF DAC G", 0x48, 0, 0xF, 1}; +static const RegisterSpec registerSpecs[] = { + {}, + {"LNAs", 0x13, 8, 0b11, 1}, + {"LNA", 0x13, 5, 0b111, 1}, + {"PGA", 0x13, 0, 0b111, 1}, + {"MIX", 0x13, 3, 0b11, 1}, + + {"DEV", 0x40, 0, 4095, 1}, + {"CMP", 0x31, 3, 1, 1}, + {"MIC", 0x7D, 0, 0x1F, 1}, +}; +static uint16_t registersBackup[128]; +static const uint8_t registersToBackup[] = { + 0x13, 0x30, 0x31, 0x37, 0x3D, 0x40, 0x43, 0x47, 0x48, 0x7D, 0x7E, +}; + +static MovingAverage mov = {{128}, {}, 255, 128, 0, 0}; +static const uint8_t MOV_N = ARRAY_SIZE(mov.buf); + +const uint8_t FREQ_INPUT_LENGTH = 10; uint8_t freqInputIndex = 0; uint8_t freqInputDotIndex = 0; KEY_Code_t freqInputArr[10]; -char freqInputString[11] = "----------\0"; // XXXX.XXXXX\0 +char freqInputString[] = "----------"; // XXXX.XXXXX uint8_t menuState = 0; -uint16_t listenT = 0; -RegisterSpec registerSpecs[] = { - {}, - {"LNAs", 0x13, 8, 0b11, 1}, - {"LNA", 0x13, 5, 0b111, 1}, - {"PGA", 0x13, 0, 0b111, 1}, - {"IF", 0x3D, 0, 0xFFFF, 0x2aaa}, - // {"MIX", 0x13, 3, 0b11, 1}, // TODO: hidden -}; +uint16_t listenT = 0; -uint16_t statuslineUpdateTimer = 0; +uint16_t batteryUpdateTimer = 0; +bool isMovingInitialized = false; +uint8_t lastStepsCount = 0; -static uint8_t DBm2S(int dbm) { - uint8_t i = 0; - dbm *= -1; - for (i = 0; i < ARRAY_SIZE(U8RssiMap); i++) { - if (dbm >= U8RssiMap[i]) { - return i; - } +uint8_t CountBits(uint16_t n) { + uint8_t count = 0; + while (n) { + count++; + n >>= 1; } - return i; + return count; } -static int Rssi2DBm(uint16_t rssi) { return (rssi >> 1) - 160; } +static uint16_t GetRegMask(RegisterSpec s) { + return (1 << CountBits(s.maxValue)) - 1; +} -static uint16_t GetRegMenuValue(uint8_t st) { - RegisterSpec s = registerSpecs[st]; +static uint16_t GetRegValue(RegisterSpec s) { return (BK4819_ReadRegister(s.num) >> s.offset) & s.maxValue; } -static void SetRegMenuValue(uint8_t st, bool add) { - uint16_t v = GetRegMenuValue(st); - RegisterSpec s = registerSpecs[st]; - +static void SetRegValue(RegisterSpec s, uint16_t v) { uint16_t reg = BK4819_ReadRegister(s.num); - if (add && v <= s.maxValue - s.inc) { - v += s.inc; - } else if (!add && v >= 0 + s.inc) { - v -= s.inc; - } - // TODO: use max value for bits count in max value, or reset by additional - // mask in spec - reg &= ~(s.maxValue << s.offset); + reg &= ~(GetRegMask(s) << s.offset); BK4819_WriteRegister(s.num, reg | (v << s.offset)); - redrawScreen = true; } -// GUI functions - -static void PutPixel(uint8_t x, uint8_t y, bool fill) { - if (fill) { - gFrameBuffer[y >> 3][x] |= 1 << (y & 7); - } else { - gFrameBuffer[y >> 3][x] &= ~(1 << (y & 7)); - } -} -static void PutPixelStatus(uint8_t x, uint8_t y, bool fill) { - if (fill) { - gStatusLine[x] |= 1 << y; - } else { - gStatusLine[x] &= ~(1 << y); - } -} +static void UpdateRegMenuValue(RegisterSpec s, bool add) { + uint16_t v = GetRegValue(s); -static void DrawHLine(int sy, int ey, int nx, bool fill) { - for (int i = sy; i <= ey; i++) { - if (i < 56 && nx < 128) { - PutPixel(nx, i, fill); - } + if (add && v <= s.maxValue - s.inc) { + v += s.inc; + } else if (!add && v >= 0 + s.inc) { + v -= s.inc; } -} -static void GUI_DisplaySmallest(const char *pString, uint8_t x, uint8_t y, - bool statusbar, bool fill) { - uint8_t c; - uint8_t pixels; - const uint8_t *p = (const uint8_t *)pString; - - while ((c = *p++) && c != '\0') { - c -= 0x20; - for (int i = 0; i < 3; ++i) { - pixels = gFont3x5[c][i]; - for (int j = 0; j < 6; ++j) { - if (pixels & 1) { - if (statusbar) - PutPixelStatus(x + i, y + j, fill); - else - PutPixel(x + i, y + j, fill); - } - pixels >>= 1; - } - } - x += 4; - } + SetRegValue(s, v); + redrawScreen = true; } // Utility functions @@ -191,12 +145,6 @@ KEY_Code_t GetKey() { return btn; } -static int clamp(int v, int min, int max) { - return v <= min ? min : (v >= max ? max : v); -} - -static uint8_t my_abs(signed v) { return v > 0 ? v : -v; } - void SetState(State state) { previousState = currentState; currentState = state; @@ -206,52 +154,37 @@ void SetState(State state) { // Radio functions -static void ToggleAFBit(bool on) { - uint16_t reg = BK4819_ReadRegister(BK4819_REG_47); - reg &= ~(1 << 8); - if (on) - reg |= on << 8; - BK4819_WriteRegister(BK4819_REG_47, reg); -} - static void BackupRegisters() { - R30 = BK4819_ReadRegister(0x30); - R37 = BK4819_ReadRegister(0x37); - R3D = BK4819_ReadRegister(0x3D); - R43 = BK4819_ReadRegister(0x43); - R47 = BK4819_ReadRegister(0x47); - R48 = BK4819_ReadRegister(0x48); - R7E = BK4819_ReadRegister(0x7E); + for (int i = 0; i < ARRAY_SIZE(registersToBackup); ++i) { + uint8_t regNum = registersToBackup[i]; + registersBackup[regNum] = BK4819_ReadRegister(regNum); + } } static void RestoreRegisters() { - BK4819_WriteRegister(0x30, R30); - BK4819_WriteRegister(0x37, R37); - BK4819_WriteRegister(0x3D, R3D); - BK4819_WriteRegister(0x43, R43); - BK4819_WriteRegister(0x47, R47); - BK4819_WriteRegister(0x48, R48); - BK4819_WriteRegister(0x7E, R7E); + for (int i = 0; i < ARRAY_SIZE(registersToBackup); ++i) { + uint8_t regNum = registersToBackup[i]; + BK4819_WriteRegister(regNum, registersBackup[regNum]); + } } static void SetModulation(ModulationType type) { - RestoreRegisters(); - uint16_t reg = BK4819_ReadRegister(BK4819_REG_47); - reg &= ~(0b111 << 8); - BK4819_WriteRegister(BK4819_REG_47, reg | (modTypeReg47Values[type] << 8)); + // restore only registers, which we affect here fully + BK4819_WriteRegister(0x37, registersBackup[0x37]); + BK4819_WriteRegister(0x3D, registersBackup[0x3D]); + BK4819_WriteRegister(0x48, registersBackup[0x48]); + + SetRegValue(afOutRegSpec, modTypeReg47Values[type]); + if (type == MOD_USB) { + BK4819_WriteRegister(0x37, 0b0001011000001111); BK4819_WriteRegister(0x3D, 0b0010101101000101); - BK4819_WriteRegister(BK4819_REG_37, 0x160F); BK4819_WriteRegister(0x48, 0b0000001110101000); } -} -static void ToggleAFDAC(bool on) { - uint32_t Reg = BK4819_ReadRegister(BK4819_REG_30); - Reg &= ~(1 << 9); - if (on) - Reg |= (1 << 9); - BK4819_WriteRegister(BK4819_REG_30, Reg); + if (type == MOD_AM) { + SetRegValue(afDacGainRegSpec, 0xE); + } } static void SetF(uint32_t f) { @@ -264,6 +197,15 @@ static void SetF(uint32_t f) { BK4819_WriteRegister(BK4819_REG_30, reg); } +static void SetTxF(uint32_t f) { + fTx = f; + BK4819_SetFrequency(f); + BK4819_PickRXFilterPathBasedOnFrequency(f); + uint16_t reg = BK4819_ReadRegister(BK4819_REG_30); + BK4819_WriteRegister(BK4819_REG_30, 0); + BK4819_WriteRegister(BK4819_REG_30, reg); +} + // Spectrum related bool IsPeakOverLevel() { return peak.rssi >= settings.rssiTriggerLevel; } @@ -273,7 +215,7 @@ static void ResetPeak() { peak.rssi = 0; } -bool IsCenterMode() { return settings.scanStepIndex < S_STEP_2_5kHz; } +bool IsCenterMode() { return settings.scanStepIndex < S_STEP_1_0kHz; } uint8_t GetStepsCount() { return 128 >> settings.stepsCount; } uint16_t GetScanStep() { return scanStepValues[settings.scanStepIndex]; } uint32_t GetBW() { return GetStepsCount() * GetScanStep(); } @@ -282,6 +224,64 @@ uint32_t GetFStart() { } uint32_t GetFEnd() { return currentFreq + GetBW(); } +static void MovingCp(uint16_t *dst, uint16_t *src) { + memcpy(dst, src, GetStepsCount() * sizeof(uint16_t)); +} + +static void ResetMoving() { + for (int i = 0; i < MOV_N; ++i) { + MovingCp(mov.buf[i], rssiHistory); + } +} + +static void MoveHistory() { + const uint8_t XN = GetStepsCount(); + + uint32_t midSum = 0; + + mov.min = RSSI_MAX_VALUE; + mov.max = 0; + + if (lastStepsCount != XN) { + ResetMoving(); + lastStepsCount = XN; + } + for (int i = MOV_N - 1; i > 0; --i) { + MovingCp(mov.buf[i], mov.buf[i - 1]); + } + MovingCp(mov.buf[0], rssiHistory); + + uint8_t skipped = 0; + + for (int x = 0; x < XN; ++x) { + if (blacklist[x]) { + skipped++; + continue; + } + uint32_t sum = 0; + for (int i = 0; i < MOV_N; ++i) { + sum += mov.buf[i][x]; + } + + uint16_t pointV = mov.mean[x] = sum / MOV_N; + + midSum += pointV; + + if (pointV > mov.max) { + mov.max = pointV; + } + + if (pointV < mov.min) { + mov.min = pointV; + } + } + if (skipped == XN) { + return; + } + + mov.mid = midSum / (XN - skipped); +} + static void TuneToPeak() { scanInfo.f = peak.f; scanInfo.rssi = peak.rssi; @@ -289,30 +289,50 @@ static void TuneToPeak() { SetF(scanInfo.f); } -static void DeInitSpectrum() { - SetF(initialFreq); - RestoreRegisters(); - isInitialized = false; +uint8_t GetBWRegValueForScan() { + return scanStepBWRegValues[settings.scanStepIndex == S_STEP_100_0kHz ? 11 + : 0]; } -uint8_t GetBWRegValueForScan() { - return scanStepBWRegValues[settings.scanStepIndex]; +uint8_t GetBWRegValueForListen() { + return listenBWRegValues[settings.listenBw]; +} + +static void ResetRSSI() { + uint32_t Reg = BK4819_ReadRegister(BK4819_REG_30); + Reg &= ~1; + BK4819_WriteRegister(BK4819_REG_30, Reg); + Reg |= 1; + BK4819_WriteRegister(BK4819_REG_30, Reg); } uint16_t GetRssi() { - // SYSTICK_DelayUs(800); - // testing autodelay based on Glitch value - while ((BK4819_ReadRegister(0x63) & 0b11111111) >= 255) { - SYSTICK_DelayUs(100); + if (currentState == SPECTRUM) { + ResetRSSI(); + SYSTICK_DelayUs(3200); } return BK4819_GetRSSI(); } -static void ToggleAudio(bool on) { - if (on == audioState) { - return; +uint32_t GetOffsetedF(uint32_t f) { + switch (gCurrentVfo->FREQUENCY_DEVIATION_SETTING) { + case FREQUENCY_DEVIATION_OFF: + break; + case FREQUENCY_DEVIATION_ADD: + f += gCurrentVfo->FREQUENCY_OF_DEVIATION; + break; + case FREQUENCY_DEVIATION_SUB: + f -= gCurrentVfo->FREQUENCY_OF_DEVIATION; + break; } - audioState = on; + + return Clamp(f, FrequencyBandTable[0].lower, + FrequencyBandTable[ARRAY_SIZE(FrequencyBandTable) - 1].upper); +} + +bool IsTXAllowed() { return gSetting_ALL_TX != 2; } + +static void ToggleAudio(bool on) { if (on) { GPIO_SetBit(&GPIOC->DATA, GPIOC_PIN_AUDIO_PATH); } else { @@ -320,23 +340,92 @@ static void ToggleAudio(bool on) { } } +static void ToggleTX(bool); +static void ToggleRX(bool); + static void ToggleRX(bool on) { + /* if (isListening == on) { + return; + } */ isListening = on; + if (on) { + ToggleTX(false); + } BK4819_ToggleGpioOut(BK4819_GPIO0_PIN28_GREEN, on); + BK4819_RX_TurnOn(); ToggleAudio(on); - ToggleAFDAC(on); - ToggleAFBit(on); + BK4819_ToggleAFDAC(on); + BK4819_ToggleAFBit(on); if (on) { listenT = 1000; - BK4819_WriteRegister(0x43, listenBWRegValues[settings.listenBw]); + BK4819_WriteRegister(0x43, GetBWRegValueForListen()); } else { BK4819_WriteRegister(0x43, GetBWRegValueForScan()); } } +uint16_t registersVault[128] = {0}; + +static void RegBackupSet(uint8_t num, uint16_t value) { + registersVault[num] = BK4819_ReadRegister(num); + BK4819_WriteRegister(num, value); +} + +static void RegRestore(uint8_t num) { + BK4819_WriteRegister(num, registersVault[num]); +} + +static void ToggleTX(bool on) { + if (isTransmitting == on) { + return; + } + isTransmitting = on; + if (on) { + ToggleRX(false); + } + + BK4819_ToggleGpioOut(BK4819_GPIO1_PIN29_RED, on); + + if (on) { + ToggleAudio(false); + + SetTxF(GetOffsetedF(fMeasure)); + + RegBackupSet(BK4819_REG_47, 0x6040); + RegBackupSet(BK4819_REG_7E, 0x302E); + RegBackupSet(BK4819_REG_50, 0x3B20); + RegBackupSet(BK4819_REG_37, 0x1D0F); + RegBackupSet(BK4819_REG_52, 0x028F); + RegBackupSet(BK4819_REG_30, 0x0000); + BK4819_WriteRegister(BK4819_REG_30, 0xC1FE); + RegBackupSet(BK4819_REG_51, 0x0000); + + BK4819_SetupPowerAmplifier(gCurrentVfo->TXP_CalculatedSetting, + gCurrentVfo->pTX->Frequency); + } else { + RADIO_SendEndOfTransmission(); + RADIO_EnableCxCSS(); + + BK4819_SetupPowerAmplifier(0, 0); + + RegRestore(BK4819_REG_51); + BK4819_WriteRegister(BK4819_REG_30, 0); + RegRestore(BK4819_REG_30); + RegRestore(BK4819_REG_52); + RegRestore(BK4819_REG_37); + RegRestore(BK4819_REG_50); + RegRestore(BK4819_REG_7E); + RegRestore(BK4819_REG_47); + + SetF(fMeasure); + } + BK4819_ToggleGpioOut(BK4819_GPIO6_PIN2, !on); + BK4819_ToggleGpioOut(BK4819_GPIO5_PIN1, on); +} + // Scan info static void ResetScanStats() { @@ -357,14 +446,15 @@ static void InitScan() { static void ResetBlacklist() { for (int i = 0; i < 128; ++i) { - if (rssiHistory[i] == RSSI_MAX_VALUE) - rssiHistory[i] = 0; + if (blacklist[i]) + blacklist[i] = false; } } static void RelaunchScan() { InitScan(); ResetPeak(); + lastStepsCount = 0; ToggleRX(false); #ifdef SPECTRUM_AUTOMATIC_SQUELCH settings.rssiTriggerLevel = RSSI_MAX_VALUE; @@ -382,14 +472,12 @@ static void UpdateScanInfo() { if (scanInfo.rssi < scanInfo.rssiMin) { scanInfo.rssiMin = scanInfo.rssi; - settings.dbMin = Rssi2DBm(scanInfo.rssiMin); - redrawStatus = true; } } static void AutoTriggerLevel() { if (settings.rssiTriggerLevel == RSSI_MAX_VALUE) { - settings.rssiTriggerLevel = clamp(scanInfo.rssiMax + 8, 0, RSSI_MAX_VALUE); + settings.rssiTriggerLevel = Clamp(scanInfo.rssiMax + 4, 0, RSSI_MAX_VALUE); } } @@ -416,20 +504,42 @@ static void UpdateRssiTriggerLevel(bool inc) { else settings.rssiTriggerLevel -= 2; redrawScreen = true; - redrawStatus = true; + SYSTEM_DelayMs(10); } -static void UpdateDBMax(bool inc) { - if (inc && settings.dbMax < 10) { - settings.dbMax += 1; - } else if (!inc && settings.dbMax > settings.dbMin) { - settings.dbMax -= 1; +static void ApplyPreset(FreqPreset p) { + currentFreq = p.fStart; + settings.scanStepIndex = p.stepSizeIndex; + settings.listenBw = p.listenBW; + settings.modulationType = p.modulationType; + settings.stepsCount = p.stepsCountIndex; + SetModulation(settings.modulationType); + RelaunchScan(); + ResetBlacklist(); + redrawScreen = true; +} + +static void SelectNearestPreset(bool inc) { + FreqPreset p; + const uint8_t SZ = ARRAY_SIZE(freqPresets); + if (inc) { + for (int i = 0; i < SZ; ++i) { + p = freqPresets[i]; + if (currentFreq < p.fStart) { + ApplyPreset(p); + return; + } + } } else { - return; + for (int i = SZ - 1; i >= 0; --i) { + p = freqPresets[i]; + if (currentFreq > p.fEnd) { + ApplyPreset(p); + return; + } + } } - redrawStatus = true; - redrawScreen = true; - SYSTEM_DelayMs(20); + ApplyPreset(p); } static void UpdateScanStep(bool inc) { @@ -584,7 +694,7 @@ static void UpdateFreqInput(KEY_Code_t key) { } static void Blacklist() { - rssiHistory[peak.i] = RSSI_MAX_VALUE; + blacklist[peak.i] = true; ResetPeak(); ToggleRX(false); newScanStart = true; @@ -592,70 +702,46 @@ static void Blacklist() { // Draw things -// applied x2 to prevent initial rounding -uint8_t Rssi2PX(uint16_t rssi, uint8_t pxMin, uint8_t pxMax) { - const int DB_MIN = settings.dbMin << 1; - const int DB_MAX = settings.dbMax << 1; - const int DB_RANGE = DB_MAX - DB_MIN; - - const uint8_t PX_RANGE = pxMax - pxMin; - - int dbm = clamp(rssi - (160 << 1), DB_MIN, DB_MAX); - - return ((dbm - DB_MIN) * PX_RANGE + DB_RANGE / 2) / DB_RANGE + pxMin; -} - -uint8_t Rssi2Y(uint16_t rssi) { - return DrawingEndY - Rssi2PX(rssi, 0, DrawingEndY); +static uint8_t Rssi2Y(uint16_t rssi) { + return DrawingEndY - ConvertDomain(rssi, mov.min - 2, + mov.max + 30 + (mov.max - mov.min) / 3, 0, + DrawingEndY); } static void DrawSpectrum() { for (uint8_t x = 0; x < 128; ++x) { - uint16_t rssi = rssiHistory[x >> settings.stepsCount]; - if (rssi != RSSI_MAX_VALUE) { - DrawHLine(Rssi2Y(rssi), DrawingEndY, x, true); + uint8_t i = x >> settings.stepsCount; + if (blacklist[i]) { + continue; } + uint16_t rssi = rssiHistory[i]; + DrawHLine(Rssi2Y(rssi), DrawingEndY, x, true); } } -static void DrawStatus() { -#ifdef SPECTRUM_EXTRA_VALUES - sprintf(String, "%d/%d P:%d T:%d", settings.dbMin, settings.dbMax, - Rssi2DBm(peak.rssi), Rssi2DBm(settings.rssiTriggerLevel)); -#else - sprintf(String, "%d/%d", settings.dbMin, settings.dbMax); -#endif - GUI_DisplaySmallest(String, 0, 1, true, true); - +static void UpdateBatteryInfo() { for (int i = 0; i < 4; i++) { BOARD_ADC_GetBatteryInfo(&gBatteryVoltages[i], &gBatteryCurrent); } - uint16_t Voltage; - uint8_t v = 0; + uint16_t voltage = Mid(gBatteryVoltages, ARRAY_SIZE(gBatteryVoltages)); + gBatteryDisplayLevel = 0; - Voltage = (gBatteryVoltages[0] + gBatteryVoltages[1] + gBatteryVoltages[2] + - gBatteryVoltages[3]) / - 4; - - if (gBatteryCalibration[5] < Voltage) { - v = 5; - } else if (gBatteryCalibration[4] < Voltage) { - v = 5; - } else if (gBatteryCalibration[3] < Voltage) { - v = 4; - } else if (gBatteryCalibration[2] < Voltage) { - v = 3; - } else if (gBatteryCalibration[1] < Voltage) { - v = 2; - } else if (gBatteryCalibration[0] < Voltage) { - v = 1; + for (int i = ARRAY_SIZE(gBatteryCalibration) - 1; i >= 0; --i) { + if (gBatteryCalibration[i] < voltage) { + gBatteryDisplayLevel = i + 1; + break; + } } +} + +static void DrawStatus() { gStatusLine[127] = 0b01111110; for (int i = 126; i >= 116; i--) { gStatusLine[i] = 0b01000010; } + uint8_t v = gBatteryDisplayLevel; v <<= 1; for (int i = 125; i >= 116; i--) { if (126 - i <= v) { @@ -668,38 +754,48 @@ static void DrawStatus() { static void DrawF(uint32_t f) { sprintf(String, "%u.%05u", f / 100000, f % 100000); + + if (currentState == STILL && kbd.current == KEY_PTT) { + if (gBatteryDisplayLevel == 6) { + sprintf(String, "VOLTAGE HIGH"); + } else if (!IsTXAllowed()) { + sprintf(String, "DISABLED"); + } else { + f = GetOffsetedF(f); + sprintf(String, "TX %u.%05u", f / 100000, f % 100000); + } + } UI_PrintStringSmall(String, 8, 127, 0); sprintf(String, "%s", modulationTypeOptions[settings.modulationType]); - GUI_DisplaySmallest(String, 116, 1, false, true); + UI_PrintStringSmallest(String, 116, 1, false, true); sprintf(String, "%s", bwOptions[settings.listenBw]); - GUI_DisplaySmallest(String, 108, 7, false, true); + UI_PrintStringSmallest(String, 108, 7, false, true); } static void DrawNums() { - if (currentState == SPECTRUM) { sprintf(String, "%ux", GetStepsCount()); - GUI_DisplaySmallest(String, 0, 1, false, true); + UI_PrintStringSmallest(String, 0, 1, false, true); sprintf(String, "%u.%02uk", GetScanStep() / 100, GetScanStep() % 100); - GUI_DisplaySmallest(String, 0, 7, false, true); + UI_PrintStringSmallest(String, 0, 7, false, true); } if (IsCenterMode()) { sprintf(String, "%u.%05u \xB1%u.%02uk", currentFreq / 100000, currentFreq % 100000, settings.frequencyChangeStep / 100, settings.frequencyChangeStep % 100); - GUI_DisplaySmallest(String, 36, 49, false, true); + UI_PrintStringSmallest(String, 36, 49, false, true); } else { sprintf(String, "%u.%05u", GetFStart() / 100000, GetFStart() % 100000); - GUI_DisplaySmallest(String, 0, 49, false, true); + UI_PrintStringSmallest(String, 0, 49, false, true); sprintf(String, "\xB1%u.%02uk", settings.frequencyChangeStep / 100, settings.frequencyChangeStep % 100); - GUI_DisplaySmallest(String, 48, 49, false, true); + UI_PrintStringSmallest(String, 48, 49, false, true); sprintf(String, "%u.%05u", GetFEnd() / 100000, GetFEnd() % 100000); - GUI_DisplaySmallest(String, 93, 49, false, true); + UI_PrintStringSmallest(String, 93, 49, false, true); } } @@ -725,7 +821,7 @@ static void DrawTicks() { } // center - if (IsCenterMode()) { + /* if (IsCenterMode()) { gFrameBuffer[5][62] = 0x80; gFrameBuffer[5][63] = 0x80; gFrameBuffer[5][64] = 0xff; @@ -740,25 +836,33 @@ static void DrawTicks() { gFrameBuffer[5][125] = 0x80; gFrameBuffer[5][126] = 0x80; gFrameBuffer[5][127] = 0xff; - } + } */ } static void DrawArrow(uint8_t x) { for (signed i = -2; i <= 2; ++i) { signed v = x + i; + uint8_t a = i > 0 ? i : -i; if (!(v & 128)) { - gFrameBuffer[5][v] |= (0b01111000 << my_abs(i)) & 0b01111000; + gFrameBuffer[5][v] |= (0b01111000 << a) & 0b01111000; } } } +static void DeInitSpectrum() { + SetF(initialFreq); + ToggleRX(false); + RestoreRegisters(); + isInitialized = false; +} + static void OnKeyDown(uint8_t key) { switch (key) { case KEY_3: - UpdateDBMax(true); + SelectNearestPreset(true); break; case KEY_9: - UpdateDBMax(false); + SelectNearestPreset(false); break; case KEY_1: UpdateScanStep(true); @@ -805,6 +909,7 @@ static void OnKeyDown(uint8_t key) { case KEY_PTT: SetState(STILL); TuneToPeak(); + settings.rssiTriggerLevel = 120; break; case KEY_MENU: break; @@ -863,21 +968,19 @@ static void OnKeyDownFreqInput(uint8_t key) { void OnKeyDownStill(KEY_Code_t key) { switch (key) { case KEY_3: - UpdateDBMax(true); break; case KEY_9: - UpdateDBMax(false); break; case KEY_UP: if (menuState) { - SetRegMenuValue(menuState, true); + UpdateRegMenuValue(registerSpecs[menuState], true); break; } UpdateCurrentFreqStill(true); break; case KEY_DOWN: if (menuState) { - SetRegMenuValue(menuState, false); + UpdateRegMenuValue(registerSpecs[menuState], false); break; } UpdateCurrentFreqStill(false); @@ -904,9 +1007,12 @@ void OnKeyDownStill(KEY_Code_t key) { ToggleBacklight(); break; case KEY_PTT: - // TODO: start transmit - /* BK4819_ToggleGpioOut(BK4819_GPIO0_PIN28_GREEN, false); - BK4819_ToggleGpioOut(BK4819_GPIO1_PIN29_RED, true); */ + // start transmit + UpdateBatteryInfo(); + if (gBatteryDisplayLevel != 6 && IsTXAllowed()) { + ToggleTX(true); + } + redrawScreen = true; break; case KEY_MENU: if (menuState == ARRAY_SIZE(registerSpecs) - 1) { @@ -917,21 +1023,27 @@ void OnKeyDownStill(KEY_Code_t key) { redrawScreen = true; break; case KEY_EXIT: - if (!menuState) { - SetState(SPECTRUM); - monitorMode = false; - RelaunchScan(); + if (menuState) { + menuState = 0; break; } - menuState = 0; + SetState(SPECTRUM); + monitorMode = false; + RelaunchScan(); break; default: break; } } +static void OnKeysReleased() { + if (isTransmitting) { + ToggleTX(false); + } +} + static void RenderFreqInput() { - UI_PrintString(freqInputString, 2, 127, 0, 8); + UI_PrintString(freqInputString, 2, 127, 0, 8, true); } static void RenderStatus() { @@ -956,39 +1068,51 @@ static void RenderStill() { for (int i = 0; i < 121; i++) { if (i % 10 == 0) { - gFrameBuffer[2][i + METER_PAD_LEFT] = 0b01110000; - } else if (i % 5 == 0) { - gFrameBuffer[2][i + METER_PAD_LEFT] = 0b00110000; + gFrameBuffer[2][i + METER_PAD_LEFT] = 0b11000000; } else { - gFrameBuffer[2][i + METER_PAD_LEFT] = 0b00010000; + gFrameBuffer[2][i + METER_PAD_LEFT] = 0b01000000; } } uint8_t x = Rssi2PX(scanInfo.rssi, 0, 121); for (int i = 0; i < x; ++i) { - if (i % 5) { - gFrameBuffer[2][i + METER_PAD_LEFT] |= 0b00000111; + if (i % 5 && i / 5 < x / 5) { + gFrameBuffer[2][i + METER_PAD_LEFT] |= 0b00011100; } } int dbm = Rssi2DBm(scanInfo.rssi); uint8_t s = DBm2S(dbm); - sprintf(String, "S: %u", s); - GUI_DisplaySmallest(String, 4, 25, false, true); + if (s < 10) { + sprintf(String, "S%u", s); + } else { + sprintf(String, "S9+%u0", s - 9); + } + UI_PrintStringSmallest(String, 4, 10, false, true); sprintf(String, "%d dBm", dbm); - GUI_DisplaySmallest(String, 28, 25, false, true); + UI_PrintStringSmallest(String, 32, 10, false, true); + + if (isTransmitting) { + uint8_t afDB = BK4819_ReadRegister(0x6F) & 0b1111111; + uint8_t afPX = ConvertDomain(afDB, 26, 194, 0, 121); + for (int i = 0; i < afPX; ++i) { + gFrameBuffer[3][i + METER_PAD_LEFT] |= 0b00000011; + } + } if (!monitorMode) { uint8_t x = Rssi2PX(settings.rssiTriggerLevel, 0, 121); - gFrameBuffer[2][METER_PAD_LEFT + x] = 0b11111111; + gFrameBuffer[2][METER_PAD_LEFT + x - 1] |= 0b01000001; + gFrameBuffer[2][METER_PAD_LEFT + x] = 0b01111111; + gFrameBuffer[2][METER_PAD_LEFT + x + 1] |= 0b01000001; } const uint8_t PAD_LEFT = 4; const uint8_t CELL_WIDTH = 30; uint8_t offset = PAD_LEFT; - uint8_t row = 4; + uint8_t row = 3; - for (int i = 0, idx = 1; idx <= 4; ++i, ++idx) { + for (int i = 0, idx = 1; idx <= 7; ++i, ++idx) { if (idx == 5) { row += 2; i = 0; @@ -1000,12 +1124,13 @@ static void RenderStill() { gFrameBuffer[row + 1][j + offset] = 0xFF; } } - sprintf(String, "%s", registerSpecs[idx].name); - GUI_DisplaySmallest(String, offset + 2, row * 8 + 2, false, - menuState != idx); - sprintf(String, "%u", GetRegMenuValue(idx)); - GUI_DisplaySmallest(String, offset + 2, (row + 1) * 8 + 1, false, - menuState != idx); + RegisterSpec s = registerSpecs[idx]; + sprintf(String, "%s", s.name); + UI_PrintStringSmallest(String, offset + 2, row * 8 + 2, false, + menuState != idx); + sprintf(String, "%u", GetRegValue(s)); + UI_PrintStringSmallest(String, offset + 2, (row + 1) * 8 + 1, false, + menuState != idx); } } @@ -1033,15 +1158,16 @@ bool HandleUserInput() { if (kbd.current == KEY_INVALID) { kbd.counter = 0; + OnKeysReleased(); return true; } - if (kbd.current == kbd.prev && kbd.counter <= 16) { + if (kbd.current == kbd.prev && kbd.counter <= 20) { kbd.counter++; - SYSTEM_DelayMs(20); + SYSTEM_DelayMs(10); } - if (kbd.counter == 3 || kbd.counter > 16) { + if (kbd.counter == 4 || kbd.counter > 20) { switch (currentState) { case SPECTRUM: OnKeyDown(kbd.current); @@ -1059,11 +1185,12 @@ bool HandleUserInput() { } static void Scan() { - if (rssiHistory[scanInfo.i] != RSSI_MAX_VALUE) { - SetF(scanInfo.f); - Measure(); - UpdateScanInfo(); + if (blacklist[scanInfo.i]) { + return; } + SetF(scanInfo.f); + Measure(); + UpdateScanInfo(); } static void NextScanStep() { @@ -1080,6 +1207,8 @@ static void UpdateScan() { return; } + MoveHistory(); + redrawScreen = true; preventKeypress = false; @@ -1106,6 +1235,9 @@ static void UpdateStill() { static void UpdateListening() { preventKeypress = false; + if (!isListening) { + ToggleRX(true); + } if (currentState == STILL) { listenT = 0; } @@ -1118,7 +1250,7 @@ static void UpdateListening() { if (currentState == SPECTRUM) { BK4819_WriteRegister(0x43, GetBWRegValueForScan()); Measure(); - BK4819_WriteRegister(0x43, listenBWRegValues[settings.listenBw]); + BK4819_WriteRegister(0x43, GetBWRegValueForListen()); } else { Measure(); } @@ -1135,6 +1267,8 @@ static void UpdateListening() { newScanStart = true; } +static void UpdateTransmitting() {} + static void Tick() { if (!preventKeypress) { HandleUserInput(); @@ -1143,7 +1277,9 @@ static void Tick() { InitScan(); newScanStart = false; } - if (isListening && currentState != FREQ_INPUT) { + if (isTransmitting) { + UpdateTransmitting(); + } else if (isListening && currentState != FREQ_INPUT) { UpdateListening(); } else { if (currentState == SPECTRUM) { @@ -1152,10 +1288,14 @@ static void Tick() { UpdateStill(); } } - if (redrawStatus || ++statuslineUpdateTimer > 4096) { + if (++batteryUpdateTimer > 4096) { + batteryUpdateTimer = 0; + UpdateBatteryInfo(); + redrawStatus = true; + } + if (redrawStatus) { RenderStatus(); redrawStatus = false; - statuslineUpdateTimer = 0; } if (redrawScreen) { Render(); @@ -1163,21 +1303,35 @@ static void Tick() { } } +static void AutomaticPresetChoose(uint32_t f) { + for (int i = 0; i < ARRAY_SIZE(freqPresets); ++i) { + FreqPreset p = freqPresets[i]; + if (f >= p.fStart && f <= freqPresets[i].fEnd) { + ApplyPreset(p); + } + } +} + void APP_RunSpectrum() { + BackupRegisters(); // TX here coz it always? set to active VFO - currentFreq = initialFreq = - gEeprom.VfoInfo[gEeprom.TX_VFO].pRX->Frequency; + VFO_Info_t vfo = gEeprom.VfoInfo[gEeprom.TX_CHANNEL]; + initialFreq = vfo.pRX->Frequency; + currentFreq = initialFreq; + settings.scanStepIndex = gStepSettingToIndex[vfo.STEP_SETTING]; + settings.listenBw = vfo.CHANNEL_BANDWIDTH == BANDWIDTH_WIDE + ? BANDWIDTH_WIDE + : BANDWIDTH_NARROW; + settings.modulationType = vfo.IsAM ? MOD_AM : MOD_FM; - BackupRegisters(); + AutomaticPresetChoose(currentFreq); - isListening = true; // to turn off RX later redrawStatus = true; redrawScreen = false; // we will wait until scan done newScanStart = true; ToggleRX(true), ToggleRX(false); // hack to prevent noise when squelch off - SetModulation(settings.modulationType = MOD_FM); - BK4819_SetFilterBandwidth(settings.listenBw = BK4819_FILTER_BW_WIDE, false); + SetModulation(settings.modulationType); RelaunchScan(); diff --git a/app/spectrum.h b/app/spectrum.h index 61ac358e..739f4d09 100644 --- a/app/spectrum.h +++ b/app/spectrum.h @@ -31,6 +31,7 @@ #include "../font.h" #include "../frequencies.h" #include "../helper/battery.h" +#include "../helper/measurements.h" #include "../misc.h" #include "../radio.h" #include "../settings.h" @@ -41,17 +42,19 @@ static const uint8_t DrawingEndY = 40; -static const uint8_t U8RssiMap[] = { - 121, 115, 109, 103, 97, 91, 85, 79, 73, 63, -}; - static const uint16_t scanStepValues[] = { 1, 10, 50, 100, 250, 500, 625, 833, 1000, 1250, 2500, 10000, }; -static const uint16_t scanStepBWRegValues[] = { +static const uint8_t gStepSettingToIndex[] = { + [STEP_2_5kHz] = 4, [STEP_5_0kHz] = 5, [STEP_6_25kHz] = 6, + [STEP_10_0kHz] = 8, [STEP_12_5kHz] = 9, [STEP_25_0kHz] = 10, + [STEP_8_33kHz] = 7, +}; + +static const uint16_t scanStepBWRegValues[12] = { // RX RXw TX BW // 0b0 000 000 001 01 1000 // 1 @@ -122,17 +125,16 @@ typedef enum ScanStep { } ScanStep; typedef struct SpectrumSettings { - uint32_t frequencyChangeStep; StepsCount stepsCount; ScanStep scanStepIndex; + uint32_t frequencyChangeStep; uint16_t scanDelay; uint16_t rssiTriggerLevel; + + bool backlightState; BK4819_FilterBandwidth_t bw; BK4819_FilterBandwidth_t listenBw; - int dbMin; - int dbMax; ModulationType modulationType; - bool backlightState; } SpectrumSettings; typedef struct KeyboardState { @@ -150,7 +152,7 @@ typedef struct ScanInfo { } ScanInfo; typedef struct RegisterSpec { - char *name; + const char *name; uint8_t num; uint8_t offset; uint16_t maxValue; @@ -160,10 +162,56 @@ typedef struct RegisterSpec { typedef struct PeakInfo { uint16_t t; uint16_t rssi; - uint32_t f; uint8_t i; + uint32_t f; } PeakInfo; +typedef struct MovingAverage { + uint16_t mean[128]; + uint16_t buf[4][128]; + uint16_t min, mid, max; + uint16_t t; +} MovingAverage; + +typedef struct FreqPreset { + char name[16]; + uint32_t fStart; + uint32_t fEnd; + StepsCount stepsCountIndex; + uint8_t stepSizeIndex; + ModulationType modulationType; + BK4819_FilterBandwidth_t listenBW; +} FreqPreset; + +static const FreqPreset freqPresets[] = { + {"17m", 1806800, 1831800, STEPS_128, S_STEP_1_0kHz, MOD_USB, + BK4819_FILTER_BW_NARROWER}, + {"15m", 2100000, 2145000, STEPS_128, S_STEP_1_0kHz, MOD_USB, + BK4819_FILTER_BW_NARROWER}, + {"12m", 2489000, 2514000, STEPS_128, S_STEP_1_0kHz, MOD_USB, + BK4819_FILTER_BW_NARROWER}, + {"CB", 2697500, 2785500, STEPS_128, S_STEP_5_0kHz, MOD_FM, + BK4819_FILTER_BW_NARROW}, + {"10m", 2800000, 2970000, STEPS_128, S_STEP_1_0kHz, MOD_USB, + BK4819_FILTER_BW_NARROWER}, + {"AIR", 11800000, 13500000, STEPS_128, S_STEP_100_0kHz, MOD_AM, + BK4819_FILTER_BW_NARROW}, + {"2m", 14400000, 14600000, STEPS_128, S_STEP_25_0kHz, MOD_FM, + BK4819_FILTER_BW_NARROW}, + {"JD1", 15175000, 15400000, STEPS_128, S_STEP_25_0kHz, MOD_FM, + BK4819_FILTER_BW_NARROW}, + {"JD2", 15500000, 15600000, STEPS_64, S_STEP_25_0kHz, MOD_FM, + BK4819_FILTER_BW_NARROW}, + {"LPD", 43307500, 43477500, STEPS_128, S_STEP_25_0kHz, MOD_FM, + BK4819_FILTER_BW_WIDE}, + {"PMR", 44600625, 44620000, STEPS_16, S_STEP_12_5kHz, MOD_FM, + BK4819_FILTER_BW_NARROW}, + {"FRS/GM 462", 46256250, 46272500, STEPS_16, S_STEP_12_5kHz, MOD_FM, + BK4819_FILTER_BW_NARROW}, + {"FRS/GM 467", 46756250, 46771250, STEPS_16, S_STEP_12_5kHz, MOD_FM, + BK4819_FILTER_BW_NARROW}, +}; + void APP_RunSpectrum(void); #endif /* ifndef SPECTRUM_H */ diff --git a/board.c b/board.c index a6327263..1aea112e 100644 --- a/board.c +++ b/board.c @@ -616,24 +616,24 @@ void BOARD_EEPROM_Init(void) #endif gEeprom.ROGER = (Data[1] < 3) ? Data[1] : ROGER_MODE_OFF; gEeprom.REPEATER_TAIL_TONE_ELIMINATION = (Data[2] < 11) ? Data[2] : 0; - gEeprom.TX_VFO = (Data[3] < 2) ? Data[3] : 0; + gEeprom.TX_VFO = (Data[3] < 2) ? Data[3] : 0; // 0ED0..0ED7 EEPROM_ReadBuffer(0x0ED0, Data, 8); - gEeprom.DTMF_SIDE_TONE = (Data[0] < 2) ? Data[0] : true; + gEeprom.DTMF_SIDE_TONE = (Data[0] < 2) ? Data[0] : true; gEeprom.DTMF_SEPARATE_CODE = DTMF_ValidateCodes((char *)(Data + 1), 1) ? Data[1] : '*'; gEeprom.DTMF_GROUP_CALL_CODE = DTMF_ValidateCodes((char *)(Data + 2), 1) ? Data[2] : '#'; - gEeprom.DTMF_DECODE_RESPONSE = (Data[3] < 4) ? Data[3] : 0; - gEeprom.DTMF_auto_reset_time = (Data[4] < 61) ? Data[4] : (Data[4] >= 5) ? Data[4] : 10; - gEeprom.DTMF_PRELOAD_TIME = (Data[5] < 101) ? Data[5] * 10 : 300; - gEeprom.DTMF_FIRST_CODE_PERSIST_TIME = (Data[6] < 101) ? Data[6] * 10 : 100; - gEeprom.DTMF_HASH_CODE_PERSIST_TIME = (Data[7] < 101) ? Data[7] * 10 : 100; + gEeprom.DTMF_DECODE_RESPONSE = (Data[3] < 4) ? Data[3] : DTMF_DEC_RESPONSE_RING; + gEeprom.DTMF_auto_reset_time = (Data[4] <= DTMF_HOLD_MAX) ? Data[4] : (Data[4] >= DTMF_HOLD_MIN) ? Data[4] : DTMF_HOLD_MAX; + gEeprom.DTMF_PRELOAD_TIME = (Data[5] < 101) ? Data[5] * 10 : 200; + gEeprom.DTMF_FIRST_CODE_PERSIST_TIME = (Data[6] < 101) ? Data[6] * 10 : 70; + gEeprom.DTMF_HASH_CODE_PERSIST_TIME = (Data[7] < 101) ? Data[7] * 10 : 70; // 0ED8..0EDF EEPROM_ReadBuffer(0x0ED8, Data, 8); - gEeprom.DTMF_CODE_PERSIST_TIME = (Data[0] < 101) ? Data[0] * 10 : 100; - gEeprom.DTMF_CODE_INTERVAL_TIME = (Data[1] < 101) ? Data[1] * 10 : 100; - gEeprom.PERMIT_REMOTE_KILL = (Data[2] < 2) ? Data[2] : true; + gEeprom.DTMF_CODE_PERSIST_TIME = (Data[0] < 101) ? Data[0] * 10 : 70; + gEeprom.DTMF_CODE_INTERVAL_TIME = (Data[1] < 101) ? Data[1] * 10 : 70; + gEeprom.PERMIT_REMOTE_KILL = (Data[2] < 2) ? Data[2] : false; // 0EE0..0EE7 EEPROM_ReadBuffer(0x0EE0, Data, 8); diff --git a/driver/bk4819.c b/driver/bk4819.c index 0d921d73..4bd06226 100644 --- a/driver/bk4819.c +++ b/driver/bk4819.c @@ -1478,33 +1478,78 @@ uint8_t BK4819_GetAfTxRx(void) bool BK4819_GetFrequencyScanResult(uint32_t *pFrequency) { - const uint16_t High = BK4819_ReadRegister(BK4819_REG_0D); - const bool Finished = (High & 0x8000) == 0; - if (Finished) - { - const uint16_t Low = BK4819_ReadRegister(BK4819_REG_0E); - *pFrequency = (uint32_t)((High & 0x7FF) << 16) | Low; - } - return Finished; + // ********** + // REG_0D read only + // + // <15> frequency scan indicator + // 1 = busy + // 0 = finished + // + // <14:11> ??? + // + // <10:0> frequency scan high 16 bits + // + // ********** + // REG_0E read only + // + // <15:0> frequency scan low 16 bits + // + // ********** + // (REG_0D <10:0> << 16) | (REG_0E <15:0>) .. unit is 10Hz + // + const uint16_t high = BK4819_ReadRegister(BK4819_REG_0D); + const uint16_t low = BK4819_ReadRegister(BK4819_REG_0E); + const bool finished = ((high >> 15) & 1u) == 0; + *pFrequency = ((uint32_t)(high & 0x07FF) << 16) | low; + return finished; } BK4819_CssScanResult_t BK4819_GetCxCSSScanResult(uint32_t *pCdcssFreq, uint16_t *pCtcssFreq) { - uint16_t Low; - uint16_t High = BK4819_ReadRegister(BK4819_REG_69); + // ********** + // REG_68 read only + // + // <15> CTCSS scan indicator + // 1 = busy + // 0 = found + // + // <12:0> CTCSS frequency (Hz) + // div by 20.64888 ... 13M / 26M XTAL + // div by 20.97152 ... 12.8M / 19.2M / 25.6M / 38.4M XTAL + // + // ********** + // REG_69 read only + // + // <15> CDCSS scan indicator + // 1 = busy + // 0 = found + // + // <14> 23 or 24 bit CDCSS Indicator (BK4819v3) + // 1 = 24 bit + // 0 = 23 bit + // + // <11:0> CDCSS High 12 bits + // + // ********** + // REG_6A read only + // + // <11:0> CDCSS Low 12 bits + // + // + const uint16_t High = BK4819_ReadRegister(BK4819_REG_69); + uint16_t Low; - if ((High & 0x8000) == 0) - { + if (((High >> 15) & 1u) == 0) + { // CDCSS Low = BK4819_ReadRegister(BK4819_REG_6A); - *pCdcssFreq = ((High & 0xFFF) << 12) | (Low & 0xFFF); + *pCdcssFreq = ((uint32_t)(High & 0xFFF) << 12) | (Low & 0xFFF); return BK4819_CSS_RESULT_CDCSS; } Low = BK4819_ReadRegister(BK4819_REG_68); - - if ((Low & 0x8000) == 0) - { - *pCtcssFreq = ((Low & 0x1FFF) * 4843) / 10000; + if (((Low >> 15) & 1u) == 0) + { // CTCSS + *pCtcssFreq = ((uint32_t)(Low & 0x1FFF) * 4843) / 10000; return BK4819_CSS_RESULT_CTCSS; } @@ -1513,12 +1558,46 @@ BK4819_CssScanResult_t BK4819_GetCxCSSScanResult(uint32_t *pCdcssFreq, uint16_t void BK4819_DisableFrequencyScan(void) { - BK4819_WriteRegister(BK4819_REG_32, 0x0244); + // REG_32 + // + // <15:14> 0 frequency scan time + // 0 = 0.2 sec + // 1 = 0.4 sec + // 2 = 0.8 sec + // 3 = 1.6 sec + // + // <13:1> ??? + // + // <0> 0 frequency scan enable + // 1 = enable + // 0 = disable + // + BK4819_WriteRegister(BK4819_REG_32, // 0x0244); // 00 0000100100010 0 + ( 0u << 14) | // 0 frequency scan Time + (290u << 1) | // ??? + ( 0u << 0)); // 0 frequency scan enable } void BK4819_EnableFrequencyScan(void) { - BK4819_WriteRegister(BK4819_REG_32, 0x0245); // 00 0000100100010 1 + // REG_32 + // + // <15:14> 0 frequency scan time + // 0 = 0.2 sec + // 1 = 0.4 sec + // 2 = 0.8 sec + // 3 = 1.6 sec + // + // <13:1> ??? + // + // <0> 0 frequency scan enable + // 1 = enable + // 0 = disable + // + BK4819_WriteRegister(BK4819_REG_32, // 0x0245); // 00 0000100100010 1 + ( 0u << 14) | // 0 frequency scan time + (290u << 1) | // ??? + ( 1u << 0)); // 1 frequency scan enable } void BK4819_SetScanFrequency(uint32_t Frequency) @@ -1532,7 +1611,7 @@ void BK4819_SetScanFrequency(uint32_t Frequency) // 0 = Disable // // <14> 0 - // 1 = GPIO0Input for CDCSS + // 1 = GPIO-0 input for CDCSS // 0 = Normal Mode (for BK4819 v3) // // <13> 0 @@ -1547,8 +1626,8 @@ void BK4819_SetScanFrequency(uint32_t Frequency) // 1 = 24bit // 0 = 23bit // - // <10> 0 1050HzDetectionMode - // 1 = 1050/4 Detect Enable, CTC1 should be set to 1050/4 Hz + // <10> 0 1050Hz detection mode + // 1 = 1050/4 detect enable, CTC1 should be set to 1050/4 Hz // // <9> 0 Auto CDCSS Bw Mode // 1 = Disable diff --git a/driver/keyboard.c b/driver/keyboard.c index 0003a81f..62882dfa 100644 --- a/driver/keyboard.c +++ b/driver/keyboard.c @@ -104,6 +104,8 @@ KEY_Code_t KEYBOARD_Poll(void) for (unsigned int j = 0; j < ARRAY_SIZE(keyboard); j++) { uint16_t reg; + unsigned int i; + unsigned int k; // Set all high GPIOA->DATA |= 1u << GPIOA_PIN_KEYBOARD_4 | @@ -114,11 +116,22 @@ KEY_Code_t KEYBOARD_Poll(void) // Clear the pin we are selecting GPIOA->DATA &= keyboard[j].set_to_zero_mask; - // Wait for the pins to stabilize - SYSTICK_DelayUs(1); + // Read all 4 GPIO pins at once .. with de-noise, max of 8 sample loops + for (i = 0, k = 0, reg = 0; i < 3 && k < 8; i++, k++) + { + uint16_t reg2; + + SYSTICK_DelayUs(1); - // Read all 4 GPIO pins at once - reg = GPIOA->DATA; + reg2 = GPIOA->DATA; + if (reg != reg2) + { // noise + reg = reg2; + i = 0; + } + } + if (i < 3) + break; // noise is too bad for (unsigned int i = 0; i < ARRAY_SIZE(keyboard[j].pins); i++) { diff --git a/driver/systick.c b/driver/systick.c index 9b1cddc4..5971d74f 100644 --- a/driver/systick.c +++ b/driver/systick.c @@ -29,26 +29,17 @@ void SYSTICK_Init(void) void SYSTICK_DelayUs(uint32_t Delay) { - uint32_t i; - uint32_t Start; - uint32_t Previous; - uint32_t Current; - uint32_t Delta; - - i = 0; - Start = SysTick->LOAD; - Previous = SysTick->VAL; + const uint32_t ticks = Delay * gTickMultiplier; + uint32_t i = 0; + uint32_t Start = SysTick->LOAD; + uint32_t Previous = SysTick->VAL; do { - do { - Current = SysTick->VAL; - } while (Current == Previous); - if (Current < Previous) { - Delta = -Current; - } else { - Delta = Start - Current; - } - i += Delta + Previous; + uint32_t Current; + uint32_t Delta; + while ((Current = SysTick->VAL) == Previous) {} + Delta = (Current < Previous) ? -Current : Start - Current; + i += Delta + Previous; Previous = Current; - } while (i < Delay * gTickMultiplier); + } while (i < ticks); } diff --git a/firmware.bin b/firmware.bin index 607fe740e5ef1c663c2a26e681ab7c745273bbdf..1be8eb0327c6112b11937fd1e36652e9a1ce5a9f 100644 GIT binary patch delta 24154 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%0Ax>Rv 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 qeFC`(}-3`(W(k;>g(v6ffh~yc*z0Y;d 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 delta 46742 zcmYg%1y_{O+BV%vN(>zmf}~1!cXu~ZLx+G5B_TaScc;M6B@87gAxI0-k|N#k4d=XP zt?wV)Ysa;(+Rf#t4@IbnBFObgqDv^+j13^ub#Y?g|KKk8mfc-2E}lp;WK(VGRhYSlnGM@<>;#6 z17Hxvhm0aM16{?v#Zu5xz>-Z*+iTdst42Yot80MZ z6QH0JBsCNh&Z45=)ItMa@S>?vNIr+wzvxBD!-e{g7NW_rX$3>6$Rf~kvka4pq?0-3bN1}mD2&cF(c3Jw3=6rcIbo>OgEZq<7=2lG9KDd3*Q`nEP}?)JVO|baZEb8rVL=%eS?S z23~Ol2?`r&7XB3V!=s1aXKxzeB;IAd-Skq;eXJd}Q9#W}+!h3!z5Y2nnt(4ff6j-L zD4d9wfU2GDI$mik1r~v+4Bnq@R2{x60=HfDcKy)c!rD(YYmy#)RVaeR*`p^}p`{=N zG^fMjd7_y-7=EYp ziAJ8dWT_g1xYPP~K^>3xZ2DT(Uk0T_9;iNwE6DZ+J6zx8KMio$yMORHN<9;oHalie zZp5e&HIj+6qfhYo^ZGmak&HyZ^0&Pgo}BMK{)8gaEhnFfOnd_y^tYhaz_$#yKuk7b zKSFhDl(m&y;5-lY3Jc8frMP$-$vx5bSS0QYnG2f$XX%6TLRQZTLk-4-bD+eMq(@P{ zic5_|E{7{fMYBKizG|FufxP)T7?30xx*Y_)&z4QSSmFUuiRqL(49fr*U(^(UV@oO? z;^M6z*v%yB>4dV7!b<_Ii~bt{i^*?QXPWBPy{mZi%r}KAei9>#6*Tgt4^<&58X}&j zsGPs!2Ay@LCQQUD7|E6eUA$aeK9S&j;H(bC&^|QUPzjt=njIB@F4C$9Amsu4y66?9 zX-@J>vCDPhCx53wa{fU3k4{Ove2#}dVV}dX?0Pwc)f05gas=c@kF2$#jpO8V-LA=F zX4i*LRe}X2a*R;za5@|^dD1?{)U}PB((!ej@%#bnOnt`q-vIKj28cAM4CwdpgzLRB zRrO~xf5LbMxddbrwag_+5^vW$2b9$^zN0s5QHlL3*9UaIwi2Xfl(#sX1dm%|GOxKd z9@=g1?ZMy?<(@)s7js!O`i$Lqnx9vn<#dDo-Ay?r;Z&|#bXjfxK9?~|m?GFVntS8u zixY4gyl6j9pOe~?BLx%?%|}hCMCRv!pQ~j5QsRggD1O34FEbPgE5)q6kp>^48<#p6YC_uUNbO1v_SD1*gqFEuFGvaGkW}tx1yN zch<`Rc(PeWVKNqyxdNJ&>Na`g3QXN|v~`b~w+HZ&DWnTc|MtHDA`vT~yy#Y$uKegvua3eA;c&SNBs*mMgPZRou87D`iwx#BHJ)~bI3RJLt) z=Xwpt?Y*$&OvAue(MBiF1mGEjgDIW(@5r_FQrJJ4gZ#|%A;|#yZcPZ=^lN|CmZf$8 z`y2wxIIy+}UvU>$dt#l&B&Cya;b~dpT1|W0VxLlUjH2s_kuY< zZNb2Xtz7%dF+-|?YQ`_LMzn5#LW_E&Snxjsypa1jEL!^E#jRL>x*COf4zo;ugw%6Q z=gy}A3e>DG)=n-WPeM?Pa1*bSSV3_=Pa12LoaZ-h3XSFlb$|?gt1fFDD)YSPQ;E;r z-S+y;*8ei?Jq@#DW6K(T#PG{-5b)FazUka3ra5Lv?5$Hh#uM8D*4M@(Y<8D=%?HxU z*Br3KEC33$D0DpIuaE+b>XBbRw3K=tZyZ0;db=+dzP32M&s|b(G!0H?4=uHJ9eVie zjI!m0O8T+1yM4yHUbkbISI(aCoCqQjBU&O-uJE-D7FGrxQv9+2Zg`lW%%XW;t&^Ue ztDm|<__dvk81H8WF#3JC+QKWTe$f&vYi_n&9IViSWOflK{9viJ�!rV&V&lwMd&o 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

rnES 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 F{{wKSzrX+h diff --git a/frequencies.c b/frequencies.c index 6cfb2703..d0cd0c1f 100644 --- a/frequencies.c +++ b/frequencies.c @@ -101,23 +101,27 @@ uint8_t FREQUENCY_CalculateOutputPower(uint8_t TxpLow, uint8_t TxpMid, uint8_t T uint32_t FREQUENCY_FloorToStep(uint32_t Upper, uint32_t Step, uint32_t Lower) { - uint32_t Index; - - if (Step == 833) - { - const uint32_t Delta = Upper - Lower; - uint32_t Base = (Delta / 2500) * 2500; - const uint32_t Index = ((Delta - Base) % 2500) / 833; - - if (Index == 2) - Base++; - - return Lower + Base + (Index * 833); - } - - Index = (Upper - Lower) / Step; - - return Lower + (Step * Index); + #if 1 + uint32_t Index; + + if (Step == 833) + { + const uint32_t Delta = Upper - Lower; + uint32_t Base = (Delta / 2500) * 2500; + const uint32_t Index = ((Delta - Base) % 2500) / 833; + + if (Index == 2) + Base++; + + return Lower + Base + (Index * 833); + } + + Index = (Upper - Lower) / Step; + + return Lower + (Step * Index); + #else + return Lower + (((Upper - Lower) / Step) * Step); + #endif } int TX_freq_check(const uint32_t Frequency) diff --git a/functions.c b/functions.c index cd02ab1d..49d8cff9 100644 --- a/functions.c +++ b/functions.c @@ -116,8 +116,12 @@ void FUNCTION_Select(FUNCTION_Type_t Function) gFM_RestoreCountdown_10ms = fm_restore_countdown_10ms; #endif - if (gDTMF_CallState == DTMF_CALL_STATE_CALL_OUT || gDTMF_CallState == DTMF_CALL_STATE_RECEIVED) - gDTMF_auto_reset_time_500ms = 1 + (gEeprom.DTMF_auto_reset_time * 2); + if (gDTMF_CallState == DTMF_CALL_STATE_CALL_OUT || + gDTMF_CallState == DTMF_CALL_STATE_RECEIVED || + gDTMF_CallState == DTMF_CALL_STATE_RECEIVED_STAY) + { + gDTMF_auto_reset_time_500ms = gEeprom.DTMF_auto_reset_time * 2; + } gUpdateStatus = true; return; diff --git a/misc.c b/misc.c index 6a2a1218..5e2dbd93 100644 --- a/misc.c +++ b/misc.c @@ -38,7 +38,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 uint8_t scan_delay_10ms = 210 / 10; // 210ms +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 const uint16_t dual_watch_count_after_rx_10ms = 1000 / 10; // 1 sec after RX ends ? @@ -224,7 +224,7 @@ bool gKeyBeingHeld; bool gPttIsPressed; uint8_t gPttDebounceCounter; uint8_t gMenuListCount; -uint8_t gBackupCROSS_BAND_RX_TX; +uint8_t gBackup_CROSS_BAND_RX_TX; uint8_t gScanDelay_10ms; #ifdef ENABLE_AIRCOPY uint8_t gAircopySendCountdown; diff --git a/misc.h b/misc.h index 500c4540..4b87ce62 100644 --- a/misc.h +++ b/misc.h @@ -113,7 +113,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 uint8_t scan_delay_10ms; +extern const uint8_t scan_freq_css_delay_10ms; extern const uint16_t battery_save_count_10ms; @@ -296,7 +296,7 @@ extern bool gKeyBeingHeld; extern bool gPttIsPressed; extern uint8_t gPttDebounceCounter; extern uint8_t gMenuListCount; -extern uint8_t gBackupCROSS_BAND_RX_TX; +extern uint8_t gBackup_CROSS_BAND_RX_TX; extern uint8_t gScanDelay_10ms; #ifdef ENABLE_AIRCOPY extern uint8_t gAircopySendCountdown; diff --git a/radio.c b/radio.c index 6ec74e80..745132d4 100644 --- a/radio.c +++ b/radio.c @@ -1093,8 +1093,7 @@ void RADIO_SendEndOfTransmission(void) BK4819_PlaySingleTone(2475, 250, 28, gEeprom.DTMF_SIDE_TONE); if (gDTMF_CallState == DTMF_CALL_STATE_NONE && - (gCurrentVfo->DTMF_PTT_ID_TX_MODE == PTT_ID_TX_DOWN || - gCurrentVfo->DTMF_PTT_ID_TX_MODE == PTT_ID_BOTH)) + (gCurrentVfo->DTMF_PTT_ID_TX_MODE == PTT_ID_TX_DOWN || gCurrentVfo->DTMF_PTT_ID_TX_MODE == PTT_ID_BOTH)) { // end-of-tx if (gEeprom.DTMF_SIDE_TONE) { diff --git a/scheduler.c b/scheduler.c index d056fa27..56e5a575 100644 --- a/scheduler.c +++ b/scheduler.c @@ -53,7 +53,8 @@ void SystickHandler(void) gNextTimeslice = true; if ((gGlobalSysTickCounter % 50) == 0) - { + { // 500ms tick + gNextTimeslice_500ms = true; DECREMENT_AND_TRIGGER(gTxTimerCountdown_500ms, gTxTimeoutReached); diff --git a/ui/inputbox.c b/ui/inputbox.c index cd6742cc..e352cce7 100644 --- a/ui/inputbox.c +++ b/ui/inputbox.c @@ -31,6 +31,5 @@ void INPUTBOX_Append(const KEY_Code_t Digit) if (Digit >= KEY_0 && Digit != KEY_INVALID) gInputBox[gInputBoxIndex++] = (char)(Digit - KEY_0); -// gInputBox[gInputBoxIndex++] = Digit; } diff --git a/ui/main.c b/ui/main.c index 35e74a7c..64b5a3d9 100644 --- a/ui/main.c +++ b/ui/main.c @@ -377,7 +377,7 @@ void UI_DisplayMain(void) if (gDTMF_CallState == DTMF_CALL_STATE_CALL_OUT) strcpy(String, (gDTMF_State == DTMF_STATE_CALL_OUT_RSP) ? "CALL OUT(RSP)" : "CALL OUT"); else - if (gDTMF_CallState == DTMF_CALL_STATE_RECEIVED) + if (gDTMF_CallState == DTMF_CALL_STATE_RECEIVED || gDTMF_CallState == DTMF_CALL_STATE_RECEIVED_STAY) sprintf(String, "CALL FRM:%s", (DTMF_FindContact(gDTMF_Caller, Contact)) ? Contact : gDTMF_Caller); else if (gDTMF_IsTx) @@ -396,7 +396,7 @@ void UI_DisplayMain(void) if (gDTMF_CallState == DTMF_CALL_STATE_CALL_OUT) sprintf(String, ">%s", (DTMF_FindContact(gDTMF_String, Contact)) ? Contact : gDTMF_String); else - if (gDTMF_CallState == DTMF_CALL_STATE_RECEIVED) + if (gDTMF_CallState == DTMF_CALL_STATE_RECEIVED || gDTMF_CallState == DTMF_CALL_STATE_RECEIVED_STAY) sprintf(String, ">%s", (DTMF_FindContact(gDTMF_Callee, Contact)) ? Contact : gDTMF_Callee); else if (gDTMF_IsTx) @@ -735,8 +735,7 @@ void UI_DisplayMain(void) #if defined(ENABLE_AM_FIX) && defined(ENABLE_AM_FIX_SHOW_DATA) if (rx && gEeprom.VfoInfo[gEeprom.RX_VFO].AM_mode && gSetting_AM_fix) { - if (gScreenToDisplay != DISPLAY_MAIN || - gDTMF_CallState != DTMF_CALL_STATE_NONE) + if (gScreenToDisplay != DISPLAY_MAIN || gDTMF_CallState != DTMF_CALL_STATE_NONE) return; center_line = CENTER_LINE_AM_FIX_DATA; @@ -763,8 +762,7 @@ void UI_DisplayMain(void) const unsigned int len = strlen(gDTMF_RX_live); const unsigned int idx = (len > (17 - 5)) ? len - (17 - 5) : 0; // limit to last 'n' chars - if (gScreenToDisplay != DISPLAY_MAIN || - gDTMF_CallState != DTMF_CALL_STATE_NONE) + if (gScreenToDisplay != DISPLAY_MAIN || gDTMF_CallState != DTMF_CALL_STATE_NONE) return; center_line = CENTER_LINE_DTMF_DEC; @@ -779,8 +777,7 @@ void UI_DisplayMain(void) const unsigned int len = gDTMF_RX_index; const unsigned int idx = (len > (17 - 5)) ? len - (17 - 5) : 0; // limit to last 'n' chars - if (gScreenToDisplay != DISPLAY_MAIN || - gDTMF_CallState != DTMF_CALL_STATE_NONE) + if (gScreenToDisplay != DISPLAY_MAIN || gDTMF_CallState != DTMF_CALL_STATE_NONE) return; center_line = CENTER_LINE_DTMF_DEC; @@ -795,8 +792,7 @@ void UI_DisplayMain(void) else if (gChargingWithTypeC) { // charging .. show the battery state - if (gScreenToDisplay != DISPLAY_MAIN || - gDTMF_CallState != DTMF_CALL_STATE_NONE) + if (gScreenToDisplay != DISPLAY_MAIN || gDTMF_CallState != DTMF_CALL_STATE_NONE) return; center_line = CENTER_LINE_CHARGE_DATA; diff --git a/ui/menu.c b/ui/menu.c index 3a5f9a6a..706acf85 100644 --- a/ui/menu.c +++ b/ui/menu.c @@ -816,7 +816,30 @@ void UI_DisplayMenu(void) break; case MENU_D_HOLD: - sprintf(String, "%ds", gSubMenuSelection); + // only allow 5, 10, 20, 30, 40, 50 or "STAY ON SCREEN" (60) + switch (gSubMenuSelection) + { + case 4: gSubMenuSelection = 60; break; + case 6: gSubMenuSelection = 10; break; + case 9: gSubMenuSelection = 5; break; + case 11: gSubMenuSelection = 20; break; + case 19: gSubMenuSelection = 10; break; + case 21: gSubMenuSelection = 30; break; + case 29: gSubMenuSelection = 20; break; + case 31: gSubMenuSelection = 40; break; + case 39: gSubMenuSelection = 30; break; + case 41: gSubMenuSelection = 50; break; + case 49: gSubMenuSelection = 40; break; + case 51: gSubMenuSelection = 60; break; + case 59: gSubMenuSelection = 50; break; + case 61: gSubMenuSelection = 5; break; + } + + if (gSubMenuSelection < DTMF_HOLD_MAX) + sprintf(String, "%d sec", gSubMenuSelection); + else + strcpy(String, "STAY ON\nSCREEN"); // 60 + break; case MENU_D_PRE: diff --git a/ui/scanner.c b/ui/scanner.c index 74a5e98d..bca399b4 100644 --- a/ui/scanner.c +++ b/ui/scanner.c @@ -70,7 +70,6 @@ void UI_DisplayScanner(void) else if (gScanCssState == SCAN_CSS_STATE_FOUND) { -// strcpy(String, "SCAN COMPLETE"); strcpy(String, "* repeat M save"); text_centered = true; }