diff --git a/Makefile b/Makefile index 040095e..5385130 100644 --- a/Makefile +++ b/Makefile @@ -4,57 +4,60 @@ # 1 = enable # ---- STOCK QUANSHENG FERATURES ---- -ENABLE_FMRADIO ?= 0 -ENABLE_UART ?= 1 -ENABLE_AIRCOPY ?= 0 -ENABLE_NOAA ?= 0 -ENABLE_VOICE ?= 0 -ENABLE_VOX ?= 1 -ENABLE_ALARM ?= 0 -ENABLE_TX1750 ?= 1 -ENABLE_PWRON_PASSWORD ?= 0 -ENABLE_DTMF_CALLING ?= 0 -ENABLE_FLASHLIGHT ?= 1 +ENABLE_FMRADIO ?= 0 +ENABLE_UART ?= 1 +ENABLE_AIRCOPY ?= 0 +ENABLE_NOAA ?= 0 +ENABLE_VOICE ?= 0 +ENABLE_VOX ?= 1 +ENABLE_ALARM ?= 0 +ENABLE_TX1750 ?= 1 +ENABLE_PWRON_PASSWORD ?= 0 +ENABLE_DTMF_CALLING ?= 0 +ENABLE_FLASHLIGHT ?= 1 # ---- CUSTOM MODS ---- -ENABLE_SPECTRUM ?= 1 -ENABLE_BIG_FREQ ?= 1 -ENABLE_SMALL_BOLD ?= 1 -ENABLE_CUSTOM_MENU_LAYOUT ?= 1 -ENABLE_KEEP_MEM_NAME ?= 1 -ENABLE_WIDE_RX ?= 1 -ENABLE_TX_WHEN_AM ?= 0 -ENABLE_F_CAL_MENU ?= 0 -ENABLE_CTCSS_TAIL_PHASE_SHIFT ?= 0 -ENABLE_BOOT_BEEPS ?= 0 -ENABLE_SHOW_CHARGE_LEVEL ?= 0 -ENABLE_REVERSE_BAT_SYMBOL ?= 0 -ENABLE_NO_CODE_SCAN_TIMEOUT ?= 1 -ENABLE_AM_FIX ?= 1 -ENABLE_SQUELCH_MORE_SENSITIVE ?= 1 -ENABLE_FASTER_CHANNEL_SCAN ?= 1 -ENABLE_RSSI_BAR ?= 1 -ENABLE_AUDIO_BAR ?= 1 -ENABLE_COPY_CHAN_TO_VFO ?= 1 -ENABLE_REDUCE_LOW_MID_TX_POWER?= 0 -ENABLE_BYP_RAW_DEMODULATORS ?= 0 -ENABLE_BLMIN_TMP_OFF ?= 0 -ENABLE_SCAN_RANGES ?= 1 -ENABLE_FEAT_F4HWN ?= 1 -ENABLE_FEAT_F4HWN_FIXED_PWR ?= 0 -ENABLE_FEAT_F4HWN_SCREENSHOT ?= 0 -ENABLE_FEAT_F4HWN_PMR ?= 1 +ENABLE_SPECTRUM ?= 1 +ENABLE_BIG_FREQ ?= 1 +ENABLE_SMALL_BOLD ?= 1 +ENABLE_CUSTOM_MENU_LAYOUT ?= 1 +ENABLE_KEEP_MEM_NAME ?= 1 +ENABLE_WIDE_RX ?= 1 +ENABLE_TX_WHEN_AM ?= 0 +ENABLE_F_CAL_MENU ?= 0 +ENABLE_CTCSS_TAIL_PHASE_SHIFT ?= 0 +ENABLE_BOOT_BEEPS ?= 0 +ENABLE_SHOW_CHARGE_LEVEL ?= 0 +ENABLE_REVERSE_BAT_SYMBOL ?= 0 +ENABLE_NO_CODE_SCAN_TIMEOUT ?= 1 +ENABLE_AM_FIX ?= 1 +ENABLE_SQUELCH_MORE_SENSITIVE ?= 1 +ENABLE_FASTER_CHANNEL_SCAN ?= 1 +ENABLE_RSSI_BAR ?= 1 +ENABLE_AUDIO_BAR ?= 1 +ENABLE_COPY_CHAN_TO_VFO ?= 1 +ENABLE_REDUCE_LOW_MID_TX_POWER ?= 0 +ENABLE_BYP_RAW_DEMODULATORS ?= 0 +ENABLE_BLMIN_TMP_OFF ?= 0 +ENABLE_SCAN_RANGES ?= 1 +ENABLE_FEAT_F4HWN ?= 1 +ENABLE_FEAT_F4HWN_SCREENSHOT ?= 0 +ENABLE_FEAT_F4HWN_SPECTRUM ?= 1 +ENABLE_FEAT_F4HWN_CHARGING_C ?= 1 +ENABLE_FEAT_F4HWN_PMR ?= 1 +ENABLE_FEAT_F4HWN_GMRS_FRS_MURS ?= 1 +ENABLE_FEAT_F4HWN_CA ?= 1 # ---- DEBUGGING ---- -ENABLE_AM_FIX_SHOW_DATA ?= 0 -ENABLE_AGC_SHOW_DATA ?= 0 -ENABLE_UART_RW_BK_REGS ?= 0 +ENABLE_AM_FIX_SHOW_DATA ?= 0 +ENABLE_AGC_SHOW_DATA ?= 0 +ENABLE_UART_RW_BK_REGS ?= 0 # ---- COMPILER/LINKER OPTIONS ---- -ENABLE_CLANG ?= 0 -ENABLE_SWD ?= 0 -ENABLE_OVERLAY ?= 0 -ENABLE_LTO ?= 1 +ENABLE_CLANG ?= 0 +ENABLE_SWD ?= 0 +ENABLE_OVERLAY ?= 0 +ENABLE_LTO ?= 1 ############################################################# @@ -213,7 +216,7 @@ ifeq ($(ENABLE_FEAT_F4HWN),1) VERSION_STRING_1 ?= v0.22 AUTHOR_STRING_2 ?= F4HWN - VERSION_STRING_2 ?= v3.0 + VERSION_STRING_2 ?= v3.1 AUTHOR_STRING ?= $(AUTHOR_STRING_1)+$(AUTHOR_STRING_2) VERSION_STRING ?= $(VERSION_STRING_2) @@ -402,15 +405,24 @@ ifeq ($(ENABLE_FEAT_F4HWN),1) CFLAGS += -DAUTHOR_STRING_1=\"$(AUTHOR_STRING_1)\" -DVERSION_STRING_1=\"$(VERSION_STRING_1)\" CFLAGS += -DAUTHOR_STRING_2=\"$(AUTHOR_STRING_2)\" -DVERSION_STRING_2=\"$(VERSION_STRING_2)\" endif -ifeq ($(ENABLE_FEAT_F4HWN_FIXED_PWR),1) - CFLAGS += -DENABLE_FEAT_F4HWN_FIXED_PWR -endif ifeq ($(ENABLE_FEAT_F4HWN_SCREENSHOT),1) CFLAGS += -DENABLE_FEAT_F4HWN_SCREENSHOT endif +ifeq ($(ENABLE_FEAT_F4HWN_SPECTRUM),1) + CFLAGS += -DENABLE_FEAT_F4HWN_SPECTRUM +endif +ifeq ($(ENABLE_FEAT_F4HWN_CHARGING_C),1) + CFLAGS += -DENABLE_FEAT_F4HWN_CHARGING_C +endif ifeq ($(ENABLE_FEAT_F4HWN_PMR),1) CFLAGS += -DENABLE_FEAT_F4HWN_PMR endif +ifeq ($(ENABLE_FEAT_F4HWN_GMRS_FRS_MURS),1) + CFLAGS += -DENABLE_FEAT_F4HWN_GMRS_FRS_MURS +endif +ifeq ($(ENABLE_FEAT_F4HWN_CA),1) + CFLAGS += -DENABLE_FEAT_F4HWN_CA +endif LDFLAGS = LDFLAGS += -z noexecstack -mcpu=cortex-m0 -nostartfiles -Wl,-T,firmware.ld -Wl,--gc-sections diff --git a/README.md b/README.md index af17ace..4d7ec9d 100644 --- a/README.md +++ b/README.md @@ -26,7 +26,7 @@ Anyway, have fun. # Donations -Special thanks to Jean-Cyrille F6IWW, Fabrice 14RC123, David F4BPP, Olivier 14RC206, Frédéric F4ESO, Stéphane F5LGW, Jorge Ornelas, Laurent F4AXK, Christophe Morel, Clayton W0LED, Pierre Antoine F6FWB, Jean-Claude 14FRS3306, Thierry F4GVO, Eric F1NOU, PricelessToolkit, Ady M6NYJ, Tom McGovern, Joseph Roth, Pierre-Yves Colin, Frank DJ7FG, Marcel Testaz and Brian Frobisher for their [donations](https://www.paypal.com/paypalme/F4HWN). That’s so kind of them. Thanks so much 🙏🏻 +Special thanks to Jean-Cyrille F6IWW, Fabrice 14RC123, David F4BPP, Olivier 14RC206, Frédéric F4ESO, Stéphane F5LGW, Jorge Ornelas, Laurent F4AXK, Christophe Morel, Clayton W0LED, Pierre Antoine F6FWB, Jean-Claude 14FRS3306, Thierry F4GVO, Eric F1NOU, PricelessToolkit, Ady M6NYJ, Tom McGovern, Joseph Roth, Pierre-Yves Colin, Frank DJ7FG, Marcel Testaz, Brian Frobisher, Yannick F4JFO and Paolo Bussola for their [donations](https://www.paypal.com/paypalme/F4HWN). That’s so kind of them. Thanks so much 🙏🏻 ## Table of Contents @@ -43,9 +43,15 @@ Special thanks to Jean-Cyrille F6IWW, Fabrice 14RC123, David F4BPP, Olivier 14RC ## Main features: -* improve default power settings level (Low ~125mW, Mid ~2W and High ~5W), +* improve default power settings level: + * Low1 to Low5 (<~20mW, ~125mW, ~250mW, ~500mW, ~1W), + * Mid ~2W, + * High ~5W, + * User (see SetPwr), * improve s-meter (IARU recommandations), -* improve bandscope (Spectrum Analyser) and add channel name, +* improve bandscope (Spectrum Analyser): + * add channel name, + * add save of some spectrum parameters, * improve UI: * menu index is always visible, even if a menu is selected, * s-meter new design (Classic or Tiny), @@ -64,7 +70,7 @@ Special thanks to Jean-Cyrille F6IWW, Fabrice 14RC123, David F4BPP, Olivier 14RC * improve memory channel input, * and more... * new menu entries and changes: - * add SetLow menu to set low power (<20mW, 125mW, 250mW, 500mW and 1W), + * add SetPwr menu to set User power (<20mW, 125mW, 250mW, 500mW, 1W, 2W or 5W), * add SetPtt menu to set PTT mode (Classic or OnePush), * add SetTot menu to set TOT alert (Off, Sound, Visual, All), * add SetCtr menu to set contrast (0 to 15), @@ -81,23 +87,24 @@ Special thanks to Jean-Cyrille F6IWW, Fabrice 14RC123, David F4BPP, Olivier 14RC * add HAM CA F Lock band (for Canadian zone), * add GMRS/FRS/MURS F Lock (for North America zone), * remove blink and SOS functionality, - * remove AM Fix menu (AM Fix is ENABLED by default). + * remove AM Fix menu (AM Fix is ENABLED by default), + * add support of 3500mAh battery, * improve status bar: * add SetPtt mode in status bar, * change font and bitmaps, * move USB icon to left of battery information, * add RX and TX timers, * improve lists and scan lists options: - * add new list 3 - * add new list 0 (channel without list...) - * add new scan lists options - * scan list 0 (all channels without list) - * scan list 1 - * scan list 2 - * scan list 3 - * scan lists [1, 2, 3] - * scan all (all channels with ou without list) - * add scan list shortcuts + * add new list 3, + * add new list 0 (channel without list...), + * add new scan lists options, + * scan list 0 (all channels without list), + * scan list 1, + * scan list 2, + * scan list 3, + * scan lists [1, 2, 3], + * scan all (all channels with ou without list), + * add scan list shortcuts, * new actions: * RX MODE, * MAIN ONLY, diff --git a/app/action.c b/app/action.c index 5edad84..021c72f 100644 --- a/app/action.c +++ b/app/action.c @@ -121,7 +121,7 @@ static_assert(ARRAY_SIZE(action_opt_table) == ACTION_OPT_LEN); void ACTION_Power(void) { if (++gTxVfo->OUTPUT_POWER > OUTPUT_POWER_HIGH) - gTxVfo->OUTPUT_POWER = OUTPUT_POWER_LOW; + gTxVfo->OUTPUT_POWER = OUTPUT_POWER_LOW1; gRequestSaveChannel = 1; @@ -522,12 +522,24 @@ void ACTION_Ptt(void) void ACTION_Wn(void) { - gTxVfo->CHANNEL_BANDWIDTH = (gTxVfo->CHANNEL_BANDWIDTH == 0) ? 1: 0; -#ifdef ENABLE_AM_FIX - BK4819_SetFilterBandwidth(gTxVfo->CHANNEL_BANDWIDTH, true); -#else - BK4819_SetFilterBandwidth(gTxVfo->CHANNEL_BANDWIDTH, false); -#endif + if (FUNCTION_IsRx()) + { + gRxVfo->CHANNEL_BANDWIDTH = (gRxVfo->CHANNEL_BANDWIDTH == 0) ? 1: 0; + #ifdef ENABLE_AM_FIX + BK4819_SetFilterBandwidth(gRxVfo->CHANNEL_BANDWIDTH, true); + #else + BK4819_SetFilterBandwidth(gRxVfo->CHANNEL_BANDWIDTH, false); + #endif + } + else + { + gTxVfo->CHANNEL_BANDWIDTH = (gTxVfo->CHANNEL_BANDWIDTH == 0) ? 1: 0; + #ifdef ENABLE_AM_FIX + BK4819_SetFilterBandwidth(gTxVfo->CHANNEL_BANDWIDTH, true); + #else + BK4819_SetFilterBandwidth(gTxVfo->CHANNEL_BANDWIDTH, false); + #endif + } } void ACTION_BackLight(void) diff --git a/app/app.c b/app/app.c index 2ebad56..9388566 100644 --- a/app/app.c +++ b/app/app.c @@ -1469,30 +1469,16 @@ void APP_TimeSlice500ms(void) if (IS_MR_CHANNEL(gTxVfo->CHANNEL_SAVE) && (gInputBoxIndex == 1 || gInputBoxIndex == 2)) { + channelMoveSwitch(); + + if (gBeepToPlay == BEEP_500HZ_60MS_DOUBLE_BEEP_OPTIONAL) { + AUDIO_PlayBeep(gBeepToPlay); + } + SETTINGS_SaveVfoIndices(); } cancelUserInputModes(); - - if (gBeepToPlay != BEEP_NONE) - { - AUDIO_PlayBeep(gBeepToPlay); - gBeepToPlay = BEEP_NONE; - } - } - else - { - if (IS_MR_CHANNEL(gTxVfo->CHANNEL_SAVE)) { // user is entering channel number - switch (gInputBoxIndex) - { - case 1: - channelMove(gInputBox[0] - 1, false); - break; - case 2: - channelMove(((gInputBox[0] * 10) + gInputBox[1]) - 1, false); - break; - } - } } } @@ -2046,7 +2032,8 @@ Skip: } if (gRequestSaveChannel > 0) { // TODO: remove the gRequestSaveChannel, why use global variable for that?? - if (!bKeyHeld) { + if ((!bKeyHeld && !bKeyPressed) || UI_MENU_GetCurrentMenuId()) + { SETTINGS_SaveChannel(gTxVfo->CHANNEL_SAVE, gEeprom.TX_VFO, gTxVfo, gRequestSaveChannel); if (!SCANNER_IsScanning() && gVfoConfigureMode == VFO_CONFIGURE_NONE) diff --git a/app/main.c b/app/main.c index 821e15d..3372d81 100644 --- a/app/main.c +++ b/app/main.c @@ -224,9 +224,7 @@ static void processFKeyFunction(const KEY_Code_t Key, const bool beep) #endif } else { -#ifdef ENABLE_VOX toggle_chan_scanlist(); -#endif } break; @@ -238,8 +236,8 @@ static void processFKeyFunction(const KEY_Code_t Key, const bool beep) case KEY_7: #ifdef ENABLE_VOX ACTION_Vox(); -#else - toggle_chan_scanlist(); +//#else +// toggle_chan_scanlist(); #endif break; @@ -316,20 +314,20 @@ static void processFKeyFunction(const KEY_Code_t Key, const bool beep) } } -void channelMove(uint16_t Channel, bool End) +void channelMove(uint16_t Channel) { const uint8_t Vfo = gEeprom.TX_VFO; - if(End) - { - gInputBoxIndex = 0; - } - if (!RADIO_CheckValidChannel(Channel, false, 0)) { - gBeepToPlay = BEEP_500HZ_60MS_DOUBLE_BEEP_OPTIONAL; + if (gKeyInputCountdown <= 1) { + gBeepToPlay = BEEP_500HZ_60MS_DOUBLE_BEEP_OPTIONAL; + } + return; } + gBeepToPlay = BEEP_NONE; + #ifdef ENABLE_VOICE gAnotherVoiceID = (VOICE_ID_t)Key; #endif @@ -340,14 +338,45 @@ void channelMove(uint16_t Channel, bool End) gVfoConfigureMode = VFO_CONFIGURE_RELOAD; RADIO_ConfigureChannel(gEeprom.TX_VFO, gVfoConfigureMode); - if(End) - { - SETTINGS_SaveVfoIndices(); - } - + return; } +void channelMoveSwitch(void) { + if (IS_MR_CHANNEL(gTxVfo->CHANNEL_SAVE)) { // user is entering channel number + uint16_t Channel = 0; + + switch (gInputBoxIndex) + { + case 1: + Channel = gInputBox[0]; + break; + case 2: + Channel = (gInputBox[0] * 10) + gInputBox[1]; + break; + case 3: + Channel = (gInputBox[0] * 100) + (gInputBox[1] * 10) + gInputBox[2]; + break; + } + + if ((Channel == 0) && (gInputBoxIndex != 3)) { + return; + } + + if (gInputBoxIndex == 3) { + gInputBoxIndex = 0; + gKeyInputCountdown = 1; + + channelMove(Channel - 1); + SETTINGS_SaveVfoIndices(); + + return; + } + + channelMove(Channel - 1); + } +} + static void MAIN_Key_DIGITS(KEY_Code_t Key, bool bKeyPressed, bool bKeyHeld) { if (bKeyHeld) { // key held down @@ -402,23 +431,22 @@ static void MAIN_Key_DIGITS(KEY_Code_t Key, bool bKeyPressed, bool bKeyHeld) } const uint8_t Vfo = gEeprom.TX_VFO; - gKeyInputCountdown = key_input_timeout_500ms; INPUTBOX_Append(Key); + gKeyInputCountdown = key_input_timeout_500ms; + + channelMoveSwitch(); + gRequestDisplayScreen = DISPLAY_MAIN; if (IS_MR_CHANNEL(gTxVfo->CHANNEL_SAVE)) { // user is entering channel number gKeyInputCountdown = (key_input_timeout_500ms / 5); // short time... - if (gInputBoxIndex != 3) { - #ifdef ENABLE_VOICE - gAnotherVoiceID = (VOICE_ID_t)Key; - #endif - gRequestDisplayScreen = DISPLAY_MAIN; - return; - } - - channelMove(((gInputBox[0] * 100) + (gInputBox[1] * 10) + gInputBox[2]) - 1, true); + #ifdef ENABLE_VOICE + gAnotherVoiceID = (VOICE_ID_t)Key; + #endif + + return; } // #ifdef ENABLE_NOAA diff --git a/app/main.h b/app/main.h index ddcc9ff..bfe2417 100644 --- a/app/main.h +++ b/app/main.h @@ -20,7 +20,7 @@ #include "driver/keyboard.h" void MAIN_ProcessKeys(KEY_Code_t Key, bool bKeyPressed, bool bKeyHeld); -void channelMove(uint16_t Channel, bool End); +void channelMoveSwitch(void); #endif diff --git a/app/menu.c b/app/menu.c index 8916f7d..a4d7f11 100644 --- a/app/menu.c +++ b/app/menu.c @@ -361,7 +361,7 @@ int MENU_GetLimits(uint8_t menu_id, int32_t *pMin, int32_t *pMax) case MENU_BATTYP: //*pMin = 0; - *pMax = 1; + *pMax = 2; break; case MENU_F1SHRT: @@ -374,9 +374,8 @@ int MENU_GetLimits(uint8_t menu_id, int32_t *pMin, int32_t *pMax) break; #ifdef ENABLE_FEAT_F4HWN - case MENU_SET_LOW: - //*pMin = 0; - *pMax = ARRAY_SIZE(gSubMenu_SET_LOW) - 1; + case MENU_SET_PWR: + *pMax = ARRAY_SIZE(gSubMenu_SET_PWR) - 1; break; case MENU_SET_PTT: //*pMin = 0; @@ -866,8 +865,8 @@ void MENU_AcceptSetting(void) break; #ifdef ENABLE_FEAT_F4HWN - case MENU_SET_LOW: - gSetting_set_low = gSubMenuSelection; + case MENU_SET_PWR: + gSetting_set_pwr = gSubMenuSelection; gRequestSaveChannel = 1; break; case MENU_SET_PTT: @@ -1285,8 +1284,8 @@ void MENU_ShowCurrentSetting(void) } #ifdef ENABLE_FEAT_F4HWN - case MENU_SET_LOW: - gSubMenuSelection = gSetting_set_low; + case MENU_SET_PWR: + gSubMenuSelection = gSetting_set_pwr; break; case MENU_SET_PTT: gSubMenuSelection = gSetting_set_ptt_session; diff --git a/app/spectrum.c b/app/spectrum.c index 3edecc0..a305f8a 100644 --- a/app/spectrum.c +++ b/app/spectrum.c @@ -31,6 +31,10 @@ #include "screenshot.h" #endif +#ifdef ENABLE_FEAT_F4HWN_SPECTRUM + #include "driver/eeprom.h" +#endif + struct FrequencyBandInfo { uint32_t lower; uint32_t upper; @@ -105,6 +109,47 @@ RegisterSpec registerSpecs[] = { uint16_t statuslineUpdateTimer = 0; +#ifdef ENABLE_FEAT_F4HWN_SPECTRUM + static void LoadSettings() + { + uint8_t Data[8] = {0}; + // 1FF0..0x1FF7 + EEPROM_ReadBuffer(0x1FF0, Data, 8); + + settings.scanStepIndex = ((Data[4] & 0xF0) >> 4); + + if(settings.scanStepIndex > 14) + { + settings.scanStepIndex = S_STEP_25_0kHz; + } + + settings.stepsCount = ((Data[4] & 0x0F) & 0b1100) >> 2; + + if(settings.stepsCount > 3) + { + settings.stepsCount = STEPS_64; + } + + settings.listenBw = ((Data[4] & 0x0F) & 0b0011); + + if(settings.listenBw > 2) + { + settings.listenBw = BK4819_FILTER_BW_WIDE; + } + } + + static void SaveSettings() + { + uint8_t Data[8] = {0}; + // 1FF0..0x1FF7 + EEPROM_ReadBuffer(0x1FF0, Data, 8); + + Data[4] = (settings.scanStepIndex << 4) | (settings.stepsCount << 2) | settings.listenBw; + + EEPROM_WriteBuffer(0x1FF0, Data); + } +#endif + static uint8_t DBm2S(int dbm) { uint8_t i = 0; dbm *= -1; @@ -671,7 +716,7 @@ static void Blacklist() { #ifdef ENABLE_SCAN_RANGES static bool IsBlacklisted(uint16_t idx) { - if(blacklistFreqs[0]) // cheaper than checking blacklistFreqsIdx + if(blacklistFreqsIdx) for(uint8_t i = 0; i < ARRAY_SIZE(blacklistFreqs); i++) if(blacklistFreqs[i] == idx) return true; @@ -932,6 +977,9 @@ static void OnKeyDown(uint8_t key) { menuState = 0; break; } + #ifdef ENABLE_FEAT_F4HWN_SPECTRUM + SaveSettings(); + #endif DeInitSpectrum(); break; default: @@ -1321,6 +1369,9 @@ static void Tick() { void APP_RunSpectrum() { // TX here coz it always? set to active VFO vfo = gEeprom.TX_VFO; +#ifdef ENABLE_FEAT_F4HWN_SPECTRUM + LoadSettings(); +#endif // set the current frequency in the middle of the display #ifdef ENABLE_SCAN_RANGES if(gScanRangeStart) { @@ -1345,11 +1396,14 @@ void APP_RunSpectrum() { redrawScreen = true; newScanStart = true; - ToggleRX(true), ToggleRX(false); // hack to prevent noise when squelch off RADIO_SetModulation(settings.modulationType = gTxVfo->Modulation); - BK4819_SetFilterBandwidth(settings.listenBw = BK4819_FILTER_BW_WIDE, false); + #ifdef ENABLE_FEAT_F4HWN_SPECTRUM + BK4819_SetFilterBandwidth(settings.listenBw, false); + #else + BK4819_SetFilterBandwidth(settings.listenBw = BK4819_FILTER_BW_WIDE, false); + #endif RelaunchScan(); diff --git a/archive/f4hwn.bandscope.packed.v3.1.bin b/archive/f4hwn.bandscope.packed.v3.1.bin new file mode 100644 index 0000000..92b0699 Binary files /dev/null and b/archive/f4hwn.bandscope.packed.v3.1.bin differ diff --git a/archive/f4hwn.broadcast.packed.v3.1.bin b/archive/f4hwn.broadcast.packed.v3.1.bin new file mode 100644 index 0000000..0b65e91 Binary files /dev/null and b/archive/f4hwn.broadcast.packed.v3.1.bin differ diff --git a/archive/f4hwn.voxless.packed.v3.1.bin b/archive/f4hwn.voxless.packed.v3.1.bin new file mode 100644 index 0000000..806b9e8 Binary files /dev/null and b/archive/f4hwn.voxless.packed.v3.1.bin differ diff --git a/bitmaps.c b/bitmaps.c index f127623..c403918 100644 --- a/bitmaps.c +++ b/bitmaps.c @@ -272,6 +272,14 @@ const uint8_t BITMAP_Ready[7] = 0b00000010, }; +const uint8_t BITMAP_PowerUser[3] = +{ // 'arrow' symbol + 0b00111110, + 0b00011100, + 0b00001000, +}; + + #ifndef ENABLE_CUSTOM_MENU_LAYOUT const uint8_t BITMAP_CurrentIndicator[8] = { 0xFF, diff --git a/bitmaps.h b/bitmaps.h index 836c02f..a57d9d9 100644 --- a/bitmaps.h +++ b/bitmaps.h @@ -36,6 +36,7 @@ extern const uint8_t BITMAP_ScanList2[7]; extern const uint8_t BITMAP_ScanList3[7]; extern const uint8_t BITMAP_ScanList123[19]; extern const uint8_t BITMAP_ScanListAll[19]; +extern const uint8_t BITMAP_PowerUser[3]; extern const uint8_t BITMAP_compand[6]; #ifndef ENABLE_CUSTOM_MENU_LAYOUT diff --git a/frequencies.c b/frequencies.c index 1798cf3..000ff6d 100644 --- a/frequencies.c +++ b/frequencies.c @@ -227,14 +227,13 @@ int32_t TX_freq_check(const uint32_t Frequency) if (Frequency >= 44600625 && Frequency <= 44619375) return 0; break; +#endif +#ifdef ENABLE_FEAT_F4HWN_GMRS_FRS_MURS case F_LOCK_GMRS_FRS_MURS: // https://forums.radioreference.com/threads/the-great-unofficial-radioreference-frs-gmrs-murs-fact-sheet.275370/ - if (Frequency >= 46256250 && Frequency <= 46271250) // FRS/GMRS - return 0; - if (Frequency >= 46756250 && Frequency <= 46771250) // FRS ONLY - return 0; - if (Frequency >= 46255000 && Frequency <= 46272500) // GMRS ONLY + if ((Frequency >= 46255000 && Frequency <= 46272500) || + (Frequency >= 46755000 && Frequency <= 46772500)) // FRS/GMRS return 0; if (Frequency == 15182000 || Frequency == 15188000 || @@ -243,7 +242,9 @@ int32_t TX_freq_check(const uint32_t Frequency) Frequency == 15460000) // MURS return 0; break; +#endif +#ifdef ENABLE_FEAT_F4HWN_CA case F_LOCK_CA: if (Frequency >= 14400000 && Frequency < 14800000) return 0; diff --git a/helper/battery.c b/helper/battery.c index c5ee465..ee8fe46 100644 --- a/helper/battery.c +++ b/helper/battery.c @@ -25,6 +25,7 @@ #include "ui/battery.h" #include "ui/menu.h" #include "ui/ui.h" +//#include "debugging.h" uint16_t gBatteryCalibration[6]; uint16_t gBatteryCurrentVoltage; @@ -44,14 +45,12 @@ typedef enum { BATTERY_LOW_CONFIRMED } BatteryLow_t; - uint16_t lowBatteryCountdown; const uint16_t lowBatteryPeriod = 30; volatile uint16_t gPowerSave_10ms; - -const uint16_t Voltage2PercentageTable[][7][2] = { +const uint16_t Voltage2PercentageTable[][7][3] = { [BATTERY_TYPE_1600_MAH] = { {828, 100}, {814, 97 }, @@ -71,15 +70,28 @@ const uint16_t Voltage2PercentageTable[][7][2] = { {630, 0 }, {0, 0 }, }, + + [BATTERY_TYPE_3500_MAH] = { + {837, 100}, + {826, 95 }, + {750, 50 }, + {700, 25 }, + {620, 5 }, + {600, 0 }, + {0, 0 }, + }, }; -static_assert(ARRAY_SIZE(Voltage2PercentageTable[BATTERY_TYPE_1600_MAH]) == - ARRAY_SIZE(Voltage2PercentageTable[BATTERY_TYPE_2200_MAH])); - +static_assert( + (ARRAY_SIZE(Voltage2PercentageTable[BATTERY_TYPE_1600_MAH]) == + ARRAY_SIZE(Voltage2PercentageTable[BATTERY_TYPE_2200_MAH])) && + (ARRAY_SIZE(Voltage2PercentageTable[BATTERY_TYPE_2200_MAH]) == + ARRAY_SIZE(Voltage2PercentageTable[BATTERY_TYPE_3500_MAH])) + ); unsigned int BATTERY_VoltsToPercent(const unsigned int voltage_10mV) { - const uint16_t (*crv)[2] = Voltage2PercentageTable[gEeprom.BATTERY_TYPE]; + const uint16_t (*crv)[3] = Voltage2PercentageTable[gEeprom.BATTERY_TYPE]; const int mulipl = 1000; for (unsigned int i = 1; i < ARRAY_SIZE(Voltage2PercentageTable[BATTERY_TYPE_2200_MAH]); i++) { if (voltage_10mV > crv[i][0]) { @@ -102,13 +114,22 @@ void BATTERY_GetReadings(const bool bDisplayBatteryLevel) if(gBatteryVoltageAverage > 890) gBatteryDisplayLevel = 7; // battery overvoltage - else if(gBatteryVoltageAverage < 630) + else if(gBatteryVoltageAverage < 630 && (gEeprom.BATTERY_TYPE == BATTERY_TYPE_1600_MAH || gEeprom.BATTERY_TYPE == BATTERY_TYPE_2200_MAH)) + gBatteryDisplayLevel = 0; // battery critical + else if(gBatteryVoltageAverage < 600 && (gEeprom.BATTERY_TYPE == BATTERY_TYPE_3500_MAH)) gBatteryDisplayLevel = 0; // battery critical else { gBatteryDisplayLevel = 1; const uint8_t levels[] = {5,17,41,65,88}; uint8_t perc = BATTERY_VoltsToPercent(gBatteryVoltageAverage); - for(uint8_t i = 6; i >= 1; i--){ + //char str[64]; + //LogUart("----------\n"); + //sprintf(str, "%d %d %d %d %d %d %d\n", gBatteryVoltages[0], gBatteryVoltages[1], gBatteryVoltages[2], gBatteryVoltages[3], Voltage, gBatteryVoltageAverage, perc); + //LogUart(str); + + for(uint8_t i = 6; i >= 2; i--){ + //sprintf(str, "%d %d %d\n", perc, levels[i-2], i); + //LogUart(str); if (perc > levels[i-2]) { gBatteryDisplayLevel = i; break; diff --git a/helper/battery.h b/helper/battery.h index c21a14e..19e210e 100644 --- a/helper/battery.h +++ b/helper/battery.h @@ -37,6 +37,7 @@ extern volatile uint16_t gPowerSave_10ms; typedef enum { BATTERY_TYPE_1600_MAH, BATTERY_TYPE_2200_MAH, + BATTERY_TYPE_3500_MAH, BATTERY_TYPE_UNKNOWN } BATTERY_Type_t; diff --git a/main.c b/main.c index 0410791..287ad74 100644 --- a/main.c +++ b/main.c @@ -123,11 +123,17 @@ void Main(void) if (BootMode == BOOT_MODE_F_LOCK) { + gF_LOCK = true; // flag to say include the hidden menu items #ifdef ENABLE_FEAT_F4HWN gEeprom.KEY_LOCK = 0; SETTINGS_SaveSettings(); - gMenuCursor = 63; // move to hidden section, fix me if change... !!! + #ifndef ENABLE_VOX + gMenuCursor = 63; // move to hidden section, fix me if change... !!! + #else + gMenuCursor = 64; // move to hidden section, fix me if change... !!! + #endif + gSubMenuSelection = gSetting_F_LOCK; #endif } diff --git a/misc.c b/misc.c index 70c151a..785dfc9 100644 --- a/misc.c +++ b/misc.c @@ -105,7 +105,7 @@ enum BacklightOnRxTx_t gSetting_backlight_on_tx_rx; #endif #ifdef ENABLE_FEAT_F4HWN - uint8_t gSetting_set_low = 1; + uint8_t gSetting_set_pwr = 1; bool gSetting_set_ptt = 0; uint8_t gSetting_set_tot = 0; uint8_t gSetting_set_ctr = 11; diff --git a/misc.h b/misc.h index eab114a..14c57fd 100644 --- a/misc.h +++ b/misc.h @@ -157,7 +157,7 @@ extern enum BacklightOnRxTx_t gSetting_backlight_on_tx_rx; #endif #ifdef ENABLE_FEAT_F4HWN - extern uint8_t gSetting_set_low; + extern uint8_t gSetting_set_pwr; extern bool gSetting_set_ptt; extern uint8_t gSetting_set_tot; extern uint8_t gSetting_set_ctr; diff --git a/radio.c b/radio.c index 2b8315a..738f7fb 100644 --- a/radio.c +++ b/radio.c @@ -54,8 +54,6 @@ const char gModulationStr[MODULATION_UKNOWN][4] = { #endif }; - - bool RADIO_CheckValidChannel(uint16_t channel, bool checkScanList, uint8_t scanList) { // return true if the channel appears valid @@ -140,7 +138,7 @@ void RADIO_InitInfo(VFO_Info_t *pInfo, const uint8_t ChannelSave, const uint32_t pInfo->StepFrequency = gStepFrequencyTable[pInfo->STEP_SETTING]; pInfo->CHANNEL_SAVE = ChannelSave; pInfo->FrequencyReverse = false; - pInfo->OUTPUT_POWER = OUTPUT_POWER_LOW; + pInfo->OUTPUT_POWER = OUTPUT_POWER_LOW1; pInfo->freq_config_RX.Frequency = Frequency; pInfo->freq_config_TX.Frequency = Frequency; pInfo->pRX = &pInfo->freq_config_RX; @@ -329,7 +327,7 @@ void RADIO_ConfigureChannel(const unsigned int VFO, const unsigned int configure { pVfo->FrequencyReverse = false; pVfo->CHANNEL_BANDWIDTH = BK4819_FILTER_BW_WIDE; - pVfo->OUTPUT_POWER = OUTPUT_POWER_LOW; + pVfo->OUTPUT_POWER = OUTPUT_POWER_LOW1; pVfo->BUSY_CHANNEL_LOCK = false; } else @@ -337,8 +335,8 @@ void RADIO_ConfigureChannel(const unsigned int VFO, const unsigned int configure const uint8_t d4 = data[4]; pVfo->FrequencyReverse = !!((d4 >> 0) & 1u); pVfo->CHANNEL_BANDWIDTH = !!((d4 >> 1) & 1u); - pVfo->OUTPUT_POWER = ((d4 >> 2) & 3u); - pVfo->BUSY_CHANNEL_LOCK = !!((d4 >> 4) & 1u); + pVfo->OUTPUT_POWER = ((d4 >> 2) & 7u); + pVfo->BUSY_CHANNEL_LOCK = !!((d4 >> 5) & 1u); } if (data[5] == 0xFF) @@ -508,114 +506,81 @@ void RADIO_ConfigureSquelchAndOutputPower(VFO_Info_t *pInfo) // 1F30 32 32 32 64 64 64 8c 8c 8c ff ff ff ff ff ff ff 470 MHz uint8_t Txp[3]; - EEPROM_ReadBuffer(0x1ED0 + (Band * 16) + (pInfo->OUTPUT_POWER * 3), Txp, 3); + uint8_t Op = 0; // Low eeprom calibration data + uint8_t currentPower = pInfo->OUTPUT_POWER; + + if(currentPower == OUTPUT_POWER_USER) + { + if(gSetting_set_pwr == 5) + { + Op = 1; // Mid eeprom calibration data + } + else if(gSetting_set_pwr == 6) + { + Op = 2; // High eeprom calibration data + } + currentPower = gSetting_set_pwr; + } + else + { + if (currentPower == OUTPUT_POWER_MID) + { + Op = 1; // Mid eeprom calibration data + } + else if(currentPower == OUTPUT_POWER_HIGH) + { + Op = 2; // High eeprom calibration data + } + currentPower--; + } + + EEPROM_ReadBuffer(0x1ED0 + (Band * 16) + (Op * 3), Txp, 3); #ifdef ENABLE_FEAT_F4HWN - #ifdef ENABLE_FEAT_F4HWN_FIXED_PWR - // make low and mid even lower - // and fix values - // because of toxic fucking closed firmwares + // make low and mid even lower + // and use calibration values + // be aware with toxic fucking closed firmwares - uint8_t shift[] = {0, 0, 0, 0, 0, 0, 0}; + /* + uint8_t shift[] = {0, 0, 0, 0, 0}; - if(Band == 5) + if(Band == 5) // UHF + { + shift[0] = 0; + shift[1] = 0; + shift[2] = 0; + shift[3] = 0; + shift[4] = 0; + } + */ + + for(uint8_t p = 0; p < 3; p++) + { + switch (currentPower) { - shift[0] = 2; - shift[1] = 1; - shift[2] = 2; - shift[3] = 2; - shift[4] = 2; - shift[5] = 2; - shift[6] = 2; + case 0: + Txp[p] = (Txp[p] * 4) / 25; //+ shift[pInfo->OUTPUT_POWER]; + break; + case 1: + Txp[p] = (Txp[p] * 4) / 19; // + shift[pInfo->OUTPUT_POWER]; + break; + case 2: + Txp[p] = (Txp[p] * 4) / 13; // + shift[pInfo->OUTPUT_POWER]; + break; + case 3: + Txp[p] = (Txp[p] * 4) / 10; // + shift[pInfo->OUTPUT_POWER]; + break; + case 4: + Txp[p] = (Txp[p] * 4) / 7; // + shift[pInfo->OUTPUT_POWER]; + break; + case 5: + Txp[p] = (Txp[p] * 3) / 4; + break; + case 6: + Txp[p] = Txp[p] + 30; + break; } - - if (pInfo->OUTPUT_POWER == OUTPUT_POWER_LOW) { - for(uint8_t p = 0; p < 3; p++ ) - { - switch (gSetting_set_low) { - case 0: - Txp[p] = 16 - shift[gSetting_set_low]; - break; - case 1: - Txp[p] = 21 + shift[gSetting_set_low]; - break; - case 2: - Txp[p] = 29 + shift[gSetting_set_low]; - break; - case 3: - Txp[p] = 37 + shift[gSetting_set_low]; - break; - case 4: - Txp[p] = 50 + shift[gSetting_set_low]; - break; - } - - } - } - else if (pInfo->OUTPUT_POWER == OUTPUT_POWER_MID){ - Txp[0] = 77 + shift[5]; - Txp[1] = 77 + shift[5]; - Txp[2] = 77 + shift[5]; - } - // increase high - else if (pInfo->OUTPUT_POWER == OUTPUT_POWER_HIGH){ - Txp[0] = 165 + shift[6]; - Txp[1] = 165 + shift[6]; - Txp[2] = 165 + shift[6]; - } - #else - // make low and mid even lower - // and use calibration values - // be aware with toxic fucking closed firmwares - - uint8_t shift[] = {0, 0, 0, 0, 0}; - - /* - if(Band == 5) // UHF - { - shift[0] = 0; - shift[1] = 0; - shift[2] = 0; - shift[3] = 0; - shift[4] = 0; - } - */ - - if (pInfo->OUTPUT_POWER == OUTPUT_POWER_LOW) { - for(uint8_t p = 0; p < 3; p++ ) - { - switch (gSetting_set_low) { - case 0: - Txp[p] = (Txp[p] * 4) / 25 + shift[gSetting_set_low]; - break; - case 1: - Txp[p] = (Txp[p] * 4) / 19 + shift[gSetting_set_low]; - break; - case 2: - Txp[p] = (Txp[p] * 4) / 13 + shift[gSetting_set_low]; - break; - case 3: - Txp[p] = (Txp[p] * 4) / 10 + shift[gSetting_set_low]; - break; - case 4: - Txp[p] = (Txp[p] * 4) / 7 + shift[gSetting_set_low]; - break; - } - - } - } - else if (pInfo->OUTPUT_POWER == OUTPUT_POWER_MID){ - Txp[0] = (Txp[0] * 3) / 4; - Txp[1] = (Txp[1] * 3) / 4; - Txp[2] = (Txp[2] * 3) / 4; - } - // increase high - else if (pInfo->OUTPUT_POWER == OUTPUT_POWER_HIGH){ - Txp[0] = Txp[0] + 30; - Txp[1] = Txp[1] + 30; - Txp[2] = Txp[2] + 30; - } - #endif + } #else #ifdef ENABLE_REDUCE_LOW_MID_TX_POWER // make low and mid even lower diff --git a/settings.c b/settings.c index 8173698..3e945ae 100644 --- a/settings.c +++ b/settings.c @@ -317,7 +317,7 @@ void SETTINGS_InitEEPROM(void) #ifdef ENABLE_FEAT_F4HWN // 1FF0..0x1FF7 EEPROM_ReadBuffer(0x1FF0, Data, 8); - gSetting_set_low = (((Data[7] & 0xF0) >> 4) < 5) ? ((Data[7] & 0xF0) >> 4) : 0; + gSetting_set_pwr = (((Data[7] & 0xF0) >> 4) < 7) ? ((Data[7] & 0xF0) >> 4) : 0; gSetting_set_ptt = (((Data[7] & 0x0F)) < 2) ? ((Data[7] & 0x0F)) : 0; gSetting_set_tot = (((Data[6] & 0xF0) >> 4) < 4) ? ((Data[6] & 0xF0) >> 4) : 0; @@ -707,7 +707,7 @@ void SETTINGS_SaveSettings(void) State[5] = ((tmp << 4) | (gSetting_set_ctr & 0x0F)); State[6] = ((gSetting_set_tot << 4) | (gSetting_set_eot & 0x0F)); - State[7] = ((gSetting_set_low << 4) | (gSetting_set_ptt & 0x0F)); + State[7] = ((gSetting_set_pwr << 4) | (gSetting_set_ptt & 0x0F)); gEeprom.KEY_LOCK_PTT = gSetting_set_lck; @@ -744,7 +744,7 @@ void SETTINGS_SaveChannel(uint8_t Channel, uint8_t VFO, const VFO_Info_t *pVFO, State._8[2] = (pVFO->freq_config_TX.CodeType << 4) | pVFO->freq_config_RX.CodeType; State._8[3] = (pVFO->Modulation << 4) | pVFO->TX_OFFSET_FREQUENCY_DIRECTION; State._8[4] = 0 - | (pVFO->BUSY_CHANNEL_LOCK << 4) + | (pVFO->BUSY_CHANNEL_LOCK << 5) | (pVFO->OUTPUT_POWER << 2) | (pVFO->CHANNEL_BANDWIDTH << 1) | (pVFO->FrequencyReverse << 0); diff --git a/settings.h b/settings.h index acb7fb9..900421f 100644 --- a/settings.h +++ b/settings.h @@ -41,7 +41,7 @@ typedef enum POWER_OnDisplayMode_t POWER_OnDisplayMode_t; enum TxLockModes_t { F_LOCK_DEF, //all default frequencies + configurable F_LOCK_FCC, -#ifdef ENABLE_FEAT_F4HWN_PMR +#ifdef ENABLE_FEAT_F4HWN_CA F_LOCK_CA, #endif F_LOCK_CE, @@ -50,6 +50,8 @@ enum TxLockModes_t { F_LOCK_438, #ifdef ENABLE_FEAT_F4HWN_PMR F_LOCK_PMR, +#endif +#ifdef ENABLE_FEAT_F4HWN_GMRS_FRS_MURS F_LOCK_GMRS_FRS_MURS, #endif F_LOCK_ALL, // disable TX on all frequencies @@ -82,7 +84,12 @@ enum { }; enum { - OUTPUT_POWER_LOW = 0, + OUTPUT_POWER_USER = 0, + OUTPUT_POWER_LOW1, + OUTPUT_POWER_LOW2, + OUTPUT_POWER_LOW3, + OUTPUT_POWER_LOW4, + OUTPUT_POWER_LOW5, OUTPUT_POWER_MID, OUTPUT_POWER_HIGH }; diff --git a/ui/main.c b/ui/main.c index 7482773..d2fc63d 100644 --- a/ui/main.c +++ b/ui/main.c @@ -1072,9 +1072,13 @@ void UI_DisplayMain(void) { // TX power level switch (gRxVfo->OUTPUT_POWER) { - case OUTPUT_POWER_LOW: Level = 2; break; - case OUTPUT_POWER_MID: Level = 4; break; - case OUTPUT_POWER_HIGH: Level = 6; break; + case OUTPUT_POWER_LOW1: Level = 2; break; + case OUTPUT_POWER_LOW2: Level = 2; break; + case OUTPUT_POWER_LOW3: Level = 2; break; + case OUTPUT_POWER_LOW4: Level = 2; break; + case OUTPUT_POWER_LOW5: Level = 2; break; + case OUTPUT_POWER_MID: Level = 4; break; + case OUTPUT_POWER_HIGH: Level = 6; break; } } else @@ -1148,7 +1152,7 @@ void UI_DisplayMain(void) if (isMainOnly(true)) { - UI_PrintStringSmallNormal(s, LCD_WIDTH + 24, 0, line + 1); + UI_PrintStringSmallNormal(s, LCD_WIDTH + 22, 0, line + 1); UI_PrintStringSmallNormal(t, LCD_WIDTH + 2, 0, line + 1); if (isMainOnly(false) && !gDTMF_InputMode) @@ -1190,38 +1194,39 @@ void UI_DisplayMain(void) if (state == VFO_STATE_NORMAL || state == VFO_STATE_ALARM) { // show the TX power - int i = vfoInfo->OUTPUT_POWER % 3; -#if ENABLE_FEAT_F4HWN - if (isMainOnly(true)) - { - const char pwr_short[][2] = {"L","M","H"}; - if(i == 0) + uint8_t currentPower = vfoInfo->OUTPUT_POWER % 8; + uint8_t arrowPos = 19; + bool userPower = false; + + if(currentPower == OUTPUT_POWER_USER) { - sprintf(String, "%s%d", pwr_short[i], gSetting_set_low + 1); + currentPower = gSetting_set_pwr; + userPower = true; } else { - sprintf(String, "%s", pwr_short[i]); + currentPower--; + userPower = false; } - UI_PrintStringSmallNormal(String, LCD_WIDTH + 44, 0, line + 1); - } - else - { - const char pwr_long[][5] = {"LOW", "MID", "HIGH"}; - if(i == 0) + + if (isMainOnly(true)) { - sprintf(String, "%s%d", pwr_long[i], gSetting_set_low + 1); + const char pwr_short[][3] = {"L1", "L2", "L3", "L4", "L5", "M", "H"}; + sprintf(String, "%s", pwr_short[currentPower]); + UI_PrintStringSmallNormal(String, LCD_WIDTH + 42, 0, line + 1); + arrowPos = 38; } else { - sprintf(String, "%s", pwr_long[i]); + const char pwr_long[][5] = {"LOW1", "LOW2", "LOW3", "LOW4", "LOW5", "MID", "HIGH"}; + sprintf(String, "%s", pwr_long[currentPower]); + GUI_DisplaySmallest(String, 24, line == 0 ? 17 : 49, false, true); + } + + if(userPower == true) + { + memcpy(p_line0 + 256 + arrowPos, BITMAP_PowerUser, sizeof(BITMAP_PowerUser)); } - GUI_DisplaySmallest(String, 24, line == 0 ? 17 : 49, false, true); - } -#else - const char pwr_list[][2] = {"L","M","H"}; - UI_PrintStringSmallNormal(pwr_list[i], LCD_WIDTH + 46, 0, line + 1); -#endif } if (vfoInfo->freq_config_RX.Frequency != vfoInfo->freq_config_TX.Frequency) @@ -1434,7 +1439,7 @@ void UI_DisplayMain(void) UI_PrintStringSmallBold(String, 92, 0, 6); for (uint8_t i = 92; i < 128; i++) { - gFrameBuffer[6][i] ^= 0xFF; + gFrameBuffer[6][i] ^= 0x7F; } } #endif diff --git a/ui/menu.c b/ui/menu.c index 0d1f179..9175197 100644 --- a/ui/menu.c +++ b/ui/menu.c @@ -134,7 +134,7 @@ const t_menu_item MenuList[] = {"RxMode", MENU_TDR }, {"Sql", MENU_SQL }, #ifdef ENABLE_FEAT_F4HWN - {"SetLow", MENU_SET_LOW }, + {"SetPwr", MENU_SET_PWR }, {"SetPtt", MENU_SET_PTT }, {"SetTot", MENU_SET_TOT }, {"SetEot", MENU_SET_EOT }, @@ -166,9 +166,14 @@ const t_menu_item MenuList[] = const uint8_t FIRST_HIDDEN_MENU_ITEM = MENU_F_LOCK; -const char gSubMenu_TXP[][5] = +const char gSubMenu_TXP[][6] = { - "LOW", + "USER", + "LOW 1", + "LOW 2", + "LOW 3", + "LOW 4", + "LOW 5", "MID", "HIGH" }; @@ -290,7 +295,7 @@ const char * const gSubMenu_F_LOCK[] = { "DEFAULT+\n137-174\n400-470", "FCC HAM\n144-148\n420-450", -#ifdef ENABLE_FEAT_F4HWN_PMR +#ifdef ENABLE_FEAT_F4HWN_CA "CA HAM\n144-148\n430-450", #endif "CE HAM\n144-146\n430-440", @@ -299,6 +304,8 @@ const char * const gSubMenu_F_LOCK[] = "137-174\n400-438", #ifdef ENABLE_FEAT_F4HWN_PMR "PMR 446", +#endif +#ifdef ENABLE_FEAT_F4HWN_GMRS_FRS_MURS "GMRS\nFRS\nMURS", #endif "DISABLE\nALL", @@ -323,7 +330,8 @@ const char gSubMenu_BAT_TXT[][8] = const char gSubMenu_BATTYP[][9] = { "1600mAh", - "2200mAh" + "2200mAh", + "3500mAh" }; #ifndef ENABLE_FEAT_F4HWN @@ -344,13 +352,15 @@ const char gSubMenu_SCRAMBLER[][7] = #endif #ifdef ENABLE_FEAT_F4HWN - const char gSubMenu_SET_LOW[][7] = + const char gSubMenu_SET_PWR[][6] = { - "< 20mW", - "125mW", - "250mW", - "500mW", - "1W" + "< 20m", + "125m", + "250m", + "500m", + "1", + "2", + "5" }; const char gSubMenu_SET_PTT[][8] = @@ -582,7 +592,14 @@ void UI_DisplayMenu(void) } case MENU_TXP: - strcpy(String, gSubMenu_TXP[gSubMenuSelection]); + if(gSubMenuSelection == 0) + { + strcpy(String, gSubMenu_TXP[gSubMenuSelection]); + } + else + { + sprintf(String, "%s\n%sW", gSubMenu_TXP[gSubMenuSelection], gSubMenu_SET_PWR[gSubMenuSelection - 1]); + } break; case MENU_R_DCS: @@ -903,7 +920,11 @@ void UI_DisplayMenu(void) break; case MENU_F_LOCK: +#ifdef ENABLE_FEAT_F4HWN + if(!gIsInSubMenu && gUnlockAllTxConfCnt>0 && gUnlockAllTxConfCnt<3) +#else if(!gIsInSubMenu && gUnlockAllTxConfCnt>0 && gUnlockAllTxConfCnt<10) +#endif strcpy(String, "READ\nMANUAL"); else strcpy(String, gSubMenu_F_LOCK[gSubMenuSelection]); @@ -944,10 +965,10 @@ void UI_DisplayMenu(void) break; #ifdef ENABLE_FEAT_F4HWN - case MENU_SET_LOW: - strcpy(String, gSubMenu_SET_LOW[gSubMenuSelection]); + case MENU_SET_PWR: + sprintf(String, "%s\n%sW", gSubMenu_TXP[gSubMenuSelection + 1], gSubMenu_SET_PWR[gSubMenuSelection]); break; - + case MENU_SET_PTT: strcpy(String, gSubMenu_SET_PTT[gSubMenuSelection]); break; diff --git a/ui/menu.h b/ui/menu.h index 5559dcb..ee20b22 100644 --- a/ui/menu.h +++ b/ui/menu.h @@ -123,7 +123,7 @@ enum MENU_F_CALI, // reference xtal calibration #endif #ifdef ENABLE_FEAT_F4HWN - MENU_SET_LOW, + MENU_SET_PWR, MENU_SET_PTT, MENU_SET_TOT, MENU_SET_EOT, @@ -145,7 +145,7 @@ enum extern const uint8_t FIRST_HIDDEN_MENU_ITEM; extern const t_menu_item MenuList[]; -extern const char gSubMenu_TXP[3][5]; +extern const char gSubMenu_TXP[8][6]; extern const char gSubMenu_SFT_D[3][4]; extern const char gSubMenu_W_N[2][7]; extern const char gSubMenu_OFF_ON[2][4]; @@ -166,7 +166,7 @@ extern const char gSubMenu_D_RSP[4][11]; #endif #ifdef ENABLE_FEAT_F4HWN - extern const char gSubMenu_SET_LOW[5][7]; + extern const char gSubMenu_SET_PWR[7][6]; extern const char gSubMenu_SET_PTT[2][8]; extern const char gSubMenu_SET_TOT[4][7]; extern const char gSubMenu_SET_LCK[2][9]; @@ -184,7 +184,7 @@ extern const char gSubMenu_RESET[2][4]; extern const char* const gSubMenu_F_LOCK[F_LOCK_LEN]; extern const char gSubMenu_RX_TX[4][6]; extern const char gSubMenu_BAT_TXT[3][8]; -extern const char gSubMenu_BATTYP[2][9]; +extern const char gSubMenu_BATTYP[3][9]; #ifndef ENABLE_FEAT_F4HWN extern const char gSubMenu_SCRAMBLER[11][7]; diff --git a/ui/status.c b/ui/status.c index fa55a15..d728144 100644 --- a/ui/status.c +++ b/ui/status.c @@ -223,10 +223,12 @@ void UI_DisplayStatus() { memcpy(line + x + 1, gFontLight, sizeof(gFontLight)); } + #ifdef ENABLE_FEAT_F4HWN_CHARGING_C else if (gChargingWithTypeC) { memcpy(line + x + 1, BITMAP_USB_C, sizeof(BITMAP_USB_C)); } + #endif // Battery unsigned int x2 = LCD_WIDTH - sizeof(BITMAP_BatteryLevel1) - 0; diff --git a/ui/welcome.c b/ui/welcome.c index d40e305..b6a139c 100644 --- a/ui/welcome.c +++ b/ui/welcome.c @@ -47,6 +47,7 @@ void UI_DisplayWelcome(void) { char WelcomeString0[16]; char WelcomeString1[16]; + char WelcomeString2[16]; memset(gStatusLine, 0, sizeof(gStatusLine)); @@ -69,7 +70,10 @@ void UI_DisplayWelcome(void) memset(WelcomeString0, 0, sizeof(WelcomeString0)); memset(WelcomeString1, 0, sizeof(WelcomeString1)); - sprintf(WelcomeString1, "%u.%02uV %u%%", + EEPROM_ReadBuffer(0x0EB0, WelcomeString0, 16); + EEPROM_ReadBuffer(0x0EC0, WelcomeString1, 16); + + sprintf(WelcomeString2, "%u.%02uV %u%%", gBatteryVoltageAverage / 100, gBatteryVoltageAverage % 100, BATTERY_VoltsToPercent(gBatteryVoltageAverage)); @@ -77,15 +81,30 @@ void UI_DisplayWelcome(void) if (gEeprom.POWER_ON_DISPLAY_MODE == POWER_ON_DISPLAY_MODE_VOLTAGE) { strcpy(WelcomeString0, "VOLTAGE"); + strcpy(WelcomeString1, WelcomeString2); } else if(gEeprom.POWER_ON_DISPLAY_MODE == POWER_ON_DISPLAY_MODE_ALL) { - EEPROM_ReadBuffer(0x0EB0, WelcomeString0, 16); + if(strlen(WelcomeString0) == 0 && strlen(WelcomeString1) == 0) + { + strcpy(WelcomeString0, "WELCOME"); + strcpy(WelcomeString1, WelcomeString2); + } + else if(strlen(WelcomeString0) == 0 || strlen(WelcomeString1) == 0) + { + if(strlen(WelcomeString0) == 0) + { + strcpy(WelcomeString0, WelcomeString1); + } + strcpy(WelcomeString1, WelcomeString2); + } } else if(gEeprom.POWER_ON_DISPLAY_MODE == POWER_ON_DISPLAY_MODE_MESSAGE) { - EEPROM_ReadBuffer(0x0EB0, WelcomeString0, 16); - EEPROM_ReadBuffer(0x0EC0, WelcomeString1, 16); + if(strlen(WelcomeString0) == 0) + { + strcpy(WelcomeString0, "WELCOME"); + } if(strlen(WelcomeString1) == 0) {