110
Makefile
110
Makefile
@@ -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
|
||||||
|
37
README.md
37
README.md
@@ -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). 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
|
## 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,
|
||||||
|
26
app/action.c
26
app/action.c
@@ -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)
|
||||||
|
29
app/app.c
29
app/app.c
@@ -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)
|
||||||
|
76
app/main.c
76
app/main.c
@@ -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;
|
|
||||||
}
|
|
||||||
|
|
||||||
channelMove(((gInputBox[0] * 100) + (gInputBox[1] * 10) + gInputBox[2]) - 1, true);
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
// #ifdef ENABLE_NOAA
|
// #ifdef ENABLE_NOAA
|
||||||
|
@@ -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
|
||||||
|
|
||||||
|
15
app/menu.c
15
app/menu.c
@@ -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;
|
||||||
|
@@ -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();
|
||||||
|
|
||||||
|
BIN
archive/f4hwn.bandscope.packed.v3.1.bin
Normal file
BIN
archive/f4hwn.bandscope.packed.v3.1.bin
Normal file
Binary file not shown.
BIN
archive/f4hwn.broadcast.packed.v3.1.bin
Normal file
BIN
archive/f4hwn.broadcast.packed.v3.1.bin
Normal file
Binary file not shown.
BIN
archive/f4hwn.voxless.packed.v3.1.bin
Normal file
BIN
archive/f4hwn.voxless.packed.v3.1.bin
Normal file
Binary file not shown.
@@ -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,
|
||||||
|
@@ -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
|
||||||
|
@@ -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;
|
||||||
|
@@ -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;
|
||||||
|
@@ -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
8
main.c
@@ -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
2
misc.c
@@ -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
2
misc.h
@@ -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
181
radio.c
@@ -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
|
||||||
|
@@ -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);
|
||||||
|
11
settings.h
11
settings.h
@@ -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
|
||||||
};
|
};
|
||||||
|
59
ui/main.c
59
ui/main.c
@@ -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
|
||||||
|
49
ui/menu.c
49
ui/menu.c
@@ -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,8 +965,8 @@ 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:
|
||||||
|
@@ -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];
|
||||||
|
@@ -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;
|
||||||
|
27
ui/welcome.c
27
ui/welcome.c
@@ -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)
|
||||||
{
|
{
|
||||||
|
Reference in New Issue
Block a user