Refactor alarm code

- Fixes Alarms bypassing TX restrictions

- Adds enumerations

- Makes use of mode ALARM_STATE_SITE_ALARM (formely ALARM_STATE_ALARM) instead
  checking against ALARM_STATE_TXALARM && ALARM_MODE == ALARM_MODE_TONE
  all over the place
This commit is contained in:
Juan Antonio
2023-12-04 21:37:44 +01:00
committed by Krzysiek Egzmont
parent 103bdf212f
commit cd032c39d2
7 changed files with 275 additions and 290 deletions

View File

@@ -243,29 +243,32 @@ void ACTION_Scan(bool bRestart)
#endif #endif
#if defined(ENABLE_ALARM) || defined(ENABLE_TX1750) #if defined(ENABLE_ALARM) || defined(ENABLE_TX1750)
static void ACTION_AlarmOr1750(const bool b1750) static void ACTION_AlarmOr1750(const bool b1750)
{ {
(void)b1750;
gInputBoxIndex = 0;
#if defined(ENABLE_ALARM) && defined(ENABLE_TX1750) #if defined(ENABLE_ALARM)
gAlarmState = b1750 ? ALARM_STATE_TX1750 : ALARM_STATE_TXALARM; const AlarmState_t alarm_mode = (gEeprom.ALARM_MODE == ALARM_MODE_TONE) ? ALARM_STATE_TXALARM : ALARM_STATE_SITE_ALARM;
gAlarmRunningCounter = 0; gAlarmRunningCounter = 0;
#elif defined(ENABLE_ALARM) #endif
gAlarmState = ALARM_STATE_TXALARM;
gAlarmRunningCounter = 0;
#else
gAlarmState = ALARM_STATE_TX1750;
#endif
gFlagPrepareTX = true; #if defined(ENABLE_ALARM) && defined(ENABLE_TX1750)
gAlarmState = b1750 ? ALARM_STATE_TX1750 : alarm_mode;
#elif defined(ENABLE_ALARM)
gAlarmState = alarm_mode;
#else
gAlarmState = ALARM_STATE_TX1750;
#endif
if (gScreenToDisplay != DISPLAY_MENU) // 1of11 .. don't close the menu (void)b1750;
gRequestDisplayScreen = DISPLAY_MAIN; gInputBoxIndex = 0;
}
gFlagPrepareTX = gAlarmState != ALARM_STATE_OFF;
if (gScreenToDisplay != DISPLAY_MENU) // 1of11 .. don't close the menu
gRequestDisplayScreen = DISPLAY_MAIN;
}
#endif #endif
#ifdef ENABLE_FMRADIO #ifdef ENABLE_FMRADIO
void ACTION_FM(void) void ACTION_FM(void)
{ {

280
app/app.c
View File

@@ -646,36 +646,36 @@ static void CheckRadioInterrupts(void)
g_CTCSS_Lost = false; g_CTCSS_Lost = false;
#ifdef ENABLE_VOX #ifdef ENABLE_VOX
if (interrupt_status_bits & BK4819_REG_02_VOX_LOST) if (interrupt_status_bits & BK4819_REG_02_VOX_LOST)
{
g_VOX_Lost = true;
gVoxPauseCountdown = 10;
if (gEeprom.VOX_SWITCH)
{ {
g_VOX_Lost = true; if (gCurrentFunction == FUNCTION_POWER_SAVE && !gRxIdleMode)
gVoxPauseCountdown = 10;
if (gEeprom.VOX_SWITCH)
{ {
if (gCurrentFunction == FUNCTION_POWER_SAVE && !gRxIdleMode) gPowerSave_10ms = power_save2_10ms;
{ gPowerSaveCountdownExpired = 0;
gPowerSave_10ms = power_save2_10ms; }
gPowerSaveCountdownExpired = 0;
} if (gEeprom.DUAL_WATCH != DUAL_WATCH_OFF && (gScheduleDualWatch || gDualWatchCountdown_10ms < dual_watch_count_after_vox_10ms))
{
if (gEeprom.DUAL_WATCH != DUAL_WATCH_OFF && (gScheduleDualWatch || gDualWatchCountdown_10ms < dual_watch_count_after_vox_10ms)) gDualWatchCountdown_10ms = dual_watch_count_after_vox_10ms;
{ gScheduleDualWatch = false;
gDualWatchCountdown_10ms = dual_watch_count_after_vox_10ms;
gScheduleDualWatch = false; // let the user see DW is not active
gDualWatchActive = false;
// let the user see DW is not active gUpdateStatus = true;
gDualWatchActive = false;
gUpdateStatus = true;
}
} }
} }
}
if (interrupt_status_bits & BK4819_REG_02_VOX_FOUND) if (interrupt_status_bits & BK4819_REG_02_VOX_FOUND)
{ {
g_VOX_Lost = false; g_VOX_Lost = false;
gVoxPauseCountdown = 0; gVoxPauseCountdown = 0;
} }
#endif #endif
if (interrupt_status_bits & BK4819_REG_02_SQUELCH_LOST) if (interrupt_status_bits & BK4819_REG_02_SQUELCH_LOST)
@@ -717,87 +717,86 @@ void APP_EndTransmission(void)
} }
#ifdef ENABLE_VOX #ifdef ENABLE_VOX
static void HandleVox(void) static void HandleVox(void)
{ {
#ifdef ENABLE_DTMF_CALLING #ifdef ENABLE_DTMF_CALLING
if (gSetting_KILLED) if (gSetting_KILLED)
return; return;
#endif #endif
if (gVoxResumeCountdown == 0) if (gVoxResumeCountdown == 0)
{ {
if (gVoxPauseCountdown) if (gVoxPauseCountdown)
return;
}
else
{
g_VOX_Lost = false;
gVoxPauseCountdown = 0;
}
#ifdef ENABLE_FMRADIO
if (gFmRadioMode)
return;
#endif
if (gCurrentFunction == FUNCTION_RECEIVE || gCurrentFunction == FUNCTION_MONITOR)
return; return;
}
if (gScanStateDir != SCAN_OFF) else
{
g_VOX_Lost = false;
gVoxPauseCountdown = 0;
}
#ifdef ENABLE_FMRADIO
if (gFmRadioMode)
return; return;
#endif
if (gVOX_NoiseDetected)
if (gCurrentFunction == FUNCTION_RECEIVE || gCurrentFunction == FUNCTION_MONITOR)
return;
if (gScanStateDir != SCAN_OFF)
return;
if (gVOX_NoiseDetected)
{
if (g_VOX_Lost)
gVoxStopCountdown_10ms = vox_stop_count_down_10ms;
else if (gVoxStopCountdown_10ms == 0)
gVOX_NoiseDetected = false;
if (gCurrentFunction == FUNCTION_TRANSMIT && !gPttIsPressed && !gVOX_NoiseDetected)
{ {
if (g_VOX_Lost) if (gFlagEndTransmission)
gVoxStopCountdown_10ms = vox_stop_count_down_10ms;
else
if (gVoxStopCountdown_10ms == 0)
gVOX_NoiseDetected = false;
if (gCurrentFunction == FUNCTION_TRANSMIT && !gPttIsPressed && !gVOX_NoiseDetected)
{ {
if (gFlagEndTransmission) //if (gCurrentFunction != FUNCTION_FOREGROUND)
FUNCTION_Select(FUNCTION_FOREGROUND);
}
else
{
APP_EndTransmission();
if (gEeprom.REPEATER_TAIL_TONE_ELIMINATION == 0)
{ {
//if (gCurrentFunction != FUNCTION_FOREGROUND) //if (gCurrentFunction != FUNCTION_FOREGROUND)
FUNCTION_Select(FUNCTION_FOREGROUND); FUNCTION_Select(FUNCTION_FOREGROUND);
} }
else else
{ gRTTECountdown = gEeprom.REPEATER_TAIL_TONE_ELIMINATION * 10;
APP_EndTransmission();
if (gEeprom.REPEATER_TAIL_TONE_ELIMINATION == 0)
{
//if (gCurrentFunction != FUNCTION_FOREGROUND)
FUNCTION_Select(FUNCTION_FOREGROUND);
}
else
gRTTECountdown = gEeprom.REPEATER_TAIL_TONE_ELIMINATION * 10;
}
gUpdateStatus = true;
gUpdateDisplay = true;
gFlagEndTransmission = false;
} }
return;
gUpdateStatus = true;
gUpdateDisplay = true;
gFlagEndTransmission = false;
} }
return;
if (g_VOX_Lost) }
if (g_VOX_Lost)
{
gVOX_NoiseDetected = true;
if (gCurrentFunction == FUNCTION_POWER_SAVE)
FUNCTION_Select(FUNCTION_FOREGROUND);
if (gCurrentFunction != FUNCTION_TRANSMIT && gSerialConfigCountDown_500ms == 0)
{ {
gVOX_NoiseDetected = true;
if (gCurrentFunction == FUNCTION_POWER_SAVE)
FUNCTION_Select(FUNCTION_FOREGROUND);
if (gCurrentFunction != FUNCTION_TRANSMIT && gSerialConfigCountDown_500ms == 0)
{
#ifdef ENABLE_DTMF_CALLING #ifdef ENABLE_DTMF_CALLING
gDTMF_ReplyState = DTMF_REPLY_NONE; gDTMF_ReplyState = DTMF_REPLY_NONE;
#endif #endif
RADIO_PrepareTX(); RADIO_PrepareTX();
gUpdateDisplay = true; gUpdateDisplay = true;
}
} }
} }
}
#endif #endif
void APP_Update(void) void APP_Update(void)
@@ -910,23 +909,20 @@ void APP_Update(void)
HandleVox(); HandleVox();
#endif #endif
if (gSchedulePowerSave) if (gSchedulePowerSave) {
{ if (gPttIsPressed ||
if (
#ifdef ENABLE_FMRADIO
gFmRadioMode ||
#endif
gPttIsPressed ||
gKeyBeingHeld || gKeyBeingHeld ||
gEeprom.BATTERY_SAVE == 0 || gEeprom.BATTERY_SAVE == 0 ||
gScanStateDir != SCAN_OFF || gScanStateDir != SCAN_OFF ||
gCssBackgroundScan || gCssBackgroundScan ||
gScreenToDisplay != DISPLAY_MAIN gScreenToDisplay != DISPLAY_MAIN
#ifdef ENABLE_FMRADIO
|| gFmRadioMode
#endif
#ifdef ENABLE_DTMF_CALLING #ifdef ENABLE_DTMF_CALLING
|| gDTMF_CallState != DTMF_CALL_STATE_NONE || gDTMF_CallState != DTMF_CALL_STATE_NONE
#endif #endif
) ){
{
gBatterySaveCountdown_10ms = battery_save_count_10ms; gBatterySaveCountdown_10ms = battery_save_count_10ms;
} }
else else
@@ -1181,7 +1177,7 @@ void APP_TimeSlice10ms(void)
if (gCurrentFunction == FUNCTION_TRANSMIT) if (gCurrentFunction == FUNCTION_TRANSMIT)
{ {
#ifdef ENABLE_ALARM #ifdef ENABLE_ALARM
if (gAlarmState == ALARM_STATE_TXALARM || gAlarmState == ALARM_STATE_ALARM) if (gAlarmState == ALARM_STATE_TXALARM || gAlarmState == ALARM_STATE_SITE_ALARM)
{ {
uint16_t Tone; uint16_t Tone;
@@ -1203,7 +1199,7 @@ void APP_TimeSlice10ms(void)
if (gAlarmState == ALARM_STATE_TXALARM) if (gAlarmState == ALARM_STATE_TXALARM)
{ {
gAlarmState = ALARM_STATE_ALARM; gAlarmState = ALARM_STATE_SITE_ALARM;
RADIO_EnableCxCSS(); RADIO_EnableCxCSS();
BK4819_SetupPowerAmplifier(0, 0); BK4819_SetupPowerAmplifier(0, 0);
@@ -1353,14 +1349,14 @@ void APP_TimeSlice500ms(void)
// Skipped authentic device check // Skipped authentic device check
#ifdef ENABLE_FMRADIO #ifdef ENABLE_FMRADIO
if (gFmRadioCountdown_500ms > 0) if (gFmRadioCountdown_500ms > 0)
{ {
gFmRadioCountdown_500ms--; gFmRadioCountdown_500ms--;
if (gFmRadioMode) // 1of11 if (gFmRadioMode) // 1of11
return; return;
} }
#endif #endif
if (gBacklightCountdown_500ms > 0 && !gAskToSave && !gCssBackgroundScan && if (gBacklightCountdown_500ms > 0 && !gAskToSave && !gCssBackgroundScan &&
// don't turn off backlight if user is in backlight menu option // don't turn off backlight if user is in backlight menu option
@@ -1564,30 +1560,29 @@ void APP_TimeSlice500ms(void)
} }
#if defined(ENABLE_ALARM) || defined(ENABLE_TX1750) #if defined(ENABLE_ALARM) || defined(ENABLE_TX1750)
static void ALARM_Off(void) static void ALARM_Off(void)
{ {
gAlarmState = ALARM_STATE_OFF; AUDIO_AudioPathOff();
gEnableSpeaker = false;
AUDIO_AudioPathOff(); if (gAlarmState == ALARM_STATE_TXALARM) {
gEnableSpeaker = false; RADIO_SendEndOfTransmission();
RADIO_EnableCxCSS();
if (gEeprom.ALARM_MODE == ALARM_MODE_TONE)
{
RADIO_SendEndOfTransmission();
RADIO_EnableCxCSS();
}
#ifdef ENABLE_VOX
gVoxResumeCountdown = 80;
#endif
SYSTEM_DelayMs(5);
RADIO_SetupRegisters(true);
if (gScreenToDisplay != DISPLAY_MENU) // 1of11 .. don't close the menu
gRequestDisplayScreen = DISPLAY_MAIN;
} }
gAlarmState = ALARM_STATE_OFF;
#ifdef ENABLE_VOX
gVoxResumeCountdown = 80;
#endif
SYSTEM_DelayMs(5);
RADIO_SetupRegisters(true);
if (gScreenToDisplay != DISPLAY_MENU) // 1of11 .. don't close the menu
gRequestDisplayScreen = DISPLAY_MAIN;
}
#endif #endif
@@ -1842,22 +1837,21 @@ static void ProcessKey(KEY_Code_t Key, bool bKeyPressed, bool bKeyHeld)
} }
} }
#if defined(ENABLE_ALARM) || defined(ENABLE_TX1750) #if defined(ENABLE_ALARM) || defined(ENABLE_TX1750)
else if ((!bKeyHeld && bKeyPressed) || (gAlarmState == ALARM_STATE_TX1750 && bKeyHeld && !bKeyPressed))
{
ALARM_Off();
if (gEeprom.REPEATER_TAIL_TONE_ELIMINATION == 0)
FUNCTION_Select(FUNCTION_FOREGROUND);
else else
if ((!bKeyHeld && bKeyPressed) || (gAlarmState == ALARM_STATE_TX1750 && bKeyHeld && !bKeyPressed)) gRTTECountdown = gEeprom.REPEATER_TAIL_TONE_ELIMINATION * 10;
{
ALARM_Off();
if (gEeprom.REPEATER_TAIL_TONE_ELIMINATION == 0) if (Key == KEY_PTT)
FUNCTION_Select(FUNCTION_FOREGROUND); gPttWasPressed = true;
else else
gRTTECountdown = gEeprom.REPEATER_TAIL_TONE_ELIMINATION * 10; if (!bKeyHeld)
gPttWasReleased = true;
if (Key == KEY_PTT) }
gPttWasPressed = true;
else
if (!bKeyHeld)
gPttWasReleased = true;
}
#endif #endif
} }
else if (Key != KEY_SIDE1 && Key != KEY_SIDE2) { else if (Key != KEY_SIDE1 && Key != KEY_SIDE2) {

View File

@@ -174,35 +174,33 @@ void FUNCTION_Select(FUNCTION_Type_t Function)
gDTMF_RX_live_timeout = 0; gDTMF_RX_live_timeout = 0;
memset(gDTMF_RX_live, 0, sizeof(gDTMF_RX_live)); memset(gDTMF_RX_live, 0, sizeof(gDTMF_RX_live));
#if defined(ENABLE_FMRADIO) #if defined(ENABLE_FMRADIO)
if (gFmRadioMode) if (gFmRadioMode)
BK1080_Init(0, false); BK1080_Init(0, false);
#endif #endif
#ifdef ENABLE_ALARM #ifdef ENABLE_ALARM
if (gAlarmState == ALARM_STATE_TXALARM && gEeprom.ALARM_MODE != ALARM_MODE_TONE) if (gAlarmState == ALARM_STATE_SITE_ALARM)
{ {
gAlarmState = ALARM_STATE_ALARM; GUI_DisplayScreen();
GUI_DisplayScreen(); AUDIO_AudioPathOff();
AUDIO_AudioPathOff(); SYSTEM_DelayMs(20);
BK4819_PlayTone(500, 0);
SYSTEM_DelayMs(2);
SYSTEM_DelayMs(20); AUDIO_AudioPathOn();
BK4819_PlayTone(500, 0);
SYSTEM_DelayMs(2);
AUDIO_AudioPathOn(); gEnableSpeaker = true;
gEnableSpeaker = true; SYSTEM_DelayMs(60);
BK4819_ExitTxMute();
SYSTEM_DelayMs(60); gAlarmToneCounter = 0;
BK4819_ExitTxMute(); break;
}
gAlarmToneCounter = 0; #endif
break;
}
#endif
gUpdateStatus = true; gUpdateStatus = true;
@@ -219,24 +217,25 @@ void FUNCTION_Select(FUNCTION_Type_t Function)
BK4819_PlaySingleTone(2525, 250, 0, gEeprom.DTMF_SIDE_TONE); BK4819_PlaySingleTone(2525, 250, 0, gEeprom.DTMF_SIDE_TONE);
#if defined(ENABLE_ALARM) || defined(ENABLE_TX1750) #if defined(ENABLE_ALARM) || defined(ENABLE_TX1750)
if (gAlarmState != ALARM_STATE_OFF) if (gAlarmState != ALARM_STATE_OFF) {
{ #ifdef ENABLE_TX1750
#ifdef ENABLE_TX1750 if (gAlarmState == ALARM_STATE_TX1750)
if (gAlarmState == ALARM_STATE_TX1750) BK4819_TransmitTone(true, 1750);
BK4819_TransmitTone(true, 1750); #endif
#endif
#ifdef ENABLE_ALARM #ifdef ENABLE_ALARM
if (gAlarmState == ALARM_STATE_TXALARM) if (gAlarmState == ALARM_STATE_TXALARM)
BK4819_TransmitTone(true, 500); BK4819_TransmitTone(true, 500);
#endif
SYSTEM_DelayMs(2); gAlarmToneCounter = 0;
AUDIO_AudioPathOn(); #endif
#ifdef ENABLE_ALARM
gAlarmToneCounter = 0; SYSTEM_DelayMs(2);
#endif AUDIO_AudioPathOn();
gEnableSpeaker = true; gEnableSpeaker = true;
break;
} break;
}
#endif #endif
if (gCurrentVfo->SCRAMBLING_TYPE > 0 && gSetting_ScrambleEnable) if (gCurrentVfo->SCRAMBLING_TYPE > 0 && gSetting_ScrambleEnable)

2
misc.h
View File

@@ -63,7 +63,7 @@ enum {
enum AlarmState_t { enum AlarmState_t {
ALARM_STATE_OFF = 0, ALARM_STATE_OFF = 0,
ALARM_STATE_TXALARM, ALARM_STATE_TXALARM,
ALARM_STATE_ALARM, ALARM_STATE_SITE_ALARM,
ALARM_STATE_TX1750 ALARM_STATE_TX1750
}; };
typedef enum AlarmState_t AlarmState_t; typedef enum AlarmState_t AlarmState_t;

134
radio.c
View File

@@ -42,18 +42,19 @@ VFO_Info_t *gCurrentVfo;
DCS_CodeType_t gCurrentCodeType; DCS_CodeType_t gCurrentCodeType;
VfoState_t VfoState[2]; VfoState_t VfoState[2];
const char gModulationStr[][4] = const char gModulationStr[MODULATION_UKNOWN][4] = {
{ [MODULATION_FM]="FM",
"FM", [MODULATION_AM]="AM",
"AM", [MODULATION_USB]="USB",
"USB",
#ifdef ENABLE_BYP_RAW_DEMODULATORS #ifdef ENABLE_BYP_RAW_DEMODULATORS
"BYP", [MODULATION_BYP]="BYP",
"RAW" [MODULATION_RAW]="RAW"
#endif #endif
}; };
bool RADIO_CheckValidChannel(uint16_t Channel, bool bCheckScanList, uint8_t VFO) bool RADIO_CheckValidChannel(uint16_t Channel, bool bCheckScanList, uint8_t VFO)
{ // return true if the channel appears valid { // return true if the channel appears valid
@@ -955,31 +956,23 @@ void RADIO_SetupAGC(bool listeningAM, bool disable)
void RADIO_SetVfoState(VfoState_t State) void RADIO_SetVfoState(VfoState_t State)
{ {
if (State == VFO_STATE_NORMAL) if (State == VFO_STATE_NORMAL) {
{
VfoState[0] = VFO_STATE_NORMAL; VfoState[0] = VFO_STATE_NORMAL;
VfoState[1] = VFO_STATE_NORMAL; VfoState[1] = VFO_STATE_NORMAL;
gVFOStateResumeCountdown_500ms = 0; } else if (State == VFO_STATE_VOLTAGE_HIGH) {
} VfoState[0] = VFO_STATE_VOLTAGE_HIGH;
else VfoState[1] = VFO_STATE_TX_DISABLE;
{ } else {
if (State == VFO_STATE_VOLTAGE_HIGH) // 1of11
{ const unsigned int vfo = (gEeprom.CROSS_BAND_RX_TX == CROSS_BAND_OFF) ? gEeprom.RX_VFO : gEeprom.TX_VFO;
VfoState[0] = VFO_STATE_VOLTAGE_HIGH; VfoState[vfo] = State;
VfoState[1] = VFO_STATE_TX_DISABLE;
}
else
{ // 1of11
const unsigned int vfo = (gEeprom.CROSS_BAND_RX_TX == CROSS_BAND_OFF) ? gEeprom.RX_VFO : gEeprom.TX_VFO;
VfoState[vfo] = State;
}
gVFOStateResumeCountdown_500ms = vfo_state_resume_countdown_500ms;
} }
gVFOStateResumeCountdown_500ms = (State == VFO_STATE_NORMAL) ? 0 : vfo_state_resume_countdown_500ms;
gUpdateDisplay = true; gUpdateDisplay = true;
} }
void RADIO_PrepareTX(void) void RADIO_PrepareTX(void)
{ {
VfoState_t State = VFO_STATE_NORMAL; // default to OK to TX VfoState_t State = VFO_STATE_NORMAL; // default to OK to TX
@@ -1004,97 +997,84 @@ void RADIO_PrepareTX(void)
RADIO_SelectCurrentVfo(); RADIO_SelectCurrentVfo();
#if defined(ENABLE_ALARM) && defined(ENABLE_TX1750) if(TX_freq_check(gCurrentVfo->pTX->Frequency) != 0
if (gAlarmState == ALARM_STATE_OFF || #if defined(ENABLE_ALARM) || defined(ENABLE_TX1750)
gAlarmState == ALARM_STATE_TX1750 || && gAlarmState != ALARM_STATE_SITE_ALARM
(gAlarmState == ALARM_STATE_ALARM && gEeprom.ALARM_MODE == ALARM_MODE_TONE))
#elif defined(ENABLE_ALARM)
if (gAlarmState == ALARM_STATE_OFF ||
(gAlarmState == ALARM_STATE_ALARM && gEeprom.ALARM_MODE == ALARM_MODE_TONE))
#elif defined(ENABLE_TX1750)
if (gAlarmState == ALARM_STATE_OFF ||
gAlarmState == ALARM_STATE_TX1750)
#endif
{
#ifndef ENABLE_TX_WHEN_AM
if (gCurrentVfo->Modulation != MODULATION_FM)
{ // not allowed to TX if in AM mode
State = VFO_STATE_TX_DISABLE;
}
else
#endif #endif
if (gSerialConfigCountDown_500ms > 0) ) {
{ // TX is disabled or config upload/download in progress // TX frequency not allowed
State = VFO_STATE_TX_DISABLE; State = VFO_STATE_TX_DISABLE;
} } else if (gSerialConfigCountDown_500ms > 0) {
else // TX is disabled or config upload/download in progress
if (TX_freq_check(gCurrentVfo->pTX->Frequency) == 0) State = VFO_STATE_TX_DISABLE;
{ // TX frequency is allowed } else if (gCurrentVfo->BUSY_CHANNEL_LOCK && gCurrentFunction == FUNCTION_RECEIVE) {
if (gCurrentVfo->BUSY_CHANNEL_LOCK && gCurrentFunction == FUNCTION_RECEIVE) // busy RX'ing a station
State = VFO_STATE_BUSY; // busy RX'ing a station State = VFO_STATE_BUSY;
else } else if (gBatteryDisplayLevel == 0) {
if (gBatteryDisplayLevel == 0) // charge your battery !git co
State = VFO_STATE_BAT_LOW; // charge your battery ! State = VFO_STATE_BAT_LOW;
else } else if (gBatteryDisplayLevel > 6) {
if (gBatteryDisplayLevel > 6) // over voltage .. this is being a pain
State = VFO_STATE_VOLTAGE_HIGH; // over voltage .. this is being a pain State = VFO_STATE_VOLTAGE_HIGH;
}
else
State = VFO_STATE_TX_DISABLE; // TX frequency not allowed
} }
#ifndef ENABLE_TX_WHEN_AM
else if (gCurrentVfo->Modulation != MODULATION_FM) {
// not allowed to TX if in AM mode
State = VFO_STATE_TX_DISABLE;
}
#endif
if (State != VFO_STATE_NORMAL) if (State != VFO_STATE_NORMAL) {
{ // TX not allowed // TX not allowed
RADIO_SetVfoState(State); RADIO_SetVfoState(State);
#if defined(ENABLE_ALARM) || defined(ENABLE_TX1750) #if defined(ENABLE_ALARM) || defined(ENABLE_TX1750)
gAlarmState = ALARM_STATE_OFF; gAlarmState = ALARM_STATE_OFF;
#endif #endif
#ifdef ENABLE_DTMF_CALLING #ifdef ENABLE_DTMF_CALLING
gDTMF_ReplyState = DTMF_REPLY_NONE; gDTMF_ReplyState = DTMF_REPLY_NONE;
#endif #endif
AUDIO_PlayBeep(BEEP_500HZ_60MS_DOUBLE_BEEP_OPTIONAL); AUDIO_PlayBeep(BEEP_500HZ_60MS_DOUBLE_BEEP_OPTIONAL);
return; return;
} }
// TX is allowed // TX is allowed
#ifdef ENABLE_DTMF_CALLING #ifdef ENABLE_DTMF_CALLING
if (gDTMF_ReplyState == DTMF_REPLY_ANI) if (gDTMF_ReplyState == DTMF_REPLY_ANI)
{ {
if (gDTMF_CallMode == DTMF_CALL_MODE_DTMF) if (gDTMF_CallMode == DTMF_CALL_MODE_DTMF)
{ {
gDTMF_IsTx = true; gDTMF_IsTx = true;
gDTMF_CallState = DTMF_CALL_STATE_NONE; gDTMF_CallState = DTMF_CALL_STATE_NONE;
gDTMF_TxStopCountdown_500ms = DTMF_txstop_countdown_500ms; gDTMF_TxStopCountdown_500ms = DTMF_txstop_countdown_500ms;
} }
else else
{ {
gDTMF_IsTx = false;
gDTMF_CallState = DTMF_CALL_STATE_CALL_OUT; gDTMF_CallState = DTMF_CALL_STATE_CALL_OUT;
gDTMF_IsTx = false;
} }
} }
#endif #endif
FUNCTION_Select(FUNCTION_TRANSMIT); FUNCTION_Select(FUNCTION_TRANSMIT);
gTxTimerCountdown_500ms = 0; // no timeout gTxTimerCountdown_500ms = 0; // no timeout
#if defined(ENABLE_ALARM) || defined(ENABLE_TX1750) #if defined(ENABLE_ALARM) || defined(ENABLE_TX1750)
if (gAlarmState == ALARM_STATE_OFF) if (gAlarmState == ALARM_STATE_OFF)
#endif #endif
{ {
if (gEeprom.TX_TIMEOUT_TIMER == 0) if (gEeprom.TX_TIMEOUT_TIMER == 0)
gTxTimerCountdown_500ms = 60; // 30 sec gTxTimerCountdown_500ms = 60; // 30 sec
else else if (gEeprom.TX_TIMEOUT_TIMER < (ARRAY_SIZE(gSubMenu_TOT) - 1))
if (gEeprom.TX_TIMEOUT_TIMER < (ARRAY_SIZE(gSubMenu_TOT) - 1))
gTxTimerCountdown_500ms = 120 * gEeprom.TX_TIMEOUT_TIMER; // minutes gTxTimerCountdown_500ms = 120 * gEeprom.TX_TIMEOUT_TIMER; // minutes
else else
gTxTimerCountdown_500ms = 120 * 15; // 15 minutes gTxTimerCountdown_500ms = 120 * 15; // 15 minutes
} }
gTxTimeoutReached = false;
gTxTimeoutReached = false;
gFlagEndTransmission = false; gFlagEndTransmission = false;
gRTTECountdown = 0; gRTTECountdown = 0;

View File

@@ -50,7 +50,8 @@ enum VfoState_t
VFO_STATE_TX_DISABLE, VFO_STATE_TX_DISABLE,
VFO_STATE_TIMEOUT, VFO_STATE_TIMEOUT,
VFO_STATE_ALARM, VFO_STATE_ALARM,
VFO_STATE_VOLTAGE_HIGH VFO_STATE_VOLTAGE_HIGH,
_VFO_STATE_LAST_ELEMENT
}; };
typedef enum VfoState_t VfoState_t; typedef enum VfoState_t VfoState_t;

View File

@@ -51,6 +51,16 @@ const int8_t dBmCorrTable[7] = {
-1 // band 7 -1 // band 7
}; };
const char *VfoStateStr[] = {
[VFO_STATE_NORMAL]="",
[VFO_STATE_BUSY]="BUSY",
[VFO_STATE_BAT_LOW]="BAT LOW",
[VFO_STATE_TX_DISABLE]="TX DISABLE",
[VFO_STATE_TIMEOUT]="TIMEOUT",
[VFO_STATE_ALARM]="ALARM",
[VFO_STATE_VOLTAGE_HIGH]="VOLT HIGH"
};
// *************************************************************************** // ***************************************************************************
static void DrawSmallAntennaAndBars(uint8_t *p, unsigned int level) static void DrawSmallAntennaAndBars(uint8_t *p, unsigned int level)
@@ -303,10 +313,7 @@ void UI_MAIN_TimeSlice500ms(void)
void UI_DisplayMain(void) void UI_DisplayMain(void)
{ {
const unsigned int line0 = 0; // text screen line
const unsigned int line1 = 4;
char String[22]; char String[22];
unsigned int vfo_num;
center_line = CENTER_LINE_NONE; center_line = CENTER_LINE_NONE;
@@ -329,8 +336,10 @@ void UI_DisplayMain(void)
unsigned int activeTxVFO = gRxVfoIsActive ? gEeprom.RX_VFO : gEeprom.TX_VFO; unsigned int activeTxVFO = gRxVfoIsActive ? gEeprom.RX_VFO : gEeprom.TX_VFO;
for (vfo_num = 0; vfo_num < 2; vfo_num++) for (unsigned int vfo_num = 0; vfo_num < 2; vfo_num++)
{ {
const unsigned int line0 = 0; // text screen line
const unsigned int line1 = 4;
const unsigned int line = (vfo_num == 0) ? line0 : line1; const unsigned int line = (vfo_num == 0) ? line0 : line1;
const bool isMainVFO = (vfo_num == gEeprom.TX_VFO); const bool isMainVFO = (vfo_num == gEeprom.TX_VFO);
uint8_t *p_line0 = gFrameBuffer[line + 0]; uint8_t *p_line0 = gFrameBuffer[line + 0];
@@ -416,7 +425,7 @@ void UI_DisplayMain(void)
{ // transmitting { // transmitting
#ifdef ENABLE_ALARM #ifdef ENABLE_ALARM
if (gAlarmState == ALARM_STATE_ALARM) if (gAlarmState == ALARM_STATE_SITE_ALARM)
mode = 2; mode = 2;
else else
#endif #endif
@@ -483,10 +492,10 @@ void UI_DisplayMain(void)
// ************ // ************
unsigned int state = VfoState[vfo_num]; enum VfoState_t state = VfoState[vfo_num];
#ifdef ENABLE_ALARM #ifdef ENABLE_ALARM
if (gCurrentFunction == FUNCTION_TRANSMIT && gAlarmState == ALARM_STATE_ALARM) { if (gCurrentFunction == FUNCTION_TRANSMIT && gAlarmState == ALARM_STATE_SITE_ALARM) {
if (activeTxVFO == vfo_num) if (activeTxVFO == vfo_num)
state = VFO_STATE_ALARM; state = VFO_STATE_ALARM;
} }
@@ -496,9 +505,8 @@ void UI_DisplayMain(void)
if (state != VFO_STATE_NORMAL) if (state != VFO_STATE_NORMAL)
{ {
const char *state_list[] = {"", "BUSY", "BAT LOW", "TX DISABLE", "TIMEOUT", "ALARM", "VOLT HIGH"}; if (state < ARRAY_SIZE(VfoStateStr))
if (state < ARRAY_SIZE(state_list)) UI_PrintString(VfoStateStr[state], 31, 0, line, 8);
UI_PrintString(state_list[state], 31, 0, line, 8);
} }
else if (gInputBoxIndex > 0 && IS_FREQ_CHANNEL(gEeprom.ScreenChannel[vfo_num]) && gEeprom.TX_VFO == vfo_num) else if (gInputBoxIndex > 0 && IS_FREQ_CHANNEL(gEeprom.ScreenChannel[vfo_num]) && gEeprom.TX_VFO == vfo_num)
{ // user entering a frequency { // user entering a frequency