diff --git a/app/action.c b/app/action.c index 2a957f6..5bb30b5 100644 --- a/app/action.c +++ b/app/action.c @@ -85,16 +85,16 @@ static void ACTION_Monitor(void) if (gScanState != SCAN_OFF) { - ScanPauseDelayIn10msec = 500; // 5 seconds - gScheduleScanListen = false; - gScanPauseMode = true; + ScanPauseDelayIn_10ms = 500; // 5 seconds + gScheduleScanListen = false; + gScanPauseMode = true; } #ifdef ENABLE_NOAA if (gEeprom.DUAL_WATCH == DUAL_WATCH_OFF && gIsNoaaMode) { - gNOAA_Countdown = 500; - gScheduleNOAA = false; + gNOAA_Countdown_10ms = 500; // 5 sec + gScheduleNOAA = false; } #endif diff --git a/app/app.c b/app/app.c index 4a6e8fc..97eef6b 100644 --- a/app/app.c +++ b/app/app.c @@ -16,7 +16,6 @@ #include -#include "scheduler.h" #include "app/action.h" #ifdef ENABLE_AIRCOPY #include "app/aircopy.h" @@ -73,9 +72,9 @@ static void APP_CheckForIncoming(void) { if (gCssScanMode != CSS_SCAN_MODE_OFF && gRxReceptionMode == RX_MODE_NONE) { - ScanPauseDelayIn10msec = 100; // 1 second - gScheduleScanListen = false; - gRxReceptionMode = RX_MODE_DETECTED; + ScanPauseDelayIn_10ms = 100; // 1 second + gScheduleScanListen = false; + gRxReceptionMode = RX_MODE_DETECTED; } if (gEeprom.DUAL_WATCH == DUAL_WATCH_OFF) @@ -83,8 +82,8 @@ static void APP_CheckForIncoming(void) #ifdef ENABLE_NOAA if (gIsNoaaMode) { - gNOAA_Countdown = 20; - gScheduleNOAA = false; + gNOAA_Countdown_10ms = 20; // 200ms + gScheduleNOAA = false; } #endif @@ -98,8 +97,12 @@ static void APP_CheckForIncoming(void) return; } - gDualWatchCountdown = dual_watch_count_after_rx_10ms; - gScheduleDualWatch = false; + gDualWatchCountdown_10ms = dual_watch_count_after_rx_10ms; + gDualWatchCountdownExpired = false; + + // let the user see DW is not active + gDualWatchActive = false; + gUpdateStatus = true; } else { @@ -109,8 +112,8 @@ static void APP_CheckForIncoming(void) return; } - ScanPauseDelayIn10msec = 20; // 200ms - gScheduleScanListen = false; + ScanPauseDelayIn_10ms = 20; // 200ms + gScheduleScanListen = false; } gRxReceptionMode = RX_MODE_DETECTED; @@ -132,10 +135,10 @@ static void APP_HandleIncoming(void) bFlag = (gScanState == SCAN_OFF && gCurrentCodeType == CODE_TYPE_OFF); #ifdef ENABLE_NOAA - if (IS_NOAA_CHANNEL(gRxVfo->CHANNEL_SAVE) && gSystickCountdown2) + if (IS_NOAA_CHANNEL(gRxVfo->CHANNEL_SAVE) && gNOAACountdown_10ms > 0) { - bFlag = true; - gSystickCountdown2 = 0; + gNOAACountdown_10ms = 0; + bFlag = true; } #endif @@ -163,9 +166,15 @@ static void APP_HandleIncoming(void) { if (gRxReceptionMode == RX_MODE_DETECTED) { - gDualWatchCountdown = dual_watch_count_after_1_10ms; - gScheduleDualWatch = false; - gRxReceptionMode = RX_MODE_LISTENING; + gDualWatchCountdown_10ms = dual_watch_count_after_1_10ms; + gDualWatchCountdownExpired = false; + + gRxReceptionMode = RX_MODE_LISTENING; + + // let the user see DW is not active + gDualWatchActive = false; + gUpdateStatus = true; + return; } } @@ -183,7 +192,7 @@ static void APP_HandleReceive(void) uint8_t Mode = END_OF_RX_MODE_SKIP; - if (gFlagTteComplete) + if (gFlagTailNoteEliminationComplete) { Mode = END_OF_RX_MODE_END; goto Skip; @@ -205,7 +214,7 @@ static void APP_HandleReceive(void) break; case CODE_TYPE_CONTINUOUS_TONE: - if (gFoundCTCSS && gFoundCTCSSCountdown == 0) + if (gFoundCTCSS && gFoundCTCSSCountdown_10ms == 0) { gFoundCTCSS = false; gFoundCDCSS = false; @@ -216,7 +225,7 @@ static void APP_HandleReceive(void) case CODE_TYPE_DIGITAL: case CODE_TYPE_REVERSE_DIGITAL: - if (gFoundCDCSS && gFoundCDCSSCountdown == 0) + if (gFoundCDCSS && gFoundCDCSSCountdown_10ms == 0) { gFoundCTCSS = false; gFoundCDCSS = false; @@ -255,8 +264,8 @@ static void APP_HandleReceive(void) else if (!gFoundCTCSS) { - gFoundCTCSS = true; - gFoundCTCSSCountdown = 100; + gFoundCTCSS = true; + gFoundCTCSSCountdown_10ms = 100; // 1 sec } if (g_CxCSS_TAIL_Found) @@ -275,8 +284,8 @@ static void APP_HandleReceive(void) else if (!gFoundCDCSS) { - gFoundCDCSS = true; - gFoundCDCSSCountdown = 100; + gFoundCDCSS = true; + gFoundCDCSSCountdown_10ms = 100; // 1 sec } if (g_CxCSS_TAIL_Found) @@ -315,7 +324,7 @@ Skip: #ifdef ENABLE_NOAA if (IS_NOAA_CHANNEL(gRxVfo->CHANNEL_SAVE)) - gSystickCountdown2 = 300; + gNOAACountdown_10ms = 300; // 3 sec #endif gUpdateDisplay = true; @@ -328,8 +337,8 @@ Skip: break; case SCAN_RESUME_CO: - ScanPauseDelayIn10msec = 360; - gScheduleScanListen = false; + ScanPauseDelayIn_10ms = 360; + gScheduleScanListen = false; break; case SCAN_RESUME_SE: @@ -345,10 +354,10 @@ Skip: { GPIO_ClearBit(&GPIOC->DATA, GPIOC_PIN_AUDIO_PATH); - gTailNoteEliminationCountdown = 20; - gFlagTteComplete = false; - gEnableSpeaker = false; - gEndOfRxDetectedMaybe = true; + gTailNoteEliminationCountdown_10ms = 20; + gFlagTailNoteEliminationComplete = false; + gEndOfRxDetectedMaybe = true; + gEnableSpeaker = false; } break; } @@ -407,16 +416,16 @@ void APP_StartListening(FUNCTION_Type_t Function) case SCAN_RESUME_TO: if (!gScanPauseMode) { - ScanPauseDelayIn10msec = 500; - gScheduleScanListen = false; - gScanPauseMode = true; + ScanPauseDelayIn_10ms = 500; + gScheduleScanListen = false; + gScanPauseMode = true; } break; case SCAN_RESUME_CO: case SCAN_RESUME_SE: - ScanPauseDelayIn10msec = 0; - gScheduleScanListen = false; + ScanPauseDelayIn_10ms = 0; + gScheduleScanListen = false; break; } @@ -430,7 +439,7 @@ void APP_StartListening(FUNCTION_Type_t Function) gRxVfo->pRX->Frequency = NoaaFrequencyTable[gNoaaChannel]; gRxVfo->pTX->Frequency = NoaaFrequencyTable[gNoaaChannel]; gEeprom.ScreenChannel[gEeprom.RX_CHANNEL] = gRxVfo->CHANNEL_SAVE; - gNOAA_Countdown = 500; + gNOAA_Countdown_10ms = 500; // 5 sec gScheduleNOAA = false; } #endif @@ -440,9 +449,14 @@ void APP_StartListening(FUNCTION_Type_t Function) if (gScanState == SCAN_OFF && gCssScanMode == CSS_SCAN_MODE_OFF && gEeprom.DUAL_WATCH != DUAL_WATCH_OFF) { - gRxVfoIsActive = true; - gDualWatchCountdown = dual_watch_count_after_2_10ms; - gScheduleDualWatch = false; + gDualWatchCountdown_10ms = dual_watch_count_after_2_10ms; + gDualWatchCountdownExpired = false; + + gRxVfoIsActive = true; + + // let the user see DW is not active + gDualWatchActive = false; + gUpdateStatus = true; } if (gRxVfo->IsAM) @@ -531,9 +545,9 @@ static void FREQ_NextChannel(void) RADIO_ConfigureSquelchAndOutputPower(gRxVfo); RADIO_SetupRegisters(true); - gUpdateDisplay = true; - ScanPauseDelayIn10msec = 10; - bScanKeepFrequency = false; + gUpdateDisplay = true; + ScanPauseDelayIn_10ms = 10; + bScanKeepFrequency = false; } static void MR_NextChannel(void) @@ -587,9 +601,9 @@ Skip: gUpdateDisplay = true; } - ScanPauseDelayIn10msec = 20; + ScanPauseDelayIn_10ms = 20; - bScanKeepFrequency = false; + bScanKeepFrequency = false; if (bEnabled) if (++gCurrentScanList >= 2) @@ -629,10 +643,16 @@ static void DUALWATCH_Alternate(void) RADIO_SetupRegisters(false); #ifdef ENABLE_NOAA - gDualWatchCountdown = gIsNoaaMode ? dual_watch_count_noaa_10ms : dual_watch_count_toggle_10ms; + gDualWatchCountdown_10ms = gIsNoaaMode ? dual_watch_count_noaa_10ms : dual_watch_count_toggle_10ms; #else - gDualWatchCountdown = dual_watch_count_toggle_10ms; + gDualWatchCountdown_10ms = dual_watch_count_toggle_10ms; #endif + + if (!gDualWatchActive) + { // let the user see DW is active + gDualWatchActive = true; + gUpdateStatus = true; + } } void APP_CheckRadioInterrupts(void) @@ -718,14 +738,18 @@ void APP_CheckRadioInterrupts(void) { if (gCurrentFunction == FUNCTION_POWER_SAVE && !gRxIdleMode) { - gBatterySave = 20; - gBatterySaveCountdownExpired = false; + gBatterySave_10ms = 20; // 200ms + gBatterySaveExpired = false; } - if (gEeprom.DUAL_WATCH != DUAL_WATCH_OFF && (gScheduleDualWatch || gDualWatchCountdown < dual_watch_count_after_vox_10ms)) + if (gEeprom.DUAL_WATCH != DUAL_WATCH_OFF && (gBatterySaveCountdownExpired || gDualWatchCountdown_10ms < dual_watch_count_after_vox_10ms)) { - gDualWatchCountdown = dual_watch_count_after_vox_10ms; - gScheduleDualWatch = false; + gDualWatchCountdown_10ms = dual_watch_count_after_vox_10ms; + gDualWatchCountdownExpired = false; + + // let the user see DW is not active + gDualWatchActive = false; + gUpdateStatus = true; } } } @@ -816,9 +840,9 @@ static void APP_HandleVox(void) if (gVOX_NoiseDetected) { if (g_VOX_Lost) - gVoxStopCountdown = 100; + gVoxStopCountdown_10ms = 100; // 1 sec else - if (gVoxStopCountdown == 0) + if (gVoxStopCountdown_10ms == 0) gVOX_NoiseDetected = false; if (gCurrentFunction == FUNCTION_TRANSMIT && !gPttIsPressed && !gVOX_NoiseDetected) @@ -943,28 +967,30 @@ void APP_Update(void) NOAA_IncreaseChannel(); RADIO_SetupRegisters(false); - gScheduleNOAA = false; - gNOAA_Countdown = 7; + gNOAA_Countdown_10ms = 7; // 70ms + gScheduleNOAA = false; } #endif + // toggle between the VFO's if dual watch is enabled if (gScreenToDisplay != DISPLAY_SCANNER && gEeprom.DUAL_WATCH != DUAL_WATCH_OFF) { #ifdef ENABLE_VOICE - if (gScheduleDualWatch && gVoiceWriteIndex == 0) + if (gDualWatchCountdownExpired && gVoiceWriteIndex == 0) #else - if (gScheduleDualWatch) + if (gDualWatchCountdownExpired) #endif { if (gScanState == SCAN_OFF && gCssScanMode == CSS_SCAN_MODE_OFF) { - #ifdef ENABLE_FMRADIO - if (!gPttIsPressed && !gFmRadioMode && gDTMF_CallState == DTMF_CALL_STATE_NONE && gCurrentFunction != FUNCTION_POWER_SAVE) - #else - if (!gPttIsPressed && gDTMF_CallState == DTMF_CALL_STATE_NONE && gCurrentFunction != FUNCTION_POWER_SAVE) - #endif + if (!gPttIsPressed && + #ifdef ENABLE_FMRADIO + !gFmRadioMode && + #endif + gDTMF_CallState == DTMF_CALL_STATE_NONE && + gCurrentFunction != FUNCTION_POWER_SAVE) { - gScheduleDualWatch = false; + gDualWatchCountdownExpired = false; DUALWATCH_Alternate(); // toggle between the two VFO's @@ -994,7 +1020,7 @@ void APP_Update(void) if (gEeprom.VOX_SWITCH) APP_HandleVox(); - if (gSchedulePowerSave) + if (gBatterySaveCountdownExpired) { #ifdef ENABLE_NOAA if ( @@ -1008,12 +1034,20 @@ void APP_Update(void) gCssScanMode != CSS_SCAN_MODE_OFF || gScreenToDisplay != DISPLAY_MAIN || gDTMF_CallState != DTMF_CALL_STATE_NONE) - gBatterySaveCountdown = battery_save_count_10ms; + { + gBatterySaveCountdown_10ms = battery_save_count_10ms; + gBatterySaveCountdownExpired = false; + } else if ((IS_NOT_NOAA_CHANNEL(gEeprom.ScreenChannel[0]) && IS_NOT_NOAA_CHANNEL(gEeprom.ScreenChannel[1])) || !gIsNoaaMode) + { FUNCTION_Select(FUNCTION_POWER_SAVE); + } else - gBatterySaveCountdown = battery_save_count_10ms; + { + gBatterySaveCountdown_10ms = battery_save_count_10ms; + gBatterySaveCountdownExpired = false; + } #else if ( #ifdef ENABLE_FMRADIO @@ -1026,18 +1060,21 @@ void APP_Update(void) gCssScanMode != CSS_SCAN_MODE_OFF || gScreenToDisplay != DISPLAY_MAIN || gDTMF_CallState != DTMF_CALL_STATE_NONE) - gBatterySaveCountdown = battery_save_count_10ms; + { + gBatterySaveCountdown_10ms = battery_save_count_10ms; + gBatterySaveCountdownExpired = false; + } else + { FUNCTION_Select(FUNCTION_POWER_SAVE); + } #endif - - gSchedulePowerSave = false; } #ifdef ENABLE_VOICE - if (gBatterySaveCountdownExpired && gCurrentFunction == FUNCTION_POWER_SAVE && gVoiceWriteIndex == 0) + if (gBatterySaveExpired && gCurrentFunction == FUNCTION_POWER_SAVE && gVoiceWriteIndex == 0) #else - if (gBatterySaveCountdownExpired && gCurrentFunction == FUNCTION_POWER_SAVE) + if (gBatterySaveExpired && gCurrentFunction == FUNCTION_POWER_SAVE) #endif { if (gRxIdleMode) @@ -1050,13 +1087,16 @@ void APP_Update(void) if (gEeprom.DUAL_WATCH != DUAL_WATCH_OFF && gScanState == SCAN_OFF && gCssScanMode == CSS_SCAN_MODE_OFF) { DUALWATCH_Alternate(); // toggle between the two VFO's + gUpdateRSSI = false; } FUNCTION_Init(); - gBatterySave = 10; - gRxIdleMode = false; + gBatterySave_10ms = 10; // 100ms + gBatterySaveExpired = false; + + gRxIdleMode = false; } else if (gEeprom.DUAL_WATCH == DUAL_WATCH_OFF || gScanState != SCAN_OFF || gCssScanMode != CSS_SCAN_MODE_OFF || gUpdateRSSI) @@ -1064,8 +1104,10 @@ void APP_Update(void) gCurrentRSSI = BK4819_GetRSSI(); UI_UpdateRSSI(gCurrentRSSI); - gBatterySave = gEeprom.BATTERY_SAVE * 10; - gRxIdleMode = true; + gBatterySave_10ms = gEeprom.BATTERY_SAVE * 10; + gBatterySaveExpired = false; + + gRxIdleMode = true; BK4819_DisableVox(); BK4819_Sleep(); @@ -1078,11 +1120,11 @@ void APP_Update(void) { DUALWATCH_Alternate(); // toggle between the two VFO's - gUpdateRSSI = true; - gBatterySave = 10; - } + gUpdateRSSI = true; - gBatterySaveCountdownExpired = false; + gBatterySave_10ms = 10; // 100ms + gBatterySaveExpired = false; + } } } @@ -1144,6 +1186,7 @@ void APP_CheckKeys(void) { // PTT pressed if (++gPttDebounceCounter >= 3) // 30ms { // start transmitting + boot_counter_10ms = 0; gPttDebounceCounter = 0; gPttIsPressed = true; APP_ProcessKey(KEY_PTT, true, false); @@ -1157,6 +1200,9 @@ void APP_CheckKeys(void) // scan the hardware keys Key = KEYBOARD_Poll(); + if (Key != KEY_INVALID) + boot_counter_10ms = 0; + if (gKeyReading0 != Key) { // new key pressed @@ -1233,8 +1279,8 @@ void APP_TimeSlice10ms(void) gFlashLightBlinkCounter++; #ifdef ENABLE_BOOT_BEEPS - if (boot_counter < 255) - if ((boot_counter % 25) == 0) + if (boot_counter_10ms > 0) + if ((boot_counter_10ms % 25) == 0) AUDIO_PlayBeep(BEEP_880HZ_40MS_OPTIONAL); #endif @@ -1783,11 +1829,11 @@ void CHANNEL_Next(bool bFlag, int8_t Direction) FREQ_NextChannel(); } - ScanPauseDelayIn10msec = 50; // 500ms - gScheduleScanListen = false; - gRxReceptionMode = RX_MODE_NONE; - gScanPauseMode = false; - bScanKeepFrequency = false; + ScanPauseDelayIn_10ms = 50; // 500ms + gScheduleScanListen = false; + gRxReceptionMode = RX_MODE_NONE; + gScanPauseMode = false; + bScanKeepFrequency = false; } static void APP_ProcessKey(KEY_Code_t Key, bool bKeyPressed, bool bKeyHeld) @@ -1797,7 +1843,7 @@ static void APP_ProcessKey(KEY_Code_t Key, bool bKeyPressed, bool bKeyHeld) if (gCurrentFunction == FUNCTION_POWER_SAVE) FUNCTION_Select(FUNCTION_FOREGROUND); - gBatterySaveCountdown = battery_save_count_10ms; + gBatterySaveCountdown_10ms = battery_save_count_10ms; if (gEeprom.AUTO_KEYPAD_LOCK) gKeyLockCountdown = 30; // 15 seconds diff --git a/app/menu.c b/app/menu.c index 7c4f89b..46a6bd3 100644 --- a/app/menu.c +++ b/app/menu.c @@ -131,8 +131,8 @@ void MENU_StartCssScan(int8_t Direction) MENU_SelectNextCode(); - ScanPauseDelayIn10msec = 50; - gScheduleScanListen = false; + ScanPauseDelayIn_10ms = 50; + gScheduleScanListen = false; } void MENU_StopCssScan(void) @@ -746,7 +746,7 @@ void MENU_SelectNextCode(void) RADIO_SetupRegisters(true); - ScanPauseDelayIn10msec = (gSelectedCodeType == CODE_TYPE_CONTINUOUS_TONE) ? 20 : 30; + ScanPauseDelayIn_10ms = (gSelectedCodeType == CODE_TYPE_CONTINUOUS_TONE) ? 20 : 30; gUpdateDisplay = true; } diff --git a/app/scanner.c b/app/scanner.c index b673e8d..b23faa8 100644 --- a/app/scanner.c +++ b/app/scanner.c @@ -36,7 +36,7 @@ uint32_t gScanFrequency; bool gScanPauseMode; SCAN_CssState_t gScanCssState; volatile bool gScheduleScanListen = true; -volatile uint16_t ScanPauseDelayIn10msec; +volatile uint16_t ScanPauseDelayIn_10ms; uint8_t gScanProgressIndicator; uint8_t gScanHitCount; bool gScanUseCssResult; diff --git a/app/scanner.h b/app/scanner.h index cb4ebe2..4caa9b3 100644 --- a/app/scanner.h +++ b/app/scanner.h @@ -46,7 +46,7 @@ extern uint32_t gScanFrequency; extern bool gScanPauseMode; extern SCAN_CssState_t gScanCssState; extern volatile bool gScheduleScanListen; -extern volatile uint16_t ScanPauseDelayIn10msec; +extern volatile uint16_t ScanPauseDelayIn_10ms; extern uint8_t gScanProgressIndicator; extern uint8_t gScanHitCount; extern bool gScanUseCssResult; diff --git a/audio.c b/audio.c index a8e7f96..8cff55f 100644 --- a/audio.c +++ b/audio.c @@ -62,7 +62,7 @@ VOICE_ID_t gVoiceID[8]; uint8_t gVoiceReadIndex; uint8_t gVoiceWriteIndex; - volatile uint16_t gCountdownToPlayNextVoice; + volatile uint16_t gCountdownToPlayNextVoice_10ms; volatile bool gFlagPlayQueuedVoice; VOICE_ID_t gAnotherVoiceID = VOICE_ID_INVALID; @@ -283,9 +283,9 @@ void AUDIO_PlayBeep(BEEP_Type_t Beep) return; } - gVoiceReadIndex = 1; - gCountdownToPlayNextVoice = Delay; - gFlagPlayQueuedVoice = false; + gVoiceReadIndex = 1; + gCountdownToPlayNextVoice_10ms = Delay; + gFlagPlayQueuedVoice = false; return; } @@ -390,9 +390,9 @@ void AUDIO_PlayBeep(BEEP_Type_t Beep) AUDIO_PlayVoice(VoiceID); - gCountdownToPlayNextVoice = Delay; - gFlagPlayQueuedVoice = false; - gVoxResumeCountdown = 2000; + gCountdownToPlayNextVoice_10ms = Delay; + gFlagPlayQueuedVoice = false; + gVoxResumeCountdown = 2000; return; } diff --git a/audio.h b/audio.h index fa3efa8..bb4027b 100644 --- a/audio.h +++ b/audio.h @@ -132,7 +132,7 @@ void AUDIO_PlayBeep(BEEP_Type_t Beep); extern VOICE_ID_t gVoiceID[8]; extern uint8_t gVoiceReadIndex; extern uint8_t gVoiceWriteIndex; - extern volatile uint16_t gCountdownToPlayNextVoice; + extern volatile uint16_t gCountdownToPlayNextVoice_10ms; extern volatile bool gFlagPlayQueuedVoice; extern VOICE_ID_t gAnotherVoiceID; diff --git a/bitmaps.c b/bitmaps.c index a22bd90..4cd5b80 100644 --- a/bitmaps.c +++ b/bitmaps.c @@ -227,7 +227,7 @@ const uint8_t BITMAP_VOX[] = }; #endif -const uint8_t BITMAP_TDR[] = +const uint8_t BITMAP_TDR1[] = { // "DW" 0b00000000, 0b01111111, @@ -244,6 +244,23 @@ const uint8_t BITMAP_TDR[] = 0b01111111 }; +const uint8_t BITMAP_TDR2[] = +{ // "--" + 0b00000000, + 0b00010000, + 0b00010000, + 0b00010000, + 0b00010000, + 0b00010000, + + 0b00010000, + 0b00010000, + 0b00010000, + 0b00010000, + 0b00010000, + 0b00010000, +}; + #ifdef ENABLE_VOICE const uint8_t BITMAP_VoicePrompt[] = { diff --git a/bitmaps.h b/bitmaps.h index 082b386..c48e8c3 100644 --- a/bitmaps.h +++ b/bitmaps.h @@ -26,7 +26,8 @@ extern const uint8_t BITMAP_VOX[18]; extern const uint8_t BITMAP_XB[12]; #endif -extern const uint8_t BITMAP_TDR[12]; +extern const uint8_t BITMAP_TDR1[12]; +extern const uint8_t BITMAP_TDR2[12]; #ifdef ENABLE_VOICE extern const uint8_t BITMAP_VoicePrompt[9]; diff --git a/firmware b/firmware index b5a7395..2309ae1 100644 Binary files a/firmware and b/firmware differ diff --git a/firmware.bin b/firmware.bin index 1e92ca4..85b85c8 100644 Binary files a/firmware.bin and b/firmware.bin differ diff --git a/firmware.packed.bin b/firmware.packed.bin index 6c26c9c..114d69e 100644 Binary files a/firmware.packed.bin and b/firmware.packed.bin differ diff --git a/functions.c b/functions.c index 32fb1d8..7bb8a79 100644 --- a/functions.c +++ b/functions.c @@ -64,22 +64,24 @@ void FUNCTION_Init(void) // gDTMF_ReceivedSaved[0] = '\0'; #endif - g_CxCSS_TAIL_Found = false; - g_CDCSS_Lost = false; - g_CTCSS_Lost = false; + g_CxCSS_TAIL_Found = false; + g_CDCSS_Lost = false; + g_CTCSS_Lost = false; + + g_VOX_Lost = false; + g_SquelchLost = false; - g_VOX_Lost = false; - g_SquelchLost = false; - gFlagTteComplete = false; + gFlagTailNoteEliminationComplete = false; + gTailNoteEliminationCountdown_10ms = 0; + gFoundCTCSS = false; + gFoundCDCSS = false; + gFoundCTCSSCountdown_10ms = 0; + gFoundCDCSSCountdown_10ms = 0; + gEndOfRxDetectedMaybe = false; - gTailNoteEliminationCountdown = 0; - gFoundCTCSS = false; - gFoundCDCSS = false; - gFoundCTCSSCountdown = 0; - gFoundCDCSSCountdown = 0; - gEndOfRxDetectedMaybe = false; - - gSystickCountdown2 = 0; + #ifdef ENABLE_NOAA + gNOAACountdown_10ms = 0; + #endif } void FUNCTION_Select(FUNCTION_Type_t Function) @@ -132,15 +134,16 @@ void FUNCTION_Select(FUNCTION_Type_t Function) break; case FUNCTION_POWER_SAVE: - gBatterySave = gEeprom.BATTERY_SAVE * 10; - gRxIdleMode = true; + gBatterySave_10ms = gEeprom.BATTERY_SAVE * 10; + gBatterySaveExpired = false; + + gRxIdleMode = true; BK4819_DisableVox(); BK4819_Sleep(); BK4819_ToggleGpioOut(BK4819_GPIO6_PIN2, false); - gBatterySaveCountdownExpired = false; - gUpdateStatus = true; + gUpdateStatus = true; GUI_SelectNextDisplay(DISPLAY_MAIN); return; @@ -195,9 +198,10 @@ void FUNCTION_Select(FUNCTION_Type_t Function) break; } - gBatterySaveCountdown = battery_save_count_10ms; - gSchedulePowerSave = false; + gBatterySaveCountdown_10ms = battery_save_count_10ms; + gBatterySaveCountdownExpired = false; + #if defined(ENABLE_FMRADIO) - gFM_RestoreCountdown = 0; + gFM_RestoreCountdown = 0; #endif } diff --git a/helper/battery.c b/helper/battery.c index fd89cd0..ebef8cc 100644 --- a/helper/battery.c +++ b/helper/battery.c @@ -31,7 +31,9 @@ bool gChargingWithTypeC; bool gLowBattery; bool gLowBatteryBlink; uint16_t gBatteryCheckCounter; -volatile uint16_t gBatterySave; + +volatile uint16_t gBatterySave_10ms; +volatile bool gBatterySaveExpired; void BATTERY_GetReadings(bool bDisplayBatteryLevel) { diff --git a/helper/battery.h b/helper/battery.h index f7f12dd..a824731 100644 --- a/helper/battery.h +++ b/helper/battery.h @@ -30,7 +30,9 @@ extern bool gChargingWithTypeC; extern bool gLowBattery; extern bool gLowBatteryBlink; extern uint16_t gBatteryCheckCounter; -extern volatile uint16_t gBatterySave; + +extern volatile uint16_t gBatterySave_10ms; +extern volatile bool gBatterySaveExpired; void BATTERY_GetReadings(bool bDisplayBatteryLevel); diff --git a/main.c b/main.c index bf9e3d3..61dd2ea 100644 --- a/main.c +++ b/main.c @@ -16,7 +16,6 @@ #include -#include "scheduler.h" #include "app/app.h" #include "app/dtmf.h" #include "audio.h" @@ -98,6 +97,10 @@ void Main(void) gMenuListCount = 0; + #ifdef ENABLE_BOOT_BEEPS + boot_counter_10ms = 250; // 2.5 sec + #endif + if (!gChargingWithTypeC && !gBatteryDisplayLevel) { FUNCTION_Select(FUNCTION_POWER_SAVE); @@ -124,14 +127,18 @@ void Main(void) if (gEeprom.POWER_ON_DISPLAY_MODE != POWER_ON_DISPLAY_MODE_NONE) { // 2.55 second boot-up screen - while (boot_counter < 255 && KEYBOARD_Poll() == KEY_INVALID) + while (boot_counter_10ms > 0) { + if (KEYBOARD_Poll() != KEY_INVALID) + { // halt boot beeps + boot_counter_10ms = 0; + break; + } #ifdef ENABLE_BOOT_BEEPS - if ((boot_counter % 25) == 0) + if ((boot_counter_10ms % 25) == 0) AUDIO_PlayBeep(BEEP_880HZ_40MS_OPTIONAL); #endif } - //boot_counter = 255; // halt boot beeps } BootMode = BOOT_GetMode(); diff --git a/misc.c b/misc.c index 28b0a10..6271925 100644 --- a/misc.c +++ b/misc.c @@ -22,38 +22,38 @@ const uint8_t fm_resume_countdown_500ms = 2500 / 500; // 2.5 second const uint8_t fm_radio_countdown_500ms = 2000 / 500; // 2 seconds const uint16_t fm_play_countdown_scan_10ms = 100 / 10; // 100ms const uint16_t fm_play_countdown_noscan_10ms = 1200 / 10; // 1.2 seconds - + const uint8_t menu_timeout_500ms = 20000 / 500; // 20 seconds - + const uint8_t DTMF_RX_timeout_500ms = 2500 / 500; // 2.5 seconds const uint8_t DTMF_RX_timeout_saved_500ms = 20000 / 500; // 20 seconds const uint8_t DTMF_decode_ring_countdown_500ms = 15000 / 500; // 15 seconds const uint8_t DTMF_txstop_countdown_500ms = 3000 / 500; // 6 seconds const uint8_t key_input_timeout_500ms = 8000 / 500; // 8 seconds - + 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 - -// 10ms count down resolution + +// 10ms count down resolution 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 ? const uint16_t dual_watch_count_after_1_10ms = 5000 / 10; // 5 sec const uint16_t dual_watch_count_after_2_10ms = 3600 / 10; // 3.6 sec -const uint16_t dual_watch_count_toggle_10ms = 100 / 10; // 100ms between VFO toggles const uint16_t dual_watch_count_noaa_10ms = 70 / 10; // 70ms const uint16_t dual_watch_count_after_vox_10ms = 200 / 10; // 200ms - +const uint16_t dual_watch_count_toggle_10ms = 100 / 10; // 100ms between VFO toggles + const uint16_t battery_save_count_10ms = 10000 / 10; // 10 seconds - + const uint16_t gMax_bat_v = 843; // 8.43V const uint16_t gMin_bat_v = 660; // 6.6V const uint32_t gDefaultAesKey[4] = {0x4AA5CC60, 0x0312CC5F, 0xFFD2DABB, 0x6BBA7F92}; - + const uint8_t gMicGain_dB2[5] = {3, 8, 16, 24, 31}; bool gSetting_350TX; @@ -81,13 +81,18 @@ uint16_t gEEPROM_1F8C; uint8_t gMR_ChannelAttributes[207]; +volatile uint16_t gBatterySaveCountdown_10ms = battery_save_count_10ms; +volatile bool gBatterySaveCountdownExpired; + +volatile uint16_t gDualWatchCountdown_10ms; +volatile bool gDualWatchCountdownExpired = true; +bool gDualWatchActive = false; + volatile bool gNextTimeslice500ms; -volatile uint16_t gBatterySaveCountdown = battery_save_count_10ms; -volatile uint16_t gDualWatchCountdown; volatile uint16_t gTxTimerCountdown; -volatile uint16_t gTailNoteEliminationCountdown; +volatile uint16_t gTailNoteEliminationCountdown_10ms; #ifdef ENABLE_NOAA - volatile uint16_t gNOAA_Countdown; + volatile uint16_t gNOAA_Countdown_10ms; #endif bool gEnableSpeaker; @@ -179,21 +184,22 @@ bool gF_LOCK; uint8_t gShowChPrefix; volatile bool gNextTimeslice; -volatile uint16_t gSystickCountdown2; -volatile uint8_t gFoundCDCSSCountdown; -volatile uint8_t gFoundCTCSSCountdown; -volatile uint16_t gVoxStopCountdown; +volatile uint8_t gFoundCDCSSCountdown_10ms; +volatile uint8_t gFoundCTCSSCountdown_10ms; +volatile uint16_t gVoxStopCountdown_10ms; volatile bool gTxTimeoutReached; volatile bool gNextTimeslice40ms; -volatile bool gSchedulePowerSave; -volatile bool gBatterySaveCountdownExpired; -volatile bool gScheduleDualWatch = true; #ifdef ENABLE_NOAA - volatile bool gScheduleNOAA = true; + volatile uint16_t gNOAACountdown_10ms = 0; + volatile bool gScheduleNOAA = true; #endif -volatile bool gFlagTteComplete; +volatile bool gFlagTailNoteEliminationComplete; #ifdef ENABLE_FMRADIO - volatile bool gScheduleFM; + volatile bool gScheduleFM; +#endif + +#ifdef ENABLE_BOOT_BEEPS + volatile uint8_t boot_counter_10ms; #endif uint16_t gCurrentRSSI; diff --git a/misc.h b/misc.h index 96ad66f..56ccbf8 100644 --- a/misc.h +++ b/misc.h @@ -139,16 +139,21 @@ extern uint16_t gEEPROM_1F8C; extern uint8_t gMR_ChannelAttributes[207]; +extern volatile uint16_t gBatterySaveCountdown_10ms; +extern volatile bool gBatterySaveCountdownExpired; + +extern volatile uint16_t gDualWatchCountdown_10ms; +extern volatile bool gDualWatchCountdownExpired; +extern bool gDualWatchActive; + extern volatile bool gNextTimeslice500ms; -extern volatile uint16_t gBatterySaveCountdown; -extern volatile uint16_t gDualWatchCountdown; extern volatile uint16_t gTxTimerCountdown; -extern volatile uint16_t gTailNoteEliminationCountdown; +extern volatile uint16_t gTailNoteEliminationCountdown_10ms; #ifdef ENABLE_FMRADIO extern volatile uint16_t gFmPlayCountdown_10ms; #endif #ifdef ENABLE_NOAA - extern volatile uint16_t gNOAA_Countdown; + extern volatile uint16_t gNOAA_Countdown_10ms; #endif extern bool gEnableSpeaker; extern uint8_t gKeyInputCountdown; @@ -235,24 +240,24 @@ extern bool gUpdateDisplay; #endif extern bool gF_LOCK; extern uint8_t gShowChPrefix; -extern volatile uint16_t gSystickCountdown2; -extern volatile uint8_t gFoundCDCSSCountdown; -extern volatile uint8_t gFoundCTCSSCountdown; -extern volatile uint16_t gVoxStopCountdown; +extern volatile uint8_t gFoundCDCSSCountdown_10ms; +extern volatile uint8_t gFoundCTCSSCountdown_10ms; +extern volatile uint16_t gVoxStopCountdown_10ms; extern volatile bool gTxTimeoutReached; extern volatile bool gNextTimeslice40ms; -extern volatile bool gSchedulePowerSave; -extern volatile bool gBatterySaveCountdownExpired; -extern volatile bool gScheduleDualWatch; #ifdef ENABLE_NOAA + extern volatile uint16_t gNOAACountdown_10ms; extern volatile bool gScheduleNOAA; #endif -extern volatile bool gFlagTteComplete; +extern volatile bool gFlagTailNoteEliminationComplete; #ifdef ENABLE_FMRADIO extern volatile bool gScheduleFM; #endif extern uint16_t gCurrentRSSI; extern uint8_t gIsLocked; +#ifdef ENABLE_BOOT_BEEPS + extern volatile uint8_t boot_counter_10ms; +#endif void NUMBER_Get(char *pDigits, uint32_t *pInteger); void NUMBER_ToDigits(uint32_t Value, char *pDigits); diff --git a/radio.c b/radio.c index 6b156f1..5d5ed66 100644 --- a/radio.c +++ b/radio.c @@ -767,10 +767,10 @@ void RADIO_SetupRegisters(bool bSwitchToFunction0) if (gRxVfo->CHANNEL_SAVE >= NOAA_CHANNEL_FIRST) { - gIsNoaaMode = true; - gNoaaChannel = gRxVfo->CHANNEL_SAVE - NOAA_CHANNEL_FIRST; - gNOAA_Countdown = 50; - gScheduleNOAA = false; + gIsNoaaMode = true; + gNoaaChannel = gRxVfo->CHANNEL_SAVE - NOAA_CHANNEL_FIRST; + gNOAA_Countdown_10ms = 50; // 500ms + gScheduleNOAA = false; } else gIsNoaaMode = false; @@ -877,15 +877,19 @@ void RADIO_PrepareTX(void) { if (gEeprom.DUAL_WATCH != DUAL_WATCH_OFF) { - gDualWatchCountdown = dual_watch_count_after_tx_10ms; - gScheduleDualWatch = false; + gDualWatchCountdown_10ms = dual_watch_count_after_tx_10ms; + gDualWatchCountdownExpired = false; if (!gRxVfoIsActive) { gEeprom.RX_CHANNEL = gEeprom.TX_CHANNEL; gRxVfo = &gEeprom.VfoInfo[gEeprom.TX_CHANNEL]; + gRxVfoIsActive = true; } - gRxVfoIsActive = true; + + // let the user see that DW is not active + gDualWatchActive = false; + gUpdateStatus = true; } RADIO_SelectCurrentVfo(); diff --git a/scheduler.c b/scheduler.c index 94a6ce7..7b7f35a 100644 --- a/scheduler.c +++ b/scheduler.c @@ -14,7 +14,6 @@ * limitations under the License. */ -#include "scheduler.h" #ifdef ENABLE_FMRADIO #include "app/fm.h" #endif @@ -29,17 +28,20 @@ #include "bsp/dp32g030/gpio.h" #include "driver/gpio.h" +#define DECREMENT(cnt) \ + do { \ + if (cnt > 0) \ + cnt--; \ + } while (0) + #define DECREMENT_AND_TRIGGER(cnt, flag) \ - do { \ - if (cnt) { \ - if (--cnt == 0) { \ - flag = true; \ - } \ - } \ - } while(0) + do { \ + if (cnt > 0) \ + if (--cnt == 0) \ + flag = true; \ + } while (0) static volatile uint32_t gGlobalSysTickCounter; -volatile uint8_t boot_counter = 0; void SystickHandler(void); @@ -59,40 +61,39 @@ void SystickHandler(void) if ((gGlobalSysTickCounter & 3) == 0) gNextTimeslice40ms = true; - if (gSystickCountdown2) - gSystickCountdown2--; + #ifdef ENABLE_NOAA + DECREMENT(gNOAACountdown_10ms); + #endif - if (gFoundCDCSSCountdown) - gFoundCDCSSCountdown--; + DECREMENT(gFoundCDCSSCountdown_10ms); - if (gFoundCTCSSCountdown) - gFoundCTCSSCountdown--; + DECREMENT(gFoundCTCSSCountdown_10ms); if (gCurrentFunction == FUNCTION_FOREGROUND) - DECREMENT_AND_TRIGGER(gBatterySaveCountdown, gSchedulePowerSave); + DECREMENT_AND_TRIGGER(gBatterySaveCountdown_10ms, gBatterySaveCountdownExpired); if (gCurrentFunction == FUNCTION_POWER_SAVE) - DECREMENT_AND_TRIGGER(gBatterySave, gBatterySaveCountdownExpired); + DECREMENT_AND_TRIGGER(gBatterySave_10ms, gBatterySaveExpired); if (gScanState == SCAN_OFF && gCssScanMode == CSS_SCAN_MODE_OFF && gEeprom.DUAL_WATCH != DUAL_WATCH_OFF) if (gCurrentFunction != FUNCTION_MONITOR && gCurrentFunction != FUNCTION_TRANSMIT && gCurrentFunction != FUNCTION_RECEIVE) - DECREMENT_AND_TRIGGER(gDualWatchCountdown, gScheduleDualWatch); + DECREMENT_AND_TRIGGER(gDualWatchCountdown_10ms, gDualWatchCountdownExpired); #ifdef ENABLE_NOAA if (gScanState == SCAN_OFF && gCssScanMode == CSS_SCAN_MODE_OFF && gEeprom.DUAL_WATCH == DUAL_WATCH_OFF) if (gIsNoaaMode && gCurrentFunction != FUNCTION_MONITOR && gCurrentFunction != FUNCTION_TRANSMIT) if (gCurrentFunction != FUNCTION_RECEIVE) - DECREMENT_AND_TRIGGER(gNOAA_Countdown, gScheduleNOAA); + DECREMENT_AND_TRIGGER(gNOAA_Countdown_10ms, gScheduleNOAA); #endif if (gScanState != SCAN_OFF || gCssScanMode == CSS_SCAN_MODE_SCANNING) if (gCurrentFunction != FUNCTION_MONITOR && gCurrentFunction != FUNCTION_TRANSMIT) - DECREMENT_AND_TRIGGER(ScanPauseDelayIn10msec, gScheduleScanListen); + DECREMENT_AND_TRIGGER(ScanPauseDelayIn_10ms, gScheduleScanListen); - DECREMENT_AND_TRIGGER(gTailNoteEliminationCountdown, gFlagTteComplete); + DECREMENT_AND_TRIGGER(gTailNoteEliminationCountdown_10ms, gFlagTailNoteEliminationComplete); #ifdef ENABLE_VOICE - DECREMENT_AND_TRIGGER(gCountdownToPlayNextVoice, gFlagPlayQueuedVoice); + DECREMENT_AND_TRIGGER(gCountdownToPlayNextVoice_10ms, gFlagPlayQueuedVoice); #endif #ifdef ENABLE_FMRADIO @@ -101,9 +102,9 @@ void SystickHandler(void) DECREMENT_AND_TRIGGER(gFmPlayCountdown_10ms, gScheduleFM); #endif - if (gVoxStopCountdown) - gVoxStopCountdown--; + DECREMENT(gVoxStopCountdown_10ms); - if (boot_counter < 255) - boot_counter++; + #ifdef ENABLE_BOOT_BEEPS + DECREMENT(boot_counter_10ms); + #endif } diff --git a/scheduler.h b/scheduler.h deleted file mode 100644 index 545c775..0000000 --- a/scheduler.h +++ /dev/null @@ -1,25 +0,0 @@ -/* Copyright 2023 Dual Tachyon - * https://github.com/DualTachyon - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -#ifndef SCHEDULER_H -#define SCHEDULER_H - -#include - -extern volatile uint8_t boot_counter; - -#endif - diff --git a/ui/main.c b/ui/main.c index 148f94d..fcc45bf 100644 --- a/ui/main.c +++ b/ui/main.c @@ -76,7 +76,7 @@ void UI_DisplayMain(void) } if (gEeprom.DUAL_WATCH != DUAL_WATCH_OFF && gRxVfoIsActive) - Channel = gEeprom.RX_CHANNEL; + Channel = gEeprom.RX_CHANNEL; // we're currently monitoring the other VFO if (Channel != vfo_num) { diff --git a/ui/status.c b/ui/status.c index a4ae278..a61b707 100644 --- a/ui/status.c +++ b/ui/status.c @@ -55,8 +55,13 @@ void UI_DisplayStatus(const bool test_display) #endif if (gEeprom.DUAL_WATCH != DUAL_WATCH_OFF || test_display) - memmove(gStatusLine + 45, BITMAP_TDR, sizeof(BITMAP_TDR)); - + { + if (gDualWatchActive) + memmove(gStatusLine + 45, BITMAP_TDR1, sizeof(BITMAP_TDR1)); + else + memmove(gStatusLine + 45, BITMAP_TDR2, sizeof(BITMAP_TDR2)); + } + if (gEeprom.CROSS_BAND_RX_TX != CROSS_BAND_OFF || test_display) memmove(gStatusLine + 58, BITMAP_XB, sizeof(BITMAP_XB));