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

View File

@@ -26,7 +26,7 @@ Anyway, have fun.
# Donations
Special thanks to Jean-Cyrille F6IWW, Fabrice 14RC123, David F4BPP, Olivier 14RC206, Frédéric F4ESO, Stéphane F5LGW, Jorge Ornelas, Laurent F4AXK, Christophe Morel, Clayton W0LED, Pierre Antoine F6FWB, Jean-Claude 14FRS3306, Thierry F4GVO, Eric F1NOU, PricelessToolkit, Ady M6NYJ, Tom McGovern, Joseph Roth, Pierre-Yves Colin, Frank DJ7FG, Marcel Testaz and Brian Frobisher for their [donations](https://www.paypal.com/paypalme/F4HWN). 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
@@ -43,9 +43,15 @@ Special thanks to Jean-Cyrille F6IWW, Fabrice 14RC123, David F4BPP, Olivier 14RC
## Main features:
* improve default power settings level (Low ~125mW, Mid ~2W and High ~5W),
* improve default power settings level:
* Low1 to Low5 (<~20mW, ~125mW, ~250mW, ~500mW, ~1W),
* Mid ~2W,
* High ~5W,
* User (see SetPwr),
* improve s-meter (IARU recommandations),
* improve bandscope (Spectrum Analyser) and add channel name,
* improve bandscope (Spectrum Analyser):
* add channel name,
* add save of some spectrum parameters,
* improve UI:
* menu index is always visible, even if a menu is selected,
* s-meter new design (Classic or Tiny),
@@ -64,7 +70,7 @@ Special thanks to Jean-Cyrille F6IWW, Fabrice 14RC123, David F4BPP, Olivier 14RC
* improve memory channel input,
* and more...
* new menu entries and changes:
* add SetLow menu to set low power (<20mW, 125mW, 250mW, 500mW and 1W),
* add SetPwr menu to set User power (<20mW, 125mW, 250mW, 500mW, 1W, 2W or 5W),
* add SetPtt menu to set PTT mode (Classic or OnePush),
* add SetTot menu to set TOT alert (Off, Sound, Visual, All),
* add SetCtr menu to set contrast (0 to 15),
@@ -81,23 +87,24 @@ Special thanks to Jean-Cyrille F6IWW, Fabrice 14RC123, David F4BPP, Olivier 14RC
* add HAM CA F Lock band (for Canadian zone),
* add GMRS/FRS/MURS F Lock (for North America zone),
* remove blink and SOS functionality,
* remove AM Fix menu (AM Fix is ENABLED by default).
* remove AM Fix menu (AM Fix is ENABLED by default),
* add support of 3500mAh battery,
* improve status bar:
* add SetPtt mode in status bar,
* change font and bitmaps,
* move USB icon to left of battery information,
* add RX and TX timers,
* improve lists and scan lists options:
* add new list 3
* add new list 0 (channel without list...)
* add new scan lists options
* scan list 0 (all channels without list)
* scan list 1
* scan list 2
* scan list 3
* scan lists [1, 2, 3]
* scan all (all channels with ou without list)
* add scan list shortcuts
* add new list 3,
* add new list 0 (channel without list...),
* add new scan lists options,
* scan list 0 (all channels without list),
* scan list 1,
* scan list 2,
* scan list 3,
* scan lists [1, 2, 3],
* scan all (all channels with ou without list),
* add scan list shortcuts,
* new actions:
* RX MODE,
* MAIN ONLY,

View File

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

View File

@@ -1469,30 +1469,16 @@ void APP_TimeSlice500ms(void)
if (IS_MR_CHANNEL(gTxVfo->CHANNEL_SAVE) && (gInputBoxIndex == 1 || gInputBoxIndex == 2))
{
channelMoveSwitch();
if (gBeepToPlay == BEEP_500HZ_60MS_DOUBLE_BEEP_OPTIONAL) {
AUDIO_PlayBeep(gBeepToPlay);
}
SETTINGS_SaveVfoIndices();
}
cancelUserInputModes();
if (gBeepToPlay != BEEP_NONE)
{
AUDIO_PlayBeep(gBeepToPlay);
gBeepToPlay = BEEP_NONE;
}
}
else
{
if (IS_MR_CHANNEL(gTxVfo->CHANNEL_SAVE)) { // user is entering channel number
switch (gInputBoxIndex)
{
case 1:
channelMove(gInputBox[0] - 1, false);
break;
case 2:
channelMove(((gInputBox[0] * 10) + gInputBox[1]) - 1, false);
break;
}
}
}
}
@@ -2046,7 +2032,8 @@ Skip:
}
if (gRequestSaveChannel > 0) { // TODO: remove the gRequestSaveChannel, why use global variable for that??
if (!bKeyHeld) {
if ((!bKeyHeld && !bKeyPressed) || UI_MENU_GetCurrentMenuId())
{
SETTINGS_SaveChannel(gTxVfo->CHANNEL_SAVE, gEeprom.TX_VFO, gTxVfo, gRequestSaveChannel);
if (!SCANNER_IsScanning() && gVfoConfigureMode == VFO_CONFIGURE_NONE)

View File

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

View File

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

View File

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

View File

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

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,
};
const uint8_t BITMAP_PowerUser[3] =
{ // 'arrow' symbol
0b00111110,
0b00011100,
0b00001000,
};
#ifndef ENABLE_CUSTOM_MENU_LAYOUT
const uint8_t BITMAP_CurrentIndicator[8] = {
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_ScanList123[19];
extern const uint8_t BITMAP_ScanListAll[19];
extern const uint8_t BITMAP_PowerUser[3];
extern const uint8_t BITMAP_compand[6];
#ifndef ENABLE_CUSTOM_MENU_LAYOUT

View File

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

View File

@@ -25,6 +25,7 @@
#include "ui/battery.h"
#include "ui/menu.h"
#include "ui/ui.h"
//#include "debugging.h"
uint16_t gBatteryCalibration[6];
uint16_t gBatteryCurrentVoltage;
@@ -44,14 +45,12 @@ typedef enum {
BATTERY_LOW_CONFIRMED
} BatteryLow_t;
uint16_t lowBatteryCountdown;
const uint16_t lowBatteryPeriod = 30;
volatile uint16_t gPowerSave_10ms;
const uint16_t Voltage2PercentageTable[][7][2] = {
const uint16_t Voltage2PercentageTable[][7][3] = {
[BATTERY_TYPE_1600_MAH] = {
{828, 100},
{814, 97 },
@@ -71,15 +70,28 @@ const uint16_t Voltage2PercentageTable[][7][2] = {
{630, 0 },
{0, 0 },
},
[BATTERY_TYPE_3500_MAH] = {
{837, 100},
{826, 95 },
{750, 50 },
{700, 25 },
{620, 5 },
{600, 0 },
{0, 0 },
},
};
static_assert(ARRAY_SIZE(Voltage2PercentageTable[BATTERY_TYPE_1600_MAH]) ==
ARRAY_SIZE(Voltage2PercentageTable[BATTERY_TYPE_2200_MAH]));
static_assert(
(ARRAY_SIZE(Voltage2PercentageTable[BATTERY_TYPE_1600_MAH]) ==
ARRAY_SIZE(Voltage2PercentageTable[BATTERY_TYPE_2200_MAH])) &&
(ARRAY_SIZE(Voltage2PercentageTable[BATTERY_TYPE_2200_MAH]) ==
ARRAY_SIZE(Voltage2PercentageTable[BATTERY_TYPE_3500_MAH]))
);
unsigned int BATTERY_VoltsToPercent(const unsigned int voltage_10mV)
{
const uint16_t (*crv)[2] = Voltage2PercentageTable[gEeprom.BATTERY_TYPE];
const uint16_t (*crv)[3] = Voltage2PercentageTable[gEeprom.BATTERY_TYPE];
const int mulipl = 1000;
for (unsigned int i = 1; i < ARRAY_SIZE(Voltage2PercentageTable[BATTERY_TYPE_2200_MAH]); i++) {
if (voltage_10mV > crv[i][0]) {
@@ -102,13 +114,22 @@ void BATTERY_GetReadings(const bool bDisplayBatteryLevel)
if(gBatteryVoltageAverage > 890)
gBatteryDisplayLevel = 7; // battery overvoltage
else if(gBatteryVoltageAverage < 630)
else if(gBatteryVoltageAverage < 630 && (gEeprom.BATTERY_TYPE == BATTERY_TYPE_1600_MAH || gEeprom.BATTERY_TYPE == BATTERY_TYPE_2200_MAH))
gBatteryDisplayLevel = 0; // battery critical
else if(gBatteryVoltageAverage < 600 && (gEeprom.BATTERY_TYPE == BATTERY_TYPE_3500_MAH))
gBatteryDisplayLevel = 0; // battery critical
else {
gBatteryDisplayLevel = 1;
const uint8_t levels[] = {5,17,41,65,88};
uint8_t perc = BATTERY_VoltsToPercent(gBatteryVoltageAverage);
for(uint8_t i = 6; i >= 1; i--){
//char str[64];
//LogUart("----------\n");
//sprintf(str, "%d %d %d %d %d %d %d\n", gBatteryVoltages[0], gBatteryVoltages[1], gBatteryVoltages[2], gBatteryVoltages[3], Voltage, gBatteryVoltageAverage, perc);
//LogUart(str);
for(uint8_t i = 6; i >= 2; i--){
//sprintf(str, "%d %d %d\n", perc, levels[i-2], i);
//LogUart(str);
if (perc > levels[i-2]) {
gBatteryDisplayLevel = i;
break;

View File

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

8
main.c
View File

@@ -123,11 +123,17 @@ void Main(void)
if (BootMode == BOOT_MODE_F_LOCK)
{
gF_LOCK = true; // flag to say include the hidden menu items
#ifdef ENABLE_FEAT_F4HWN
gEeprom.KEY_LOCK = 0;
SETTINGS_SaveSettings();
gMenuCursor = 63; // move to hidden section, fix me if change... !!!
#ifndef ENABLE_VOX
gMenuCursor = 63; // move to hidden section, fix me if change... !!!
#else
gMenuCursor = 64; // move to hidden section, fix me if change... !!!
#endif
gSubMenuSelection = gSetting_F_LOCK;
#endif
}

2
misc.c
View File

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

2
misc.h
View File

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

181
radio.c
View File

@@ -54,8 +54,6 @@ const char gModulationStr[MODULATION_UKNOWN][4] = {
#endif
};
bool RADIO_CheckValidChannel(uint16_t channel, bool checkScanList, uint8_t scanList)
{
// return true if the channel appears valid
@@ -140,7 +138,7 @@ void RADIO_InitInfo(VFO_Info_t *pInfo, const uint8_t ChannelSave, const uint32_t
pInfo->StepFrequency = gStepFrequencyTable[pInfo->STEP_SETTING];
pInfo->CHANNEL_SAVE = ChannelSave;
pInfo->FrequencyReverse = false;
pInfo->OUTPUT_POWER = OUTPUT_POWER_LOW;
pInfo->OUTPUT_POWER = OUTPUT_POWER_LOW1;
pInfo->freq_config_RX.Frequency = Frequency;
pInfo->freq_config_TX.Frequency = Frequency;
pInfo->pRX = &pInfo->freq_config_RX;
@@ -329,7 +327,7 @@ void RADIO_ConfigureChannel(const unsigned int VFO, const unsigned int configure
{
pVfo->FrequencyReverse = false;
pVfo->CHANNEL_BANDWIDTH = BK4819_FILTER_BW_WIDE;
pVfo->OUTPUT_POWER = OUTPUT_POWER_LOW;
pVfo->OUTPUT_POWER = OUTPUT_POWER_LOW1;
pVfo->BUSY_CHANNEL_LOCK = false;
}
else
@@ -337,8 +335,8 @@ void RADIO_ConfigureChannel(const unsigned int VFO, const unsigned int configure
const uint8_t d4 = data[4];
pVfo->FrequencyReverse = !!((d4 >> 0) & 1u);
pVfo->CHANNEL_BANDWIDTH = !!((d4 >> 1) & 1u);
pVfo->OUTPUT_POWER = ((d4 >> 2) & 3u);
pVfo->BUSY_CHANNEL_LOCK = !!((d4 >> 4) & 1u);
pVfo->OUTPUT_POWER = ((d4 >> 2) & 7u);
pVfo->BUSY_CHANNEL_LOCK = !!((d4 >> 5) & 1u);
}
if (data[5] == 0xFF)
@@ -508,114 +506,81 @@ void RADIO_ConfigureSquelchAndOutputPower(VFO_Info_t *pInfo)
// 1F30 32 32 32 64 64 64 8c 8c 8c ff ff ff ff ff ff ff 470 MHz
uint8_t Txp[3];
EEPROM_ReadBuffer(0x1ED0 + (Band * 16) + (pInfo->OUTPUT_POWER * 3), Txp, 3);
uint8_t Op = 0; // Low eeprom calibration data
uint8_t currentPower = pInfo->OUTPUT_POWER;
if(currentPower == OUTPUT_POWER_USER)
{
if(gSetting_set_pwr == 5)
{
Op = 1; // Mid eeprom calibration data
}
else if(gSetting_set_pwr == 6)
{
Op = 2; // High eeprom calibration data
}
currentPower = gSetting_set_pwr;
}
else
{
if (currentPower == OUTPUT_POWER_MID)
{
Op = 1; // Mid eeprom calibration data
}
else if(currentPower == OUTPUT_POWER_HIGH)
{
Op = 2; // High eeprom calibration data
}
currentPower--;
}
EEPROM_ReadBuffer(0x1ED0 + (Band * 16) + (Op * 3), Txp, 3);
#ifdef ENABLE_FEAT_F4HWN
#ifdef ENABLE_FEAT_F4HWN_FIXED_PWR
// make low and mid even lower
// and fix values
// because of toxic fucking closed firmwares
// make low and mid even lower
// and use calibration values
// be aware with toxic fucking closed firmwares
uint8_t shift[] = {0, 0, 0, 0, 0, 0, 0};
/*
uint8_t shift[] = {0, 0, 0, 0, 0};
if(Band == 5)
if(Band == 5) // UHF
{
shift[0] = 0;
shift[1] = 0;
shift[2] = 0;
shift[3] = 0;
shift[4] = 0;
}
*/
for(uint8_t p = 0; p < 3; p++)
{
switch (currentPower)
{
shift[0] = 2;
shift[1] = 1;
shift[2] = 2;
shift[3] = 2;
shift[4] = 2;
shift[5] = 2;
shift[6] = 2;
case 0:
Txp[p] = (Txp[p] * 4) / 25; //+ shift[pInfo->OUTPUT_POWER];
break;
case 1:
Txp[p] = (Txp[p] * 4) / 19; // + shift[pInfo->OUTPUT_POWER];
break;
case 2:
Txp[p] = (Txp[p] * 4) / 13; // + shift[pInfo->OUTPUT_POWER];
break;
case 3:
Txp[p] = (Txp[p] * 4) / 10; // + shift[pInfo->OUTPUT_POWER];
break;
case 4:
Txp[p] = (Txp[p] * 4) / 7; // + shift[pInfo->OUTPUT_POWER];
break;
case 5:
Txp[p] = (Txp[p] * 3) / 4;
break;
case 6:
Txp[p] = Txp[p] + 30;
break;
}
if (pInfo->OUTPUT_POWER == OUTPUT_POWER_LOW) {
for(uint8_t p = 0; p < 3; p++ )
{
switch (gSetting_set_low) {
case 0:
Txp[p] = 16 - shift[gSetting_set_low];
break;
case 1:
Txp[p] = 21 + shift[gSetting_set_low];
break;
case 2:
Txp[p] = 29 + shift[gSetting_set_low];
break;
case 3:
Txp[p] = 37 + shift[gSetting_set_low];
break;
case 4:
Txp[p] = 50 + shift[gSetting_set_low];
break;
}
}
}
else if (pInfo->OUTPUT_POWER == OUTPUT_POWER_MID){
Txp[0] = 77 + shift[5];
Txp[1] = 77 + shift[5];
Txp[2] = 77 + shift[5];
}
// increase high
else if (pInfo->OUTPUT_POWER == OUTPUT_POWER_HIGH){
Txp[0] = 165 + shift[6];
Txp[1] = 165 + shift[6];
Txp[2] = 165 + shift[6];
}
#else
// make low and mid even lower
// and use calibration values
// be aware with toxic fucking closed firmwares
uint8_t shift[] = {0, 0, 0, 0, 0};
/*
if(Band == 5) // UHF
{
shift[0] = 0;
shift[1] = 0;
shift[2] = 0;
shift[3] = 0;
shift[4] = 0;
}
*/
if (pInfo->OUTPUT_POWER == OUTPUT_POWER_LOW) {
for(uint8_t p = 0; p < 3; p++ )
{
switch (gSetting_set_low) {
case 0:
Txp[p] = (Txp[p] * 4) / 25 + shift[gSetting_set_low];
break;
case 1:
Txp[p] = (Txp[p] * 4) / 19 + shift[gSetting_set_low];
break;
case 2:
Txp[p] = (Txp[p] * 4) / 13 + shift[gSetting_set_low];
break;
case 3:
Txp[p] = (Txp[p] * 4) / 10 + shift[gSetting_set_low];
break;
case 4:
Txp[p] = (Txp[p] * 4) / 7 + shift[gSetting_set_low];
break;
}
}
}
else if (pInfo->OUTPUT_POWER == OUTPUT_POWER_MID){
Txp[0] = (Txp[0] * 3) / 4;
Txp[1] = (Txp[1] * 3) / 4;
Txp[2] = (Txp[2] * 3) / 4;
}
// increase high
else if (pInfo->OUTPUT_POWER == OUTPUT_POWER_HIGH){
Txp[0] = Txp[0] + 30;
Txp[1] = Txp[1] + 30;
Txp[2] = Txp[2] + 30;
}
#endif
}
#else
#ifdef ENABLE_REDUCE_LOW_MID_TX_POWER
// make low and mid even lower

View File

@@ -317,7 +317,7 @@ void SETTINGS_InitEEPROM(void)
#ifdef ENABLE_FEAT_F4HWN
// 1FF0..0x1FF7
EEPROM_ReadBuffer(0x1FF0, Data, 8);
gSetting_set_low = (((Data[7] & 0xF0) >> 4) < 5) ? ((Data[7] & 0xF0) >> 4) : 0;
gSetting_set_pwr = (((Data[7] & 0xF0) >> 4) < 7) ? ((Data[7] & 0xF0) >> 4) : 0;
gSetting_set_ptt = (((Data[7] & 0x0F)) < 2) ? ((Data[7] & 0x0F)) : 0;
gSetting_set_tot = (((Data[6] & 0xF0) >> 4) < 4) ? ((Data[6] & 0xF0) >> 4) : 0;
@@ -707,7 +707,7 @@ void SETTINGS_SaveSettings(void)
State[5] = ((tmp << 4) | (gSetting_set_ctr & 0x0F));
State[6] = ((gSetting_set_tot << 4) | (gSetting_set_eot & 0x0F));
State[7] = ((gSetting_set_low << 4) | (gSetting_set_ptt & 0x0F));
State[7] = ((gSetting_set_pwr << 4) | (gSetting_set_ptt & 0x0F));
gEeprom.KEY_LOCK_PTT = gSetting_set_lck;
@@ -744,7 +744,7 @@ void SETTINGS_SaveChannel(uint8_t Channel, uint8_t VFO, const VFO_Info_t *pVFO,
State._8[2] = (pVFO->freq_config_TX.CodeType << 4) | pVFO->freq_config_RX.CodeType;
State._8[3] = (pVFO->Modulation << 4) | pVFO->TX_OFFSET_FREQUENCY_DIRECTION;
State._8[4] = 0
| (pVFO->BUSY_CHANNEL_LOCK << 4)
| (pVFO->BUSY_CHANNEL_LOCK << 5)
| (pVFO->OUTPUT_POWER << 2)
| (pVFO->CHANNEL_BANDWIDTH << 1)
| (pVFO->FrequencyReverse << 0);

View File

@@ -41,7 +41,7 @@ typedef enum POWER_OnDisplayMode_t POWER_OnDisplayMode_t;
enum TxLockModes_t {
F_LOCK_DEF, //all default frequencies + configurable
F_LOCK_FCC,
#ifdef ENABLE_FEAT_F4HWN_PMR
#ifdef ENABLE_FEAT_F4HWN_CA
F_LOCK_CA,
#endif
F_LOCK_CE,
@@ -50,6 +50,8 @@ enum TxLockModes_t {
F_LOCK_438,
#ifdef ENABLE_FEAT_F4HWN_PMR
F_LOCK_PMR,
#endif
#ifdef ENABLE_FEAT_F4HWN_GMRS_FRS_MURS
F_LOCK_GMRS_FRS_MURS,
#endif
F_LOCK_ALL, // disable TX on all frequencies
@@ -82,7 +84,12 @@ enum {
};
enum {
OUTPUT_POWER_LOW = 0,
OUTPUT_POWER_USER = 0,
OUTPUT_POWER_LOW1,
OUTPUT_POWER_LOW2,
OUTPUT_POWER_LOW3,
OUTPUT_POWER_LOW4,
OUTPUT_POWER_LOW5,
OUTPUT_POWER_MID,
OUTPUT_POWER_HIGH
};

View File

@@ -1072,9 +1072,13 @@ void UI_DisplayMain(void)
{ // TX power level
switch (gRxVfo->OUTPUT_POWER)
{
case OUTPUT_POWER_LOW: Level = 2; break;
case OUTPUT_POWER_MID: Level = 4; break;
case OUTPUT_POWER_HIGH: Level = 6; break;
case OUTPUT_POWER_LOW1: Level = 2; break;
case OUTPUT_POWER_LOW2: Level = 2; break;
case OUTPUT_POWER_LOW3: Level = 2; break;
case OUTPUT_POWER_LOW4: Level = 2; break;
case OUTPUT_POWER_LOW5: Level = 2; break;
case OUTPUT_POWER_MID: Level = 4; break;
case OUTPUT_POWER_HIGH: Level = 6; break;
}
}
else
@@ -1148,7 +1152,7 @@ void UI_DisplayMain(void)
if (isMainOnly(true))
{
UI_PrintStringSmallNormal(s, LCD_WIDTH + 24, 0, line + 1);
UI_PrintStringSmallNormal(s, LCD_WIDTH + 22, 0, line + 1);
UI_PrintStringSmallNormal(t, LCD_WIDTH + 2, 0, line + 1);
if (isMainOnly(false) && !gDTMF_InputMode)
@@ -1190,38 +1194,39 @@ void UI_DisplayMain(void)
if (state == VFO_STATE_NORMAL || state == VFO_STATE_ALARM)
{ // show the TX power
int i = vfoInfo->OUTPUT_POWER % 3;
#if ENABLE_FEAT_F4HWN
if (isMainOnly(true))
{
const char pwr_short[][2] = {"L","M","H"};
if(i == 0)
uint8_t currentPower = vfoInfo->OUTPUT_POWER % 8;
uint8_t arrowPos = 19;
bool userPower = false;
if(currentPower == OUTPUT_POWER_USER)
{
sprintf(String, "%s%d", pwr_short[i], gSetting_set_low + 1);
currentPower = gSetting_set_pwr;
userPower = true;
}
else
{
sprintf(String, "%s", pwr_short[i]);
currentPower--;
userPower = false;
}
UI_PrintStringSmallNormal(String, LCD_WIDTH + 44, 0, line + 1);
}
else
{
const char pwr_long[][5] = {"LOW", "MID", "HIGH"};
if(i == 0)
if (isMainOnly(true))
{
sprintf(String, "%s%d", pwr_long[i], gSetting_set_low + 1);
const char pwr_short[][3] = {"L1", "L2", "L3", "L4", "L5", "M", "H"};
sprintf(String, "%s", pwr_short[currentPower]);
UI_PrintStringSmallNormal(String, LCD_WIDTH + 42, 0, line + 1);
arrowPos = 38;
}
else
{
sprintf(String, "%s", pwr_long[i]);
const char pwr_long[][5] = {"LOW1", "LOW2", "LOW3", "LOW4", "LOW5", "MID", "HIGH"};
sprintf(String, "%s", pwr_long[currentPower]);
GUI_DisplaySmallest(String, 24, line == 0 ? 17 : 49, false, true);
}
if(userPower == true)
{
memcpy(p_line0 + 256 + arrowPos, BITMAP_PowerUser, sizeof(BITMAP_PowerUser));
}
GUI_DisplaySmallest(String, 24, line == 0 ? 17 : 49, false, true);
}
#else
const char pwr_list[][2] = {"L","M","H"};
UI_PrintStringSmallNormal(pwr_list[i], LCD_WIDTH + 46, 0, line + 1);
#endif
}
if (vfoInfo->freq_config_RX.Frequency != vfoInfo->freq_config_TX.Frequency)
@@ -1434,7 +1439,7 @@ void UI_DisplayMain(void)
UI_PrintStringSmallBold(String, 92, 0, 6);
for (uint8_t i = 92; i < 128; i++)
{
gFrameBuffer[6][i] ^= 0xFF;
gFrameBuffer[6][i] ^= 0x7F;
}
}
#endif

View File

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

View File

@@ -123,7 +123,7 @@ enum
MENU_F_CALI, // reference xtal calibration
#endif
#ifdef ENABLE_FEAT_F4HWN
MENU_SET_LOW,
MENU_SET_PWR,
MENU_SET_PTT,
MENU_SET_TOT,
MENU_SET_EOT,
@@ -145,7 +145,7 @@ enum
extern const uint8_t FIRST_HIDDEN_MENU_ITEM;
extern const t_menu_item MenuList[];
extern const char gSubMenu_TXP[3][5];
extern const char gSubMenu_TXP[8][6];
extern const char gSubMenu_SFT_D[3][4];
extern const char gSubMenu_W_N[2][7];
extern const char gSubMenu_OFF_ON[2][4];
@@ -166,7 +166,7 @@ extern const char gSubMenu_D_RSP[4][11];
#endif
#ifdef ENABLE_FEAT_F4HWN
extern const char gSubMenu_SET_LOW[5][7];
extern const char gSubMenu_SET_PWR[7][6];
extern const char gSubMenu_SET_PTT[2][8];
extern const char gSubMenu_SET_TOT[4][7];
extern const char gSubMenu_SET_LCK[2][9];
@@ -184,7 +184,7 @@ extern const char gSubMenu_RESET[2][4];
extern const char* const gSubMenu_F_LOCK[F_LOCK_LEN];
extern const char gSubMenu_RX_TX[4][6];
extern const char gSubMenu_BAT_TXT[3][8];
extern const char gSubMenu_BATTYP[2][9];
extern const char gSubMenu_BATTYP[3][9];
#ifndef ENABLE_FEAT_F4HWN
extern const char gSubMenu_SCRAMBLER[11][7];

View File

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

View File

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