Do some stuff
All checks were successful
Build Firmware / build (push) Successful in 2m19s

This commit is contained in:
2025-03-28 22:07:50 +01:00
parent 4fe99744e1
commit 85fb527020
23 changed files with 258 additions and 658 deletions

View File

@@ -4,12 +4,12 @@
# 1 = enable # 1 = enable
# ---- STOCK QUANSHENG FEATURES ---- # ---- STOCK QUANSHENG FEATURES ----
ENABLE_FMRADIO ?= 1 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 ?= 0 ENABLE_VOX ?= 1
ENABLE_ALARM ?= 0 ENABLE_ALARM ?= 0
ENABLE_TX1750 ?= 1 ENABLE_TX1750 ?= 1
ENABLE_PWRON_PASSWORD ?= 0 ENABLE_PWRON_PASSWORD ?= 0
@@ -47,7 +47,6 @@ ENABLE_FEAT_F4HWN_RX_TX_TIMER ?= 0
ENABLE_FEAT_F4HWN_CHARGING_C ?= 1 ENABLE_FEAT_F4HWN_CHARGING_C ?= 1
ENABLE_FEAT_F4HWN_SLEEP ?= 1 ENABLE_FEAT_F4HWN_SLEEP ?= 1
ENABLE_FEAT_F4HWN_RESUME_STATE ?= 1 ENABLE_FEAT_F4HWN_RESUME_STATE ?= 1
ENABLE_FEAT_F4HWN_NARROWER ?= 1
ENABLE_FEAT_F4HWN_INV ?= 1 ENABLE_FEAT_F4HWN_INV ?= 1
ENABLE_FEAT_F4HWN_CTR ?= 0 ENABLE_FEAT_F4HWN_CTR ?= 0
ENABLE_FEAT_F4HWN_RESCUE_OPS ?= 0 ENABLE_FEAT_F4HWN_RESCUE_OPS ?= 0
@@ -449,9 +448,6 @@ endif
ifeq ($(ENABLE_FEAT_F4HWN_RESUME_STATE),1) ifeq ($(ENABLE_FEAT_F4HWN_RESUME_STATE),1)
CFLAGS += -DENABLE_FEAT_F4HWN_RESUME_STATE CFLAGS += -DENABLE_FEAT_F4HWN_RESUME_STATE
endif endif
ifeq ($(ENABLE_FEAT_F4HWN_NARROWER),1)
CFLAGS += -DENABLE_FEAT_F4HWN_NARROWER
endif
ifeq ($(ENABLE_FEAT_F4HWN_INV),1) ifeq ($(ENABLE_FEAT_F4HWN_INV),1)
CFLAGS += -DENABLE_FEAT_F4HWN_INV CFLAGS += -DENABLE_FEAT_F4HWN_INV
endif endif

View File

@@ -43,6 +43,7 @@
#include "ui/inputbox.h" #include "ui/inputbox.h"
#include "ui/ui.h" #include "ui/ui.h"
#include "driver/st7565.h" #include "driver/st7565.h"
#include "ui/menu.h"
#ifdef ENABLE_REGA #ifdef ENABLE_REGA
#include "app/rega.h" #include "app/rega.h"
@@ -128,10 +129,8 @@ void (*action_opt_table[])(void) = {
#else #else
[ACTION_OPT_MUTE] = &FUNCTION_NOP, [ACTION_OPT_MUTE] = &FUNCTION_NOP,
#endif #endif
#ifdef ENABLE_FEAT_F4HWN_RESCUE_OPS
[ACTION_OPT_POWER_HIGH] = &ACTION_Power_High, [ACTION_OPT_POWER_HIGH] = &ACTION_Power_High,
[ACTION_OPT_REMOVE_OFFSET] = &ACTION_Remove_Offset, [ACTION_OPT_REMOVE_OFFSET] = &ACTION_Remove_Offset,
#endif
#else #else
[ACTION_OPT_RXMODE] = &FUNCTION_NOP, [ACTION_OPT_RXMODE] = &FUNCTION_NOP,
#endif #endif
@@ -145,8 +144,9 @@ 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) gTxVfo->OUTPUT_POWER++;
gTxVfo->OUTPUT_POWER = OUTPUT_POWER_LOW1; if (gTxVfo->OUTPUT_POWER >= ARRAY_SIZE(gSubMenu_TXP))
gTxVfo->OUTPUT_POWER = 0;
gRequestSaveChannel = 1; gRequestSaveChannel = 1;
@@ -561,40 +561,12 @@ void ACTION_Ptt(void)
void ACTION_Wn(void) void ACTION_Wn(void)
{ {
#ifdef ENABLE_FEAT_F4HWN_NARROWER
bool narrower = 0;
if (FUNCTION_IsRx()) if (FUNCTION_IsRx())
{ {
gRxVfo->CHANNEL_BANDWIDTH = (gRxVfo->CHANNEL_BANDWIDTH == 0) ? 1: 0; gRxVfo->CHANNEL_BANDWIDTH++;
if(gRxVfo->CHANNEL_BANDWIDTH == BANDWIDTH_NARROW && gSetting_set_nfm == 1) if (gRxVfo->CHANNEL_BANDWIDTH > BK4819_FILTER_BW_NARROWER) {
{ gRxVfo->CHANNEL_BANDWIDTH = BK4819_FILTER_BW_WIDE;
narrower = 1;
} }
#ifdef ENABLE_AM_FIX
BK4819_SetFilterBandwidth(gRxVfo->CHANNEL_BANDWIDTH + narrower, true);
#else
BK4819_SetFilterBandwidth(gRxVfo->CHANNEL_BANDWIDTH + narrower, false);
#endif
}
else
{
gTxVfo->CHANNEL_BANDWIDTH = (gTxVfo->CHANNEL_BANDWIDTH == 0) ? 1: 0;
if(gTxVfo->CHANNEL_BANDWIDTH == BANDWIDTH_NARROW && gSetting_set_nfm == 1)
{
narrower = 1;
}
#ifdef ENABLE_AM_FIX
BK4819_SetFilterBandwidth(gTxVfo->CHANNEL_BANDWIDTH, true);
#else
BK4819_SetFilterBandwidth(gTxVfo->CHANNEL_BANDWIDTH, false);
#endif
}
#else
if (FUNCTION_IsRx())
{
gRxVfo->CHANNEL_BANDWIDTH = (gRxVfo->CHANNEL_BANDWIDTH == 0) ? 1: 0;
#ifdef ENABLE_AM_FIX #ifdef ENABLE_AM_FIX
BK4819_SetFilterBandwidth(gRxVfo->CHANNEL_BANDWIDTH, true); BK4819_SetFilterBandwidth(gRxVfo->CHANNEL_BANDWIDTH, true);
#else #else
@@ -603,14 +575,16 @@ void ACTION_Wn(void)
} }
else else
{ {
gTxVfo->CHANNEL_BANDWIDTH = (gTxVfo->CHANNEL_BANDWIDTH == 0) ? 1: 0; gRxVfo->CHANNEL_BANDWIDTH++;
if (gRxVfo->CHANNEL_BANDWIDTH > BK4819_FILTER_BW_NARROWER) {
gRxVfo->CHANNEL_BANDWIDTH = BK4819_FILTER_BW_WIDE;
}
#ifdef ENABLE_AM_FIX #ifdef ENABLE_AM_FIX
BK4819_SetFilterBandwidth(gTxVfo->CHANNEL_BANDWIDTH, true); BK4819_SetFilterBandwidth(gTxVfo->CHANNEL_BANDWIDTH, true);
#else #else
BK4819_SetFilterBandwidth(gTxVfo->CHANNEL_BANDWIDTH, false); BK4819_SetFilterBandwidth(gTxVfo->CHANNEL_BANDWIDTH, false);
#endif #endif
} }
#endif
} }
void ACTION_BackLight(void) void ACTION_BackLight(void)
@@ -667,7 +641,6 @@ void ACTION_BackLightOnDemand(void)
} }
#endif #endif
#ifdef ENABLE_FEAT_F4HWN_RESCUE_OPS
void ACTION_Power_High(void) void ACTION_Power_High(void)
{ {
gPowerHigh = !gPowerHigh; gPowerHigh = !gPowerHigh;
@@ -679,5 +652,4 @@ void ACTION_BackLightOnDemand(void)
gRemoveOffset = !gRemoveOffset; gRemoveOffset = !gRemoveOffset;
gVfoConfigureMode = VFO_CONFIGURE_RELOAD; gVfoConfigureMode = VFO_CONFIGURE_RELOAD;
} }
#endif
#endif #endif

View File

@@ -45,10 +45,8 @@ void ACTION_SwitchDemodul(void);
#if !defined(ENABLE_SPECTRUM) || !defined(ENABLE_FMRADIO) #if !defined(ENABLE_SPECTRUM) || !defined(ENABLE_FMRADIO)
void ACTION_Mute(void); void ACTION_Mute(void);
#endif #endif
#ifdef ENABLE_FEAT_F4HWN_RESCUE_OPS
void ACTION_Power_High(void); void ACTION_Power_High(void);
void ACTION_Remove_Offset(void); void ACTION_Remove_Offset(void);
#endif
#endif #endif
void ACTION_Handle(KEY_Code_t Key, bool bKeyPressed, bool bKeyHeld); void ACTION_Handle(KEY_Code_t Key, bool bKeyPressed, bool bKeyHeld);

View File

@@ -850,43 +850,6 @@ void APP_Update(void) {
} }
#endif #endif
#ifdef ENABLE_FEAT_F4HWN
if (gCurrentFunction == FUNCTION_TRANSMIT && (gTxTimeoutReachedAlert || SerialConfigInProgress())) {
if (gSetting_set_tot >= 2) {
if (gEeprom.BACKLIGHT_TIME == 0) {
if (gBlinkCounter == 0 || gBlinkCounter == 250) {
GPIO_FlipBit(&GPIOC->DATA, GPIOC_PIN_FLASHLIGHT);
}
} else {
if (gBlinkCounter == 0) {
//BACKLIGHT_TurnOn();
BACKLIGHT_SetBrightness(gEeprom.BACKLIGHT_MAX);
} else if (gBlinkCounter == 15000) {
//BACKLIGHT_TurnOff();
BACKLIGHT_SetBrightness(gEeprom.BACKLIGHT_MIN);
}
}
}
gBlinkCounter++;
if (
(gSetting_set_tot == 3 && gEeprom.BACKLIGHT_TIME != 0 && gBlinkCounter > 74000) ||
(gSetting_set_tot == 3 && gEeprom.BACKLIGHT_TIME == 0 && gBlinkCounter > 79000) ||
(gSetting_set_tot != 3 && gBlinkCounter > 76000)
) // try to calibrate 10 times
{
gBlinkCounter = 0;
if (gSetting_set_tot == 1 || gSetting_set_tot == 3) {
BK4819_DisableScramble();
BK4819_PlaySingleTone(gTxTimeoutToneAlert, 30, 1, true);
gTxTimeoutToneAlert += 100;
}
}
}
#endif
if (gCurrentFunction == FUNCTION_TRANSMIT && if (gCurrentFunction == FUNCTION_TRANSMIT &&
(gTxTimeoutReached || SerialConfigInProgress())) { // transmitter timed out or must de-key (gTxTimeoutReached || SerialConfigInProgress())) { // transmitter timed out or must de-key
gTxTimeoutReached = false; gTxTimeoutReached = false;
@@ -1310,11 +1273,9 @@ void APP_TimeSlice10ms(void) {
return; return;
#endif #endif
#if !defined(ENABLE_FEAT_F4HWN) || defined(ENABLE_FEAT_F4HWN_RESCUE_OPS)
#ifdef ENABLE_FLASHLIGHT #ifdef ENABLE_FLASHLIGHT
FlashlightTimeSlice(); FlashlightTimeSlice();
#endif #endif
#endif
#ifdef ENABLE_VOX #ifdef ENABLE_VOX
if (gVoxResumeCountdown > 0) if (gVoxResumeCountdown > 0)
@@ -1932,10 +1893,7 @@ static void ProcessKey(KEY_Code_t Key, bool bKeyPressed, bool bKeyHeld) {
BK4819_ExitDTMF_TX(false); BK4819_ExitDTMF_TX(false);
if (gCurrentVfo->SCRAMBLING_TYPE == 0) BK4819_SetScramble(gCurrentVfo->SCRAMBLING_TYPE);
BK4819_DisableScramble();
else
BK4819_EnableScramble(gCurrentVfo->SCRAMBLING_TYPE - 1);
} }
} else { } else {
@@ -1944,7 +1902,7 @@ static void ProcessKey(KEY_Code_t Key, bool bKeyPressed, bool bKeyHeld) {
gEnableSpeaker = true; gEnableSpeaker = true;
} }
BK4819_DisableScramble(); BK4819_SetScramble(0);
if (Code == 0xFE) if (Code == 0xFE)
BK4819_TransmitTone(gEeprom.DTMF_SIDE_TONE, 1750); BK4819_TransmitTone(gEeprom.DTMF_SIDE_TONE, 1750);

View File

@@ -5,79 +5,60 @@
#include "flashlight.h" #include "flashlight.h"
#if !defined(ENABLE_FEAT_F4HWN) || defined(ENABLE_FEAT_F4HWN_RESCUE_OPS) enum FlashlightMode_t gFlashLightState;
enum FlashlightMode_t gFlashLightState;
void FlashlightTimeSlice() void FlashlightTimeSlice() {
{ if (gFlashLightState == FLASHLIGHT_BLINK && (gFlashLightBlinkCounter & 15u) == 0) {
if (gFlashLightState == FLASHLIGHT_BLINK && (gFlashLightBlinkCounter & 15u) == 0) { GPIO_FlipBit(&GPIOC->DATA, GPIOC_PIN_FLASHLIGHT);
GPIO_FlipBit(&GPIOC->DATA, GPIOC_PIN_FLASHLIGHT); return;
}
if (gFlashLightState == FLASHLIGHT_SOS) {
const uint16_t u = 15;
static uint8_t c;
static uint16_t next;
if (gFlashLightBlinkCounter - next > 7 * u) {
c = 0;
next = gFlashLightBlinkCounter + 1;
return; return;
} }
if (gFlashLightState == FLASHLIGHT_SOS) { if (gFlashLightBlinkCounter == next) {
const uint16_t u = 15; if (c == 0) {
static uint8_t c;
static uint16_t next;
if (gFlashLightBlinkCounter - next > 7 * u) {
c = 0;
next = gFlashLightBlinkCounter + 1;
return;
}
if (gFlashLightBlinkCounter == next) {
if (c==0) {
GPIO_ClearBit(&GPIOC->DATA, GPIOC_PIN_FLASHLIGHT);
} else {
GPIO_FlipBit(&GPIOC->DATA, GPIOC_PIN_FLASHLIGHT);
}
if (c >= 18) {
next = gFlashLightBlinkCounter + 7 * u;
c = 0;
} else if(c==7 || c==9 || c==11) {
next = gFlashLightBlinkCounter + 3 * u;
} else {
next = gFlashLightBlinkCounter + u;
}
c++;
}
}
}
void ACTION_FlashLight(void)
{
switch (gFlashLightState) {
case FLASHLIGHT_OFF:
gFlashLightState++;
GPIO_SetBit(&GPIOC->DATA, GPIOC_PIN_FLASHLIGHT);
break;
case FLASHLIGHT_ON:
case FLASHLIGHT_BLINK:
gFlashLightState++;
break;
case FLASHLIGHT_SOS:
default:
gFlashLightState = 0;
GPIO_ClearBit(&GPIOC->DATA, GPIOC_PIN_FLASHLIGHT); GPIO_ClearBit(&GPIOC->DATA, GPIOC_PIN_FLASHLIGHT);
} else {
GPIO_FlipBit(&GPIOC->DATA, GPIOC_PIN_FLASHLIGHT);
}
if (c >= 18) {
next = gFlashLightBlinkCounter + 7 * u;
c = 0;
} else if (c == 7 || c == 9 || c == 11) {
next = gFlashLightBlinkCounter + 3 * u;
} else {
next = gFlashLightBlinkCounter + u;
}
c++;
} }
} }
#else }
void ACTION_FlashLight(void)
{
static bool gFlashLightState = false;
if(gFlashLightState) void ACTION_FlashLight(void) {
{ switch (gFlashLightState) {
case FLASHLIGHT_OFF:
gFlashLightState++;
GPIO_SetBit(&GPIOC->DATA, GPIOC_PIN_FLASHLIGHT);
break;
case FLASHLIGHT_ON:
case FLASHLIGHT_BLINK:
gFlashLightState++;
break;
case FLASHLIGHT_SOS:
default:
gFlashLightState = 0;
GPIO_ClearBit(&GPIOC->DATA, GPIOC_PIN_FLASHLIGHT); GPIO_ClearBit(&GPIOC->DATA, GPIOC_PIN_FLASHLIGHT);
}
else
{
GPIO_SetBit(&GPIOC->DATA, GPIOC_PIN_FLASHLIGHT);
}
gFlashLightState = (gFlashLightState) ? false : true;
} }
#endif }
#endif
#endif

View File

@@ -5,7 +5,6 @@
#include <stdint.h> #include <stdint.h>
#if !defined(ENABLE_FEAT_F4HWN) || defined(ENABLE_FEAT_F4HWN_RESCUE_OPS)
enum FlashlightMode_t { enum FlashlightMode_t {
FLASHLIGHT_OFF = 0, FLASHLIGHT_OFF = 0,
FLASHLIGHT_ON, FLASHLIGHT_ON,
@@ -17,7 +16,6 @@
extern volatile uint16_t gFlashLightBlinkCounter; extern volatile uint16_t gFlashLightBlinkCounter;
void FlashlightTimeSlice(void); void FlashlightTimeSlice(void);
#endif
void ACTION_FlashLight(void); void ACTION_FlashLight(void);
#endif #endif

View File

@@ -270,7 +270,7 @@ static void processFKeyFunction(const KEY_Code_t Key, const bool beep) {
break; break;
case KEY_8: case KEY_8:
gTxVfo->FrequencyReverse = gTxVfo->FrequencyReverse == false; gTxVfo->FrequencyReverse = !gTxVfo->FrequencyReverse;
gRequestSaveChannel = 1; gRequestSaveChannel = 1;
break; break;
@@ -360,10 +360,8 @@ void channelMove(uint16_t Channel) {
//gRequestSaveVFO = true; //gRequestSaveVFO = true;
gVfoConfigureMode = VFO_CONFIGURE_RELOAD; gVfoConfigureMode = VFO_CONFIGURE_RELOAD;
#ifdef ENABLE_FEAT_F4HWN_RESCUE_OPS
gRemoveOffset = false; gRemoveOffset = false;
gPowerHigh = false; gPowerHigh = false;
#endif
RADIO_ConfigureChannel(gEeprom.TX_VFO, gVfoConfigureMode); RADIO_ConfigureChannel(gEeprom.TX_VFO, gVfoConfigureMode);
@@ -825,10 +823,8 @@ static void MAIN_Key_UP_DOWN(bool bKeyPressed, bool bKeyHeld, int8_t Direction)
} }
#endif #endif
#ifdef ENABLE_FEAT_F4HWN_RESCUE_OPS
gRemoveOffset = false; gRemoveOffset = false;
gPowerHigh = false; gPowerHigh = false;
#endif
uint8_t Channel = gEeprom.ScreenChannel[gEeprom.TX_VFO]; uint8_t Channel = gEeprom.ScreenChannel[gEeprom.TX_VFO];
@@ -970,10 +966,7 @@ void MAIN_ProcessKeys(KEY_Code_t Key, bool bKeyPressed, bool bKeyHeld) {
if (VfoState[vfo] == VFO_STATE_NORMAL && !TX_freq_check(gCurrentVfo->freq_config_TX.Frequency)) { if (VfoState[vfo] == VFO_STATE_NORMAL && !TX_freq_check(gCurrentVfo->freq_config_TX.Frequency)) {
RADIO_PrepareTX(); RADIO_PrepareTX();
if (gCurrentVfo->SCRAMBLING_TYPE > 0) BK4819_SetScramble(gCurrentVfo->SCRAMBLING_TYPE);
BK4819_EnableScramble(gCurrentVfo->SCRAMBLING_TYPE - 1);
else
BK4819_DisableScramble();
BK4819_ToggleGpioOut(BK4819_GPIO5_PIN1_RED, true); BK4819_ToggleGpioOut(BK4819_GPIO5_PIN1_RED, true);
MSG_FSKSendData(&dataPacket); MSG_FSKSendData(&dataPacket);
BK4819_ToggleGpioOut(BK4819_GPIO5_PIN1_RED, false); BK4819_ToggleGpioOut(BK4819_GPIO5_PIN1_RED, false);

View File

@@ -121,6 +121,11 @@ int MENU_GetLimits(uint8_t menu_id, int32_t *pMin, int32_t *pMax) {
*pMax = 9; *pMax = 9;
break; break;
case MENU_TOT:
*pMin = 0;
*pMax = 179;
break;
case MENU_STEP: case MENU_STEP:
//*pMin = 0; //*pMin = 0;
*pMax = STEP_N_ELEM - 1; *pMax = STEP_N_ELEM - 1;
@@ -259,7 +264,7 @@ int MENU_GetLimits(uint8_t menu_id, int32_t *pMin, int32_t *pMax) {
case MENU_SCR: case MENU_SCR:
//*pMin = 0; //*pMin = 0;
*pMax = 10; *pMax = 65535;
break; break;
case MENU_AUTOLK: case MENU_AUTOLK:
@@ -271,11 +276,6 @@ int MENU_GetLimits(uint8_t menu_id, int32_t *pMin, int32_t *pMax) {
*pMin = 0; *pMin = 0;
break; break;
case MENU_TOT:
//*pMin = 0;
*pMin = 5;
*pMax = 179;
break;
#ifdef ENABLE_VOX #ifdef ENABLE_VOX
case MENU_VOX: case MENU_VOX:
@@ -385,35 +385,18 @@ int MENU_GetLimits(uint8_t menu_id, int32_t *pMin, int32_t *pMax) {
//*pMin = 0; //*pMin = 0;
*pMax = ARRAY_SIZE(gSubMenu_SET_PTT) - 1; *pMax = ARRAY_SIZE(gSubMenu_SET_PTT) - 1;
break; break;
case MENU_SET_TOT:
case MENU_SET_EOT:
//*pMin = 0;
*pMax = ARRAY_SIZE(gSubMenu_SET_TOT) - 1;
break;
#ifdef ENABLE_FEAT_F4HWN_INV #ifdef ENABLE_FEAT_F4HWN_INV
case MENU_SET_INV: case MENU_SET_INV:
//*pMin = 0; //*pMin = 0;
*pMax = ARRAY_SIZE(gSubMenu_OFF_ON) - 1; *pMax = ARRAY_SIZE(gSubMenu_OFF_ON) - 1;
break; break;
#endif #endif
#ifdef ENABLE_FEAT_F4HWN_NARROWER
case MENU_SET_NFM:
//*pMin = 0;
*pMax = ARRAY_SIZE(gSubMenu_SET_NFM) - 1;
break;
#endif
#ifdef ENABLE_FEAT_F4HWN_VOL #ifdef ENABLE_FEAT_F4HWN_VOL
case MENU_SET_VOL: case MENU_SET_VOL:
//*pMin = 0; //*pMin = 0;
*pMax = 63; *pMax = 63;
break; break;
#endif #endif
#ifdef ENABLE_FEAT_F4HWN_RESCUE_OPS
case MENU_SET_KEY:
//*pMin = 0;
*pMax = 4;
break;
#endif
#endif #endif
default: default:
@@ -512,10 +495,7 @@ void MENU_AcceptSetting(void) {
case MENU_SCR: case MENU_SCR:
gTxVfo->SCRAMBLING_TYPE = gSubMenuSelection; gTxVfo->SCRAMBLING_TYPE = gSubMenuSelection;
if (gSubMenuSelection > 0) BK4819_SetScramble(gSubMenuSelection);
BK4819_EnableScramble(gSubMenuSelection - 1);
else
BK4819_DisableScramble();
gRequestSaveChannel = 1; gRequestSaveChannel = 1;
return; return;
@@ -524,6 +504,10 @@ void MENU_AcceptSetting(void) {
gRequestSaveChannel = 1; gRequestSaveChannel = 1;
return; return;
case MENU_TOT:
gEeprom.TX_TIMEOUT_TIMER = gSubMenuSelection;
break;
case MENU_MEM_CH: case MENU_MEM_CH:
gTxVfo->CHANNEL_SAVE = gSubMenuSelection; gTxVfo->CHANNEL_SAVE = gSubMenuSelection;
#if 0 #if 0
@@ -600,10 +584,6 @@ void MENU_AcceptSetting(void) {
gEeprom.BEEP_CONTROL = gSubMenuSelection; gEeprom.BEEP_CONTROL = gSubMenuSelection;
break; break;
case MENU_TOT:
gEeprom.TX_TIMEOUT_TIMER = gSubMenuSelection;
break;
#ifdef ENABLE_VOICE #ifdef ENABLE_VOICE
case MENU_VOICE: case MENU_VOICE:
gEeprom.VOICE_PROMPT = gSubMenuSelection; gEeprom.VOICE_PROMPT = gSubMenuSelection;
@@ -843,31 +823,13 @@ void MENU_AcceptSetting(void) {
gSetting_set_ptt = gSubMenuSelection; gSetting_set_ptt = gSubMenuSelection;
gSetting_set_ptt_session = gSetting_set_ptt; // Special for action gSetting_set_ptt_session = gSetting_set_ptt; // Special for action
break; break;
case MENU_SET_TOT:
gSetting_set_tot = gSubMenuSelection;
break;
case MENU_SET_EOT:
gSetting_set_eot = gSubMenuSelection;
break;
case MENU_SET_INV: case MENU_SET_INV:
gSetting_set_inv = gSubMenuSelection; gSetting_set_inv = gSubMenuSelection;
break; break;
#ifdef ENABLE_FEAT_F4HWN_NARROWER
case MENU_SET_NFM:
gSetting_set_nfm = gSubMenuSelection;
RADIO_SetTxParameters();
RADIO_SetupRegisters(true);
break;
#endif
#ifdef ENABLE_FEAT_F4HWN_VOL #ifdef ENABLE_FEAT_F4HWN_VOL
case MENU_SET_VOL: case MENU_SET_VOL:
gEeprom.VOLUME_GAIN = gSubMenuSelection; gEeprom.VOLUME_GAIN = gSubMenuSelection;
break; break;
#endif
#ifdef ENABLE_FEAT_F4HWN_RESCUE_OPS
case MENU_SET_KEY:
gEeprom.SET_KEY = gSubMenuSelection;
break;
#endif #endif
case MENU_SET_TMR: case MENU_SET_TMR:
gSetting_set_tmr = gSubMenuSelection; gSetting_set_tmr = gSubMenuSelection;
@@ -978,6 +940,10 @@ void MENU_ShowCurrentSetting(void) {
gSubMenuSelection = gTxVfo->BUSY_CHANNEL_LOCK; gSubMenuSelection = gTxVfo->BUSY_CHANNEL_LOCK;
break; break;
case MENU_TOT:
gSubMenuSelection = gEeprom.TX_TIMEOUT_TIMER;
break;
case MENU_MEM_CH: case MENU_MEM_CH:
#if 0 #if 0
gSubMenuSelection = gEeprom.MrChannel[0]; gSubMenuSelection = gEeprom.MrChannel[0];
@@ -1032,11 +998,6 @@ void MENU_ShowCurrentSetting(void) {
case MENU_BEEP: case MENU_BEEP:
gSubMenuSelection = gEeprom.BEEP_CONTROL; gSubMenuSelection = gEeprom.BEEP_CONTROL;
break; break;
case MENU_TOT:
gSubMenuSelection = gEeprom.TX_TIMEOUT_TIMER;
break;
#ifdef ENABLE_VOICE #ifdef ENABLE_VOICE
case MENU_VOICE: case MENU_VOICE:
gSubMenuSelection = gEeprom.VOICE_PROMPT; gSubMenuSelection = gEeprom.VOICE_PROMPT;
@@ -1242,29 +1203,13 @@ void MENU_ShowCurrentSetting(void) {
case MENU_SET_PTT: case MENU_SET_PTT:
gSubMenuSelection = gSetting_set_ptt_session; gSubMenuSelection = gSetting_set_ptt_session;
break; break;
case MENU_SET_TOT:
gSubMenuSelection = gSetting_set_tot;
break;
case MENU_SET_EOT:
gSubMenuSelection = gSetting_set_eot;
break;
case MENU_SET_INV: case MENU_SET_INV:
gSubMenuSelection = gSetting_set_inv; gSubMenuSelection = gSetting_set_inv;
break; break;
#ifdef ENABLE_FEAT_F4HWN_NARROWER
case MENU_SET_NFM:
gSubMenuSelection = gSetting_set_nfm;
break;
#endif
#ifdef ENABLE_FEAT_F4HWN_VOL #ifdef ENABLE_FEAT_F4HWN_VOL
case MENU_SET_VOL: case MENU_SET_VOL:
gSubMenuSelection = gEeprom.VOLUME_GAIN; gSubMenuSelection = gEeprom.VOLUME_GAIN;
break; break;
#endif
#ifdef ENABLE_FEAT_F4HWN_RESCUE_OPS
case MENU_SET_KEY:
gSubMenuSelection = gEeprom.SET_KEY;
break;
#endif #endif
case MENU_SET_TMR: case MENU_SET_TMR:
gSubMenuSelection = gSetting_set_tmr; gSubMenuSelection = gSetting_set_tmr;
@@ -1400,7 +1345,15 @@ static void MENU_Key_0_to_9(KEY_Code_t Key, bool bKeyPressed, bool bKeyHeld) {
return; return;
} }
Offset = (Max >= 100) ? 3 : (Max >= 10) ? 2 : 1; Offset = (Max >= 1000000000) ? 10 :
(Max >= 100000000) ? 9 :
(Max >= 10000000) ? 8 :
(Max >= 1000000) ? 7 :
(Max >= 100000) ? 6 :
(Max >= 10000) ? 5 :
(Max >= 1000) ? 4 :
(Max >= 100) ? 3 :
(Max >= 10) ? 2 : 1;
/* /*
switch (gInputBoxIndex) switch (gInputBoxIndex)

View File

@@ -66,12 +66,6 @@ void BACKLIGHT_InitHardware()
0; 0;
} }
static void BACKLIGHT_Sound(void)
{
gK5startup = false;
}
void BACKLIGHT_TurnOn(void) void BACKLIGHT_TurnOn(void)
{ {
#ifdef ENABLE_FEAT_F4HWN_SLEEP #ifdef ENABLE_FEAT_F4HWN_SLEEP
@@ -84,38 +78,11 @@ void BACKLIGHT_TurnOn(void)
if (gEeprom.BACKLIGHT_TIME == 0) { if (gEeprom.BACKLIGHT_TIME == 0) {
BACKLIGHT_TurnOff(); BACKLIGHT_TurnOff();
#ifdef ENABLE_FEAT_F4HWN
if(gK5startup == true)
{
BACKLIGHT_Sound();
}
#endif
return; return;
} }
backlightOn = true; backlightOn = true;
#ifdef ENABLE_FEAT_F4HWN
if(gK5startup == true) {
#if defined(ENABLE_FMRADIO) && defined(ENABLE_SPECTRUM)
BACKLIGHT_SetBrightness(gEeprom.BACKLIGHT_MAX);
#else
for(uint8_t i = 0; i <= gEeprom.BACKLIGHT_MAX; i++)
{
BACKLIGHT_SetBrightness(i);
SYSTEM_DelayMs(50);
}
#endif
BACKLIGHT_Sound();
}
else
{
BACKLIGHT_SetBrightness(gEeprom.BACKLIGHT_MAX); BACKLIGHT_SetBrightness(gEeprom.BACKLIGHT_MAX);
}
#else
BACKLIGHT_SetBrightness(gEeprom.BACKLIGHT_MAX);
#endif
switch (gEeprom.BACKLIGHT_TIME) { switch (gEeprom.BACKLIGHT_TIME) {
default: default:

View File

@@ -48,6 +48,12 @@ __inline uint16_t scale_freq(uint16_t freq)
return (((uint32_t)freq * 1353245u) + (1u << 16)) >> 17; // with rounding return (((uint32_t)freq * 1353245u) + (1u << 16)) >> 17; // with rounding
} }
__inline uint16_t inverse_scale_freq(uint16_t scaled_freq)
{
return (((uint32_t)scaled_freq << 17) - (1u << 16)) / 1353245u;
}
void BK4819_FskEnableTx(void){ void BK4819_FskEnableTx(void){
const uint16_t fsk_reg59 = BK4819_ReadRegister(BK4819_REG_59); const uint16_t fsk_reg59 = BK4819_ReadRegister(BK4819_REG_59);
BK4819_WriteRegister(BK4819_REG_59, (1u << 11) | fsk_reg59); BK4819_WriteRegister(BK4819_REG_59, (1u << 11) | fsk_reg59);
@@ -854,18 +860,18 @@ void BK4819_PickRXFilterPathBasedOnFrequency(uint32_t Frequency)
} }
} }
void BK4819_DisableScramble(void) void BK4819_SetScramble(uint16_t Freq)
{ {
const uint16_t Value = BK4819_ReadRegister(BK4819_REG_31); uint16_t Value = BK4819_ReadRegister(BK4819_REG_31);
BK4819_WriteRegister(BK4819_REG_31, Value & ~(1u << 1)); if (Freq) {
} Value |= (1u << 1);
} else {
Value &= ~(1u << 1);
}
BK4819_WriteRegister(BK4819_REG_31, Value);
void BK4819_EnableScramble(uint8_t Type) //BK4819_WriteRegister(BK4819_REG_71, 0x68DC + (Freq * 1032)); // 0110 1000 1101 1100
{ BK4819_WriteRegister(BK4819_REG_71, Freq);
const uint16_t Value = BK4819_ReadRegister(BK4819_REG_31);
BK4819_WriteRegister(BK4819_REG_31, Value | (1u << 1));
BK4819_WriteRegister(BK4819_REG_71, 0x68DC + (Type * 1032)); // 0110 1000 1101 1100
} }
bool BK4819_CompanderEnabled(void) bool BK4819_CompanderEnabled(void)

View File

@@ -65,6 +65,7 @@ typedef enum BK4819_CssScanResult_t BK4819_CssScanResult_t;
// radio is asleep, not listening // radio is asleep, not listening
extern bool gRxIdleMode; extern bool gRxIdleMode;
uint16_t inverse_scale_freq(uint16_t scaled_freq);
uint16_t scale_freq(uint16_t freq); uint16_t scale_freq(uint16_t freq);
void BK4819_Init(void); void BK4819_Init(void);
@@ -102,8 +103,7 @@ void BK4819_SetupSquelch(
void BK4819_SetAF(BK4819_AF_Type_t AF); void BK4819_SetAF(BK4819_AF_Type_t AF);
void BK4819_RX_TurnOn(void); void BK4819_RX_TurnOn(void);
void BK4819_PickRXFilterPathBasedOnFrequency(uint32_t Frequency); void BK4819_PickRXFilterPathBasedOnFrequency(uint32_t Frequency);
void BK4819_DisableScramble(void); void BK4819_SetScramble(uint16_t Freq);
void BK4819_EnableScramble(uint8_t Type);
bool BK4819_CompanderEnabled(void); bool BK4819_CompanderEnabled(void);
void BK4819_SetCompander(const unsigned int mode); void BK4819_SetCompander(const unsigned int mode);

View File

@@ -251,6 +251,7 @@ void FUNCTION_Transmit() {
DTMF_Reply(); DTMF_Reply();
BK4819_SetScramble(gCurrentVfo->SCRAMBLING_TYPE);
if (gCurrentVfo->DTMF_PTT_ID_TX_MODE == PTT_ID_APOLLO) if (gCurrentVfo->DTMF_PTT_ID_TX_MODE == PTT_ID_APOLLO)
BK4819_PlaySingleTone(2525, 250, 0, gEeprom.DTMF_SIDE_TONE); BK4819_PlaySingleTone(2525, 250, 0, gEeprom.DTMF_SIDE_TONE);
@@ -285,10 +286,6 @@ void FUNCTION_Transmit() {
#endif #endif
if (gCurrentVfo->SCRAMBLING_TYPE > 0)
BK4819_EnableScramble(gCurrentVfo->SCRAMBLING_TYPE - 1);
else
BK4819_DisableScramble();
if (gSetting_backlight_on_tx_rx & BACKLIGHT_ON_TR_TX) { if (gSetting_backlight_on_tx_rx & BACKLIGHT_ON_TR_TX) {
BACKLIGHT_TurnOn(); BACKLIGHT_TurnOn();

View File

@@ -44,13 +44,6 @@ BOOT_Mode_t BOOT_GetMode(void) {
SYSTEM_DelayMs(20); SYSTEM_DelayMs(20);
} }
#ifdef ENABLE_FEAT_F4HWN_RESCUE_OPS
if (Keys[0] == (10 + gEeprom.SET_KEY))
{
return BOOT_MODE_RESCUE_OPS; // Secret KEY pressed
}
#endif
if (Keys[0] == Keys[1]) { if (Keys[0] == Keys[1]) {
gKeyReading0 = Keys[0]; gKeyReading0 = Keys[0];
gKeyReading1 = Keys[0]; gKeyReading1 = Keys[0];

7
misc.c
View File

@@ -111,12 +111,7 @@ enum BacklightOnRxTx_t gSetting_backlight_on_tx_rx;
#ifdef ENABLE_FEAT_F4HWN #ifdef ENABLE_FEAT_F4HWN
bool gSetting_set_ptt = 0; bool gSetting_set_ptt = 0;
uint8_t gSetting_set_tot = 0;
bool gSetting_set_inv = false; bool gSetting_set_inv = false;
uint8_t gSetting_set_eot = 0;
#ifdef ENABLE_FEAT_F4HWN_NARROWER
bool gSetting_set_nfm = 0;
#endif
bool gSetting_set_tmr = 0; bool gSetting_set_tmr = 0;
bool gSetting_set_ptt_session; bool gSetting_set_ptt_session;
#ifdef ENABLE_FEAT_F4HWN_DEBUG #ifdef ENABLE_FEAT_F4HWN_DEBUG
@@ -128,10 +123,8 @@ enum BacklightOnRxTx_t gSetting_backlight_on_tx_rx;
uint8_t crc[15] = { 0 }; uint8_t crc[15] = { 0 };
uint8_t lErrorsDuringAirCopy = 0; uint8_t lErrorsDuringAirCopy = 0;
uint8_t gAircopyStep = 0; uint8_t gAircopyStep = 0;
#ifdef ENABLE_FEAT_F4HWN_RESCUE_OPS
bool gPowerHigh = false; bool gPowerHigh = false;
bool gRemoveOffset = false; bool gRemoveOffset = false;
#endif
#endif #endif
#ifdef ENABLE_AUDIO_BAR #ifdef ENABLE_AUDIO_BAR

7
misc.h
View File

@@ -165,12 +165,7 @@ extern enum BacklightOnRxTx_t gSetting_backlight_on_tx_rx;
#ifdef ENABLE_FEAT_F4HWN #ifdef ENABLE_FEAT_F4HWN
extern bool gSetting_set_ptt; extern bool gSetting_set_ptt;
extern uint8_t gSetting_set_tot;
extern bool gSetting_set_inv; extern bool gSetting_set_inv;
extern uint8_t gSetting_set_eot;
#ifdef ENABLE_FEAT_F4HWN_NARROWER
extern bool gSetting_set_nfm;
#endif
extern bool gSetting_set_tmr; extern bool gSetting_set_tmr;
extern bool gSetting_set_ptt_session; extern bool gSetting_set_ptt_session;
#ifdef ENABLE_FEAT_F4HWN_DEBUG #ifdef ENABLE_FEAT_F4HWN_DEBUG
@@ -182,10 +177,8 @@ extern enum BacklightOnRxTx_t gSetting_backlight_on_tx_rx;
extern uint8_t crc[15]; extern uint8_t crc[15];
extern uint8_t lErrorsDuringAirCopy; extern uint8_t lErrorsDuringAirCopy;
extern uint8_t gAircopyStep; extern uint8_t gAircopyStep;
#ifdef ENABLE_FEAT_F4HWN_RESCUE_OPS
extern bool gPowerHigh; extern bool gPowerHigh;
extern bool gRemoveOffset; extern bool gRemoveOffset;
#endif
#endif #endif
#ifdef ENABLE_AUDIO_BAR #ifdef ENABLE_AUDIO_BAR

54
radio.c
View File

@@ -229,13 +229,13 @@ void RADIO_ConfigureChannel(const unsigned int VFO, const unsigned int configure
uint16_t base; uint16_t base;
if (IS_MR_CHANNEL(channel)) if (IS_MR_CHANNEL(channel))
base = channel * 16; base = channel * 24;
else else
base = 0x0C80 + ((channel - FREQ_CHANNEL_FIRST) * 32) + (VFO * 16); base = 0x0C80 + ((channel - FREQ_CHANNEL_FIRST) * 32) + (VFO * 24);
if (configure == VFO_CONFIGURE_RELOAD || IS_FREQ_CHANNEL(channel)) { if (configure == VFO_CONFIGURE_RELOAD || IS_FREQ_CHANNEL(channel)) {
uint8_t tmp; uint8_t tmp;
uint8_t data[8]; uint8_t data[10];
// *************** // ***************
@@ -256,10 +256,10 @@ void RADIO_ConfigureChannel(const unsigned int VFO, const unsigned int configure
pVfo->STEP_SETTING = tmp; pVfo->STEP_SETTING = tmp;
pVfo->StepFrequency = gStepFrequencyTable[tmp]; pVfo->StepFrequency = gStepFrequencyTable[tmp];
tmp = data[7]; tmp = data[8];
if (tmp > 10) pVfo->SCRAMBLING_TYPE = tmp ;
tmp = 0; tmp = data[9];
pVfo->SCRAMBLING_TYPE = tmp; pVfo->SCRAMBLING_TYPE |= tmp << 8;
//pVfo->SCRAMBLING_TYPE = 0; //pVfo->SCRAMBLING_TYPE = 0;
pVfo->freq_config_RX.CodeType = (data[2] >> 0) & 0x0F; pVfo->freq_config_RX.CodeType = (data[2] >> 0) & 0x0F;
@@ -314,10 +314,10 @@ void RADIO_ConfigureChannel(const unsigned int VFO, const unsigned int configure
pVfo->BUSY_CHANNEL_LOCK = false; pVfo->BUSY_CHANNEL_LOCK = false;
} else { } else {
const uint8_t d4 = data[4]; const uint8_t d4 = data[4];
pVfo->FrequencyReverse = !!((d4 >> 0) & 1u); pVfo->FrequencyReverse = ((d4 >> 0) & 1u) != 0;
pVfo->CHANNEL_BANDWIDTH = !!((d4 >> 1) & 1u); pVfo->CHANNEL_BANDWIDTH = ((d4 >> 1) & 3u);
pVfo->OUTPUT_POWER = ((d4 >> 2) & 7u); pVfo->OUTPUT_POWER = ((d4 >> 3) & 7u);
pVfo->BUSY_CHANNEL_LOCK = !!((d4 >> 5) & 1u); pVfo->BUSY_CHANNEL_LOCK = ((d4 >> 6) & 1u) != 0;
} }
if (data[5] == 0xFF) { if (data[5] == 0xFF) {
@@ -388,7 +388,6 @@ void RADIO_ConfigureChannel(const unsigned int VFO, const unsigned int configure
pVfo->Compander = att.compander; pVfo->Compander = att.compander;
#ifdef ENABLE_FEAT_F4HWN_RESCUE_OPS
if(gRemoveOffset) if(gRemoveOffset)
{ {
pVfo->pTX = &pVfo->freq_config_RX; pVfo->pTX = &pVfo->freq_config_RX;
@@ -398,7 +397,6 @@ void RADIO_ConfigureChannel(const unsigned int VFO, const unsigned int configure
{ {
pVfo->OUTPUT_POWER = OUTPUT_POWER_HIGH; pVfo->OUTPUT_POWER = OUTPUT_POWER_HIGH;
} }
#endif
RADIO_ConfigureSquelchAndOutputPower(pVfo); RADIO_ConfigureSquelchAndOutputPower(pVfo);
} }
@@ -492,7 +490,7 @@ void RADIO_ConfigureSquelchAndOutputPower(VFO_Info_t *pInfo) {
} }
currentPower--; currentPower--;
EEPROM_ReadBuffer(0x1ED0 + (Band * 16) + (Op * 3), Txp, 3); EEPROM_ReadBuffer(0x1ED0 + (Band * 20) + (Op * 3), Txp, 3);
#ifdef ENABLE_FEAT_F4HWN #ifdef ENABLE_FEAT_F4HWN
// make low and mid even lower // make low and mid even lower
@@ -620,12 +618,6 @@ void RADIO_SelectVfos(void) {
void RADIO_SetupRegisters(bool switchToForeground) { void RADIO_SetupRegisters(bool switchToForeground) {
BK4819_FilterBandwidth_t Bandwidth = gRxVfo->CHANNEL_BANDWIDTH; BK4819_FilterBandwidth_t Bandwidth = gRxVfo->CHANNEL_BANDWIDTH;
#ifdef ENABLE_FEAT_F4HWN_NARROWER
if (Bandwidth == BK4819_FILTER_BW_NARROW && gSetting_set_nfm == 1) {
Bandwidth = BK4819_FILTER_BW_NARROWER;
}
#endif
AUDIO_AudioPathOff(); AUDIO_AudioPathOff();
gEnableSpeaker = false; gEnableSpeaker = false;
@@ -746,10 +738,9 @@ void RADIO_SetupRegisters(bool switchToForeground) {
break; break;
} }
if (gRxVfo->SCRAMBLING_TYPE > 0) BK4819_SetScramble(0);
BK4819_EnableScramble(gRxVfo->SCRAMBLING_TYPE - 1); SYSTEM_DelayMs(10);
else BK4819_SetScramble(gRxVfo->SCRAMBLING_TYPE);
BK4819_DisableScramble();
} }
} }
#ifdef ENABLE_NOAA #ifdef ENABLE_NOAA
@@ -846,12 +837,6 @@ void RADIO_ConfigureNOAA(void)
void RADIO_SetTxParameters(void) { void RADIO_SetTxParameters(void) {
BK4819_FilterBandwidth_t Bandwidth = gCurrentVfo->CHANNEL_BANDWIDTH; BK4819_FilterBandwidth_t Bandwidth = gCurrentVfo->CHANNEL_BANDWIDTH;
#ifdef ENABLE_FEAT_F4HWN_NARROWER
if (Bandwidth == BK4819_FILTER_BW_NARROW && gSetting_set_nfm == 1) {
Bandwidth = BK4819_FILTER_BW_NARROWER;
}
#endif
AUDIO_AudioPathOff(); AUDIO_AudioPathOff();
gEnableSpeaker = false; gEnableSpeaker = false;
@@ -1085,15 +1070,6 @@ void RADIO_PrepareTX(void) {
gTxTimerCountdown_500ms = ((gEeprom.TX_TIMEOUT_TIMER + 1) * 5) * 2; gTxTimerCountdown_500ms = ((gEeprom.TX_TIMEOUT_TIMER + 1) * 5) * 2;
/*
if (gEeprom.TX_TIMEOUT_TIMER == 0)
gTxTimerCountdown_500ms = 60; // 30 sec
else if (gEeprom.TX_TIMEOUT_TIMER < (ARRAY_SIZE(gSubMenu_TOT) - 1))
gTxTimerCountdown_500ms = 120 * gEeprom.TX_TIMEOUT_TIMER; // minutes
else
gTxTimerCountdown_500ms = 120 * 15; // 15 minutes
*/
#ifdef ENABLE_FEAT_F4HWN #ifdef ENABLE_FEAT_F4HWN
gTxTimerCountdownAlert_500ms = gTxTimerCountdown_500ms; gTxTimerCountdownAlert_500ms = gTxTimerCountdown_500ms;
#endif #endif

127
radio.h
View File

@@ -24,7 +24,7 @@
#include "frequencies.h" #include "frequencies.h"
enum { enum {
RADIO_CHANNEL_UP = 0x01u, RADIO_CHANNEL_UP = 0x01u,
RADIO_CHANNEL_DOWN = 0xFFu, RADIO_CHANNEL_DOWN = 0xFFu,
}; };
@@ -42,8 +42,7 @@ enum PTT_ID_t {
}; };
typedef enum PTT_ID_t PTT_ID_t; typedef enum PTT_ID_t PTT_ID_t;
enum VfoState_t enum VfoState_t {
{
VFO_STATE_NORMAL = 0, VFO_STATE_NORMAL = 0,
VFO_STATE_BUSY, VFO_STATE_BUSY,
VFO_STATE_BAT_LOW, VFO_STATE_BAT_LOW,
@@ -70,18 +69,16 @@ typedef enum {
extern const char gModulationStr[MODULATION_UKNOWN][4]; extern const char gModulationStr[MODULATION_UKNOWN][4];
typedef struct typedef struct {
{ uint32_t Frequency;
uint32_t Frequency;
DCS_CodeType_t CodeType; DCS_CodeType_t CodeType;
uint8_t Code; uint8_t Code;
uint8_t Padding[2]; uint8_t Padding[2];
} FREQ_Config_t; } FREQ_Config_t;
typedef struct VFO_Info_t typedef struct VFO_Info_t {
{ FREQ_Config_t freq_config_RX;
FREQ_Config_t freq_config_RX; FREQ_Config_t freq_config_TX;
FREQ_Config_t freq_config_TX;
// this is for a purpose of the FrequencyReverse function // this is for a purpose of the FrequencyReverse function
// it points to freq_config_RX normally and to freq_config_TX if reverse function is active // it points to freq_config_RX normally and to freq_config_TX if reverse function is active
@@ -92,81 +89,97 @@ typedef struct VFO_Info_t
// it points to freq_config_TX normally and to freq_config_RX if reverse function is active // it points to freq_config_TX normally and to freq_config_RX if reverse function is active
FREQ_Config_t *pTX; FREQ_Config_t *pTX;
uint32_t TX_OFFSET_FREQUENCY; uint32_t TX_OFFSET_FREQUENCY;
uint16_t StepFrequency; uint16_t StepFrequency;
uint8_t CHANNEL_SAVE; uint8_t CHANNEL_SAVE;
uint8_t TX_OFFSET_FREQUENCY_DIRECTION; uint8_t TX_OFFSET_FREQUENCY_DIRECTION;
uint8_t SquelchOpenRSSIThresh; uint8_t SquelchOpenRSSIThresh;
uint8_t SquelchOpenNoiseThresh; uint8_t SquelchOpenNoiseThresh;
uint8_t SquelchCloseGlitchThresh; uint8_t SquelchCloseGlitchThresh;
uint8_t SquelchCloseRSSIThresh; uint8_t SquelchCloseRSSIThresh;
uint8_t SquelchCloseNoiseThresh; uint8_t SquelchCloseNoiseThresh;
uint8_t SquelchOpenGlitchThresh; uint8_t SquelchOpenGlitchThresh;
STEP_Setting_t STEP_SETTING; STEP_Setting_t STEP_SETTING;
uint8_t OUTPUT_POWER; uint8_t OUTPUT_POWER;
uint8_t TXP_CalculatedSetting; uint8_t TXP_CalculatedSetting;
bool FrequencyReverse; bool FrequencyReverse;
uint8_t SCRAMBLING_TYPE; uint16_t SCRAMBLING_TYPE;
uint8_t CHANNEL_BANDWIDTH; uint8_t CHANNEL_BANDWIDTH;
uint8_t SCANLIST1_PARTICIPATION; uint8_t SCANLIST1_PARTICIPATION;
uint8_t SCANLIST2_PARTICIPATION; uint8_t SCANLIST2_PARTICIPATION;
uint8_t SCANLIST3_PARTICIPATION; uint8_t SCANLIST3_PARTICIPATION;
uint8_t Band; uint8_t Band;
#ifdef ENABLE_DTMF_CALLING #ifdef ENABLE_DTMF_CALLING
uint8_t DTMF_DECODING_ENABLE; uint8_t DTMF_DECODING_ENABLE;
#endif #endif
PTT_ID_t DTMF_PTT_ID_TX_MODE; PTT_ID_t DTMF_PTT_ID_TX_MODE;
uint8_t BUSY_CHANNEL_LOCK; uint8_t BUSY_CHANNEL_LOCK;
ModulationMode_t Modulation; ModulationMode_t Modulation;
uint8_t Compander; uint8_t Compander;
char Name[16]; char Name[16];
} VFO_Info_t; } VFO_Info_t;
// Settings of the main VFO that is selected by the user // Settings of the main VFO that is selected by the user
// The pointer follows gEeprom.TX_VFO index // The pointer follows gEeprom.TX_VFO index
extern VFO_Info_t *gTxVfo; extern VFO_Info_t *gTxVfo;
// Settings of the actual VFO that is now used for RX, // Settings of the actual VFO that is now used for RX,
// It is being alternated by dual watch, and flipped by crossband // It is being alternated by dual watch, and flipped by crossband
// The pointer follows gEeprom.RX_VFO // The pointer follows gEeprom.RX_VFO
extern VFO_Info_t *gRxVfo; extern VFO_Info_t *gRxVfo;
// Equal to gTxVfo unless dual watch changes it on incomming transmition (this can only happen when XB off and DW on) // Equal to gTxVfo unless dual watch changes it on incomming transmition (this can only happen when XB off and DW on)
extern VFO_Info_t *gCurrentVfo; extern VFO_Info_t *gCurrentVfo;
extern DCS_CodeType_t gCurrentCodeType; extern DCS_CodeType_t gCurrentCodeType;
extern VfoState_t VfoState[2]; extern VfoState_t VfoState[2];
bool RADIO_CheckValidChannel(uint16_t channel, bool checkScanList, uint8_t scanList);
uint8_t RADIO_FindNextChannel(uint8_t ChNum, int8_t Direction, bool bCheckScanList, uint8_t RadioNum);
void RADIO_InitInfo(VFO_Info_t *pInfo, const uint8_t ChannelSave, const uint32_t Frequency);
void RADIO_ConfigureChannel(const unsigned int VFO, const unsigned int configure);
void RADIO_ConfigureSquelchAndOutputPower(VFO_Info_t *pInfo);
void RADIO_ApplyOffset(VFO_Info_t *pInfo);
void RADIO_SelectVfos(void);
void RADIO_SetupRegisters(bool switchToForeground);
bool RADIO_CheckValidChannel(uint16_t channel, bool checkScanList, uint8_t scanList);
uint8_t RADIO_FindNextChannel(uint8_t ChNum, int8_t Direction, bool bCheckScanList, uint8_t RadioNum);
void RADIO_InitInfo(VFO_Info_t *pInfo, const uint8_t ChannelSave, const uint32_t Frequency);
void RADIO_ConfigureChannel(const unsigned int VFO, const unsigned int configure);
void RADIO_ConfigureSquelchAndOutputPower(VFO_Info_t *pInfo);
void RADIO_ApplyOffset(VFO_Info_t *pInfo);
void RADIO_SelectVfos(void);
void RADIO_SetupRegisters(bool switchToForeground);
#ifdef ENABLE_NOAA #ifdef ENABLE_NOAA
void RADIO_ConfigureNOAA(void); void RADIO_ConfigureNOAA(void);
#endif #endif
void RADIO_SetTxParameters(void);
void RADIO_SetupAGC(bool listeningAM, bool disable); void RADIO_SetTxParameters(void);
void RADIO_SetModulation(ModulationMode_t modulation);
void RADIO_SetVfoState(VfoState_t State); void RADIO_SetupAGC(bool listeningAM, bool disable);
void RADIO_PrepareTX(void);
void RADIO_SendCssTail(void); void RADIO_SetModulation(ModulationMode_t modulation);
void RADIO_PrepareCssTX(void);
void RADIO_SendEndOfTransmission(void); void RADIO_SetVfoState(VfoState_t State);
void RADIO_PrepareTX(void);
void RADIO_SendCssTail(void);
void RADIO_PrepareCssTX(void);
void RADIO_SendEndOfTransmission(void);
#endif #endif

View File

@@ -57,13 +57,14 @@ void SystickHandler(void)
gNextTimeslice_500ms = true; gNextTimeslice_500ms = true;
#ifdef ENABLE_FEAT_F4HWN #ifdef ENABLE_FEAT_F4HWN
DECREMENT_AND_TRIGGER(gTxTimerCountdownAlert_500ms - ALERT_TOT * 2, gTxTimeoutReachedAlert);
#ifdef ENABLE_FEAT_F4HWN_RX_TX_TIMER #ifdef ENABLE_FEAT_F4HWN_RX_TX_TIMER
DECREMENT(gRxTimerCountdown_500ms); DECREMENT(gRxTimerCountdown_500ms);
#endif #endif
#endif #endif
DECREMENT_AND_TRIGGER(gTxTimerCountdown_500ms, gTxTimeoutReached); if (gEeprom.TX_TIMEOUT_TIMER != 0) {
DECREMENT_AND_TRIGGER(gTxTimerCountdown_500ms, gTxTimeoutReached);
}
DECREMENT(gSerialConfigCountDown_500ms); DECREMENT(gSerialConfigCountDown_500ms);
} }

View File

@@ -53,12 +53,9 @@ void SETTINGS_InitEEPROM(void) {
gEeprom.NOAA_AUTO_SCAN = (Data[3] < 2) ? Data[3] : false; gEeprom.NOAA_AUTO_SCAN = (Data[3] < 2) ? Data[3] : false;
#endif #endif
#ifdef ENABLE_FEAT_F4HWN_RESCUE_OPS #ifdef ENABLE_FEAT_F4HWN_RESCUE_OPS
gEeprom.KEY_LOCK = (Data[4] & 0x01) != 0;
gEeprom.MENU_LOCK = (Data[4] & 0x02) != 0; gEeprom.MENU_LOCK = (Data[4] & 0x02) != 0;
gEeprom.SET_KEY = ((Data[4] >> 2) & 0x0F) > 4 ? 0 : (Data[4] >> 2) & 0x0F;
#else
gEeprom.KEY_LOCK = (Data[4] < 2) ? Data[4] : false;
#endif #endif
gEeprom.KEY_LOCK = (Data[4] < 2) != 0 && Data[4];
#ifdef ENABLE_VOX #ifdef ENABLE_VOX
gEeprom.VOX_SWITCH = (Data[5] < 2) ? Data[5] : false; gEeprom.VOX_SWITCH = (Data[5] < 2) ? Data[5] : false;
gEeprom.VOX_LEVEL = (Data[6] < 10) ? Data[6] : 1; gEeprom.VOX_LEVEL = (Data[6] < 10) ? Data[6] : 1;
@@ -77,12 +74,8 @@ void SETTINGS_InitEEPROM(void) {
gEeprom.BATTERY_SAVE = (Data[3] < 6) ? Data[3] : 4; gEeprom.BATTERY_SAVE = (Data[3] < 6) ? Data[3] : 4;
gEeprom.DUAL_WATCH = (Data[4] < 3) ? Data[4] : DUAL_WATCH_CHAN_A; gEeprom.DUAL_WATCH = (Data[4] < 3) ? Data[4] : DUAL_WATCH_CHAN_A;
gEeprom.BACKLIGHT_TIME = (Data[5] < 62) ? Data[5] : 12; gEeprom.BACKLIGHT_TIME = (Data[5] < 62) ? Data[5] : 12;
#ifdef ENABLE_FEAT_F4HWN_NARROWER
gEeprom.TAIL_TONE_ELIMINATION = Data[6] & 0x01; gEeprom.TAIL_TONE_ELIMINATION = (Data[6] < 2) != 0 && Data[6];
gSetting_set_nfm = (Data[6] >> 1) & 0x01;
#else
gEeprom.TAIL_TONE_ELIMINATION = (Data[6] < 2) ? Data[6] : false;
#endif
#ifdef ENABLE_FEAT_F4HWN_RESUME_STATE #ifdef ENABLE_FEAT_F4HWN_RESUME_STATE
gEeprom.VFO_OPEN = Data[7] & 0x01; gEeprom.VFO_OPEN = Data[7] & 0x01;
@@ -274,10 +267,11 @@ void SETTINGS_InitEEPROM(void) {
gEeprom.FSKSRCAddress |= Data[1] << 8; gEeprom.FSKSRCAddress |= Data[1] << 8;
gEeprom.FSKSRCAddress |= Data[2] << 16; gEeprom.FSKSRCAddress |= Data[2] << 16;
gEeprom.FSKSRCAddress |= Data[3] << 24; gEeprom.FSKSRCAddress |= Data[3] << 24;
#ifdef ENABLE_FMRADIO
gEeprom.BK1080_AGC_ENABLED = Data[4] & 0x01; gEeprom.BK1080_AGC_ENABLED = Data[4] & 0x01;
gEeprom.BK1080_BLEND_CONFIG = (Data[4] >> 1) & 0x03; gEeprom.BK1080_BLEND_CONFIG = (Data[4] >> 1) & 0x03;
gEeprom.BK1080_DEEMPHASIS_CONFIG = (Data[4] >> 3) & 0x03; gEeprom.BK1080_DEEMPHASIS_CONFIG = (Data[4] >> 3) & 0x03;
#endif
// 0F40..0F47 // 0F40..0F47
EEPROM_ReadBuffer(0x0F40, Data, 8); EEPROM_ReadBuffer(0x0F40, Data, 8);
gSetting_F_LOCK = (Data[0] < F_LOCK_LEN) ? Data[0] : F_LOCK_DEF; gSetting_F_LOCK = (Data[0] < F_LOCK_LEN) ? Data[0] : F_LOCK_DEF;
@@ -331,9 +325,6 @@ void SETTINGS_InitEEPROM(void) {
EEPROM_ReadBuffer(0x1FF0, Data, 8); EEPROM_ReadBuffer(0x1FF0, Data, 8);
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_eot = (((Data[6] & 0x0F)) < 4) ? ((Data[6] & 0x0F)) : 0;
/* /*
int tmp = ((Data[5] & 0xF0) >> 4); int tmp = ((Data[5] & 0xF0) >> 4);
@@ -427,7 +418,7 @@ uint32_t SETTINGS_FetchChannelFrequency(const int channel) {
uint32_t offset; uint32_t offset;
} __attribute__((packed)) info; } __attribute__((packed)) info;
EEPROM_ReadBuffer(channel * 16, &info, sizeof(info)); EEPROM_ReadBuffer(channel * 20, &info, sizeof(info));
return info.frequency; return info.frequency;
} }
@@ -444,7 +435,7 @@ void SETTINGS_FetchChannelName(char *s, const int channel) {
if (!RADIO_CheckValidChannel(channel, false, 0)) if (!RADIO_CheckValidChannel(channel, false, 0))
return; return;
EEPROM_ReadBuffer(0x0F50 + (channel * 16), s, 10); EEPROM_ReadBuffer(0x0F50 + (channel * 20), s, 10);
int i; int i;
for (i = 0; i < 10; i++) for (i = 0; i < 10; i++)
@@ -570,12 +561,7 @@ void SETTINGS_SaveSettings(void) {
State[3] = false; State[3] = false;
#endif #endif
#ifdef ENABLE_FEAT_F4HWN_RESCUE_OPS State[4] = (gEeprom.KEY_LOCK ? 0x01 : 0);
State[4] = (gEeprom.KEY_LOCK ? 0x01 : 0) | (gEeprom.MENU_LOCK ? 0x02 :0) | ((gEeprom.SET_KEY & 0x0F) << 2);
#else
State[4] = gEeprom.KEY_LOCK;
#endif
#ifdef ENABLE_VOX #ifdef ENABLE_VOX
State[5] = gEeprom.VOX_SWITCH; State[5] = gEeprom.VOX_SWITCH;
State[6] = gEeprom.VOX_LEVEL; State[6] = gEeprom.VOX_LEVEL;
@@ -606,11 +592,7 @@ void SETTINGS_SaveSettings(void) {
State[5] = gEeprom.BACKLIGHT_TIME; State[5] = gEeprom.BACKLIGHT_TIME;
#endif #endif
#ifdef ENABLE_FEAT_F4HWN_NARROWER State[6] = gEeprom.TAIL_TONE_ELIMINATION & 0x01;
State[6] = (gEeprom.TAIL_TONE_ELIMINATION & 0x01) | ((gSetting_set_nfm & 0x03) << 1);
#else
State[6] = gEeprom.TAIL_TONE_ELIMINATION;
#endif
#ifdef ENABLE_FEAT_F4HWN_RESUME_STATE #ifdef ENABLE_FEAT_F4HWN_RESUME_STATE
State[7] = (gEeprom.VFO_OPEN & 0x01) | ((gEeprom.CURRENT_STATE & 0x07) << 1) | State[7] = (gEeprom.VFO_OPEN & 0x01) | ((gEeprom.CURRENT_STATE & 0x07) << 1) |
@@ -703,9 +685,11 @@ void SETTINGS_SaveSettings(void) {
State[1] = (gEeprom.FSKSRCAddress >> 8) & 0xFF; State[1] = (gEeprom.FSKSRCAddress >> 8) & 0xFF;
State[2] = (gEeprom.FSKSRCAddress >> 16) & 0xFF; State[2] = (gEeprom.FSKSRCAddress >> 16) & 0xFF;
State[3] = (gEeprom.FSKSRCAddress >> 24) & 0xFF; State[3] = (gEeprom.FSKSRCAddress >> 24) & 0xFF;
#ifdef ENABLE_FMRADIO
State[4] = ((gEeprom.BK1080_AGC_ENABLED & 0x01) | State[4] = ((gEeprom.BK1080_AGC_ENABLED & 0x01) |
((gEeprom.BK1080_BLEND_CONFIG & 0x03) << 1) | ((gEeprom.BK1080_BLEND_CONFIG & 0x03) << 1) |
((gEeprom.BK1080_DEEMPHASIS_CONFIG & 0x03) << 3)); ((gEeprom.BK1080_DEEMPHASIS_CONFIG & 0x03) << 3));
#endif
EEPROM_WriteBuffer(0x0F20, State); EEPROM_WriteBuffer(0x0F20, State);
@@ -763,7 +747,6 @@ void SETTINGS_SaveSettings(void) {
tmp = (gSetting_set_inv << 0); tmp = (gSetting_set_inv << 0);
State[5] = (tmp << 4); State[5] = (tmp << 4);
State[6] = ((gSetting_set_tot << 4) | (gSetting_set_eot & 0x0F));
State[7] = gSetting_set_ptt & 0x0F; State[7] = gSetting_set_ptt & 0x0F;
EEPROM_WriteBuffer(0x1FF0, State); EEPROM_WriteBuffer(0x1FF0, State);
@@ -780,10 +763,10 @@ void SETTINGS_SaveChannel(uint8_t Channel, uint8_t VFO, const VFO_Info_t *pVFO,
return; return;
#endif #endif
uint16_t OffsetVFO = Channel * 16; uint16_t OffsetVFO = Channel * 24;
if (IS_FREQ_CHANNEL(Channel)) { // it's a VFO, not a channel if (IS_FREQ_CHANNEL(Channel)) { // it's a VFO, not a channel
OffsetVFO = (VFO == 0) ? 0x0C80 : 0x0C90; OffsetVFO = (VFO == 0) ? 0x0C80 : 0x0C98;
OffsetVFO += (Channel - FREQ_CHANNEL_FIRST) * 32; OffsetVFO += (Channel - FREQ_CHANNEL_FIRST) * 32;
} }
@@ -791,6 +774,7 @@ void SETTINGS_SaveChannel(uint8_t Channel, uint8_t VFO, const VFO_Info_t *pVFO,
union { union {
uint8_t _8[8]; uint8_t _8[8];
uint32_t _32[2]; uint32_t _32[2];
uint16_t _16[4];
} State; } State;
State._32[0] = pVFO->freq_config_RX.Frequency; State._32[0] = pVFO->freq_config_RX.Frequency;
@@ -802,8 +786,8 @@ 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 << 5) | (pVFO->BUSY_CHANNEL_LOCK << 6)
| (pVFO->OUTPUT_POWER << 2) | (pVFO->OUTPUT_POWER << 3)
| (pVFO->CHANNEL_BANDWIDTH << 1) | (pVFO->CHANNEL_BANDWIDTH << 1)
| (pVFO->FrequencyReverse << 0); | (pVFO->FrequencyReverse << 0);
State._8[5] = ((pVFO->DTMF_PTT_ID_TX_MODE & 7u) << 1) State._8[5] = ((pVFO->DTMF_PTT_ID_TX_MODE & 7u) << 1)
@@ -813,8 +797,10 @@ void SETTINGS_SaveChannel(uint8_t Channel, uint8_t VFO, const VFO_Info_t *pVFO,
; ;
State._8[6] = pVFO->STEP_SETTING; State._8[6] = pVFO->STEP_SETTING;
State._8[7] = pVFO->SCRAMBLING_TYPE; State._16[0] = pVFO->SCRAMBLING_TYPE;
EEPROM_WriteBuffer(OffsetVFO + 8, State._8);
EEPROM_WriteBuffer(OffsetVFO + sizeof (State._32), State._8);
EEPROM_WriteBuffer(OffsetVFO + sizeof (State._32) + sizeof (State._8), State._16);
SETTINGS_UpdateChannel(Channel, pVFO, true, true, true); SETTINGS_UpdateChannel(Channel, pVFO, true, true, true);
@@ -842,7 +828,7 @@ void SETTINGS_SaveBatteryCalibration(const uint16_t *batteryCalibration) {
} }
void SETTINGS_SaveChannelName(uint8_t channel, const char *name) { void SETTINGS_SaveChannelName(uint8_t channel, const char *name) {
uint16_t offset = channel * 16; uint16_t offset = channel * 24;
uint8_t buf[16] = {0}; uint8_t buf[16] = {0};
memcpy(buf, name, MIN(strlen(name), 10u)); memcpy(buf, name, MIN(strlen(name), 10u));
EEPROM_WriteBuffer(0x0F50 + offset, buf); EEPROM_WriteBuffer(0x0F50 + offset, buf);
@@ -950,10 +936,7 @@ void SETTINGS_WriteBuildOptions(void) {
#ifdef ENABLE_SPECTRUM #ifdef ENABLE_SPECTRUM
| (1 << 5) | (1 << 5)
#endif #endif
#ifdef ENABLE_FEAT_F4HWN_RESCUE_OPS | (1 << 6);
| (1 << 6)
#endif
;
EEPROM_WriteBuffer(0x1FF0, State); EEPROM_WriteBuffer(0x1FF0, State);
} }
@@ -986,7 +969,7 @@ void SETTINGS_WriteCurrentVol(void) {
void SETTINGS_ResetTxLock(void) { void SETTINGS_ResetTxLock(void) {
uint8_t State[8]; uint8_t State[8];
for (uint8_t channel = 0; channel < 200; channel++) { for (uint8_t channel = 0; channel < 200; channel++) {
uint16_t OffsetVFO = channel * 16; uint16_t OffsetVFO = channel * 24;
EEPROM_ReadBuffer(OffsetVFO + 8, State, sizeof(State)); EEPROM_ReadBuffer(OffsetVFO + 8, State, sizeof(State));
State[4] |= (1 << 6); State[4] |= (1 << 6);
EEPROM_WriteBuffer(OffsetVFO + 8, State); EEPROM_WriteBuffer(OffsetVFO + 8, State);

View File

@@ -98,8 +98,7 @@ enum {
}; };
enum { enum {
OUTPUT_POWER_USER = 0, OUTPUT_POWER_LOW1 = 0,
OUTPUT_POWER_LOW1,
OUTPUT_POWER_LOW2, OUTPUT_POWER_LOW2,
OUTPUT_POWER_LOW3, OUTPUT_POWER_LOW3,
OUTPUT_POWER_LOW4, OUTPUT_POWER_LOW4,
@@ -130,11 +129,9 @@ enum ACTION_OPT_t {
ACTION_OPT_WN, ACTION_OPT_WN,
ACTION_OPT_BACKLIGHT, ACTION_OPT_BACKLIGHT,
ACTION_OPT_MUTE, ACTION_OPT_MUTE,
#ifdef ENABLE_FEAT_F4HWN_RESCUE_OPS
ACTION_OPT_POWER_HIGH, ACTION_OPT_POWER_HIGH,
ACTION_OPT_REMOVE_OFFSET, ACTION_OPT_REMOVE_OFFSET,
#endif #endif
#endif
#ifdef ENABLE_REGA #ifdef ENABLE_REGA
ACTION_OPT_REGA_ALARM, ACTION_OPT_REGA_ALARM,
ACTION_OPT_REGA_TEST, ACTION_OPT_REGA_TEST,
@@ -224,10 +221,7 @@ typedef struct {
#ifdef ENABLE_FEAT_F4HWN #ifdef ENABLE_FEAT_F4HWN
bool KEY_LOCK_PTT; bool KEY_LOCK_PTT;
#endif #endif
#ifdef ENABLE_FEAT_F4HWN_RESCUE_OPS
bool MENU_LOCK; bool MENU_LOCK;
uint8_t SET_KEY;
#endif
bool VOX_SWITCH; bool VOX_SWITCH;
uint8_t VOX_LEVEL; uint8_t VOX_LEVEL;
#ifdef ENABLE_VOICE #ifdef ENABLE_VOICE

View File

@@ -45,6 +45,7 @@
#ifdef ENABLE_FEAT_F4HWN #ifdef ENABLE_FEAT_F4HWN
#include "driver/system.h" #include "driver/system.h"
#include "app/scanner.h"
#endif #endif
@@ -418,44 +419,6 @@ void UI_MAIN_TimeSlice500ms(void) {
if (FUNCTION_IsRx()) { if (FUNCTION_IsRx()) {
DisplayRSSIBar(true); DisplayRSSIBar(true);
} }
#ifdef ENABLE_FEAT_F4HWN // Blink Green Led for white...
else if (gSetting_set_eot > 0 && RxBlinkLed == 2) {
if (RxBlinkLedCounter <= 8) {
if (RxBlinkLedCounter % 2 == 0) {
if (gSetting_set_eot > 1) {
BK4819_ToggleGpioOut(BK4819_GPIO6_PIN2_GREEN, false);
}
} else {
if (gSetting_set_eot > 1) {
BK4819_ToggleGpioOut(BK4819_GPIO6_PIN2_GREEN, true);
}
if (gSetting_set_eot == 1 || gSetting_set_eot == 3) {
switch (RxBlinkLedCounter) {
case 1:
AUDIO_PlayBeep(BEEP_400HZ_30MS);
break;
case 3:
AUDIO_PlayBeep(BEEP_400HZ_30MS);
break;
case 5:
AUDIO_PlayBeep(BEEP_500HZ_30MS);
break;
case 7:
AUDIO_PlayBeep(BEEP_600HZ_30MS);
break;
}
}
}
RxBlinkLedCounter += 1;
} else {
RxBlinkLed = 0;
}
}
#endif
} }
} }
@@ -1010,7 +973,6 @@ void UI_DisplayMain(void) {
#if ENABLE_FEAT_F4HWN #if ENABLE_FEAT_F4HWN
const FREQ_Config_t *pConfig = (mode == VFO_MODE_TX) ? vfoInfo->pTX : vfoInfo->pRX; const FREQ_Config_t *pConfig = (mode == VFO_MODE_TX) ? vfoInfo->pTX : vfoInfo->pRX;
int8_t shift = 0; int8_t shift = 0;
switch ((int) pConfig->CodeType) { switch ((int) pConfig->CodeType) {
case 1: case 1:
sprintf(String, "%u.%u", CTCSS_Options[pConfig->Code] / 10, CTCSS_Options[pConfig->Code] % 10); sprintf(String, "%u.%u", CTCSS_Options[pConfig->Code] / 10, CTCSS_Options[pConfig->Code] % 10);
@@ -1029,6 +991,8 @@ void UI_DisplayMain(void) {
shift = -10; shift = -10;
} }
UI_PrintStringSmallNormal(s, 50, 0, line + 2); UI_PrintStringSmallNormal(s, 50, 0, line + 2);
UI_PrintStringSmallNormal(t, 2, 0, line + 2); UI_PrintStringSmallNormal(t, 2, 0, line + 2);
@@ -1047,25 +1011,20 @@ void UI_DisplayMain(void) {
#endif #endif
if (state == VFO_STATE_NORMAL || state == VFO_STATE_ALARM) { // show the TX power if (state == VFO_STATE_NORMAL || state == VFO_STATE_ALARM) { // show the TX power
uint8_t currentPower = vfoInfo->OUTPUT_POWER % 8;
const char pwr_short[][3] = {"L1", "L2", "L3", "L4", "L5", "ME", const char pwr_short[][3] = {"L1", "L2", "L3", "L4", "L5", "ME",
"HI"}; "HI", "UN"};
UI_PrintStringSmallNormal(pwr_short[currentPower], LCD_WIDTH + 25, 0, line + 1); UI_PrintStringSmallNormal(pwr_short[vfoInfo->OUTPUT_POWER], LCD_WIDTH + 25, 0, line + 1);
} }
if (vfoInfo->freq_config_RX.Frequency != vfoInfo->freq_config_TX.Frequency) { // show the TX offset symbol if (vfoInfo->freq_config_RX.Frequency != vfoInfo->freq_config_TX.Frequency) { // show the TX offset symbol
int i = vfoInfo->TX_OFFSET_FREQUENCY_DIRECTION % 3; int i = vfoInfo->TX_OFFSET_FREQUENCY_DIRECTION % 3;
#ifdef ENABLE_FEAT_F4HWN_RESCUE_OPS
const char dir_list[][2] = {"", "+", "-", "D"}; const char dir_list[][2] = {"", "+", "-", "D"};
if(gTxVfo->TX_OFFSET_FREQUENCY_DIRECTION != 0 && gTxVfo->pTX == &gTxVfo->freq_config_RX && !vfoInfo->FrequencyReverse) if(gTxVfo->TX_OFFSET_FREQUENCY_DIRECTION != 0 && gTxVfo->pTX == &gTxVfo->freq_config_RX && !vfoInfo->FrequencyReverse)
{ {
i = 3; i = 3;
} }
#else
const char dir_list[][2] = {"", "+", "-"};
#endif
#if ENABLE_FEAT_F4HWN #if ENABLE_FEAT_F4HWN
UI_PrintStringSmallNormal(dir_list[i], LCD_WIDTH + 60, 0, line + 1); UI_PrintStringSmallNormal(dir_list[i], LCD_WIDTH + 60, 0, line + 1);
@@ -1078,34 +1037,18 @@ void UI_DisplayMain(void) {
if (vfoInfo->FrequencyReverse) if (vfoInfo->FrequencyReverse)
#if ENABLE_FEAT_F4HWN #if ENABLE_FEAT_F4HWN
{ {
UI_PrintStringSmallNormal("R", LCD_WIDTH + 68, 0, line + 1); UI_PrintStringSmallNormal("R", LCD_WIDTH + 110, 0, line + 1);
} }
#else #else
UI_PrintStringSmallNormal("R", LCD_WIDTH + 62, 0, line + 1); UI_PrintStringSmallNormal("R", LCD_WIDTH + 110, 0, line + 1);
#endif #endif
#if ENABLE_FEAT_F4HWN #if ENABLE_FEAT_F4HWN
#ifdef ENABLE_FEAT_F4HWN_NARROWER
bool narrower = 0;
if (vfoInfo->CHANNEL_BANDWIDTH == BANDWIDTH_NARROW && gSetting_set_nfm == 1) {
narrower = 1;
}
const char *bandWidthNames[] = {"WID", "NAR", "NR+"}; const char *bandWidthNames[] = {"WID", "NAR", "NR+"};
UI_PrintStringSmallNormal(bandWidthNames[vfoInfo->CHANNEL_BANDWIDTH + narrower], LCD_WIDTH + 30, 0, UI_PrintStringSmallNormal(bandWidthNames[vfoInfo->CHANNEL_BANDWIDTH], LCD_WIDTH + 30, 0,
line); line);
#else
if (gSetting_set_gui)
{
const char *bandWidthNames[] = {"W", "N"};
UI_PrintStringSmallNormal(bandWidthNames[vfoInfo->CHANNEL_BANDWIDTH], LCD_WIDTH + 80, 0, line + 1);
}
else
{
const char *bandWidthNames[] = {"WIDE", "NAR"};
GUI_DisplaySmallest(bandWidthNames[vfoInfo->CHANNEL_BANDWIDTH], 91, line == 0 ? 17 : 49, false, true);
}
#endif
#else #else
if (vfoInfo->CHANNEL_BANDWIDTH == BANDWIDTH_NARROW) if (vfoInfo->CHANNEL_BANDWIDTH == BANDWIDTH_NARROW)
UI_PrintStringSmallNormal("N", LCD_WIDTH + 70, 0, line + 1); UI_PrintStringSmallNormal("N", LCD_WIDTH + 70, 0, line + 1);
@@ -1119,8 +1062,8 @@ void UI_DisplayMain(void) {
// show the audio scramble symbol // show the audio scramble symbol
if (vfoInfo->SCRAMBLING_TYPE > 0) { if (vfoInfo->SCRAMBLING_TYPE > 0) {
sprintf(String, "S%d", vfoInfo->SCRAMBLING_TYPE + 25); sprintf(String, "S%d", inverse_scale_freq(vfoInfo->SCRAMBLING_TYPE));
UI_PrintStringSmallNormal(String, 105, 0, line + 2); UI_PrintStringSmallNormal(String, 90, 0, line + 2);
} }
#ifdef ENABLE_FEAT_F4HWN #ifdef ENABLE_FEAT_F4HWN

136
ui/menu.c
View File

@@ -48,7 +48,7 @@ const t_menu_item MenuList[] =
{"TCTCS", MENU_T_CTCS}, // was "T_CTCS" {"TCTCS", MENU_T_CTCS}, // was "T_CTCS"
{"TxODir", MENU_SFT_D}, // was "SFT_D" {"TxODir", MENU_SFT_D}, // was "SFT_D"
{"TxOffs", MENU_OFFSET}, // was "OFFSET" {"TxOffs", MENU_OFFSET}, // was "OFFSET"
{"W/N", MENU_W_N}, {"WID", MENU_W_N},
{"SCR", MENU_SCR}, // was "SCR" {"SCR", MENU_SCR}, // was "SCR"
{"BusyL", MENU_BCL}, // was "BCL" {"BusyL", MENU_BCL}, // was "BCL"
{"COMP", MENU_COMPAND}, {"COMP", MENU_COMPAND},
@@ -79,7 +79,7 @@ const t_menu_item MenuList[] =
{"ML", MENU_MLONG}, {"ML", MENU_MLONG},
{"KeyLck", MENU_AUTOLK}, // was "AUTOLk" {"KeyLck", MENU_AUTOLK}, // was "AUTOLk"
{"TxTOut", MENU_TOT}, // was "TOT" {"TXTime", MENU_TOT},
{"BatSav", MENU_SAVE}, // was "SAVE" {"BatSav", MENU_SAVE}, // was "SAVE"
{"BatTxt", MENU_BAT_TXT}, {"BatTxt", MENU_BAT_TXT},
{"Mic", MENU_MIC}, {"Mic", MENU_MIC},
@@ -131,22 +131,14 @@ const t_menu_item MenuList[] =
{"Sql", MENU_SQL}, {"Sql", MENU_SQL},
#ifdef ENABLE_FEAT_F4HWN #ifdef ENABLE_FEAT_F4HWN
{"SPTT", MENU_SET_PTT}, {"SPTT", MENU_SET_PTT},
{"STOT", MENU_SET_TOT},
{"SEOT", MENU_SET_EOT},
{"SInv", MENU_SET_INV}, {"SInv", MENU_SET_INV},
{"STmr", MENU_SET_TMR}, {"STmr", MENU_SET_TMR},
#ifdef ENABLE_FEAT_F4HWN_SLEEP #ifdef ENABLE_FEAT_F4HWN_SLEEP
{"SOff", MENU_SET_OFF}, {"SOff", MENU_SET_OFF},
#endif #endif
#ifdef ENABLE_FEAT_F4HWN_NARROWER
{"SNFM", MENU_SET_NFM},
#endif
#ifdef ENABLE_FEAT_F4HWN_VOL #ifdef ENABLE_FEAT_F4HWN_VOL
{"SVol", MENU_SET_VOL}, {"SVol", MENU_SET_VOL},
#endif #endif
#ifdef ENABLE_FEAT_F4HWN_RESCUE_OPS
{"SKey", MENU_SET_KEY },
#endif
#ifdef ENABLE_NOAA #ifdef ENABLE_NOAA
{"SNWR", MENU_NOAA_S }, {"SNWR", MENU_NOAA_S },
#endif #endif
@@ -182,10 +174,11 @@ const char gSubMenu_SFT_D[][4] =
"-" "-"
}; };
const char gSubMenu_W_N[][7] = const char gSubMenu_W_N[][5] =
{ {
"WIDE", "WIDE",
"NARR" "NARR",
"NAR+"
}; };
const char gSubMenu_OFF_ON[][4] = const char gSubMenu_OFF_ON[][4] =
@@ -203,8 +196,8 @@ const char *const gSubMenu_RXMode[] =
{ {
"MAIN", // TX and RX on main only "MAIN", // TX and RX on main only
"RESP", // Watch both and respond "RESP", // Watch both and respond
"XBAND ONLY", // TX on main, RX on secondary "XBAND", // TX on main, RX on secondary
"DUALMON" // always TX on main, but RX on both "DMON" // always TX on main, but RX on both
}; };
#ifdef ENABLE_VOICE #ifdef ENABLE_VOICE
@@ -219,7 +212,7 @@ const char gSubMenu_VOICE[][4] =
const char *const gSubMenu_MDF[] = const char *const gSubMenu_MDF[] =
{ {
"FREQ", "FREQ",
"CHNUMB", "CHNUM",
"NAME", "NAME",
"NAME\n+\nFREQ" "NAME\n+\nFREQ"
}; };
@@ -303,14 +296,14 @@ const char gSubMenu_RX_TX[][6] =
"TX/RX" "TX/RX"
}; };
const char gSubMenu_BAT_TXT[][8] = const char gSubMenu_BAT_TXT[][5] =
{ {
"NONE", "NONE",
"VLT", "VLT",
"PRC" "PRC"
}; };
const char gSubMenu_BATTYP[][9] = const char gSubMenu_BATTYP[][3] =
{ {
"16", "16",
"22", "22",
@@ -319,38 +312,11 @@ const char gSubMenu_BATTYP[][9] =
#ifdef ENABLE_FEAT_F4HWN #ifdef ENABLE_FEAT_F4HWN
const char gSubMenu_SET_PTT[][8] = const char gSubMenu_SET_PTT[][4] =
{ {
"HOLD", "HOL",
"TAP" "TOG",
}; };
const char gSubMenu_SET_TOT[][7] = // Use by SET_EOT too
{
"OFF",
"SND",
"VIS",
"ALL"
};
#ifdef ENABLE_FEAT_F4HWN_NARROWER
const char gSubMenu_SET_NFM[][9] =
{
"NRW",
"NRWER"
};
#endif
#ifdef ENABLE_FEAT_F4HWN_RESCUE_OPS
const char gSubMenu_SET_KEY[][9] =
{
"KEY_MENU",
"KEY_UP",
"KEY_DOWN",
"KEY_EXIT",
"KEY_STAR"
};
#endif
#endif #endif
const t_sidefunction gSubMenu_SIDEFUNCTIONS[] = const t_sidefunction gSubMenu_SIDEFUNCTIONS[] =
@@ -393,10 +359,8 @@ const t_sidefunction gSubMenu_SIDEFUNCTIONS[] =
#if !defined(ENABLE_SPECTRUM) || !defined(ENABLE_FMRADIO) #if !defined(ENABLE_SPECTRUM) || !defined(ENABLE_FMRADIO)
{"MUTE", ACTION_OPT_MUTE}, {"MUTE", ACTION_OPT_MUTE},
#endif #endif
#ifdef ENABLE_FEAT_F4HWN_RESCUE_OPS
{"POWER\nHIGH", ACTION_OPT_POWER_HIGH}, {"POWER\nHIGH", ACTION_OPT_POWER_HIGH},
{"REMOVE\nOFFSET", ACTION_OPT_REMOVE_OFFSET}, {"REMOVE\nOFFSET", ACTION_OPT_REMOVE_OFFSET},
#endif
#endif #endif
{"SSTV", ACTION_REQ_SSTV}, {"SSTV", ACTION_REQ_SSTV},
}; };
@@ -543,12 +507,6 @@ UI_PrintStringSmallNormal(String, 2, 0, 6);
BACKLIGHT_TurnOn(); BACKLIGHT_TurnOn();
#if !defined(ENABLE_SPECTRUM) || !defined(ENABLE_FMRADIO)
uint8_t gaugeLine = 0;
uint8_t gaugeMin = 0;
uint8_t gaugeMax = 0;
#endif
switch (UI_MENU_GetCurrentMenuId()) { switch (UI_MENU_GetCurrentMenuId()) {
case MENU_SQL: case MENU_SQL:
sprintf(String, "%ld", gSubMenuSelection); sprintf(String, "%ld", gSubMenuSelection);
@@ -623,12 +581,11 @@ UI_PrintStringSmallNormal(String, 2, 0, 6);
case MENU_SCR: case MENU_SCR:
if (gSubMenuSelection > 0) { if (gSubMenuSelection > 0) {
sprintf(String, "%ld00", gSubMenuSelection + 25); sprintf(String, "%huHz\n%ld", inverse_scale_freq(gSubMenuSelection), gSubMenuSelection);
BK4819_EnableScramble(gSubMenuSelection - 1);
} else { } else {
strcpy(String, "OFF"); strcpy(String, "OFF");
BK4819_DisableScramble();
} }
BK4819_SetScramble(gSubMenuSelection);
break; break;
case MENU_VOX: case MENU_VOX:
@@ -644,12 +601,6 @@ UI_PrintStringSmallNormal(String, 2, 0, 6);
strcpy(String, gSubMenu_OFF_ON[0]); strcpy(String, gSubMenu_OFF_ON[0]);
} else if (gSubMenuSelection < 61) { } else if (gSubMenuSelection < 61) {
sprintf(String, "%02ldm:%02lds", (((gSubMenuSelection) * 5) / 60), (((gSubMenuSelection) * 5) % 60)); sprintf(String, "%02ldm:%02lds", (((gSubMenuSelection) * 5) / 60), (((gSubMenuSelection) * 5) % 60));
#if !defined(ENABLE_SPECTRUM) || !defined(ENABLE_FMRADIO)
//ST7565_Gauge(4, 1, 60, gSubMenuSelection);
gaugeLine = 4;
gaugeMin = 1;
gaugeMax = 60;
#endif
} else { } else {
strcpy(String, "ON"); strcpy(String, "ON");
} }
@@ -673,17 +624,19 @@ UI_PrintStringSmallNormal(String, 2, 0, 6);
strcpy(String, gModulationStr[gSubMenuSelection]); strcpy(String, gModulationStr[gSubMenuSelection]);
break; break;
case MENU_TOT:
if (gSubMenuSelection == 0) {
strcpy(String, "OFF");
} else {
sprintf(String, "%02ldm:%02lds", (((gSubMenuSelection + 1) * 5) / 60), (((gSubMenuSelection + 1) * 5) % 60));
}
break;
case MENU_AUTOLK: case MENU_AUTOLK:
if (gSubMenuSelection == 0) if (gSubMenuSelection == 0)
strcpy(String, gSubMenu_OFF_ON[0]); strcpy(String, gSubMenu_OFF_ON[0]);
else { else {
sprintf(String, "%02ldm:%02lds", ((gSubMenuSelection * 15) / 60), ((gSubMenuSelection * 15) % 60)); sprintf(String, "%02ldm:%02lds", ((gSubMenuSelection * 15) / 60), ((gSubMenuSelection * 15) % 60));
#if !defined(ENABLE_SPECTRUM) || !defined(ENABLE_FMRADIO)
//ST7565_Gauge(4, 1, 40, gSubMenuSelection);
gaugeLine = 4;
gaugeMin = 1;
gaugeMax = 40;
#endif
} }
break; break;
@@ -783,16 +736,6 @@ UI_PrintStringSmallNormal(String, 2, 0, 6);
strcpy(String, gSubMenu_RXMode[gSubMenuSelection]); strcpy(String, gSubMenu_RXMode[gSubMenuSelection]);
break; break;
case MENU_TOT:
sprintf(String, "%02ldm:%02lds", (((gSubMenuSelection + 1) * 5) / 60), (((gSubMenuSelection + 1) * 5) % 60));
#if !defined(ENABLE_SPECTRUM) || !defined(ENABLE_FMRADIO)
//ST7565_Gauge(4, 5, 179, gSubMenuSelection);
gaugeLine = 4;
gaugeMin = 5;
gaugeMax = 179;
#endif
break;
#ifdef ENABLE_VOICE #ifdef ENABLE_VOICE
case MENU_VOICE: case MENU_VOICE:
strcpy(String, gSubMenu_VOICE[gSubMenuSelection]); strcpy(String, gSubMenu_VOICE[gSubMenuSelection]);
@@ -807,18 +750,12 @@ UI_PrintStringSmallNormal(String, 2, 0, 6);
((gSubMenuSelection * 250) % 1000)); ((gSubMenuSelection * 250) % 1000));
#if !defined(ENABLE_SPECTRUM) || !defined(ENABLE_FMRADIO) #if !defined(ENABLE_SPECTRUM) || !defined(ENABLE_FMRADIO)
//ST7565_Gauge(5, 1, 80, gSubMenuSelection); //ST7565_Gauge(5, 1, 80, gSubMenuSelection);
gaugeLine = 5;
gaugeMin = 1;
gaugeMax = 80;
#endif #endif
} else { } else {
sprintf(String, "TIMEOUT\n%02ldm:%02lds", (((gSubMenuSelection - 80) * 5) / 60), sprintf(String, "TIMEOUT\n%02ldm:%02lds", (((gSubMenuSelection - 80) * 5) / 60),
(((gSubMenuSelection - 80) * 5) % 60)); (((gSubMenuSelection - 80) * 5) % 60));
#if !defined(ENABLE_SPECTRUM) || !defined(ENABLE_FMRADIO) #if !defined(ENABLE_SPECTRUM) || !defined(ENABLE_FMRADIO)
//ST7565_Gauge(5, 80, 104, gSubMenuSelection); //ST7565_Gauge(5, 80, 104, gSubMenuSelection);
gaugeLine = 5;
gaugeMin = 80;
gaugeMax = 104;
#endif #endif
} }
break; break;
@@ -946,12 +883,6 @@ UI_PrintStringSmallNormal(String, 2, 0, 6);
strcpy(String, gSubMenu_OFF_ON[0]); strcpy(String, gSubMenu_OFF_ON[0]);
} else if (gSubMenuSelection < 121) { } else if (gSubMenuSelection < 121) {
sprintf(String, "%ldh:%02ldm", (gSubMenuSelection / 60), (gSubMenuSelection % 60)); sprintf(String, "%ldh:%02ldm", (gSubMenuSelection / 60), (gSubMenuSelection % 60));
#if !defined(ENABLE_SPECTRUM) || !defined(ENABLE_FMRADIO)
//ST7565_Gauge(4, 1, 120, gSubMenuSelection);
gaugeLine = 4;
gaugeMin = 1;
gaugeMax = 120;
#endif
} }
break; break;
#endif #endif
@@ -961,11 +892,6 @@ UI_PrintStringSmallNormal(String, 2, 0, 6);
strcpy(String, gSubMenu_SET_PTT[gSubMenuSelection]); strcpy(String, gSubMenu_SET_PTT[gSubMenuSelection]);
break; break;
case MENU_SET_TOT:
case MENU_SET_EOT:
strcpy(String, gSubMenu_SET_TOT[gSubMenuSelection]); // Same as SET_TOT
break;
case MENU_SET_INV: case MENU_SET_INV:
#ifdef ENABLE_FEAT_F4HWN_INV #ifdef ENABLE_FEAT_F4HWN_INV
strcpy(String, gSubMenu_OFF_ON[gSubMenuSelection]); strcpy(String, gSubMenu_OFF_ON[gSubMenuSelection]);
@@ -975,12 +901,6 @@ UI_PrintStringSmallNormal(String, 2, 0, 6);
#endif #endif
break; break;
#ifdef ENABLE_FEAT_F4HWN_NARROWER
case MENU_SET_NFM:
strcpy(String, gSubMenu_SET_NFM[gSubMenuSelection]);
break;
#endif
#ifdef ENABLE_FEAT_F4HWN_VOL #ifdef ENABLE_FEAT_F4HWN_VOL
case MENU_SET_VOL: case MENU_SET_VOL:
if (gSubMenuSelection == 0) { if (gSubMenuSelection == 0) {
@@ -988,10 +908,6 @@ UI_PrintStringSmallNormal(String, 2, 0, 6);
} else if (gSubMenuSelection < 64) { } else if (gSubMenuSelection < 64) {
sprintf(String, "%02lu", gSubMenuSelection); sprintf(String, "%02lu", gSubMenuSelection);
#if !defined(ENABLE_SPECTRUM) || !defined(ENABLE_FMRADIO) #if !defined(ENABLE_SPECTRUM) || !defined(ENABLE_FMRADIO)
//ST7565_Gauge(4, 1, 63, gSubMenuSelection);
gaugeLine = 4;
gaugeMin = 1;
gaugeMax = 63;
#endif #endif
} }
gEeprom.VOLUME_GAIN = gSubMenuSelection; gEeprom.VOLUME_GAIN = gSubMenuSelection;
@@ -1002,12 +918,6 @@ UI_PrintStringSmallNormal(String, 2, 0, 6);
(gEeprom.DAC_GAIN << 0)); // AF DAC Gain (after Gain-1 and Gain-2) (gEeprom.DAC_GAIN << 0)); // AF DAC Gain (after Gain-1 and Gain-2)
break; break;
#endif #endif
#ifdef ENABLE_FEAT_F4HWN_RESCUE_OPS
case MENU_SET_KEY:
strcpy(String, gSubMenu_SET_KEY[gSubMenuSelection]);
break;
#endif
#endif #endif
} }

View File

@@ -115,21 +115,11 @@ enum {
#endif #endif
#ifdef ENABLE_FEAT_F4HWN #ifdef ENABLE_FEAT_F4HWN
MENU_SET_PTT, MENU_SET_PTT,
MENU_SET_TOT,
MENU_SET_EOT,
MENU_SET_CTR,
MENU_SET_INV, MENU_SET_INV,
MENU_SET_LCK,
MENU_SET_TMR, MENU_SET_TMR,
#ifdef ENABLE_FEAT_F4HWN_NARROWER
MENU_SET_NFM,
#endif
#ifdef ENABLE_FEAT_F4HWN_VOL #ifdef ENABLE_FEAT_F4HWN_VOL
MENU_SET_VOL, MENU_SET_VOL,
#endif #endif
#ifdef ENABLE_FEAT_F4HWN_RESCUE_OPS
MENU_SET_KEY,
#endif
#ifdef ENABLE_NOAA #ifdef ENABLE_NOAA
MENU_NOAA_S, MENU_NOAA_S,
#endif #endif
@@ -147,10 +137,9 @@ extern const t_menu_item MenuList[];
extern const char gSubMenu_TXP[7][5]; extern const char gSubMenu_TXP[7][5];
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[3][5];
extern const char gSubMenu_OFF_ON[2][4]; extern const char gSubMenu_OFF_ON[2][4];
extern const char gSubMenu_NA[4]; extern const char gSubMenu_NA[4];
extern const char gSubMenu_TOT[11][7];
extern const char *const gSubMenu_RXMode[4]; extern const char *const gSubMenu_RXMode[4];
#ifdef ENABLE_VOICE #ifdef ENABLE_VOICE
@@ -165,14 +154,7 @@ extern const char gSubMenu_D_RSP[4][11];
#endif #endif
#ifdef ENABLE_FEAT_F4HWN #ifdef ENABLE_FEAT_F4HWN
extern const char gSubMenu_SET_PTT[2][8]; extern const char gSubMenu_SET_PTT[2][4];
extern const char gSubMenu_SET_TOT[4][7];
#ifdef ENABLE_FEAT_F4HWN_NARROWER
extern const char gSubMenu_SET_NFM[2][9];
#endif
#ifdef ENABLE_FEAT_F4HWN_RESCUE_OPS
extern const char gSubMenu_SET_KEY[][9];
#endif
#endif #endif
extern const char *const gSubMenu_PTT_ID[5]; extern const char *const gSubMenu_PTT_ID[5];
@@ -181,8 +163,8 @@ extern const char gSubMenu_ROGER[3][6];
extern const char gSubMenu_RESET[2][4]; 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][5];
extern const char gSubMenu_BATTYP[3][9]; extern const char gSubMenu_BATTYP[3][3];
typedef struct { typedef struct {
char *name; char *name;