From 7bd011b057f07675941eab0bf0d059096a9ae360 Mon Sep 17 00:00:00 2001 From: OneOfEleven Date: Sat, 16 Sep 2023 17:16:36 +0100 Subject: [PATCH] const renames + display updates --- app/app.c | 38 +++--- app/main.c | 8 +- app/menu.c | 2 +- app/scanner.c | 2 +- bitmaps.c | 294 ++------------------------------------------ bitmaps.h | 26 ---- driver/st7565.c | 4 +- firmware | Bin 164924 -> 164528 bytes firmware.bin | Bin 48652 -> 48472 bytes firmware.packed.bin | Bin 48670 -> 48490 bytes functions.c | 2 +- misc.c | 48 ++++---- misc.h | 32 ++--- radio.c | 2 +- ui/lock.c | 2 +- ui/main.c | 59 +++++---- ui/status.c | 1 + 17 files changed, 110 insertions(+), 410 deletions(-) diff --git a/app/app.c b/app/app.c index 3f4515c..104fb9c 100644 --- a/app/app.c +++ b/app/app.c @@ -98,7 +98,7 @@ static void APP_CheckForIncoming(void) return; } - gDualWatchCountdown = dual_watch_count_after_rx; + gDualWatchCountdown = dual_watch_count_after_rx_10ms; gScheduleDualWatch = false; } else @@ -163,7 +163,7 @@ static void APP_HandleIncoming(void) { if (gRxReceptionMode == RX_MODE_DETECTED) { - gDualWatchCountdown = dual_watch_count_after_1; + gDualWatchCountdown = dual_watch_count_after_1_10ms; gScheduleDualWatch = false; gRxReceptionMode = RX_MODE_LISTENING; return; @@ -442,7 +442,7 @@ void APP_StartListening(FUNCTION_Type_t Function) { gRxVfoIsActive = true; - gDualWatchCountdown = dual_watch_count_after_2; + gDualWatchCountdown = dual_watch_count_after_2_10ms; gScheduleDualWatch = false; } @@ -607,9 +607,9 @@ static void DUALWATCH_Alternate(void) RADIO_SetupRegisters(false); #ifdef ENABLE_NOAA - gDualWatchCountdown = gIsNoaaMode ? dual_watch_count_noaa : dual_watch_count_toggle; + gDualWatchCountdown = gIsNoaaMode ? dual_watch_count_noaa_10ms : dual_watch_count_toggle_10ms; #else - gDualWatchCountdown = dual_watch_count_toggle; + gDualWatchCountdown = dual_watch_count_toggle_10ms; #endif } @@ -687,9 +687,9 @@ void APP_CheckRadioInterrupts(void) gBatterySaveCountdownExpired = false; } - if (gEeprom.DUAL_WATCH != DUAL_WATCH_OFF && (gScheduleDualWatch || gDualWatchCountdown < dual_watch_count_after_vox)) + if (gEeprom.DUAL_WATCH != DUAL_WATCH_OFF && (gScheduleDualWatch || gDualWatchCountdown < dual_watch_count_after_vox_10ms)) { - gDualWatchCountdown = dual_watch_count_after_vox; + gDualWatchCountdown = dual_watch_count_after_vox_10ms; gScheduleDualWatch = false; } } @@ -975,12 +975,12 @@ void APP_Update(void) gCssScanMode != CSS_SCAN_MODE_OFF || gScreenToDisplay != DISPLAY_MAIN || gDTMF_CallState != DTMF_CALL_STATE_NONE) - gBatterySaveCountdown = battery_save_count; + gBatterySaveCountdown = battery_save_count_10ms; 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; + gBatterySaveCountdown = battery_save_count_10ms; #else if ( #ifdef ENABLE_FMRADIO @@ -993,7 +993,7 @@ void APP_Update(void) gCssScanMode != CSS_SCAN_MODE_OFF || gScreenToDisplay != DISPLAY_MAIN || gDTMF_CallState != DTMF_CALL_STATE_NONE) - gBatterySaveCountdown = battery_save_count; + gBatterySaveCountdown = battery_save_count_10ms; else FUNCTION_Select(FUNCTION_POWER_SAVE); #endif @@ -1135,7 +1135,7 @@ void APP_CheckKeys(void) return; } - if (++gDebounceCounter == key_debounce) + if (++gDebounceCounter == key_debounce_10ms) { // debounced new key pressed if (Key == KEY_INVALID) @@ -1158,7 +1158,7 @@ void APP_CheckKeys(void) // key is being held pressed - if (gDebounceCounter == key_repeat_delay) + if (gDebounceCounter == key_repeat_delay_10ms) { // initial delay after pressed if (Key == KEY_STAR || Key == KEY_F || @@ -1178,19 +1178,19 @@ void APP_CheckKeys(void) return; } - if (gDebounceCounter > key_repeat_delay) + if (gDebounceCounter > key_repeat_delay_10ms) { // key repeat if (Key == KEY_UP || Key == KEY_DOWN) { gKeyBeingHeld = true; - if ((gDebounceCounter % key_repeat) == 0) + if ((gDebounceCounter % key_repeat_10ms) == 0) APP_ProcessKey(Key, true, true); } if (gDebounceCounter < 0xFFFF) return; - gDebounceCounter = key_repeat_delay; + gDebounceCounter = key_repeat_delay_10ms; return; } } @@ -1374,7 +1374,7 @@ void APP_TimeSlice10ms(void) GUI_SelectNextDisplay(DISPLAY_SCANNER); } - gScanDelay = g_scan_delay; + gScanDelay = scan_delay_10ms; break; case SCAN_CSS_STATE_SCANNING: @@ -1420,7 +1420,7 @@ void APP_TimeSlice10ms(void) if (gScanCssState < SCAN_CSS_STATE_FOUND) { BK4819_SetScanFrequency(gScanFrequency); - gScanDelay = g_scan_delay; + gScanDelay = scan_delay_10ms; break; } @@ -1753,7 +1753,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; + gBatterySaveCountdown = battery_save_count_10ms; if (gEeprom.AUTO_KEYPAD_LOCK) gKeyLockCountdown = 30; // 15 seconds @@ -1792,7 +1792,7 @@ static void APP_ProcessKey(KEY_Code_t Key, bool bKeyPressed, bool bKeyHeld) else { if (Key != KEY_PTT) - gVoltageMenuCountdown = g_menu_timeout; + gVoltageMenuCountdown = menu_timeout_10ms; BACKLIGHT_TurnOn(); diff --git a/app/main.c b/app/main.c index 43ed84e..e6402ca 100644 --- a/app/main.c +++ b/app/main.c @@ -266,7 +266,7 @@ static void MAIN_Key_DIGITS(KEY_Code_t Key, bool bKeyPressed, bool bKeyHeld) uint8_t Vfo = gEeprom.TX_CHANNEL; - gKeyInputCountdown = key_input_timeout; + gKeyInputCountdown = key_input_timeout_500ms; INPUTBOX_Append(Key); gRequestDisplayScreen = DISPLAY_MAIN; @@ -413,7 +413,7 @@ static void MAIN_Key_EXIT(bool bKeyPressed, bool bKeyHeld) return; gInputBox[--gInputBoxIndex] = 10; - gKeyInputCountdown = key_input_timeout; + gKeyInputCountdown = key_input_timeout_500ms; #ifdef ENABLE_VOICE if (gInputBoxIndex == 0) @@ -507,7 +507,7 @@ static void MAIN_Key_STAR(bool bKeyPressed, bool bKeyHeld) if (gScanState == SCAN_OFF) #endif { - gKeyInputCountdown = key_input_timeout; + gKeyInputCountdown = key_input_timeout_500ms; gDTMF_InputMode = true; memcpy(gDTMF_InputBox, gDTMF_String, 15); gDTMF_InputIndex = 0; @@ -657,7 +657,7 @@ void MAIN_ProcessKeys(KEY_Code_t Key, bool bKeyPressed, bool bKeyHeld) { // add key to DTMF string DTMF_Append(Character); - gKeyInputCountdown = key_input_timeout; + gKeyInputCountdown = key_input_timeout_500ms; gRequestDisplayScreen = DISPLAY_MAIN; gPttWasReleased = true; gBeepToPlay = BEEP_1KHZ_60MS_OPTIONAL; diff --git a/app/menu.c b/app/menu.c index d287ec5..ee53fd3 100644 --- a/app/menu.c +++ b/app/menu.c @@ -1444,5 +1444,5 @@ void MENU_ProcessKeys(KEY_Code_t Key, bool bKeyPressed, bool bKeyHeld) } if (gScreenToDisplay == DISPLAY_MENU && gMenuCursor == MENU_VOL) - gVoltageMenuCountdown = g_menu_timeout; + gVoltageMenuCountdown = menu_timeout_10ms; } diff --git a/app/scanner.c b/app/scanner.c index cc914f1..b673e8d 100644 --- a/app/scanner.c +++ b/app/scanner.c @@ -391,7 +391,7 @@ void SCANNER_Start(void) BK4819_EnableFrequencyScan(); } - gScanDelay = g_scan_delay; + gScanDelay = scan_delay_10ms; gScanCssResultCode = 0xFF; gScanCssResultType = 0xFF; gScanHitCount = 0; diff --git a/bitmaps.c b/bitmaps.c index 225c96f..a22bd90 100644 --- a/bitmaps.c +++ b/bitmaps.c @@ -5,7 +5,7 @@ // turn your monitor 90deg anti-clockwise to see the images const uint8_t BITMAP_PowerSave[] = -{ +{ // "S" 0b00000000, 0b00100110, 0b01001001, @@ -127,7 +127,7 @@ const uint8_t BITMAP_BatteryLevel5[] = }; const uint8_t BITMAP_USB_C[] = -{ +{ // USB symbol 0b00000000, 0b00011100, 0b00100111, @@ -140,7 +140,7 @@ const uint8_t BITMAP_USB_C[] = }; const uint8_t BITMAP_KeyLock[] = -{ +{ // padlock symbol 0b00000000, 0b01111100, 0b01000110, @@ -153,7 +153,7 @@ const uint8_t BITMAP_KeyLock[] = }; const uint8_t BITMAP_F_Key[] = -{ +{ // F-Key symbol 0b11111111, 0b10000001, 0b10111101, @@ -167,7 +167,7 @@ const uint8_t BITMAP_F_Key[] = }; const uint8_t BITMAP_VOX[] = -{ +{ // "VOX" 0b00000000, 0b00011111, 0b00100000, @@ -192,7 +192,7 @@ const uint8_t BITMAP_VOX[] = #if 0 const uint8_t BITMAP_WX[] = - { + { // "WX" 0b00000000, 0b01111111, 0b00100000, @@ -210,7 +210,7 @@ const uint8_t BITMAP_VOX[] = #else // 'XB' (cross-band) const uint8_t BITMAP_XB[] = - { + { // "XB" 0b00000000, 0b01100011, 0b00010100, @@ -228,7 +228,7 @@ const uint8_t BITMAP_VOX[] = #endif const uint8_t BITMAP_TDR[] = -{ +{ // "DW" 0b00000000, 0b01111111, 0b01000001, @@ -261,7 +261,7 @@ const uint8_t BITMAP_TDR[] = #ifdef ENABLE_FMRADIO const uint8_t BITMAP_FM[] = - { + { // "FM" 0b00000000, 0b01111111, 0b00001001, @@ -280,7 +280,7 @@ const uint8_t BITMAP_TDR[] = #ifdef ENABLE_NOAA const uint8_t BITMAP_NOAA[] = - { + { // "NS" 0b00000000, 0b01111111, 0b00000100, @@ -384,280 +384,8 @@ const uint8_t BITMAP_VFO_NotDefault[] = 0b00001000 }; -const uint8_t BITMAP_TX[] = -{ - 0b00000000, - 0b00000001, - 0b00000001, - 0b00000001, - 0b01111111, - 0b00000001, - 0b00000001, - 0b00000001, - - 0b00000000, - 0b01100011, - 0b00100010, - 0b00010100, - 0b00001000, - 0b00010100, - 0b00100010, - 0b01100011 -}; - -const uint8_t BITMAP_RX[] = -{ - 0b00000000, - 0b01111111, - 0b00001001, - 0b00001001, - 0b00001001, - 0b00011001, - 0b00101001, - 0b01000110, - - 0b00000000, - 0b01100011, - 0b00100010, - 0b00010100, - 0b00001000, - 0b00010100, - 0b00100010, - 0b01100011 -}; - -const uint8_t BITMAP_M[] = -{ - 0b00000000, - 0b01111111, - 0b00000010, - 0b00000100, - 0b00011000, - 0b00000100, - 0b00000010, - 0b01111111 -}; - -const uint8_t BITMAP_FB[] = -{ - 0b00000000, - 0b01111111, - 0b00001001, - 0b00001001, - 0b00001001, - 0b00001001, - 0b00001001, - 0b00000001, - - 0b00000000, - 0b01111111, - 0b01001001, - 0b01001001, - 0b01001001, - 0b01001001, - 0b01001001, - 0b00110110 -}; - -const uint8_t BITMAP_ReverseMode[] = -{ - 0b00000000, - 0b01111111, - 0b00001001, - 0b00001001, - 0b00001001, - 0b00011001, - 0b00101001, - 0b01000110 -}; - -const uint8_t BITMAP_NarrowBand[] = -{ - 0b00000000, - 0b01111111, - 0b00000010, - 0b00000100, - 0b00001000, - 0b00010000, - 0b00100000, - 0b01111111 -}; - -const uint8_t BITMAP_DTMF[] = -{ - 0b00000000, - 0b01111111, - 0b01000001, - 0b01000001, - 0b01000001, - 0b00111110, - - 0b00000000, - 0b00000001, - 0b00000001, - 0b01111111, - 0b00000001, - 0b00000001, - - 0b00000000, - 0b01111111, - 0b00000010, - 0b00001100, - 0b00000010, - 0b01111111, - - 0b00000000, - 0b01111111, - 0b00001001, - 0b00001001, - 0b00001001, - 0b00000001 -}; - -const uint8_t BITMAP_Scramble[] = -{ - 0b00000000, - 0b00100110, - 0b01001001, - 0b01001001, - 0b01001001, - 0b00110010, - - 0b00000000, - 0b00111110, - 0b01000001, - 0b01000001, - 0b01000001, - 0b00100010, - - 0b00000000, - 0b01111111, - 0b00001001, - 0b00011001, - 0b00101001, - 0b01000110 -}; - -const uint8_t BITMAP_Add[] = -{ - 0b00000000, - 0b00011000, - 0b00011000, - 0b01111110, - 0b01111110, - 0b01111110, - 0b00011000, - 0b00011000 -}; - -const uint8_t BITMAP_Sub[] = -{ - 0b00000000, - 0b00001100, - 0b00001100, - 0b00001100, - 0b00001100, - 0b00001100, - 0b00001100, - 0b00001100 -}; - -const uint8_t BITMAP_PowerHigh[] = -{ - 0b00000000, - 0b01111111, - 0b00001000, - 0b00001000, - 0b00001000, - 0b00001000, - 0b00001000, - 0b01111111 -}; - -const uint8_t BITMAP_PowerMid[] = -{ - 0b00000000, - 0b01111111, - 0b00000010, - 0b00000100, - 0b00011000, - 0b00000100, - 0b00000010, - 0b01111111 -}; - -const uint8_t BITMAP_PowerLow[] = -{ - 0b00000000, - 0b01111111, - 0b01000000, - 0b01000000, - 0b01000000, - 0b01000000, - 0b01000000, - 0b01000000 -}; - -const uint8_t BITMAP_AM[] = -{ - 0b00000000, - 0b01111100, - 0b00010010, - 0b00010001, - 0b00010010, - 0b01111100, - - 0b00000000, - 0b01111111, - 0b00000010, - 0b00001100, - 0b00000010, - 0b01111111 -}; - -const uint8_t BITMAP_CT[] = -{ - 0b00000000, - 0b00111110, - 0b01000001, - 0b01000001, - 0b01000001, - 0b00100010, - - 0b00000000, - 0b00000001, - 0b00000001, - 0b01111111, - 0b00000001, - 0b00000001 -}; - -const uint8_t BITMAP_DCS[] = -{ - 0b00000000, - 0b01111111, - 0b01000001, - 0b01000001, - 0b01000001, - 0b00111110, - - 0b00000000, - 0b00111110, - 0b01000001, - 0b01000001, - 0b01000001, - 0b00100010, - - 0b00000000, - 0b00100110, - 0b01001001, - 0b01001001, - 0b01001001, - 0b00110010 -}; - const uint8_t BITMAP_ScanList[] = -{ +{ // diamond symbol 0b00001000, 0b00011100, 0b00111110, diff --git a/bitmaps.h b/bitmaps.h index 6c3a282..082b386 100644 --- a/bitmaps.h +++ b/bitmaps.h @@ -53,32 +53,6 @@ extern const uint8_t BITMAP_CurrentIndicator[8]; extern const uint8_t BITMAP_VFO_Default[8]; extern const uint8_t BITMAP_VFO_NotDefault[8]; -extern const uint8_t BITMAP_TX[16]; -extern const uint8_t BITMAP_RX[16]; - -extern const uint8_t BITMAP_M[8]; -extern const uint8_t BITMAP_FB[16]; - -extern const uint8_t BITMAP_ReverseMode[8]; - -extern const uint8_t BITMAP_NarrowBand[8]; - -extern const uint8_t BITMAP_DTMF[24]; - -extern const uint8_t BITMAP_Scramble[18]; - -extern const uint8_t BITMAP_Add[8]; -extern const uint8_t BITMAP_Sub[8]; - -extern const uint8_t BITMAP_PowerHigh[8]; -extern const uint8_t BITMAP_PowerMid[8]; -extern const uint8_t BITMAP_PowerLow[8]; - -extern const uint8_t BITMAP_AM[12]; - -extern const uint8_t BITMAP_CT[12]; -extern const uint8_t BITMAP_DCS[18]; - extern const uint8_t BITMAP_ScanList[6]; #endif diff --git a/driver/st7565.c b/driver/st7565.c index b5a1df9..e0f0f42 100644 --- a/driver/st7565.c +++ b/driver/st7565.c @@ -63,8 +63,7 @@ void ST7565_DrawLine(uint8_t Column, uint8_t Line, uint16_t Size, const uint8_t void ST7565_BlitFullScreen(void) { - uint8_t Line; - uint8_t Column; + unsigned int Line; SPI_ToggleMasterMode(&SPI0->CR, false); @@ -72,6 +71,7 @@ void ST7565_BlitFullScreen(void) for (Line = 0; Line < 7; Line++) { + unsigned int Column; ST7565_SelectColumnAndLine(4, Line + 1); GPIO_SetBit(&GPIOB->DATA, GPIOB_PIN_ST7565_A0); for (Column = 0; Column < 128; Column++) diff --git a/firmware b/firmware index 380988ed8b23092cc1f5233bf4b5cd3a9cb5c2f7..8f81a49bf26dd9d8d06835c66c7bd4a8e81dc2a7 100644 GIT binary patch delta 15574 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 diff --git a/firmware.bin b/firmware.bin index 44a068c1b69f00612a134aee6a30d269fa43cce7..0b7228f906e7a054e101db31e784135d68913c54 100644 GIT binary patch delta 5081 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 YW{m^7=b7-kmDfMV&)=^5((1192B%K!iX delta 5339 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 diff --git a/firmware.packed.bin b/firmware.packed.bin index daed101aa45c7ad0086ed01deeb19298a84ec8e7..a43b82ff42c7e330b02a92ff913a45356ae283b4 100644 GIT binary patch delta 14502 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 z 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 A5dZ)H diff --git a/functions.c b/functions.c index cfcea61..64ae626 100644 --- a/functions.c +++ b/functions.c @@ -183,7 +183,7 @@ void FUNCTION_Select(FUNCTION_Type_t Function) break; } - gBatterySaveCountdown = battery_save_count; + gBatterySaveCountdown = battery_save_count_10ms; gSchedulePowerSave = false; #if defined(ENABLE_FMRADIO) gFM_RestoreCountdown = 0; diff --git a/misc.c b/misc.c index e08a2dc..a7bacb9 100644 --- a/misc.c +++ b/misc.c @@ -18,33 +18,33 @@ #include "misc.h" -const uint8_t key_input_timeout = 10; // 5 seconds +const uint8_t menu_timeout_10ms = 20 * 2; // 20 seconds -const uint16_t key_repeat_delay = 40; // 400ms -const uint16_t key_repeat = 8; // was 15 (150ms) .. MUST be less than 'key_repeat_delay' -const uint16_t key_debounce = 2; // 20ms +const uint8_t key_input_timeout_500ms = 8 * 2; // 8 seconds -const uint8_t g_scan_delay = 21; // 210ms +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 g_menu_timeout = 2 * 15; // 15 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}; - -const uint16_t battery_save_count = 10000 / 10; // 10 seconds +const uint8_t scan_delay_10ms = 210 / 10; // 210ms // 10ms count down resolution -const uint16_t dual_watch_count_after_tx = 3600 / 10; // 3.6 sec after TX ends -const uint16_t dual_watch_count_after_rx = 1000 / 10; // 1 sec after RX ends ? -const uint16_t dual_watch_count_after_1 = 5000 / 10; // 5 sec -const uint16_t dual_watch_count_after_2 = 3600 / 10; // 3.6 sec -const uint16_t dual_watch_count_toggle = 100 / 10; // 100ms between VFO toggles -const uint16_t dual_watch_count_noaa = 70 / 10; // 70ms -const uint16_t dual_watch_count_after_vox = 200 / 10; // 200ms +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 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; bool gSetting_KILLED; @@ -65,14 +65,14 @@ uint8_t gEEPROM_1EC0_2[8]; uint8_t gEEPROM_1EC0_3[8]; uint16_t gEEPROM_RSSI_CALIB[3][4]; - + uint16_t gEEPROM_1F8A; uint16_t gEEPROM_1F8C; uint8_t gMR_ChannelAttributes[207]; volatile bool gNextTimeslice500ms; -volatile uint16_t gBatterySaveCountdown = battery_save_count; +volatile uint16_t gBatterySaveCountdown = battery_save_count_10ms; volatile uint16_t gDualWatchCountdown; volatile uint16_t gTxTimerCountdown; volatile uint16_t gTailNoteEliminationCountdown; diff --git a/misc.h b/misc.h index fd09a2a..2ab92ee 100644 --- a/misc.h +++ b/misc.h @@ -74,31 +74,31 @@ enum CssScanMode_t typedef enum CssScanMode_t CssScanMode_t; -extern const uint8_t key_input_timeout; +extern const uint8_t key_input_timeout_500ms; -extern const uint16_t key_repeat_delay; -extern const uint16_t key_repeat; -extern const uint16_t key_debounce; +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 g_scan_delay; +extern const uint8_t scan_delay_10ms; -extern const uint8_t g_menu_timeout; +extern const uint8_t menu_timeout_10ms; + +extern const uint16_t battery_save_count_10ms; + +extern const uint16_t dual_watch_count_after_tx_10ms; +extern const uint16_t dual_watch_count_after_rx_10ms; +extern const uint16_t dual_watch_count_after_1_10ms; +extern const uint16_t dual_watch_count_after_2_10ms; +extern const uint16_t dual_watch_count_toggle_10ms; +extern const uint16_t dual_watch_count_noaa_10ms; +extern const uint16_t dual_watch_count_after_vox_10ms; extern const uint16_t gMax_bat_v; extern const uint16_t gMin_bat_v; extern const uint8_t gMicGain_dB2[5]; -extern const uint16_t battery_save_count; - -extern const uint16_t dual_watch_count_after_tx; -extern const uint16_t dual_watch_count_after_rx; -extern const uint16_t dual_watch_count_after_1; -extern const uint16_t dual_watch_count_after_2; -extern const uint16_t dual_watch_count_toggle; -extern const uint16_t dual_watch_count_noaa; -extern const uint16_t dual_watch_count_after_vox; - extern bool gSetting_350TX; extern bool gSetting_KILLED; extern bool gSetting_200TX; diff --git a/radio.c b/radio.c index e3bf3a4..3104f91 100644 --- a/radio.c +++ b/radio.c @@ -842,7 +842,7 @@ void RADIO_PrepareTX(void) { if (gEeprom.DUAL_WATCH != DUAL_WATCH_OFF) { - gDualWatchCountdown = dual_watch_count_after_tx; + gDualWatchCountdown = dual_watch_count_after_tx_10ms; gScheduleDualWatch = false; if (!gRxVfoIsActive) diff --git a/ui/lock.c b/ui/lock.c index a094a2d..ea5e87f 100644 --- a/ui/lock.c +++ b/ui/lock.c @@ -67,7 +67,7 @@ void UI_DisplayLock(void) if (gKeyReading0 == Key) { - if (++gDebounceCounter == key_debounce) + if (++gDebounceCounter == key_debounce_10ms) { if (Key == KEY_INVALID) { diff --git a/ui/main.c b/ui/main.c index 245a8b1..272c016 100644 --- a/ui/main.c +++ b/ui/main.c @@ -68,9 +68,7 @@ void UI_DisplayMain(void) if (!bIsSameVfo) continue; // skip the unused vfo - //Line = 1; - //pLine0 = gFrameBuffer[Line + 0]; - //pLine1 = gFrameBuffer[Line + 1]; + } if (gEeprom.DUAL_WATCH != DUAL_WATCH_OFF && gRxVfoIsActive) @@ -151,7 +149,7 @@ void UI_DisplayMain(void) if (Channel == vfo_num) { // show the TX symbol SomeValue = 1; - memcpy(pLine0 + 14, BITMAP_TX, sizeof(BITMAP_TX)); + UI_PrintStringSmall("TX", 14, 0, Line); } } } @@ -159,7 +157,7 @@ void UI_DisplayMain(void) { // receiving .. show the RX symbol SomeValue = 2; if ((gCurrentFunction == FUNCTION_RECEIVE || gCurrentFunction == FUNCTION_MONITOR) && gEeprom.RX_CHANNEL == vfo_num) - memcpy(pLine0 + 14, BITMAP_RX, sizeof(BITMAP_RX)); + UI_PrintStringSmall("RX", 14, 0, Line); } if (IS_MR_CHANNEL(gEeprom.ScreenChannel[vfo_num])) @@ -168,23 +166,21 @@ void UI_DisplayMain(void) const unsigned int x = 2; // show the memory channel symbol - memcpy(pLine1 + x, BITMAP_M, sizeof(BITMAP_M)); + UI_PrintStringSmall("M", x, 0, Line + 1); if (gInputBoxIndex == 0 || gEeprom.TX_CHANNEL != vfo_num) NUMBER_ToDigits(gEeprom.ScreenChannel[vfo_num] + 1, String); // show the memory channel number else memcpy(String + 5, gInputBox, 3); // show the input text - UI_DisplaySmallDigits(3, String + 5, x + sizeof(BITMAP_M), Line + 1, false); + UI_DisplaySmallDigits(3, String + 5, x + 7, Line + 1, false); } else if (IS_FREQ_CHANNEL(gEeprom.ScreenChannel[vfo_num])) { const unsigned int x = 2; // was 14 // show the frequency band number - char c; - memcpy(pLine1 + x, BITMAP_FB, sizeof(BITMAP_FB)); - c = (gEeprom.ScreenChannel[vfo_num] - FREQ_CHANNEL_FIRST) + 1; - UI_DisplaySmallDigits(1, &c, x + sizeof(BITMAP_FB), Line + 1, false); + sprintf(String, "FB%u", 1 + gEeprom.ScreenChannel[vfo_num] - FREQ_CHANNEL_FIRST); + UI_PrintStringSmall(String, x, 0, Line + 1); } else { @@ -405,7 +401,7 @@ void UI_DisplayMain(void) if (gEeprom.VfoInfo[vfo_num].IsAM) { // show the AM symbol - memcpy(pLine1 + display_width + 27, BITMAP_AM, sizeof(BITMAP_AM)); + UI_PrintStringSmall("AM", display_width + 27, 0, Line + 1); } else { // show the CTCSS or DCS symbol @@ -416,51 +412,52 @@ void UI_DisplayMain(void) case CODE_TYPE_OFF: break; case CODE_TYPE_CONTINUOUS_TONE: // CTCSS - memcpy(pLine1 + display_width + 27, BITMAP_CT, sizeof(BITMAP_CT)); + UI_PrintStringSmall("CT", display_width + 24, 0, Line + 1); break; case CODE_TYPE_DIGITAL: case CODE_TYPE_REVERSE_DIGITAL: // DCS - memcpy(pLine1 + display_width + 24, BITMAP_DCS, sizeof(BITMAP_DCS)); + UI_PrintStringSmall("DCS", display_width + 24, 0, Line + 1); break; } } + String[0] = '?'; switch (gEeprom.VfoInfo[vfo_num].OUTPUT_POWER) { // show the TX power level symbol - case OUTPUT_POWER_LOW: - memcpy(pLine1 + display_width + 44, BITMAP_PowerLow, sizeof(BITMAP_PowerLow)); - break; - case OUTPUT_POWER_MID: - memcpy(pLine1 + display_width + 44, BITMAP_PowerMid, sizeof(BITMAP_PowerMid)); - break; - case OUTPUT_POWER_HIGH: - memcpy(pLine1 + display_width + 44, BITMAP_PowerHigh, sizeof(BITMAP_PowerHigh)); - break; + case OUTPUT_POWER_LOW: String[0] = 'L'; break; + case OUTPUT_POWER_MID: String[0] = 'M'; break; + case OUTPUT_POWER_HIGH: String[0] = 'H'; break; } + String[1] = '\0'; + UI_PrintStringSmall(String, display_width + 46, 0, Line + 1); if (gEeprom.VfoInfo[vfo_num].ConfigRX.Frequency != gEeprom.VfoInfo[vfo_num].ConfigTX.Frequency) { // show the TX offset symbol - if (gEeprom.VfoInfo[vfo_num].TX_OFFSET_FREQUENCY_DIRECTION == TX_OFFSET_FREQUENCY_DIRECTION_ADD) - memcpy(pLine1 + display_width + 54, BITMAP_Add, sizeof(BITMAP_Add)); - if (gEeprom.VfoInfo[vfo_num].TX_OFFSET_FREQUENCY_DIRECTION == TX_OFFSET_FREQUENCY_DIRECTION_SUB) - memcpy(pLine1 + display_width + 54, BITMAP_Sub, sizeof(BITMAP_Sub)); + String[0] = '\0'; + switch (gEeprom.VfoInfo[vfo_num].TX_OFFSET_FREQUENCY_DIRECTION) + { + case TX_OFFSET_FREQUENCY_DIRECTION_ADD: String[0] = '+'; break; + case TX_OFFSET_FREQUENCY_DIRECTION_SUB: String[0] = '-'; break; + } + String[1] = '\0'; + UI_PrintStringSmall(String, display_width + 54, 0, Line + 1); } // show the TX/RX reverse symbol if (gEeprom.VfoInfo[vfo_num].FrequencyReverse) - memcpy(pLine1 + display_width + 64, BITMAP_ReverseMode, sizeof(BITMAP_ReverseMode)); + UI_PrintStringSmall("R", display_width + 62, 0, Line + 1); // show the narrow band symbol if (gEeprom.VfoInfo[vfo_num].CHANNEL_BANDWIDTH == BANDWIDTH_NARROW) - memcpy(pLine1 + display_width + 74, BITMAP_NarrowBand, sizeof(BITMAP_NarrowBand)); + UI_PrintStringSmall("N", display_width + 70, 0, Line + 1); // show the DTMF decoding symbol if (gEeprom.VfoInfo[vfo_num].DTMF_DECODING_ENABLE || gSetting_KILLED) - memcpy(pLine1 + display_width + 84, BITMAP_DTMF, sizeof(BITMAP_DTMF)); + UI_PrintStringSmall("DTMF", display_width + 78, 0, Line + 1); // show the audio scramble symbol if (gEeprom.VfoInfo[vfo_num].SCRAMBLING_TYPE && gSetting_ScrambleEnable) - memcpy(pLine1 + display_width + 110, BITMAP_Scramble, sizeof(BITMAP_Scramble)); + UI_PrintStringSmall("SCR", display_width + 106, 0, Line + 1); } ST7565_BlitFullScreen(); diff --git a/ui/status.c b/ui/status.c index bf6aa6f..af633ff 100644 --- a/ui/status.c +++ b/ui/status.c @@ -26,6 +26,7 @@ #include "helper/battery.h" #include "misc.h" #include "settings.h" +//#include "ui/helper.h" #include "ui/status.h" void UI_DisplayStatus(const bool test_display)