Merge pull request #198 from armel/feature_update_v3

Feature update v3
This commit is contained in:
Armel FAUVEAU
2024-07-21 20:15:53 +02:00
committed by GitHub
27 changed files with 466 additions and 310 deletions

110
Makefile
View File

@@ -4,57 +4,60 @@
# 1 = enable # 1 = enable
# ---- STOCK QUANSHENG FERATURES ---- # ---- STOCK QUANSHENG FERATURES ----
ENABLE_FMRADIO ?= 0 ENABLE_FMRADIO ?= 0
ENABLE_UART ?= 1 ENABLE_UART ?= 1
ENABLE_AIRCOPY ?= 0 ENABLE_AIRCOPY ?= 0
ENABLE_NOAA ?= 0 ENABLE_NOAA ?= 0
ENABLE_VOICE ?= 0 ENABLE_VOICE ?= 0
ENABLE_VOX ?= 1 ENABLE_VOX ?= 1
ENABLE_ALARM ?= 0 ENABLE_ALARM ?= 0
ENABLE_TX1750 ?= 1 ENABLE_TX1750 ?= 1
ENABLE_PWRON_PASSWORD ?= 0 ENABLE_PWRON_PASSWORD ?= 0
ENABLE_DTMF_CALLING ?= 0 ENABLE_DTMF_CALLING ?= 0
ENABLE_FLASHLIGHT ?= 1 ENABLE_FLASHLIGHT ?= 1
# ---- CUSTOM MODS ---- # ---- CUSTOM MODS ----
ENABLE_SPECTRUM ?= 1 ENABLE_SPECTRUM ?= 1
ENABLE_BIG_FREQ ?= 1 ENABLE_BIG_FREQ ?= 1
ENABLE_SMALL_BOLD ?= 1 ENABLE_SMALL_BOLD ?= 1
ENABLE_CUSTOM_MENU_LAYOUT ?= 1 ENABLE_CUSTOM_MENU_LAYOUT ?= 1
ENABLE_KEEP_MEM_NAME ?= 1 ENABLE_KEEP_MEM_NAME ?= 1
ENABLE_WIDE_RX ?= 1 ENABLE_WIDE_RX ?= 1
ENABLE_TX_WHEN_AM ?= 0 ENABLE_TX_WHEN_AM ?= 0
ENABLE_F_CAL_MENU ?= 0 ENABLE_F_CAL_MENU ?= 0
ENABLE_CTCSS_TAIL_PHASE_SHIFT ?= 0 ENABLE_CTCSS_TAIL_PHASE_SHIFT ?= 0
ENABLE_BOOT_BEEPS ?= 0 ENABLE_BOOT_BEEPS ?= 0
ENABLE_SHOW_CHARGE_LEVEL ?= 0 ENABLE_SHOW_CHARGE_LEVEL ?= 0
ENABLE_REVERSE_BAT_SYMBOL ?= 0 ENABLE_REVERSE_BAT_SYMBOL ?= 0
ENABLE_NO_CODE_SCAN_TIMEOUT ?= 1 ENABLE_NO_CODE_SCAN_TIMEOUT ?= 1
ENABLE_AM_FIX ?= 1 ENABLE_AM_FIX ?= 1
ENABLE_SQUELCH_MORE_SENSITIVE ?= 1 ENABLE_SQUELCH_MORE_SENSITIVE ?= 1
ENABLE_FASTER_CHANNEL_SCAN ?= 1 ENABLE_FASTER_CHANNEL_SCAN ?= 1
ENABLE_RSSI_BAR ?= 1 ENABLE_RSSI_BAR ?= 1
ENABLE_AUDIO_BAR ?= 1 ENABLE_AUDIO_BAR ?= 1
ENABLE_COPY_CHAN_TO_VFO ?= 1 ENABLE_COPY_CHAN_TO_VFO ?= 1
ENABLE_REDUCE_LOW_MID_TX_POWER?= 0 ENABLE_REDUCE_LOW_MID_TX_POWER ?= 0
ENABLE_BYP_RAW_DEMODULATORS ?= 0 ENABLE_BYP_RAW_DEMODULATORS ?= 0
ENABLE_BLMIN_TMP_OFF ?= 0 ENABLE_BLMIN_TMP_OFF ?= 0
ENABLE_SCAN_RANGES ?= 1 ENABLE_SCAN_RANGES ?= 1
ENABLE_FEAT_F4HWN ?= 1 ENABLE_FEAT_F4HWN ?= 1
ENABLE_FEAT_F4HWN_FIXED_PWR ?= 0 ENABLE_FEAT_F4HWN_SCREENSHOT ?= 0
ENABLE_FEAT_F4HWN_SCREENSHOT ?= 0 ENABLE_FEAT_F4HWN_SPECTRUM ?= 1
ENABLE_FEAT_F4HWN_PMR ?= 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 ---- # ---- DEBUGGING ----
ENABLE_AM_FIX_SHOW_DATA ?= 0 ENABLE_AM_FIX_SHOW_DATA ?= 0
ENABLE_AGC_SHOW_DATA ?= 0 ENABLE_AGC_SHOW_DATA ?= 0
ENABLE_UART_RW_BK_REGS ?= 0 ENABLE_UART_RW_BK_REGS ?= 0
# ---- COMPILER/LINKER OPTIONS ---- # ---- COMPILER/LINKER OPTIONS ----
ENABLE_CLANG ?= 0 ENABLE_CLANG ?= 0
ENABLE_SWD ?= 0 ENABLE_SWD ?= 0
ENABLE_OVERLAY ?= 0 ENABLE_OVERLAY ?= 0
ENABLE_LTO ?= 1 ENABLE_LTO ?= 1
############################################################# #############################################################
@@ -213,7 +216,7 @@ ifeq ($(ENABLE_FEAT_F4HWN),1)
VERSION_STRING_1 ?= v0.22 VERSION_STRING_1 ?= v0.22
AUTHOR_STRING_2 ?= F4HWN AUTHOR_STRING_2 ?= F4HWN
VERSION_STRING_2 ?= v3.0 VERSION_STRING_2 ?= v3.1
AUTHOR_STRING ?= $(AUTHOR_STRING_1)+$(AUTHOR_STRING_2) AUTHOR_STRING ?= $(AUTHOR_STRING_1)+$(AUTHOR_STRING_2)
VERSION_STRING ?= $(VERSION_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_1=\"$(AUTHOR_STRING_1)\" -DVERSION_STRING_1=\"$(VERSION_STRING_1)\"
CFLAGS += -DAUTHOR_STRING_2=\"$(AUTHOR_STRING_2)\" -DVERSION_STRING_2=\"$(VERSION_STRING_2)\" CFLAGS += -DAUTHOR_STRING_2=\"$(AUTHOR_STRING_2)\" -DVERSION_STRING_2=\"$(VERSION_STRING_2)\"
endif endif
ifeq ($(ENABLE_FEAT_F4HWN_FIXED_PWR),1)
CFLAGS += -DENABLE_FEAT_F4HWN_FIXED_PWR
endif
ifeq ($(ENABLE_FEAT_F4HWN_SCREENSHOT),1) ifeq ($(ENABLE_FEAT_F4HWN_SCREENSHOT),1)
CFLAGS += -DENABLE_FEAT_F4HWN_SCREENSHOT CFLAGS += -DENABLE_FEAT_F4HWN_SCREENSHOT
endif 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) ifeq ($(ENABLE_FEAT_F4HWN_PMR),1)
CFLAGS += -DENABLE_FEAT_F4HWN_PMR CFLAGS += -DENABLE_FEAT_F4HWN_PMR
endif 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 =
LDFLAGS += -z noexecstack -mcpu=cortex-m0 -nostartfiles -Wl,-T,firmware.ld -Wl,--gc-sections LDFLAGS += -z noexecstack -mcpu=cortex-m0 -nostartfiles -Wl,-T,firmware.ld -Wl,--gc-sections

View File

@@ -26,7 +26,7 @@ Anyway, have fun.
# Donations # 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). Thats 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). Thats so kind of them. Thanks so much 🙏🏻
## Table of Contents ## Table of Contents
@@ -43,9 +43,15 @@ Special thanks to Jean-Cyrille F6IWW, Fabrice 14RC123, David F4BPP, Olivier 14RC
## Main features: ## 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 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: * improve UI:
* menu index is always visible, even if a menu is selected, * menu index is always visible, even if a menu is selected,
* s-meter new design (Classic or Tiny), * 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, * improve memory channel input,
* and more... * and more...
* new menu entries and changes: * 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 SetPtt menu to set PTT mode (Classic or OnePush),
* add SetTot menu to set TOT alert (Off, Sound, Visual, All), * add SetTot menu to set TOT alert (Off, Sound, Visual, All),
* add SetCtr menu to set contrast (0 to 15), * 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 HAM CA F Lock band (for Canadian zone),
* add GMRS/FRS/MURS F Lock (for North America zone), * add GMRS/FRS/MURS F Lock (for North America zone),
* remove blink and SOS functionality, * 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: * improve status bar:
* add SetPtt mode in status bar, * add SetPtt mode in status bar,
* change font and bitmaps, * change font and bitmaps,
* move USB icon to left of battery information, * move USB icon to left of battery information,
* add RX and TX timers, * add RX and TX timers,
* improve lists and scan lists options: * improve lists and scan lists options:
* add new list 3 * add new list 3,
* add new list 0 (channel without list...) * add new list 0 (channel without list...),
* add new scan lists options * add new scan lists options,
* scan list 0 (all channels without list) * scan list 0 (all channels without list),
* scan list 1 * scan list 1,
* scan list 2 * scan list 2,
* scan list 3 * scan list 3,
* scan lists [1, 2, 3] * scan lists [1, 2, 3],
* scan all (all channels with ou without list) * scan all (all channels with ou without list),
* add scan list shortcuts * add scan list shortcuts,
* new actions: * new actions:
* RX MODE, * RX MODE,
* MAIN ONLY, * MAIN ONLY,

View File

@@ -121,7 +121,7 @@ static_assert(ARRAY_SIZE(action_opt_table) == ACTION_OPT_LEN);
void ACTION_Power(void) void ACTION_Power(void)
{ {
if (++gTxVfo->OUTPUT_POWER > OUTPUT_POWER_HIGH) if (++gTxVfo->OUTPUT_POWER > OUTPUT_POWER_HIGH)
gTxVfo->OUTPUT_POWER = OUTPUT_POWER_LOW; gTxVfo->OUTPUT_POWER = OUTPUT_POWER_LOW1;
gRequestSaveChannel = 1; gRequestSaveChannel = 1;
@@ -522,12 +522,24 @@ void ACTION_Ptt(void)
void ACTION_Wn(void) void ACTION_Wn(void)
{ {
gTxVfo->CHANNEL_BANDWIDTH = (gTxVfo->CHANNEL_BANDWIDTH == 0) ? 1: 0; if (FUNCTION_IsRx())
#ifdef ENABLE_AM_FIX {
BK4819_SetFilterBandwidth(gTxVfo->CHANNEL_BANDWIDTH, true); gRxVfo->CHANNEL_BANDWIDTH = (gRxVfo->CHANNEL_BANDWIDTH == 0) ? 1: 0;
#else #ifdef ENABLE_AM_FIX
BK4819_SetFilterBandwidth(gTxVfo->CHANNEL_BANDWIDTH, false); BK4819_SetFilterBandwidth(gRxVfo->CHANNEL_BANDWIDTH, true);
#endif #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) void ACTION_BackLight(void)

View File

@@ -1469,30 +1469,16 @@ void APP_TimeSlice500ms(void)
if (IS_MR_CHANNEL(gTxVfo->CHANNEL_SAVE) && (gInputBoxIndex == 1 || gInputBoxIndex == 2)) 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(); SETTINGS_SaveVfoIndices();
} }
cancelUserInputModes(); 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 (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); SETTINGS_SaveChannel(gTxVfo->CHANNEL_SAVE, gEeprom.TX_VFO, gTxVfo, gRequestSaveChannel);
if (!SCANNER_IsScanning() && gVfoConfigureMode == VFO_CONFIGURE_NONE) if (!SCANNER_IsScanning() && gVfoConfigureMode == VFO_CONFIGURE_NONE)

View File

@@ -224,9 +224,7 @@ static void processFKeyFunction(const KEY_Code_t Key, const bool beep)
#endif #endif
} }
else { else {
#ifdef ENABLE_VOX
toggle_chan_scanlist(); toggle_chan_scanlist();
#endif
} }
break; break;
@@ -238,8 +236,8 @@ static void processFKeyFunction(const KEY_Code_t Key, const bool beep)
case KEY_7: case KEY_7:
#ifdef ENABLE_VOX #ifdef ENABLE_VOX
ACTION_Vox(); ACTION_Vox();
#else //#else
toggle_chan_scanlist(); // toggle_chan_scanlist();
#endif #endif
break; 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; const uint8_t Vfo = gEeprom.TX_VFO;
if(End)
{
gInputBoxIndex = 0;
}
if (!RADIO_CheckValidChannel(Channel, false, 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; return;
} }
gBeepToPlay = BEEP_NONE;
#ifdef ENABLE_VOICE #ifdef ENABLE_VOICE
gAnotherVoiceID = (VOICE_ID_t)Key; gAnotherVoiceID = (VOICE_ID_t)Key;
#endif #endif
@@ -340,14 +338,45 @@ void channelMove(uint16_t Channel, bool End)
gVfoConfigureMode = VFO_CONFIGURE_RELOAD; gVfoConfigureMode = VFO_CONFIGURE_RELOAD;
RADIO_ConfigureChannel(gEeprom.TX_VFO, gVfoConfigureMode); RADIO_ConfigureChannel(gEeprom.TX_VFO, gVfoConfigureMode);
if(End)
{
SETTINGS_SaveVfoIndices();
}
return; 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) static void MAIN_Key_DIGITS(KEY_Code_t Key, bool bKeyPressed, bool bKeyHeld)
{ {
if (bKeyHeld) { // key held down 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; const uint8_t Vfo = gEeprom.TX_VFO;
gKeyInputCountdown = key_input_timeout_500ms;
INPUTBOX_Append(Key); INPUTBOX_Append(Key);
gKeyInputCountdown = key_input_timeout_500ms;
channelMoveSwitch();
gRequestDisplayScreen = DISPLAY_MAIN; gRequestDisplayScreen = DISPLAY_MAIN;
if (IS_MR_CHANNEL(gTxVfo->CHANNEL_SAVE)) { // user is entering channel number if (IS_MR_CHANNEL(gTxVfo->CHANNEL_SAVE)) { // user is entering channel number
gKeyInputCountdown = (key_input_timeout_500ms / 5); // short time... gKeyInputCountdown = (key_input_timeout_500ms / 5); // short time...
if (gInputBoxIndex != 3) { #ifdef ENABLE_VOICE
#ifdef ENABLE_VOICE gAnotherVoiceID = (VOICE_ID_t)Key;
gAnotherVoiceID = (VOICE_ID_t)Key; #endif
#endif
gRequestDisplayScreen = DISPLAY_MAIN; return;
return;
}
channelMove(((gInputBox[0] * 100) + (gInputBox[1] * 10) + gInputBox[2]) - 1, true);
} }
// #ifdef ENABLE_NOAA // #ifdef ENABLE_NOAA

View File

@@ -20,7 +20,7 @@
#include "driver/keyboard.h" #include "driver/keyboard.h"
void MAIN_ProcessKeys(KEY_Code_t Key, bool bKeyPressed, bool bKeyHeld); void MAIN_ProcessKeys(KEY_Code_t Key, bool bKeyPressed, bool bKeyHeld);
void channelMove(uint16_t Channel, bool End); void channelMoveSwitch(void);
#endif #endif

View File

@@ -361,7 +361,7 @@ int MENU_GetLimits(uint8_t menu_id, int32_t *pMin, int32_t *pMax)
case MENU_BATTYP: case MENU_BATTYP:
//*pMin = 0; //*pMin = 0;
*pMax = 1; *pMax = 2;
break; break;
case MENU_F1SHRT: case MENU_F1SHRT:
@@ -374,9 +374,8 @@ int MENU_GetLimits(uint8_t menu_id, int32_t *pMin, int32_t *pMax)
break; break;
#ifdef ENABLE_FEAT_F4HWN #ifdef ENABLE_FEAT_F4HWN
case MENU_SET_LOW: case MENU_SET_PWR:
//*pMin = 0; *pMax = ARRAY_SIZE(gSubMenu_SET_PWR) - 1;
*pMax = ARRAY_SIZE(gSubMenu_SET_LOW) - 1;
break; break;
case MENU_SET_PTT: case MENU_SET_PTT:
//*pMin = 0; //*pMin = 0;
@@ -866,8 +865,8 @@ void MENU_AcceptSetting(void)
break; break;
#ifdef ENABLE_FEAT_F4HWN #ifdef ENABLE_FEAT_F4HWN
case MENU_SET_LOW: case MENU_SET_PWR:
gSetting_set_low = gSubMenuSelection; gSetting_set_pwr = gSubMenuSelection;
gRequestSaveChannel = 1; gRequestSaveChannel = 1;
break; break;
case MENU_SET_PTT: case MENU_SET_PTT:
@@ -1285,8 +1284,8 @@ void MENU_ShowCurrentSetting(void)
} }
#ifdef ENABLE_FEAT_F4HWN #ifdef ENABLE_FEAT_F4HWN
case MENU_SET_LOW: case MENU_SET_PWR:
gSubMenuSelection = gSetting_set_low; gSubMenuSelection = gSetting_set_pwr;
break; break;
case MENU_SET_PTT: case MENU_SET_PTT:
gSubMenuSelection = gSetting_set_ptt_session; gSubMenuSelection = gSetting_set_ptt_session;

View File

@@ -31,6 +31,10 @@
#include "screenshot.h" #include "screenshot.h"
#endif #endif
#ifdef ENABLE_FEAT_F4HWN_SPECTRUM
#include "driver/eeprom.h"
#endif
struct FrequencyBandInfo { struct FrequencyBandInfo {
uint32_t lower; uint32_t lower;
uint32_t upper; uint32_t upper;
@@ -105,6 +109,47 @@ RegisterSpec registerSpecs[] = {
uint16_t statuslineUpdateTimer = 0; 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) { static uint8_t DBm2S(int dbm) {
uint8_t i = 0; uint8_t i = 0;
dbm *= -1; dbm *= -1;
@@ -671,7 +716,7 @@ static void Blacklist() {
#ifdef ENABLE_SCAN_RANGES #ifdef ENABLE_SCAN_RANGES
static bool IsBlacklisted(uint16_t idx) 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++) for(uint8_t i = 0; i < ARRAY_SIZE(blacklistFreqs); i++)
if(blacklistFreqs[i] == idx) if(blacklistFreqs[i] == idx)
return true; return true;
@@ -932,6 +977,9 @@ static void OnKeyDown(uint8_t key) {
menuState = 0; menuState = 0;
break; break;
} }
#ifdef ENABLE_FEAT_F4HWN_SPECTRUM
SaveSettings();
#endif
DeInitSpectrum(); DeInitSpectrum();
break; break;
default: default:
@@ -1321,6 +1369,9 @@ static void Tick() {
void APP_RunSpectrum() { void APP_RunSpectrum() {
// TX here coz it always? set to active VFO // TX here coz it always? set to active VFO
vfo = gEeprom.TX_VFO; vfo = gEeprom.TX_VFO;
#ifdef ENABLE_FEAT_F4HWN_SPECTRUM
LoadSettings();
#endif
// set the current frequency in the middle of the display // set the current frequency in the middle of the display
#ifdef ENABLE_SCAN_RANGES #ifdef ENABLE_SCAN_RANGES
if(gScanRangeStart) { if(gScanRangeStart) {
@@ -1345,11 +1396,14 @@ void APP_RunSpectrum() {
redrawScreen = true; redrawScreen = true;
newScanStart = true; newScanStart = true;
ToggleRX(true), ToggleRX(false); // hack to prevent noise when squelch off ToggleRX(true), ToggleRX(false); // hack to prevent noise when squelch off
RADIO_SetModulation(settings.modulationType = gTxVfo->Modulation); 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(); RelaunchScan();

Binary file not shown.

Binary file not shown.

Binary file not shown.

View File

@@ -272,6 +272,14 @@ const uint8_t BITMAP_Ready[7] =
0b00000010, 0b00000010,
}; };
const uint8_t BITMAP_PowerUser[3] =
{ // 'arrow' symbol
0b00111110,
0b00011100,
0b00001000,
};
#ifndef ENABLE_CUSTOM_MENU_LAYOUT #ifndef ENABLE_CUSTOM_MENU_LAYOUT
const uint8_t BITMAP_CurrentIndicator[8] = { const uint8_t BITMAP_CurrentIndicator[8] = {
0xFF, 0xFF,

View File

@@ -36,6 +36,7 @@ extern const uint8_t BITMAP_ScanList2[7];
extern const uint8_t BITMAP_ScanList3[7]; extern const uint8_t BITMAP_ScanList3[7];
extern const uint8_t BITMAP_ScanList123[19]; extern const uint8_t BITMAP_ScanList123[19];
extern const uint8_t BITMAP_ScanListAll[19]; extern const uint8_t BITMAP_ScanListAll[19];
extern const uint8_t BITMAP_PowerUser[3];
extern const uint8_t BITMAP_compand[6]; extern const uint8_t BITMAP_compand[6];
#ifndef ENABLE_CUSTOM_MENU_LAYOUT #ifndef ENABLE_CUSTOM_MENU_LAYOUT

View File

@@ -227,14 +227,13 @@ int32_t TX_freq_check(const uint32_t Frequency)
if (Frequency >= 44600625 && Frequency <= 44619375) if (Frequency >= 44600625 && Frequency <= 44619375)
return 0; return 0;
break; break;
#endif
#ifdef ENABLE_FEAT_F4HWN_GMRS_FRS_MURS
case F_LOCK_GMRS_FRS_MURS: case F_LOCK_GMRS_FRS_MURS:
// https://forums.radioreference.com/threads/the-great-unofficial-radioreference-frs-gmrs-murs-fact-sheet.275370/ // https://forums.radioreference.com/threads/the-great-unofficial-radioreference-frs-gmrs-murs-fact-sheet.275370/
if (Frequency >= 46256250 && Frequency <= 46271250) // FRS/GMRS if ((Frequency >= 46255000 && Frequency <= 46272500) ||
return 0; (Frequency >= 46755000 && Frequency <= 46772500)) // FRS/GMRS
if (Frequency >= 46756250 && Frequency <= 46771250) // FRS ONLY
return 0;
if (Frequency >= 46255000 && Frequency <= 46272500) // GMRS ONLY
return 0; return 0;
if (Frequency == 15182000 || if (Frequency == 15182000 ||
Frequency == 15188000 || Frequency == 15188000 ||
@@ -243,7 +242,9 @@ int32_t TX_freq_check(const uint32_t Frequency)
Frequency == 15460000) // MURS Frequency == 15460000) // MURS
return 0; return 0;
break; break;
#endif
#ifdef ENABLE_FEAT_F4HWN_CA
case F_LOCK_CA: case F_LOCK_CA:
if (Frequency >= 14400000 && Frequency < 14800000) if (Frequency >= 14400000 && Frequency < 14800000)
return 0; return 0;

View File

@@ -25,6 +25,7 @@
#include "ui/battery.h" #include "ui/battery.h"
#include "ui/menu.h" #include "ui/menu.h"
#include "ui/ui.h" #include "ui/ui.h"
//#include "debugging.h"
uint16_t gBatteryCalibration[6]; uint16_t gBatteryCalibration[6];
uint16_t gBatteryCurrentVoltage; uint16_t gBatteryCurrentVoltage;
@@ -44,14 +45,12 @@ typedef enum {
BATTERY_LOW_CONFIRMED BATTERY_LOW_CONFIRMED
} BatteryLow_t; } BatteryLow_t;
uint16_t lowBatteryCountdown; uint16_t lowBatteryCountdown;
const uint16_t lowBatteryPeriod = 30; const uint16_t lowBatteryPeriod = 30;
volatile uint16_t gPowerSave_10ms; volatile uint16_t gPowerSave_10ms;
const uint16_t Voltage2PercentageTable[][7][3] = {
const uint16_t Voltage2PercentageTable[][7][2] = {
[BATTERY_TYPE_1600_MAH] = { [BATTERY_TYPE_1600_MAH] = {
{828, 100}, {828, 100},
{814, 97 }, {814, 97 },
@@ -71,15 +70,28 @@ const uint16_t Voltage2PercentageTable[][7][2] = {
{630, 0 }, {630, 0 },
{0, 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]) == static_assert(
ARRAY_SIZE(Voltage2PercentageTable[BATTERY_TYPE_2200_MAH])); (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) 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; const int mulipl = 1000;
for (unsigned int i = 1; i < ARRAY_SIZE(Voltage2PercentageTable[BATTERY_TYPE_2200_MAH]); i++) { for (unsigned int i = 1; i < ARRAY_SIZE(Voltage2PercentageTable[BATTERY_TYPE_2200_MAH]); i++) {
if (voltage_10mV > crv[i][0]) { if (voltage_10mV > crv[i][0]) {
@@ -102,13 +114,22 @@ void BATTERY_GetReadings(const bool bDisplayBatteryLevel)
if(gBatteryVoltageAverage > 890) if(gBatteryVoltageAverage > 890)
gBatteryDisplayLevel = 7; // battery overvoltage 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 gBatteryDisplayLevel = 0; // battery critical
else { else {
gBatteryDisplayLevel = 1; gBatteryDisplayLevel = 1;
const uint8_t levels[] = {5,17,41,65,88}; const uint8_t levels[] = {5,17,41,65,88};
uint8_t perc = BATTERY_VoltsToPercent(gBatteryVoltageAverage); 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]) { if (perc > levels[i-2]) {
gBatteryDisplayLevel = i; gBatteryDisplayLevel = i;
break; break;

View File

@@ -37,6 +37,7 @@ extern volatile uint16_t gPowerSave_10ms;
typedef enum { typedef enum {
BATTERY_TYPE_1600_MAH, BATTERY_TYPE_1600_MAH,
BATTERY_TYPE_2200_MAH, BATTERY_TYPE_2200_MAH,
BATTERY_TYPE_3500_MAH,
BATTERY_TYPE_UNKNOWN BATTERY_TYPE_UNKNOWN
} BATTERY_Type_t; } BATTERY_Type_t;

8
main.c
View File

@@ -123,11 +123,17 @@ void Main(void)
if (BootMode == BOOT_MODE_F_LOCK) if (BootMode == BOOT_MODE_F_LOCK)
{ {
gF_LOCK = true; // flag to say include the hidden menu items gF_LOCK = true; // flag to say include the hidden menu items
#ifdef ENABLE_FEAT_F4HWN #ifdef ENABLE_FEAT_F4HWN
gEeprom.KEY_LOCK = 0; gEeprom.KEY_LOCK = 0;
SETTINGS_SaveSettings(); 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 #endif
} }

2
misc.c
View File

@@ -105,7 +105,7 @@ enum BacklightOnRxTx_t gSetting_backlight_on_tx_rx;
#endif #endif
#ifdef ENABLE_FEAT_F4HWN #ifdef ENABLE_FEAT_F4HWN
uint8_t gSetting_set_low = 1; uint8_t gSetting_set_pwr = 1;
bool gSetting_set_ptt = 0; bool gSetting_set_ptt = 0;
uint8_t gSetting_set_tot = 0; uint8_t gSetting_set_tot = 0;
uint8_t gSetting_set_ctr = 11; uint8_t gSetting_set_ctr = 11;

2
misc.h
View File

@@ -157,7 +157,7 @@ extern enum BacklightOnRxTx_t gSetting_backlight_on_tx_rx;
#endif #endif
#ifdef ENABLE_FEAT_F4HWN #ifdef ENABLE_FEAT_F4HWN
extern uint8_t gSetting_set_low; extern uint8_t gSetting_set_pwr;
extern bool gSetting_set_ptt; extern bool gSetting_set_ptt;
extern uint8_t gSetting_set_tot; extern uint8_t gSetting_set_tot;
extern uint8_t gSetting_set_ctr; extern uint8_t gSetting_set_ctr;

181
radio.c
View File

@@ -54,8 +54,6 @@ const char gModulationStr[MODULATION_UKNOWN][4] = {
#endif #endif
}; };
bool RADIO_CheckValidChannel(uint16_t channel, bool checkScanList, uint8_t scanList) bool RADIO_CheckValidChannel(uint16_t channel, bool checkScanList, uint8_t scanList)
{ {
// return true if the channel appears valid // 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->StepFrequency = gStepFrequencyTable[pInfo->STEP_SETTING];
pInfo->CHANNEL_SAVE = ChannelSave; pInfo->CHANNEL_SAVE = ChannelSave;
pInfo->FrequencyReverse = false; pInfo->FrequencyReverse = false;
pInfo->OUTPUT_POWER = OUTPUT_POWER_LOW; pInfo->OUTPUT_POWER = OUTPUT_POWER_LOW1;
pInfo->freq_config_RX.Frequency = Frequency; pInfo->freq_config_RX.Frequency = Frequency;
pInfo->freq_config_TX.Frequency = Frequency; pInfo->freq_config_TX.Frequency = Frequency;
pInfo->pRX = &pInfo->freq_config_RX; 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->FrequencyReverse = false;
pVfo->CHANNEL_BANDWIDTH = BK4819_FILTER_BW_WIDE; pVfo->CHANNEL_BANDWIDTH = BK4819_FILTER_BW_WIDE;
pVfo->OUTPUT_POWER = OUTPUT_POWER_LOW; pVfo->OUTPUT_POWER = OUTPUT_POWER_LOW1;
pVfo->BUSY_CHANNEL_LOCK = false; pVfo->BUSY_CHANNEL_LOCK = false;
} }
else else
@@ -337,8 +335,8 @@ void RADIO_ConfigureChannel(const unsigned int VFO, const unsigned int configure
const uint8_t d4 = data[4]; const uint8_t d4 = data[4];
pVfo->FrequencyReverse = !!((d4 >> 0) & 1u); pVfo->FrequencyReverse = !!((d4 >> 0) & 1u);
pVfo->CHANNEL_BANDWIDTH = !!((d4 >> 1) & 1u); pVfo->CHANNEL_BANDWIDTH = !!((d4 >> 1) & 1u);
pVfo->OUTPUT_POWER = ((d4 >> 2) & 3u); pVfo->OUTPUT_POWER = ((d4 >> 2) & 7u);
pVfo->BUSY_CHANNEL_LOCK = !!((d4 >> 4) & 1u); pVfo->BUSY_CHANNEL_LOCK = !!((d4 >> 5) & 1u);
} }
if (data[5] == 0xFF) 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 // 1F30 32 32 32 64 64 64 8c 8c 8c ff ff ff ff ff ff ff 470 MHz
uint8_t Txp[3]; 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
#ifdef ENABLE_FEAT_F4HWN_FIXED_PWR // make low and mid even lower
// make low and mid even lower // and use calibration values
// and fix values // be aware with toxic fucking closed firmwares
// because of 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; case 0:
shift[1] = 1; Txp[p] = (Txp[p] * 4) / 25; //+ shift[pInfo->OUTPUT_POWER];
shift[2] = 2; break;
shift[3] = 2; case 1:
shift[4] = 2; Txp[p] = (Txp[p] * 4) / 19; // + shift[pInfo->OUTPUT_POWER];
shift[5] = 2; break;
shift[6] = 2; 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 #else
#ifdef ENABLE_REDUCE_LOW_MID_TX_POWER #ifdef ENABLE_REDUCE_LOW_MID_TX_POWER
// make low and mid even lower // make low and mid even lower

View File

@@ -317,7 +317,7 @@ void SETTINGS_InitEEPROM(void)
#ifdef ENABLE_FEAT_F4HWN #ifdef ENABLE_FEAT_F4HWN
// 1FF0..0x1FF7 // 1FF0..0x1FF7
EEPROM_ReadBuffer(0x1FF0, Data, 8); 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_ptt = (((Data[7] & 0x0F)) < 2) ? ((Data[7] & 0x0F)) : 0;
gSetting_set_tot = (((Data[6] & 0xF0) >> 4) < 4) ? ((Data[6] & 0xF0) >> 4) : 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[5] = ((tmp << 4) | (gSetting_set_ctr & 0x0F));
State[6] = ((gSetting_set_tot << 4) | (gSetting_set_eot & 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; 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[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[3] = (pVFO->Modulation << 4) | pVFO->TX_OFFSET_FREQUENCY_DIRECTION;
State._8[4] = 0 State._8[4] = 0
| (pVFO->BUSY_CHANNEL_LOCK << 4) | (pVFO->BUSY_CHANNEL_LOCK << 5)
| (pVFO->OUTPUT_POWER << 2) | (pVFO->OUTPUT_POWER << 2)
| (pVFO->CHANNEL_BANDWIDTH << 1) | (pVFO->CHANNEL_BANDWIDTH << 1)
| (pVFO->FrequencyReverse << 0); | (pVFO->FrequencyReverse << 0);

View File

@@ -41,7 +41,7 @@ typedef enum POWER_OnDisplayMode_t POWER_OnDisplayMode_t;
enum TxLockModes_t { enum TxLockModes_t {
F_LOCK_DEF, //all default frequencies + configurable F_LOCK_DEF, //all default frequencies + configurable
F_LOCK_FCC, F_LOCK_FCC,
#ifdef ENABLE_FEAT_F4HWN_PMR #ifdef ENABLE_FEAT_F4HWN_CA
F_LOCK_CA, F_LOCK_CA,
#endif #endif
F_LOCK_CE, F_LOCK_CE,
@@ -50,6 +50,8 @@ enum TxLockModes_t {
F_LOCK_438, F_LOCK_438,
#ifdef ENABLE_FEAT_F4HWN_PMR #ifdef ENABLE_FEAT_F4HWN_PMR
F_LOCK_PMR, F_LOCK_PMR,
#endif
#ifdef ENABLE_FEAT_F4HWN_GMRS_FRS_MURS
F_LOCK_GMRS_FRS_MURS, F_LOCK_GMRS_FRS_MURS,
#endif #endif
F_LOCK_ALL, // disable TX on all frequencies F_LOCK_ALL, // disable TX on all frequencies
@@ -82,7 +84,12 @@ enum {
}; };
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_MID,
OUTPUT_POWER_HIGH OUTPUT_POWER_HIGH
}; };

View File

@@ -1072,9 +1072,13 @@ void UI_DisplayMain(void)
{ // TX power level { // TX power level
switch (gRxVfo->OUTPUT_POWER) switch (gRxVfo->OUTPUT_POWER)
{ {
case OUTPUT_POWER_LOW: Level = 2; break; case OUTPUT_POWER_LOW1: Level = 2; break;
case OUTPUT_POWER_MID: Level = 4; break; case OUTPUT_POWER_LOW2: Level = 2; break;
case OUTPUT_POWER_HIGH: Level = 6; 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 else
@@ -1148,7 +1152,7 @@ void UI_DisplayMain(void)
if (isMainOnly(true)) 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); UI_PrintStringSmallNormal(t, LCD_WIDTH + 2, 0, line + 1);
if (isMainOnly(false) && !gDTMF_InputMode) if (isMainOnly(false) && !gDTMF_InputMode)
@@ -1190,38 +1194,39 @@ void UI_DisplayMain(void)
if (state == VFO_STATE_NORMAL || state == VFO_STATE_ALARM) if (state == VFO_STATE_NORMAL || state == VFO_STATE_ALARM)
{ // show the TX power { // show the TX power
int i = vfoInfo->OUTPUT_POWER % 3; uint8_t currentPower = vfoInfo->OUTPUT_POWER % 8;
#if ENABLE_FEAT_F4HWN uint8_t arrowPos = 19;
if (isMainOnly(true)) bool userPower = false;
{
const char pwr_short[][2] = {"L","M","H"}; if(currentPower == OUTPUT_POWER_USER)
if(i == 0)
{ {
sprintf(String, "%s%d", pwr_short[i], gSetting_set_low + 1); currentPower = gSetting_set_pwr;
userPower = true;
} }
else else
{ {
sprintf(String, "%s", pwr_short[i]); currentPower--;
userPower = false;
} }
UI_PrintStringSmallNormal(String, LCD_WIDTH + 44, 0, line + 1);
} if (isMainOnly(true))
else
{
const char pwr_long[][5] = {"LOW", "MID", "HIGH"};
if(i == 0)
{ {
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 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) 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); UI_PrintStringSmallBold(String, 92, 0, 6);
for (uint8_t i = 92; i < 128; i++) for (uint8_t i = 92; i < 128; i++)
{ {
gFrameBuffer[6][i] ^= 0xFF; gFrameBuffer[6][i] ^= 0x7F;
} }
} }
#endif #endif

View File

@@ -134,7 +134,7 @@ const t_menu_item MenuList[] =
{"RxMode", MENU_TDR }, {"RxMode", MENU_TDR },
{"Sql", MENU_SQL }, {"Sql", MENU_SQL },
#ifdef ENABLE_FEAT_F4HWN #ifdef ENABLE_FEAT_F4HWN
{"SetLow", MENU_SET_LOW }, {"SetPwr", MENU_SET_PWR },
{"SetPtt", MENU_SET_PTT }, {"SetPtt", MENU_SET_PTT },
{"SetTot", MENU_SET_TOT }, {"SetTot", MENU_SET_TOT },
{"SetEot", MENU_SET_EOT }, {"SetEot", MENU_SET_EOT },
@@ -166,9 +166,14 @@ const t_menu_item MenuList[] =
const uint8_t FIRST_HIDDEN_MENU_ITEM = MENU_F_LOCK; 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", "MID",
"HIGH" "HIGH"
}; };
@@ -290,7 +295,7 @@ const char * const gSubMenu_F_LOCK[] =
{ {
"DEFAULT+\n137-174\n400-470", "DEFAULT+\n137-174\n400-470",
"FCC HAM\n144-148\n420-450", "FCC HAM\n144-148\n420-450",
#ifdef ENABLE_FEAT_F4HWN_PMR #ifdef ENABLE_FEAT_F4HWN_CA
"CA HAM\n144-148\n430-450", "CA HAM\n144-148\n430-450",
#endif #endif
"CE HAM\n144-146\n430-440", "CE HAM\n144-146\n430-440",
@@ -299,6 +304,8 @@ const char * const gSubMenu_F_LOCK[] =
"137-174\n400-438", "137-174\n400-438",
#ifdef ENABLE_FEAT_F4HWN_PMR #ifdef ENABLE_FEAT_F4HWN_PMR
"PMR 446", "PMR 446",
#endif
#ifdef ENABLE_FEAT_F4HWN_GMRS_FRS_MURS
"GMRS\nFRS\nMURS", "GMRS\nFRS\nMURS",
#endif #endif
"DISABLE\nALL", "DISABLE\nALL",
@@ -323,7 +330,8 @@ const char gSubMenu_BAT_TXT[][8] =
const char gSubMenu_BATTYP[][9] = const char gSubMenu_BATTYP[][9] =
{ {
"1600mAh", "1600mAh",
"2200mAh" "2200mAh",
"3500mAh"
}; };
#ifndef ENABLE_FEAT_F4HWN #ifndef ENABLE_FEAT_F4HWN
@@ -344,13 +352,15 @@ const char gSubMenu_SCRAMBLER[][7] =
#endif #endif
#ifdef ENABLE_FEAT_F4HWN #ifdef ENABLE_FEAT_F4HWN
const char gSubMenu_SET_LOW[][7] = const char gSubMenu_SET_PWR[][6] =
{ {
"< 20mW", "< 20m",
"125mW", "125m",
"250mW", "250m",
"500mW", "500m",
"1W" "1",
"2",
"5"
}; };
const char gSubMenu_SET_PTT[][8] = const char gSubMenu_SET_PTT[][8] =
@@ -582,7 +592,14 @@ void UI_DisplayMenu(void)
} }
case MENU_TXP: 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; break;
case MENU_R_DCS: case MENU_R_DCS:
@@ -903,7 +920,11 @@ void UI_DisplayMenu(void)
break; break;
case MENU_F_LOCK: case MENU_F_LOCK:
#ifdef ENABLE_FEAT_F4HWN
if(!gIsInSubMenu && gUnlockAllTxConfCnt>0 && gUnlockAllTxConfCnt<3)
#else
if(!gIsInSubMenu && gUnlockAllTxConfCnt>0 && gUnlockAllTxConfCnt<10) if(!gIsInSubMenu && gUnlockAllTxConfCnt>0 && gUnlockAllTxConfCnt<10)
#endif
strcpy(String, "READ\nMANUAL"); strcpy(String, "READ\nMANUAL");
else else
strcpy(String, gSubMenu_F_LOCK[gSubMenuSelection]); strcpy(String, gSubMenu_F_LOCK[gSubMenuSelection]);
@@ -944,10 +965,10 @@ void UI_DisplayMenu(void)
break; break;
#ifdef ENABLE_FEAT_F4HWN #ifdef ENABLE_FEAT_F4HWN
case MENU_SET_LOW: case MENU_SET_PWR:
strcpy(String, gSubMenu_SET_LOW[gSubMenuSelection]); sprintf(String, "%s\n%sW", gSubMenu_TXP[gSubMenuSelection + 1], gSubMenu_SET_PWR[gSubMenuSelection]);
break; break;
case MENU_SET_PTT: case MENU_SET_PTT:
strcpy(String, gSubMenu_SET_PTT[gSubMenuSelection]); strcpy(String, gSubMenu_SET_PTT[gSubMenuSelection]);
break; break;

View File

@@ -123,7 +123,7 @@ enum
MENU_F_CALI, // reference xtal calibration MENU_F_CALI, // reference xtal calibration
#endif #endif
#ifdef ENABLE_FEAT_F4HWN #ifdef ENABLE_FEAT_F4HWN
MENU_SET_LOW, MENU_SET_PWR,
MENU_SET_PTT, MENU_SET_PTT,
MENU_SET_TOT, MENU_SET_TOT,
MENU_SET_EOT, MENU_SET_EOT,
@@ -145,7 +145,7 @@ enum
extern const uint8_t FIRST_HIDDEN_MENU_ITEM; extern const uint8_t FIRST_HIDDEN_MENU_ITEM;
extern const t_menu_item MenuList[]; 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_SFT_D[3][4];
extern const char gSubMenu_W_N[2][7]; extern const char gSubMenu_W_N[2][7];
extern const char gSubMenu_OFF_ON[2][4]; extern const char gSubMenu_OFF_ON[2][4];
@@ -166,7 +166,7 @@ extern const char gSubMenu_D_RSP[4][11];
#endif #endif
#ifdef ENABLE_FEAT_F4HWN #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_PTT[2][8];
extern const char gSubMenu_SET_TOT[4][7]; extern const char gSubMenu_SET_TOT[4][7];
extern const char gSubMenu_SET_LCK[2][9]; 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* const gSubMenu_F_LOCK[F_LOCK_LEN];
extern const char gSubMenu_RX_TX[4][6]; extern const char gSubMenu_RX_TX[4][6];
extern const char gSubMenu_BAT_TXT[3][8]; 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 #ifndef ENABLE_FEAT_F4HWN
extern const char gSubMenu_SCRAMBLER[11][7]; extern const char gSubMenu_SCRAMBLER[11][7];

View File

@@ -223,10 +223,12 @@ void UI_DisplayStatus()
{ {
memcpy(line + x + 1, gFontLight, sizeof(gFontLight)); memcpy(line + x + 1, gFontLight, sizeof(gFontLight));
} }
#ifdef ENABLE_FEAT_F4HWN_CHARGING_C
else if (gChargingWithTypeC) else if (gChargingWithTypeC)
{ {
memcpy(line + x + 1, BITMAP_USB_C, sizeof(BITMAP_USB_C)); memcpy(line + x + 1, BITMAP_USB_C, sizeof(BITMAP_USB_C));
} }
#endif
// Battery // Battery
unsigned int x2 = LCD_WIDTH - sizeof(BITMAP_BatteryLevel1) - 0; unsigned int x2 = LCD_WIDTH - sizeof(BITMAP_BatteryLevel1) - 0;

View File

@@ -47,6 +47,7 @@ void UI_DisplayWelcome(void)
{ {
char WelcomeString0[16]; char WelcomeString0[16];
char WelcomeString1[16]; char WelcomeString1[16];
char WelcomeString2[16];
memset(gStatusLine, 0, sizeof(gStatusLine)); memset(gStatusLine, 0, sizeof(gStatusLine));
@@ -69,7 +70,10 @@ void UI_DisplayWelcome(void)
memset(WelcomeString0, 0, sizeof(WelcomeString0)); memset(WelcomeString0, 0, sizeof(WelcomeString0));
memset(WelcomeString1, 0, sizeof(WelcomeString1)); 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,
gBatteryVoltageAverage % 100, gBatteryVoltageAverage % 100,
BATTERY_VoltsToPercent(gBatteryVoltageAverage)); BATTERY_VoltsToPercent(gBatteryVoltageAverage));
@@ -77,15 +81,30 @@ void UI_DisplayWelcome(void)
if (gEeprom.POWER_ON_DISPLAY_MODE == POWER_ON_DISPLAY_MODE_VOLTAGE) if (gEeprom.POWER_ON_DISPLAY_MODE == POWER_ON_DISPLAY_MODE_VOLTAGE)
{ {
strcpy(WelcomeString0, "VOLTAGE"); strcpy(WelcomeString0, "VOLTAGE");
strcpy(WelcomeString1, WelcomeString2);
} }
else if(gEeprom.POWER_ON_DISPLAY_MODE == POWER_ON_DISPLAY_MODE_ALL) 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) else if(gEeprom.POWER_ON_DISPLAY_MODE == POWER_ON_DISPLAY_MODE_MESSAGE)
{ {
EEPROM_ReadBuffer(0x0EB0, WelcomeString0, 16); if(strlen(WelcomeString0) == 0)
EEPROM_ReadBuffer(0x0EC0, WelcomeString1, 16); {
strcpy(WelcomeString0, "WELCOME");
}
if(strlen(WelcomeString1) == 0) if(strlen(WelcomeString1) == 0)
{ {