From 1ab74dcba1ad157bb4a538fe01de955433a1d165 Mon Sep 17 00:00:00 2001 From: OneOfEleven Date: Sun, 8 Oct 2023 17:14:13 +0100 Subject: [PATCH] lots of renames --- Makefile | 20 +- app/action.c | 52 ++--- app/action.h | 2 +- app/aircopy.c | 16 +- app/aircopy.h | 17 +- app/app.c | 408 +++++++++++++++++++------------------- app/dtmf.c | 44 ++--- app/fm.c | 128 ++++++------ app/fm.h | 2 +- app/generic.c | 24 +-- app/main.c | 210 ++++++++++---------- app/main.h | 2 +- app/menu.c | 322 +++++++++++++++--------------- app/menu.h | 2 +- app/scanner.c | 112 +++++------ app/scanner.h | 4 +- app/spectrum.c | 248 +++++++++++++----------- app/spectrum.h | 236 +++++++++++----------- app/uart.c | 20 +- audio.c | 84 ++++---- audio.h | 175 +++++++++-------- board.c | 206 ++++++++++---------- dcs.c | 10 +- dcs.h | 6 +- driver/backlight.c | 6 +- driver/backlight.h | 2 +- driver/bk4819.c | 28 +-- driver/bk4819.h | 4 +- driver/keyboard.c | 14 +- driver/keyboard.h | 14 +- firmware.bin | Bin 57528 -> 56792 bytes firmware.packed.bin | Bin 57546 -> 56810 bytes frequencies.h | 6 +- functions.c | 36 ++-- helper/battery.c | 2 +- helper/boot.c | 30 +-- main.c | 22 +-- misc.c | 54 +++--- misc.h | 46 ++--- radio.c | 462 ++++++++++++++++++++++---------------------- radio.h | 76 ++++---- scheduler.c | 6 +- settings.c | 181 ++++++++--------- settings.h | 172 ++++++++--------- ui/aircopy.c | 2 +- ui/fmradio.c | 12 +- ui/inputbox.c | 2 +- ui/inputbox.h | 2 +- ui/lock.c | 16 +- ui/main.c | 116 +++++------ ui/menu.c | 48 ++--- ui/menu.h | 6 +- ui/status.c | 20 +- ui/ui.c | 2 +- ui/welcome.c | 6 +- version.c | 2 +- 56 files changed, 1874 insertions(+), 1871 deletions(-) diff --git a/Makefile b/Makefile index d11594b..f9cb794 100644 --- a/Makefile +++ b/Makefile @@ -10,12 +10,12 @@ ENABLE_LTO := 1 ENABLE_UART := 1 ENABLE_AIRCOPY := 0 ENABLE_FMRADIO := 1 -ENABLE_NOAA := 0 +ENABLE_NOAA := 1 ENABLE_VOICE := 1 ENABLE_VOX := 1 -ENABLE_ALARM := 0 +ENABLE_ALARM := 1 ENABLE_TX1750 := 1 -ENABLE_PWRON_PASSWORD := 0 +ENABLE_PWRON_PASSWORD := 1 ENABLE_BIG_FREQ := 0 ENABLE_SMALL_BOLD := 1 ENABLE_KEEP_MEM_NAME := 1 @@ -33,8 +33,8 @@ ENABLE_AM_FIX_SHOW_DATA := 1 ENABLE_SQUELCH_MORE_SENSITIVE := 1 ENABLE_FASTER_CHANNEL_SCAN := 1 ENABLE_RSSI_BAR := 1 -ENABLE_AUDIO_BAR := 0 ENABLE_SHOW_TX_TIMEOUT := 1 +ENABLE_AUDIO_BAR := 0 ENABLE_COPY_CHAN_TO_VFO := 1 #ENABLE_PANADAPTER := 1 #ENABLE_SINGLE_VFO_CHAN := 1 @@ -53,6 +53,11 @@ ifeq ($(ENABLE_LTO),1) ENABLE_OVERLAY := 0 endif +ifeq ($(ENABLE_SHOW_TX_TIMEOUT),1) + # can't have ENABLE_SHOW_TX_TIMEOUT and ENABLE_AUDIO_BAR enabled at same time + ENABLE_AUDIO_BAR := 0 +endif + BSP_DEFINITIONS := $(wildcard hardware/*/*.def) BSP_HEADERS := $(patsubst hardware/%,bsp/%,$(BSP_DEFINITIONS)) BSP_HEADERS := $(patsubst %.def,%.h,$(BSP_HEADERS)) @@ -108,6 +113,9 @@ OBJS += app/generic.o OBJS += app/main.o OBJS += app/menu.o OBJS += app/scanner.o +ifeq ($(ENABLE_PANADAPTER),1) + OBJS += app/spectrum.o +endif ifeq ($(ENABLE_UART),1) OBJS += app/uart.o endif @@ -295,8 +303,8 @@ endif ifeq ($(ENABLE_FASTER_CHANNEL_SCAN),1) CFLAGS += -DENABLE_FASTER_CHANNEL_SCAN endif -ifeq ($(ENABLE_BACKLIGHT_ON_RX),1) - CFLAGS += -DENABLE_BACKLIGHT_ON_RX +ifeq ($(ENABLE_backlight_ON_RX),1) + CFLAGS += -DENABLE_backlight_ON_RX endif ifeq ($(ENABLE_RSSI_BAR),1) CFLAGS += -DENABLE_RSSI_BAR diff --git a/app/action.c b/app/action.c index 36b61f6..8156119 100644 --- a/app/action.c +++ b/app/action.c @@ -55,14 +55,14 @@ static void ACTION_FlashLight(void) void ACTION_Power(void) { - if (++gTxVfo->OUTPUT_POWER > OUTPUT_POWER_HIGH) - gTxVfo->OUTPUT_POWER = OUTPUT_POWER_LOW; + if (++gTxVfo->output_power > OUTPUT_POWER_HIGH) + gTxVfo->output_power = OUTPUT_POWER_LOW; gRequestSaveChannel = 1; //gRequestSaveChannel = 2; // auto save the channel #ifdef ENABLE_VOICE - gAnotherVoiceID = VOICE_ID_POWER; + g_another_voice_id = VOICE_ID_POWER; #endif gRequestDisplayScreen = gScreenToDisplay; @@ -74,8 +74,8 @@ void ACTION_Monitor(void) { // enable the monitor RADIO_SelectVfos(); #ifdef ENABLE_NOAA - if (gRxVfo->CHANNEL_SAVE >= NOAA_CHANNEL_FIRST && gIsNoaaMode) - gNoaaChannel = gRxVfo->CHANNEL_SAVE - NOAA_CHANNEL_FIRST; + if (gRxVfo->channel_save >= NOAA_CHANNEL_FIRST && gIsNoaaMode) + gNoaaChannel = gRxVfo->channel_save - NOAA_CHANNEL_FIRST; #endif RADIO_SetupRegisters(true); APP_StartListening(FUNCTION_MONITOR, false); @@ -92,7 +92,7 @@ void ACTION_Monitor(void) } #ifdef ENABLE_NOAA - if (gEeprom.DUAL_WATCH == DUAL_WATCH_OFF && gIsNoaaMode) + if (g_eeprom.dual_watch == DUAL_WATCH_OFF && gIsNoaaMode) { gNOAA_Countdown_10ms = NOAA_countdown_10ms; gScheduleNOAA = false; @@ -130,7 +130,7 @@ void ACTION_Scan(bool bRestart) FM_PlayAndUpdate(); #ifdef ENABLE_VOICE - gAnotherVoiceID = VOICE_ID_SCANNING_STOP; + g_another_voice_id = VOICE_ID_SCANNING_STOP; #endif } else @@ -142,20 +142,20 @@ void ACTION_Scan(bool bRestart) gFM_AutoScan = true; gFM_ChannelPosition = 0; FM_EraseChannels(); - Frequency = gEeprom.FM_LowerLimit; + Frequency = g_eeprom.fm_lower_limit; } else { gFM_AutoScan = false; gFM_ChannelPosition = 0; - Frequency = gEeprom.FM_FrequencyPlaying; + Frequency = g_eeprom.fm_frequency_playing; } BK1080_GetFrequencyDeviation(Frequency); FM_Tune(Frequency, 1, bRestart); #ifdef ENABLE_VOICE - gAnotherVoiceID = VOICE_ID_SCANNING_BEGIN; + g_another_voice_id = VOICE_ID_SCANNING_BEGIN; #endif } } @@ -177,7 +177,7 @@ void ACTION_Scan(bool bRestart) RADIO_SelectVfos(); #ifdef ENABLE_NOAA - if (IS_NOT_NOAA_CHANNEL(gRxVfo->CHANNEL_SAVE)) + if (IS_NOT_NOAA_CHANNEL(gRxVfo->channel_save)) #endif { GUI_SelectNextDisplay(DISPLAY_MAIN); @@ -185,11 +185,11 @@ void ACTION_Scan(bool bRestart) if (gScanStateDir != SCAN_OFF) { // already scanning - if (gNextMrChannel <= MR_CHANNEL_LAST) + if (gNextChannel <= USER_CHANNEL_LAST) { // channel mode // keep scanning but toggle between scan lists - gEeprom.SCAN_LIST_DEFAULT = (gEeprom.SCAN_LIST_DEFAULT + 1) % 3; + g_eeprom.scan_list_default = (g_eeprom.scan_list_default + 1) % 3; // jump to the next channel CHANNEL_Next(true, gScanStateDir); @@ -204,7 +204,7 @@ void ACTION_Scan(bool bRestart) SCANNER_Stop(); #ifdef ENABLE_VOICE - gAnotherVoiceID = VOICE_ID_SCANNING_STOP; + g_another_voice_id = VOICE_ID_SCANNING_STOP; #endif } } @@ -219,7 +219,7 @@ void ACTION_Scan(bool bRestart) #endif // clear the other vfo's rssi level (to hide the antenna symbol) - gVFO_RSSI_bar_level[(gEeprom.RX_VFO + 1) & 1u] = 0; + gVFO_RSSI_bar_level[(g_eeprom.rx_vfo + 1) & 1u] = 0; // let the user see DW is not active gDualWatchActive = false; @@ -229,9 +229,9 @@ void ACTION_Scan(bool bRestart) } else // if (!bRestart) - if (!bRestart && gNextMrChannel <= MR_CHANNEL_LAST) + if (!bRestart && gNextChannel <= USER_CHANNEL_LAST) { // channel mode, keep scanning but toggle between scan lists - gEeprom.SCAN_LIST_DEFAULT = (gEeprom.SCAN_LIST_DEFAULT + 1) % 3; + g_eeprom.scan_list_default = (g_eeprom.scan_list_default + 1) % 3; // jump to the next channel CHANNEL_Next(true, gScanStateDir); @@ -247,7 +247,7 @@ void ACTION_Scan(bool bRestart) SCANNER_Stop(); #ifdef ENABLE_VOICE - gAnotherVoiceID = VOICE_ID_SCANNING_STOP; + g_another_voice_id = VOICE_ID_SCANNING_STOP; #endif gRequestDisplayScreen = DISPLAY_MAIN; @@ -257,11 +257,11 @@ void ACTION_Scan(bool bRestart) #ifdef ENABLE_VOX void ACTION_Vox(void) { - gEeprom.VOX_SWITCH = !gEeprom.VOX_SWITCH; + g_eeprom.vox_switch = !g_eeprom.vox_switch; gRequestSaveSettings = true; gFlagReconfigureVfos = true; #ifdef ENABLE_VOICE - gAnotherVoiceID = VOICE_ID_VOX; + g_another_voice_id = VOICE_ID_VOX; #endif gUpdateStatus = true; } @@ -323,7 +323,7 @@ void ACTION_Scan(bool bRestart) } #endif -void ACTION_Handle(KEY_Code_t Key, bool bKeyPressed, bool bKeyHeld) +void ACTION_Handle(key_code_t Key, bool bKeyPressed, bool bKeyHeld) { uint8_t Short = ACTION_OPT_NONE; uint8_t Long = ACTION_OPT_NONE; @@ -346,7 +346,7 @@ void ACTION_Handle(KEY_Code_t Key, bool bKeyPressed, bool bKeyHeld) } #ifdef ENABLE_VOICE - gAnotherVoiceID = VOICE_ID_CANCEL; + g_another_voice_id = VOICE_ID_CANCEL; #endif gRequestDisplayScreen = DISPLAY_MAIN; @@ -359,14 +359,14 @@ void ACTION_Handle(KEY_Code_t Key, bool bKeyPressed, bool bKeyHeld) if (Key == KEY_SIDE1) { - Short = gEeprom.KEY_1_SHORT_PRESS_ACTION; - Long = gEeprom.KEY_1_LONG_PRESS_ACTION; + Short = g_eeprom.key1_short_press_action; + Long = g_eeprom.key1_long_press_action; } else if (Key == KEY_SIDE2) { - Short = gEeprom.KEY_2_SHORT_PRESS_ACTION; - Long = gEeprom.KEY_2_LONG_PRESS_ACTION; + Short = g_eeprom.key2_short_press_action; + Long = g_eeprom.key2_long_press_action; } if (!bKeyHeld && bKeyPressed) diff --git a/app/action.h b/app/action.h index 3008d4e..b568599 100644 --- a/app/action.h +++ b/app/action.h @@ -33,7 +33,7 @@ void ACTION_Scan(bool bFlag); void ACTION_FM(void); #endif -void ACTION_Handle(KEY_Code_t Key, bool bKeyPressed, bool bKeyHeld); +void ACTION_Handle(key_code_t Key, bool bKeyPressed, bool bKeyHeld); #endif diff --git a/app/aircopy.c b/app/aircopy.c index c257e28..8e9cd85 100644 --- a/app/aircopy.c +++ b/app/aircopy.c @@ -113,7 +113,7 @@ void AIRCOPY_StorePacket(void) gErrorsDuringAirCopy++; } -static void AIRCOPY_Key_DIGITS(KEY_Code_t Key, bool bKeyPressed, bool bKeyHeld) +static void AIRCOPY_Key_DIGITS(key_code_t Key, bool bKeyPressed, bool bKeyHeld) { if (!bKeyHeld && bKeyPressed) { @@ -125,7 +125,7 @@ static void AIRCOPY_Key_DIGITS(KEY_Code_t Key, bool bKeyPressed, bool bKeyHeld) if (gInputBoxIndex < 6) { #ifdef ENABLE_VOICE - gAnotherVoiceID = (VOICE_ID_t)Key; + g_another_voice_id = (voice_id_t)Key; #endif return; } @@ -139,13 +139,13 @@ static void AIRCOPY_Key_DIGITS(KEY_Code_t Key, bool bKeyPressed, bool bKeyHeld) if (Frequency >= frequencyBandTable[i].lower && Frequency < frequencyBandTable[i].upper) { #ifdef ENABLE_VOICE - gAnotherVoiceID = (VOICE_ID_t)Key; + g_another_voice_id = (voice_id_t)Key; #endif - gRxVfo->Band = i; + gRxVfo->band = i; Frequency += 75; - Frequency = FREQUENCY_FloorToStep(Frequency, gRxVfo->StepFrequency, 0); - gRxVfo->freq_config_RX.Frequency = Frequency; - gRxVfo->freq_config_TX.Frequency = Frequency; + Frequency = FREQUENCY_FloorToStep(Frequency, gRxVfo->step_freq, 0); + gRxVfo->freq_config_rx.frequency = Frequency; + gRxVfo->freq_config_tx.frequency = Frequency; RADIO_ConfigureSquelchAndOutputPower(gRxVfo); gCurrentVfo = gRxVfo; RADIO_SetupRegisters(true); @@ -202,7 +202,7 @@ static void AIRCOPY_Key_MENU(bool bKeyPressed, bool bKeyHeld) } } -void AIRCOPY_ProcessKeys(KEY_Code_t Key, bool bKeyPressed, bool bKeyHeld) +void AIRCOPY_ProcessKeys(key_code_t Key, bool bKeyPressed, bool bKeyHeld) { switch (Key) { diff --git a/app/aircopy.h b/app/aircopy.h index d951290..c52fa14 100644 --- a/app/aircopy.h +++ b/app/aircopy.h @@ -21,25 +21,24 @@ #include "driver/keyboard.h" -enum AIRCOPY_State_t +enum aircopy_state_e { AIRCOPY_READY = 0, AIRCOPY_TRANSFER, AIRCOPY_COMPLETE }; +typedef enum aircopy_state_e aircopy_state_t; -typedef enum AIRCOPY_State_t AIRCOPY_State_t; +extern aircopy_state_t g_aircopy_state; +extern uint16_t g_air_copy_block_number; +extern uint16_t g_errors_during_air_copyy; +extern uint8_t g_air_copy_is_send_mode; -extern AIRCOPY_State_t gAircopyState; -extern uint16_t gAirCopyBlockNumber; -extern uint16_t gErrorsDuringAirCopy; -extern uint8_t gAirCopyIsSendMode; - -extern uint16_t g_FSK_Buffer[36]; +extern uint16_t g_fsk_buffer[36]; void AIRCOPY_SendMessage(void); void AIRCOPY_StorePacket(void); -void AIRCOPY_ProcessKeys(KEY_Code_t Key, bool bKeyPressed, bool bKeyHeld); +void AIRCOPY_ProcessKeys(key_code_t Key, bool bKeyPressed, bool bKeyHeld); #endif diff --git a/app/app.c b/app/app.c index e0caf33..e5b52a9 100644 --- a/app/app.c +++ b/app/app.c @@ -69,7 +69,7 @@ const uint8_t orig_lna = 2; // -14dB const uint8_t orig_mixer = 3; // 0dB const uint8_t orig_pga = 6; // -3dB -static void APP_ProcessKey(KEY_Code_t Key, bool bKeyPressed, bool bKeyHeld); +static void APP_ProcessKey(key_code_t Key, bool bKeyPressed, bool bKeyHeld); static void updateRSSI(const int vfo) { @@ -77,7 +77,7 @@ static void updateRSSI(const int vfo) #ifdef ENABLE_AM_FIX // add RF gain adjust compensation - if (gEeprom.VfoInfo[vfo].AM_mode && gSetting_AM_fix) + if (g_eeprom.VfoInfo[vfo].am_mode && gSetting_AM_fix) rssi -= rssi_gain_diff[vfo]; #endif @@ -107,7 +107,7 @@ static void APP_CheckForIncoming(void) gRxReceptionMode = RX_MODE_DETECTED; } - if (gEeprom.DUAL_WATCH == DUAL_WATCH_OFF) + if (g_eeprom.dual_watch == DUAL_WATCH_OFF) { // dual watch is disabled #ifdef ENABLE_NOAA @@ -123,7 +123,7 @@ static void APP_CheckForIncoming(void) FUNCTION_Select(FUNCTION_INCOMING); //gUpdateDisplay = true; - updateRSSI(gEeprom.RX_VFO); + updateRSSI(g_eeprom.rx_vfo); gUpdateRSSI = true; } @@ -139,7 +139,7 @@ static void APP_CheckForIncoming(void) FUNCTION_Select(FUNCTION_INCOMING); //gUpdateDisplay = true; - updateRSSI(gEeprom.RX_VFO); + updateRSSI(g_eeprom.rx_vfo); gUpdateRSSI = true; } return; @@ -161,7 +161,7 @@ static void APP_CheckForIncoming(void) FUNCTION_Select(FUNCTION_INCOMING); //gUpdateDisplay = true; - updateRSSI(gEeprom.RX_VFO); + updateRSSI(g_eeprom.rx_vfo); gUpdateRSSI = true; } return; @@ -178,7 +178,7 @@ static void APP_CheckForIncoming(void) FUNCTION_Select(FUNCTION_INCOMING); //gUpdateDisplay = true; - updateRSSI(gEeprom.RX_VFO); + updateRSSI(g_eeprom.rx_vfo); gUpdateRSSI = true; } } @@ -201,23 +201,23 @@ static void APP_HandleIncoming(void) return; } - bFlag = (gScanStateDir == SCAN_OFF && gCurrentCodeType == CODE_TYPE_OFF); + bFlag = (gScanStateDir == SCAN_OFF && gCurrentcode_type == CODE_TYPE_OFF); #ifdef ENABLE_NOAA - if (IS_NOAA_CHANNEL(gRxVfo->CHANNEL_SAVE) && gNOAACountdown_10ms > 0) + if (IS_NOAA_CHANNEL(gRxVfo->channel_save) && gNOAACountdown_10ms > 0) { gNOAACountdown_10ms = 0; bFlag = true; } #endif - if (g_CTCSS_Lost && gCurrentCodeType == CODE_TYPE_CONTINUOUS_TONE) + if (g_CTCSS_lost && gCurrentcode_type == CODE_TYPE_CONTINUOUS_TONE) { bFlag = true; gFoundCTCSS = false; } - if (g_CDCSS_Lost && gCDCSSCodeType == CDCSS_POSITIVE_CODE && (gCurrentCodeType == CODE_TYPE_DIGITAL || gCurrentCodeType == CODE_TYPE_REVERSE_DIGITAL)) + if (g_CDCSS_lost && g_CDCSS_code_type == CDCSS_POSITIVE_CODE && (gCurrentcode_type == CODE_TYPE_DIGITAL || gCurrentcode_type == CODE_TYPE_REVERSE_DIGITAL)) { gFoundCDCSS = false; } @@ -227,7 +227,7 @@ static void APP_HandleIncoming(void) if (gScanStateDir == SCAN_OFF && gCssScanMode == CSS_SCAN_MODE_OFF) { // not scanning - if (gRxVfo->DTMF_DECODING_ENABLE || gSetting_KILLED) + if (gRxVfo->DTMF_decoding_enable || gSetting_KILLED) { // DTMF DCD is enabled DTMF_HandleRequest(); @@ -269,7 +269,7 @@ static void APP_HandleReceive(void) goto Skip; } - if (gScanStateDir != SCAN_OFF && IS_FREQ_CHANNEL(gNextMrChannel)) + if (gScanStateDir != SCAN_OFF && IS_FREQ_CHANNEL(gNextChannel)) { if (g_SquelchLost) return; @@ -278,7 +278,7 @@ static void APP_HandleReceive(void) goto Skip; } - switch (gCurrentCodeType) + switch (gCurrentcode_type) { default: case CODE_TYPE_OFF: @@ -309,26 +309,26 @@ static void APP_HandleReceive(void) if (g_SquelchLost) { #ifdef ENABLE_NOAA - if (!gEndOfRxDetectedMaybe && IS_NOT_NOAA_CHANNEL(gRxVfo->CHANNEL_SAVE)) + if (!gEndOfRxDetectedMaybe && IS_NOT_NOAA_CHANNEL(gRxVfo->channel_save)) #else if (!gEndOfRxDetectedMaybe) #endif { - switch (gCurrentCodeType) + switch (gCurrentcode_type) { case CODE_TYPE_OFF: - if (gEeprom.SQUELCH_LEVEL) + if (g_eeprom.squelch_level) { - if (g_CxCSS_TAIL_Found) + if (g_CxCSS_tailL_found) { Mode = END_OF_RX_MODE_TTE; - g_CxCSS_TAIL_Found = false; + g_CxCSS_tailL_found = false; } } break; case CODE_TYPE_CONTINUOUS_TONE: - if (g_CTCSS_Lost) + if (g_CTCSS_lost) { gFoundCTCSS = false; } @@ -339,16 +339,16 @@ static void APP_HandleReceive(void) gFoundCTCSSCountdown_10ms = 100; // 1 sec } - if (g_CxCSS_TAIL_Found) + if (g_CxCSS_tailL_found) { Mode = END_OF_RX_MODE_TTE; - g_CxCSS_TAIL_Found = false; + g_CxCSS_tailL_found = false; } break; case CODE_TYPE_DIGITAL: case CODE_TYPE_REVERSE_DIGITAL: - if (g_CDCSS_Lost && gCDCSSCodeType == CDCSS_POSITIVE_CODE) + if (g_CDCSS_lost && g_CDCSS_code_type == CDCSS_POSITIVE_CODE) { gFoundCDCSS = false; } @@ -359,12 +359,12 @@ static void APP_HandleReceive(void) gFoundCDCSSCountdown_10ms = 100; // 1 sec } - if (g_CxCSS_TAIL_Found) + if (g_CxCSS_tailL_found) { if (BK4819_GetCTCType() == 1) Mode = END_OF_RX_MODE_TTE; - g_CxCSS_TAIL_Found = false; + g_CxCSS_tailL_found = false; } break; @@ -377,8 +377,8 @@ static void APP_HandleReceive(void) if (!gEndOfRxDetectedMaybe && Mode == END_OF_RX_MODE_SKIP && gNextTimeslice40ms && - gEeprom.TAIL_NOTE_ELIMINATION && - (gCurrentCodeType == CODE_TYPE_DIGITAL || gCurrentCodeType == CODE_TYPE_REVERSE_DIGITAL) && + g_eeprom.tail_note_elimination && + (gCurrentcode_type == CODE_TYPE_DIGITAL || gCurrentcode_type == CODE_TYPE_REVERSE_DIGITAL) && BK4819_GetCTCType() == 1) Mode = END_OF_RX_MODE_TTE; else @@ -394,7 +394,7 @@ Skip: RADIO_SetupRegisters(true); #ifdef ENABLE_NOAA - if (IS_NOAA_CHANNEL(gRxVfo->CHANNEL_SAVE)) + if (IS_NOAA_CHANNEL(gRxVfo->channel_save)) gNOAACountdown_10ms = 300; // 3 sec #endif @@ -402,7 +402,7 @@ Skip: if (gScanStateDir != SCAN_OFF) { - switch (gEeprom.SCAN_RESUME_MODE) + switch (g_eeprom.scan_resume_mode) { case SCAN_RESUME_TO: break; @@ -421,7 +421,7 @@ Skip: break; case END_OF_RX_MODE_TTE: - if (gEeprom.TAIL_NOTE_ELIMINATION) + if (g_eeprom.tail_note_elimination) { GPIO_ClearBit(&GPIOC->DATA, GPIOC_PIN_AUDIO_PATH); @@ -457,7 +457,7 @@ static void APP_HandleFunction(void) break; case FUNCTION_POWER_SAVE: - if (!gRxIdleMode) + if (!g_rx_idle_mode) APP_CheckForIncoming(); break; @@ -468,8 +468,8 @@ static void APP_HandleFunction(void) void APP_StartListening(FUNCTION_Type_t Function, const bool reset_am_fix) { - const unsigned int chan = gEeprom.RX_VFO; -// const unsigned int chan = gRxVfo->CHANNEL_SAVE; + const unsigned int chan = g_eeprom.rx_vfo; +// const unsigned int chan = gRxVfo->channel_save; if (gSetting_KILLED) return; @@ -487,11 +487,11 @@ void APP_StartListening(FUNCTION_Type_t Function, const bool reset_am_fix) gEnableSpeaker = true; if (gSetting_backlight_on_tx_rx >= 2) - BACKLIGHT_TurnOn(); + backlight_turn_on(); if (gScanStateDir != SCAN_OFF) { - switch (gEeprom.SCAN_RESUME_MODE) + switch (g_eeprom.scan_resume_mode) { case SCAN_RESUME_TO: if (!gScanPauseMode) @@ -513,12 +513,12 @@ void APP_StartListening(FUNCTION_Type_t Function, const bool reset_am_fix) } #ifdef ENABLE_NOAA - if (IS_NOAA_CHANNEL(gRxVfo->CHANNEL_SAVE) && gIsNoaaMode) + if (IS_NOAA_CHANNEL(gRxVfo->channel_save) && gIsNoaaMode) { - gRxVfo->CHANNEL_SAVE = gNoaaChannel + NOAA_CHANNEL_FIRST; - gRxVfo->pRX->Frequency = NoaaFrequencyTable[gNoaaChannel]; - gRxVfo->pTX->Frequency = NoaaFrequencyTable[gNoaaChannel]; - gEeprom.ScreenChannel[chan] = gRxVfo->CHANNEL_SAVE; + gRxVfo->channel_save = gNoaaChannel + NOAA_CHANNEL_FIRST; + gRxVfo->pRX->frequency = NoaaFrequencyTable[gNoaaChannel]; + gRxVfo->pTX->frequency = NoaaFrequencyTable[gNoaaChannel]; + g_eeprom.screen_channel[chan] = gRxVfo->channel_save; gNOAA_Countdown_10ms = 500; // 5 sec gScheduleNOAA = false; @@ -530,7 +530,7 @@ void APP_StartListening(FUNCTION_Type_t Function, const bool reset_am_fix) if (gScanStateDir == SCAN_OFF && gCssScanMode == CSS_SCAN_MODE_OFF && - gEeprom.DUAL_WATCH != DUAL_WATCH_OFF) + g_eeprom.dual_watch != DUAL_WATCH_OFF) { // not scanning, dual watch is enabled gDualWatchCountdown_10ms = dual_watch_count_after_2_10ms; @@ -552,7 +552,7 @@ void APP_StartListening(FUNCTION_Type_t Function, const bool reset_am_fix) uint16_t pga = orig_pga; #ifdef ENABLE_AM_FIX - if (gRxVfo->AM_mode && gSetting_AM_fix) + if (gRxVfo->am_mode && gSetting_AM_fix) { // AM RX mode if (reset_am_fix) AM_fix_reset(chan); // TODO: only reset it when moving channel/frequency @@ -571,13 +571,13 @@ void APP_StartListening(FUNCTION_Type_t Function, const bool reset_am_fix) BK4819_WriteRegister(BK4819_REG_48, (11u << 12) | // ??? .. 0 to 15, doesn't seem to make any difference ( 0u << 10) | // AF Rx Gain-1 - (gEeprom.VOLUME_GAIN << 4) | // AF Rx Gain-2 - (gEeprom.DAC_GAIN << 0)); // AF DAC Gain (after Gain-1 and Gain-2) + (g_eeprom.volume_gain << 4) | // AF Rx Gain-2 + (g_eeprom.dac_gain << 0)); // AF DAC Gain (after Gain-1 and Gain-2) #ifdef ENABLE_VOICE - if (gVoiceWriteIndex == 0) // AM/FM RX mode will be set when the voice has finished + if (g_voice_write_index == 0) // AM/FM RX mode will be set when the voice has finished #endif - BK4819_SetAF(gRxVfo->AM_mode ? BK4819_AF_AM : BK4819_AF_FM); // no need, set it now + BK4819_SetAF(gRxVfo->am_mode ? BK4819_AF_AM : BK4819_AF_FM); // no need, set it now FUNCTION_Select(Function); @@ -598,11 +598,11 @@ void APP_StartListening(FUNCTION_Type_t Function, const bool reset_am_fix) uint32_t APP_SetFrequencyByStep(VFO_Info_t *pInfo, int8_t Step) { - uint32_t Frequency = pInfo->freq_config_RX.Frequency + (Step * pInfo->StepFrequency); + uint32_t Frequency = pInfo->freq_config_rx.frequency + (Step * pInfo->step_freq); - if (pInfo->StepFrequency == 833) + if (pInfo->step_freq == 833) { - const uint32_t Lower = frequencyBandTable[pInfo->Band].lower; + const uint32_t Lower = frequencyBandTable[pInfo->band].lower; const uint32_t Delta = Frequency - Lower; uint32_t Base = (Delta / 2500) * 2500; const uint32_t Index = ((Delta - Base) % 2500) / 833; @@ -613,18 +613,18 @@ uint32_t APP_SetFrequencyByStep(VFO_Info_t *pInfo, int8_t Step) Frequency = Lower + Base + (Index * 833); } - if (Frequency >= frequencyBandTable[pInfo->Band].upper) - Frequency = frequencyBandTable[pInfo->Band].lower; + if (Frequency >= frequencyBandTable[pInfo->band].upper) + Frequency = frequencyBandTable[pInfo->band].lower; else - if (Frequency < frequencyBandTable[pInfo->Band].lower) - Frequency = FREQUENCY_FloorToStep(frequencyBandTable[pInfo->Band].upper, pInfo->StepFrequency, frequencyBandTable[pInfo->Band].lower); + if (Frequency < frequencyBandTable[pInfo->band].lower) + Frequency = FREQUENCY_FloorToStep(frequencyBandTable[pInfo->band].upper, pInfo->step_freq, frequencyBandTable[pInfo->band].lower); return Frequency; } static void FREQ_NextChannel(void) { - gRxVfo->freq_config_RX.Frequency = APP_SetFrequencyByStep(gRxVfo, gScanStateDir); + gRxVfo->freq_config_rx.frequency = APP_SetFrequencyByStep(gRxVfo, gScanStateDir); RADIO_ApplyOffset(gRxVfo); RADIO_ConfigureSquelchAndOutputPower(gRxVfo); @@ -640,14 +640,14 @@ static void FREQ_NextChannel(void) gUpdateDisplay = true; } -static void MR_NextChannel(void) +static void USER_NextChannel(void) { - static unsigned int prev_mr_chan = 0; - const bool enabled = (gEeprom.SCAN_LIST_DEFAULT < 2) ? gEeprom.SCAN_LIST_ENABLED[gEeprom.SCAN_LIST_DEFAULT] : true; - const int chan1 = (gEeprom.SCAN_LIST_DEFAULT < 2) ? gEeprom.SCANLIST_PRIORITY_CH1[gEeprom.SCAN_LIST_DEFAULT] : -1; - const int chan2 = (gEeprom.SCAN_LIST_DEFAULT < 2) ? gEeprom.SCANLIST_PRIORITY_CH2[gEeprom.SCAN_LIST_DEFAULT] : -1; - const unsigned int prev_chan = gNextMrChannel; - unsigned int chan = 0; + static unsigned int prevChannel = 0; + const bool enabled = (g_eeprom.scan_list_default < 2) ? g_eeprom.scan_list_enabled[g_eeprom.scan_list_default] : true; + const int chan1 = (g_eeprom.scan_list_default < 2) ? g_eeprom.scan_list_priority_ch1[g_eeprom.scan_list_default] : -1; + const int chan2 = (g_eeprom.scan_list_default < 2) ? g_eeprom.scan_list_priority_ch2[g_eeprom.scan_list_default] : -1; + const unsigned int prev_chan = gNextChannel; + unsigned int chan = 0; if (enabled) { @@ -657,14 +657,14 @@ static void MR_NextChannel(void) switch (gCurrentScanList) { case SCAN_NEXT_CHAN_SCANLIST1: - prev_mr_chan = gNextMrChannel; + prevChannel = gNextChannel; if (chan1 >= 0) { if (RADIO_CheckValidChannel(chan1, false, 0)) { gCurrentScanList = SCAN_NEXT_CHAN_SCANLIST1; - gNextMrChannel = chan1; + gNextChannel = chan1; break; } } @@ -675,30 +675,30 @@ static void MR_NextChannel(void) if (RADIO_CheckValidChannel(chan2, false, 0)) { gCurrentScanList = SCAN_NEXT_CHAN_SCANLIST2; - gNextMrChannel = chan2; + gNextChannel = chan2; break; } } // this bit doesn't yet work if the other VFO is a frequency - case SCAN_NEXT_CHAN_DUAL_WATCH: + case SCAN_NEXT_CHAN_dual_watch: // dual watch is enabled - include the other VFO in the scan -// if (gEeprom.DUAL_WATCH != DUAL_WATCH_OFF) +// if (g_eeprom.dual_watch != DUAL_WATCH_OFF) // { -// chan = (gEeprom.RX_VFO + 1) & 1u; -// chan = gEeprom.ScreenChannel[chan]; -// if (chan <= MR_CHANNEL_LAST) +// chan = (g_eeprom.rx_vfo + 1) & 1u; +// chan = g_eeprom.screen_channel[chan]; +// if (chan <= USER_CHANNEL_LAST) // { -// gCurrentScanList = SCAN_NEXT_CHAN_DUAL_WATCH; -// gNextMrChannel = chan; +// gCurrentScanList = SCAN_NEXT_CHAN_dual_watch; +// gNextChannel = chan; // break; // } // } default: - case SCAN_NEXT_CHAN_MR: - gCurrentScanList = SCAN_NEXT_CHAN_MR; - gNextMrChannel = prev_mr_chan; + case SCAN_NEXT_CHAN_USER: + gCurrentScanList = SCAN_NEXT_CHAN_USER; + gNextChannel = prevChannel; chan = 0xff; break; } @@ -708,23 +708,23 @@ static void MR_NextChannel(void) if (!enabled || chan == 0xff) { - chan = RADIO_FindNextChannel(gNextMrChannel + gScanStateDir, gScanStateDir, (gEeprom.SCAN_LIST_DEFAULT < 2) ? true : false, gEeprom.SCAN_LIST_DEFAULT); + chan = RADIO_FindNextChannel(gNextChannel + gScanStateDir, gScanStateDir, (g_eeprom.scan_list_default < 2) ? true : false, g_eeprom.scan_list_default); if (chan == 0xFF) { // no valid channel found - chan = MR_CHANNEL_FIRST; + chan = USER_CHANNEL_FIRST; // return; } - gNextMrChannel = chan; + gNextChannel = chan; } - if (gNextMrChannel != prev_chan) + if (gNextChannel != prev_chan) { - gEeprom.MrChannel[ gEeprom.RX_VFO] = gNextMrChannel; - gEeprom.ScreenChannel[gEeprom.RX_VFO] = gNextMrChannel; + g_eeprom.user_channel[g_eeprom.rx_vfo] = gNextChannel; + g_eeprom.screen_channel[g_eeprom.rx_vfo] = gNextChannel; - RADIO_ConfigureChannel(gEeprom.RX_VFO, VFO_CONFIGURE_RELOAD); + RADIO_ConfigureChannel(g_eeprom.rx_vfo, VFO_CONFIGURE_RELOAD); RADIO_SetupRegisters(true); gUpdateDisplay = true; @@ -756,21 +756,21 @@ static void DUALWATCH_Alternate(void) #ifdef ENABLE_NOAA if (gIsNoaaMode) { - if (IS_NOT_NOAA_CHANNEL(gEeprom.ScreenChannel[0]) || IS_NOT_NOAA_CHANNEL(gEeprom.ScreenChannel[1])) - gEeprom.RX_VFO = (gEeprom.RX_VFO + 1) & 1; + if (IS_NOT_NOAA_CHANNEL(g_eeprom.screen_channel[0]) || IS_NOT_NOAA_CHANNEL(g_eeprom.screen_channel[1])) + g_eeprom.rx_vfo = (g_eeprom.rx_vfo + 1) & 1; else - gEeprom.RX_VFO = 0; + g_eeprom.rx_vfo = 0; - gRxVfo = &gEeprom.VfoInfo[gEeprom.RX_VFO]; + gRxVfo = &g_eeprom.VfoInfo[g_eeprom.rx_vfo]; - if (gEeprom.VfoInfo[0].CHANNEL_SAVE >= NOAA_CHANNEL_FIRST) + if (g_eeprom.VfoInfo[0].channel_save >= NOAA_CHANNEL_FIRST) NOAA_IncreaseChannel(); } else #endif { // toggle between VFO's - gEeprom.RX_VFO = (gEeprom.RX_VFO + 1) & 1; - gRxVfo = &gEeprom.VfoInfo[gEeprom.RX_VFO]; + g_eeprom.rx_vfo = (g_eeprom.rx_vfo + 1) & 1; + gRxVfo = &g_eeprom.VfoInfo[g_eeprom.rx_vfo]; if (!gDualWatchActive) { // let the user see DW is active @@ -810,7 +810,7 @@ void APP_CheckRadioInterrupts(void) // 3 = 240deg phase shift // const uint8_t ctcss_shift = BK4819_GetCTCShift(); // if (ctcss_shift > 0) -// g_CTCSS_Lost = true; +// g_CTCSS_lost = true; if (interrupt_status_bits & BK4819_REG_02_DTMF_5TONE_FOUND) { // save the RX'ed DTMF character @@ -833,7 +833,7 @@ void APP_CheckRadioInterrupts(void) gUpdateDisplay = true; } - if (gRxVfo->DTMF_DECODING_ENABLE || gSetting_KILLED) + if (gRxVfo->DTMF_decoding_enable || gSetting_KILLED) { if (gDTMF_RX_index >= (sizeof(gDTMF_RX) - 1)) { // make room @@ -852,38 +852,38 @@ void APP_CheckRadioInterrupts(void) } if (interrupt_status_bits & BK4819_REG_02_CxCSS_TAIL) - g_CxCSS_TAIL_Found = true; + g_CxCSS_tailL_found = true; if (interrupt_status_bits & BK4819_REG_02_CDCSS_LOST) { - g_CDCSS_Lost = true; - gCDCSSCodeType = BK4819_GetCDCSSCodeType(); + g_CDCSS_lost = true; + g_CDCSS_code_type = BK4819_get_CDCSS_code_type(); } if (interrupt_status_bits & BK4819_REG_02_CDCSS_FOUND) - g_CDCSS_Lost = false; + g_CDCSS_lost = false; if (interrupt_status_bits & BK4819_REG_02_CTCSS_LOST) - g_CTCSS_Lost = true; + g_CTCSS_lost = true; if (interrupt_status_bits & BK4819_REG_02_CTCSS_FOUND) - g_CTCSS_Lost = false; + g_CTCSS_lost = false; #ifdef ENABLE_VOX if (interrupt_status_bits & BK4819_REG_02_VOX_LOST) { - g_VOX_Lost = true; - gVoxPauseCountdown = 10; + g_vox_lost = true; + g_vox_pause_count_down = 10; - if (gEeprom.VOX_SWITCH) + if (g_eeprom.vox_switch) { - if (gCurrentFunction == FUNCTION_POWER_SAVE && !gRxIdleMode) + if (gCurrentFunction == FUNCTION_POWER_SAVE && !g_rx_idle_mode) { gPowerSave_10ms = power_save2_10ms; gPowerSaveCountdownExpired = 0; } - if (gEeprom.DUAL_WATCH != DUAL_WATCH_OFF && (gScheduleDualWatch || gDualWatchCountdown_10ms < dual_watch_count_after_vox_10ms)) + if (g_eeprom.dual_watch != DUAL_WATCH_OFF && (gScheduleDualWatch || gDualWatchCountdown_10ms < dual_watch_count_after_vox_10ms)) { gDualWatchCountdown_10ms = dual_watch_count_after_vox_10ms; gScheduleDualWatch = false; @@ -897,8 +897,8 @@ void APP_CheckRadioInterrupts(void) if (interrupt_status_bits & BK4819_REG_02_VOX_FOUND) { - g_VOX_Lost = false; - gVoxPauseCountdown = 0; + g_vox_lost = false; + g_vox_pause_count_down = 0; } #endif @@ -934,11 +934,11 @@ void APP_EndTransmission(void) RADIO_SendEndOfTransmission(); - if (gCurrentVfo->pTX->CodeType != CODE_TYPE_OFF) + if (gCurrentVfo->pTX->code_type != CODE_TYPE_OFF) { // CTCSS/DCS is enabled - //if (gEeprom.TAIL_NOTE_ELIMINATION && gEeprom.REPEATER_TAIL_TONE_ELIMINATION > 0) - if (gEeprom.TAIL_NOTE_ELIMINATION) + //if (g_eeprom.tail_note_elimination && g_eeprom.repeater_tail_tone_elimination > 0) + if (g_eeprom.tail_note_elimination) { // send the CTCSS/DCS tail tone - allows the receivers to mute the usual FM squelch tail/crash RADIO_EnableCxCSS(); } @@ -963,13 +963,13 @@ void APP_EndTransmission(void) if (gVoxResumeCountdown == 0) { - if (gVoxPauseCountdown) + if (g_vox_pause_count_down) return; } else { - g_VOX_Lost = false; - gVoxPauseCountdown = 0; + g_vox_lost = false; + g_vox_pause_count_down = 0; } #ifdef ENABLE_FMRADIO @@ -985,7 +985,7 @@ void APP_EndTransmission(void) if (gVOX_NoiseDetected) { - if (g_VOX_Lost) + if (g_vox_lost) gVoxStopCountdown_10ms = vox_stop_count_down_10ms; else if (gVoxStopCountdown_10ms == 0) @@ -1002,13 +1002,13 @@ void APP_EndTransmission(void) { APP_EndTransmission(); - if (gEeprom.REPEATER_TAIL_TONE_ELIMINATION == 0) + if (g_eeprom.repeater_tail_tone_elimination == 0) { //if (gCurrentFunction != FUNCTION_FOREGROUND) FUNCTION_Select(FUNCTION_FOREGROUND); } else - gRTTECountdown = gEeprom.REPEATER_TAIL_TONE_ELIMINATION * 10; + gRTTECountdown = g_eeprom.repeater_tail_tone_elimination * 10; } gUpdateStatus = true; @@ -1018,7 +1018,7 @@ void APP_EndTransmission(void) return; } - if (g_VOX_Lost) + if (g_vox_lost) { gVOX_NoiseDetected = true; @@ -1038,10 +1038,10 @@ void APP_EndTransmission(void) void APP_Update(void) { #ifdef ENABLE_VOICE - if (gFlagPlayQueuedVoice) + if (g_flag_play_queued_voice) { AUDIO_PlayQueuedVoice(); - gFlagPlayQueuedVoice = false; + g_flag_play_queued_voice = false; } #endif @@ -1072,13 +1072,13 @@ void APP_Update(void) #endif #ifdef ENABLE_VOICE - if (gScreenToDisplay != DISPLAY_SCANNER && gScanStateDir != SCAN_OFF && gScheduleScanListen && !gPttIsPressed && gVoiceWriteIndex == 0) + if (gScreenToDisplay != DISPLAY_SCANNER && gScanStateDir != SCAN_OFF && gScheduleScanListen && !gPttIsPressed && g_voice_write_index == 0) #else if (gScreenToDisplay != DISPLAY_SCANNER && gScanStateDir != SCAN_OFF && gScheduleScanListen && !gPttIsPressed) #endif { // scanning - if (IS_FREQ_CHANNEL(gNextMrChannel)) + if (IS_FREQ_CHANNEL(gNextChannel)) { if (gCurrentFunction == FUNCTION_INCOMING) APP_StartListening(gMonitor ? FUNCTION_MONITOR : FUNCTION_RECEIVE, true); @@ -1087,10 +1087,10 @@ void APP_Update(void) } else { - if (gCurrentCodeType == CODE_TYPE_OFF && gCurrentFunction == FUNCTION_INCOMING) + if (gCurrentcode_type == CODE_TYPE_OFF && gCurrentFunction == FUNCTION_INCOMING) APP_StartListening(gMonitor ? FUNCTION_MONITOR : FUNCTION_RECEIVE, true); else - MR_NextChannel(); // switch to next channel + USER_NextChannel(); // switch to next channel } gScanPauseMode = false; @@ -1099,7 +1099,7 @@ void APP_Update(void) } #ifdef ENABLE_VOICE - if (gCssScanMode == CSS_SCAN_MODE_SCANNING && gScheduleScanListen && gVoiceWriteIndex == 0) + if (gCssScanMode == CSS_SCAN_MODE_SCANNING && gScheduleScanListen && g_voice_write_index == 0) #else if (gCssScanMode == CSS_SCAN_MODE_SCANNING && gScheduleScanListen) #endif @@ -1111,9 +1111,9 @@ void APP_Update(void) #ifdef ENABLE_NOAA #ifdef ENABLE_VOICE - if (gEeprom.DUAL_WATCH == DUAL_WATCH_OFF && gIsNoaaMode && gScheduleNOAA && gVoiceWriteIndex == 0) + if (g_eeprom.dual_watch == DUAL_WATCH_OFF && gIsNoaaMode && gScheduleNOAA && g_voice_write_index == 0) #else - if (gEeprom.DUAL_WATCH == DUAL_WATCH_OFF && gIsNoaaMode && gScheduleNOAA) + if (g_eeprom.dual_watch == DUAL_WATCH_OFF && gIsNoaaMode && gScheduleNOAA) #endif { NOAA_IncreaseChannel(); @@ -1125,10 +1125,10 @@ void APP_Update(void) #endif // toggle between the VFO's if dual watch is enabled - if (gScreenToDisplay != DISPLAY_SCANNER && gEeprom.DUAL_WATCH != DUAL_WATCH_OFF) + if (gScreenToDisplay != DISPLAY_SCANNER && g_eeprom.dual_watch != DUAL_WATCH_OFF) { #ifdef ENABLE_VOICE - if (gScheduleDualWatch && gVoiceWriteIndex == 0) + if (gScheduleDualWatch && g_voice_write_index == 0) #else if (gScheduleDualWatch) #endif @@ -1169,7 +1169,7 @@ void APP_Update(void) #endif #ifdef ENABLE_VOX - if (gEeprom.VOX_SWITCH) + if (g_eeprom.vox_switch) APP_HandleVox(); #endif @@ -1182,7 +1182,7 @@ void APP_Update(void) #endif gPttIsPressed || gKeyBeingHeld || - gEeprom.BATTERY_SAVE == 0 || + g_eeprom.battery_save == 0 || gScanStateDir != SCAN_OFF || gCssScanMode != CSS_SCAN_MODE_OFF || gScreenToDisplay != DISPLAY_MAIN || @@ -1191,7 +1191,7 @@ void APP_Update(void) gBatterySaveCountdown_10ms = battery_save_count_10ms; } else - if ((IS_NOT_NOAA_CHANNEL(gEeprom.ScreenChannel[0]) && IS_NOT_NOAA_CHANNEL(gEeprom.ScreenChannel[1])) || !gIsNoaaMode) + if ((IS_NOT_NOAA_CHANNEL(g_eeprom.screen_channel[0]) && IS_NOT_NOAA_CHANNEL(g_eeprom.screen_channel[1])) || !gIsNoaaMode) { //if (gCurrentFunction != FUNCTION_POWER_SAVE) FUNCTION_Select(FUNCTION_POWER_SAVE); @@ -1207,7 +1207,7 @@ void APP_Update(void) #endif gPttIsPressed || gKeyBeingHeld || - gEeprom.BATTERY_SAVE == 0 || + g_eeprom.battery_save == 0 || gScanStateDir != SCAN_OFF || gCssScanMode != CSS_SCAN_MODE_OFF || gScreenToDisplay != DISPLAY_MAIN || @@ -1226,22 +1226,22 @@ void APP_Update(void) } #ifdef ENABLE_VOICE - if (gPowerSaveCountdownExpired && gCurrentFunction == FUNCTION_POWER_SAVE && gVoiceWriteIndex == 0) + if (gPowerSaveCountdownExpired && gCurrentFunction == FUNCTION_POWER_SAVE && g_voice_write_index == 0) #else if (gPowerSaveCountdownExpired && gCurrentFunction == FUNCTION_POWER_SAVE) #endif { // wake up, enable RX then go back to sleep - if (gRxIdleMode) + if (g_rx_idle_mode) { BK4819_Conditional_RX_TurnOn_and_GPIO6_Enable(); #ifdef ENABLE_VOX - if (gEeprom.VOX_SWITCH) - BK4819_EnableVox(gEeprom.VOX1_THRESHOLD, gEeprom.VOX0_THRESHOLD); + if (g_eeprom.vox_switch) + BK4819_EnableVox(g_eeprom.vox1_threshold, g_eeprom.vox0_threshold); #endif - if (gEeprom.DUAL_WATCH != DUAL_WATCH_OFF && + if (g_eeprom.dual_watch != DUAL_WATCH_OFF && gScanStateDir == SCAN_OFF && gCssScanMode == CSS_SCAN_MODE_OFF) { // dual watch mode, toggle between the two VFO's @@ -1253,18 +1253,18 @@ void APP_Update(void) FUNCTION_Init(); gPowerSave_10ms = power_save1_10ms; // come back here in a bit - gRxIdleMode = false; // RX is awake + g_rx_idle_mode = false; // RX is awake } else - if (gEeprom.DUAL_WATCH == DUAL_WATCH_OFF || gScanStateDir != SCAN_OFF || gCssScanMode != CSS_SCAN_MODE_OFF || gUpdateRSSI) + if (g_eeprom.dual_watch == DUAL_WATCH_OFF || gScanStateDir != SCAN_OFF || gCssScanMode != CSS_SCAN_MODE_OFF || gUpdateRSSI) { // dual watch mode, go back to sleep - updateRSSI(gEeprom.RX_VFO); + updateRSSI(g_eeprom.rx_vfo); // go back to sleep - gPowerSave_10ms = gEeprom.BATTERY_SAVE * 10; - gRxIdleMode = true; + gPowerSave_10ms = g_eeprom.battery_save * 10; + g_rx_idle_mode = true; BK4819_DisableVox(); BK4819_Sleep(); @@ -1289,7 +1289,7 @@ void APP_Update(void) // called every 10ms void APP_CheckKeys(void) { - KEY_Code_t Key; + key_code_t Key; #ifdef ENABLE_AIRCOPY if (gSetting_KILLED || (gScreenToDisplay == DISPLAY_AIRCOPY && gAircopyState != AIRCOPY_READY)) @@ -1307,7 +1307,7 @@ void APP_CheckKeys(void) { // stop transmitting APP_ProcessKey(KEY_PTT, false, false); gPttIsPressed = false; - if (gKeyReading1 != KEY_INVALID) + if (g_key_reading_1 != KEY_INVALID) gPttWasReleased = true; } } @@ -1335,40 +1335,40 @@ void APP_CheckKeys(void) if (Key == KEY_INVALID) { -// gKeyReading0 = KEY_INVALID; -// gKeyReading1 = KEY_INVALID; -// gDebounceCounter = 0; +// g_key_reading_0 = KEY_INVALID; +// g_key_reading_1 = KEY_INVALID; +// g_debounce_counter = 0; // gKeyBeingHeld = false; // return; } boot_counter_10ms = 0; // cancel boot screen/beeps - if (gKeyReading0 != Key) + if (g_key_reading_0 != Key) { // new key pressed - if (gKeyReading0 != KEY_INVALID && Key != KEY_INVALID) - APP_ProcessKey(gKeyReading1, false, gKeyBeingHeld); // key pressed without releasing previous key + if (g_key_reading_0 != KEY_INVALID && Key != KEY_INVALID) + APP_ProcessKey(g_key_reading_1, false, gKeyBeingHeld); // key pressed without releasing previous key - gKeyReading0 = Key; - gDebounceCounter = 0; + g_key_reading_0 = Key; + g_debounce_counter = 0; return; } - if (++gDebounceCounter == key_debounce_10ms) + if (++g_debounce_counter == key_debounce_10ms) { // debounced new key pressed if (Key == KEY_INVALID) { - if (gKeyReading1 != KEY_INVALID) + if (g_key_reading_1 != KEY_INVALID) { - APP_ProcessKey(gKeyReading1, false, gKeyBeingHeld); - gKeyReading1 = KEY_INVALID; + APP_ProcessKey(g_key_reading_1, false, gKeyBeingHeld); + g_key_reading_1 = KEY_INVALID; } } else { - gKeyReading1 = Key; + g_key_reading_1 = Key; APP_ProcessKey(Key, true, false); } @@ -1376,12 +1376,12 @@ void APP_CheckKeys(void) return; } - if (gDebounceCounter < key_repeat_delay_10ms) + if (g_debounce_counter < key_repeat_delay_10ms) return; // key is being held pressed - if (gDebounceCounter == key_repeat_delay_10ms) + if (g_debounce_counter == key_repeat_delay_10ms) { // initial key repeat delay after pressed if (Key != KEY_PTT) { @@ -1394,14 +1394,14 @@ void APP_CheckKeys(void) if (Key == KEY_UP || Key == KEY_DOWN) { gKeyBeingHeld = true; - if ((gDebounceCounter % key_repeat_10ms) == 0) + if ((g_debounce_counter % key_repeat_10ms) == 0) APP_ProcessKey(Key, true, true); } - if (gDebounceCounter < 0xFFFF) + if (g_debounce_counter < 0xFFFF) return; - gDebounceCounter = key_repeat_delay_10ms; + g_debounce_counter = key_repeat_delay_10ms; } } @@ -1416,9 +1416,9 @@ void APP_TimeSlice10ms(void) #endif #ifdef ENABLE_AM_FIX -// if (gEeprom.VfoInfo[gEeprom.RX_VFO].AM_mode && gSetting_AM_fix) - if (gRxVfo->AM_mode && gSetting_AM_fix) - AM_fix_10ms(gEeprom.RX_VFO); +// if (g_eeprom.VfoInfo[g_eeprom.rx_vfo].am_mode && gSetting_AM_fix) + if (gRxVfo->am_mode && gSetting_AM_fix) + AM_fix_10ms(g_eeprom.rx_vfo); #endif if (UART_IsCommandAvailable()) @@ -1431,7 +1431,7 @@ void APP_TimeSlice10ms(void) if (gReducedService) return; - if (gCurrentFunction != FUNCTION_POWER_SAVE || !gRxIdleMode) + if (gCurrentFunction != FUNCTION_POWER_SAVE || !g_rx_idle_mode) APP_CheckRadioInterrupts(); if (gCurrentFunction == FUNCTION_TRANSMIT) @@ -1465,8 +1465,8 @@ void APP_TimeSlice10ms(void) if (gVoxResumeCountdown > 0) gVoxResumeCountdown--; - if (gVoxPauseCountdown > 0) - gVoxPauseCountdown--; + if (g_vox_pause_count_down > 0) + g_vox_pause_count_down--; #endif if (gCurrentFunction == FUNCTION_TRANSMIT) @@ -1488,7 +1488,7 @@ void APP_TimeSlice10ms(void) BK4819_SetScrambleFrequencyControlWord(Tone); - if (gEeprom.ALARM_MODE == ALARM_MODE_TONE && gAlarmRunningCounter == 512) + if (g_eeprom.alarm_mode == ALARM_MODE_TONE && gAlarmRunningCounter == 512) { gAlarmRunningCounter = 0; @@ -1699,9 +1699,9 @@ void cancelUserInputModes(void) gUpdateDisplay = true; } - if (gWasFKeyPressed || gKeyInputCountdown > 0 || gInputBoxIndex > 0) + if (g_was_f_key_pressed || gKeyInputCountdown > 0 || gInputBoxIndex > 0) { - gWasFKeyPressed = false; + g_was_f_key_pressed = false; gInputBoxIndex = 0; gKeyInputCountdown = 0; gBeepToPlay = BEEP_500HZ_60MS_DOUBLE_BEEP_OPTIONAL; @@ -1775,7 +1775,7 @@ void APP_TimeSlice500ms(void) if (gBacklightCountdown > 0 && !gAskToSave && gCssScanMode == CSS_SCAN_MODE_OFF) if (gScreenToDisplay != DISPLAY_MENU || gMenuCursor != MENU_ABR) // don't turn off backlight if user is in backlight menu option if (--gBacklightCountdown == 0) - if (gEeprom.BACKLIGHT < (ARRAY_SIZE(gSubMenu_BACKLIGHT) - 1)) + if (g_eeprom.backlight < (ARRAY_SIZE(gSubMenu_backlight) - 1)) GPIO_ClearBit(&GPIOB->DATA, GPIOB_PIN_BACKLIGHT); // turn backlight off if (gSerialConfigCountDown_500ms > 0) @@ -1833,10 +1833,10 @@ void APP_TimeSlice500ms(void) if (gScanStateDir == SCAN_OFF && (gScreenToDisplay != DISPLAY_SCANNER || gScanCssState >= SCAN_CSS_STATE_FOUND)) #endif { - if (gEeprom.AUTO_KEYPAD_LOCK && gKeyLockCountdown > 0 && !gDTMF_InputMode) + if (g_eeprom.auto_keypad_lock && gKeyLockCountdown > 0 && !gDTMF_InputMode) { if (--gKeyLockCountdown == 0) - gEeprom.KEY_LOCK = true; // lock the keyboard + g_eeprom.key_lock = true; // lock the keyboard gUpdateStatus = true; // lock symbol needs showing } @@ -1844,7 +1844,7 @@ void APP_TimeSlice500ms(void) { gMenuCountdown = 0; - if (gEeprom.BACKLIGHT == 0) + if (g_eeprom.backlight == 0) { gBacklightCountdown = 0; GPIO_ClearBit(&GPIOB->DATA, GPIOB_PIN_BACKLIGHT); // turn the backlight OFF @@ -1865,7 +1865,7 @@ void APP_TimeSlice500ms(void) */ DTMF_clear_input_box(); - gWasFKeyPressed = false; + g_was_f_key_pressed = false; gInputBoxIndex = 0; gAskToSave = false; @@ -1903,7 +1903,7 @@ void APP_TimeSlice500ms(void) } if (gCurrentFunction != FUNCTION_POWER_SAVE && gCurrentFunction != FUNCTION_TRANSMIT) - updateRSSI(gEeprom.RX_VFO); + updateRSSI(g_eeprom.rx_vfo); #ifdef ENABLE_FMRADIO if (!gPttIsPressed && gFM_ResumeCountdown_500ms > 0) @@ -1964,7 +1964,7 @@ void APP_TimeSlice500ms(void) ST7565_HardwareReset(); - if (gEeprom.BACKLIGHT < (ARRAY_SIZE(gSubMenu_BACKLIGHT) - 1)) + if (g_eeprom.backlight < (ARRAY_SIZE(gSubMenu_backlight) - 1)) GPIO_ClearBit(&GPIOB->DATA, GPIOB_PIN_BACKLIGHT); // turn the backlight off } #ifdef ENABLE_VOICE @@ -2016,7 +2016,7 @@ void APP_TimeSlice500ms(void) { if (--gDTMF_auto_reset_time_500ms == 0) { - if (gDTMF_CallState == DTMF_CALL_STATE_RECEIVED && gEeprom.DTMF_auto_reset_time >= DTMF_HOLD_MAX) + if (gDTMF_CallState == DTMF_CALL_STATE_RECEIVED && g_eeprom.DTMF_auto_reset_time >= DTMF_HOLD_MAX) gDTMF_CallState = DTMF_CALL_STATE_RECEIVED_STAY; // keep message on-screen till a key is pressed else gDTMF_CallState = DTMF_CALL_STATE_NONE; @@ -2054,7 +2054,7 @@ void APP_TimeSlice500ms(void) GPIO_ClearBit(&GPIOC->DATA, GPIOC_PIN_AUDIO_PATH); gEnableSpeaker = false; - if (gEeprom.ALARM_MODE == ALARM_MODE_TONE) + if (g_eeprom.alarm_mode == ALARM_MODE_TONE) { RADIO_SendEndOfTransmission(); RADIO_EnableCxCSS(); @@ -2077,20 +2077,20 @@ void CHANNEL_Next(const bool bFlag, const int8_t scan_direction) { RADIO_SelectVfos(); - gNextMrChannel = gRxVfo->CHANNEL_SAVE; + gNextChannel = gRxVfo->channel_save; gCurrentScanList = SCAN_NEXT_CHAN_SCANLIST1; gScanStateDir = scan_direction; - if (gNextMrChannel <= MR_CHANNEL_LAST) + if (gNextChannel <= USER_CHANNEL_LAST) { // channel mode if (bFlag) - gRestoreMrChannel = gNextMrChannel; - MR_NextChannel(); + gRestoreUSER_CHANNEL = gNextChannel; + USER_NextChannel(); } else { // frequency mode if (bFlag) - gRestoreFrequency = gRxVfo->freq_config_RX.Frequency; + gRestoreFrequency = gRxVfo->freq_config_rx.frequency; FREQ_NextChannel(); } @@ -2101,7 +2101,7 @@ void CHANNEL_Next(const bool bFlag, const int8_t scan_direction) bScanKeepFrequency = false; } -static void APP_ProcessKey(const KEY_Code_t Key, const bool bKeyPressed, const bool bKeyHeld) +static void APP_ProcessKey(const key_code_t Key, const bool bKeyPressed, const bool bKeyHeld) { bool bFlag = false; @@ -2110,9 +2110,9 @@ static void APP_ProcessKey(const KEY_Code_t Key, const bool bKeyPressed, const b const bool backlight_was_on = GPIO_CheckBit(&GPIOB->DATA, GPIOB_PIN_BACKLIGHT); - if (Key == KEY_EXIT && !backlight_was_on && gEeprom.BACKLIGHT > 0) + if (Key == KEY_EXIT && !backlight_was_on && g_eeprom.backlight > 0) { // just turn the light on for now so the user can see what's what - BACKLIGHT_TurnOn(); + backlight_turn_on(); gBeepToPlay = BEEP_NONE; return; } @@ -2122,7 +2122,7 @@ static void APP_ProcessKey(const KEY_Code_t Key, const bool bKeyPressed, const b gBatterySaveCountdown_10ms = battery_save_count_10ms; - if (gEeprom.AUTO_KEYPAD_LOCK) + if (g_eeprom.auto_keypad_lock) gKeyLockCountdown = 30; // 15 seconds if (!bKeyPressed) @@ -2149,10 +2149,10 @@ static void APP_ProcessKey(const KEY_Code_t Key, const bool bKeyPressed, const b if (gFlagSaveChannel) { - SETTINGS_SaveChannel(gTxVfo->CHANNEL_SAVE, gEeprom.TX_VFO, gTxVfo, gFlagSaveChannel); + SETTINGS_SaveChannel(gTxVfo->channel_save, g_eeprom.tx_vfo, gTxVfo, gFlagSaveChannel); gFlagSaveChannel = false; - RADIO_ConfigureChannel(gEeprom.TX_VFO, VFO_CONFIGURE); + RADIO_ConfigureChannel(g_eeprom.tx_vfo, VFO_CONFIGURE); RADIO_SetupRegisters(true); GUI_SelectNextDisplay(DISPLAY_MAIN); @@ -2161,7 +2161,7 @@ static void APP_ProcessKey(const KEY_Code_t Key, const bool bKeyPressed, const b else { if (Key != KEY_PTT || gSetting_backlight_on_tx_rx == 1 || gSetting_backlight_on_tx_rx == 3) - BACKLIGHT_TurnOn(); + backlight_turn_on(); if (Key == KEY_EXIT && bKeyHeld) { // exit key held pressed @@ -2195,7 +2195,7 @@ static void APP_ProcessKey(const KEY_Code_t Key, const bool bKeyPressed, const b } } - if (gEeprom.KEY_LOCK && gCurrentFunction != FUNCTION_TRANSMIT && Key != KEY_PTT) + if (g_eeprom.key_lock && gCurrentFunction != FUNCTION_TRANSMIT && Key != KEY_PTT) { // keyboard is locked if (Key == KEY_F) @@ -2260,9 +2260,9 @@ static void APP_ProcessKey(const KEY_Code_t Key, const bool bKeyPressed, const b } } - if (gWasFKeyPressed && (Key == KEY_PTT || Key == KEY_EXIT || Key == KEY_SIDE1 || Key == KEY_SIDE2)) + if (g_was_f_key_pressed && (Key == KEY_PTT || Key == KEY_EXIT || Key == KEY_SIDE1 || Key == KEY_SIDE2)) { // cancel the F-key - gWasFKeyPressed = false; + g_was_f_key_pressed = false; gUpdateStatus = true; } @@ -2306,15 +2306,15 @@ static void APP_ProcessKey(const KEY_Code_t Key, const bool bKeyPressed, const b BK4819_ExitDTMF_TX(false); - if (gCurrentVfo->SCRAMBLING_TYPE == 0 || !gSetting_ScrambleEnable) + if (gCurrentVfo->scrambling_type == 0 || !gSetting_ScrambleEnable) BK4819_DisableScramble(); else - BK4819_EnableScramble(gCurrentVfo->SCRAMBLING_TYPE - 1); + BK4819_EnableScramble(gCurrentVfo->scrambling_type - 1); } } else { - if (gEeprom.DTMF_SIDE_TONE) + if (g_eeprom.DTMF_side_tone) { // user will here the DTMF tones in speaker GPIO_SetBit(&GPIOC->DATA, GPIOC_PIN_AUDIO_PATH); gEnableSpeaker = true; @@ -2323,9 +2323,9 @@ static void APP_ProcessKey(const KEY_Code_t Key, const bool bKeyPressed, const b BK4819_DisableScramble(); if (Code == 0xFE) - BK4819_TransmitTone(gEeprom.DTMF_SIDE_TONE, 1750); + BK4819_TransmitTone(g_eeprom.DTMF_side_tone, 1750); else - BK4819_PlayDTMFEx(gEeprom.DTMF_SIDE_TONE, Code); + BK4819_PlayDTMFEx(g_eeprom.DTMF_side_tone, Code); } } #if defined(ENABLE_ALARM) || defined(ENABLE_TX1750) @@ -2334,10 +2334,10 @@ static void APP_ProcessKey(const KEY_Code_t Key, const bool bKeyPressed, const b { ALARM_Off(); - if (gEeprom.REPEATER_TAIL_TONE_ELIMINATION == 0) + if (g_eeprom.repeater_tail_tone_elimination == 0) FUNCTION_Select(FUNCTION_FOREGROUND); else - gRTTECountdown = gEeprom.REPEATER_TAIL_TONE_ELIMINATION * 10; + gRTTECountdown = g_eeprom.repeater_tail_tone_elimination * 10; if (Key == KEY_PTT) gPttWasPressed = true; @@ -2453,7 +2453,7 @@ Skip: { if (!bKeyHeld) { - SETTINGS_SaveChannel(gTxVfo->CHANNEL_SAVE, gEeprom.TX_VFO, gTxVfo, gRequestSaveChannel); + SETTINGS_SaveChannel(gTxVfo->channel_save, g_eeprom.tx_vfo, gTxVfo, gRequestSaveChannel); if (gScreenToDisplay != DISPLAY_SCANNER) if (gVfoConfigureMode == VFO_CONFIGURE_NONE) // 'if' is so as we don't wipe out previously setting this variable elsewhere @@ -2478,7 +2478,7 @@ Skip: RADIO_ConfigureChannel(1, gVfoConfigureMode); } else - RADIO_ConfigureChannel(gEeprom.TX_VFO, gVfoConfigureMode); + RADIO_ConfigureChannel(g_eeprom.tx_vfo, gVfoConfigureMode); if (gRequestDisplayScreen == DISPLAY_INVALID) gRequestDisplayScreen = DISPLAY_MAIN; @@ -2543,12 +2543,12 @@ Skip: } #ifdef ENABLE_VOICE - if (gAnotherVoiceID != VOICE_ID_INVALID) + if (g_another_voice_id != VOICE_ID_INVALID) { - if (gAnotherVoiceID < 76) - AUDIO_SetVoiceID(0, gAnotherVoiceID); + if (g_another_voice_id < 76) + AUDIO_SetVoiceID(0, g_another_voice_id); AUDIO_PlaySingleVoice(false); - gAnotherVoiceID = VOICE_ID_INVALID; + g_another_voice_id = VOICE_ID_INVALID; } #endif diff --git a/app/dtmf.c b/app/dtmf.c index 68b23eb..872f6be 100644 --- a/app/dtmf.c +++ b/app/dtmf.c @@ -162,7 +162,7 @@ bool DTMF_CompareMessage(const char *pMsg, const char *pTemplate, const unsigned { if (pMsg[i] != pTemplate[i]) { - if (!bCheckGroup || pMsg[i] != gEeprom.DTMF_GROUP_CALL_CODE) + if (!bCheckGroup || pMsg[i] != g_eeprom.DTMF_group_call_code) return false; gDTMF_IsGroupCall = true; } @@ -175,7 +175,7 @@ DTMF_CallMode_t DTMF_CheckGroupCall(const char *pMsg, const unsigned int size) { unsigned int i; for (i = 0; i < size; i++) - if (pMsg[i] == gEeprom.DTMF_GROUP_CALL_CODE) + if (pMsg[i] == g_eeprom.DTMF_group_call_code) break; return (i < size) ? DTMF_CALL_MODE_GROUP : DTMF_CALL_MODE_NOT_GROUP; @@ -215,7 +215,7 @@ void DTMF_HandleRequest(void) return; } - if (!gRxVfo->DTMF_DECODING_ENABLE && !gSetting_KILLED) + if (!gRxVfo->DTMF_decoding_enable && !gSetting_KILLED) { // D-DCD is disabled or we're alive DTMF_clear_RX(); return; @@ -226,14 +226,14 @@ void DTMF_HandleRequest(void) if (gDTMF_RX_index >= 9) { // look for the KILL code - sprintf(String, "%s%c%s", gEeprom.ANI_DTMF_ID, gEeprom.DTMF_SEPARATE_CODE, gEeprom.KILL_CODE); + sprintf(String, "%s%c%s", g_eeprom.ani_DTMF_id, g_eeprom.DTMF_separate_code, g_eeprom.kill_code); Offset = gDTMF_RX_index - strlen(String); if (DTMF_CompareMessage(gDTMF_RX + Offset, String, strlen(String), true)) { // bugger - if (gEeprom.PERMIT_REMOTE_KILL) + if (g_eeprom.permit_remote_kill) { gSetting_KILLED = true; // oooerr ! @@ -267,7 +267,7 @@ void DTMF_HandleRequest(void) if (gDTMF_RX_index >= 9) { // look for the REVIVE code - sprintf(String, "%s%c%s", gEeprom.ANI_DTMF_ID, gEeprom.DTMF_SEPARATE_CODE, gEeprom.REVIVE_CODE); + sprintf(String, "%s%c%s", g_eeprom.ani_DTMF_id, g_eeprom.DTMF_separate_code, g_eeprom.revive_code); Offset = gDTMF_RX_index - strlen(String); @@ -316,7 +316,7 @@ void DTMF_HandleRequest(void) gDTMF_RX_index >= 9) { // waiting for a reply - sprintf(String, "%s%c%s", gDTMF_String, gEeprom.DTMF_SEPARATE_CODE, "AAAAA"); + sprintf(String, "%s%c%s", gDTMF_String, g_eeprom.DTMF_separate_code, "AAAAA"); Offset = gDTMF_RX_index - strlen(String); @@ -338,7 +338,7 @@ void DTMF_HandleRequest(void) gDTMF_IsGroupCall = false; - sprintf(String, "%s%c", gEeprom.ANI_DTMF_ID, gEeprom.DTMF_SEPARATE_CODE); + sprintf(String, "%s%c", g_eeprom.ani_DTMF_id, g_eeprom.DTMF_separate_code); Offset = gDTMF_RX_index - strlen(String) - 3; @@ -359,7 +359,7 @@ void DTMF_HandleRequest(void) #pragma GCC diagnostic push #pragma GCC diagnostic ignored "-Wimplicit-fallthrough=" - switch (gEeprom.DTMF_DECODE_RESPONSE) + switch (g_eeprom.DTMF_decode_response) { case DTMF_DEC_RESPONSE_BOTH: gDTMF_DecodeRingCountdown_500ms = DTMF_decode_ring_countdown_500ms; @@ -399,7 +399,7 @@ void DTMF_Reply(void) } else { // append our ID code onto the end of the DTMF code to send - sprintf(String, "%s%c%s", gDTMF_String, gEeprom.DTMF_SEPARATE_CODE, gEeprom.ANI_DTMF_ID); + sprintf(String, "%s%c%s", gDTMF_String, g_eeprom.DTMF_separate_code, g_eeprom.ani_DTMF_id); pString = String; } break; @@ -409,23 +409,23 @@ void DTMF_Reply(void) break; case DTMF_REPLY_AAAAA: - sprintf(String, "%s%c%s", gEeprom.ANI_DTMF_ID, gEeprom.DTMF_SEPARATE_CODE, "AAAAA"); + sprintf(String, "%s%c%s", g_eeprom.ani_DTMF_id, g_eeprom.DTMF_separate_code, "AAAAA"); pString = String; break; default: case DTMF_REPLY_NONE: if (gDTMF_CallState != DTMF_CALL_STATE_NONE || - gCurrentVfo->DTMF_PTT_ID_TX_MODE == PTT_ID_APOLLO || - gCurrentVfo->DTMF_PTT_ID_TX_MODE == PTT_ID_OFF || - gCurrentVfo->DTMF_PTT_ID_TX_MODE == PTT_ID_TX_DOWN) + gCurrentVfo->DTMF_ptt_id_tx_mode == PTT_ID_APOLLO || + gCurrentVfo->DTMF_ptt_id_tx_mode == PTT_ID_OFF || + gCurrentVfo->DTMF_ptt_id_tx_mode == PTT_ID_TX_DOWN) { gDTMF_ReplyState = DTMF_REPLY_NONE; return; } // send TX-UP DTMF - pString = gEeprom.DTMF_UP_CODE; + pString = g_eeprom.DTMF_up_code; break; } @@ -434,9 +434,9 @@ void DTMF_Reply(void) if (pString == NULL) return; - Delay = (gEeprom.DTMF_PRELOAD_TIME < 200) ? 200 : gEeprom.DTMF_PRELOAD_TIME; + Delay = (g_eeprom.DTMF_preload_time < 200) ? 200 : g_eeprom.DTMF_preload_time; - if (gEeprom.DTMF_SIDE_TONE) + if (g_eeprom.DTMF_side_tone) { // the user will also hear the transmitted tones GPIO_SetBit(&GPIOC->DATA, GPIOC_PIN_AUDIO_PATH); gEnableSpeaker = true; @@ -444,15 +444,15 @@ void DTMF_Reply(void) SYSTEM_DelayMs(Delay); - BK4819_EnterDTMF_TX(gEeprom.DTMF_SIDE_TONE); + BK4819_EnterDTMF_TX(g_eeprom.DTMF_side_tone); BK4819_PlayDTMFString( pString, 1, - gEeprom.DTMF_FIRST_CODE_PERSIST_TIME, - gEeprom.DTMF_HASH_CODE_PERSIST_TIME, - gEeprom.DTMF_CODE_PERSIST_TIME, - gEeprom.DTMF_CODE_INTERVAL_TIME); + g_eeprom.DTMF_first_code_persist_time, + g_eeprom.DTMF_hash_code_persist_time, + g_eeprom.DTMF_code_persist_time, + g_eeprom.DTMF_code_interval_time); GPIO_ClearBit(&GPIOC->DATA, GPIOC_PIN_AUDIO_PATH); diff --git a/app/fm.c b/app/fm.c index d91259c..5beae5b 100644 --- a/app/fm.c +++ b/app/fm.c @@ -74,18 +74,18 @@ uint8_t FM_FindNextChannel(uint8_t Channel, uint8_t Direction) int FM_ConfigureChannelState(void) { - gEeprom.FM_FrequencyPlaying = gEeprom.FM_SelectedFrequency; + g_eeprom.fm_frequency_playing = g_eeprom.fm_selected_frequency; - if (gEeprom.FM_IsMrMode) + if (g_eeprom.fm_is_channel_mode) { - const uint8_t Channel = FM_FindNextChannel(gEeprom.FM_SelectedChannel, FM_CHANNEL_UP); + const uint8_t Channel = FM_FindNextChannel(g_eeprom.fm_selected_channel, FM_CHANNEL_UP); if (Channel == 0xFF) { - gEeprom.FM_IsMrMode = false; + g_eeprom.fm_is_channel_mode = false; return -1; } - gEeprom.FM_SelectedChannel = Channel; - gEeprom.FM_FrequencyPlaying = gFM_Channels[Channel]; + g_eeprom.fm_selected_channel = Channel; + g_eeprom.fm_frequency_playing = gFM_Channels[Channel]; } return 0; @@ -130,23 +130,23 @@ void FM_Tune(uint16_t Frequency, int8_t Step, bool bFlag) gFM_FoundFrequency = false; gAskToSave = false; gAskToDelete = false; - gEeprom.FM_FrequencyPlaying = Frequency; + g_eeprom.fm_frequency_playing = Frequency; if (!bFlag) { Frequency += Step; - if (Frequency < gEeprom.FM_LowerLimit) - Frequency = gEeprom.FM_UpperLimit; + if (Frequency < g_eeprom.fm_lower_limit) + Frequency = g_eeprom.fm_upper_limit; else - if (Frequency > gEeprom.FM_UpperLimit) - Frequency = gEeprom.FM_LowerLimit; + if (Frequency > g_eeprom.fm_upper_limit) + Frequency = g_eeprom.fm_lower_limit; - gEeprom.FM_FrequencyPlaying = Frequency; + g_eeprom.fm_frequency_playing = Frequency; } gFM_ScanState = Step; - BK1080_SetFrequency(gEeprom.FM_FrequencyPlaying); + BK1080_SetFrequency(g_eeprom.fm_frequency_playing); } void FM_PlayAndUpdate(void) @@ -155,12 +155,12 @@ void FM_PlayAndUpdate(void) if (gFM_AutoScan) { - gEeprom.FM_IsMrMode = true; - gEeprom.FM_SelectedChannel = 0; + g_eeprom.fm_is_channel_mode = true; + g_eeprom.fm_selected_channel = 0; } FM_ConfigureChannelState(); - BK1080_SetFrequency(gEeprom.FM_FrequencyPlaying); + BK1080_SetFrequency(g_eeprom.fm_frequency_playing); SETTINGS_SaveFM(); gFmPlayCountdown_10ms = 0; @@ -224,15 +224,15 @@ Bail: return ret; } -static void FM_Key_DIGITS(KEY_Code_t Key, bool bKeyPressed, bool bKeyHeld) +static void FM_Key_DIGITS(key_code_t Key, bool bKeyPressed, bool bKeyHeld) { #define STATE_FREQ_MODE 0 - #define STATE_MR_MODE 1 + #define STATE_USER_MODE 1 #define STATE_SAVE 2 if (!bKeyHeld && bKeyPressed) { - if (!gWasFKeyPressed) + if (!g_was_f_key_pressed) { uint8_t State; @@ -254,7 +254,7 @@ static void FM_Key_DIGITS(KEY_Code_t Key, bool bKeyPressed, bool bKeyHeld) return; } - State = gEeprom.FM_IsMrMode ? STATE_MR_MODE : STATE_FREQ_MODE; + State = g_eeprom.fm_is_channel_mode ? STATE_USER_MODE : STATE_FREQ_MODE; } INPUTBOX_Append(Key); @@ -281,21 +281,21 @@ static void FM_Key_DIGITS(KEY_Code_t Key, bool bKeyPressed, bool bKeyHeld) NUMBER_Get(gInputBox, &Frequency); Frequency /= 10000; - if (Frequency < gEeprom.FM_LowerLimit || gEeprom.FM_UpperLimit < Frequency) + if (Frequency < g_eeprom.fm_lower_limit || g_eeprom.fm_upper_limit < Frequency) { gBeepToPlay = BEEP_500HZ_60MS_DOUBLE_BEEP_OPTIONAL; gRequestDisplayScreen = DISPLAY_FM; return; } - gEeprom.FM_SelectedFrequency = (uint16_t)Frequency; + g_eeprom.fm_selected_frequency = (uint16_t)Frequency; #ifdef ENABLE_VOICE - gAnotherVoiceID = (VOICE_ID_t)Key; + g_another_voice_id = (voice_id_t)Key; #endif - gEeprom.FM_FrequencyPlaying = gEeprom.FM_SelectedFrequency; - BK1080_SetFrequency(gEeprom.FM_FrequencyPlaying); + g_eeprom.fm_frequency_playing = g_eeprom.fm_selected_frequency; + BK1080_SetFrequency(g_eeprom.fm_frequency_playing); gRequestSaveFM = true; return; } @@ -308,16 +308,16 @@ static void FM_Key_DIGITS(KEY_Code_t Key, bool bKeyPressed, bool bKeyHeld) gInputBoxIndex = 0; Channel = ((gInputBox[0] * 10) + gInputBox[1]) - 1; - if (State == STATE_MR_MODE) + if (State == STATE_USER_MODE) { if (FM_CheckValidChannel(Channel)) { #ifdef ENABLE_VOICE - gAnotherVoiceID = (VOICE_ID_t)Key; + g_another_voice_id = (voice_id_t)Key; #endif - gEeprom.FM_SelectedChannel = Channel; - gEeprom.FM_FrequencyPlaying = gFM_Channels[Channel]; - BK1080_SetFrequency(gEeprom.FM_FrequencyPlaying); + g_eeprom.fm_selected_channel = Channel; + g_eeprom.fm_frequency_playing = gFM_Channels[Channel]; + BK1080_SetFrequency(g_eeprom.fm_frequency_playing); gRequestSaveFM = true; return; } @@ -326,7 +326,7 @@ static void FM_Key_DIGITS(KEY_Code_t Key, bool bKeyPressed, bool bKeyHeld) if (Channel < 20) { #ifdef ENABLE_VOICE - gAnotherVoiceID = (VOICE_ID_t)Key; + g_another_voice_id = (voice_id_t)Key; #endif gRequestDisplayScreen = DISPLAY_FM; gInputBoxIndex = 0; @@ -339,14 +339,14 @@ static void FM_Key_DIGITS(KEY_Code_t Key, bool bKeyPressed, bool bKeyHeld) } #ifdef ENABLE_VOICE - gAnotherVoiceID = (VOICE_ID_t)Key; + g_another_voice_id = (voice_id_t)Key; #endif return; } gBeepToPlay = BEEP_1KHZ_60MS_OPTIONAL; - gWasFKeyPressed = false; + g_was_f_key_pressed = false; gUpdateStatus = true; gRequestDisplayScreen = DISPLAY_FM; @@ -357,11 +357,11 @@ static void FM_Key_DIGITS(KEY_Code_t Key, bool bKeyPressed, bool bKeyHeld) break; case KEY_1: - gEeprom.FM_IsMrMode = !gEeprom.FM_IsMrMode; + g_eeprom.fm_is_channel_mode = !g_eeprom.fm_is_channel_mode; if (!FM_ConfigureChannelState()) { - BK1080_SetFrequency(gEeprom.FM_FrequencyPlaying); + BK1080_SetFrequency(g_eeprom.fm_frequency_playing); gRequestSaveFM = true; } else @@ -429,14 +429,14 @@ static void FM_Key_EXIT(bool bKeyPressed, bool bKeyHeld) } #ifdef ENABLE_VOICE - gAnotherVoiceID = VOICE_ID_CANCEL; + g_another_voice_id = VOICE_ID_CANCEL; #endif } else { FM_PlayAndUpdate(); #ifdef ENABLE_VOICE - gAnotherVoiceID = VOICE_ID_SCANNING_STOP; + g_another_voice_id = VOICE_ID_SCANNING_STOP; #endif } @@ -456,11 +456,11 @@ static void FM_Key_MENU(bool bKeyPressed, bool bKeyHeld) if (gFM_ScanState == FM_SCAN_OFF) { - if (!gEeprom.FM_IsMrMode) + if (!g_eeprom.fm_is_channel_mode) { if (gAskToSave) { - gFM_Channels[gFM_ChannelPosition] = gEeprom.FM_FrequencyPlaying; + gFM_Channels[gFM_ChannelPosition] = g_eeprom.fm_frequency_playing; gAskToSave = false; gRequestSaveFM = true; } @@ -471,10 +471,10 @@ static void FM_Key_MENU(bool bKeyPressed, bool bKeyHeld) { if (gAskToDelete) { - gFM_Channels[gEeprom.FM_SelectedChannel] = 0xFFFF; + gFM_Channels[g_eeprom.fm_selected_channel] = 0xFFFF; FM_ConfigureChannelState(); - BK1080_SetFrequency(gEeprom.FM_FrequencyPlaying); + BK1080_SetFrequency(g_eeprom.fm_frequency_playing); gRequestSaveFM = true; gAskToDelete = false; @@ -494,7 +494,7 @@ static void FM_Key_MENU(bool bKeyPressed, bool bKeyHeld) if (gAskToSave) { - gFM_Channels[gFM_ChannelPosition] = gEeprom.FM_FrequencyPlaying; + gFM_Channels[gFM_ChannelPosition] = g_eeprom.fm_frequency_playing; gAskToSave = false; gRequestSaveFM = true; } @@ -539,42 +539,42 @@ static void FM_Key_UP_DOWN(bool bKeyPressed, bool bKeyHeld, int8_t Step) return; } - FM_Tune(gEeprom.FM_FrequencyPlaying, Step, false); + FM_Tune(g_eeprom.fm_frequency_playing, Step, false); gRequestDisplayScreen = DISPLAY_FM; return; } - if (gEeprom.FM_IsMrMode) + if (g_eeprom.fm_is_channel_mode) { - const uint8_t Channel = FM_FindNextChannel(gEeprom.FM_SelectedChannel + Step, Step); - if (Channel == 0xFF || gEeprom.FM_SelectedChannel == Channel) + const uint8_t Channel = FM_FindNextChannel(g_eeprom.fm_selected_channel + Step, Step); + if (Channel == 0xFF || g_eeprom.fm_selected_channel == Channel) goto Bail; - gEeprom.FM_SelectedChannel = Channel; - gEeprom.FM_FrequencyPlaying = gFM_Channels[Channel]; + g_eeprom.fm_selected_channel = Channel; + g_eeprom.fm_frequency_playing = gFM_Channels[Channel]; } else { - uint16_t Frequency = gEeprom.FM_SelectedFrequency + Step; - if (Frequency < gEeprom.FM_LowerLimit) - Frequency = gEeprom.FM_UpperLimit; + uint16_t Frequency = g_eeprom.fm_selected_frequency + Step; + if (Frequency < g_eeprom.fm_lower_limit) + Frequency = g_eeprom.fm_upper_limit; else - if (Frequency > gEeprom.FM_UpperLimit) - Frequency = gEeprom.FM_LowerLimit; + if (Frequency > g_eeprom.fm_upper_limit) + Frequency = g_eeprom.fm_lower_limit; - gEeprom.FM_FrequencyPlaying = Frequency; - gEeprom.FM_SelectedFrequency = gEeprom.FM_FrequencyPlaying; + g_eeprom.fm_frequency_playing = Frequency; + g_eeprom.fm_selected_frequency = g_eeprom.fm_frequency_playing; } gRequestSaveFM = true; Bail: - BK1080_SetFrequency(gEeprom.FM_FrequencyPlaying); + BK1080_SetFrequency(g_eeprom.fm_frequency_playing); gRequestDisplayScreen = DISPLAY_FM; } -void FM_ProcessKeys(KEY_Code_t Key, bool bKeyPressed, bool bKeyHeld) +void FM_ProcessKeys(key_code_t Key, bool bKeyPressed, bool bKeyHeld) { switch (Key) { @@ -617,15 +617,15 @@ void FM_ProcessKeys(KEY_Code_t Key, bool bKeyPressed, bool bKeyHeld) void FM_Play(void) { - if (!FM_CheckFrequencyLock(gEeprom.FM_FrequencyPlaying, gEeprom.FM_LowerLimit)) + if (!FM_CheckFrequencyLock(g_eeprom.fm_frequency_playing, g_eeprom.fm_lower_limit)) { if (!gFM_AutoScan) { gFmPlayCountdown_10ms = 0; gFM_FoundFrequency = true; - if (!gEeprom.FM_IsMrMode) - gEeprom.FM_SelectedFrequency = gEeprom.FM_FrequencyPlaying; + if (!g_eeprom.fm_is_channel_mode) + g_eeprom.fm_selected_frequency = g_eeprom.fm_frequency_playing; GPIO_SetBit(&GPIOC->DATA, GPIOC_PIN_AUDIO_PATH); gEnableSpeaker = true; @@ -635,7 +635,7 @@ void FM_Play(void) } if (gFM_ChannelPosition < 20) - gFM_Channels[gFM_ChannelPosition++] = gEeprom.FM_FrequencyPlaying; + gFM_Channels[gFM_ChannelPosition++] = g_eeprom.fm_frequency_playing; if (gFM_ChannelPosition >= 20) { @@ -645,10 +645,10 @@ void FM_Play(void) } } - if (gFM_AutoScan && gEeprom.FM_FrequencyPlaying >= gEeprom.FM_UpperLimit) + if (gFM_AutoScan && g_eeprom.fm_frequency_playing >= g_eeprom.fm_upper_limit) FM_PlayAndUpdate(); else - FM_Tune(gEeprom.FM_FrequencyPlaying, gFM_ScanState, false); + FM_Tune(g_eeprom.fm_frequency_playing, gFM_ScanState, false); GUI_SelectNextDisplay(DISPLAY_FM); } @@ -659,7 +659,7 @@ void FM_Start(void) gFM_ScanState = FM_SCAN_OFF; gFM_RestoreCountdown_10ms = 0; - BK1080_Init(gEeprom.FM_FrequencyPlaying, true); + BK1080_Init(g_eeprom.fm_frequency_playing, true); GPIO_SetBit(&GPIOC->DATA, GPIOC_PIN_AUDIO_PATH); diff --git a/app/fm.h b/app/fm.h index 012119a..41947dc 100644 --- a/app/fm.h +++ b/app/fm.h @@ -52,7 +52,7 @@ void FM_Tune(uint16_t Frequency, int8_t Step, bool bFlag); void FM_PlayAndUpdate(void); int FM_CheckFrequencyLock(uint16_t Frequency, uint16_t LowerLimit); -void FM_ProcessKeys(KEY_Code_t Key, bool bKeyPressed, bool bKeyHeld); +void FM_ProcessKeys(key_code_t Key, bool bKeyPressed, bool bKeyHeld); void FM_Play(void); void FM_Start(void); diff --git a/app/generic.c b/app/generic.c index 54a43e4..25c223c 100644 --- a/app/generic.c +++ b/app/generic.c @@ -61,10 +61,10 @@ void GENERIC_Key_F(bool bKeyPressed, bool bKeyHeld) { // toggle the keyboad lock #ifdef ENABLE_VOICE - gAnotherVoiceID = gEeprom.KEY_LOCK ? VOICE_ID_UNLOCK : VOICE_ID_LOCK; + g_another_voice_id = g_eeprom.key_lock ? VOICE_ID_UNLOCK : VOICE_ID_LOCK; #endif - gEeprom.KEY_LOCK = !gEeprom.KEY_LOCK; + g_eeprom.key_lock = !g_eeprom.key_lock; gRequestSaveSettings = true; } @@ -79,14 +79,14 @@ void GENERIC_Key_F(bool bKeyPressed, bool bKeyHeld) return; #endif - gWasFKeyPressed = !gWasFKeyPressed; + g_was_f_key_pressed = !g_was_f_key_pressed; - if (gWasFKeyPressed) + if (g_was_f_key_pressed) gKeyInputCountdown = key_input_timeout_500ms; #ifdef ENABLE_VOICE - if (!gWasFKeyPressed) - gAnotherVoiceID = VOICE_ID_CANCEL; + if (!g_was_f_key_pressed) + g_another_voice_id = VOICE_ID_CANCEL; #endif gUpdateStatus = true; @@ -132,10 +132,10 @@ void GENERIC_Key_PTT(bool bKeyPressed) { APP_EndTransmission(); - if (gEeprom.REPEATER_TAIL_TONE_ELIMINATION == 0) + if (g_eeprom.repeater_tail_tone_elimination == 0) FUNCTION_Select(FUNCTION_FOREGROUND); else - gRTTECountdown = gEeprom.REPEATER_TAIL_TONE_ELIMINATION * 10; + gRTTECountdown = g_eeprom.repeater_tail_tone_elimination * 10; } gFlagEndTransmission = false; @@ -162,7 +162,7 @@ void GENERIC_Key_PTT(bool bKeyPressed) if (gScreenToDisplay == DISPLAY_SCANNER) { // CTCSS/CDCSS scanning .. stop - gEeprom.CROSS_BAND_RX_TX = gBackup_CROSS_BAND_RX_TX; + g_eeprom.cross_vfo_rx_tx = gBackup_cross_vfo_rx_tx; gFlagStopScan = true; gVfoConfigureMode = VFO_CONFIGURE_RELOAD; gFlagResetVfos = true; @@ -178,7 +178,7 @@ void GENERIC_Key_PTT(bool bKeyPressed) MENU_StopCssScan(); #ifdef ENABLE_VOICE - gAnotherVoiceID = VOICE_ID_SCANNING_STOP; + g_another_voice_id = VOICE_ID_SCANNING_STOP; #endif } @@ -190,7 +190,7 @@ void GENERIC_Key_PTT(bool bKeyPressed) { // FM radio is scanning .. stop FM_PlayAndUpdate(); #ifdef ENABLE_VOICE - gAnotherVoiceID = VOICE_ID_SCANNING_STOP; + g_another_voice_id = VOICE_ID_SCANNING_STOP; #endif gRequestDisplayScreen = DISPLAY_FM; goto cancel_tx; @@ -235,7 +235,7 @@ void GENERIC_Key_PTT(bool bKeyPressed) #else // append our DTMF ID to the inputted DTMF code - // IF the user inputted code is exactly 3 digits long and D-DCD is enabled - if (gDTMF_InputBox_Index == 3 && gTxVfo->DTMF_DECODING_ENABLE > 0) + if (gDTMF_InputBox_Index == 3 && gTxVfo->DTMF_decoding_enable > 0) gDTMF_CallMode = DTMF_CheckGroupCall(gDTMF_InputBox, 3); else gDTMF_CallMode = DTMF_CALL_MODE_DTMF; diff --git a/app/main.c b/app/main.c index 6040439..75b380e 100644 --- a/app/main.c +++ b/app/main.c @@ -41,34 +41,34 @@ void toggle_chan_scanlist(void) { // toggle the selected channels scanlist setting - if (gScreenToDisplay == DISPLAY_SCANNER || !IS_MR_CHANNEL(gTxVfo->CHANNEL_SAVE)) + if (gScreenToDisplay == DISPLAY_SCANNER || !IS_USER_CHANNEL(gTxVfo->channel_save)) return; - if (gTxVfo->SCANLIST1_PARTICIPATION) + if (gTxVfo->scanlist_1_participation) { - if (gTxVfo->SCANLIST2_PARTICIPATION) - gTxVfo->SCANLIST1_PARTICIPATION = 0; + if (gTxVfo->scanlist_2_participation) + gTxVfo->scanlist_1_participation = 0; else - gTxVfo->SCANLIST2_PARTICIPATION = 1; + gTxVfo->scanlist_2_participation = 1; } else { - if (gTxVfo->SCANLIST2_PARTICIPATION) - gTxVfo->SCANLIST2_PARTICIPATION = 0; + if (gTxVfo->scanlist_2_participation) + gTxVfo->scanlist_2_participation = 0; else - gTxVfo->SCANLIST1_PARTICIPATION = 1; + gTxVfo->scanlist_1_participation = 1; } - SETTINGS_UpdateChannel(gTxVfo->CHANNEL_SAVE, gTxVfo, true); + SETTINGS_UpdateChannel(gTxVfo->channel_save, gTxVfo, true); gVfoConfigureMode = VFO_CONFIGURE; gFlagResetVfos = true; } -static void processFKeyFunction(const KEY_Code_t Key, const bool beep) +static void processFKeyFunction(const key_code_t Key, const bool beep) { uint8_t Band; - uint8_t Vfo = gEeprom.TX_VFO; + uint8_t Vfo = g_eeprom.tx_vfo; if (gScreenToDisplay == DISPLAY_MENU) { @@ -95,15 +95,15 @@ static void processFKeyFunction(const KEY_Code_t Key, const bool beep) break; case KEY_1: - if (!IS_FREQ_CHANNEL(gTxVfo->CHANNEL_SAVE)) + if (!IS_FREQ_CHANNEL(gTxVfo->channel_save)) { - gWasFKeyPressed = false; + g_was_f_key_pressed = false; gUpdateStatus = true; gBeepToPlay = BEEP_1KHZ_60MS_OPTIONAL; return; } - Band = gTxVfo->Band + 1; + Band = gTxVfo->band + 1; if (gSetting_350EN || Band != BAND5_350MHz) { if (Band > BAND7_470MHz) @@ -111,10 +111,10 @@ static void processFKeyFunction(const KEY_Code_t Key, const bool beep) } else Band = BAND6_400MHz; - gTxVfo->Band = Band; + gTxVfo->band = Band; - gEeprom.ScreenChannel[Vfo] = FREQ_CHANNEL_FIRST + Band; - gEeprom.FreqChannel[Vfo] = FREQ_CHANNEL_FIRST + Band; + g_eeprom.screen_channel[Vfo] = FREQ_CHANNEL_FIRST + Band; + g_eeprom.freq_channel[Vfo] = FREQ_CHANNEL_FIRST + Band; gRequestSaveVFO = true; gVfoConfigureMode = VFO_CONFIGURE_RELOAD; @@ -127,19 +127,19 @@ static void processFKeyFunction(const KEY_Code_t Key, const bool beep) break; case KEY_2: - if (gEeprom.CROSS_BAND_RX_TX == CROSS_BAND_CHAN_A) - gEeprom.CROSS_BAND_RX_TX = CROSS_BAND_CHAN_B; + if (g_eeprom.cross_vfo_rx_tx == CROSS_BAND_CHAN_A) + g_eeprom.cross_vfo_rx_tx = CROSS_BAND_CHAN_B; else - if (gEeprom.CROSS_BAND_RX_TX == CROSS_BAND_CHAN_B) - gEeprom.CROSS_BAND_RX_TX = CROSS_BAND_CHAN_A; + if (g_eeprom.cross_vfo_rx_tx == CROSS_BAND_CHAN_B) + g_eeprom.cross_vfo_rx_tx = CROSS_BAND_CHAN_A; else - if (gEeprom.DUAL_WATCH == DUAL_WATCH_CHAN_A) - gEeprom.DUAL_WATCH = DUAL_WATCH_CHAN_B; + if (g_eeprom.dual_watch == DUAL_WATCH_CHAN_A) + g_eeprom.dual_watch = DUAL_WATCH_CHAN_B; else - if (gEeprom.DUAL_WATCH == DUAL_WATCH_CHAN_B) - gEeprom.DUAL_WATCH = DUAL_WATCH_CHAN_A; + if (g_eeprom.dual_watch == DUAL_WATCH_CHAN_B) + g_eeprom.dual_watch = DUAL_WATCH_CHAN_A; else - gEeprom.TX_VFO = (Vfo + 1) & 1u; + g_eeprom.tx_vfo = (Vfo + 1) & 1u; gRequestSaveSettings = 1; gFlagReconfigureVfos = true; @@ -153,32 +153,32 @@ static void processFKeyFunction(const KEY_Code_t Key, const bool beep) case KEY_3: #ifdef ENABLE_NOAA - if (gEeprom.VFO_OPEN && IS_NOT_NOAA_CHANNEL(gTxVfo->CHANNEL_SAVE)) + if (g_eeprom.vfo_open && IS_NOT_NOAA_CHANNEL(gTxVfo->channel_save)) #else - if (gEeprom.VFO_OPEN) + if (g_eeprom.vfo_open) #endif { uint8_t Channel; - if (IS_MR_CHANNEL(gTxVfo->CHANNEL_SAVE)) + if (IS_USER_CHANNEL(gTxVfo->channel_save)) { // swap to frequency mode - gEeprom.ScreenChannel[Vfo] = gEeprom.FreqChannel[gEeprom.TX_VFO]; + g_eeprom.screen_channel[Vfo] = g_eeprom.freq_channel[g_eeprom.tx_vfo]; #ifdef ENABLE_VOICE - gAnotherVoiceID = VOICE_ID_FREQUENCY_MODE; + g_another_voice_id = VOICE_ID_FREQUENCY_MODE; #endif gRequestSaveVFO = true; gVfoConfigureMode = VFO_CONFIGURE_RELOAD; break; } - Channel = RADIO_FindNextChannel(gEeprom.MrChannel[gEeprom.TX_VFO], 1, false, 0); + Channel = RADIO_FindNextChannel(g_eeprom.user_channel[g_eeprom.tx_vfo], 1, false, 0); if (Channel != 0xFF) { // swap to channel mode - gEeprom.ScreenChannel[Vfo] = Channel; + g_eeprom.screen_channel[Vfo] = Channel; #ifdef ENABLE_VOICE AUDIO_SetVoiceID(0, VOICE_ID_CHANNEL_MODE); AUDIO_SetDigitVoice(1, Channel + 1); - gAnotherVoiceID = (VOICE_ID_t)0xFE; + g_another_voice_id = (voice_id_t)0xFE; #endif gRequestSaveVFO = true; gVfoConfigureMode = VFO_CONFIGURE_RELOAD; @@ -192,11 +192,11 @@ static void processFKeyFunction(const KEY_Code_t Key, const bool beep) break; case KEY_4: - gWasFKeyPressed = false; + g_was_f_key_pressed = false; gFlagStartScan = true; gScanSingleFrequency = false; - gBackup_CROSS_BAND_RX_TX = gEeprom.CROSS_BAND_RX_TX; - gEeprom.CROSS_BAND_RX_TX = CROSS_BAND_OFF; + gBackup_cross_vfo_rx_tx = g_eeprom.cross_vfo_rx_tx; + g_eeprom.cross_vfo_rx_tx = CROSS_BAND_OFF; gUpdateStatus = true; // if (beep) @@ -207,15 +207,15 @@ static void processFKeyFunction(const KEY_Code_t Key, const bool beep) case KEY_5: #ifdef ENABLE_NOAA - if (IS_NOT_NOAA_CHANNEL(gTxVfo->CHANNEL_SAVE)) + if (IS_NOT_NOAA_CHANNEL(gTxVfo->channel_save)) { - gEeprom.ScreenChannel[Vfo] = gEeprom.NoaaChannel[gEeprom.TX_VFO]; + g_eeprom.screen_channel[Vfo] = g_eeprom.noaa_channel[g_eeprom.tx_vfo]; } else { - gEeprom.ScreenChannel[Vfo] = gEeprom.FreqChannel[gEeprom.TX_VFO]; + g_eeprom.screen_channel[Vfo] = g_eeprom.freq_channel[g_eeprom.tx_vfo]; #ifdef ENABLE_VOICE - gAnotherVoiceID = VOICE_ID_FREQUENCY_MODE; + g_another_voice_id = VOICE_ID_FREQUENCY_MODE; #endif } gRequestSaveVFO = true; @@ -242,19 +242,19 @@ static void processFKeyFunction(const KEY_Code_t Key, const bool beep) break; case KEY_8: - gTxVfo->FrequencyReverse = gTxVfo->FrequencyReverse == false; + gTxVfo->frequency_reverse = gTxVfo->frequency_reverse == false; gRequestSaveChannel = 1; break; case KEY_9: - if (RADIO_CheckValidChannel(gEeprom.CHAN_1_CALL, false, 0)) + if (RADIO_CheckValidChannel(g_eeprom.chan_1_call, false, 0)) { - gEeprom.MrChannel[Vfo] = gEeprom.CHAN_1_CALL; - gEeprom.ScreenChannel[Vfo] = gEeprom.CHAN_1_CALL; + g_eeprom.user_channel[Vfo] = g_eeprom.chan_1_call; + g_eeprom.screen_channel[Vfo] = g_eeprom.chan_1_call; #ifdef ENABLE_VOICE AUDIO_SetVoiceID(0, VOICE_ID_CHANNEL_MODE); - AUDIO_SetDigitVoice(1, gEeprom.CHAN_1_CALL + 1); - gAnotherVoiceID = (VOICE_ID_t)0xFE; + AUDIO_SetDigitVoice(1, g_eeprom.chan_1_call + 1); + g_another_voice_id = (voice_id_t)0xFE; #endif gRequestSaveVFO = true; gVfoConfigureMode = VFO_CONFIGURE_RELOAD; @@ -267,7 +267,7 @@ static void processFKeyFunction(const KEY_Code_t Key, const bool beep) default: gUpdateStatus = true; - gWasFKeyPressed = false; + g_was_f_key_pressed = false; if (beep) gBeepToPlay = BEEP_1KHZ_60MS_OPTIONAL; @@ -275,7 +275,7 @@ static void processFKeyFunction(const KEY_Code_t Key, const bool beep) } } -static void MAIN_Key_DIGITS(KEY_Code_t Key, bool bKeyPressed, bool bKeyHeld) +static void MAIN_Key_DIGITS(key_code_t Key, bool bKeyPressed, bool bKeyHeld) { if (bKeyHeld) { // key held down @@ -290,7 +290,7 @@ static void MAIN_Key_DIGITS(KEY_Code_t Key, bool bKeyPressed, bool bKeyHeld) gRequestDisplayScreen = DISPLAY_MAIN; } - gWasFKeyPressed = false; + g_was_f_key_pressed = false; gUpdateStatus = true; processFKeyFunction(Key, false); @@ -306,10 +306,10 @@ static void MAIN_Key_DIGITS(KEY_Code_t Key, bool bKeyPressed, bool bKeyHeld) return; // don't use the key till it's released } - if (!gWasFKeyPressed) + if (!g_was_f_key_pressed) { // F-key wasn't pressed - const uint8_t Vfo = gEeprom.TX_VFO; + const uint8_t Vfo = g_eeprom.tx_vfo; gKeyInputCountdown = key_input_timeout_500ms; @@ -317,7 +317,7 @@ static void MAIN_Key_DIGITS(KEY_Code_t Key, bool bKeyPressed, bool bKeyHeld) gRequestDisplayScreen = DISPLAY_MAIN; - if (IS_MR_CHANNEL(gTxVfo->CHANNEL_SAVE)) + if (IS_USER_CHANNEL(gTxVfo->channel_save)) { // user is entering channel number uint16_t Channel; @@ -325,7 +325,7 @@ static void MAIN_Key_DIGITS(KEY_Code_t Key, bool bKeyPressed, bool bKeyHeld) if (gInputBoxIndex != 3) { #ifdef ENABLE_VOICE - gAnotherVoiceID = (VOICE_ID_t)Key; + g_another_voice_id = (voice_id_t)Key; #endif gRequestDisplayScreen = DISPLAY_MAIN; return; @@ -342,11 +342,11 @@ static void MAIN_Key_DIGITS(KEY_Code_t Key, bool bKeyPressed, bool bKeyHeld) } #ifdef ENABLE_VOICE - gAnotherVoiceID = (VOICE_ID_t)Key; + g_another_voice_id = (voice_id_t)Key; #endif - gEeprom.MrChannel[Vfo] = (uint8_t)Channel; - gEeprom.ScreenChannel[Vfo] = (uint8_t)Channel; + g_eeprom.user_channel[Vfo] = (uint8_t)Channel; + g_eeprom.screen_channel[Vfo] = (uint8_t)Channel; gRequestSaveVFO = true; gVfoConfigureMode = VFO_CONFIGURE_RELOAD; @@ -354,9 +354,9 @@ static void MAIN_Key_DIGITS(KEY_Code_t Key, bool bKeyPressed, bool bKeyHeld) } // #ifdef ENABLE_NOAA -// if (IS_NOT_NOAA_CHANNEL(gTxVfo->CHANNEL_SAVE)) +// if (IS_NOT_NOAA_CHANNEL(gTxVfo->channel_save)) // #endif - if (IS_FREQ_CHANNEL(gTxVfo->CHANNEL_SAVE)) + if (IS_FREQ_CHANNEL(gTxVfo->channel_save)) { // user is entering a frequency uint32_t Frequency; @@ -364,7 +364,7 @@ static void MAIN_Key_DIGITS(KEY_Code_t Key, bool bKeyPressed, bool bKeyHeld) if (gInputBoxIndex < 6) { #ifdef ENABLE_VOICE - gAnotherVoiceID = (VOICE_ID_t)Key; + g_another_voice_id = (voice_id_t)Key; #endif return; @@ -395,14 +395,14 @@ static void MAIN_Key_DIGITS(KEY_Code_t Key, bool bKeyPressed, bool bKeyHeld) const FREQUENCY_Band_t band = FREQUENCY_GetBand(Frequency); #ifdef ENABLE_VOICE - gAnotherVoiceID = (VOICE_ID_t)Key; + g_another_voice_id = (voice_id_t)Key; #endif - if (gTxVfo->Band != band) + if (gTxVfo->band != band) { - gTxVfo->Band = band; - gEeprom.ScreenChannel[Vfo] = band + FREQ_CHANNEL_FIRST; - gEeprom.FreqChannel[Vfo] = band + FREQ_CHANNEL_FIRST; + gTxVfo->band = band; + g_eeprom.screen_channel[Vfo] = band + FREQ_CHANNEL_FIRST; + g_eeprom.freq_channel[Vfo] = band + FREQ_CHANNEL_FIRST; SETTINGS_SaveVfoIndices(); @@ -410,17 +410,17 @@ static void MAIN_Key_DIGITS(KEY_Code_t Key, bool bKeyPressed, bool bKeyHeld) } // Frequency += 75; // is this meant to be rounding ? - Frequency += gTxVfo->StepFrequency / 2; // no idea, but this is + Frequency += gTxVfo->step_freq / 2; // no idea, but this is - Frequency = FREQUENCY_FloorToStep(Frequency, gTxVfo->StepFrequency, frequencyBandTable[gTxVfo->Band].lower); + Frequency = FREQUENCY_FloorToStep(Frequency, gTxVfo->step_freq, frequencyBandTable[gTxVfo->band].lower); if (Frequency >= BX4819_band1.upper && Frequency < BX4819_band2.lower) { // clamp the frequency to the limit const uint32_t center = (BX4819_band1.upper + BX4819_band2.lower) / 2; - Frequency = (Frequency < center) ? BX4819_band1.upper - gTxVfo->StepFrequency : BX4819_band2.lower; + Frequency = (Frequency < center) ? BX4819_band1.upper - gTxVfo->step_freq : BX4819_band2.lower; } - gTxVfo->freq_config_RX.Frequency = Frequency; + gTxVfo->freq_config_rx.frequency = Frequency; gRequestSaveChannel = 1; return; @@ -429,7 +429,7 @@ static void MAIN_Key_DIGITS(KEY_Code_t Key, bool bKeyPressed, bool bKeyHeld) } #ifdef ENABLE_NOAA else - if (IS_NOAA_CHANNEL(gTxVfo->CHANNEL_SAVE)) + if (IS_NOAA_CHANNEL(gTxVfo->channel_save)) { // user is entering NOAA channel uint8_t Channel; @@ -437,7 +437,7 @@ static void MAIN_Key_DIGITS(KEY_Code_t Key, bool bKeyPressed, bool bKeyHeld) if (gInputBoxIndex != 2) { #ifdef ENABLE_VOICE - gAnotherVoiceID = (VOICE_ID_t)Key; + g_another_voice_id = (voice_id_t)Key; #endif gRequestDisplayScreen = DISPLAY_MAIN; return; @@ -450,10 +450,10 @@ static void MAIN_Key_DIGITS(KEY_Code_t Key, bool bKeyPressed, bool bKeyHeld) { Channel += NOAA_CHANNEL_FIRST; #ifdef ENABLE_VOICE - gAnotherVoiceID = (VOICE_ID_t)Key; + g_another_voice_id = (voice_id_t)Key; #endif - gEeprom.NoaaChannel[Vfo] = Channel; - gEeprom.ScreenChannel[Vfo] = Channel; + g_eeprom.noaa_channel[Vfo] = Channel; + g_eeprom.screen_channel[Vfo] = Channel; gRequestSaveVFO = true; gVfoConfigureMode = VFO_CONFIGURE_RELOAD; return; @@ -466,7 +466,7 @@ static void MAIN_Key_DIGITS(KEY_Code_t Key, bool bKeyPressed, bool bKeyHeld) return; } - gWasFKeyPressed = false; + g_was_f_key_pressed = false; gUpdateStatus = true; processFKeyFunction(Key, true); @@ -500,7 +500,7 @@ static void MAIN_Key_EXIT(bool bKeyPressed, bool bKeyHeld) #ifdef ENABLE_VOICE if (gInputBoxIndex == 0) - gAnotherVoiceID = VOICE_ID_CANCEL; + g_another_voice_id = VOICE_ID_CANCEL; #endif } else @@ -508,7 +508,7 @@ static void MAIN_Key_EXIT(bool bKeyPressed, bool bKeyHeld) SCANNER_Stop(); #ifdef ENABLE_VOICE - gAnotherVoiceID = VOICE_ID_SCANNING_STOP; + g_another_voice_id = VOICE_ID_SCANNING_STOP; #endif } @@ -550,7 +550,7 @@ static void MAIN_Key_MENU(const bool bKeyPressed, const bool bKeyHeld) if (bKeyPressed) { // long press MENU key - gWasFKeyPressed = false; + g_was_f_key_pressed = false; if (gScreenToDisplay == DISPLAY_MAIN) { @@ -560,12 +560,12 @@ static void MAIN_Key_MENU(const bool bKeyPressed, const bool bKeyHeld) gRequestDisplayScreen = DISPLAY_MAIN; } - gWasFKeyPressed = false; + g_was_f_key_pressed = false; gUpdateStatus = true; #ifdef ENABLE_COPY_CHAN_TO_VFO - if (gEeprom.VFO_OPEN && gCssScanMode == CSS_SCAN_MODE_OFF) + if (g_eeprom.vfo_open && gCssScanMode == CSS_SCAN_MODE_OFF) { if (gScanStateDir != SCAN_OFF) @@ -580,21 +580,21 @@ static void MAIN_Key_MENU(const bool bKeyPressed, const bool bKeyHeld) const unsigned int vfo = get_rx_VFO(); - if (IS_MR_CHANNEL(gEeprom.ScreenChannel[vfo])) + if (IS_USER_CHANNEL(g_eeprom.screen_channel[vfo])) { // copy channel to VFO, then swap to the VFO - const unsigned int channel = FREQ_CHANNEL_FIRST + gEeprom.VfoInfo[vfo].Band; + const unsigned int channel = FREQ_CHANNEL_FIRST + g_eeprom.VfoInfo[vfo].band; - gEeprom.ScreenChannel[vfo] = channel; - gEeprom.VfoInfo[vfo].CHANNEL_SAVE = channel; - gEeprom.TX_VFO = vfo; + g_eeprom.screen_channel[vfo] = channel; + g_eeprom.VfoInfo[vfo].channel_save = channel; + g_eeprom.tx_vfo = vfo; RADIO_SelectVfos(); RADIO_ApplyOffset(gRxVfo); RADIO_ConfigureSquelchAndOutputPower(gRxVfo); RADIO_SetupRegisters(true); - //SETTINGS_SaveChannel(channel, gEeprom.RX_VFO, gRxVfo, 1); + //SETTINGS_SaveChannel(channel, g_eeprom.rx_vfo, gRxVfo, 1); gBeepToPlay = BEEP_1KHZ_60MS_OPTIONAL; @@ -624,7 +624,7 @@ static void MAIN_Key_MENU(const bool bKeyPressed, const bool bKeyHeld) gFlagRefreshSetting = true; gRequestDisplayScreen = DISPLAY_MENU; #ifdef ENABLE_VOICE - gAnotherVoiceID = VOICE_ID_MENU; + g_another_voice_id = VOICE_ID_MENU; #endif } else @@ -646,7 +646,7 @@ static void MAIN_Key_STAR(bool bKeyPressed, bool bKeyHeld) return; } - if (bKeyHeld && !gWasFKeyPressed) + if (bKeyHeld && !g_was_f_key_pressed) { // long press .. toggle scanning if (!bKeyPressed) return; // released @@ -666,11 +666,11 @@ static void MAIN_Key_STAR(bool bKeyPressed, bool bKeyHeld) // just released - if (!gWasFKeyPressed) + if (!g_was_f_key_pressed) { // pressed without the F-key #ifdef ENABLE_NOAA - if (gScanStateDir == SCAN_OFF && IS_NOT_NOAA_CHANNEL(gTxVfo->CHANNEL_SAVE)) + if (gScanStateDir == SCAN_OFF && IS_NOT_NOAA_CHANNEL(gTxVfo->channel_save)) #else if (gScanStateDir == SCAN_OFF) #endif @@ -687,10 +687,10 @@ static void MAIN_Key_STAR(bool bKeyPressed, bool bKeyHeld) } else { // with the F-key - gWasFKeyPressed = false; + g_was_f_key_pressed = false; #ifdef ENABLE_NOAA - if (IS_NOAA_CHANNEL(gTxVfo->CHANNEL_SAVE)) + if (IS_NOAA_CHANNEL(gTxVfo->channel_save)) { gBeepToPlay = BEEP_500HZ_60MS_DOUBLE_BEEP_OPTIONAL; return; @@ -700,8 +700,8 @@ static void MAIN_Key_STAR(bool bKeyPressed, bool bKeyHeld) // scan the CTCSS/DCS code gFlagStartScan = true; gScanSingleFrequency = true; - gBackup_CROSS_BAND_RX_TX = gEeprom.CROSS_BAND_RX_TX; - gEeprom.CROSS_BAND_RX_TX = CROSS_BAND_OFF; + gBackup_cross_vfo_rx_tx = g_eeprom.cross_vfo_rx_tx; + g_eeprom.cross_vfo_rx_tx = CROSS_BAND_OFF; } gPttWasReleased = true; @@ -711,7 +711,7 @@ static void MAIN_Key_STAR(bool bKeyPressed, bool bKeyHeld) static void MAIN_Key_UP_DOWN(bool bKeyPressed, bool bKeyHeld, int8_t Direction) { - uint8_t Channel = gEeprom.ScreenChannel[gEeprom.TX_VFO]; + uint8_t Channel = g_eeprom.screen_channel[g_eeprom.tx_vfo]; if (bKeyHeld || !bKeyPressed) { // long press @@ -728,8 +728,8 @@ static void MAIN_Key_UP_DOWN(bool bKeyPressed, bool bKeyHeld, int8_t Direction) return; #ifdef ENABLE_VOICE - AUDIO_SetDigitVoice(0, gTxVfo->CHANNEL_SAVE + 1); - gAnotherVoiceID = (VOICE_ID_t)0xFE; + AUDIO_SetDigitVoice(0, gTxVfo->channel_save + 1); + g_another_voice_id = (voice_id_t)0xFE; #endif return; @@ -764,7 +764,7 @@ static void MAIN_Key_UP_DOWN(bool bKeyPressed, bool bKeyHeld, int8_t Direction) return; } - gTxVfo->freq_config_RX.Frequency = frequency; + gTxVfo->freq_config_rx.frequency = frequency; gRequestSaveChannel = 1; return; @@ -777,23 +777,23 @@ static void MAIN_Key_UP_DOWN(bool bKeyPressed, bool bKeyHeld, int8_t Direction) if (Channel == Next) return; - gEeprom.MrChannel[gEeprom.TX_VFO] = Next; - gEeprom.ScreenChannel[gEeprom.TX_VFO] = Next; + g_eeprom.user_channel[g_eeprom.tx_vfo] = Next; + g_eeprom.screen_channel[g_eeprom.tx_vfo] = Next; if (!bKeyHeld) { #ifdef ENABLE_VOICE AUDIO_SetDigitVoice(0, Next + 1); - gAnotherVoiceID = (VOICE_ID_t)0xFE; + g_another_voice_id = (voice_id_t)0xFE; #endif } } #ifdef ENABLE_NOAA else { - Channel = NOAA_CHANNEL_FIRST + NUMBER_AddWithWraparound(gEeprom.ScreenChannel[gEeprom.TX_VFO] - NOAA_CHANNEL_FIRST, Direction, 0, 9); - gEeprom.NoaaChannel[gEeprom.TX_VFO] = Channel; - gEeprom.ScreenChannel[gEeprom.TX_VFO] = Channel; + Channel = NOAA_CHANNEL_FIRST + NUMBER_AddWithWraparound(g_eeprom.screen_channel[g_eeprom.tx_vfo] - NOAA_CHANNEL_FIRST, Direction, 0, 9); + g_eeprom.noaa_channel[g_eeprom.tx_vfo] = Channel; + g_eeprom.screen_channel[g_eeprom.tx_vfo] = Channel; } #endif @@ -810,7 +810,7 @@ static void MAIN_Key_UP_DOWN(bool bKeyPressed, bool bKeyHeld, int8_t Direction) gPttWasReleased = true; } -void MAIN_ProcessKeys(KEY_Code_t Key, bool bKeyPressed, bool bKeyHeld) +void MAIN_ProcessKeys(key_code_t Key, bool bKeyPressed, bool bKeyHeld) { #ifdef ENABLE_FMRADIO if (gFmRadioMode && Key != KEY_PTT && Key != KEY_EXIT) diff --git a/app/main.h b/app/main.h index f679aac..b2efa69 100644 --- a/app/main.h +++ b/app/main.h @@ -19,7 +19,7 @@ #include "driver/keyboard.h" -void MAIN_ProcessKeys(KEY_Code_t Key, bool bKeyPressed, bool bKeyHeld); +void MAIN_ProcessKeys(key_code_t Key, bool bKeyPressed, bool bKeyHeld); #endif diff --git a/app/menu.c b/app/menu.c index 545c696..a358973 100644 --- a/app/menu.c +++ b/app/menu.c @@ -59,11 +59,11 @@ int16_t BK4819_XtalFreqLow; uint16_t EEPROM_1F8A; uint16_t EEPROM_1F8C; - uint8_t VOLUME_GAIN; - uint8_t DAC_GAIN; + uint8_t volume_gain; + uint8_t dac_gain; } __attribute__((packed)) misc; - gEeprom.BK4819_XTAL_FREQ_LOW = value; + g_eeprom.BK4819_xtal_freq_low = value; // radio 1 .. 04 00 46 00 50 00 2C 0E // radio 2 .. 05 00 46 00 50 00 2C 0E @@ -114,7 +114,7 @@ int MENU_GetLimits(uint8_t Cursor, int32_t *pMin, int32_t *pMax) case MENU_ABR: *pMin = 0; - *pMax = ARRAY_SIZE(gSubMenu_BACKLIGHT) - 1; + *pMax = ARRAY_SIZE(gSubMenu_backlight) - 1; break; case MENU_F_LOCK: @@ -273,13 +273,13 @@ int MENU_GetLimits(uint8_t Cursor, int32_t *pMin, int32_t *pMax) case MENU_DEL_CH: case MENU_MEM_NAME: *pMin = 0; - *pMax = MR_CHANNEL_LAST; + *pMax = USER_CHANNEL_LAST; break; case MENU_SLIST1: case MENU_SLIST2: *pMin = -1; - *pMax = MR_CHANNEL_LAST; + *pMax = USER_CHANNEL_LAST; break; case MENU_SAVE: @@ -352,7 +352,7 @@ void MENU_AcceptSetting(void) int32_t Min; int32_t Max; uint8_t Code; - FREQ_Config_t *pConfig = &gTxVfo->freq_config_RX; + FREQ_Config_t *pConfig = &gTxVfo->freq_config_rx; if (!MENU_GetLimits(gMenuCursor, &Min, &Max)) { @@ -367,13 +367,13 @@ void MENU_AcceptSetting(void) return; case MENU_SQL: - gEeprom.SQUELCH_LEVEL = gSubMenuSelection; + g_eeprom.squelch_level = gSubMenuSelection; gVfoConfigureMode = VFO_CONFIGURE; break; case MENU_STEP: - gTxVfo->STEP_SETTING = gSubMenuSelection; - if (IS_FREQ_CHANNEL(gTxVfo->CHANNEL_SAVE)) + gTxVfo->step_setting = gSubMenuSelection; + if (IS_FREQ_CHANNEL(gTxVfo->channel_save)) { gRequestSaveChannel = 1; return; @@ -381,39 +381,39 @@ void MENU_AcceptSetting(void) return; case MENU_TXP: - gTxVfo->OUTPUT_POWER = gSubMenuSelection; + gTxVfo->output_power = gSubMenuSelection; gRequestSaveChannel = 1; return; case MENU_T_DCS: - pConfig = &gTxVfo->freq_config_TX; + pConfig = &gTxVfo->freq_config_tx; // Fallthrough case MENU_R_DCS: if (gSubMenuSelection == 0) { - if (pConfig->CodeType != CODE_TYPE_DIGITAL && pConfig->CodeType != CODE_TYPE_REVERSE_DIGITAL) + if (pConfig->code_type != CODE_TYPE_DIGITAL && pConfig->code_type != CODE_TYPE_REVERSE_DIGITAL) { gRequestSaveChannel = 1; return; } - Code = 0; - pConfig->CodeType = CODE_TYPE_OFF; + Code = 0; + pConfig->code_type = CODE_TYPE_OFF; } else if (gSubMenuSelection < 105) { - pConfig->CodeType = CODE_TYPE_DIGITAL; - Code = gSubMenuSelection - 1; + pConfig->code_type = CODE_TYPE_DIGITAL; + Code = gSubMenuSelection - 1; } else { - pConfig->CodeType = CODE_TYPE_REVERSE_DIGITAL; - Code = gSubMenuSelection - 105; + pConfig->code_type = CODE_TYPE_REVERSE_DIGITAL; + Code = gSubMenuSelection - 105; } - pConfig->Code = Code; + pConfig->code = Code; gRequestSaveChannel = 1; return; @@ -421,26 +421,26 @@ void MENU_AcceptSetting(void) #pragma GCC diagnostic ignored "-Wimplicit-fallthrough=" case MENU_T_CTCS: - pConfig = &gTxVfo->freq_config_TX; + pConfig = &gTxVfo->freq_config_tx; case MENU_R_CTCS: if (gSubMenuSelection == 0) { - if (pConfig->CodeType != CODE_TYPE_CONTINUOUS_TONE) + if (pConfig->code_type != CODE_TYPE_CONTINUOUS_TONE) { gRequestSaveChannel = 1; return; } Code = 0; - pConfig->Code = Code; - pConfig->CodeType = CODE_TYPE_OFF; + pConfig->code = Code; + pConfig->code_type = CODE_TYPE_OFF; BK4819_ExitSubAu(); } else { - pConfig->CodeType = CODE_TYPE_CONTINUOUS_TONE; + pConfig->code_type = CODE_TYPE_CONTINUOUS_TONE; Code = gSubMenuSelection - 1; - pConfig->Code = Code; + pConfig->code = Code; BK4819_SetCTCSSFrequency(CTCSS_Options[Code]); } @@ -451,22 +451,22 @@ void MENU_AcceptSetting(void) #pragma GCC diagnostic pop case MENU_SFT_D: - gTxVfo->TX_OFFSET_FREQUENCY_DIRECTION = gSubMenuSelection; + gTxVfo->tx_offset_freq_dir = gSubMenuSelection; gRequestSaveChannel = 1; return; case MENU_OFFSET: - gTxVfo->TX_OFFSET_FREQUENCY = gSubMenuSelection; + gTxVfo->tx_offset_freq = gSubMenuSelection; gRequestSaveChannel = 1; return; case MENU_W_N: - gTxVfo->CHANNEL_BANDWIDTH = gSubMenuSelection; + gTxVfo->channel_bandwidth = gSubMenuSelection; gRequestSaveChannel = 1; return; case MENU_SCR: - gTxVfo->SCRAMBLING_TYPE = gSubMenuSelection; + gTxVfo->scrambling_type = gSubMenuSelection; #if 0 if (gSubMenuSelection > 0 && gSetting_ScrambleEnable) BK4819_EnableScramble(gSubMenuSelection - 1); @@ -477,16 +477,16 @@ void MENU_AcceptSetting(void) return; case MENU_BCL: - gTxVfo->BUSY_CHANNEL_LOCK = gSubMenuSelection; + gTxVfo->busy_channel_lock = gSubMenuSelection; gRequestSaveChannel = 1; return; case MENU_MEM_CH: - gTxVfo->CHANNEL_SAVE = gSubMenuSelection; + gTxVfo->channel_save = gSubMenuSelection; #if 0 - gEeprom.MrChannel[0] = gSubMenuSelection; + g_eeprom.user_channel[0] = gSubMenuSelection; #else - gEeprom.MrChannel[gEeprom.TX_VFO] = gSubMenuSelection; + g_eeprom.user_channel[g_eeprom.tx_vfo] = gSubMenuSelection; #endif gRequestSaveChannel = 2; gVfoConfigureMode = VFO_CONFIGURE_RELOAD; @@ -504,21 +504,21 @@ void MENU_AcceptSetting(void) } // save the channel name - memset(gTxVfo->Name, 0, sizeof(gTxVfo->Name)); - memmove(gTxVfo->Name, edit, 10); - SETTINGS_SaveChannel(gSubMenuSelection, gEeprom.TX_VFO, gTxVfo, 3); + memset(gTxVfo->name, 0, sizeof(gTxVfo->name)); + memmove(gTxVfo->name, edit, 10); + SETTINGS_SaveChannel(gSubMenuSelection, g_eeprom.tx_vfo, gTxVfo, 3); gFlagReconfigureVfos = true; return; case MENU_SAVE: - gEeprom.BATTERY_SAVE = gSubMenuSelection; + g_eeprom.battery_save = gSubMenuSelection; break; #ifdef ENABLE_VOX case MENU_VOX: - gEeprom.VOX_SWITCH = gSubMenuSelection != 0; - if (gEeprom.VOX_SWITCH) - gEeprom.VOX_LEVEL = gSubMenuSelection - 1; + g_eeprom.vox_switch = gSubMenuSelection != 0; + if (g_eeprom.vox_switch) + g_eeprom.vox_level = gSubMenuSelection - 1; BOARD_EEPROM_LoadMoreSettings(); gFlagReconfigureVfos = true; gUpdateStatus = true; @@ -526,7 +526,7 @@ void MENU_AcceptSetting(void) #endif case MENU_ABR: - gEeprom.BACKLIGHT = gSubMenuSelection; + g_eeprom.backlight = gSubMenuSelection; break; case MENU_ABR_ON_TX_RX: @@ -534,8 +534,8 @@ void MENU_AcceptSetting(void) break; case MENU_TDR: -// gEeprom.DUAL_WATCH = gSubMenuSelection; - gEeprom.DUAL_WATCH = (gSubMenuSelection > 0) ? 1 + gEeprom.TX_VFO : DUAL_WATCH_OFF; +// g_eeprom.dual_watch = gSubMenuSelection; + g_eeprom.dual_watch = (gSubMenuSelection > 0) ? 1 + g_eeprom.tx_vfo : DUAL_WATCH_OFF; gFlagReconfigureVfos = true; gUpdateStatus = true; @@ -543,69 +543,69 @@ void MENU_AcceptSetting(void) case MENU_XB: #ifdef ENABLE_NOAA - if (IS_NOAA_CHANNEL(gEeprom.ScreenChannel[0])) + if (IS_NOAA_CHANNEL(g_eeprom.screen_channel[0])) return; - if (IS_NOAA_CHANNEL(gEeprom.ScreenChannel[1])) + if (IS_NOAA_CHANNEL(g_eeprom.screen_channel[1])) return; #endif - gEeprom.CROSS_BAND_RX_TX = gSubMenuSelection; + g_eeprom.cross_vfo_rx_tx = gSubMenuSelection; gFlagReconfigureVfos = true; gUpdateStatus = true; break; case MENU_BEEP: - gEeprom.BEEP_CONTROL = gSubMenuSelection; + g_eeprom.beep_control = gSubMenuSelection; break; case MENU_TOT: - gEeprom.TX_TIMEOUT_TIMER = gSubMenuSelection; + g_eeprom.tx_timeout_timer = gSubMenuSelection; break; #ifdef ENABLE_VOICE case MENU_VOICE: - gEeprom.VOICE_PROMPT = gSubMenuSelection; + g_eeprom.voice_prompt = gSubMenuSelection; gUpdateStatus = true; break; #endif case MENU_SC_REV: - gEeprom.SCAN_RESUME_MODE = gSubMenuSelection; + g_eeprom.scan_resume_mode = gSubMenuSelection; break; case MENU_MDF: - gEeprom.CHANNEL_DISPLAY_MODE = gSubMenuSelection; + g_eeprom.channel_display_mode = gSubMenuSelection; break; case MENU_AUTOLK: - gEeprom.AUTO_KEYPAD_LOCK = gSubMenuSelection; + g_eeprom.auto_keypad_lock = gSubMenuSelection; gKeyLockCountdown = 30; break; case MENU_S_ADD1: - gTxVfo->SCANLIST1_PARTICIPATION = gSubMenuSelection; - SETTINGS_UpdateChannel(gTxVfo->CHANNEL_SAVE, gTxVfo, true); + gTxVfo->scanlist_1_participation = gSubMenuSelection; + SETTINGS_UpdateChannel(gTxVfo->channel_save, gTxVfo, true); gVfoConfigureMode = VFO_CONFIGURE; gFlagResetVfos = true; return; case MENU_S_ADD2: - gTxVfo->SCANLIST2_PARTICIPATION = gSubMenuSelection; - SETTINGS_UpdateChannel(gTxVfo->CHANNEL_SAVE, gTxVfo, true); + gTxVfo->scanlist_2_participation = gSubMenuSelection; + SETTINGS_UpdateChannel(gTxVfo->channel_save, gTxVfo, true); gVfoConfigureMode = VFO_CONFIGURE; gFlagResetVfos = true; return; case MENU_STE: - gEeprom.TAIL_NOTE_ELIMINATION = gSubMenuSelection; + g_eeprom.tail_note_elimination = gSubMenuSelection; break; case MENU_RP_STE: - gEeprom.REPEATER_TAIL_TONE_ELIMINATION = gSubMenuSelection; + g_eeprom.repeater_tail_tone_elimination = gSubMenuSelection; break; case MENU_MIC: - gEeprom.MIC_SENSITIVITY = gSubMenuSelection; + g_eeprom.mic_sensitivity = gSubMenuSelection; BOARD_EEPROM_LoadMoreSettings(); gFlagReconfigureVfos = true; break; @@ -617,45 +617,45 @@ void MENU_AcceptSetting(void) #endif case MENU_COMPAND: - gTxVfo->Compander = gSubMenuSelection; - SETTINGS_UpdateChannel(gTxVfo->CHANNEL_SAVE, gTxVfo, true); + gTxVfo->compander = gSubMenuSelection; + SETTINGS_UpdateChannel(gTxVfo->channel_save, gTxVfo, true); gVfoConfigureMode = VFO_CONFIGURE; gFlagResetVfos = true; // gRequestSaveChannel = 1; return; case MENU_1_CALL: - gEeprom.CHAN_1_CALL = gSubMenuSelection; + g_eeprom.chan_1_call = gSubMenuSelection; break; case MENU_S_LIST: - gEeprom.SCAN_LIST_DEFAULT = gSubMenuSelection; + g_eeprom.scan_list_default = gSubMenuSelection; break; #ifdef ENABLE_ALARM case MENU_AL_MOD: - gEeprom.ALARM_MODE = gSubMenuSelection; + g_eeprom.alarm_mode = gSubMenuSelection; break; #endif case MENU_D_ST: - gEeprom.DTMF_SIDE_TONE = gSubMenuSelection; + g_eeprom.DTMF_side_tone = gSubMenuSelection; break; case MENU_D_RSP: - gEeprom.DTMF_DECODE_RESPONSE = gSubMenuSelection; + g_eeprom.DTMF_decode_response = gSubMenuSelection; break; case MENU_D_HOLD: - gEeprom.DTMF_auto_reset_time = gSubMenuSelection; + g_eeprom.DTMF_auto_reset_time = gSubMenuSelection; break; case MENU_D_PRE: - gEeprom.DTMF_PRELOAD_TIME = gSubMenuSelection * 10; + g_eeprom.DTMF_preload_time = gSubMenuSelection * 10; break; case MENU_PTT_ID: - gTxVfo->DTMF_PTT_ID_TX_MODE = gSubMenuSelection; + gTxVfo->DTMF_ptt_id_tx_mode = gSubMenuSelection; gRequestSaveChannel = 1; return; @@ -664,7 +664,7 @@ void MENU_AcceptSetting(void) break; case MENU_D_DCD: - gTxVfo->DTMF_DECODING_ENABLE = gSubMenuSelection; + gTxVfo->DTMF_decoding_enable = gSubMenuSelection; DTMF_clear_RX(); gRequestSaveChannel = 1; return; @@ -692,15 +692,15 @@ void MENU_AcceptSetting(void) return; case MENU_PONMSG: - gEeprom.POWER_ON_DISPLAY_MODE = gSubMenuSelection; + g_eeprom.pwr_on_display_mode = gSubMenuSelection; break; case MENU_ROGER: - gEeprom.ROGER = gSubMenuSelection; + g_eeprom.roger_mode = gSubMenuSelection; break; case MENU_AM: - gTxVfo->AM_mode = gSubMenuSelection; + gTxVfo->am_mode = gSubMenuSelection; gRequestSaveChannel = 1; return; @@ -722,7 +722,7 @@ void MENU_AcceptSetting(void) #ifdef ENABLE_NOAA case MENU_NOAA_S: - gEeprom.NOAA_AUTO_SCAN = gSubMenuSelection; + g_eeprom.NOAA_auto_scan = gSubMenuSelection; gFlagReconfigureVfos = true; break; #endif @@ -734,19 +734,19 @@ void MENU_AcceptSetting(void) return; case MENU_SIDE1_SHORT: - gEeprom.KEY_1_SHORT_PRESS_ACTION = gSubMenuSelection; + g_eeprom.key1_short_press_action = gSubMenuSelection; break; case MENU_SIDE1_LONG: - gEeprom.KEY_1_LONG_PRESS_ACTION = gSubMenuSelection; + g_eeprom.key1_long_press_action = gSubMenuSelection; break; case MENU_SIDE2_SHORT: - gEeprom.KEY_2_SHORT_PRESS_ACTION = gSubMenuSelection; + g_eeprom.key2_short_press_action = gSubMenuSelection; break; case MENU_SIDE2_LONG: - gEeprom.KEY_2_LONG_PRESS_ACTION = gSubMenuSelection; + g_eeprom.key2_long_press_action = gSubMenuSelection; break; case MENU_RESET: @@ -833,25 +833,25 @@ void MENU_SelectNextCode(void) { if (gSubMenuSelection > 104) { - gSelectedCodeType = CODE_TYPE_REVERSE_DIGITAL; + gSelectedcode_type = CODE_TYPE_REVERSE_DIGITAL; gSelectedCode = gSubMenuSelection - 105; } else { - gSelectedCodeType = CODE_TYPE_DIGITAL; + gSelectedcode_type = CODE_TYPE_DIGITAL; gSelectedCode = gSubMenuSelection - 1; } } else { - gSelectedCodeType = CODE_TYPE_CONTINUOUS_TONE; + gSelectedcode_type = CODE_TYPE_CONTINUOUS_TONE; gSelectedCode = gSubMenuSelection - 1; } RADIO_SetupRegisters(true); - gScanPauseDelayIn_10ms = (gSelectedCodeType == CODE_TYPE_CONTINUOUS_TONE) ? scan_pause_delay_in_3_10ms : scan_pause_delay_in_4_10ms; + gScanPauseDelayIn_10ms = (gSelectedcode_type == CODE_TYPE_CONTINUOUS_TONE) ? scan_pause_delay_in_3_10ms : scan_pause_delay_in_4_10ms; gUpdateDisplay = true; } @@ -876,25 +876,25 @@ void MENU_ShowCurrentSetting(void) switch (gMenuCursor) { case MENU_SQL: - gSubMenuSelection = gEeprom.SQUELCH_LEVEL; + gSubMenuSelection = g_eeprom.squelch_level; break; case MENU_STEP: - gSubMenuSelection = gTxVfo->STEP_SETTING; + gSubMenuSelection = gTxVfo->step_setting; break; case MENU_TXP: - gSubMenuSelection = gTxVfo->OUTPUT_POWER; + gSubMenuSelection = gTxVfo->output_power; break; case MENU_R_DCS: - switch (gTxVfo->freq_config_RX.CodeType) + switch (gTxVfo->freq_config_rx.code_type) { case CODE_TYPE_DIGITAL: - gSubMenuSelection = gTxVfo->freq_config_RX.Code + 1; + gSubMenuSelection = gTxVfo->freq_config_rx.code + 1; break; case CODE_TYPE_REVERSE_DIGITAL: - gSubMenuSelection = gTxVfo->freq_config_RX.Code + 105; + gSubMenuSelection = gTxVfo->freq_config_rx.code + 105; break; default: gSubMenuSelection = 0; @@ -907,17 +907,17 @@ void MENU_ShowCurrentSetting(void) break; case MENU_R_CTCS: - gSubMenuSelection = (gTxVfo->freq_config_RX.CodeType == CODE_TYPE_CONTINUOUS_TONE) ? gTxVfo->freq_config_RX.Code + 1 : 0; + gSubMenuSelection = (gTxVfo->freq_config_rx.code_type == CODE_TYPE_CONTINUOUS_TONE) ? gTxVfo->freq_config_rx.code + 1 : 0; break; case MENU_T_DCS: - switch (gTxVfo->freq_config_TX.CodeType) + switch (gTxVfo->freq_config_tx.code_type) { case CODE_TYPE_DIGITAL: - gSubMenuSelection = gTxVfo->freq_config_TX.Code + 1; + gSubMenuSelection = gTxVfo->freq_config_tx.code + 1; break; case CODE_TYPE_REVERSE_DIGITAL: - gSubMenuSelection = gTxVfo->freq_config_TX.Code + 105; + gSubMenuSelection = gTxVfo->freq_config_tx.code + 105; break; default: gSubMenuSelection = 0; @@ -926,53 +926,53 @@ void MENU_ShowCurrentSetting(void) break; case MENU_T_CTCS: - gSubMenuSelection = (gTxVfo->freq_config_TX.CodeType == CODE_TYPE_CONTINUOUS_TONE) ? gTxVfo->freq_config_TX.Code + 1 : 0; + gSubMenuSelection = (gTxVfo->freq_config_tx.code_type == CODE_TYPE_CONTINUOUS_TONE) ? gTxVfo->freq_config_tx.code + 1 : 0; break; case MENU_SFT_D: - gSubMenuSelection = gTxVfo->TX_OFFSET_FREQUENCY_DIRECTION; + gSubMenuSelection = gTxVfo->tx_offset_freq_dir; break; case MENU_OFFSET: - gSubMenuSelection = gTxVfo->TX_OFFSET_FREQUENCY; + gSubMenuSelection = gTxVfo->tx_offset_freq; break; case MENU_W_N: - gSubMenuSelection = gTxVfo->CHANNEL_BANDWIDTH; + gSubMenuSelection = gTxVfo->channel_bandwidth; break; case MENU_SCR: - gSubMenuSelection = gTxVfo->SCRAMBLING_TYPE; + gSubMenuSelection = gTxVfo->scrambling_type; break; case MENU_BCL: - gSubMenuSelection = gTxVfo->BUSY_CHANNEL_LOCK; + gSubMenuSelection = gTxVfo->busy_channel_lock; break; case MENU_MEM_CH: #if 0 - gSubMenuSelection = gEeprom.MrChannel[0]; + gSubMenuSelection = g_eeprom.user_channel[0]; #else - gSubMenuSelection = gEeprom.MrChannel[gEeprom.TX_VFO]; + gSubMenuSelection = g_eeprom.user_channel[g_eeprom.tx_vfo]; #endif break; case MENU_MEM_NAME: - gSubMenuSelection = gEeprom.MrChannel[gEeprom.TX_VFO]; + gSubMenuSelection = g_eeprom.user_channel[g_eeprom.tx_vfo]; break; case MENU_SAVE: - gSubMenuSelection = gEeprom.BATTERY_SAVE; + gSubMenuSelection = g_eeprom.battery_save; break; #ifdef ENABLE_VOX case MENU_VOX: - gSubMenuSelection = gEeprom.VOX_SWITCH ? gEeprom.VOX_LEVEL + 1 : 0; + gSubMenuSelection = g_eeprom.vox_switch ? g_eeprom.vox_level + 1 : 0; break; #endif case MENU_ABR: - gSubMenuSelection = gEeprom.BACKLIGHT; + gSubMenuSelection = g_eeprom.backlight; gBacklightCountdown = 0; GPIO_SetBit(&GPIOB->DATA, GPIOB_PIN_BACKLIGHT); // turn the backlight ON while in backlight menu @@ -983,58 +983,58 @@ void MENU_ShowCurrentSetting(void) break; case MENU_TDR: -// gSubMenuSelection = gEeprom.DUAL_WATCH; - gSubMenuSelection = (gEeprom.DUAL_WATCH == DUAL_WATCH_OFF) ? 0 : 1; +// gSubMenuSelection = g_eeprom.dual_watch; + gSubMenuSelection = (g_eeprom.dual_watch == DUAL_WATCH_OFF) ? 0 : 1; break; case MENU_XB: - gSubMenuSelection = gEeprom.CROSS_BAND_RX_TX; + gSubMenuSelection = g_eeprom.cross_vfo_rx_tx; break; case MENU_BEEP: - gSubMenuSelection = gEeprom.BEEP_CONTROL; + gSubMenuSelection = g_eeprom.beep_control; break; case MENU_TOT: - gSubMenuSelection = gEeprom.TX_TIMEOUT_TIMER; + gSubMenuSelection = g_eeprom.tx_timeout_timer; break; #ifdef ENABLE_VOICE case MENU_VOICE: - gSubMenuSelection = gEeprom.VOICE_PROMPT; + gSubMenuSelection = g_eeprom.voice_prompt; break; #endif case MENU_SC_REV: - gSubMenuSelection = gEeprom.SCAN_RESUME_MODE; + gSubMenuSelection = g_eeprom.scan_resume_mode; break; case MENU_MDF: - gSubMenuSelection = gEeprom.CHANNEL_DISPLAY_MODE; + gSubMenuSelection = g_eeprom.channel_display_mode; break; case MENU_AUTOLK: - gSubMenuSelection = gEeprom.AUTO_KEYPAD_LOCK; + gSubMenuSelection = g_eeprom.auto_keypad_lock; break; case MENU_S_ADD1: - gSubMenuSelection = gTxVfo->SCANLIST1_PARTICIPATION; + gSubMenuSelection = gTxVfo->scanlist_1_participation; break; case MENU_S_ADD2: - gSubMenuSelection = gTxVfo->SCANLIST2_PARTICIPATION; + gSubMenuSelection = gTxVfo->scanlist_2_participation; break; case MENU_STE: - gSubMenuSelection = gEeprom.TAIL_NOTE_ELIMINATION; + gSubMenuSelection = g_eeprom.tail_note_elimination; break; case MENU_RP_STE: - gSubMenuSelection = gEeprom.REPEATER_TAIL_TONE_ELIMINATION; + gSubMenuSelection = g_eeprom.repeater_tail_tone_elimination; break; case MENU_MIC: - gSubMenuSelection = gEeprom.MIC_SENSITIVITY; + gSubMenuSelection = g_eeprom.mic_sensitivity; break; #ifdef ENABLE_AUDIO_BAR @@ -1044,15 +1044,15 @@ void MENU_ShowCurrentSetting(void) #endif case MENU_COMPAND: - gSubMenuSelection = gTxVfo->Compander; + gSubMenuSelection = gTxVfo->compander; return; case MENU_1_CALL: - gSubMenuSelection = gEeprom.CHAN_1_CALL; + gSubMenuSelection = g_eeprom.chan_1_call; break; case MENU_S_LIST: - gSubMenuSelection = gEeprom.SCAN_LIST_DEFAULT; + gSubMenuSelection = g_eeprom.scan_list_default; break; case MENU_SLIST1: @@ -1065,20 +1065,20 @@ void MENU_ShowCurrentSetting(void) #ifdef ENABLE_ALARM case MENU_AL_MOD: - gSubMenuSelection = gEeprom.ALARM_MODE; + gSubMenuSelection = g_eeprom.alarm_mode; break; #endif case MENU_D_ST: - gSubMenuSelection = gEeprom.DTMF_SIDE_TONE; + gSubMenuSelection = g_eeprom.DTMF_side_tone; break; case MENU_D_RSP: - gSubMenuSelection = gEeprom.DTMF_DECODE_RESPONSE; + gSubMenuSelection = g_eeprom.DTMF_decode_response; break; case MENU_D_HOLD: - gSubMenuSelection = gEeprom.DTMF_auto_reset_time; + gSubMenuSelection = g_eeprom.DTMF_auto_reset_time; if (gSubMenuSelection <= DTMF_HOLD_MIN) gSubMenuSelection = DTMF_HOLD_MIN; @@ -1106,11 +1106,11 @@ void MENU_ShowCurrentSetting(void) break; case MENU_D_PRE: - gSubMenuSelection = gEeprom.DTMF_PRELOAD_TIME / 10; + gSubMenuSelection = g_eeprom.DTMF_preload_time / 10; break; case MENU_PTT_ID: - gSubMenuSelection = gTxVfo->DTMF_PTT_ID_TX_MODE; + gSubMenuSelection = gTxVfo->DTMF_ptt_id_tx_mode; break; case MENU_BAT_TXT: @@ -1118,7 +1118,7 @@ void MENU_ShowCurrentSetting(void) return; case MENU_D_DCD: - gSubMenuSelection = gTxVfo->DTMF_DECODING_ENABLE; + gSubMenuSelection = gTxVfo->DTMF_decoding_enable; break; case MENU_D_LIST: @@ -1130,15 +1130,15 @@ void MENU_ShowCurrentSetting(void) break; case MENU_PONMSG: - gSubMenuSelection = gEeprom.POWER_ON_DISPLAY_MODE; + gSubMenuSelection = g_eeprom.pwr_on_display_mode; break; case MENU_ROGER: - gSubMenuSelection = gEeprom.ROGER; + gSubMenuSelection = g_eeprom.roger_mode; break; case MENU_AM: - gSubMenuSelection = gTxVfo->AM_mode; + gSubMenuSelection = gTxVfo->am_mode; break; #ifdef ENABLE_AM_FIX @@ -1155,32 +1155,32 @@ void MENU_ShowCurrentSetting(void) #ifdef ENABLE_NOAA case MENU_NOAA_S: - gSubMenuSelection = gEeprom.NOAA_AUTO_SCAN; + gSubMenuSelection = g_eeprom.NOAA_auto_scan; break; #endif case MENU_DEL_CH: #if 0 - gSubMenuSelection = RADIO_FindNextChannel(gEeprom.MrChannel[0], 1, false, 1); + gSubMenuSelection = RADIO_FindNextChannel(g_eeprom.user_channel[0], 1, false, 1); #else - gSubMenuSelection = RADIO_FindNextChannel(gEeprom.MrChannel[gEeprom.TX_VFO], 1, false, 1); + gSubMenuSelection = RADIO_FindNextChannel(g_eeprom.user_channel[g_eeprom.tx_vfo], 1, false, 1); #endif break; case MENU_SIDE1_SHORT: - gSubMenuSelection = gEeprom.KEY_1_SHORT_PRESS_ACTION; + gSubMenuSelection = g_eeprom.key1_short_press_action; break; case MENU_SIDE1_LONG: - gSubMenuSelection = gEeprom.KEY_1_LONG_PRESS_ACTION; + gSubMenuSelection = g_eeprom.key1_long_press_action; break; case MENU_SIDE2_SHORT: - gSubMenuSelection = gEeprom.KEY_2_SHORT_PRESS_ACTION; + gSubMenuSelection = g_eeprom.key2_short_press_action; break; case MENU_SIDE2_LONG: - gSubMenuSelection = gEeprom.KEY_2_LONG_PRESS_ACTION; + gSubMenuSelection = g_eeprom.key2_long_press_action; break; case MENU_350TX: @@ -1213,7 +1213,7 @@ void MENU_ShowCurrentSetting(void) #ifdef ENABLE_F_CAL_MENU case MENU_F_CALI: - gSubMenuSelection = gEeprom.BK4819_XTAL_FREQ_LOW; + gSubMenuSelection = g_eeprom.BK4819_xtal_freq_low; break; #endif @@ -1226,7 +1226,7 @@ void MENU_ShowCurrentSetting(void) } } -static void MENU_Key_0_to_9(KEY_Code_t Key, bool bKeyPressed, bool bKeyHeld) +static void MENU_Key_0_to_9(key_code_t Key, bool bKeyPressed, bool bKeyHeld) { uint8_t Offset; int32_t Min; @@ -1315,17 +1315,17 @@ static void MENU_Key_0_to_9(KEY_Code_t Key, bool bKeyPressed, bool bKeyHeld) if (gInputBoxIndex < 6) { // invalid frequency #ifdef ENABLE_VOICE - gAnotherVoiceID = (VOICE_ID_t)Key; + g_another_voice_id = (voice_id_t)Key; #endif return; } #ifdef ENABLE_VOICE - gAnotherVoiceID = (VOICE_ID_t)Key; + g_another_voice_id = (voice_id_t)Key; #endif NUMBER_Get(gInputBox, &Frequency); - gSubMenuSelection = FREQUENCY_FloorToStep(Frequency + 75, gTxVfo->StepFrequency, 0); + gSubMenuSelection = FREQUENCY_FloorToStep(Frequency + 75, gTxVfo->step_freq, 0); gInputBoxIndex = 0; return; @@ -1337,7 +1337,7 @@ static void MENU_Key_0_to_9(KEY_Code_t Key, bool bKeyPressed, bool bKeyHeld) if (gInputBoxIndex < 3) { #ifdef ENABLE_VOICE - gAnotherVoiceID = (VOICE_ID_t)Key; + g_another_voice_id = (voice_id_t)Key; #endif gRequestDisplayScreen = DISPLAY_MENU; return; @@ -1347,10 +1347,10 @@ static void MENU_Key_0_to_9(KEY_Code_t Key, bool bKeyPressed, bool bKeyHeld) Value = ((gInputBox[0] * 100) + (gInputBox[1] * 10) + gInputBox[2]) - 1; - if (Value <= MR_CHANNEL_LAST) + if (Value <= USER_CHANNEL_LAST) { #ifdef ENABLE_VOICE - gAnotherVoiceID = (VOICE_ID_t)Key; + g_another_voice_id = (voice_id_t)Key; #endif gSubMenuSelection = Value; return; @@ -1413,7 +1413,7 @@ static void MENU_Key_EXIT(bool bKeyPressed, bool bKeyHeld) gFlagRefreshSetting = true; #ifdef ENABLE_VOICE - gAnotherVoiceID = VOICE_ID_CANCEL; + g_another_voice_id = VOICE_ID_CANCEL; #endif } else @@ -1426,12 +1426,12 @@ static void MENU_Key_EXIT(bool bKeyPressed, bool bKeyHeld) } #ifdef ENABLE_VOICE - gAnotherVoiceID = VOICE_ID_CANCEL; + g_another_voice_id = VOICE_ID_CANCEL; #endif gRequestDisplayScreen = DISPLAY_MAIN; - if (gEeprom.BACKLIGHT == 0) + if (g_eeprom.backlight == 0) { gBacklightCountdown = 0; GPIO_ClearBit(&GPIOB->DATA, GPIOB_PIN_BACKLIGHT); // turn the backlight OFF @@ -1442,7 +1442,7 @@ static void MENU_Key_EXIT(bool bKeyPressed, bool bKeyHeld) MENU_StopCssScan(); #ifdef ENABLE_VOICE - gAnotherVoiceID = VOICE_ID_SCANNING_STOP; + g_another_voice_id = VOICE_ID_SCANNING_STOP; #endif gRequestDisplayScreen = DISPLAY_MENU; @@ -1463,7 +1463,7 @@ static void MENU_Key_MENU(const bool bKeyPressed, const bool bKeyHeld) { #ifdef ENABLE_VOICE if (gMenuCursor != MENU_SCR) - gAnotherVoiceID = MenuList[MenuList_sorted[gMenuCursor]].voice_id; + g_another_voice_id = MenuList[MenuList_sorted[gMenuCursor]].voice_id; #endif #if 1 @@ -1583,9 +1583,9 @@ static void MENU_Key_MENU(const bool bKeyPressed, const bool bKeyHeld) #ifdef ENABLE_VOICE if (gMenuCursor == MENU_SCR) - gAnotherVoiceID = (gSubMenuSelection == 0) ? VOICE_ID_SCRAMBLER_OFF : VOICE_ID_SCRAMBLER_ON; + g_another_voice_id = (gSubMenuSelection == 0) ? VOICE_ID_SCRAMBLER_OFF : VOICE_ID_SCRAMBLER_ON; else - gAnotherVoiceID = VOICE_ID_CONFIRM; + g_another_voice_id = VOICE_ID_CONFIRM; #endif gInputBoxIndex = 0; @@ -1620,9 +1620,9 @@ static void MENU_Key_STAR(const bool bKeyPressed, const bool bKeyHeld) RADIO_SelectVfos(); #ifdef ENABLE_NOAA - if (IS_NOT_NOAA_CHANNEL(gRxVfo->CHANNEL_SAVE) && gRxVfo->AM_mode == 0) + if (IS_NOT_NOAA_CHANNEL(gRxVfo->channel_save) && gRxVfo->am_mode == 0) #else - if (gRxVfo->AM_mode == 0) + if (gRxVfo->am_mode == 0) #endif { if (gMenuCursor == MENU_R_CTCS || gMenuCursor == MENU_R_DCS) @@ -1642,7 +1642,7 @@ static void MENU_Key_STAR(const bool bKeyPressed, const bool bKeyHeld) MENU_StopCssScan(); gRequestDisplayScreen = DISPLAY_MENU; #ifdef ENABLE_VOICE - gAnotherVoiceID = VOICE_ID_SCANNING_STOP; + g_another_voice_id = VOICE_ID_SCANNING_STOP; #endif } } @@ -1712,7 +1712,7 @@ static void MENU_Key_UP_DOWN(bool bKeyPressed, bool bKeyHeld, int8_t Direction) gRequestDisplayScreen = DISPLAY_MENU; - if (gMenuCursor != MENU_ABR && gEeprom.BACKLIGHT == 0) + if (gMenuCursor != MENU_ABR && g_eeprom.backlight == 0) { gBacklightCountdown = 0; GPIO_ClearBit(&GPIOB->DATA, GPIOB_PIN_BACKLIGHT); // turn the backlight OFF @@ -1723,7 +1723,7 @@ static void MENU_Key_UP_DOWN(bool bKeyPressed, bool bKeyHeld, int8_t Direction) if (gMenuCursor == MENU_OFFSET) { - int32_t Offset = (Direction * gTxVfo->StepFrequency) + gSubMenuSelection; + int32_t Offset = (Direction * gTxVfo->step_freq) + gSubMenuSelection; if (Offset < 99999990) { if (Offset < 0) @@ -1732,7 +1732,7 @@ static void MENU_Key_UP_DOWN(bool bKeyPressed, bool bKeyHeld, int8_t Direction) else Offset = 0; - gSubMenuSelection = FREQUENCY_FloorToStep(Offset, gTxVfo->StepFrequency, 0); + gSubMenuSelection = FREQUENCY_FloorToStep(Offset, gTxVfo->step_freq, 0); gRequestDisplayScreen = DISPLAY_MENU; return; } @@ -1771,7 +1771,7 @@ static void MENU_Key_UP_DOWN(bool bKeyPressed, bool bKeyHeld, int8_t Direction) gRequestDisplayScreen = DISPLAY_MENU; } -void MENU_ProcessKeys(KEY_Code_t Key, bool bKeyPressed, bool bKeyHeld) +void MENU_ProcessKeys(key_code_t Key, bool bKeyPressed, bool bKeyHeld) { switch (Key) { diff --git a/app/menu.h b/app/menu.h index ec8e144..1367fb7 100644 --- a/app/menu.h +++ b/app/menu.h @@ -30,7 +30,7 @@ void MENU_ShowCurrentSetting(void); void MENU_StartCssScan(int8_t Direction); void MENU_StopCssScan(void); -void MENU_ProcessKeys(KEY_Code_t Key, bool bKeyPressed, bool bKeyHeld); +void MENU_ProcessKeys(key_code_t Key, bool bKeyPressed, bool bKeyHeld); #endif diff --git a/app/scanner.c b/app/scanner.c index b0e1046..d8ff209 100644 --- a/app/scanner.c +++ b/app/scanner.c @@ -26,7 +26,7 @@ #include "ui/inputbox.h" #include "ui/ui.h" -DCS_CodeType_t gScanCssResultType; +dcs_code_type_t gScanCssResultType; uint8_t gScanCssResultCode; bool gFlagStartScan; bool gFlagStopScan; @@ -44,7 +44,7 @@ bool gScanUseCssResult; int8_t gScanStateDir; bool bScanKeepFrequency; -static void SCANNER_Key_DIGITS(KEY_Code_t Key, bool bKeyPressed, bool bKeyHeld) +static void SCANNER_Key_DIGITS(key_code_t Key, bool bKeyPressed, bool bKeyHeld) { if (!bKeyHeld && bKeyPressed) { @@ -61,7 +61,7 @@ static void SCANNER_Key_DIGITS(KEY_Code_t Key, bool bKeyPressed, bool bKeyHeld) if (gInputBoxIndex < 3) { #ifdef ENABLE_VOICE - gAnotherVoiceID = (VOICE_ID_t)Key; + g_another_voice_id = (voice_id_t)Key; #endif return; } @@ -69,10 +69,10 @@ static void SCANNER_Key_DIGITS(KEY_Code_t Key, bool bKeyPressed, bool bKeyHeld) gInputBoxIndex = 0; Channel = ((gInputBox[0] * 100) + (gInputBox[1] * 10) + gInputBox[2]) - 1; - if (Channel <= MR_CHANNEL_LAST) + if (Channel <= USER_CHANNEL_LAST) { #ifdef ENABLE_VOICE - gAnotherVoiceID = (VOICE_ID_t)Key; + g_another_voice_id = (voice_id_t)Key; #endif gShowChPrefix = RADIO_CheckValidChannel(Channel, false, 0); gScanChannel = (uint8_t)Channel; @@ -95,13 +95,13 @@ static void SCANNER_Key_EXIT(bool bKeyPressed, bool bKeyHeld) case SCAN_EDIT_STATE_NONE: gRequestDisplayScreen = DISPLAY_MAIN; - gEeprom.CROSS_BAND_RX_TX = gBackup_CROSS_BAND_RX_TX; + g_eeprom.cross_vfo_rx_tx = gBackup_cross_vfo_rx_tx; gUpdateStatus = true; gFlagStopScan = true; gVfoConfigureMode = VFO_CONFIGURE_RELOAD; gFlagResetVfos = true; #ifdef ENABLE_VOICE - gAnotherVoiceID = VOICE_ID_CANCEL; + g_another_voice_id = VOICE_ID_CANCEL; #endif break; @@ -118,7 +118,7 @@ static void SCANNER_Key_EXIT(bool bKeyPressed, bool bKeyHeld) case SCAN_EDIT_STATE_DONE: gScannerEditState = SCAN_EDIT_STATE_NONE; #ifdef ENABLE_VOICE - gAnotherVoiceID = VOICE_ID_CANCEL; + g_another_voice_id = VOICE_ID_CANCEL; #endif gRequestDisplayScreen = DISPLAY_SCANNER; break; @@ -199,11 +199,11 @@ static void SCANNER_Key_MENU(bool bKeyPressed, bool bKeyHeld) #else #ifdef ENABLE_1250HZ_STEP - const STEP_Setting_t small_step = STEP_1_25kHz; - const STEP_Setting_t big_step = STEP_6_25kHz; + const step_setting_t small_step = STEP_1_25kHz; + const step_setting_t big_step = STEP_6_25kHz; #else - const STEP_Setting_t small_step = STEP_2_5kHz; - const STEP_Setting_t big_step = STEP_6_25kHz; + const step_setting_t small_step = STEP_2_5kHz; + const step_setting_t big_step = STEP_6_25kHz; #endif const uint32_t small_step_freq = StepFrequencyTable[small_step]; @@ -242,11 +242,11 @@ static void SCANNER_Key_MENU(bool bKeyPressed, bool bKeyHeld) #endif } - if (gTxVfo->CHANNEL_SAVE <= MR_CHANNEL_LAST) + if (gTxVfo->channel_save <= USER_CHANNEL_LAST) { gScannerEditState = SCAN_EDIT_STATE_BUSY; - gScanChannel = gTxVfo->CHANNEL_SAVE; - gShowChPrefix = RADIO_CheckValidChannel(gTxVfo->CHANNEL_SAVE, false, 0); + gScanChannel = gTxVfo->channel_save; + gShowChPrefix = RADIO_CheckValidChannel(gTxVfo->channel_save, false, 0); } else { @@ -256,7 +256,7 @@ static void SCANNER_Key_MENU(bool bKeyPressed, bool bKeyHeld) gScanCssState = SCAN_CSS_STATE_FOUND; #ifdef ENABLE_VOICE - gAnotherVoiceID = VOICE_ID_MEMORY_CHANNEL; + g_another_voice_id = VOICE_ID_MEMORY_CHANNEL; #endif gRequestDisplayScreen = DISPLAY_SCANNER; @@ -275,45 +275,45 @@ static void SCANNER_Key_MENU(bool bKeyPressed, bool bKeyHeld) case SCAN_EDIT_STATE_DONE: if (!gScanSingleFrequency) { - RADIO_InitInfo(gTxVfo, gTxVfo->CHANNEL_SAVE, gScanFrequency); + RADIO_InitInfo(gTxVfo, gTxVfo->channel_save, gScanFrequency); if (gScanUseCssResult) { - gTxVfo->freq_config_RX.CodeType = gScanCssResultType; - gTxVfo->freq_config_RX.Code = gScanCssResultCode; + gTxVfo->freq_config_rx.code_type = gScanCssResultType; + gTxVfo->freq_config_rx.code = gScanCssResultCode; } - gTxVfo->freq_config_TX = gTxVfo->freq_config_RX; - gTxVfo->STEP_SETTING = gStepSetting; + gTxVfo->freq_config_tx = gTxVfo->freq_config_rx; + gTxVfo->step_setting = gStepSetting; } else { RADIO_ConfigureChannel(0, VFO_CONFIGURE_RELOAD); RADIO_ConfigureChannel(1, VFO_CONFIGURE_RELOAD); - gTxVfo->freq_config_RX.CodeType = gScanCssResultType; - gTxVfo->freq_config_RX.Code = gScanCssResultCode; - gTxVfo->freq_config_TX.CodeType = gScanCssResultType; - gTxVfo->freq_config_TX.Code = gScanCssResultCode; + gTxVfo->freq_config_rx.code_type = gScanCssResultType; + gTxVfo->freq_config_rx.code = gScanCssResultCode; + gTxVfo->freq_config_tx.code_type = gScanCssResultType; + gTxVfo->freq_config_tx.code = gScanCssResultCode; } - if (gTxVfo->CHANNEL_SAVE <= MR_CHANNEL_LAST) + if (gTxVfo->channel_save <= USER_CHANNEL_LAST) { Channel = gScanChannel; - gEeprom.MrChannel[gEeprom.TX_VFO] = Channel; + g_eeprom.user_channel[g_eeprom.tx_vfo] = Channel; } else { - Channel = gTxVfo->Band + FREQ_CHANNEL_FIRST; - gEeprom.FreqChannel[gEeprom.TX_VFO] = Channel; + Channel = gTxVfo->band + FREQ_CHANNEL_FIRST; + g_eeprom.freq_channel[g_eeprom.tx_vfo] = Channel; } - gTxVfo->CHANNEL_SAVE = Channel; - gEeprom.ScreenChannel[gEeprom.TX_VFO] = Channel; + gTxVfo->channel_save = Channel; + g_eeprom.screen_channel[g_eeprom.tx_vfo] = Channel; gRequestSaveChannel = 2; #ifdef ENABLE_VOICE - gAnotherVoiceID = VOICE_ID_CONFIRM; + g_another_voice_id = VOICE_ID_CONFIRM; #endif gScannerEditState = SCAN_EDIT_STATE_NONE; @@ -355,7 +355,7 @@ static void SCANNER_Key_UP_DOWN(bool bKeyPressed, bool pKeyHeld, int8_t Directio if (gScannerEditState == SCAN_EDIT_STATE_BUSY) { - gScanChannel = NUMBER_AddWithWraparound(gScanChannel, Direction, 0, MR_CHANNEL_LAST); + gScanChannel = NUMBER_AddWithWraparound(gScanChannel, Direction, 0, USER_CHANNEL_LAST); gShowChPrefix = RADIO_CheckValidChannel(gScanChannel, false, 0); gRequestDisplayScreen = DISPLAY_SCANNER; } @@ -363,7 +363,7 @@ static void SCANNER_Key_UP_DOWN(bool bKeyPressed, bool pKeyHeld, int8_t Directio gBeepToPlay = BEEP_500HZ_60MS_DOUBLE_BEEP_OPTIONAL; } -void SCANNER_ProcessKeys(KEY_Code_t Key, bool bKeyPressed, bool bKeyHeld) +void SCANNER_ProcessKeys(key_code_t Key, bool bKeyPressed, bool bKeyHeld) { switch (Key) { @@ -414,17 +414,17 @@ void SCANNER_Start(void) RADIO_SelectVfos(); #ifdef ENABLE_NOAA - if (IS_NOAA_CHANNEL(gRxVfo->CHANNEL_SAVE)) - gRxVfo->CHANNEL_SAVE = FREQ_CHANNEL_FIRST + BAND6_400MHz; + if (IS_NOAA_CHANNEL(gRxVfo->channel_save)) + gRxVfo->channel_save = FREQ_CHANNEL_FIRST + BAND6_400MHz; #endif - BackupStep = gRxVfo->STEP_SETTING; - BackupStepFreq = gRxVfo->StepFrequency; + BackupStep = gRxVfo->step_setting; + BackupStepFreq = gRxVfo->step_freq; - RADIO_InitInfo(gRxVfo, gRxVfo->CHANNEL_SAVE, gRxVfo->pRX->Frequency); + RADIO_InitInfo(gRxVfo, gRxVfo->channel_save, gRxVfo->pRX->frequency); - gRxVfo->STEP_SETTING = BackupStep; - gRxVfo->StepFrequency = BackupStepFreq; + gRxVfo->step_setting = BackupStep; + gRxVfo->step_freq = BackupStepFreq; RADIO_SetupRegisters(true); @@ -435,8 +435,8 @@ void SCANNER_Start(void) if (gScanSingleFrequency) { gScanCssState = SCAN_CSS_STATE_SCANNING; - gScanFrequency = gRxVfo->pRX->Frequency; - gStepSetting = gRxVfo->STEP_SETTING; + gScanFrequency = gRxVfo->pRX->frequency; + gStepSetting = gRxVfo->step_setting; BK4819_PickRXFilterPathBasedOnFrequency(gScanFrequency); BK4819_SetScanFrequency(gScanFrequency); @@ -457,12 +457,12 @@ void SCANNER_Start(void) gScanCssResultType = 0xFF; gScanHitCount = 0; gScanUseCssResult = false; - g_CxCSS_TAIL_Found = false; - g_CDCSS_Lost = false; - gCDCSSCodeType = 0; - g_CTCSS_Lost = false; + g_CxCSS_tailL_found = false; + g_CDCSS_lost = false; + g_CDCSS_code_type = 0; + g_CTCSS_lost = false; #ifdef ENABLE_VOX - g_VOX_Lost = false; + g_vox_lost = false; #endif g_SquelchLost = false; gScannerEditState = SCAN_EDIT_STATE_NONE; @@ -474,7 +474,7 @@ void SCANNER_Start(void) void SCANNER_Stop(void) { - const uint8_t Previous = gRestoreMrChannel; + const uint8_t Previous = gRestoreUSER_CHANNEL; if (gScanStateDir == SCAN_OFF) return; // but, but, we weren't ! @@ -483,16 +483,16 @@ void SCANNER_Stop(void) if (!bScanKeepFrequency) { - if (gNextMrChannel <= MR_CHANNEL_LAST) + if (gNextChannel <= USER_CHANNEL_LAST) { - gEeprom.MrChannel[gEeprom.RX_VFO] = gRestoreMrChannel; - gEeprom.ScreenChannel[gEeprom.RX_VFO] = Previous; + g_eeprom.user_channel[g_eeprom.rx_vfo] = gRestoreUSER_CHANNEL; + g_eeprom.screen_channel[g_eeprom.rx_vfo] = Previous; - RADIO_ConfigureChannel(gEeprom.RX_VFO, VFO_CONFIGURE_RELOAD); + RADIO_ConfigureChannel(g_eeprom.rx_vfo, VFO_CONFIGURE_RELOAD); } else { - gRxVfo->freq_config_RX.Frequency = gRestoreFrequency; + gRxVfo->freq_config_rx.frequency = gRestoreFrequency; RADIO_ApplyOffset(gRxVfo); RADIO_ConfigureSquelchAndOutputPower(gRxVfo); } @@ -501,11 +501,11 @@ void SCANNER_Stop(void) return; } - if (gRxVfo->CHANNEL_SAVE > MR_CHANNEL_LAST) + if (gRxVfo->channel_save > USER_CHANNEL_LAST) { RADIO_ApplyOffset(gRxVfo); RADIO_ConfigureSquelchAndOutputPower(gRxVfo); - SETTINGS_SaveChannel(gRxVfo->CHANNEL_SAVE, gEeprom.RX_VFO, gRxVfo, 1); + SETTINGS_SaveChannel(gRxVfo->channel_save, g_eeprom.rx_vfo, gRxVfo, 1); return; } diff --git a/app/scanner.h b/app/scanner.h index d0d4630..3df9923 100644 --- a/app/scanner.h +++ b/app/scanner.h @@ -42,7 +42,7 @@ enum SCAN_edit_state_e { }; typedef enum SCAN_edit_state_e SCAN_edit_state_t; -extern DCS_CodeType_t gScanCssResultType; +extern dcs_code_type_t gScanCssResultType; extern uint8_t gScanCssResultCode; extern bool gFlagStartScan; extern bool gFlagStopScan; @@ -60,7 +60,7 @@ extern bool gScanUseCssResult; extern int8_t gScanStateDir; extern bool bScanKeepFrequency; -void SCANNER_ProcessKeys(KEY_Code_t Key, bool bKeyPressed, bool bKeyHeld); +void SCANNER_ProcessKeys(key_code_t Key, bool bKeyPressed, bool bKeyHeld); void SCANNER_Start(void); void SCANNER_Stop(void); diff --git a/app/spectrum.c b/app/spectrum.c index 1169f96..85c9bc1 100644 --- a/app/spectrum.c +++ b/app/spectrum.c @@ -22,169 +22,181 @@ const uint16_t RSSI_MAX_VALUE = 65535; static uint32_t initialFreq; -static char String[32]; +static char String[32]; -bool isInitialized = false; -bool monitorMode = false; -bool redrawStatus = true; -bool redrawScreen = false; -bool newScanStart = true; +bool isInitialized = false; +bool monitorMode = false; +bool redrawStatus = true; +bool redrawScreen = false; +bool newScanStart = true; bool preventKeypress = true; -bool isListening = false; -bool isTransmitting = false; +bool isListening = false; +bool isTransmitting = false; -State currentState = SPECTRUM, previousState = SPECTRUM; +State currentState = SPECTRUM, previousState = SPECTRUM; -PeakInfo peak; -ScanInfo scanInfo; -KeyboardState kbd = {KEY_INVALID, KEY_INVALID, 0}; +PeakInfo peak; +ScanInfo scanInfo; +KeyboardState kbd = {KEY_INVALID, KEY_INVALID, 0}; -const char *bwOptions[] = {" 25k", "12.5k", "6.25k"}; -const char *modulationTypeOptions[] = {" FM", " AM", "USB"}; +const char *bwOptions[] = {" 25k", "12.5k", "6.25k"}; +const char *modulationTypeOptions[] = {" FM", " AM", "USB"}; const uint8_t modulationTypeTuneSteps[] = {100, 50, 10}; -const uint8_t modTypeReg47Values[] = {1, 7, 5}; +const uint8_t modTypeReg47Values[] = {1, 7, 5}; SpectrumSettings settings = { - .stepsCount = STEPS_64, - .scanStepIndex = S_STEP_25_0kHz, - .frequencyChangeStep = 80000, - .scanDelay = 3200, - .rssiTriggerLevel = 150, - .backlightState = true, - .bw = BK4819_FILTER_BW_WIDE, - .listenBw = BK4819_FILTER_BW_WIDE, - .modulationType = false, + .stepsCount = STEPS_64, + .scanStepIndex = S_STEP_25_0kHz, + .frequencyChangeStep = 80000, + .scanDelay = 3200, + .rssiTriggerLevel = 150, + .backlightState = true, + .bw = BK4819_FILTER_BW_WIDE, + .listenBw = BK4819_FILTER_BW_WIDE, + .modulationType = false, }; -uint32_t fMeasure = 0; -uint32_t fTx = 0; -uint32_t currentFreq, tempFreq; +uint32_t fMeasure = 0; +uint32_t fTx = 0; +uint32_t currentFreq; +uint32_t tempFreq; uint16_t rssiHistory[128] = {0}; -bool blacklist[128] = {false}; +bool blacklist[128] = {false}; -static const RegisterSpec afOutRegSpec = {"AF OUT", 0x47, 8, 0xF, 1}; +static const RegisterSpec afOutRegSpec = {"AF OUT", 0x47, 8, 0xF, 1}; static const RegisterSpec afDacGainRegSpec = {"AF DAC G", 0x48, 0, 0xF, 1}; -static const RegisterSpec registerSpecs[] = { - {}, - {"LNAs", 0x13, 8, 0b11, 1}, - {"LNA", 0x13, 5, 0b111, 1}, - {"PGA", 0x13, 0, 0b111, 1}, - {"MIX", 0x13, 3, 0b11, 1}, - - {"DEV", 0x40, 0, 4095, 1}, - {"CMP", 0x31, 3, 1, 1}, - {"MIC", 0x7D, 0, 0x1F, 1}, +static const RegisterSpec registerSpecs[] = { + {}, + {"LNAs", 0x13, 8, 0b11, 1}, + {"LNA", 0x13, 5, 0b111, 1}, + {"PGA", 0x13, 0, 0b111, 1}, + {"MIX", 0x13, 3, 0b11, 1}, + {"DEV", 0x40, 0, 4095, 1}, + {"CMP", 0x31, 3, 1, 1}, + {"MIC", 0x7D, 0, 0x1F, 1}, }; static uint16_t registersBackup[128]; static const uint8_t registersToBackup[] = { - 0x13, 0x30, 0x31, 0x37, 0x3D, 0x40, 0x43, 0x47, 0x48, 0x7D, 0x7E, + 0x13, 0x30, 0x31, 0x37, 0x3D, 0x40, 0x43, 0x47, 0x48, 0x7D, 0x7E, }; -static MovingAverage mov = {{128}, {}, 255, 128, 0, 0}; +static MovingAverage mov = {{128}, {}, 255, 128, 0, 0}; static const uint8_t MOV_N = ARRAY_SIZE(mov.buf); const uint8_t FREQ_INPUT_LENGTH = 10; -uint8_t freqInputIndex = 0; -uint8_t freqInputDotIndex = 0; -KEY_Code_t freqInputArr[10]; -char freqInputString[] = "----------"; // XXXX.XXXXX +uint8_t freqInputIndex = 0; +uint8_t freqInputDotIndex = 0; +key_code_t freqInputArr[10]; +char freqInputString[] = "----------"; // XXXX.XXXXX -uint8_t menuState = 0; +uint8_t menuState = 0; -uint16_t listenT = 0; +uint16_t listenT = 0; -uint16_t batteryUpdateTimer = 0; -bool isMovingInitialized = false; -uint8_t lastStepsCount = 0; +uint16_t batteryUpdateTimer = 0; +bool isMovingInitialized = false; +uint8_t lastStepsCount = 0; -uint8_t CountBits(uint16_t n) { - uint8_t count = 0; - while (n) { - count++; - n >>= 1; - } - return count; +uint8_t CountBits(uint16_t n) +{ + uint8_t count = 0; + while (n) + { + count++; + n >>= 1; + } + return count; } -static uint16_t GetRegMask(RegisterSpec s) { - return (1 << CountBits(s.maxValue)) - 1; +static uint16_t GetRegMask(RegisterSpec s) +{ + return (1 << CountBits(s.maxValue)) - 1; } -static uint16_t GetRegValue(RegisterSpec s) { - return (BK4819_ReadRegister(s.num) >> s.offset) & s.maxValue; +static uint16_t GetRegValue(RegisterSpec s) +{ + return (BK4819_ReadRegister(s.num) >> s.offset) & s.maxValue; } -static void SetRegValue(RegisterSpec s, uint16_t v) { - uint16_t reg = BK4819_ReadRegister(s.num); - reg &= ~(GetRegMask(s) << s.offset); - BK4819_WriteRegister(s.num, reg | (v << s.offset)); +static void SetRegValue(RegisterSpec s, uint16_t v) +{ + uint16_t reg = BK4819_ReadRegister(s.num); + reg &= ~(GetRegMask(s) << s.offset); + BK4819_WriteRegister(s.num, reg | (v << s.offset)); } -static void UpdateRegMenuValue(RegisterSpec s, bool add) { - uint16_t v = GetRegValue(s); - - if (add && v <= s.maxValue - s.inc) { - v += s.inc; - } else if (!add && v >= 0 + s.inc) { - v -= s.inc; - } - - SetRegValue(s, v); - redrawScreen = true; +static void UpdateRegMenuValue(RegisterSpec s, bool add) +{ + uint16_t v = GetRegValue(s); + + if (add && v <= s.maxValue - s.inc) + v += s.inc; + else + if (!add && v >= 0 + s.inc) + v -= s.inc; + + SetRegValue(s, v); + redrawScreen = true; } // Utility functions -KEY_Code_t GetKey() { - KEY_Code_t btn = KEYBOARD_Poll(); - if (btn == KEY_INVALID && !GPIO_CheckBit(&GPIOC->DATA, GPIOC_PIN_PTT)) { - btn = KEY_PTT; - } - return btn; +key_code_t GetKey() +{ + key_code_t btn = KEYBOARD_Poll(); + if (btn == KEY_INVALID && !GPIO_CheckBit(&GPIOC->DATA, GPIOC_PIN_PTT)) + btn = KEY_PTT; + return btn; } -void SetState(State state) { - previousState = currentState; - currentState = state; - redrawScreen = true; - redrawStatus = true; +void SetState(State state) +{ + previousState = currentState; + currentState = state; + redrawScreen = true; + redrawStatus = true; } // Radio functions -static void BackupRegisters() { - for (int i = 0; i < ARRAY_SIZE(registersToBackup); ++i) { - uint8_t regNum = registersToBackup[i]; - registersBackup[regNum] = BK4819_ReadRegister(regNum); - } +static void BackupRegisters() +{ + for (int i = 0; i < ARRAY_SIZE(registersToBackup); ++i) + { + uint8_t regNum = registersToBackup[i]; + registersBackup[regNum] = BK4819_ReadRegister(regNum); + } } -static void RestoreRegisters() { - for (int i = 0; i < ARRAY_SIZE(registersToBackup); ++i) { - uint8_t regNum = registersToBackup[i]; - BK4819_WriteRegister(regNum, registersBackup[regNum]); - } +static void RestoreRegisters() +{ + for (int i = 0; i < ARRAY_SIZE(registersToBackup); ++i) + { + uint8_t regNum = registersToBackup[i]; + BK4819_WriteRegister(regNum, registersBackup[regNum]); + } } -static void SetModulation(ModulationType type) { - // restore only registers, which we affect here fully - BK4819_WriteRegister(0x37, registersBackup[0x37]); - BK4819_WriteRegister(0x3D, registersBackup[0x3D]); - BK4819_WriteRegister(0x48, registersBackup[0x48]); - - SetRegValue(afOutRegSpec, modTypeReg47Values[type]); - - if (type == MOD_USB) { - BK4819_WriteRegister(0x37, 0b0001011000001111); - BK4819_WriteRegister(0x3D, 0b0010101101000101); - BK4819_WriteRegister(0x48, 0b0000001110101000); - } - - if (type == MOD_AM) { - SetRegValue(afDacGainRegSpec, 0xE); - } +static void SetModulation(ModulationType type) +{ + // restore only registers, which we affect here fully + BK4819_WriteRegister(0x37, registersBackup[0x37]); + BK4819_WriteRegister(0x3D, registersBackup[0x3D]); + BK4819_WriteRegister(0x48, registersBackup[0x48]); + + SetRegValue(afOutRegSpec, modTypeReg47Values[type]); + + if (type == MOD_USB) + { + BK4819_WriteRegister(0x37, 0b0001011000001111); + BK4819_WriteRegister(0x3D, 0b0010101101000101); + BK4819_WriteRegister(0x48, 0b0000001110101000); + } + + if (type == MOD_AM) + SetRegValue(afDacGainRegSpec, 0xE); } static void SetF(uint32_t f) { @@ -646,7 +658,7 @@ static void FreqInput() { SetState(FREQ_INPUT); } -static void UpdateFreqInput(KEY_Code_t key) { +static void UpdateFreqInput(key_code_t key) { if (key != KEY_EXIT && freqInputIndex >= 10) { return; } @@ -667,7 +679,7 @@ static void UpdateFreqInput(KEY_Code_t key) { uint8_t dotIndex = freqInputDotIndex == 0 ? freqInputIndex : freqInputDotIndex; - KEY_Code_t digitKey; + key_code_t digitKey; for (int i = 0; i < 10; ++i) { if (i < freqInputIndex) { digitKey = freqInputArr[i]; @@ -965,7 +977,7 @@ static void OnKeyDownFreqInput(uint8_t key) { } } -void OnKeyDownStill(KEY_Code_t key) { +void OnKeyDownStill(key_code_t key) { switch (key) { case KEY_3: break; @@ -1315,7 +1327,7 @@ static void AutomaticPresetChoose(uint32_t f) { void APP_RunSpectrum() { BackupRegisters(); // TX here coz it always? set to active VFO - VFO_Info_t vfo = gEeprom.VfoInfo[gEeprom.TX_CHANNEL]; + VFO_Info_t vfo = g_eeprom.VfoInfo[g_eeprom.TX_CHANNEL]; initialFreq = vfo.pRX->Frequency; currentFreq = initialFreq; settings.scanStepIndex = gStepSettingToIndex[vfo.STEP_SETTING]; diff --git a/app/spectrum.h b/app/spectrum.h index 739f4d0..9aeeaf8 100644 --- a/app/spectrum.h +++ b/app/spectrum.h @@ -17,6 +17,10 @@ #ifndef SPECTRUM_H #define SPECTRUM_H +#include +#include +#include + #include "../bitmaps.h" #include "../board.h" #include "../bsp/dp32g030/gpio.h" @@ -36,184 +40,164 @@ #include "../radio.h" #include "../settings.h" #include "../ui/helper.h" -#include -#include -#include static const uint8_t DrawingEndY = 40; static const uint16_t scanStepValues[] = { - 1, 10, 50, 100, - - 250, 500, 625, 833, 1000, 1250, 2500, 10000, + 1, 10, 50, 100, 250, 500, 625, 833, 1000, 1250, 2500, 10000, }; static const uint8_t gStepSettingToIndex[] = { - [STEP_2_5kHz] = 4, [STEP_5_0kHz] = 5, [STEP_6_25kHz] = 6, - [STEP_10_0kHz] = 8, [STEP_12_5kHz] = 9, [STEP_25_0kHz] = 10, - [STEP_8_33kHz] = 7, + [STEP_2_5kHz] = 4, [STEP_5_0kHz] = 5, [STEP_6_25kHz] = 6, + [STEP_10_0kHz] = 8, [STEP_12_5kHz] = 9, [STEP_25_0kHz] = 10, + [STEP_8_33kHz] = 7, }; static const uint16_t scanStepBWRegValues[12] = { - // RX RXw TX BW - // 0b0 000 000 001 01 1000 - // 1 - 0b0000000001011000, // 6.25 - // 10 - 0b0000000001011000, // 6.25 - // 50 - 0b0000000001011000, // 6.25 - // 100 - 0b0000000001011000, // 6.25 - // 250 - 0b0000000001011000, // 6.25 - // 500 - 0b0010010001011000, // 6.25 - // 625 - 0b0100100001011000, // 6.25 - // 833 - 0b0110110001001000, // 6.25 - // 1000 - 0b0110110001001000, // 6.25 - // 1250 - 0b0111111100001000, // 6.25 - // 2500 - 0b0011011000101000, // 25 - // 10000 - 0b0011011000101000, // 25 + // RX RXw TX BW + // 0b0 000 000 001 01 1000 + // 1 + 0b0000000001011000, // 6.25 + // 10 + 0b0000000001011000, // 6.25 + // 50 + 0b0000000001011000, // 6.25 + // 100 + 0b0000000001011000, // 6.25 + // 250 + 0b0000000001011000, // 6.25 + // 500 + 0b0010010001011000, // 6.25 + // 625 + 0b0100100001011000, // 6.25 + // 833 + 0b0110110001001000, // 6.25 + // 1000 + 0b0110110001001000, // 6.25 + // 1250 + 0b0111111100001000, // 6.25 + // 2500 + 0b0011011000101000, // 25 + // 10000 + 0b0011011000101000, // 25 }; static const uint16_t listenBWRegValues[] = { - 0b0011011000101000, // 25 - 0b0111111100001000, // 12.5 - 0b0100100001011000, // 6.25 + 0b0011011000101000, // 25 + 0b0111111100001000, // 12.5 + 0b0100100001011000, // 6.25 }; typedef enum State { - SPECTRUM, - FREQ_INPUT, - STILL, + SPECTRUM, + FREQ_INPUT, + STILL, } State; typedef enum StepsCount { - STEPS_128, - STEPS_64, - STEPS_32, - STEPS_16, + STEPS_128, + STEPS_64, + STEPS_32, + STEPS_16, } StepsCount; typedef enum ModulationType { - MOD_FM, - MOD_AM, - MOD_USB, + MOD_FM, + MOD_AM, + MOD_USB, } ModulationType; typedef enum ScanStep { - S_STEP_0_01kHz, - S_STEP_0_1kHz, - S_STEP_0_5kHz, - S_STEP_1_0kHz, + S_STEP_0_01kHz, + S_STEP_0_1kHz, + S_STEP_0_5kHz, + S_STEP_1_0kHz, - S_STEP_2_5kHz, - S_STEP_5_0kHz, - S_STEP_6_25kHz, - S_STEP_8_33kHz, - S_STEP_10_0kHz, - S_STEP_12_5kHz, - S_STEP_25_0kHz, - S_STEP_100_0kHz, + S_STEP_2_5kHz, + S_STEP_5_0kHz, + S_STEP_6_25kHz, + S_STEP_8_33kHz, + S_STEP_10_0kHz, + S_STEP_12_5kHz, + S_STEP_25_0kHz, + S_STEP_100_0kHz, } ScanStep; typedef struct SpectrumSettings { - StepsCount stepsCount; - ScanStep scanStepIndex; - uint32_t frequencyChangeStep; - uint16_t scanDelay; - uint16_t rssiTriggerLevel; + StepsCount stepsCount; + ScanStep scanStepIndex; + uint32_t frequencyChangeStep; + uint16_t scanDelay; + uint16_t rssiTriggerLevel; - bool backlightState; - BK4819_FilterBandwidth_t bw; - BK4819_FilterBandwidth_t listenBw; - ModulationType modulationType; + bool backlightState; + BK4819_FilterBandwidth_t bw; + BK4819_FilterBandwidth_t listenBw; + ModulationType modulationType; } SpectrumSettings; typedef struct KeyboardState { - KEY_Code_t current; - KEY_Code_t prev; - uint8_t counter; + KEY_Code_t current; + KEY_Code_t prev; + uint8_t counter; } KeyboardState; typedef struct ScanInfo { - uint16_t rssi, rssiMin, rssiMax; - uint8_t i, iPeak; - uint32_t f, fPeak; - uint16_t scanStep; - uint8_t measurementsCount; + uint16_t rssi, rssiMin, rssiMax; + uint8_t i, iPeak; + uint32_t f, fPeak; + uint16_t scanStep; + uint8_t measurementsCount; } ScanInfo; typedef struct RegisterSpec { - const char *name; - uint8_t num; - uint8_t offset; - uint16_t maxValue; - uint16_t inc; + const char *name; + uint8_t num; + uint8_t offset; + uint16_t maxValue; + uint16_t inc; } RegisterSpec; typedef struct PeakInfo { - uint16_t t; - uint16_t rssi; - uint8_t i; - uint32_t f; + uint16_t t; + uint16_t rssi; + uint8_t i; + uint32_t f; } PeakInfo; typedef struct MovingAverage { - uint16_t mean[128]; - uint16_t buf[4][128]; - uint16_t min, mid, max; - uint16_t t; + uint16_t mean[128]; + uint16_t buf[4][128]; + uint16_t min, mid, max; + uint16_t t; } MovingAverage; typedef struct FreqPreset { - char name[16]; - uint32_t fStart; - uint32_t fEnd; - StepsCount stepsCountIndex; - uint8_t stepSizeIndex; - ModulationType modulationType; - BK4819_FilterBandwidth_t listenBW; + char name[16]; + uint32_t fStart; + uint32_t fEnd; + StepsCount stepsCountIndex; + uint8_t stepSizeIndex; + ModulationType modulationType; + BK4819_FilterBandwidth_t listenBW; } FreqPreset; static const FreqPreset freqPresets[] = { - {"17m", 1806800, 1831800, STEPS_128, S_STEP_1_0kHz, MOD_USB, - BK4819_FILTER_BW_NARROWER}, - {"15m", 2100000, 2145000, STEPS_128, S_STEP_1_0kHz, MOD_USB, - BK4819_FILTER_BW_NARROWER}, - {"12m", 2489000, 2514000, STEPS_128, S_STEP_1_0kHz, MOD_USB, - BK4819_FILTER_BW_NARROWER}, - {"CB", 2697500, 2785500, STEPS_128, S_STEP_5_0kHz, MOD_FM, - BK4819_FILTER_BW_NARROW}, - {"10m", 2800000, 2970000, STEPS_128, S_STEP_1_0kHz, MOD_USB, - BK4819_FILTER_BW_NARROWER}, - {"AIR", 11800000, 13500000, STEPS_128, S_STEP_100_0kHz, MOD_AM, - BK4819_FILTER_BW_NARROW}, - {"2m", 14400000, 14600000, STEPS_128, S_STEP_25_0kHz, MOD_FM, - BK4819_FILTER_BW_NARROW}, - {"JD1", 15175000, 15400000, STEPS_128, S_STEP_25_0kHz, MOD_FM, - BK4819_FILTER_BW_NARROW}, - {"JD2", 15500000, 15600000, STEPS_64, S_STEP_25_0kHz, MOD_FM, - BK4819_FILTER_BW_NARROW}, - {"LPD", 43307500, 43477500, STEPS_128, S_STEP_25_0kHz, MOD_FM, - BK4819_FILTER_BW_WIDE}, - {"PMR", 44600625, 44620000, STEPS_16, S_STEP_12_5kHz, MOD_FM, - BK4819_FILTER_BW_NARROW}, - {"FRS/GM 462", 46256250, 46272500, STEPS_16, S_STEP_12_5kHz, MOD_FM, - BK4819_FILTER_BW_NARROW}, - {"FRS/GM 467", 46756250, 46771250, STEPS_16, S_STEP_12_5kHz, MOD_FM, - BK4819_FILTER_BW_NARROW}, + {"17m", 1806800, 1831800, STEPS_128, S_STEP_1_0kHz, MOD_USB, BK4819_FILTER_BW_NARROWER}, + {"15m", 2100000, 2145000, STEPS_128, S_STEP_1_0kHz, MOD_USB, BK4819_FILTER_BW_NARROWER}, + {"12m", 2489000, 2514000, STEPS_128, S_STEP_1_0kHz, MOD_USB, BK4819_FILTER_BW_NARROWER}, + {"CB", 2697500, 2785500, STEPS_128, S_STEP_5_0kHz, MOD_FM, BK4819_FILTER_BW_NARROW }, + {"10m", 2800000, 2970000, STEPS_128, S_STEP_1_0kHz, MOD_USB, BK4819_FILTER_BW_NARROWER}, + {"AIR", 11800000, 13500000, STEPS_128, S_STEP_100_0kHz, MOD_AM, BK4819_FILTER_BW_NARROW }, + {"2m", 14400000, 14600000, STEPS_128, S_STEP_25_0kHz, MOD_FM, BK4819_FILTER_BW_NARROW }, + {"JD1", 15175000, 15400000, STEPS_128, S_STEP_25_0kHz, MOD_FM, BK4819_FILTER_BW_NARROW }, + {"JD2", 15500000, 15600000, STEPS_64, S_STEP_25_0kHz, MOD_FM, BK4819_FILTER_BW_NARROW }, + {"LPD", 43307500, 43477500, STEPS_128, S_STEP_25_0kHz, MOD_FM, BK4819_FILTER_BW_WIDE }, + {"PMR", 44600625, 44620000, STEPS_16, S_STEP_12_5kHz, MOD_FM, BK4819_FILTER_BW_NARROW }, + {"FRS/GM 462", 46256250, 46272500, STEPS_16, S_STEP_12_5kHz, MOD_FM, BK4819_FILTER_BW_NARROW }, + {"FRS/GM 467", 46756250, 46771250, STEPS_16, S_STEP_12_5kHz, MOD_FM, BK4819_FILTER_BW_NARROW }, }; void APP_RunSpectrum(void); -#endif /* ifndef SPECTRUM_H */ - -// vim: ft=c +#endif diff --git a/app/uart.c b/app/uart.c index 61d1ac5..561998b 100644 --- a/app/uart.c +++ b/app/uart.c @@ -390,16 +390,16 @@ static void CMD_052F(const uint8_t *pBuffer) { const CMD_052F_t *pCmd = (const CMD_052F_t *)pBuffer; - gEeprom.DUAL_WATCH = DUAL_WATCH_OFF; - gEeprom.CROSS_BAND_RX_TX = CROSS_BAND_OFF; - gEeprom.RX_VFO = 0; - gEeprom.DTMF_SIDE_TONE = false; - gEeprom.VfoInfo[0].FrequencyReverse = false; - gEeprom.VfoInfo[0].pRX = &gEeprom.VfoInfo[0].freq_config_RX; - gEeprom.VfoInfo[0].pTX = &gEeprom.VfoInfo[0].freq_config_TX; - gEeprom.VfoInfo[0].TX_OFFSET_FREQUENCY_DIRECTION = TX_OFFSET_FREQUENCY_DIRECTION_OFF; - gEeprom.VfoInfo[0].DTMF_PTT_ID_TX_MODE = PTT_ID_OFF; - gEeprom.VfoInfo[0].DTMF_DECODING_ENABLE = false; + g_eeprom.dual_watch = DUAL_WATCH_OFF; + g_eeprom.cross_vfo_rx_tx = CROSS_BAND_OFF; + g_eeprom.rx_vfo = 0; + g_eeprom.DTMF_side_tone = false; + g_eeprom.VfoInfo[0].frequency_reverse = false; + g_eeprom.VfoInfo[0].pRX = &g_eeprom.VfoInfo[0].freq_config_rx; + g_eeprom.VfoInfo[0].pTX = &g_eeprom.VfoInfo[0].freq_config_tx; + g_eeprom.VfoInfo[0].tx_offset_freq_dir = TX_OFFSET_FREQ_DIR_OFF; + g_eeprom.VfoInfo[0].DTMF_ptt_id_tx_mode = PTT_ID_OFF; + g_eeprom.VfoInfo[0].DTMF_decoding_enable = false; #ifdef ENABLE_NOAA gIsNoaaMode = false; diff --git a/audio.c b/audio.c index b46fd44..2fbbde5 100644 --- a/audio.c +++ b/audio.c @@ -59,12 +59,12 @@ 0x41, 0x32, 0x3C, 0x37, }; - VOICE_ID_t gVoiceID[8]; - uint8_t gVoiceReadIndex; - uint8_t gVoiceWriteIndex; - volatile uint16_t gCountdownToPlayNextVoice_10ms; - volatile bool gFlagPlayQueuedVoice; - VOICE_ID_t gAnotherVoiceID = VOICE_ID_INVALID; + voice_id_t g_voice_id[8]; + uint8_t g_voice_read_index; + uint8_t g_voice_write_index; + volatile uint16_t g_count_down_to_play_next_voice_10ms; + volatile bool g_flag_play_queued_voice; + voice_id_t g_another_voice_id = VOICE_ID_INVALID; #endif @@ -81,7 +81,7 @@ void AUDIO_PlayBeep(BEEP_Type_t Beep) Beep != BEEP_440HZ_500MS && Beep != BEEP_880HZ_200MS && Beep != BEEP_880HZ_500MS && - !gEeprom.BEEP_CONTROL) + !g_eeprom.beep_control) return; #ifdef ENABLE_AIRCOPY @@ -99,7 +99,7 @@ void AUDIO_PlayBeep(BEEP_Type_t Beep) GPIO_ClearBit(&GPIOC->DATA, GPIOC_PIN_AUDIO_PATH); - if (gCurrentFunction == FUNCTION_POWER_SAVE && gRxIdleMode) + if (gCurrentFunction == FUNCTION_POWER_SAVE && g_rx_idle_mode) BK4819_RX_TurnOn(); #ifdef ENABLE_FMRADIO @@ -209,7 +209,7 @@ void AUDIO_PlayBeep(BEEP_Type_t Beep) BK1080_Mute(false); #endif - if (gCurrentFunction == FUNCTION_POWER_SAVE && gRxIdleMode) + if (gCurrentFunction == FUNCTION_POWER_SAVE && g_rx_idle_mode) BK4819_Sleep(); } @@ -244,11 +244,11 @@ void AUDIO_PlayBeep(BEEP_Type_t Beep) uint8_t VoiceID; uint8_t Delay; - VoiceID = gVoiceID[0]; + VoiceID = g_voice_id[0]; - if (gEeprom.VOICE_PROMPT != VOICE_PROMPT_OFF && gVoiceWriteIndex > 0) + if (g_eeprom.voice_prompt != VOICE_PROMPT_OFF && g_voice_write_index > 0) { - if (gEeprom.VOICE_PROMPT == VOICE_PROMPT_CHINESE) + if (g_eeprom.voice_prompt == VOICE_PROMPT_CHINESE) { // Chinese if (VoiceID >= ARRAY_SIZE(VoiceClipLengthChinese)) goto Bailout; @@ -284,7 +284,7 @@ void AUDIO_PlayBeep(BEEP_Type_t Beep) SYSTEM_DelayMs(5); AUDIO_PlayVoice(VoiceID); - if (gVoiceWriteIndex == 1) + if (g_voice_write_index == 1) Delay += 3; if (bFlag) @@ -294,7 +294,7 @@ void AUDIO_PlayBeep(BEEP_Type_t Beep) if (gCurrentFunction == FUNCTION_RECEIVE || gCurrentFunction == FUNCTION_MONITOR || gCurrentFunction == FUNCTION_INCOMING) // 1of11 - BK4819_SetAF(gRxVfo->AM_mode ? BK4819_AF_AM : BK4819_AF_FM); + BK4819_SetAF(gRxVfo->am_mode ? BK4819_AF_AM : BK4819_AF_FM); #ifdef ENABLE_FMRADIO if (gFmRadioMode) @@ -304,8 +304,8 @@ void AUDIO_PlayBeep(BEEP_Type_t Beep) if (!gEnableSpeaker) GPIO_ClearBit(&GPIOC->DATA, GPIOC_PIN_AUDIO_PATH); - gVoiceWriteIndex = 0; - gVoiceReadIndex = 0; + g_voice_write_index = 0; + g_voice_read_index = 0; #ifdef ENABLE_VOX gVoxResumeCountdown = 80; @@ -314,32 +314,32 @@ void AUDIO_PlayBeep(BEEP_Type_t Beep) return; } - gVoiceReadIndex = 1; - gCountdownToPlayNextVoice_10ms = Delay; - gFlagPlayQueuedVoice = false; + g_voice_read_index = 1; + g_count_down_to_play_next_voice_10ms = Delay; + g_flag_play_queued_voice = false; return; } Bailout: - gVoiceReadIndex = 0; - gVoiceWriteIndex = 0; + g_voice_read_index = 0; + g_voice_write_index = 0; } - void AUDIO_SetVoiceID(uint8_t Index, VOICE_ID_t VoiceID) + void AUDIO_SetVoiceID(uint8_t Index, voice_id_t VoiceID) { - if (Index >= ARRAY_SIZE(gVoiceID)) + if (Index >= ARRAY_SIZE(g_voice_id)) return; if (Index == 0) { - gVoiceWriteIndex = 0; - gVoiceReadIndex = 0; + g_voice_write_index = 0; + g_voice_read_index = 0; } - gVoiceID[Index] = VoiceID; + g_voice_id[Index] = VoiceID; - gVoiceWriteIndex++; + g_voice_write_index++; } uint8_t AUDIO_SetDigitVoice(uint8_t Index, uint16_t Value) @@ -350,8 +350,8 @@ void AUDIO_PlayBeep(BEEP_Type_t Beep) if (Index == 0) { - gVoiceWriteIndex = 0; - gVoiceReadIndex = 0; + g_voice_write_index = 0; + g_voice_read_index = 0; } Count = 0; @@ -365,17 +365,17 @@ void AUDIO_PlayBeep(BEEP_Type_t Beep) else { Result = Remainder / 100U; - gVoiceID[gVoiceWriteIndex++] = (VOICE_ID_t)Result; + g_voice_id[g_voice_write_index++] = (voice_id_t)Result; Count++; Remainder -= Result * 100U; } Result = Remainder / 10U; - gVoiceID[gVoiceWriteIndex++] = (VOICE_ID_t)Result; + g_voice_id[g_voice_write_index++] = (voice_id_t)Result; Count++; Remainder -= Result * 10U; Skip: - gVoiceID[gVoiceWriteIndex++] = (VOICE_ID_t)Remainder; + g_voice_id[g_voice_write_index++] = (voice_id_t)Remainder; return Count + 1U; } @@ -388,10 +388,10 @@ void AUDIO_PlayBeep(BEEP_Type_t Beep) Skip = false; - if (gVoiceReadIndex != gVoiceWriteIndex && gEeprom.VOICE_PROMPT != VOICE_PROMPT_OFF) + if (g_voice_read_index != g_voice_write_index && g_eeprom.voice_prompt != VOICE_PROMPT_OFF) { - VoiceID = gVoiceID[gVoiceReadIndex]; - if (gEeprom.VOICE_PROMPT == VOICE_PROMPT_CHINESE) + VoiceID = g_voice_id[g_voice_read_index]; + if (g_eeprom.voice_prompt == VOICE_PROMPT_CHINESE) { if (VoiceID < ARRAY_SIZE(VoiceClipLengthChinese)) { @@ -412,17 +412,17 @@ void AUDIO_PlayBeep(BEEP_Type_t Beep) Skip = true; } - gVoiceReadIndex++; + g_voice_read_index++; if (!Skip) { - if (gVoiceReadIndex == gVoiceWriteIndex) + if (g_voice_read_index == g_voice_write_index) Delay += 3; AUDIO_PlayVoice(VoiceID); - gCountdownToPlayNextVoice_10ms = Delay; - gFlagPlayQueuedVoice = false; + g_count_down_to_play_next_voice_10ms = Delay; + g_flag_play_queued_voice = false; #ifdef ENABLE_VOX gVoxResumeCountdown = 2000; @@ -435,7 +435,7 @@ void AUDIO_PlayBeep(BEEP_Type_t Beep) if (gCurrentFunction == FUNCTION_RECEIVE || gCurrentFunction == FUNCTION_MONITOR || gCurrentFunction == FUNCTION_INCOMING) // 1of11 - BK4819_SetAF(gRxVfo->AM_mode ? BK4819_AF_AM : BK4819_AF_FM); + BK4819_SetAF(gRxVfo->am_mode ? BK4819_AF_AM : BK4819_AF_FM); #ifdef ENABLE_FMRADIO if (gFmRadioMode) @@ -449,8 +449,8 @@ void AUDIO_PlayBeep(BEEP_Type_t Beep) gVoxResumeCountdown = 80; #endif - gVoiceWriteIndex = 0; - gVoiceReadIndex = 0; + g_voice_write_index = 0; + g_voice_read_index = 0; } #endif diff --git a/audio.h b/audio.h index 86b5928..7e7dd14 100644 --- a/audio.h +++ b/audio.h @@ -46,101 +46,100 @@ enum VOICE_ID_ENG_BASE = 0x60U, }; -enum VOICE_ID_t +enum voice_id_e { - VOICE_ID_0 = 0x00U, - VOICE_ID_1 = 0x01U, - VOICE_ID_2 = 0x02U, - VOICE_ID_3 = 0x03U, - VOICE_ID_4 = 0x04U, - VOICE_ID_5 = 0x05U, - VOICE_ID_6 = 0x06U, - VOICE_ID_7 = 0x07U, - VOICE_ID_8 = 0x08U, - VOICE_ID_9 = 0x09U, - VOICE_ID_10 = 0x0AU, - VOICE_ID_100 = 0x0BU, - VOICE_ID_WELCOME = 0x0CU, - VOICE_ID_LOCK = 0x0DU, - VOICE_ID_UNLOCK = 0x0EU, - VOICE_ID_SCANNING_BEGIN = 0x0FU, - VOICE_ID_SCANNING_STOP = 0x10U, - VOICE_ID_SCRAMBLER_ON = 0x11U, - VOICE_ID_SCRAMBLER_OFF = 0x12U, - VOICE_ID_FUNCTION = 0x13U, - VOICE_ID_CTCSS = 0x14U, - VOICE_ID_DCS = 0x15U, - VOICE_ID_POWER = 0x16U, - VOICE_ID_SAVE_MODE = 0x17U, - VOICE_ID_MEMORY_CHANNEL = 0x18U, - VOICE_ID_DELETE_CHANNEL = 0x19U, - VOICE_ID_FREQUENCY_STEP = 0x1AU, - VOICE_ID_SQUELCH = 0x1BU, - VOICE_ID_TRANSMIT_OVER_TIME = 0x1CU, - VOICE_ID_BACKLIGHT_SELECTION = 0x1DU, - VOICE_ID_VOX = 0x1EU, - VOICE_ID_TX_OFFSET_FREQUENCY_DIRECTION = 0x1FU, - VOICE_ID_TX_OFFSET_FREQUENCY = 0x20U, - VOICE_ID_TRANSMITING_MEMORY = 0x21U, - VOICE_ID_RECEIVING_MEMORY = 0x22U, - VOICE_ID_EMERGENCY_CALL = 0x23U, - VOICE_ID_LOW_VOLTAGE = 0x24U, - VOICE_ID_CHANNEL_MODE = 0x25U, - VOICE_ID_FREQUENCY_MODE = 0x26U, - VOICE_ID_VOICE_PROMPT = 0x27U, - VOICE_ID_BAND_SELECTION = 0x28U, - VOICE_ID_DUAL_STANDBY = 0x29U, - VOICE_ID_CHANNEL_BANDWIDTH = 0x2AU, - VOICE_ID_OPTIONAL_SIGNAL = 0x2BU, - VOICE_ID_MUTE_MODE = 0x2CU, - VOICE_ID_BUSY_LOCKOUT = 0x2DU, - VOICE_ID_BEEP_PROMPT = 0x2EU, - VOICE_ID_ANI_CODE = 0x2FU, - VOICE_ID_INITIALISATION = 0x30U, - VOICE_ID_CONFIRM = 0x31U, - VOICE_ID_CANCEL = 0x32U, - VOICE_ID_ON = 0x33U, - VOICE_ID_OFF = 0x34U, - VOICE_ID_2_TONE = 0x35U, - VOICE_ID_5_TONE = 0x36U, - VOICE_ID_DIGITAL_SIGNAL = 0x37U, - VOICE_ID_REPEATER = 0x38U, - VOICE_ID_MENU = 0x39U, - VOICE_ID_11 = 0x3AU, - VOICE_ID_12 = 0x3BU, - VOICE_ID_13 = 0x3CU, - VOICE_ID_14 = 0x3DU, - VOICE_ID_15 = 0x3EU, - VOICE_ID_16 = 0x3FU, - VOICE_ID_17 = 0x40U, - VOICE_ID_18 = 0x41U, - VOICE_ID_19 = 0x42U, - VOICE_ID_20 = 0x43U, - VOICE_ID_30 = 0x44U, - VOICE_ID_40 = 0x45U, - VOICE_ID_50 = 0x46U, - VOICE_ID_60 = 0x47U, - VOICE_ID_70 = 0x48U, - VOICE_ID_80 = 0x49U, - VOICE_ID_90 = 0x4AU, - VOICE_ID_END = 0x4BU, - - VOICE_ID_INVALID = 0xFFU, + VOICE_ID_0 = 0x00U, + VOICE_ID_1 = 0x01U, + VOICE_ID_2 = 0x02U, + VOICE_ID_3 = 0x03U, + VOICE_ID_4 = 0x04U, + VOICE_ID_5 = 0x05U, + VOICE_ID_6 = 0x06U, + VOICE_ID_7 = 0x07U, + VOICE_ID_8 = 0x08U, + VOICE_ID_9 = 0x09U, + VOICE_ID_10 = 0x0AU, + VOICE_ID_100 = 0x0BU, + VOICE_ID_WELCOME = 0x0CU, + VOICE_ID_LOCK = 0x0DU, + VOICE_ID_UNLOCK = 0x0EU, + VOICE_ID_SCANNING_BEGIN = 0x0FU, + VOICE_ID_SCANNING_STOP = 0x10U, + VOICE_ID_SCRAMBLER_ON = 0x11U, + VOICE_ID_SCRAMBLER_OFF = 0x12U, + VOICE_ID_FUNCTION = 0x13U, + VOICE_ID_CTCSS = 0x14U, + VOICE_ID_DCS = 0x15U, + VOICE_ID_POWER = 0x16U, + VOICE_ID_SAVE_MODE = 0x17U, + VOICE_ID_MEMORY_CHANNEL = 0x18U, + VOICE_ID_DELETE_CHANNEL = 0x19U, + VOICE_ID_FREQUENCY_STEP = 0x1AU, + VOICE_ID_SQUELCH = 0x1BU, + voice_id_tRANSMIT_OVER_TIME = 0x1CU, + VOICE_ID_BACKLIGHT_SELECTION = 0x1DU, + VOICE_ID_VOX = 0x1EU, + voice_id_tX_OFFSET_FREQ_DIR = 0x1FU, + voice_id_tX_OFFSET_FREQ = 0x20U, + voice_id_tRANSMITING_MEMORY = 0x21U, + VOICE_ID_RECEIVING_MEMORY = 0x22U, + VOICE_ID_EMERGENCY_CALL = 0x23U, + VOICE_ID_LOW_VOLTAGE = 0x24U, + VOICE_ID_CHANNEL_MODE = 0x25U, + VOICE_ID_FREQUENCY_MODE = 0x26U, + VOICE_ID_VOICE_PROMPT = 0x27U, + VOICE_ID_BAND_SELECTION = 0x28U, + VOICE_ID_DUAL_STANDBY = 0x29U, + VOICE_ID_CHANNEL_BANDWIDTH = 0x2AU, + VOICE_ID_OPTIONAL_SIGNAL = 0x2BU, + VOICE_ID_MUTE_MODE = 0x2CU, + VOICE_ID_BUSY_LOCKOUT = 0x2DU, + VOICE_ID_BEEP_PROMPT = 0x2EU, + VOICE_ID_ANI_CODE = 0x2FU, + VOICE_ID_INITIALISATION = 0x30U, + VOICE_ID_CONFIRM = 0x31U, + VOICE_ID_CANCEL = 0x32U, + VOICE_ID_ON = 0x33U, + VOICE_ID_OFF = 0x34U, + VOICE_ID_2_TONE = 0x35U, + VOICE_ID_5_TONE = 0x36U, + VOICE_ID_DIGITAL_SIGNAL = 0x37U, + VOICE_ID_REPEATER = 0x38U, + VOICE_ID_MENU = 0x39U, + VOICE_ID_11 = 0x3AU, + VOICE_ID_12 = 0x3BU, + VOICE_ID_13 = 0x3CU, + VOICE_ID_14 = 0x3DU, + VOICE_ID_15 = 0x3EU, + VOICE_ID_16 = 0x3FU, + VOICE_ID_17 = 0x40U, + VOICE_ID_18 = 0x41U, + VOICE_ID_19 = 0x42U, + VOICE_ID_20 = 0x43U, + VOICE_ID_30 = 0x44U, + VOICE_ID_40 = 0x45U, + VOICE_ID_50 = 0x46U, + VOICE_ID_60 = 0x47U, + VOICE_ID_70 = 0x48U, + VOICE_ID_80 = 0x49U, + VOICE_ID_90 = 0x4AU, + VOICE_ID_END = 0x4BU, + + VOICE_ID_INVALID = 0xFFU, }; - -typedef enum VOICE_ID_t VOICE_ID_t; +typedef enum voice_id_e voice_id_t; #ifdef ENABLE_VOICE - extern VOICE_ID_t gVoiceID[8]; - extern uint8_t gVoiceReadIndex; - extern uint8_t gVoiceWriteIndex; - extern volatile uint16_t gCountdownToPlayNextVoice_10ms; - extern volatile bool gFlagPlayQueuedVoice; - extern VOICE_ID_t gAnotherVoiceID; + extern voice_id_t g_voice_id[8]; + extern uint8_t g_voice_read_index; + extern uint8_t g_voice_write_index; + extern volatile uint16_t g_count_down_to_play_next_voice_10ms; + extern volatile bool g_flag_play_queued_voice; + extern voice_id_t g_another_voice_id; void AUDIO_PlayVoice(uint8_t VoiceID); void AUDIO_PlaySingleVoice(bool bFlag); - void AUDIO_SetVoiceID(uint8_t Index, VOICE_ID_t VoiceID); + void AUDIO_SetVoiceID(uint8_t Index, voice_id_t VoiceID); uint8_t AUDIO_SetDigitVoice(uint8_t Index, uint16_t Value); void AUDIO_PlayQueuedVoice(void); #endif diff --git a/board.c b/board.c index 1aea112..44764d6 100644 --- a/board.c +++ b/board.c @@ -525,40 +525,40 @@ void BOARD_EEPROM_Init(void) // 0E70..0E77 EEPROM_ReadBuffer(0x0E70, Data, 8); - gEeprom.CHAN_1_CALL = IS_MR_CHANNEL(Data[0]) ? Data[0] : MR_CHANNEL_FIRST; - gEeprom.SQUELCH_LEVEL = (Data[1] < 10) ? Data[1] : 1; - gEeprom.TX_TIMEOUT_TIMER = (Data[2] < 11) ? Data[2] : 1; + g_eeprom.chan_1_call = IS_USER_CHANNEL(Data[0]) ? Data[0] : USER_CHANNEL_FIRST; + g_eeprom.squelch_level = (Data[1] < 10) ? Data[1] : 1; + g_eeprom.tx_timeout_timer = (Data[2] < 11) ? Data[2] : 1; #ifdef ENABLE_NOAA - gEeprom.NOAA_AUTO_SCAN = (Data[3] < 2) ? Data[3] : false; + g_eeprom.NOAA_auto_scan = (Data[3] < 2) ? Data[3] : false; #endif - gEeprom.KEY_LOCK = (Data[4] < 2) ? Data[4] : false; + g_eeprom.key_lock = (Data[4] < 2) ? Data[4] : false; #ifdef ENABLE_VOX - gEeprom.VOX_SWITCH = (Data[5] < 2) ? Data[5] : false; - gEeprom.VOX_LEVEL = (Data[6] < 10) ? Data[6] : 1; + g_eeprom.vox_switch = (Data[5] < 2) ? Data[5] : false; + g_eeprom.vox_level = (Data[6] < 10) ? Data[6] : 1; #endif - gEeprom.MIC_SENSITIVITY = (Data[7] < 5) ? Data[7] : 4; + g_eeprom.mic_sensitivity = (Data[7] < 5) ? Data[7] : 4; // 0E78..0E7F EEPROM_ReadBuffer(0x0E78, Data, 8); - gEeprom.CHANNEL_DISPLAY_MODE = (Data[1] < 4) ? Data[1] : MDF_FREQUENCY; // 4 instead of 3 - extra display mode - gEeprom.CROSS_BAND_RX_TX = (Data[2] < 3) ? Data[2] : CROSS_BAND_OFF; - gEeprom.BATTERY_SAVE = (Data[3] < 5) ? Data[3] : 4; - gEeprom.DUAL_WATCH = (Data[4] < 3) ? Data[4] : DUAL_WATCH_CHAN_A; - gEeprom.BACKLIGHT = (Data[5] < ARRAY_SIZE(gSubMenu_BACKLIGHT)) ? Data[5] : 3; - gEeprom.TAIL_NOTE_ELIMINATION = (Data[6] < 2) ? Data[6] : false; - gEeprom.VFO_OPEN = (Data[7] < 2) ? Data[7] : true; + g_eeprom.channel_display_mode = (Data[1] < 4) ? Data[1] : MDF_FREQUENCY; // 4 instead of 3 - extra display mode + g_eeprom.cross_vfo_rx_tx = (Data[2] < 3) ? Data[2] : CROSS_BAND_OFF; + g_eeprom.battery_save = (Data[3] < 5) ? Data[3] : 4; + g_eeprom.dual_watch = (Data[4] < 3) ? Data[4] : DUAL_WATCH_CHAN_A; + g_eeprom.backlight = (Data[5] < ARRAY_SIZE(gSubMenu_backlight)) ? Data[5] : 3; + g_eeprom.tail_note_elimination = (Data[6] < 2) ? Data[6] : false; + g_eeprom.vfo_open = (Data[7] < 2) ? Data[7] : true; // 0E80..0E87 EEPROM_ReadBuffer(0x0E80, Data, 8); - gEeprom.ScreenChannel[0] = IS_VALID_CHANNEL(Data[0]) ? Data[0] : (FREQ_CHANNEL_FIRST + BAND6_400MHz); - gEeprom.ScreenChannel[1] = IS_VALID_CHANNEL(Data[3]) ? Data[3] : (FREQ_CHANNEL_FIRST + BAND6_400MHz); - gEeprom.MrChannel[0] = IS_MR_CHANNEL(Data[1]) ? Data[1] : MR_CHANNEL_FIRST; - gEeprom.MrChannel[1] = IS_MR_CHANNEL(Data[4]) ? Data[4] : MR_CHANNEL_FIRST; - gEeprom.FreqChannel[0] = IS_FREQ_CHANNEL(Data[2]) ? Data[2] : (FREQ_CHANNEL_FIRST + BAND6_400MHz); - gEeprom.FreqChannel[1] = IS_FREQ_CHANNEL(Data[5]) ? Data[5] : (FREQ_CHANNEL_FIRST + BAND6_400MHz); + g_eeprom.screen_channel[0] = IS_VALID_CHANNEL(Data[0]) ? Data[0] : (FREQ_CHANNEL_FIRST + BAND6_400MHz); + g_eeprom.screen_channel[1] = IS_VALID_CHANNEL(Data[3]) ? Data[3] : (FREQ_CHANNEL_FIRST + BAND6_400MHz); + g_eeprom.user_channel[0] = IS_USER_CHANNEL(Data[1]) ? Data[1] : USER_CHANNEL_FIRST; + g_eeprom.user_channel[1] = IS_USER_CHANNEL(Data[4]) ? Data[4] : USER_CHANNEL_FIRST; + g_eeprom.freq_channel[0] = IS_FREQ_CHANNEL(Data[2]) ? Data[2] : (FREQ_CHANNEL_FIRST + BAND6_400MHz); + g_eeprom.freq_channel[1] = IS_FREQ_CHANNEL(Data[5]) ? Data[5] : (FREQ_CHANNEL_FIRST + BAND6_400MHz); #ifdef ENABLE_NOAA - gEeprom.NoaaChannel[0] = IS_NOAA_CHANNEL(Data[6]) ? Data[6] : NOAA_CHANNEL_FIRST; - gEeprom.NoaaChannel[1] = IS_NOAA_CHANNEL(Data[7]) ? Data[7] : NOAA_CHANNEL_FIRST; + g_eeprom.noaa_channel[0] = IS_NOAA_CHANNEL(Data[6]) ? Data[6] : NOAA_CHANNEL_FIRST; + g_eeprom.noaa_channel[1] = IS_NOAA_CHANNEL(Data[7]) ? Data[7] : NOAA_CHANNEL_FIRST; #endif #ifdef ENABLE_FMRADIO @@ -572,15 +572,15 @@ void BOARD_EEPROM_Init(void) } __attribute__((packed)) FM; EEPROM_ReadBuffer(0x0E88, &FM, 8); - gEeprom.FM_LowerLimit = 760; - gEeprom.FM_UpperLimit = 1080; - if (FM.SelectedFrequency < gEeprom.FM_LowerLimit || FM.SelectedFrequency > gEeprom.FM_UpperLimit) - gEeprom.FM_SelectedFrequency = 960; + g_eeprom.fm_lower_limit = 760; + g_eeprom.fm_upper_limit = 1080; + if (FM.SelectedFrequency < g_eeprom.fm_lower_limit || FM.SelectedFrequency > g_eeprom.fm_upper_limit) + g_eeprom.fm_selected_frequency = 960; else - gEeprom.FM_SelectedFrequency = FM.SelectedFrequency; + g_eeprom.fm_selected_frequency = FM.SelectedFrequency; - gEeprom.FM_SelectedChannel = FM.SelectedChannel; - gEeprom.FM_IsMrMode = (FM.IsMrMode < 2) ? FM.IsMrMode : false; + g_eeprom.fm_selected_channel = FM.SelectedChannel; + g_eeprom.fm_is_channel_mode = (FM.IsMrMode < 2) ? FM.IsMrMode : false; } // 0E40..0E67 @@ -590,111 +590,111 @@ void BOARD_EEPROM_Init(void) // 0E90..0E97 EEPROM_ReadBuffer(0x0E90, Data, 8); - gEeprom.BEEP_CONTROL = (Data[0] < 2) ? Data[0] : true; - gEeprom.KEY_1_SHORT_PRESS_ACTION = (Data[1] < ACTION_OPT_LEN) ? Data[1] : ACTION_OPT_MONITOR; - gEeprom.KEY_1_LONG_PRESS_ACTION = (Data[2] < ACTION_OPT_LEN) ? Data[2] : ACTION_OPT_FLASHLIGHT; - gEeprom.KEY_2_SHORT_PRESS_ACTION = (Data[3] < ACTION_OPT_LEN) ? Data[3] : ACTION_OPT_SCAN; - gEeprom.KEY_2_LONG_PRESS_ACTION = (Data[4] < ACTION_OPT_LEN) ? Data[4] : ACTION_OPT_NONE; - gEeprom.SCAN_RESUME_MODE = (Data[5] < 3) ? Data[5] : SCAN_RESUME_CO; - gEeprom.AUTO_KEYPAD_LOCK = (Data[6] < 2) ? Data[6] : false; - gEeprom.POWER_ON_DISPLAY_MODE = (Data[7] < 4) ? Data[7] : POWER_ON_DISPLAY_MODE_VOLTAGE; + g_eeprom.beep_control = (Data[0] < 2) ? Data[0] : true; + g_eeprom.key1_short_press_action = (Data[1] < ACTION_OPT_LEN) ? Data[1] : ACTION_OPT_MONITOR; + g_eeprom.key1_long_press_action = (Data[2] < ACTION_OPT_LEN) ? Data[2] : ACTION_OPT_FLASHLIGHT; + g_eeprom.key2_short_press_action = (Data[3] < ACTION_OPT_LEN) ? Data[3] : ACTION_OPT_SCAN; + g_eeprom.key2_long_press_action = (Data[4] < ACTION_OPT_LEN) ? Data[4] : ACTION_OPT_NONE; + g_eeprom.scan_resume_mode = (Data[5] < 3) ? Data[5] : SCAN_RESUME_CO; + g_eeprom.auto_keypad_lock = (Data[6] < 2) ? Data[6] : false; + g_eeprom.pwr_on_display_mode = (Data[7] < 4) ? Data[7] : PWR_ON_DISPLAY_MODE_VOLTAGE; // 0E98..0E9F EEPROM_ReadBuffer(0x0E98, Data, 8); - memmove(&gEeprom.POWER_ON_PASSWORD, Data, 4); + memmove(&g_eeprom.power_on_password, Data, 4); // 0EA0..0EA7 #ifdef ENABLE_VOICE EEPROM_ReadBuffer(0x0EA0, Data, 8); - gEeprom.VOICE_PROMPT = (Data[0] < 3) ? Data[0] : VOICE_PROMPT_ENGLISH; + g_eeprom.voice_prompt = (Data[0] < 3) ? Data[0] : VOICE_PROMPT_ENGLISH; #endif // 0EA8..0EAF EEPROM_ReadBuffer(0x0EA8, Data, 8); #ifdef ENABLE_ALARM - gEeprom.ALARM_MODE = (Data[0] < 2) ? Data[0] : true; + g_eeprom.alarm_mode = (Data[0] < 2) ? Data[0] : true; #endif - gEeprom.ROGER = (Data[1] < 3) ? Data[1] : ROGER_MODE_OFF; - gEeprom.REPEATER_TAIL_TONE_ELIMINATION = (Data[2] < 11) ? Data[2] : 0; - gEeprom.TX_VFO = (Data[3] < 2) ? Data[3] : 0; + g_eeprom.roger_mode = (Data[1] < 3) ? Data[1] : ROGER_MODE_OFF; + g_eeprom.repeater_tail_tone_elimination = (Data[2] < 11) ? Data[2] : 0; + g_eeprom.tx_vfo = (Data[3] < 2) ? Data[3] : 0; // 0ED0..0ED7 EEPROM_ReadBuffer(0x0ED0, Data, 8); - gEeprom.DTMF_SIDE_TONE = (Data[0] < 2) ? Data[0] : true; - gEeprom.DTMF_SEPARATE_CODE = DTMF_ValidateCodes((char *)(Data + 1), 1) ? Data[1] : '*'; - gEeprom.DTMF_GROUP_CALL_CODE = DTMF_ValidateCodes((char *)(Data + 2), 1) ? Data[2] : '#'; - gEeprom.DTMF_DECODE_RESPONSE = (Data[3] < 4) ? Data[3] : DTMF_DEC_RESPONSE_RING; - gEeprom.DTMF_auto_reset_time = (Data[4] <= DTMF_HOLD_MAX) ? Data[4] : (Data[4] >= DTMF_HOLD_MIN) ? Data[4] : DTMF_HOLD_MAX; - gEeprom.DTMF_PRELOAD_TIME = (Data[5] < 101) ? Data[5] * 10 : 200; - gEeprom.DTMF_FIRST_CODE_PERSIST_TIME = (Data[6] < 101) ? Data[6] * 10 : 70; - gEeprom.DTMF_HASH_CODE_PERSIST_TIME = (Data[7] < 101) ? Data[7] * 10 : 70; + g_eeprom.DTMF_side_tone = (Data[0] < 2) ? Data[0] : true; + g_eeprom.DTMF_separate_code = DTMF_ValidateCodes((char *)(Data + 1), 1) ? Data[1] : '*'; + g_eeprom.DTMF_group_call_code = DTMF_ValidateCodes((char *)(Data + 2), 1) ? Data[2] : '#'; + g_eeprom.DTMF_decode_response = (Data[3] < 4) ? Data[3] : DTMF_DEC_RESPONSE_RING; + g_eeprom.DTMF_auto_reset_time = (Data[4] <= DTMF_HOLD_MAX) ? Data[4] : (Data[4] >= DTMF_HOLD_MIN) ? Data[4] : DTMF_HOLD_MAX; + g_eeprom.DTMF_preload_time = (Data[5] < 101) ? Data[5] * 10 : 200; + g_eeprom.DTMF_first_code_persist_time = (Data[6] < 101) ? Data[6] * 10 : 70; + g_eeprom.DTMF_hash_code_persist_time = (Data[7] < 101) ? Data[7] * 10 : 70; // 0ED8..0EDF EEPROM_ReadBuffer(0x0ED8, Data, 8); - gEeprom.DTMF_CODE_PERSIST_TIME = (Data[0] < 101) ? Data[0] * 10 : 70; - gEeprom.DTMF_CODE_INTERVAL_TIME = (Data[1] < 101) ? Data[1] * 10 : 70; - gEeprom.PERMIT_REMOTE_KILL = (Data[2] < 2) ? Data[2] : false; + g_eeprom.DTMF_code_persist_time = (Data[0] < 101) ? Data[0] * 10 : 70; + g_eeprom.DTMF_code_interval_time = (Data[1] < 101) ? Data[1] * 10 : 70; + g_eeprom.permit_remote_kill = (Data[2] < 2) ? Data[2] : false; // 0EE0..0EE7 EEPROM_ReadBuffer(0x0EE0, Data, 8); if (DTMF_ValidateCodes((char *)Data, 8)) - memmove(gEeprom.ANI_DTMF_ID, Data, 8); + memmove(g_eeprom.ani_DTMF_id, Data, 8); else { - memset(gEeprom.ANI_DTMF_ID, 0, sizeof(gEeprom.ANI_DTMF_ID)); - strcpy(gEeprom.ANI_DTMF_ID, "123"); + memset(g_eeprom.ani_DTMF_id, 0, sizeof(g_eeprom.ani_DTMF_id)); + strcpy(g_eeprom.ani_DTMF_id, "123"); } // 0EE8..0EEF EEPROM_ReadBuffer(0x0EE8, Data, 8); if (DTMF_ValidateCodes((char *)Data, 8)) - memmove(gEeprom.KILL_CODE, Data, 8); + memmove(g_eeprom.kill_code, Data, 8); else { - memset(gEeprom.KILL_CODE, 0, sizeof(gEeprom.KILL_CODE)); - strcpy(gEeprom.KILL_CODE, "ABCD9"); + memset(g_eeprom.kill_code, 0, sizeof(g_eeprom.kill_code)); + strcpy(g_eeprom.kill_code, "ABCD9"); } // 0EF0..0EF7 EEPROM_ReadBuffer(0x0EF0, Data, 8); if (DTMF_ValidateCodes((char *)Data, 8)) - memmove(gEeprom.REVIVE_CODE, Data, 8); + memmove(g_eeprom.revive_code, Data, 8); else { - memset(gEeprom.REVIVE_CODE, 0, sizeof(gEeprom.REVIVE_CODE)); - strcpy(gEeprom.REVIVE_CODE, "9DCBA"); + memset(g_eeprom.revive_code, 0, sizeof(g_eeprom.revive_code)); + strcpy(g_eeprom.revive_code, "9DCBA"); } // 0EF8..0F07 EEPROM_ReadBuffer(0x0EF8, Data, 16); if (DTMF_ValidateCodes((char *)Data, 16)) - memmove(gEeprom.DTMF_UP_CODE, Data, 16); + memmove(g_eeprom.DTMF_up_code, Data, 16); else { - memset(gEeprom.DTMF_UP_CODE, 0, sizeof(gEeprom.DTMF_UP_CODE)); - strcpy(gEeprom.DTMF_UP_CODE, "12345"); + memset(g_eeprom.DTMF_up_code, 0, sizeof(g_eeprom.DTMF_up_code)); + strcpy(g_eeprom.DTMF_up_code, "12345"); } // 0F08..0F17 EEPROM_ReadBuffer(0x0F08, Data, 16); if (DTMF_ValidateCodes((char *)Data, 16)) - memmove(gEeprom.DTMF_DOWN_CODE, Data, 16); + memmove(g_eeprom.DTMF_down_code, Data, 16); else { - memset(gEeprom.DTMF_DOWN_CODE, 0, sizeof(gEeprom.DTMF_DOWN_CODE)); - strcpy(gEeprom.DTMF_DOWN_CODE, "54321"); + memset(g_eeprom.DTMF_down_code, 0, sizeof(g_eeprom.DTMF_down_code)); + strcpy(g_eeprom.DTMF_down_code, "54321"); } // 0F18..0F1F EEPROM_ReadBuffer(0x0F18, Data, 8); -// gEeprom.SCAN_LIST_DEFAULT = (Data[0] < 2) ? Data[0] : false; - gEeprom.SCAN_LIST_DEFAULT = (Data[0] < 3) ? Data[0] : false; // we now have 'all' channel scan option +// g_eeprom.scan_list_default = (Data[0] < 2) ? Data[0] : false; + g_eeprom.scan_list_default = (Data[0] < 3) ? Data[0] : false; // we now have 'all' channel scan option for (i = 0; i < 2; i++) { const unsigned int j = 1 + (i * 3); - gEeprom.SCAN_LIST_ENABLED[i] = (Data[j + 0] < 2) ? Data[j] : false; - gEeprom.SCANLIST_PRIORITY_CH1[i] = Data[j + 1]; - gEeprom.SCANLIST_PRIORITY_CH2[i] = Data[j + 2]; + g_eeprom.scan_list_enabled[i] = (Data[j + 0] < 2) ? Data[j] : false; + g_eeprom.scan_list_priority_ch1[i] = Data[j + 1]; + g_eeprom.scan_list_priority_ch2[i] = Data[j + 2]; } // 0F40..0F47 @@ -717,14 +717,14 @@ void BOARD_EEPROM_Init(void) #endif gSetting_backlight_on_tx_rx = (Data[7] >> 6) & 3u; - if (!gEeprom.VFO_OPEN) + if (!g_eeprom.vfo_open) { - gEeprom.ScreenChannel[0] = gEeprom.MrChannel[0]; - gEeprom.ScreenChannel[1] = gEeprom.MrChannel[1]; + g_eeprom.screen_channel[0] = g_eeprom.user_channel[0]; + g_eeprom.screen_channel[1] = g_eeprom.user_channel[1]; } // 0D60..0E27 - EEPROM_ReadBuffer(0x0D60, gMR_ChannelAttributes, sizeof(gMR_ChannelAttributes)); + EEPROM_ReadBuffer(0x0D60, gUSER_ChannelAttributes, sizeof(gUSER_ChannelAttributes)); // 0F30..0F3F EEPROM_ReadBuffer(0x0F30, gCustomAesKey, sizeof(gCustomAesKey)); @@ -743,14 +743,14 @@ void BOARD_EEPROM_LoadMoreSettings(void) { // uint8_t Mic; - EEPROM_ReadBuffer(0x1EC0, gEEPROM_1EC0_0, 8); - memmove(gEEPROM_1EC0_1, gEEPROM_1EC0_0, 8); - memmove(gEEPROM_1EC0_2, gEEPROM_1EC0_0, 8); - memmove(gEEPROM_1EC0_3, gEEPROM_1EC0_0, 8); + EEPROM_ReadBuffer(0x1EC0, g_eeprom_1EC0_0, 8); + memmove(g_eeprom_1EC0_1, g_eeprom_1EC0_0, 8); + memmove(g_eeprom_1EC0_2, g_eeprom_1EC0_0, 8); + memmove(g_eeprom_1EC0_3, g_eeprom_1EC0_0, 8); // 8 * 16-bit values - EEPROM_ReadBuffer(0x1EC0, gEEPROM_RSSI_CALIB[0], 8); - EEPROM_ReadBuffer(0x1EC8, gEEPROM_RSSI_CALIB[1], 8); + EEPROM_ReadBuffer(0x1EC0, g_eeprom_RSSI_CALIB[0], 8); + EEPROM_ReadBuffer(0x1EC8, g_eeprom_RSSI_CALIB[1], 8); EEPROM_ReadBuffer(0x1F40, gBatteryCalibration, 12); if (gBatteryCalibration[0] >= 5000) @@ -761,13 +761,13 @@ void BOARD_EEPROM_LoadMoreSettings(void) gBatteryCalibration[5] = 2300; #ifdef ENABLE_VOX - EEPROM_ReadBuffer(0x1F50 + (gEeprom.VOX_LEVEL * 2), &gEeprom.VOX1_THRESHOLD, 2); - EEPROM_ReadBuffer(0x1F68 + (gEeprom.VOX_LEVEL * 2), &gEeprom.VOX0_THRESHOLD, 2); + EEPROM_ReadBuffer(0x1F50 + (g_eeprom.vox_level * 2), &g_eeprom.vox1_threshold, 2); + EEPROM_ReadBuffer(0x1F68 + (g_eeprom.vox_level * 2), &g_eeprom.vox0_threshold, 2); #endif - //EEPROM_ReadBuffer(0x1F80 + gEeprom.MIC_SENSITIVITY, &Mic, 1); - //gEeprom.MIC_SENSITIVITY_TUNING = (Mic < 32) ? Mic : 15; - gEeprom.MIC_SENSITIVITY_TUNING = gMicGain_dB2[gEeprom.MIC_SENSITIVITY]; + //EEPROM_ReadBuffer(0x1F80 + g_eeprom.mic_sensitivity, &Mic, 1); + //g_eeprom.mic_sensitivity_tuning = (Mic < 32) ? Mic : 15; + g_eeprom.mic_sensitivity_tuning = gMicGain_dB2[g_eeprom.mic_sensitivity]; { struct @@ -775,22 +775,22 @@ void BOARD_EEPROM_LoadMoreSettings(void) int16_t BK4819_XtalFreqLow; uint16_t EEPROM_1F8A; uint16_t EEPROM_1F8C; - uint8_t VOLUME_GAIN; - uint8_t DAC_GAIN; + uint8_t volume_gain; + uint8_t dac_gain; } __attribute__((packed)) Misc; // radio 1 .. 04 00 46 00 50 00 2C 0E // radio 2 .. 05 00 46 00 50 00 2C 0E EEPROM_ReadBuffer(0x1F88, &Misc, 8); - gEeprom.BK4819_XTAL_FREQ_LOW = (Misc.BK4819_XtalFreqLow >= -1000 && Misc.BK4819_XtalFreqLow <= 1000) ? Misc.BK4819_XtalFreqLow : 0; - gEEPROM_1F8A = Misc.EEPROM_1F8A & 0x01FF; - gEEPROM_1F8C = Misc.EEPROM_1F8C & 0x01FF; - gEeprom.VOLUME_GAIN = (Misc.VOLUME_GAIN < 64) ? Misc.VOLUME_GAIN : 58; - gEeprom.DAC_GAIN = (Misc.DAC_GAIN < 16) ? Misc.DAC_GAIN : 8; + g_eeprom.BK4819_xtal_freq_low = (Misc.BK4819_XtalFreqLow >= -1000 && Misc.BK4819_XtalFreqLow <= 1000) ? Misc.BK4819_XtalFreqLow : 0; + g_eeprom_1F8A = Misc.EEPROM_1F8A & 0x01FF; + g_eeprom_1F8C = Misc.EEPROM_1F8C & 0x01FF; + g_eeprom.volume_gain = (Misc.volume_gain < 64) ? Misc.volume_gain : 58; + g_eeprom.dac_gain = (Misc.dac_gain < 16) ? Misc.dac_gain : 8; - BK4819_WriteRegister(BK4819_REG_3B, 22656 + gEeprom.BK4819_XTAL_FREQ_LOW); -// BK4819_WriteRegister(BK4819_REG_3C, gEeprom.BK4819_XTAL_FREQ_HIGH); + BK4819_WriteRegister(BK4819_REG_3B, 22656 + g_eeprom.BK4819_xtal_freq_low); +// BK4819_WriteRegister(BK4819_REG_3C, g_eeprom.BK4819_XTAL_FREQ_HIGH); } } @@ -873,10 +873,10 @@ void BOARD_FactoryReset(bool bIsAll) for (i = 0; i < ARRAY_SIZE(gDefaultFrequencyTable); i++) { const uint32_t Frequency = gDefaultFrequencyTable[i]; - gRxVfo->freq_config_RX.Frequency = Frequency; - gRxVfo->freq_config_TX.Frequency = Frequency; - gRxVfo->Band = FREQUENCY_GetBand(Frequency); - SETTINGS_SaveChannel(MR_CHANNEL_FIRST + i, 0, gRxVfo, 2); + gRxVfo->freq_config_rx.frequency = Frequency; + gRxVfo->freq_config_tx.frequency = Frequency; + gRxVfo->band = FREQUENCY_GetBand(Frequency); + SETTINGS_SaveChannel(USER_CHANNEL_FIRST + i, 0, gRxVfo, 2); } } } diff --git a/dcs.c b/dcs.c index 4615dc5..2a482ef 100644 --- a/dcs.c +++ b/dcs.c @@ -58,12 +58,12 @@ static uint32_t DCS_CalculateGolay(uint32_t CodeWord) return CodeWord | ((Word & 0x0FFE) << 11); } -uint32_t DCS_GetGolayCodeWord(DCS_CodeType_t CodeType, uint8_t Option) +uint32_t DCS_GetGolayCodeWord(dcs_code_type_t code_type, uint8_t Option) { - uint32_t Code = DCS_CalculateGolay(DCS_Options[Option] + 0x800U); - if (CodeType == CODE_TYPE_REVERSE_DIGITAL) - Code ^= 0x7FFFFF; - return Code; + uint32_t code = DCS_CalculateGolay(DCS_Options[Option] + 0x800U); + if (code_type == CODE_TYPE_REVERSE_DIGITAL) + code ^= 0x7FFFFF; + return code; } uint8_t DCS_GetCdcssCode(uint32_t Code) diff --git a/dcs.h b/dcs.h index 873ddb6..d902f24 100644 --- a/dcs.h +++ b/dcs.h @@ -19,7 +19,7 @@ #include -enum DCS_CodeType_t +enum dcs_code_type_e { CODE_TYPE_OFF = 0, CODE_TYPE_CONTINUOUS_TONE, @@ -27,7 +27,7 @@ enum DCS_CodeType_t CODE_TYPE_REVERSE_DIGITAL }; -typedef enum DCS_CodeType_t DCS_CodeType_t; +typedef enum dcs_code_type_e dcs_code_type_t; enum { CDCSS_POSITIVE_CODE = 1U, @@ -37,7 +37,7 @@ enum { extern const uint16_t CTCSS_Options[50]; extern const uint16_t DCS_Options[104]; -uint32_t DCS_GetGolayCodeWord(DCS_CodeType_t CodeType, uint8_t Option); +uint32_t DCS_GetGolayCodeWord(dcs_code_type_t code_type, uint8_t Option); uint8_t DCS_GetCdcssCode(uint32_t Code); uint8_t DCS_GetCtcssCode(int Code); diff --git a/driver/backlight.c b/driver/backlight.c index bfeedfe..66f4f71 100644 --- a/driver/backlight.c +++ b/driver/backlight.c @@ -22,15 +22,15 @@ // this is decremented once every 500ms uint16_t gBacklightCountdown = 0; -void BACKLIGHT_TurnOn(void) +void backlight_turn_on(void) { - if (gEeprom.BACKLIGHT == 0) + if (g_eeprom.backlight == 0) return; // turn the backlight ON GPIO_SetBit(&GPIOB->DATA, GPIOB_PIN_BACKLIGHT); - switch (gEeprom.BACKLIGHT) + switch (g_eeprom.backlight) { default: case 1: // 5 sec diff --git a/driver/backlight.h b/driver/backlight.h index 67967bf..ec53119 100644 --- a/driver/backlight.h +++ b/driver/backlight.h @@ -21,7 +21,7 @@ extern uint16_t gBacklightCountdown; -void BACKLIGHT_TurnOn(void); +void backlight_turn_on(void); #endif diff --git a/driver/bk4819.c b/driver/bk4819.c index 4bd0622..d9e24da 100644 --- a/driver/bk4819.c +++ b/driver/bk4819.c @@ -31,7 +31,7 @@ static const uint16_t FSK_RogerTable[7] = {0xF1A2, 0x7446, 0x61A4, 0x6544, 0x4E8 static uint16_t gBK4819_GpioOutState; -bool gRxIdleMode; +bool g_rx_idle_mode; __inline uint16_t scale_freq(const uint16_t freq) { @@ -713,12 +713,12 @@ void BK4819_SetFrequency(uint32_t Frequency) } void BK4819_SetupSquelch( - uint8_t SquelchOpenRSSIThresh, - uint8_t SquelchCloseRSSIThresh, - uint8_t SquelchOpenNoiseThresh, - uint8_t SquelchCloseNoiseThresh, - uint8_t SquelchCloseGlitchThresh, - uint8_t SquelchOpenGlitchThresh) + uint8_t squelch_open_RSSI_thresh, + uint8_t squelch_close_RSSI_thresh, + uint8_t squelch_open_noise_thresh, + uint8_t squelch_close_noise_thresh, + uint8_t squelch_close_glitch_thresh, + uint8_t squelch_open_glitch_thresh) { // REG_70 // @@ -742,7 +742,7 @@ void BK4819_SetupSquelch( // // 0 ~ 255 // - BK4819_WriteRegister(BK4819_REG_4D, 0xA000 | SquelchCloseGlitchThresh); + BK4819_WriteRegister(BK4819_REG_4D, 0xA000 | squelch_close_glitch_thresh); // REG_4E // @@ -765,13 +765,13 @@ void BK4819_SetupSquelch( (1u << 14) | // 1 ??? (3u << 11) | // *5 squelch = open delay .. 0 ~ 7 (2u << 9) | // *3 squelch = close delay .. 0 ~ 3 - SquelchOpenGlitchThresh); // 0 ~ 255 + squelch_open_glitch_thresh); // 0 ~ 255 #else // faster (but twitchier) (1u << 14) | // 1 ??? (2u << 11) | // *5 squelch = open delay .. 0 ~ 7 (1u << 9) | // *3 squelch = close delay .. 0 ~ 3 - SquelchOpenGlitchThresh); // 0 ~ 255 + squelch_open_glitch_thresh); // 0 ~ 255 #endif // REG_4F @@ -784,7 +784,7 @@ void BK4819_SetupSquelch( // <6:0> 46 Ex-noise threshold for Squelch = open // 0 ~ 127 // - BK4819_WriteRegister(BK4819_REG_4F, ((uint16_t)SquelchCloseNoiseThresh << 8) | SquelchOpenNoiseThresh); + BK4819_WriteRegister(BK4819_REG_4F, ((uint16_t)squelch_close_noise_thresh << 8) | squelch_open_noise_thresh); // REG_78 // @@ -792,7 +792,7 @@ void BK4819_SetupSquelch( // // <7:0> 70 RSSI threshold for Squelch = close 0.5dB/step // - BK4819_WriteRegister(BK4819_REG_78, ((uint16_t)SquelchOpenRSSIThresh << 8) | SquelchCloseRSSIThresh); + BK4819_WriteRegister(BK4819_REG_78, ((uint16_t)squelch_open_RSSI_thresh << 8) | squelch_close_RSSI_thresh); BK4819_SetAF(BK4819_AF_MUTE); @@ -1196,7 +1196,7 @@ void BK4819_ExitSubAu(void) void BK4819_Conditional_RX_TurnOn_and_GPIO6_Enable(void) { - if (gRxIdleMode) + if (g_rx_idle_mode) { BK4819_ToggleGpioOut(BK4819_GPIO6_PIN2, true); BK4819_RX_TurnOn(); @@ -1670,7 +1670,7 @@ uint8_t BK4819_GetDTMF_5TONE_Code(void) return (BK4819_ReadRegister(BK4819_REG_0B) >> 8) & 0x0F; } -uint8_t BK4819_GetCDCSSCodeType(void) +uint8_t BK4819_get_CDCSS_code_type(void) { return (BK4819_ReadRegister(BK4819_REG_0C) >> 14) & 3u; } diff --git a/driver/bk4819.h b/driver/bk4819.h index 736b171..53f02c3 100644 --- a/driver/bk4819.h +++ b/driver/bk4819.h @@ -62,7 +62,7 @@ enum BK4819_CssScanResult_t typedef enum BK4819_CssScanResult_t BK4819_CssScanResult_t; -extern bool gRxIdleMode; +extern bool g_rx_idle_mode; void BK4819_Init(void); uint16_t BK4819_ReadRegister(BK4819_REGISTER_t Register); @@ -150,7 +150,7 @@ void BK4819_StopScan(void); uint8_t BK4819_GetDTMF_5TONE_Code(void); -uint8_t BK4819_GetCDCSSCodeType(void); +uint8_t BK4819_get_CDCSS_code_type(void); uint8_t BK4819_GetCTCShift(void); uint8_t BK4819_GetCTCType(void); diff --git a/driver/keyboard.c b/driver/keyboard.c index 62882df..9b2c1e7 100644 --- a/driver/keyboard.c +++ b/driver/keyboard.c @@ -22,10 +22,10 @@ #include "driver/i2c.h" #include "misc.h" -KEY_Code_t gKeyReading0 = KEY_INVALID; -KEY_Code_t gKeyReading1 = KEY_INVALID; -uint16_t gDebounceCounter = 0; -bool gWasFKeyPressed = false; +key_code_t g_key_reading_0 = KEY_INVALID; +key_code_t g_key_reading_1 = KEY_INVALID; +uint16_t g_debounce_counter = 0; +bool g_was_f_key_pressed = false; static const struct { @@ -36,7 +36,7 @@ static const struct { // We are very fortunate. // The key and pin defines fit together in a single u8, making this very efficient struct { - KEY_Code_t key : 5; + key_code_t key : 5; uint8_t pin : 3; // Pin 6 is highest } pins[4]; @@ -92,9 +92,9 @@ static const struct { } }; -KEY_Code_t KEYBOARD_Poll(void) +key_code_t KEYBOARD_Poll(void) { - KEY_Code_t Key = KEY_INVALID; + key_code_t Key = KEY_INVALID; // if (!GPIO_CheckBit(&GPIOC->DATA, GPIOC_PIN_PTT)) // return KEY_PTT; diff --git a/driver/keyboard.h b/driver/keyboard.h index 5a7d839..dd9b040 100644 --- a/driver/keyboard.h +++ b/driver/keyboard.h @@ -21,7 +21,7 @@ #include #include -enum KEY_Code_e { +enum key_code_e { KEY_0 = 0, // 0 KEY_1, // 1 KEY_2, // 2 @@ -43,14 +43,14 @@ enum KEY_Code_e { KEY_SIDE1, // KEY_INVALID // }; -typedef enum KEY_Code_e KEY_Code_t; +typedef enum key_code_e key_code_t; -extern KEY_Code_t gKeyReading0; -extern KEY_Code_t gKeyReading1; -extern uint16_t gDebounceCounter; -extern bool gWasFKeyPressed; +extern key_code_t g_key_reading_0; +extern key_code_t g_key_reading_1; +extern uint16_t g_debounce_counter; +extern bool g_was_f_key_pressed; -KEY_Code_t KEYBOARD_Poll(void); +key_code_t KEYBOARD_Poll(void); #endif diff --git a/firmware.bin b/firmware.bin index a4f56aae299a9d1b9024e231f457d00e17edbd72..f56de8d70c42b8ccb3809a2d8391922246bde7e9 100644 GIT binary patch literal 56792 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 z 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
Ft3u=oO6NJnP}5 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 E0h2!3@Bjb+ diff --git a/firmware.packed.bin b/firmware.packed.bin index 2e66f57577caae90bb287c4ea385c985e4ecf9b3..fbdc7e59004391004a8d761c8a2165d8b49bfb0d 100644 GIT binary patch literal 56810 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 ZUMU7RGziB9#CDk>?my4@enP$ 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 WG@$>Y$9S2PX(P*!52UzCrvCwVDbhj! literal 57546 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 diff --git a/frequencies.h b/frequencies.h index f7b07cb..30c4dc7 100644 --- a/frequencies.h +++ b/frequencies.h @@ -43,7 +43,7 @@ typedef enum FREQUENCY_Band_t FREQUENCY_Band_t; #ifdef ENABLE_1250HZ_STEP // includes 1.25kHz step - enum STEP_Setting_t { + enum step_setting_t { STEP_1_25kHz = 0, STEP_2_5kHz, STEP_6_25kHz, @@ -54,7 +54,7 @@ typedef enum FREQUENCY_Band_t FREQUENCY_Band_t; }; #else // QS steps - enum STEP_Setting_t { + enum step_setting_t { STEP_2_5kHz = 0, STEP_5_0kHz, STEP_6_25kHz, @@ -64,7 +64,7 @@ typedef enum FREQUENCY_Band_t FREQUENCY_Band_t; STEP_8_33kHz }; #endif -typedef enum STEP_Setting_t STEP_Setting_t; +typedef enum step_setting_t step_setting_t; extern const uint16_t StepFrequencyTable[7]; diff --git a/functions.c b/functions.c index 49d8cff..765c7db 100644 --- a/functions.c +++ b/functions.c @@ -43,26 +43,26 @@ FUNCTION_Type_t gCurrentFunction; void FUNCTION_Init(void) { #ifdef ENABLE_NOAA - if (IS_NOT_NOAA_CHANNEL(gRxVfo->CHANNEL_SAVE)) + if (IS_NOT_NOAA_CHANNEL(gRxVfo->channel_save)) #endif { - gCurrentCodeType = gSelectedCodeType; + gCurrentcode_type = gSelectedcode_type; if (gCssScanMode == CSS_SCAN_MODE_OFF) - gCurrentCodeType = gRxVfo->AM_mode ? CODE_TYPE_OFF : gRxVfo->pRX->CodeType; + gCurrentcode_type = gRxVfo->am_mode ? CODE_TYPE_OFF : gRxVfo->pRX->code_type; } #ifdef ENABLE_NOAA else - gCurrentCodeType = CODE_TYPE_CONTINUOUS_TONE; + gCurrentcode_type = CODE_TYPE_CONTINUOUS_TONE; #endif DTMF_clear_RX(); - g_CxCSS_TAIL_Found = false; - g_CDCSS_Lost = false; - g_CTCSS_Lost = false; + g_CxCSS_tailL_found = false; + g_CDCSS_lost = false; + g_CTCSS_lost = false; #ifdef ENABLE_VOX - g_VOX_Lost = false; + g_vox_lost = false; #endif g_SquelchLost = false; @@ -92,7 +92,7 @@ void FUNCTION_Select(FUNCTION_Type_t Function) if (bWasPowerSave && Function != FUNCTION_POWER_SAVE) { BK4819_Conditional_RX_TurnOn_and_GPIO6_Enable(); - gRxIdleMode = false; + g_rx_idle_mode = false; UI_DisplayStatus(false); } @@ -120,7 +120,7 @@ void FUNCTION_Select(FUNCTION_Type_t Function) gDTMF_CallState == DTMF_CALL_STATE_RECEIVED || gDTMF_CallState == DTMF_CALL_STATE_RECEIVED_STAY) { - gDTMF_auto_reset_time_500ms = gEeprom.DTMF_auto_reset_time * 2; + gDTMF_auto_reset_time_500ms = g_eeprom.DTMF_auto_reset_time * 2; } gUpdateStatus = true; @@ -135,10 +135,10 @@ void FUNCTION_Select(FUNCTION_Type_t Function) break; case FUNCTION_POWER_SAVE: - gPowerSave_10ms = gEeprom.BATTERY_SAVE * 10; + gPowerSave_10ms = g_eeprom.battery_save * 10; gPowerSaveCountdownExpired = false; - gRxIdleMode = true; + g_rx_idle_mode = true; gMonitor = false; @@ -173,7 +173,7 @@ void FUNCTION_Select(FUNCTION_Type_t Function) #endif #ifdef ENABLE_ALARM - if (gAlarmState == ALARM_STATE_TXALARM && gEeprom.ALARM_MODE != ALARM_MODE_TONE) + if (gAlarmState == ALARM_STATE_TXALARM && g_eeprom.alarm_mode != ALARM_MODE_TONE) { gAlarmState = ALARM_STATE_ALARM; @@ -208,8 +208,8 @@ void FUNCTION_Select(FUNCTION_Type_t Function) DTMF_Reply(); - if (gCurrentVfo->DTMF_PTT_ID_TX_MODE == PTT_ID_APOLLO) - BK4819_PlaySingleTone(2525, 250, 0, gEeprom.DTMF_SIDE_TONE); + if (gCurrentVfo->DTMF_ptt_id_tx_mode == PTT_ID_APOLLO) + BK4819_PlaySingleTone(2525, 250, 0, g_eeprom.DTMF_side_tone); #if defined(ENABLE_ALARM) || defined(ENABLE_TX1750) if (gAlarmState != ALARM_STATE_OFF) @@ -232,13 +232,13 @@ void FUNCTION_Select(FUNCTION_Type_t Function) } #endif - if (gCurrentVfo->SCRAMBLING_TYPE > 0 && gSetting_ScrambleEnable) - BK4819_EnableScramble(gCurrentVfo->SCRAMBLING_TYPE - 1); + if (gCurrentVfo->scrambling_type > 0 && gSetting_ScrambleEnable) + BK4819_EnableScramble(gCurrentVfo->scrambling_type - 1); else BK4819_DisableScramble(); if (gSetting_backlight_on_tx_rx == 1 || gSetting_backlight_on_tx_rx == 3) - BACKLIGHT_TurnOn(); + backlight_turn_on(); break; diff --git a/helper/battery.c b/helper/battery.c index 241090d..cb434fd 100644 --- a/helper/battery.c +++ b/helper/battery.c @@ -125,7 +125,7 @@ void BATTERY_GetReadings(const bool bDisplayBatteryLevel) { gUpdateStatus = true; gUpdateDisplay = true; - BACKLIGHT_TurnOn(); + backlight_turn_on(); } gChargingWithTypeC = true; diff --git a/helper/boot.c b/helper/boot.c index a0e6d6d..a1df270 100644 --- a/helper/boot.c +++ b/helper/boot.c @@ -34,7 +34,7 @@ BOOT_Mode_t BOOT_GetMode(void) { unsigned int i; - KEY_Code_t Keys[2]; + key_code_t Keys[2]; for (i = 0; i < 2; i++) { @@ -46,10 +46,10 @@ BOOT_Mode_t BOOT_GetMode(void) if (Keys[0] == Keys[1]) { - gKeyReading0 = Keys[0]; - gKeyReading1 = Keys[0]; + g_key_reading_0 = Keys[0]; + g_key_reading_1 = Keys[0]; - gDebounceCounter = 2; + g_debounce_counter = 2; if (Keys[0] == KEY_SIDE1) return BOOT_MODE_F_LOCK; @@ -73,22 +73,22 @@ void BOOT_ProcessMode(BOOT_Mode_t Mode) else if (Mode == BOOT_MODE_AIRCOPY) { - gEeprom.DUAL_WATCH = DUAL_WATCH_OFF; - gEeprom.BATTERY_SAVE = 0; + g_eeprom.dual_watch = DUAL_WATCH_OFF; + g_eeprom.battery_save = 0; #ifdef ENABLE_VOX - gEeprom.VOX_SWITCH = false; + g_eeprom.vox_switch = false; #endif - gEeprom.CROSS_BAND_RX_TX = CROSS_BAND_OFF; - gEeprom.AUTO_KEYPAD_LOCK = false; - gEeprom.KEY_1_SHORT_PRESS_ACTION = ACTION_OPT_NONE; - gEeprom.KEY_1_LONG_PRESS_ACTION = ACTION_OPT_NONE; - gEeprom.KEY_2_SHORT_PRESS_ACTION = ACTION_OPT_NONE; - gEeprom.KEY_2_LONG_PRESS_ACTION = ACTION_OPT_NONE; + g_eeprom.cross_vfo_rx_tx = CROSS_BAND_OFF; + g_eeprom.auto_keypad_lock = false; + g_eeprom.key1_short_press_action = ACTION_OPT_NONE; + g_eeprom.key1_long_press_action = ACTION_OPT_NONE; + g_eeprom.key2_short_press_action = ACTION_OPT_NONE; + g_eeprom.key2_long_press_action = ACTION_OPT_NONE; RADIO_InitInfo(gRxVfo, FREQ_CHANNEL_LAST - 1, 41002500); - gRxVfo->CHANNEL_BANDWIDTH = BANDWIDTH_WIDE; - gRxVfo->OUTPUT_POWER = OUTPUT_POWER_LOW; + gRxVfo->channel_bandwidth = BANDWIDTH_WIDE; + gRxVfo->output_power = OUTPUT_POWER_LOW; RADIO_ConfigureSquelchAndOutputPower(gRxVfo); diff --git a/main.c b/main.c index 6718c24..794138a 100644 --- a/main.c +++ b/main.c @@ -73,7 +73,7 @@ void Main(void) // Not implementing authentic device checks - memset(&gEeprom, 0, sizeof(gEeprom)); + memset(&g_eeprom, 0, sizeof(g_eeprom)); memset(gDTMF_String, '-', sizeof(gDTMF_String)); gDTMF_String[sizeof(gDTMF_String) - 1] = 0; @@ -115,23 +115,23 @@ void Main(void) BootMode != BOOT_MODE_NORMAL) { // keys are pressed UI_DisplayReleaseKeys(); - BACKLIGHT_TurnOn(); + backlight_turn_on(); i = 0; while (i < 50) // 500ms { i = (GPIO_CheckBit(&GPIOC->DATA, GPIOC_PIN_PTT) && KEYBOARD_Poll() == KEY_INVALID) ? i + 1 : 0; SYSTEM_DelayMs(10); } - gKeyReading0 = KEY_INVALID; - gKeyReading1 = KEY_INVALID; - gDebounceCounter = 0; + g_key_reading_0 = KEY_INVALID; + g_key_reading_1 = KEY_INVALID; + g_debounce_counter = 0; } if (!gChargingWithTypeC && gBatteryDisplayLevel == 0) { FUNCTION_Select(FUNCTION_POWER_SAVE); - if (gEeprom.BACKLIGHT < (ARRAY_SIZE(gSubMenu_BACKLIGHT) - 1)) + if (g_eeprom.backlight < (ARRAY_SIZE(gSubMenu_backlight) - 1)) GPIO_ClearBit(&GPIOB->DATA, GPIOB_PIN_BACKLIGHT); // turn the backlight OFF else GPIO_SetBit(&GPIOB->DATA, GPIOB_PIN_BACKLIGHT); // turn the backlight ON @@ -142,9 +142,9 @@ void Main(void) { UI_DisplayWelcome(); - BACKLIGHT_TurnOn(); + backlight_turn_on(); - if (gEeprom.POWER_ON_DISPLAY_MODE != POWER_ON_DISPLAY_MODE_NONE) + if (g_eeprom.pwr_on_display_mode != PWR_ON_DISPLAY_MODE_NONE) { // 2.55 second boot-up screen while (boot_counter_10ms > 0) { @@ -161,7 +161,7 @@ void Main(void) } #ifdef ENABLE_PWRON_PASSWORD - if (gEeprom.POWER_ON_PASSWORD < 1000000) + if (g_eeprom.power_on_password < 1000000) { bIsInLockScreen = true; UI_DisplayLock(); @@ -181,8 +181,8 @@ void Main(void) AUDIO_SetVoiceID(0, VOICE_ID_WELCOME); - Channel = gEeprom.ScreenChannel[gEeprom.TX_VFO]; - if (IS_MR_CHANNEL(Channel)) + Channel = g_eeprom.screen_channel[g_eeprom.tx_vfo]; + if (IS_USER_CHANNEL(Channel)) { AUDIO_SetVoiceID(1, VOICE_ID_CHANNEL_MODE); AUDIO_SetDigitVoice(2, Channel + 1); diff --git a/misc.c b/misc.c index 5e2dbd9..e3666ec 100644 --- a/misc.c +++ b/misc.c @@ -113,17 +113,17 @@ bool bHasCustomAesKey; uint32_t gChallenge[4]; uint8_t gTryCount; -uint8_t gEEPROM_1EC0_0[8]; -uint8_t gEEPROM_1EC0_1[8]; -uint8_t gEEPROM_1EC0_2[8]; -uint8_t gEEPROM_1EC0_3[8]; +uint8_t g_eeprom_1EC0_0[8]; +uint8_t g_eeprom_1EC0_1[8]; +uint8_t g_eeprom_1EC0_2[8]; +uint8_t g_eeprom_1EC0_3[8]; -uint16_t gEEPROM_RSSI_CALIB[2][4]; +uint16_t g_eeprom_RSSI_CALIB[2][4]; -uint16_t gEEPROM_1F8A; -uint16_t gEEPROM_1F8C; +uint16_t g_eeprom_1F8A; +uint16_t g_eeprom_1F8C; -uint8_t gMR_ChannelAttributes[FREQ_CHANNEL_LAST + 1]; +uint8_t gUSER_ChannelAttributes[FREQ_CHANNEL_LAST + 1]; volatile uint16_t gBatterySaveCountdown_10ms = battery_save_count_10ms; @@ -193,25 +193,25 @@ bool gFlagSaveChannel; #ifdef ENABLE_FMRADIO bool gFlagSaveFM; #endif -bool g_CDCSS_Lost; -uint8_t gCDCSSCodeType; -bool g_CTCSS_Lost; -bool g_CxCSS_TAIL_Found; +bool g_CDCSS_lost; +uint8_t g_CDCSS_code_type; +bool g_CTCSS_lost; +bool g_CxCSS_tailL_found; #ifdef ENABLE_VOX - bool g_VOX_Lost; + bool g_vox_lost; bool gVOX_NoiseDetected; uint16_t gVoxResumeCountdown; - uint16_t gVoxPauseCountdown; + uint16_t g_vox_pause_count_down; #endif bool g_SquelchLost; uint8_t gFlashLightState; volatile uint16_t gFlashLightBlinkCounter; bool gFlagEndTransmission; uint16_t gLowBatteryCountdown; -uint8_t gNextMrChannel; +uint8_t gNextChannel; ReceptionMode_t gRxReceptionMode; -uint8_t gRestoreMrChannel; +uint8_t gRestoreUSER_CHANNEL; enum scan_next_chan_t gCurrentScanList; uint32_t gRestoreFrequency; @@ -224,7 +224,7 @@ bool gKeyBeingHeld; bool gPttIsPressed; uint8_t gPttDebounceCounter; uint8_t gMenuListCount; -uint8_t gBackup_CROSS_BAND_RX_TX; +uint8_t gBackup_cross_vfo_rx_tx; uint8_t gScanDelay_10ms; #ifdef ENABLE_AIRCOPY uint8_t gAircopySendCountdown; @@ -266,34 +266,34 @@ uint8_t gIsLocked = 0xFF; unsigned int get_rx_VFO(void) { - unsigned int rx_vfo = gEeprom.TX_VFO; - if (gEeprom.CROSS_BAND_RX_TX == CROSS_BAND_CHAN_B) + unsigned int rx_vfo = g_eeprom.tx_vfo; + if (g_eeprom.cross_vfo_rx_tx == CROSS_BAND_CHAN_B) rx_vfo = 0; else - if (gEeprom.CROSS_BAND_RX_TX == CROSS_BAND_CHAN_A) + if (g_eeprom.cross_vfo_rx_tx == CROSS_BAND_CHAN_A) rx_vfo = 1; else - if (gEeprom.DUAL_WATCH == DUAL_WATCH_CHAN_B) + if (g_eeprom.dual_watch == DUAL_WATCH_CHAN_B) rx_vfo = 1; else - if (gEeprom.DUAL_WATCH == DUAL_WATCH_CHAN_A) + if (g_eeprom.dual_watch == DUAL_WATCH_CHAN_A) rx_vfo = 0; return rx_vfo; } unsigned int get_tx_VFO(void) { - unsigned int tx_vfo = gEeprom.TX_VFO; - if (gEeprom.CROSS_BAND_RX_TX == CROSS_BAND_CHAN_B) + unsigned int tx_vfo = g_eeprom.tx_vfo; + if (g_eeprom.cross_vfo_rx_tx == CROSS_BAND_CHAN_B) tx_vfo = 1; else - if (gEeprom.CROSS_BAND_RX_TX == CROSS_BAND_CHAN_A) + if (g_eeprom.cross_vfo_rx_tx == CROSS_BAND_CHAN_A) tx_vfo = 0; else - if (gEeprom.DUAL_WATCH == DUAL_WATCH_CHAN_B) + if (g_eeprom.dual_watch == DUAL_WATCH_CHAN_B) tx_vfo = 1; else - if (gEeprom.DUAL_WATCH == DUAL_WATCH_CHAN_A) + if (g_eeprom.dual_watch == DUAL_WATCH_CHAN_A) tx_vfo = 0; return tx_vfo; } diff --git a/misc.h b/misc.h index 4b87ce6..3667ba0 100644 --- a/misc.h +++ b/misc.h @@ -32,16 +32,16 @@ #define MIN(a, b) ({ __typeof__ (a) _a = (a); __typeof__ (b) _b = (b); _a < _b ? _a : _b; }) #endif -#define IS_MR_CHANNEL(x) ((x) >= MR_CHANNEL_FIRST && (x) <= MR_CHANNEL_LAST) +#define IS_USER_CHANNEL(x) ((x) >= USER_CHANNEL_FIRST && (x) <= USER_CHANNEL_LAST) #define IS_FREQ_CHANNEL(x) ((x) >= FREQ_CHANNEL_FIRST && (x) <= FREQ_CHANNEL_LAST) #define IS_VALID_CHANNEL(x) ((x) < LAST_CHANNEL) #define IS_NOAA_CHANNEL(x) ((x) >= NOAA_CHANNEL_FIRST && (x) <= NOAA_CHANNEL_LAST) -#define IS_NOT_NOAA_CHANNEL(x) ((x) >= MR_CHANNEL_FIRST && (x) <= FREQ_CHANNEL_LAST) +#define IS_NOT_NOAA_CHANNEL(x) ((x) >= USER_CHANNEL_FIRST && (x) <= FREQ_CHANNEL_LAST) enum { - MR_CHANNEL_FIRST = 0, - MR_CHANNEL_LAST = 199u, + USER_CHANNEL_FIRST = 0, + USER_CHANNEL_LAST = 199u, FREQ_CHANNEL_FIRST = 200u, FREQ_CHANNEL_LAST = 206u, NOAA_CHANNEL_FIRST = 207u, @@ -87,8 +87,8 @@ typedef enum CssScanMode_t CssScanMode_t; enum scan_next_chan_t { SCAN_NEXT_CHAN_SCANLIST1 = 0, SCAN_NEXT_CHAN_SCANLIST2, - SCAN_NEXT_CHAN_DUAL_WATCH, - SCAN_NEXT_CHAN_MR, + SCAN_NEXT_CHAN_dual_watch, + SCAN_NEXT_CHAN_USER, SCAN_NEXT_NUM }; typedef enum scan_next_chan_t scan_next_chan_t; @@ -187,17 +187,17 @@ extern bool bHasCustomAesKey; extern uint32_t gChallenge[4]; extern uint8_t gTryCount; -extern uint8_t gEEPROM_1EC0_0[8]; -extern uint8_t gEEPROM_1EC0_1[8]; -extern uint8_t gEEPROM_1EC0_2[8]; -extern uint8_t gEEPROM_1EC0_3[8]; +extern uint8_t g_eeprom_1EC0_0[8]; +extern uint8_t g_eeprom_1EC0_1[8]; +extern uint8_t g_eeprom_1EC0_2[8]; +extern uint8_t g_eeprom_1EC0_3[8]; -extern uint16_t gEEPROM_RSSI_CALIB[2][4]; +extern uint16_t g_eeprom_RSSI_CALIB[2][4]; -extern uint16_t gEEPROM_1F8A; -extern uint16_t gEEPROM_1F8C; +extern uint16_t g_eeprom_1F8A; +extern uint16_t g_eeprom_1F8C; -extern uint8_t gMR_ChannelAttributes[207]; +extern uint8_t gUSER_ChannelAttributes[207]; extern volatile uint16_t gBatterySaveCountdown_10ms; @@ -267,25 +267,25 @@ extern bool gFlagSaveChannel; #ifdef ENABLE_FMRADIO extern bool gFlagSaveFM; #endif -extern bool g_CDCSS_Lost; -extern uint8_t gCDCSSCodeType; -extern bool g_CTCSS_Lost; -extern bool g_CxCSS_TAIL_Found; +extern bool g_CDCSS_lost; +extern uint8_t g_CDCSS_code_type; +extern bool g_CTCSS_lost; +extern bool g_CxCSS_tailL_found; #ifdef ENABLE_VOX - extern bool g_VOX_Lost; + extern bool g_vox_lost; extern bool gVOX_NoiseDetected; extern uint16_t gVoxResumeCountdown; - extern uint16_t gVoxPauseCountdown; + extern uint16_t g_vox_pause_count_down; #endif extern bool g_SquelchLost; extern uint8_t gFlashLightState; extern volatile uint16_t gFlashLightBlinkCounter; extern bool gFlagEndTransmission; extern uint16_t gLowBatteryCountdown; -extern uint8_t gNextMrChannel; +extern uint8_t gNextChannel; extern ReceptionMode_t gRxReceptionMode; -extern uint8_t gRestoreMrChannel; +extern uint8_t gRestoreUSER_CHANNEL; extern scan_next_chan_t gCurrentScanList; extern uint32_t gRestoreFrequency; @@ -296,7 +296,7 @@ extern bool gKeyBeingHeld; extern bool gPttIsPressed; extern uint8_t gPttDebounceCounter; extern uint8_t gMenuListCount; -extern uint8_t gBackup_CROSS_BAND_RX_TX; +extern uint8_t gBackup_cross_vfo_rx_tx; extern uint8_t gScanDelay_10ms; #ifdef ENABLE_AIRCOPY extern uint8_t gAircopySendCountdown; diff --git a/radio.c b/radio.c index 745132d..c2169da 100644 --- a/radio.c +++ b/radio.c @@ -35,14 +35,14 @@ #include "settings.h" #include "ui/menu.h" -VFO_Info_t *gTxVfo; -VFO_Info_t *gRxVfo; -VFO_Info_t *gCurrentVfo; -DCS_CodeType_t gSelectedCodeType; -DCS_CodeType_t gCurrentCodeType; -uint8_t gSelectedCode; -STEP_Setting_t gStepSetting; -VfoState_t VfoState[2]; +VFO_Info_t *gTxVfo; +VFO_Info_t *gRxVfo; +VFO_Info_t *gCurrentVfo; +dcs_code_type_t gSelectedcode_type; +dcs_code_type_t gCurrentcode_type; +uint8_t gSelectedCode; +step_setting_t gStepSetting; +VfoState_t VfoState[2]; bool RADIO_CheckValidChannel(uint16_t Channel, bool bCheckScanList, uint8_t VFO) { // return true if the channel appears valid @@ -51,12 +51,12 @@ bool RADIO_CheckValidChannel(uint16_t Channel, bool bCheckScanList, uint8_t VFO) uint8_t PriorityCh1; uint8_t PriorityCh2; - if (Channel > MR_CHANNEL_LAST) + if (Channel > USER_CHANNEL_LAST) return false; - Attributes = gMR_ChannelAttributes[Channel]; + Attributes = gUSER_ChannelAttributes[Channel]; - if ((Attributes & MR_CH_BAND_MASK) > BAND7_470MHz) + if ((Attributes & USER_CH_BAND_MASK) > BAND7_470MHz) return false; if (bCheckScanList) @@ -64,19 +64,19 @@ bool RADIO_CheckValidChannel(uint16_t Channel, bool bCheckScanList, uint8_t VFO) switch (VFO) { case 0: - if ((Attributes & MR_CH_SCANLIST1) == 0) + if ((Attributes & USER_CH_SCANLIST1) == 0) return false; - PriorityCh1 = gEeprom.SCANLIST_PRIORITY_CH1[0]; - PriorityCh2 = gEeprom.SCANLIST_PRIORITY_CH2[0]; + PriorityCh1 = g_eeprom.scan_list_priority_ch1[0]; + PriorityCh2 = g_eeprom.scan_list_priority_ch2[0]; break; case 1: - if ((Attributes & MR_CH_SCANLIST2) == 0) + if ((Attributes & USER_CH_SCANLIST2) == 0) return false; - PriorityCh1 = gEeprom.SCANLIST_PRIORITY_CH1[1]; - PriorityCh2 = gEeprom.SCANLIST_PRIORITY_CH2[1]; + PriorityCh1 = g_eeprom.scan_list_priority_ch1[1]; + PriorityCh2 = g_eeprom.scan_list_priority_ch2[1]; break; default: @@ -97,13 +97,13 @@ uint8_t RADIO_FindNextChannel(uint8_t Channel, int8_t Direction, bool bCheckScan { unsigned int i; - for (i = 0; i <= MR_CHANNEL_LAST; i++) + for (i = 0; i <= USER_CHANNEL_LAST; i++) { if (Channel == 0xFF) - Channel = MR_CHANNEL_LAST; + Channel = USER_CHANNEL_LAST; else - if (Channel > MR_CHANNEL_LAST) - Channel = MR_CHANNEL_FIRST; + if (Channel > USER_CHANNEL_LAST) + Channel = USER_CHANNEL_FIRST; if (RADIO_CheckValidChannel(Channel, bCheckScanList, VFO)) return Channel; @@ -118,22 +118,22 @@ void RADIO_InitInfo(VFO_Info_t *pInfo, const uint8_t ChannelSave, const uint32_t { memset(pInfo, 0, sizeof(*pInfo)); - pInfo->Band = FREQUENCY_GetBand(Frequency); - pInfo->SCANLIST1_PARTICIPATION = true; - pInfo->SCANLIST2_PARTICIPATION = true; - pInfo->STEP_SETTING = STEP_12_5kHz; - pInfo->StepFrequency = StepFrequencyTable[pInfo->STEP_SETTING]; - pInfo->CHANNEL_SAVE = ChannelSave; - pInfo->FrequencyReverse = false; - pInfo->OUTPUT_POWER = OUTPUT_POWER_LOW; - pInfo->freq_config_RX.Frequency = Frequency; - pInfo->freq_config_TX.Frequency = Frequency; - pInfo->pRX = &pInfo->freq_config_RX; - pInfo->pTX = &pInfo->freq_config_TX; - pInfo->Compander = 0; // off + pInfo->band = FREQUENCY_GetBand(Frequency); + pInfo->scanlist_1_participation = true; + pInfo->scanlist_2_participation = true; + pInfo->step_setting = STEP_12_5kHz; + pInfo->step_freq = StepFrequencyTable[pInfo->step_setting]; + pInfo->channel_save = ChannelSave; + pInfo->frequency_reverse = false; + pInfo->output_power = OUTPUT_POWER_LOW; + pInfo->freq_config_rx.frequency = Frequency; + pInfo->freq_config_tx.frequency = Frequency; + pInfo->pRX = &pInfo->freq_config_rx; + pInfo->pTX = &pInfo->freq_config_tx; + pInfo->compander = 0; // off if (ChannelSave == (FREQ_CHANNEL_FIRST + BAND2_108MHz)) - pInfo->AM_mode = 1; + pInfo->am_mode = 1; RADIO_ConfigureSquelchAndOutputPower(pInfo); } @@ -146,64 +146,64 @@ void RADIO_ConfigureChannel(const unsigned int VFO, const unsigned int configure bool bParticipation2; uint16_t Base; uint32_t Frequency; - VFO_Info_t *pRadio = &gEeprom.VfoInfo[VFO]; + VFO_Info_t *pRadio = &g_eeprom.VfoInfo[VFO]; if (!gSetting_350EN) { - if (gEeprom.FreqChannel[VFO] == (FREQ_CHANNEL_LAST - 2)) - gEeprom.FreqChannel[VFO] = FREQ_CHANNEL_LAST - 1; + if (g_eeprom.freq_channel[VFO] == (FREQ_CHANNEL_LAST - 2)) + g_eeprom.freq_channel[VFO] = FREQ_CHANNEL_LAST - 1; - if (gEeprom.ScreenChannel[VFO] == (FREQ_CHANNEL_LAST - 2)) - gEeprom.ScreenChannel[VFO] = FREQ_CHANNEL_LAST - 1; + if (g_eeprom.screen_channel[VFO] == (FREQ_CHANNEL_LAST - 2)) + g_eeprom.screen_channel[VFO] = FREQ_CHANNEL_LAST - 1; } - Channel = gEeprom.ScreenChannel[VFO]; + Channel = g_eeprom.screen_channel[VFO]; if (IS_VALID_CHANNEL(Channel)) { #ifdef ENABLE_NOAA if (Channel >= NOAA_CHANNEL_FIRST) { - RADIO_InitInfo(pRadio, gEeprom.ScreenChannel[VFO], NoaaFrequencyTable[Channel - NOAA_CHANNEL_FIRST]); + RADIO_InitInfo(pRadio, g_eeprom.screen_channel[VFO], NoaaFrequencyTable[Channel - NOAA_CHANNEL_FIRST]); - if (gEeprom.CROSS_BAND_RX_TX == CROSS_BAND_OFF) + if (g_eeprom.cross_vfo_rx_tx == CROSS_BAND_OFF) return; - gEeprom.CROSS_BAND_RX_TX = CROSS_BAND_OFF; + g_eeprom.cross_vfo_rx_tx = CROSS_BAND_OFF; gUpdateStatus = true; return; } #endif - if (Channel <= MR_CHANNEL_LAST) + if (Channel <= USER_CHANNEL_LAST) { Channel = RADIO_FindNextChannel(Channel, RADIO_CHANNEL_UP, false, VFO); if (Channel == 0xFF) { - Channel = gEeprom.FreqChannel[VFO]; - gEeprom.ScreenChannel[VFO] = gEeprom.FreqChannel[VFO]; + Channel = g_eeprom.freq_channel[VFO]; + g_eeprom.screen_channel[VFO] = g_eeprom.freq_channel[VFO]; } else { - gEeprom.ScreenChannel[VFO] = Channel; - gEeprom.MrChannel[VFO] = Channel; + g_eeprom.screen_channel[VFO] = Channel; + g_eeprom.user_channel[VFO] = Channel; } } } else Channel = FREQ_CHANNEL_LAST - 1; - Attributes = gMR_ChannelAttributes[Channel]; + Attributes = gUSER_ChannelAttributes[Channel]; if (Attributes == 0xFF) { // invalid/unused channel uint8_t Index; - if (Channel <= MR_CHANNEL_LAST) + if (Channel <= USER_CHANNEL_LAST) { - Channel = gEeprom.FreqChannel[VFO]; - gEeprom.ScreenChannel[VFO] = gEeprom.FreqChannel[VFO]; + Channel = g_eeprom.freq_channel[VFO]; + g_eeprom.screen_channel[VFO] = g_eeprom.freq_channel[VFO]; } Index = Channel - FREQ_CHANNEL_FIRST; @@ -212,30 +212,30 @@ void RADIO_ConfigureChannel(const unsigned int VFO, const unsigned int configure return; } - Band = Attributes & MR_CH_BAND_MASK; + Band = Attributes & USER_CH_BAND_MASK; if (Band > BAND7_470MHz) { Band = BAND6_400MHz; } - if (Channel <= MR_CHANNEL_LAST) + if (Channel <= USER_CHANNEL_LAST) { - gEeprom.VfoInfo[VFO].Band = Band; - gEeprom.VfoInfo[VFO].SCANLIST1_PARTICIPATION = !!(Attributes & MR_CH_SCANLIST1); - bParticipation2 = !!(Attributes & MR_CH_SCANLIST2); + g_eeprom.VfoInfo[VFO].band = Band; + g_eeprom.VfoInfo[VFO].scanlist_1_participation = !!(Attributes & USER_CH_SCANLIST1); + bParticipation2 = !!(Attributes & USER_CH_SCANLIST2); } else { Band = Channel - FREQ_CHANNEL_FIRST; - gEeprom.VfoInfo[VFO].Band = Band; + g_eeprom.VfoInfo[VFO].band = Band; bParticipation2 = true; - gEeprom.VfoInfo[VFO].SCANLIST1_PARTICIPATION = true; + g_eeprom.VfoInfo[VFO].scanlist_1_participation = true; } - gEeprom.VfoInfo[VFO].SCANLIST2_PARTICIPATION = bParticipation2; - gEeprom.VfoInfo[VFO].CHANNEL_SAVE = Channel; + g_eeprom.VfoInfo[VFO].scanlist_2_participation = bParticipation2; + g_eeprom.VfoInfo[VFO].channel_save = Channel; - if (Channel <= MR_CHANNEL_LAST) + if (Channel <= USER_CHANNEL_LAST) Base = Channel * 16; else Base = 0x0C80 + ((Channel - FREQ_CHANNEL_FIRST) * 32) + (VFO * 16); @@ -250,31 +250,31 @@ void RADIO_ConfigureChannel(const unsigned int VFO, const unsigned int configure EEPROM_ReadBuffer(Base + 8, Data, sizeof(Data)); Tmp = Data[3] & 0x0F; - if (Tmp > TX_OFFSET_FREQUENCY_DIRECTION_SUB) + if (Tmp > TX_OFFSET_FREQ_DIR_SUB) Tmp = 0; - gEeprom.VfoInfo[VFO].TX_OFFSET_FREQUENCY_DIRECTION = Tmp; - gEeprom.VfoInfo[VFO].AM_mode = (Data[3] >> 4) & 1u; + g_eeprom.VfoInfo[VFO].tx_offset_freq_dir = Tmp; + g_eeprom.VfoInfo[VFO].am_mode = (Data[3] >> 4) & 1u; Tmp = Data[6]; if (Tmp >= ARRAY_SIZE(StepFrequencyTable)) Tmp = STEP_12_5kHz; - gEeprom.VfoInfo[VFO].STEP_SETTING = Tmp; - gEeprom.VfoInfo[VFO].StepFrequency = StepFrequencyTable[Tmp]; + g_eeprom.VfoInfo[VFO].step_setting = Tmp; + g_eeprom.VfoInfo[VFO].step_freq = StepFrequencyTable[Tmp]; Tmp = Data[7]; if (Tmp > (ARRAY_SIZE(gSubMenu_SCRAMBLER) - 1)) Tmp = 0; - gEeprom.VfoInfo[VFO].SCRAMBLING_TYPE = Tmp; + g_eeprom.VfoInfo[VFO].scrambling_type = Tmp; - gEeprom.VfoInfo[VFO].freq_config_RX.CodeType = (Data[2] >> 0) & 0x0F; - gEeprom.VfoInfo[VFO].freq_config_TX.CodeType = (Data[2] >> 4) & 0x0F; + g_eeprom.VfoInfo[VFO].freq_config_rx.code_type = (Data[2] >> 0) & 0x0F; + g_eeprom.VfoInfo[VFO].freq_config_tx.code_type = (Data[2] >> 4) & 0x0F; Tmp = Data[0]; - switch (gEeprom.VfoInfo[VFO].freq_config_RX.CodeType) + switch (g_eeprom.VfoInfo[VFO].freq_config_rx.code_type) { default: case CODE_TYPE_OFF: - gEeprom.VfoInfo[VFO].freq_config_RX.CodeType = CODE_TYPE_OFF; + g_eeprom.VfoInfo[VFO].freq_config_rx.code_type = CODE_TYPE_OFF; Tmp = 0; break; @@ -289,14 +289,14 @@ void RADIO_ConfigureChannel(const unsigned int VFO, const unsigned int configure Tmp = 0; break; } - gEeprom.VfoInfo[VFO].freq_config_RX.Code = Tmp; + g_eeprom.VfoInfo[VFO].freq_config_rx.code = Tmp; Tmp = Data[1]; - switch (gEeprom.VfoInfo[VFO].freq_config_TX.CodeType) + switch (g_eeprom.VfoInfo[VFO].freq_config_tx.code_type) { default: case CODE_TYPE_OFF: - gEeprom.VfoInfo[VFO].freq_config_TX.CodeType = CODE_TYPE_OFF; + g_eeprom.VfoInfo[VFO].freq_config_tx.code_type = CODE_TYPE_OFF; Tmp = 0; break; @@ -311,55 +311,55 @@ void RADIO_ConfigureChannel(const unsigned int VFO, const unsigned int configure Tmp = 0; break; } - gEeprom.VfoInfo[VFO].freq_config_TX.Code = Tmp; + g_eeprom.VfoInfo[VFO].freq_config_tx.code = Tmp; if (Data[4] == 0xFF) { - gEeprom.VfoInfo[VFO].FrequencyReverse = false; - gEeprom.VfoInfo[VFO].CHANNEL_BANDWIDTH = BK4819_FILTER_BW_WIDE; - gEeprom.VfoInfo[VFO].OUTPUT_POWER = OUTPUT_POWER_LOW; - gEeprom.VfoInfo[VFO].BUSY_CHANNEL_LOCK = false; + g_eeprom.VfoInfo[VFO].frequency_reverse = false; + g_eeprom.VfoInfo[VFO].channel_bandwidth = BK4819_FILTER_BW_WIDE; + g_eeprom.VfoInfo[VFO].output_power = OUTPUT_POWER_LOW; + g_eeprom.VfoInfo[VFO].busy_channel_lock = false; } else { const uint8_t d4 = Data[4]; - gEeprom.VfoInfo[VFO].FrequencyReverse = !!((d4 >> 0) & 1u); - gEeprom.VfoInfo[VFO].CHANNEL_BANDWIDTH = !!((d4 >> 1) & 1u); - gEeprom.VfoInfo[VFO].OUTPUT_POWER = ((d4 >> 2) & 3u); - gEeprom.VfoInfo[VFO].BUSY_CHANNEL_LOCK = !!((d4 >> 4) & 1u); + g_eeprom.VfoInfo[VFO].frequency_reverse = !!((d4 >> 0) & 1u); + g_eeprom.VfoInfo[VFO].channel_bandwidth = !!((d4 >> 1) & 1u); + g_eeprom.VfoInfo[VFO].output_power = ((d4 >> 2) & 3u); + g_eeprom.VfoInfo[VFO].busy_channel_lock = !!((d4 >> 4) & 1u); } if (Data[5] == 0xFF) { - gEeprom.VfoInfo[VFO].DTMF_DECODING_ENABLE = false; - gEeprom.VfoInfo[VFO].DTMF_PTT_ID_TX_MODE = PTT_ID_OFF; + g_eeprom.VfoInfo[VFO].DTMF_decoding_enable = false; + g_eeprom.VfoInfo[VFO].DTMF_ptt_id_tx_mode = PTT_ID_OFF; } else { - gEeprom.VfoInfo[VFO].DTMF_DECODING_ENABLE = ((Data[5] >> 0) & 1u) ? true : false; - gEeprom.VfoInfo[VFO].DTMF_PTT_ID_TX_MODE = ((Data[5] >> 1) & 7u); + g_eeprom.VfoInfo[VFO].DTMF_decoding_enable = ((Data[5] >> 0) & 1u) ? true : false; + g_eeprom.VfoInfo[VFO].DTMF_ptt_id_tx_mode = ((Data[5] >> 1) & 7u); } // *************** struct { - uint32_t Frequency; - uint32_t Offset; - } __attribute__((packed)) Info; + uint32_t frequency; + uint32_t offset; + } __attribute__((packed)) info; - EEPROM_ReadBuffer(Base, &Info, sizeof(Info)); + EEPROM_ReadBuffer(Base, &info, sizeof(info)); - pRadio->freq_config_RX.Frequency = Info.Frequency; + pRadio->freq_config_rx.frequency = info.frequency; - if (Info.Offset >= 100000000) - Info.Offset = 1000000; - gEeprom.VfoInfo[VFO].TX_OFFSET_FREQUENCY = Info.Offset; + if (info.offset >= 100000000) + info.offset = 1000000; + g_eeprom.VfoInfo[VFO].tx_offset_freq = info.offset; // *************** } - Frequency = pRadio->freq_config_RX.Frequency; + Frequency = pRadio->freq_config_rx.frequency; #if 1 // fix previously set incorrect band @@ -373,52 +373,52 @@ void RADIO_ConfigureChannel(const unsigned int VFO, const unsigned int configure Frequency = frequencyBandTable[Band].upper; else if (Channel >= FREQ_CHANNEL_FIRST) - Frequency = FREQUENCY_FloorToStep(Frequency, gEeprom.VfoInfo[VFO].StepFrequency, frequencyBandTable[Band].lower); + Frequency = FREQUENCY_FloorToStep(Frequency, g_eeprom.VfoInfo[VFO].step_freq, frequencyBandTable[Band].lower); - pRadio->freq_config_RX.Frequency = Frequency; + pRadio->freq_config_rx.frequency = Frequency; if (Frequency >= 10800000 && Frequency < 13600000) - gEeprom.VfoInfo[VFO].TX_OFFSET_FREQUENCY_DIRECTION = TX_OFFSET_FREQUENCY_DIRECTION_OFF; + g_eeprom.VfoInfo[VFO].tx_offset_freq_dir = TX_OFFSET_FREQ_DIR_OFF; else - if (Channel > MR_CHANNEL_LAST) - gEeprom.VfoInfo[VFO].TX_OFFSET_FREQUENCY = FREQUENCY_FloorToStep(gEeprom.VfoInfo[VFO].TX_OFFSET_FREQUENCY, gEeprom.VfoInfo[VFO].StepFrequency, 0); + if (Channel > USER_CHANNEL_LAST) + g_eeprom.VfoInfo[VFO].tx_offset_freq = FREQUENCY_FloorToStep(g_eeprom.VfoInfo[VFO].tx_offset_freq, g_eeprom.VfoInfo[VFO].step_freq, 0); RADIO_ApplyOffset(pRadio); - memset(gEeprom.VfoInfo[VFO].Name, 0, sizeof(gEeprom.VfoInfo[VFO].Name)); - if (Channel < MR_CHANNEL_LAST) + memset(g_eeprom.VfoInfo[VFO].name, 0, sizeof(g_eeprom.VfoInfo[VFO].name)); + if (Channel < USER_CHANNEL_LAST) { // 16 bytes allocated to the channel name but only 10 used, the rest are 0's - EEPROM_ReadBuffer(0x0F50 + (Channel * 16), gEeprom.VfoInfo[VFO].Name + 0, 8); - EEPROM_ReadBuffer(0x0F58 + (Channel * 16), gEeprom.VfoInfo[VFO].Name + 8, 2); + EEPROM_ReadBuffer(0x0F50 + (Channel * 16), g_eeprom.VfoInfo[VFO].name + 0, 8); + EEPROM_ReadBuffer(0x0F58 + (Channel * 16), g_eeprom.VfoInfo[VFO].name + 8, 2); } - if (!gEeprom.VfoInfo[VFO].FrequencyReverse) + if (!g_eeprom.VfoInfo[VFO].frequency_reverse) { - gEeprom.VfoInfo[VFO].pRX = &gEeprom.VfoInfo[VFO].freq_config_RX; - gEeprom.VfoInfo[VFO].pTX = &gEeprom.VfoInfo[VFO].freq_config_TX; + g_eeprom.VfoInfo[VFO].pRX = &g_eeprom.VfoInfo[VFO].freq_config_rx; + g_eeprom.VfoInfo[VFO].pTX = &g_eeprom.VfoInfo[VFO].freq_config_tx; } else { - gEeprom.VfoInfo[VFO].pRX = &gEeprom.VfoInfo[VFO].freq_config_TX; - gEeprom.VfoInfo[VFO].pTX = &gEeprom.VfoInfo[VFO].freq_config_RX; + g_eeprom.VfoInfo[VFO].pRX = &g_eeprom.VfoInfo[VFO].freq_config_tx; + g_eeprom.VfoInfo[VFO].pTX = &g_eeprom.VfoInfo[VFO].freq_config_rx; } if (!gSetting_350EN) { - FREQ_Config_t *pConfig = gEeprom.VfoInfo[VFO].pRX; - if (pConfig->Frequency >= 35000000 && pConfig->Frequency < 40000000) - pConfig->Frequency = 43300000; + FREQ_Config_t *pConfig = g_eeprom.VfoInfo[VFO].pRX; + if (pConfig->frequency >= 35000000 && pConfig->frequency < 40000000) + pConfig->frequency = 43300000; } - if (gEeprom.VfoInfo[VFO].AM_mode) + if (g_eeprom.VfoInfo[VFO].am_mode) { // freq/chan is in AM mode - gEeprom.VfoInfo[VFO].SCRAMBLING_TYPE = 0; -// gEeprom.VfoInfo[VFO].DTMF_DECODING_ENABLE = false; // no reason to disable DTMF decoding, aircraft use it on SSB - gEeprom.VfoInfo[VFO].freq_config_RX.CodeType = CODE_TYPE_OFF; - gEeprom.VfoInfo[VFO].freq_config_TX.CodeType = CODE_TYPE_OFF; + g_eeprom.VfoInfo[VFO].scrambling_type = 0; +// g_eeprom.VfoInfo[VFO].DTMF_decoding_enable = false; // no reason to disable DTMF decoding, aircraft use it on SSB + g_eeprom.VfoInfo[VFO].freq_config_rx.code_type = CODE_TYPE_OFF; + g_eeprom.VfoInfo[VFO].freq_config_tx.code_type = CODE_TYPE_OFF; } - gEeprom.VfoInfo[VFO].Compander = (Attributes & MR_CH_COMPAND) >> 4; + g_eeprom.VfoInfo[VFO].compander = (Attributes & USER_CH_COMPAND) >> 4; RADIO_ConfigureSquelchAndOutputPower(pRadio); } @@ -431,38 +431,38 @@ void RADIO_ConfigureSquelchAndOutputPower(VFO_Info_t *pInfo) // ******************************* // squelch - Band = FREQUENCY_GetBand(pInfo->pRX->Frequency); + Band = FREQUENCY_GetBand(pInfo->pRX->frequency); uint16_t Base = (Band < BAND4_174MHz) ? 0x1E60 : 0x1E00; - if (gEeprom.SQUELCH_LEVEL == 0) + if (g_eeprom.squelch_level == 0) { // squelch == 0 (off) - pInfo->SquelchOpenRSSIThresh = 0; // 0 ~ 255 - pInfo->SquelchOpenNoiseThresh = 127; // 127 ~ 0 - pInfo->SquelchCloseGlitchThresh = 255; // 255 ~ 0 + pInfo->squelch_open_RSSI_thresh = 0; // 0 ~ 255 + pInfo->squelch_open_noise_thresh = 127; // 127 ~ 0 + pInfo->squelch_close_glitch_thresh = 255; // 255 ~ 0 - pInfo->SquelchCloseRSSIThresh = 0; // 0 ~ 255 - pInfo->SquelchCloseNoiseThresh = 127; // 127 ~ 0 - pInfo->SquelchOpenGlitchThresh = 255; // 255 ~ 0 + pInfo->squelch_close_RSSI_thresh = 0; // 0 ~ 255 + pInfo->squelch_close_noise_thresh = 127; // 127 ~ 0 + pInfo->squelch_open_glitch_thresh = 255; // 255 ~ 0 } else { // squelch >= 1 - Base += gEeprom.SQUELCH_LEVEL; // my eeprom squelch-1 + Base += g_eeprom.squelch_level; // my eeprom squelch-1 // VHF UHF - EEPROM_ReadBuffer(Base + 0x00, &pInfo->SquelchOpenRSSIThresh, 1); // 50 10 - EEPROM_ReadBuffer(Base + 0x10, &pInfo->SquelchCloseRSSIThresh, 1); // 40 5 + EEPROM_ReadBuffer(Base + 0x00, &pInfo->squelch_open_RSSI_thresh, 1); // 50 10 + EEPROM_ReadBuffer(Base + 0x10, &pInfo->squelch_close_RSSI_thresh, 1); // 40 5 - EEPROM_ReadBuffer(Base + 0x20, &pInfo->SquelchOpenNoiseThresh, 1); // 65 90 - EEPROM_ReadBuffer(Base + 0x30, &pInfo->SquelchCloseNoiseThresh, 1); // 70 100 + EEPROM_ReadBuffer(Base + 0x20, &pInfo->squelch_open_noise_thresh, 1); // 65 90 + EEPROM_ReadBuffer(Base + 0x30, &pInfo->squelch_close_noise_thresh, 1); // 70 100 - EEPROM_ReadBuffer(Base + 0x40, &pInfo->SquelchCloseGlitchThresh, 1); // 90 90 - EEPROM_ReadBuffer(Base + 0x50, &pInfo->SquelchOpenGlitchThresh, 1); // 100 100 + EEPROM_ReadBuffer(Base + 0x40, &pInfo->squelch_close_glitch_thresh, 1); // 90 90 + EEPROM_ReadBuffer(Base + 0x50, &pInfo->squelch_open_glitch_thresh, 1); // 100 100 - uint16_t rssi_open = pInfo->SquelchOpenRSSIThresh; - uint16_t rssi_close = pInfo->SquelchCloseRSSIThresh; - uint16_t noise_open = pInfo->SquelchOpenNoiseThresh; - uint16_t noise_close = pInfo->SquelchCloseNoiseThresh; - uint16_t glitch_open = pInfo->SquelchOpenGlitchThresh; - uint16_t glitch_close = pInfo->SquelchCloseGlitchThresh; + uint16_t rssi_open = pInfo->squelch_open_RSSI_thresh; + uint16_t rssi_close = pInfo->squelch_close_RSSI_thresh; + uint16_t noise_open = pInfo->squelch_open_noise_thresh; + uint16_t noise_close = pInfo->squelch_close_noise_thresh; + uint16_t glitch_open = pInfo->squelch_open_glitch_thresh; + uint16_t glitch_close = pInfo->squelch_close_glitch_thresh; #if ENABLE_SQUELCH_MORE_SENSITIVE // make squelch a little more sensitive @@ -501,12 +501,12 @@ void RADIO_ConfigureSquelchAndOutputPower(VFO_Info_t *pInfo) if (glitch_close == glitch_open && glitch_close <= 253) glitch_close += 2; - pInfo->SquelchOpenRSSIThresh = (rssi_open > 255) ? 255 : rssi_open; - pInfo->SquelchCloseRSSIThresh = (rssi_close > 255) ? 255 : rssi_close; - pInfo->SquelchOpenNoiseThresh = (noise_open > 127) ? 127 : noise_open; - pInfo->SquelchCloseNoiseThresh = (noise_close > 127) ? 127 : noise_close; - pInfo->SquelchOpenGlitchThresh = (glitch_open > 255) ? 255 : glitch_open; - pInfo->SquelchCloseGlitchThresh = (glitch_close > 255) ? 255 : glitch_close; + pInfo->squelch_open_RSSI_thresh = (rssi_open > 255) ? 255 : rssi_open; + pInfo->squelch_close_RSSI_thresh = (rssi_close > 255) ? 255 : rssi_close; + pInfo->squelch_open_noise_thresh = (noise_open > 127) ? 127 : noise_open; + pInfo->squelch_close_noise_thresh = (noise_close > 127) ? 127 : noise_close; + pInfo->squelch_open_glitch_thresh = (glitch_open > 255) ? 255 : glitch_open; + pInfo->squelch_close_glitch_thresh = (glitch_close > 255) ? 255 : glitch_close; } // ******************************* @@ -522,35 +522,35 @@ void RADIO_ConfigureSquelchAndOutputPower(VFO_Info_t *pInfo) // 1F20 5A 5A 5A 64 64 64 8F 91 8A FF FF FF FF FF FF FF .. 400 MHz // 1F30 32 32 32 64 64 64 8C 8C 8C FF FF FF FF FF FF FF .. 470 MHz - Band = FREQUENCY_GetBand(pInfo->pTX->Frequency); + Band = FREQUENCY_GetBand(pInfo->pTX->frequency); - EEPROM_ReadBuffer(0x1ED0 + (Band * 16) + (pInfo->OUTPUT_POWER * 3), TX_power, 3); + EEPROM_ReadBuffer(0x1ED0 + (Band * 16) + (pInfo->output_power * 3), TX_power, 3); - pInfo->TXP_CalculatedSetting = FREQUENCY_CalculateOutputPower( + pInfo->txp_calculated_setting = FREQUENCY_CalculateOutputPower( TX_power[0], TX_power[1], TX_power[2], frequencyBandTable[Band].lower, (frequencyBandTable[Band].lower + frequencyBandTable[Band].upper) / 2, frequencyBandTable[Band].upper, - pInfo->pTX->Frequency); + pInfo->pTX->frequency); // ******************************* } void RADIO_ApplyOffset(VFO_Info_t *pInfo) { - uint32_t Frequency = pInfo->freq_config_RX.Frequency; + uint32_t Frequency = pInfo->freq_config_rx.frequency; - switch (pInfo->TX_OFFSET_FREQUENCY_DIRECTION) + switch (pInfo->tx_offset_freq_dir) { - case TX_OFFSET_FREQUENCY_DIRECTION_OFF: + case TX_OFFSET_FREQ_DIR_OFF: break; - case TX_OFFSET_FREQUENCY_DIRECTION_ADD: - Frequency += pInfo->TX_OFFSET_FREQUENCY; + case TX_OFFSET_FREQ_DIR_ADD: + Frequency += pInfo->tx_offset_freq; break; - case TX_OFFSET_FREQUENCY_DIRECTION_SUB: - Frequency -= pInfo->TX_OFFSET_FREQUENCY; + case TX_OFFSET_FREQ_DIR_SUB: + Frequency -= pInfo->tx_offset_freq; break; } @@ -560,28 +560,28 @@ void RADIO_ApplyOffset(VFO_Info_t *pInfo) if (Frequency > frequencyBandTable[ARRAY_SIZE(frequencyBandTable) - 1].upper) Frequency = frequencyBandTable[ARRAY_SIZE(frequencyBandTable) - 1].upper; - pInfo->freq_config_TX.Frequency = Frequency; + pInfo->freq_config_tx.frequency = Frequency; } static void RADIO_SelectCurrentVfo(void) { - gCurrentVfo = (gEeprom.CROSS_BAND_RX_TX == CROSS_BAND_OFF) ? gRxVfo : &gEeprom.VfoInfo[gEeprom.TX_VFO]; + gCurrentVfo = (g_eeprom.cross_vfo_rx_tx == CROSS_BAND_OFF) ? gRxVfo : &g_eeprom.VfoInfo[g_eeprom.tx_vfo]; } void RADIO_SelectVfos(void) { - gEeprom.TX_VFO = get_tx_VFO(); - gEeprom.RX_VFO = (gEeprom.CROSS_BAND_RX_TX == CROSS_BAND_OFF) ? gEeprom.TX_VFO : (gEeprom.TX_VFO + 1) & 1u; + g_eeprom.tx_vfo = get_tx_VFO(); + g_eeprom.rx_vfo = (g_eeprom.cross_vfo_rx_tx == CROSS_BAND_OFF) ? g_eeprom.tx_vfo : (g_eeprom.tx_vfo + 1) & 1u; - gTxVfo = &gEeprom.VfoInfo[gEeprom.TX_VFO]; - gRxVfo = &gEeprom.VfoInfo[gEeprom.RX_VFO]; + gTxVfo = &g_eeprom.VfoInfo[g_eeprom.tx_vfo]; + gRxVfo = &g_eeprom.VfoInfo[g_eeprom.rx_vfo]; RADIO_SelectCurrentVfo(); } void RADIO_SetupRegisters(bool bSwitchToFunction0) { - BK4819_FilterBandwidth_t Bandwidth = gRxVfo->CHANNEL_BANDWIDTH; + BK4819_FilterBandwidth_t Bandwidth = gRxVfo->channel_bandwidth; uint16_t InterruptMask; uint32_t Frequency; @@ -601,7 +601,7 @@ void RADIO_SetupRegisters(bool bSwitchToFunction0) case BK4819_FILTER_BW_WIDE: case BK4819_FILTER_BW_NARROW: #ifdef ENABLE_AM_FIX -// BK4819_SetFilterBandwidth(Bandwidth, gRxVfo->AM_mode && gSetting_AM_fix); +// BK4819_SetFilterBandwidth(Bandwidth, gRxVfo->am_mode && gSetting_AM_fix); BK4819_SetFilterBandwidth(Bandwidth, true); #else BK4819_SetFilterBandwidth(Bandwidth, false); @@ -629,22 +629,22 @@ void RADIO_SetupRegisters(bool bSwitchToFunction0) BK4819_WriteRegister(BK4819_REG_3F, 0); // mic gain 0.5dB/step 0 to 31 - BK4819_WriteRegister(BK4819_REG_7D, 0xE940 | (gEeprom.MIC_SENSITIVITY_TUNING & 0x1f)); + BK4819_WriteRegister(BK4819_REG_7D, 0xE940 | (g_eeprom.mic_sensitivity_tuning & 0x1f)); #ifdef ENABLE_NOAA - if (IS_NOT_NOAA_CHANNEL(gRxVfo->CHANNEL_SAVE) || !gIsNoaaMode) - Frequency = gRxVfo->pRX->Frequency; + if (IS_NOT_NOAA_CHANNEL(gRxVfo->channel_save) || !gIsNoaaMode) + Frequency = gRxVfo->pRX->frequency; else Frequency = NoaaFrequencyTable[gNoaaChannel]; #else - Frequency = gRxVfo->pRX->Frequency; + Frequency = gRxVfo->pRX->frequency; #endif BK4819_SetFrequency(Frequency); BK4819_SetupSquelch( - gRxVfo->SquelchOpenRSSIThresh, gRxVfo->SquelchCloseRSSIThresh, - gRxVfo->SquelchOpenNoiseThresh, gRxVfo->SquelchCloseNoiseThresh, - gRxVfo->SquelchCloseGlitchThresh, gRxVfo->SquelchOpenGlitchThresh); + gRxVfo->squelch_open_RSSI_thresh, gRxVfo->squelch_close_RSSI_thresh, + gRxVfo->squelch_open_noise_thresh, gRxVfo->squelch_close_noise_thresh, + gRxVfo->squelch_close_glitch_thresh, gRxVfo->squelch_open_glitch_thresh); BK4819_PickRXFilterPathBasedOnFrequency(Frequency); @@ -657,20 +657,20 @@ void RADIO_SetupRegisters(bool bSwitchToFunction0) InterruptMask = BK4819_REG_3F_SQUELCH_FOUND | BK4819_REG_3F_SQUELCH_LOST; #ifdef ENABLE_NOAA - if (IS_NOT_NOAA_CHANNEL(gRxVfo->CHANNEL_SAVE)) + if (IS_NOT_NOAA_CHANNEL(gRxVfo->channel_save)) #endif { - if (gRxVfo->AM_mode == 0) + if (gRxVfo->am_mode == 0) { // FM - uint8_t CodeType = gSelectedCodeType; + uint8_t code_type = gSelectedcode_type; uint8_t Code = gSelectedCode; if (gCssScanMode == CSS_SCAN_MODE_OFF) { - CodeType = gRxVfo->pRX->CodeType; - Code = gRxVfo->pRX->Code; + code_type = gRxVfo->pRX->code_type; + Code = gRxVfo->pRX->code; } - switch (CodeType) + switch (code_type) { default: case CODE_TYPE_OFF: @@ -705,7 +705,7 @@ void RADIO_SetupRegisters(bool bSwitchToFunction0) case CODE_TYPE_DIGITAL: case CODE_TYPE_REVERSE_DIGITAL: - BK4819_SetCDCSSCodeWord(DCS_GetGolayCodeWord(CodeType, Code)); + BK4819_SetCDCSSCodeWord(DCS_GetGolayCodeWord(code_type, Code)); InterruptMask = 0 | BK4819_REG_3F_CxCSS_TAIL | BK4819_REG_3F_CDCSS_FOUND @@ -715,8 +715,8 @@ void RADIO_SetupRegisters(bool bSwitchToFunction0) break; } - if (gRxVfo->SCRAMBLING_TYPE > 0 && gSetting_ScrambleEnable) - BK4819_EnableScramble(gRxVfo->SCRAMBLING_TYPE - 1); + if (gRxVfo->scrambling_type > 0 && gSetting_ScrambleEnable) + BK4819_EnableScramble(gRxVfo->scrambling_type - 1); else BK4819_DisableScramble(); } @@ -736,19 +736,19 @@ void RADIO_SetupRegisters(bool bSwitchToFunction0) #ifdef ENABLE_VOX #ifdef ENABLE_NOAA #ifdef ENABLE_FMRADIO - if (gEeprom.VOX_SWITCH && !gFmRadioMode && IS_NOT_NOAA_CHANNEL(gCurrentVfo->CHANNEL_SAVE) && gCurrentVfo->AM_mode == 0) + if (g_eeprom.vox_switch && !gFmRadioMode && IS_NOT_NOAA_CHANNEL(gCurrentVfo->channel_save) && gCurrentVfo->am_mode == 0) #else - if (gEeprom.VOX_SWITCH && IS_NOT_NOAA_CHANNEL(gCurrentVfo->CHANNEL_SAVE) && gCurrentVfo->AM_mode == 0) + if (g_eeprom.vox_switch && IS_NOT_NOAA_CHANNEL(gCurrentVfo->channel_save) && gCurrentVfo->am_mode == 0) #endif #else #ifdef ENABLE_FMRADIO - if (gEeprom.VOX_SWITCH && !gFmRadioMode && gCurrentVfo->AM_mode == 0) + if (g_eeprom.vox_switch && !gFmRadioMode && gCurrentVfo->am_mode == 0) #else - if (gEeprom.VOX_SWITCH && gCurrentVfo->AM_mode == 0) + if (g_eeprom.vox_switch && gCurrentVfo->am_mode == 0) #endif #endif { - BK4819_EnableVox(gEeprom.VOX1_THRESHOLD, gEeprom.VOX0_THRESHOLD); + BK4819_EnableVox(g_eeprom.vox1_threshold, g_eeprom.vox0_threshold); InterruptMask |= BK4819_REG_3F_VOX_FOUND | BK4819_REG_3F_VOX_LOST; } else @@ -756,10 +756,10 @@ void RADIO_SetupRegisters(bool bSwitchToFunction0) BK4819_DisableVox(); // RX expander - BK4819_SetCompander((gRxVfo->AM_mode == 0 && gRxVfo->Compander >= 2) ? gRxVfo->Compander : 0); + BK4819_SetCompander((gRxVfo->am_mode == 0 && gRxVfo->compander >= 2) ? gRxVfo->compander : 0); #if 0 - if (!gRxVfo->DTMF_DECODING_ENABLE && !gSetting_KILLED) + if (!gRxVfo->DTMF_decoding_enable && !gSetting_KILLED) { BK4819_DisableDTMF(); } @@ -797,13 +797,13 @@ void RADIO_SetupRegisters(bool bSwitchToFunction0) gUpdateStatus = true; - if (gEeprom.NOAA_AUTO_SCAN) + if (g_eeprom.NOAA_auto_scan) { - if (gEeprom.DUAL_WATCH != DUAL_WATCH_OFF) + if (g_eeprom.dual_watch != DUAL_WATCH_OFF) { - if (IS_NOT_NOAA_CHANNEL(gEeprom.ScreenChannel[0])) + if (IS_NOT_NOAA_CHANNEL(g_eeprom.screen_channel[0])) { - if (IS_NOT_NOAA_CHANNEL(gEeprom.ScreenChannel[1])) + if (IS_NOT_NOAA_CHANNEL(g_eeprom.screen_channel[1])) { gIsNoaaMode = false; return; @@ -814,16 +814,16 @@ void RADIO_SetupRegisters(bool bSwitchToFunction0) ChanAB = 0; if (!gIsNoaaMode) - gNoaaChannel = gEeprom.VfoInfo[ChanAB].CHANNEL_SAVE - NOAA_CHANNEL_FIRST; + gNoaaChannel = g_eeprom.VfoInfo[ChanAB].channel_save - NOAA_CHANNEL_FIRST; gIsNoaaMode = true; return; } - if (gRxVfo->CHANNEL_SAVE >= NOAA_CHANNEL_FIRST) + if (gRxVfo->channel_save >= NOAA_CHANNEL_FIRST) { gIsNoaaMode = true; - gNoaaChannel = gRxVfo->CHANNEL_SAVE - NOAA_CHANNEL_FIRST; + gNoaaChannel = gRxVfo->channel_save - NOAA_CHANNEL_FIRST; gNOAA_Countdown_10ms = NOAA_countdown_2_10ms; gScheduleNOAA = false; } @@ -837,7 +837,7 @@ void RADIO_SetupRegisters(bool bSwitchToFunction0) void RADIO_SetTxParameters(void) { - BK4819_FilterBandwidth_t Bandwidth = gCurrentVfo->CHANNEL_BANDWIDTH; + BK4819_FilterBandwidth_t Bandwidth = gCurrentVfo->channel_bandwidth; GPIO_ClearBit(&GPIOC->DATA, GPIOC_PIN_AUDIO_PATH); @@ -855,7 +855,7 @@ void RADIO_SetTxParameters(void) case BK4819_FILTER_BW_WIDE: case BK4819_FILTER_BW_NARROW: #ifdef ENABLE_AM_FIX -// BK4819_SetFilterBandwidth(Bandwidth, gCurrentVfo->AM_mode && gSetting_AM_fix); +// BK4819_SetFilterBandwidth(Bandwidth, gCurrentVfo->am_mode && gSetting_AM_fix); BK4819_SetFilterBandwidth(Bandwidth, true); #else BK4819_SetFilterBandwidth(Bandwidth, false); @@ -865,26 +865,26 @@ void RADIO_SetTxParameters(void) #pragma GCC diagnostic pop - BK4819_SetFrequency(gCurrentVfo->pTX->Frequency); + BK4819_SetFrequency(gCurrentVfo->pTX->frequency); // TX compressor - BK4819_SetCompander((gRxVfo->AM_mode == 0 && (gRxVfo->Compander == 1 || gRxVfo->Compander >= 3)) ? gRxVfo->Compander : 0); + BK4819_SetCompander((gRxVfo->am_mode == 0 && (gRxVfo->compander == 1 || gRxVfo->compander >= 3)) ? gRxVfo->compander : 0); BK4819_PrepareTransmit(); SYSTEM_DelayMs(10); - BK4819_PickRXFilterPathBasedOnFrequency(gCurrentVfo->pTX->Frequency); + BK4819_PickRXFilterPathBasedOnFrequency(gCurrentVfo->pTX->frequency); BK4819_ToggleGpioOut(BK4819_GPIO5_PIN1, true); SYSTEM_DelayMs(5); - BK4819_SetupPowerAmplifier(gCurrentVfo->TXP_CalculatedSetting, gCurrentVfo->pTX->Frequency); + BK4819_SetupPowerAmplifier(gCurrentVfo->txp_calculated_setting, gCurrentVfo->pTX->frequency); SYSTEM_DelayMs(10); - switch (gCurrentVfo->pTX->CodeType) + switch (gCurrentVfo->pTX->code_type) { default: case CODE_TYPE_OFF: @@ -892,12 +892,12 @@ void RADIO_SetTxParameters(void) break; case CODE_TYPE_CONTINUOUS_TONE: - BK4819_SetCTCSSFrequency(CTCSS_Options[gCurrentVfo->pTX->Code]); + BK4819_SetCTCSSFrequency(CTCSS_Options[gCurrentVfo->pTX->code]); break; case CODE_TYPE_DIGITAL: case CODE_TYPE_REVERSE_DIGITAL: - BK4819_SetCDCSSCodeWord(DCS_GetGolayCodeWord(gCurrentVfo->pTX->CodeType, gCurrentVfo->pTX->Code)); + BK4819_SetCDCSSCodeWord(DCS_GetGolayCodeWord(gCurrentVfo->pTX->code_type, gCurrentVfo->pTX->code)); break; } } @@ -922,7 +922,7 @@ void RADIO_SetVfoState(VfoState_t State) } else { // 1of11 - const unsigned int vfo = (gEeprom.CROSS_BAND_RX_TX == CROSS_BAND_OFF) ? gEeprom.RX_VFO : gEeprom.TX_VFO; + const unsigned int vfo = (g_eeprom.cross_vfo_rx_tx == CROSS_BAND_OFF) ? g_eeprom.rx_vfo : g_eeprom.tx_vfo; VfoState[vfo] = State; } @@ -938,7 +938,7 @@ void RADIO_PrepareTX(void) { VfoState_t State = VFO_STATE_NORMAL; // default to OK to TX - if (gEeprom.DUAL_WATCH != DUAL_WATCH_OFF) + if (g_eeprom.dual_watch != DUAL_WATCH_OFF) { // dual-RX is enabled gDualWatchCountdown_10ms = dual_watch_count_after_tx_10ms; @@ -947,16 +947,16 @@ void RADIO_PrepareTX(void) #if 0 if (gRxVfoIsActive) { // use the TX vfo - gEeprom.RX_VFO = gEeprom.TX_VFO; - gRxVfo = &gEeprom.VfoInfo[gEeprom.TX_VFO]; + g_eeprom.rx_vfo = g_eeprom.tx_vfo; + gRxVfo = &g_eeprom.VfoInfo[g_eeprom.tx_vfo]; gRxVfoIsActive = false; } gCurrentVfo = gRxVfo; #else if (!gRxVfoIsActive) { // use the current RX vfo - gEeprom.RX_VFO = gEeprom.TX_VFO; - gRxVfo = &gEeprom.VfoInfo[gEeprom.TX_VFO]; + g_eeprom.rx_vfo = g_eeprom.tx_vfo; + gRxVfo = &g_eeprom.VfoInfo[g_eeprom.tx_vfo]; gRxVfoIsActive = true; } gCurrentVfo = gRxVfo; @@ -970,7 +970,7 @@ void RADIO_PrepareTX(void) RADIO_SelectCurrentVfo(); #ifndef ENABLE_TX_WHEN_AM - if (gCurrentVfo->AM_mode) + if (gCurrentVfo->am_mode) { // not allowed to TX if in AM mode State = VFO_STATE_TX_DISABLE; } @@ -981,9 +981,9 @@ void RADIO_PrepareTX(void) State = VFO_STATE_TX_DISABLE; } else - if (TX_freq_check(gCurrentVfo->pTX->Frequency) == 0) + if (TX_freq_check(gCurrentVfo->pTX->frequency) == 0) { // TX frequency is allowed - if (gCurrentVfo->BUSY_CHANNEL_LOCK && gCurrentFunction == FUNCTION_RECEIVE) + if (gCurrentVfo->busy_channel_lock && gCurrentFunction == FUNCTION_RECEIVE) State = VFO_STATE_BUSY; // busy RX'ing a station else if (gBatteryDisplayLevel == 0) @@ -1035,11 +1035,11 @@ void RADIO_PrepareTX(void) if (gAlarmState == ALARM_STATE_OFF) #endif { - if (gEeprom.TX_TIMEOUT_TIMER == 0) + if (g_eeprom.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 + if (g_eeprom.tx_timeout_timer < (ARRAY_SIZE(gSubMenu_TOT) - 1)) + gTxTimerCountdown_500ms = 120 * g_eeprom.tx_timeout_timer; // minutes else gTxTimerCountdown_500ms = 120 * 15; // 15 minutes } @@ -1052,7 +1052,7 @@ void RADIO_PrepareTX(void) void RADIO_EnableCxCSS(void) { - switch (gCurrentVfo->pTX->CodeType) + switch (gCurrentVfo->pTX->code_type) { default: case CODE_TYPE_OFF: @@ -1083,34 +1083,34 @@ void RADIO_PrepareCssTX(void) void RADIO_SendEndOfTransmission(void) { - if (gEeprom.ROGER == ROGER_MODE_ROGER) + if (g_eeprom.roger_mode == ROGER_MODE_ROGER) BK4819_PlayRoger(); else - if (gEeprom.ROGER == ROGER_MODE_MDC) + if (g_eeprom.roger_mode == ROGER_MODE_MDC) BK4819_PlayRogerMDC(); - if (gCurrentVfo->DTMF_PTT_ID_TX_MODE == PTT_ID_APOLLO) - BK4819_PlaySingleTone(2475, 250, 28, gEeprom.DTMF_SIDE_TONE); + if (gCurrentVfo->DTMF_ptt_id_tx_mode == PTT_ID_APOLLO) + BK4819_PlaySingleTone(2475, 250, 28, g_eeprom.DTMF_side_tone); if (gDTMF_CallState == DTMF_CALL_STATE_NONE && - (gCurrentVfo->DTMF_PTT_ID_TX_MODE == PTT_ID_TX_DOWN || gCurrentVfo->DTMF_PTT_ID_TX_MODE == PTT_ID_BOTH)) + (gCurrentVfo->DTMF_ptt_id_tx_mode == PTT_ID_TX_DOWN || gCurrentVfo->DTMF_ptt_id_tx_mode == PTT_ID_BOTH)) { // end-of-tx - if (gEeprom.DTMF_SIDE_TONE) + if (g_eeprom.DTMF_side_tone) { GPIO_SetBit(&GPIOC->DATA, GPIOC_PIN_AUDIO_PATH); gEnableSpeaker = true; SYSTEM_DelayMs(60); } - BK4819_EnterDTMF_TX(gEeprom.DTMF_SIDE_TONE); + BK4819_EnterDTMF_TX(g_eeprom.DTMF_side_tone); BK4819_PlayDTMFString( - gEeprom.DTMF_DOWN_CODE, + g_eeprom.DTMF_down_code, 0, - gEeprom.DTMF_FIRST_CODE_PERSIST_TIME, - gEeprom.DTMF_HASH_CODE_PERSIST_TIME, - gEeprom.DTMF_CODE_PERSIST_TIME, - gEeprom.DTMF_CODE_INTERVAL_TIME); + g_eeprom.DTMF_first_code_persist_time, + g_eeprom.DTMF_hash_code_persist_time, + g_eeprom.DTMF_code_persist_time, + g_eeprom.DTMF_code_interval_time); GPIO_ClearBit(&GPIOC->DATA, GPIOC_PIN_AUDIO_PATH); gEnableSpeaker = false; diff --git a/radio.h b/radio.h index e1d03da..91c4b0a 100644 --- a/radio.h +++ b/radio.h @@ -24,10 +24,10 @@ #include "frequencies.h" enum { - MR_CH_BAND_MASK = 0x0F << 0, - MR_CH_COMPAND = 3u << 4, // new - MR_CH_SCANLIST2 = 1u << 6, - MR_CH_SCANLIST1 = 1u << 7 + USER_CH_BAND_MASK = 0x0F << 0, + USER_CH_COMPAND = 3u << 4, // new + USER_CH_SCANLIST2 = 1u << 6, + USER_CH_SCANLIST1 = 1u << 7 }; enum { @@ -63,67 +63,67 @@ typedef enum VfoState_t VfoState_t; typedef struct { - uint32_t Frequency; - DCS_CodeType_t CodeType; - uint8_t Code; - uint8_t Padding[2]; + uint32_t frequency; + dcs_code_type_t code_type; + uint8_t code; + uint8_t padding[2]; } FREQ_Config_t; typedef struct VFO_Info_t { - FREQ_Config_t freq_config_RX; - FREQ_Config_t freq_config_TX; + FREQ_Config_t freq_config_rx; + FREQ_Config_t freq_config_tx; FREQ_Config_t *pRX; FREQ_Config_t *pTX; - uint32_t TX_OFFSET_FREQUENCY; - uint16_t StepFrequency; + uint32_t tx_offset_freq; + uint16_t step_freq; - uint8_t CHANNEL_SAVE; + uint8_t channel_save; - uint8_t TX_OFFSET_FREQUENCY_DIRECTION; + uint8_t tx_offset_freq_dir; - uint8_t SquelchOpenRSSIThresh; - uint8_t SquelchOpenNoiseThresh; - uint8_t SquelchCloseGlitchThresh; - uint8_t SquelchCloseRSSIThresh; - uint8_t SquelchCloseNoiseThresh; - uint8_t SquelchOpenGlitchThresh; + uint8_t squelch_open_RSSI_thresh; + uint8_t squelch_open_noise_thresh; + uint8_t squelch_close_glitch_thresh; + uint8_t squelch_close_RSSI_thresh; + uint8_t squelch_close_noise_thresh; + uint8_t squelch_open_glitch_thresh; - STEP_Setting_t STEP_SETTING; - uint8_t OUTPUT_POWER; - uint8_t TXP_CalculatedSetting; - bool FrequencyReverse; + step_setting_t step_setting; + uint8_t output_power; + uint8_t txp_calculated_setting; + bool frequency_reverse; - uint8_t SCRAMBLING_TYPE; - uint8_t CHANNEL_BANDWIDTH; + uint8_t scrambling_type; + uint8_t channel_bandwidth; - uint8_t SCANLIST1_PARTICIPATION; - uint8_t SCANLIST2_PARTICIPATION; + uint8_t scanlist_1_participation; + uint8_t scanlist_2_participation; - uint8_t Band; + uint8_t band; - uint8_t DTMF_DECODING_ENABLE; - PTT_ID_t DTMF_PTT_ID_TX_MODE; + uint8_t DTMF_decoding_enable; + PTT_ID_t DTMF_ptt_id_tx_mode; - uint8_t BUSY_CHANNEL_LOCK; + uint8_t busy_channel_lock; - uint8_t AM_mode; + uint8_t am_mode; - uint8_t Compander; + uint8_t compander; - char Name[16]; + char name[16]; } VFO_Info_t; extern VFO_Info_t *gTxVfo; extern VFO_Info_t *gRxVfo; extern VFO_Info_t *gCurrentVfo; -extern DCS_CodeType_t gSelectedCodeType; -extern DCS_CodeType_t gCurrentCodeType; +extern dcs_code_type_t gSelectedcode_type; +extern dcs_code_type_t gCurrentcode_type; extern uint8_t gSelectedCode; -extern STEP_Setting_t gStepSetting; +extern step_setting_t gStepSetting; extern VfoState_t VfoState[2]; diff --git a/scheduler.c b/scheduler.c index 56e5a57..1a6f3cc 100644 --- a/scheduler.c +++ b/scheduler.c @@ -78,12 +78,12 @@ void SystickHandler(void) if (gCurrentFunction == FUNCTION_POWER_SAVE) DECREMENT_AND_TRIGGER(gPowerSave_10ms, gPowerSaveCountdownExpired); - if (gScanStateDir == SCAN_OFF && gCssScanMode == CSS_SCAN_MODE_OFF && gEeprom.DUAL_WATCH != DUAL_WATCH_OFF) + if (gScanStateDir == SCAN_OFF && gCssScanMode == CSS_SCAN_MODE_OFF && g_eeprom.dual_watch != DUAL_WATCH_OFF) if (gCurrentFunction != FUNCTION_MONITOR && gCurrentFunction != FUNCTION_TRANSMIT && gCurrentFunction != FUNCTION_RECEIVE) DECREMENT_AND_TRIGGER(gDualWatchCountdown_10ms, gScheduleDualWatch); #ifdef ENABLE_NOAA - if (gScanStateDir == SCAN_OFF && gCssScanMode == CSS_SCAN_MODE_OFF && gEeprom.DUAL_WATCH == DUAL_WATCH_OFF) + if (gScanStateDir == SCAN_OFF && gCssScanMode == CSS_SCAN_MODE_OFF && g_eeprom.dual_watch == DUAL_WATCH_OFF) if (gIsNoaaMode && gCurrentFunction != FUNCTION_MONITOR && gCurrentFunction != FUNCTION_TRANSMIT) if (gCurrentFunction != FUNCTION_RECEIVE) DECREMENT_AND_TRIGGER(gNOAA_Countdown_10ms, gScheduleNOAA); @@ -96,7 +96,7 @@ void SystickHandler(void) DECREMENT_AND_TRIGGER(gTailNoteEliminationCountdown_10ms, gFlagTailNoteEliminationComplete); #ifdef ENABLE_VOICE - DECREMENT_AND_TRIGGER(gCountdownToPlayNextVoice_10ms, gFlagPlayQueuedVoice); + DECREMENT_AND_TRIGGER(g_count_down_to_play_next_voice_10ms, g_flag_play_queued_voice); #endif #ifdef ENABLE_FMRADIO diff --git a/settings.c b/settings.c index bb7f970..5bb200a 100644 --- a/settings.c +++ b/settings.c @@ -24,7 +24,7 @@ #include "misc.h" #include "settings.h" -EEPROM_Config_t gEeprom; +EEPROM_Config_t g_eeprom; #ifdef ENABLE_FMRADIO void SETTINGS_SaveFM(void) @@ -33,18 +33,19 @@ EEPROM_Config_t gEeprom; struct { - uint16_t Frequency; - uint8_t Channel; - bool IsChannelSelected; - uint8_t Padding[4]; - } State; + uint16_t frequency; + uint8_t channel; + bool is_channel_selected; + uint8_t padding[4]; + } state; - memset(&State, 0xFF, sizeof(State)); - State.Channel = gEeprom.FM_SelectedChannel; - State.Frequency = gEeprom.FM_SelectedFrequency; - State.IsChannelSelected = gEeprom.FM_IsMrMode; + memset(&state, 0xFF, sizeof(state)); + state.channel = g_eeprom.fm_selected_channel; + state.frequency = g_eeprom.fm_selected_frequency; + state.is_channel_selected = g_eeprom.fm_is_channel_mode; + + EEPROM_WriteBuffer(0x0E88, &state); - EEPROM_WriteBuffer(0x0E88, &State); for (i = 0; i < 5; i++) EEPROM_WriteBuffer(0x0E40 + (i * 8), &gFM_Channels[i * 4]); } @@ -58,15 +59,15 @@ void SETTINGS_SaveVfoIndices(void) EEPROM_ReadBuffer(0x0E80, State, sizeof(State)); #endif - State[0] = gEeprom.ScreenChannel[0]; - State[1] = gEeprom.MrChannel[0]; - State[2] = gEeprom.FreqChannel[0]; - State[3] = gEeprom.ScreenChannel[1]; - State[4] = gEeprom.MrChannel[1]; - State[5] = gEeprom.FreqChannel[1]; + State[0] = g_eeprom.screen_channel[0]; + State[1] = g_eeprom.user_channel[0]; + State[2] = g_eeprom.freq_channel[0]; + State[3] = g_eeprom.screen_channel[1]; + State[4] = g_eeprom.user_channel[1]; + State[5] = g_eeprom.freq_channel[1]; #ifdef ENABLE_NOAA - State[6] = gEeprom.NoaaChannel[0]; - State[7] = gEeprom.NoaaChannel[1]; + State[6] = g_eeprom.noaa_channel[0]; + State[7] = g_eeprom.noaa_channel[1]; #endif EEPROM_WriteBuffer(0x0E80, State); @@ -76,43 +77,43 @@ void SETTINGS_SaveSettings(void) { uint8_t State[8]; - State[0] = gEeprom.CHAN_1_CALL; - State[1] = gEeprom.SQUELCH_LEVEL; - State[2] = gEeprom.TX_TIMEOUT_TIMER; + State[0] = g_eeprom.chan_1_call; + State[1] = g_eeprom.squelch_level; + State[2] = g_eeprom.tx_timeout_timer; #ifdef ENABLE_NOAA - State[3] = gEeprom.NOAA_AUTO_SCAN; + State[3] = g_eeprom.NOAA_auto_scan; #else State[3] = false; #endif - State[4] = gEeprom.KEY_LOCK; + State[4] = g_eeprom.key_lock; #ifdef ENABLE_VOX - State[5] = gEeprom.VOX_SWITCH; - State[6] = gEeprom.VOX_LEVEL; + State[5] = g_eeprom.vox_switch; + State[6] = g_eeprom.vox_level; #else State[5] = false; State[6] = 0; #endif - State[7] = gEeprom.MIC_SENSITIVITY; + State[7] = g_eeprom.mic_sensitivity; EEPROM_WriteBuffer(0x0E70, State); State[0] = 0xFF; - State[1] = gEeprom.CHANNEL_DISPLAY_MODE; - State[2] = gEeprom.CROSS_BAND_RX_TX; - State[3] = gEeprom.BATTERY_SAVE; - State[4] = gEeprom.DUAL_WATCH; - State[5] = gEeprom.BACKLIGHT; - State[6] = gEeprom.TAIL_NOTE_ELIMINATION; - State[7] = gEeprom.VFO_OPEN; + State[1] = g_eeprom.channel_display_mode; + State[2] = g_eeprom.cross_vfo_rx_tx; + State[3] = g_eeprom.battery_save; + State[4] = g_eeprom.dual_watch; + State[5] = g_eeprom.backlight; + State[6] = g_eeprom.tail_note_elimination; + State[7] = g_eeprom.vfo_open; EEPROM_WriteBuffer(0x0E78, State); - State[0] = gEeprom.BEEP_CONTROL; - State[1] = gEeprom.KEY_1_SHORT_PRESS_ACTION; - State[2] = gEeprom.KEY_1_LONG_PRESS_ACTION; - State[3] = gEeprom.KEY_2_SHORT_PRESS_ACTION; - State[4] = gEeprom.KEY_2_LONG_PRESS_ACTION; - State[5] = gEeprom.SCAN_RESUME_MODE; - State[6] = gEeprom.AUTO_KEYPAD_LOCK; - State[7] = gEeprom.POWER_ON_DISPLAY_MODE; + State[0] = g_eeprom.beep_control; + State[1] = g_eeprom.key1_short_press_action; + State[2] = g_eeprom.key1_long_press_action; + State[3] = g_eeprom.key2_short_press_action; + State[4] = g_eeprom.key2_long_press_action; + State[5] = g_eeprom.scan_resume_mode; + State[6] = g_eeprom.auto_keypad_lock; + State[7] = g_eeprom.pwr_on_display_mode; EEPROM_WriteBuffer(0x0E90, State); { @@ -123,7 +124,7 @@ void SETTINGS_SaveSettings(void) memset(&array, 0xff, sizeof(array)); #ifdef ENABLE_PWRON_PASSWORD - array.password = gEeprom.POWER_ON_PASSWORD; + array.password = g_eeprom.power_on_password; #endif EEPROM_WriteBuffer(0x0E98, &array); @@ -131,43 +132,43 @@ void SETTINGS_SaveSettings(void) #ifdef ENABLE_VOICE memset(State, 0xFF, sizeof(State)); - State[0] = gEeprom.VOICE_PROMPT; + State[0] = g_eeprom.voice_prompt; EEPROM_WriteBuffer(0x0EA0, State); #endif #if defined(ENABLE_ALARM) || defined(ENABLE_TX1750) - State[0] = gEeprom.ALARM_MODE; + State[0] = g_eeprom.alarm_mode; #else State[0] = false; #endif - State[1] = gEeprom.ROGER; - State[2] = gEeprom.REPEATER_TAIL_TONE_ELIMINATION; - State[3] = gEeprom.TX_VFO; + State[1] = g_eeprom.roger_mode; + State[2] = g_eeprom.repeater_tail_tone_elimination; + State[3] = g_eeprom.tx_vfo; EEPROM_WriteBuffer(0x0EA8, State); - State[0] = gEeprom.DTMF_SIDE_TONE; - State[1] = gEeprom.DTMF_SEPARATE_CODE; - State[2] = gEeprom.DTMF_GROUP_CALL_CODE; - State[3] = gEeprom.DTMF_DECODE_RESPONSE; - State[4] = gEeprom.DTMF_auto_reset_time; - State[5] = gEeprom.DTMF_PRELOAD_TIME / 10U; - State[6] = gEeprom.DTMF_FIRST_CODE_PERSIST_TIME / 10U; - State[7] = gEeprom.DTMF_HASH_CODE_PERSIST_TIME / 10U; + State[0] = g_eeprom.DTMF_side_tone; + State[1] = g_eeprom.DTMF_separate_code; + State[2] = g_eeprom.DTMF_group_call_code; + State[3] = g_eeprom.DTMF_decode_response; + State[4] = g_eeprom.DTMF_auto_reset_time; + State[5] = g_eeprom.DTMF_preload_time / 10U; + State[6] = g_eeprom.DTMF_first_code_persist_time / 10U; + State[7] = g_eeprom.DTMF_hash_code_persist_time / 10U; EEPROM_WriteBuffer(0x0ED0, State); memset(State, 0xFF, sizeof(State)); - State[0] = gEeprom.DTMF_CODE_PERSIST_TIME / 10U; - State[1] = gEeprom.DTMF_CODE_INTERVAL_TIME / 10U; - State[2] = gEeprom.PERMIT_REMOTE_KILL; + State[0] = g_eeprom.DTMF_code_persist_time / 10U; + State[1] = g_eeprom.DTMF_code_interval_time / 10U; + State[2] = g_eeprom.permit_remote_kill; EEPROM_WriteBuffer(0x0ED8, State); - State[0] = gEeprom.SCAN_LIST_DEFAULT; - State[1] = gEeprom.SCAN_LIST_ENABLED[0]; - State[2] = gEeprom.SCANLIST_PRIORITY_CH1[0]; - State[3] = gEeprom.SCANLIST_PRIORITY_CH2[0]; - State[4] = gEeprom.SCAN_LIST_ENABLED[1]; - State[5] = gEeprom.SCANLIST_PRIORITY_CH1[1]; - State[6] = gEeprom.SCANLIST_PRIORITY_CH2[1]; + State[0] = g_eeprom.scan_list_default; + State[1] = g_eeprom.scan_list_enabled[0]; + State[2] = g_eeprom.scan_list_priority_ch1[0]; + State[3] = g_eeprom.scan_list_priority_ch2[0]; + State[4] = g_eeprom.scan_list_enabled[1]; + State[5] = g_eeprom.scan_list_priority_ch1[1]; + State[6] = g_eeprom.scan_list_priority_ch2[1]; State[7] = 0xFF; EEPROM_WriteBuffer(0x0F18, State); @@ -202,38 +203,38 @@ void SETTINGS_SaveChannel(uint8_t Channel, uint8_t VFO, const VFO_Info_t *pVFO, const uint16_t OffsetMR = Channel * 16; uint16_t OffsetVFO = OffsetMR; - if (Channel > MR_CHANNEL_LAST) + if (Channel > USER_CHANNEL_LAST) { // it's a VFO, not a channel OffsetVFO = (VFO == 0) ? 0x0C80 : 0x0C90; OffsetVFO += (Channel - FREQ_CHANNEL_FIRST) * 32; } - if (Mode >= 2 || Channel > MR_CHANNEL_LAST) + if (Mode >= 2 || Channel > USER_CHANNEL_LAST) { // copy VFO to a channel uint8_t State[8]; - ((uint32_t *)State)[0] = pVFO->freq_config_RX.Frequency; - ((uint32_t *)State)[1] = pVFO->TX_OFFSET_FREQUENCY; + ((uint32_t *)State)[0] = pVFO->freq_config_rx.frequency; + ((uint32_t *)State)[1] = pVFO->tx_offset_freq; EEPROM_WriteBuffer(OffsetVFO + 0, State); - State[0] = pVFO->freq_config_RX.Code; - State[1] = pVFO->freq_config_TX.Code; - State[2] = (pVFO->freq_config_TX.CodeType << 4) | pVFO->freq_config_RX.CodeType; - State[3] = ((pVFO->AM_mode & 1u) << 4) | pVFO->TX_OFFSET_FREQUENCY_DIRECTION; + State[0] = pVFO->freq_config_rx.code; + State[1] = pVFO->freq_config_tx.code; + State[2] = (pVFO->freq_config_tx.code_type << 4) | pVFO->freq_config_rx.code_type; + State[3] = ((pVFO->am_mode & 1u) << 4) | pVFO->tx_offset_freq_dir; State[4] = 0 - | (pVFO->BUSY_CHANNEL_LOCK << 4) - | (pVFO->OUTPUT_POWER << 2) - | (pVFO->CHANNEL_BANDWIDTH << 1) - | (pVFO->FrequencyReverse << 0); - State[5] = ((pVFO->DTMF_PTT_ID_TX_MODE & 7u) << 1) | ((pVFO->DTMF_DECODING_ENABLE & 1u) << 0); - State[6] = pVFO->STEP_SETTING; - State[7] = pVFO->SCRAMBLING_TYPE; + | (pVFO->busy_channel_lock << 4) + | (pVFO->output_power << 2) + | (pVFO->channel_bandwidth << 1) + | (pVFO->frequency_reverse << 0); + State[5] = ((pVFO->DTMF_ptt_id_tx_mode & 7u) << 1) | ((pVFO->DTMF_decoding_enable & 1u) << 0); + State[6] = pVFO->step_setting; + State[7] = pVFO->scrambling_type; EEPROM_WriteBuffer(OffsetVFO + 8, State); SETTINGS_UpdateChannel(Channel, pVFO, true); - if (Channel <= MR_CHANNEL_LAST) + if (Channel <= USER_CHANNEL_LAST) { // it's a memory channel #ifndef ENABLE_KEEP_MEM_NAME @@ -245,11 +246,11 @@ void SETTINGS_SaveChannel(uint8_t Channel, uint8_t VFO, const VFO_Info_t *pVFO, #else if (Mode >= 3) { // save the channel name - memmove(State, pVFO->Name + 0, 8); + memmove(State, pVFO->name + 0, 8); EEPROM_WriteBuffer(0x0F50 + OffsetMR, State); //memset(State, 0xFF, sizeof(State)); memset(State, 0x00, sizeof(State)); // follow the QS way - memmove(State, pVFO->Name + 8, 2); + memmove(State, pVFO->name + 8, 2); EEPROM_WriteBuffer(0x0F58 + OffsetMR, State); } #endif @@ -268,13 +269,13 @@ void SETTINGS_UpdateChannel(uint8_t Channel, const VFO_Info_t *pVFO, bool keep) uint8_t Attributes = 0xFF; // default attributes uint16_t Offset = 0x0D60 + (Channel & ~7u); - Attributes &= (uint8_t)(~MR_CH_COMPAND); // default to '0' = compander disabled + Attributes &= (uint8_t)(~USER_CH_COMPAND); // default to '0' = compander disabled EEPROM_ReadBuffer(Offset, State, sizeof(State)); if (keep) { - Attributes = (pVFO->SCANLIST1_PARTICIPATION << 7) | (pVFO->SCANLIST2_PARTICIPATION << 6) | (pVFO->Compander << 4) | (pVFO->Band << 0); + Attributes = (pVFO->scanlist_1_participation << 7) | (pVFO->scanlist_2_participation << 6) | (pVFO->compander << 4) | (pVFO->band << 0); if (State[Channel & 7u] == Attributes) return; // no change in the attributes } @@ -283,10 +284,10 @@ void SETTINGS_UpdateChannel(uint8_t Channel, const VFO_Info_t *pVFO, bool keep) EEPROM_WriteBuffer(Offset, State); - gMR_ChannelAttributes[Channel] = Attributes; + gUSER_ChannelAttributes[Channel] = Attributes; // #ifndef ENABLE_KEEP_MEM_NAME - if (Channel <= MR_CHANNEL_LAST) + if (Channel <= USER_CHANNEL_LAST) { // it's a memory channel const uint16_t OffsetMR = Channel * 16; @@ -299,11 +300,11 @@ void SETTINGS_UpdateChannel(uint8_t Channel, const VFO_Info_t *pVFO, bool keep) } // else // { // update the channel name -// memmove(State, pVFO->Name + 0, 8); +// memmove(State, pVFO->name + 0, 8); // EEPROM_WriteBuffer(0x0F50 + OffsetMR, State); // //memset(State, 0xFF, sizeof(State)); // memset(State, 0x00, sizeof(State)); // follow the QS way -// memmove(State, pVFO->Name + 8, 2); +// memmove(State, pVFO->name + 8, 2); // EEPROM_WriteBuffer(0x0F58 + OffsetMR, State); // } } diff --git a/settings.h b/settings.h index d741138..6ee168c 100644 --- a/settings.h +++ b/settings.h @@ -23,13 +23,13 @@ #include "frequencies.h" #include "radio.h" -enum POWER_OnDisplayMode_t { - POWER_ON_DISPLAY_MODE_FULL_SCREEN = 0, - POWER_ON_DISPLAY_MODE_MESSAGE, - POWER_ON_DISPLAY_MODE_VOLTAGE, - POWER_ON_DISPLAY_MODE_NONE +enum pwr_on_display_mode_e { + PWR_ON_DISPLAY_MODE_FULL_SCREEN = 0, + PWR_ON_DISPLAY_MODE_MESSAGE, + PWR_ON_DISPLAY_MODE_VOLTAGE, + PWR_ON_DISPLAY_MODE_NONE }; -typedef enum POWER_OnDisplayMode_t POWER_OnDisplayMode_t; +typedef enum pwr_on_display_mode_e pwr_on_display_mode_t; enum { F_LOCK_OFF = 0, @@ -59,9 +59,9 @@ enum { }; enum { - TX_OFFSET_FREQUENCY_DIRECTION_OFF = 0, - TX_OFFSET_FREQUENCY_DIRECTION_ADD, - TX_OFFSET_FREQUENCY_DIRECTION_SUB + TX_OFFSET_FREQ_DIR_OFF = 0, + TX_OFFSET_FREQ_DIR_ADD, + TX_OFFSET_FREQ_DIR_SUB }; enum { @@ -84,79 +84,79 @@ enum { }; #ifdef ENABLE_VOICE - enum VOICE_Prompt_t + enum voice_prompt_e { VOICE_PROMPT_OFF = 0, VOICE_PROMPT_CHINESE, VOICE_PROMPT_ENGLISH }; - typedef enum VOICE_Prompt_t VOICE_Prompt_t; + typedef enum voice_prompt_e voice_prompt_t; #endif -enum ALARM_Mode_t { - ALARM_MODE_SITE = 0, +enum alarm_mode_e { + alarm_mode_SITE = 0, ALARM_MODE_TONE }; -typedef enum ALARM_Mode_t ALARM_Mode_t; +typedef enum alarm_mode_e alarm_mode_t; -enum ROGER_Mode_t { +enum roger_mode_e { ROGER_MODE_OFF = 0, ROGER_MODE_ROGER, ROGER_MODE_MDC }; -typedef enum ROGER_Mode_t ROGER_Mode_t; +typedef enum roger_mode_e roger_mode_t; -enum CHANNEL_DisplayMode_t { +enum mdf_display_mode_e { MDF_FREQUENCY = 0, MDF_CHANNEL, MDF_NAME, MDF_NAME_FREQ }; -typedef enum CHANNEL_DisplayMode_t CHANNEL_DisplayMode_t; +typedef enum mdf_display_mode_e mdf_display_mode_t; typedef struct { - uint8_t ScreenChannel[2]; - uint8_t FreqChannel[2]; - uint8_t MrChannel[2]; + uint8_t screen_channel[2]; + uint8_t freq_channel[2]; + uint8_t user_channel[2]; #ifdef ENABLE_NOAA - uint8_t NoaaChannel[2]; + uint8_t noaa_channel[2]; #endif - uint8_t RX_VFO; - uint8_t TX_VFO; + uint8_t rx_vfo; + uint8_t tx_vfo; uint8_t field7_0xa; uint8_t field8_0xb; #ifdef ENABLE_FMRADIO - uint16_t FM_SelectedFrequency; - uint8_t FM_SelectedChannel; - bool FM_IsMrMode; - uint16_t FM_FrequencyPlaying; - uint16_t FM_LowerLimit; - uint16_t FM_UpperLimit; + uint16_t fm_selected_frequency; + uint8_t fm_selected_channel; + bool fm_is_channel_mode; + uint16_t fm_frequency_playing; + uint16_t fm_lower_limit; + uint16_t fm_upper_limit; #endif - uint8_t SQUELCH_LEVEL; - uint8_t TX_TIMEOUT_TIMER; - bool KEY_LOCK; - bool VOX_SWITCH; - uint8_t VOX_LEVEL; + uint8_t squelch_level; + uint8_t tx_timeout_timer; + bool key_lock; + bool vox_switch; + uint8_t vox_level; #ifdef ENABLE_VOICE - VOICE_Prompt_t VOICE_PROMPT; + voice_prompt_t voice_prompt; #endif - bool BEEP_CONTROL; - uint8_t CHANNEL_DISPLAY_MODE; - bool TAIL_NOTE_ELIMINATION; - bool VFO_OPEN; - uint8_t DUAL_WATCH; - uint8_t CROSS_BAND_RX_TX; - uint8_t BATTERY_SAVE; - uint8_t BACKLIGHT; - uint8_t SCAN_RESUME_MODE; - uint8_t SCAN_LIST_DEFAULT; - bool SCAN_LIST_ENABLED[2]; - uint8_t SCANLIST_PRIORITY_CH1[2]; - uint8_t SCANLIST_PRIORITY_CH2[2]; + bool beep_control; + uint8_t channel_display_mode; + bool tail_note_elimination; + bool vfo_open; + uint8_t dual_watch; + uint8_t cross_vfo_rx_tx; + uint8_t battery_save; + uint8_t backlight; + uint8_t scan_resume_mode; + uint8_t scan_list_default; + bool scan_list_enabled[2]; + uint8_t scan_list_priority_ch1[2]; + uint8_t scan_list_priority_ch2[2]; uint8_t field29_0x26; uint8_t field30_0x27; @@ -164,55 +164,54 @@ typedef struct { uint8_t field37_0x32; uint8_t field38_0x33; - bool AUTO_KEYPAD_LOCK; + bool auto_keypad_lock; + #if defined(ENABLE_ALARM) || defined(ENABLE_TX1750) - ALARM_Mode_t ALARM_MODE; + alarm_mode_t alarm_mode; #endif - POWER_OnDisplayMode_t POWER_ON_DISPLAY_MODE; - ROGER_Mode_t ROGER; - uint8_t REPEATER_TAIL_TONE_ELIMINATION; - uint8_t KEY_1_SHORT_PRESS_ACTION; - uint8_t KEY_1_LONG_PRESS_ACTION; - uint8_t KEY_2_SHORT_PRESS_ACTION; - uint8_t KEY_2_LONG_PRESS_ACTION; - uint8_t MIC_SENSITIVITY; - uint8_t MIC_SENSITIVITY_TUNING; - uint8_t CHAN_1_CALL; - char ANI_DTMF_ID[8]; - char KILL_CODE[8]; - char REVIVE_CODE[8]; - char DTMF_UP_CODE[16]; + pwr_on_display_mode_t pwr_on_display_mode; + roger_mode_t roger_mode; + uint8_t repeater_tail_tone_elimination; + uint8_t key1_short_press_action; + uint8_t key1_long_press_action; + uint8_t key2_short_press_action; + uint8_t key2_long_press_action; + uint8_t mic_sensitivity; + uint8_t mic_sensitivity_tuning; + uint8_t chan_1_call; + char ani_DTMF_id[8]; + char kill_code[8]; + char revive_code[8]; + char DTMF_up_code[16]; + char DTMF_down_code[16]; uint8_t field57_0x6c; uint8_t field58_0x6d; - char DTMF_DOWN_CODE[16]; - uint8_t field60_0x7e; uint8_t field61_0x7f; - char DTMF_SEPARATE_CODE; - char DTMF_GROUP_CALL_CODE; - uint8_t DTMF_DECODE_RESPONSE; + char DTMF_separate_code; + char DTMF_group_call_code; + uint8_t DTMF_decode_response; uint8_t DTMF_auto_reset_time; - uint16_t DTMF_PRELOAD_TIME; - uint16_t DTMF_FIRST_CODE_PERSIST_TIME; - uint16_t DTMF_HASH_CODE_PERSIST_TIME; - uint16_t DTMF_CODE_PERSIST_TIME; - uint16_t DTMF_CODE_INTERVAL_TIME; - bool DTMF_SIDE_TONE; - bool PERMIT_REMOTE_KILL; - int16_t BK4819_XTAL_FREQ_LOW; + uint16_t DTMF_preload_time; + uint16_t DTMF_first_code_persist_time; + uint16_t DTMF_hash_code_persist_time; + uint16_t DTMF_code_persist_time; + uint16_t DTMF_code_interval_time; + bool DTMF_side_tone; + bool permit_remote_kill; + int16_t BK4819_xtal_freq_low; #ifdef ENABLE_NOAA - bool NOAA_AUTO_SCAN; + bool NOAA_auto_scan; #endif - uint8_t VOLUME_GAIN; - uint8_t DAC_GAIN; - + uint8_t volume_gain; + uint8_t dac_gain; VFO_Info_t VfoInfo[2]; - uint32_t POWER_ON_PASSWORD; - uint16_t VOX1_THRESHOLD; - uint16_t VOX0_THRESHOLD; + uint32_t power_on_password; + uint16_t vox1_threshold; + uint16_t vox0_threshold; uint8_t field77_0x95; uint8_t field78_0x96; @@ -220,7 +219,8 @@ typedef struct { uint8_t _pad[1]; } EEPROM_Config_t; -extern EEPROM_Config_t gEeprom; + +extern EEPROM_Config_t g_eeprom; #ifdef ENABLE_FMRADIO void SETTINGS_SaveFM(void); diff --git a/ui/aircopy.c b/ui/aircopy.c index 1163275..4dfa6d9 100644 --- a/ui/aircopy.c +++ b/ui/aircopy.c @@ -44,7 +44,7 @@ void UI_DisplayAircopy(void) if (gInputBoxIndex == 0) { - NUMBER_ToDigits(gRxVfo->freq_config_RX.Frequency, String); + NUMBER_ToDigits(gRxVfo->freq_config_rx.frequency, String); UI_DisplayFrequency(String, 16, 2, 0, 0); UI_DisplaySmallDigits(2, String + 6, 97, 3, true); } diff --git a/ui/fmradio.c b/ui/fmradio.c index 9574f5f..39468c6 100644 --- a/ui/fmradio.c +++ b/ui/fmradio.c @@ -53,11 +53,11 @@ void UI_DisplayFM(void) { if (gFM_ScanState == FM_SCAN_OFF) { - if (!gEeprom.FM_IsMrMode) + if (!g_eeprom.fm_is_channel_mode) { for (i = 0; i < 20; i++) { - if (gEeprom.FM_FrequencyPlaying == gFM_Channels[i]) + if (g_eeprom.fm_frequency_playing == gFM_Channels[i]) { sprintf(String, "VFO(CH%02u)", i + 1); break; @@ -68,7 +68,7 @@ void UI_DisplayFM(void) strcpy(String, "VFO"); } else - sprintf(String, "MR(CH%02u)", gEeprom.FM_SelectedChannel + 1); + sprintf(String, "MR(CH%02u)", g_eeprom.fm_selected_channel + 1); } else { @@ -81,7 +81,7 @@ void UI_DisplayFM(void) UI_PrintString(String, 0, 127, 2, 10); memset(String, 0, sizeof(String)); - if (gAskToSave || (gEeprom.FM_IsMrMode && gInputBoxIndex > 0)) + if (gAskToSave || (g_eeprom.fm_is_channel_mode && gInputBoxIndex > 0)) { UI_GenerateChannelString(String, gFM_ChannelPosition); } @@ -90,7 +90,7 @@ void UI_DisplayFM(void) { if (gInputBoxIndex == 0) { - NUMBER_ToDigits(gEeprom.FM_FrequencyPlaying * 10000, String); + NUMBER_ToDigits(g_eeprom.fm_frequency_playing * 10000, String); UI_DisplayFrequency(String, 23, 4, false, true); } else @@ -101,7 +101,7 @@ void UI_DisplayFM(void) } else { - sprintf(String, "CH-%02u", gEeprom.FM_SelectedChannel + 1); + sprintf(String, "CH-%02u", g_eeprom.fm_selected_channel + 1); } UI_PrintString(String, 0, 127, 4, 10); diff --git a/ui/inputbox.c b/ui/inputbox.c index e352cce..0900990 100644 --- a/ui/inputbox.c +++ b/ui/inputbox.c @@ -21,7 +21,7 @@ char gInputBox[8]; uint8_t gInputBoxIndex; -void INPUTBOX_Append(const KEY_Code_t Digit) +void INPUTBOX_Append(const key_code_t Digit) { if (gInputBoxIndex >= sizeof(gInputBox)) return; diff --git a/ui/inputbox.h b/ui/inputbox.h index d7a6d2e..419f2a6 100644 --- a/ui/inputbox.h +++ b/ui/inputbox.h @@ -24,7 +24,7 @@ extern char gInputBox[8]; extern uint8_t gInputBoxIndex; -void INPUTBOX_Append(const KEY_Code_t Digit); +void INPUTBOX_Append(const key_code_t Digit); #endif diff --git a/ui/lock.c b/ui/lock.c index 1dca0a2..3d32ba0 100644 --- a/ui/lock.c +++ b/ui/lock.c @@ -50,7 +50,7 @@ static void Render(void) void UI_DisplayLock(void) { - KEY_Code_t Key; + key_code_t Key; BEEP_Type_t Beep; gUpdateDisplay = true; @@ -67,17 +67,17 @@ void UI_DisplayLock(void) Key = KEYBOARD_Poll(); - if (gKeyReading0 == Key) + if (g_key_reading_0 == Key) { - if (++gDebounceCounter == key_debounce_10ms) + if (++g_debounce_counter == key_debounce_10ms) { if (Key == KEY_INVALID) { - gKeyReading1 = KEY_INVALID; + g_key_reading_1 = KEY_INVALID; } else { - gKeyReading1 = Key; + g_key_reading_1 = Key; switch (Key) { @@ -105,7 +105,7 @@ void UI_DisplayLock(void) NUMBER_Get(gInputBox, &Password); - if ((gEeprom.POWER_ON_PASSWORD * 100) == Password) + if ((g_eeprom.power_on_password * 100) == Password) { AUDIO_PlayBeep(BEEP_1KHZ_60MS_OPTIONAL); return; @@ -140,8 +140,8 @@ void UI_DisplayLock(void) } else { - gDebounceCounter = 0; - gKeyReading0 = Key; + g_debounce_counter = 0; + g_key_reading_0 = Key; } if (UART_IsCommandAvailable()) diff --git a/ui/main.c b/ui/main.c index ba36039..998c39f 100644 --- a/ui/main.c +++ b/ui/main.c @@ -56,11 +56,11 @@ center_line_t center_line = CENTER_LINE_NONE; if (center_line != CENTER_LINE_NONE && center_line != CENTER_LINE_TX_TIMEOUT) return false; - if (gEeprom.TX_TIMEOUT_TIMER == 0) + if (g_eeprom.tx_timeout_timer == 0) timeout_secs = 30; // 30 sec else - if (gEeprom.TX_TIMEOUT_TIMER < (ARRAY_SIZE(gSubMenu_TOT) - 1)) - timeout_secs = 60 * gEeprom.TX_TIMEOUT_TIMER; // minutes + if (g_eeprom.tx_timeout_timer < (ARRAY_SIZE(gSubMenu_TOT) - 1)) + timeout_secs = 60 * g_eeprom.tx_timeout_timer; // minutes else timeout_secs = 60 * 15; // 15 minutes @@ -240,7 +240,7 @@ void UI_drawBars(uint8_t *p, const unsigned int level) char s[16]; unsigned int i; - if (gEeprom.KEY_LOCK && gKeypadLocked > 0) + if (g_eeprom.key_lock && gKeypadLocked > 0) return; // display is in use if (gCurrentFunction == FUNCTION_TRANSMIT || @@ -313,10 +313,10 @@ void UI_UpdateRSSI(const int16_t rssi, const int vfo) // 0000C0 6E 00 78 00 82 00 8C 00 B4 00 BE 00 C8 00 D2 00 // const unsigned int band = 1; - const int16_t level0 = gEEPROM_RSSI_CALIB[band][0]; - const int16_t level1 = gEEPROM_RSSI_CALIB[band][1]; - const int16_t level2 = gEEPROM_RSSI_CALIB[band][2]; - const int16_t level3 = gEEPROM_RSSI_CALIB[band][3]; + const int16_t level0 = g_eeprom_RSSI_CALIB[band][0]; + const int16_t level1 = g_eeprom_RSSI_CALIB[band][1]; + const int16_t level2 = g_eeprom_RSSI_CALIB[band][2]; + const int16_t level3 = g_eeprom_RSSI_CALIB[band][3]; #else const int16_t level0 = (-115 + 160) * 2; // dB const int16_t level1 = ( -89 + 160) * 2; // dB @@ -352,7 +352,7 @@ void UI_UpdateRSSI(const int16_t rssi, const int vfo) // ********************************************************** - if (gEeprom.KEY_LOCK && gKeypadLocked > 0) + if (g_eeprom.key_lock && gKeypadLocked > 0) return; // display is in use if (gCurrentFunction == FUNCTION_TRANSMIT || gScreenToDisplay != DISPLAY_MAIN) @@ -385,7 +385,7 @@ void UI_DisplayMain(void) center_line = CENTER_LINE_NONE; // #ifdef SINGLE_VFO_CHAN -// const bool single_vfo = (gEeprom.DUAL_WATCH == DUAL_WATCH_OFF && gEeprom.CROSS_BAND_RX_TX == CROSS_BAND_OFF) ? true : false; +// const bool single_vfo = (g_eeprom.dual_watch == DUAL_WATCH_OFF && g_eeprom.cross_vfo_rx_tx == CROSS_BAND_OFF) ? true : false; // #else const bool single_vfo = false; // #endif @@ -393,7 +393,7 @@ void UI_DisplayMain(void) // clear the screen memset(gFrameBuffer, 0, sizeof(gFrameBuffer)); - if (gEeprom.KEY_LOCK && gKeypadLocked > 0) + if (g_eeprom.key_lock && gKeypadLocked > 0) { // tell user how to unlock the keyboard UI_PrintString("Long press #", 0, LCD_WIDTH, 1, 8); UI_PrintString("to unlock", 0, LCD_WIDTH, 3, 8); @@ -404,8 +404,8 @@ void UI_DisplayMain(void) for (vfo_num = 0; vfo_num < 2; vfo_num++) { const unsigned int line = (vfo_num == 0) ? line0 : line1; - unsigned int channel = gEeprom.TX_VFO; -// unsigned int tx_channel = (gEeprom.CROSS_BAND_RX_TX == CROSS_BAND_OFF) ? gEeprom.RX_VFO : gEeprom.TX_VFO; + unsigned int channel = g_eeprom.tx_vfo; +// unsigned int tx_channel = (g_eeprom.cross_vfo_rx_tx == CROSS_BAND_OFF) ? g_eeprom.rx_vfo : g_eeprom.tx_vfo; const bool same_vfo = (channel == vfo_num) ? true : false; uint8_t *p_line0 = gFrameBuffer[line + 0]; uint8_t *p_line1 = gFrameBuffer[line + 1]; @@ -421,8 +421,8 @@ void UI_DisplayMain(void) } - if (gEeprom.DUAL_WATCH != DUAL_WATCH_OFF && gRxVfoIsActive) - channel = gEeprom.RX_VFO; // we're currently monitoring the other VFO + if (g_eeprom.dual_watch != DUAL_WATCH_OFF && gRxVfoIsActive) + channel = g_eeprom.rx_vfo; // we're currently monitoring the other VFO if (channel != vfo_num) { @@ -472,7 +472,7 @@ void UI_DisplayMain(void) if (!single_vfo && same_vfo) memmove(p_line0 + 0, BITMAP_VFO_Default, sizeof(BITMAP_VFO_Default)); else - if (gEeprom.CROSS_BAND_RX_TX != CROSS_BAND_OFF) + if (g_eeprom.cross_vfo_rx_tx != CROSS_BAND_OFF) memmove(p_line0 + 0, BITMAP_VFO_NotDefault, sizeof(BITMAP_VFO_NotDefault)); } else @@ -481,7 +481,7 @@ void UI_DisplayMain(void) if (same_vfo) memmove(p_line0 + 0, BITMAP_VFO_Default, sizeof(BITMAP_VFO_Default)); else - //if (gEeprom.CROSS_BAND_RX_TX != CROSS_BAND_OFF) + //if (g_eeprom.cross_vfo_rx_tx != CROSS_BAND_OFF) memmove(p_line0 + 0, BITMAP_VFO_NotDefault, sizeof(BITMAP_VFO_NotDefault)); } @@ -494,7 +494,7 @@ void UI_DisplayMain(void) else #endif { - channel = (gEeprom.CROSS_BAND_RX_TX == CROSS_BAND_OFF) ? gEeprom.RX_VFO : gEeprom.TX_VFO; + channel = (g_eeprom.cross_vfo_rx_tx == CROSS_BAND_OFF) ? g_eeprom.rx_vfo : g_eeprom.tx_vfo; if (channel == vfo_num) { // show the TX symbol mode = 1; @@ -512,7 +512,7 @@ void UI_DisplayMain(void) if ((gCurrentFunction == FUNCTION_RECEIVE || gCurrentFunction == FUNCTION_MONITOR || gCurrentFunction == FUNCTION_INCOMING) && - gEeprom.RX_VFO == vfo_num) + g_eeprom.rx_vfo == vfo_num) { #ifdef ENABLE_SMALL_BOLD UI_PrintStringSmallBold("RX", 14, 0, line); @@ -522,32 +522,32 @@ void UI_DisplayMain(void) } } - if (gEeprom.ScreenChannel[vfo_num] <= MR_CHANNEL_LAST) + if (g_eeprom.screen_channel[vfo_num] <= USER_CHANNEL_LAST) { // channel mode const unsigned int x = 2; - const bool inputting = (gInputBoxIndex == 0 || gEeprom.TX_VFO != vfo_num) ? false : true; + const bool inputting = (gInputBoxIndex == 0 || g_eeprom.tx_vfo != vfo_num) ? false : true; if (!inputting) - NUMBER_ToDigits(gEeprom.ScreenChannel[vfo_num] + 1, String); // show the memory channel number + NUMBER_ToDigits(g_eeprom.screen_channel[vfo_num] + 1, String); // show the memory channel number else memmove(String + 5, gInputBox, 3); // show the input text UI_PrintStringSmall("M", x, 0, line + 1); UI_DisplaySmallDigits(3, String + 5, x + 7, line + 1, inputting); } else - if (IS_FREQ_CHANNEL(gEeprom.ScreenChannel[vfo_num])) + if (IS_FREQ_CHANNEL(g_eeprom.screen_channel[vfo_num])) { // frequency mode // show the frequency band number const unsigned int x = 2; // was 14 -// sprintf(String, "FB%u", 1 + gEeprom.ScreenChannel[vfo_num] - FREQ_CHANNEL_FIRST); - sprintf(String, "VFO%u", 1 + gEeprom.ScreenChannel[vfo_num] - FREQ_CHANNEL_FIRST); +// sprintf(String, "FB%u", 1 + g_eeprom.screen_channel[vfo_num] - FREQ_CHANNEL_FIRST); + sprintf(String, "VFO%u", 1 + g_eeprom.screen_channel[vfo_num] - FREQ_CHANNEL_FIRST); UI_PrintStringSmall(String, x, 0, line + 1); } #ifdef ENABLE_NOAA else { - if (gInputBoxIndex == 0 || gEeprom.TX_VFO != vfo_num) + if (gInputBoxIndex == 0 || g_eeprom.tx_vfo != vfo_num) { // channel number - sprintf(String, "N%u", 1 + gEeprom.ScreenChannel[vfo_num] - NOAA_CHANNEL_FIRST); + sprintf(String, "N%u", 1 + g_eeprom.screen_channel[vfo_num] - NOAA_CHANNEL_FIRST); } else { // user entering channel number @@ -564,7 +564,7 @@ void UI_DisplayMain(void) #ifdef ENABLE_ALARM if (gCurrentFunction == FUNCTION_TRANSMIT && gAlarmState == ALARM_STATE_ALARM) { - channel = (gEeprom.CROSS_BAND_RX_TX == CROSS_BAND_OFF) ? gEeprom.RX_VFO : gEeprom.TX_VFO; + channel = (g_eeprom.cross_vfo_rx_tx == CROSS_BAND_OFF) ? g_eeprom.rx_vfo : g_eeprom.tx_vfo; if (channel == vfo_num) state = VFO_STATE_ALARM; } @@ -577,7 +577,7 @@ void UI_DisplayMain(void) 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) + if (gInputBoxIndex > 0 && IS_FREQ_CHANNEL(g_eeprom.screen_channel[vfo_num]) && g_eeprom.tx_vfo == vfo_num) { // user entering a frequency UI_DisplayFrequency(gInputBox, 32, line, true, false); @@ -585,25 +585,25 @@ void UI_DisplayMain(void) } else { - uint32_t frequency = gEeprom.VfoInfo[vfo_num].pRX->Frequency; + uint32_t frequency = g_eeprom.VfoInfo[vfo_num].pRX->frequency; if (gCurrentFunction == FUNCTION_TRANSMIT) { // transmitting - channel = (gEeprom.CROSS_BAND_RX_TX == CROSS_BAND_OFF) ? gEeprom.RX_VFO : gEeprom.TX_VFO; + channel = (g_eeprom.cross_vfo_rx_tx == CROSS_BAND_OFF) ? g_eeprom.rx_vfo : g_eeprom.tx_vfo; if (channel == vfo_num) - frequency = gEeprom.VfoInfo[vfo_num].pTX->Frequency; + frequency = g_eeprom.VfoInfo[vfo_num].pTX->frequency; } - if (gEeprom.ScreenChannel[vfo_num] <= MR_CHANNEL_LAST) + if (g_eeprom.screen_channel[vfo_num] <= USER_CHANNEL_LAST) { // it's a channel // show the channel symbols - const uint8_t attributes = gMR_ChannelAttributes[gEeprom.ScreenChannel[vfo_num]]; - if (attributes & MR_CH_SCANLIST1) + const uint8_t attributes = gUSER_ChannelAttributes[g_eeprom.screen_channel[vfo_num]]; + if (attributes & USER_CH_SCANLIST1) memmove(p_line0 + 113, BITMAP_ScanList1, sizeof(BITMAP_ScanList1)); - if (attributes & MR_CH_SCANLIST2) + if (attributes & USER_CH_SCANLIST2) memmove(p_line0 + 120, BITMAP_ScanList2, sizeof(BITMAP_ScanList2)); #ifndef ENABLE_BIG_FREQ - if ((attributes & MR_CH_COMPAND) > 0) + if ((attributes & USER_CH_COMPAND) > 0) memmove(p_line0 + 120 + LCD_WIDTH, BITMAP_compand, sizeof(BITMAP_compand)); #else @@ -614,7 +614,7 @@ void UI_DisplayMain(void) #pragma GCC diagnostic push #pragma GCC diagnostic ignored "-Wimplicit-fallthrough=" - switch (gEeprom.CHANNEL_DISPLAY_MODE) + switch (g_eeprom.channel_display_mode) { case MDF_FREQUENCY: // show the channel frequency #ifdef ENABLE_BIG_FREQ @@ -631,20 +631,20 @@ void UI_DisplayMain(void) break; case MDF_CHANNEL: // show the channel number - sprintf(String, "CH-%03u", gEeprom.ScreenChannel[vfo_num] + 1); + sprintf(String, "CH-%03u", g_eeprom.screen_channel[vfo_num] + 1); UI_PrintString(String, 32, 0, line, 8); break; case MDF_NAME: // show the channel name case MDF_NAME_FREQ: // show the channel name and frequency - BOARD_fetchChannelName(String, gEeprom.ScreenChannel[vfo_num]); + BOARD_fetchChannelName(String, g_eeprom.screen_channel[vfo_num]); if (String[0] == 0) { // no channel name, show the channel number instead - sprintf(String, "CH-%03u", gEeprom.ScreenChannel[vfo_num] + 1); + sprintf(String, "CH-%03u", g_eeprom.screen_channel[vfo_num] + 1); } - if (gEeprom.CHANNEL_DISPLAY_MODE == MDF_NAME) + if (g_eeprom.channel_display_mode == MDF_NAME) { UI_PrintString(String, 32, 0, line, 8); } @@ -681,8 +681,8 @@ void UI_DisplayMain(void) #endif // show the channel symbols - const uint8_t attributes = gMR_ChannelAttributes[gEeprom.ScreenChannel[vfo_num]]; - if ((attributes & MR_CH_COMPAND) > 0) + const uint8_t attributes = gUSER_ChannelAttributes[g_eeprom.screen_channel[vfo_num]]; + if ((attributes & USER_CH_COMPAND) > 0) #ifdef ENABLE_BIG_FREQ memmove(p_line0 + 120, BITMAP_compand, sizeof(BITMAP_compand)); #else @@ -698,7 +698,7 @@ void UI_DisplayMain(void) if (mode == 1) { // TX power level - switch (gRxVfo->OUTPUT_POWER) + switch (gRxVfo->output_power) { case OUTPUT_POWER_LOW: Level = 2; break; case OUTPUT_POWER_MID: Level = 4; break; @@ -721,14 +721,14 @@ void UI_DisplayMain(void) // ************ String[0] = '\0'; - if (gEeprom.VfoInfo[vfo_num].AM_mode) + if (g_eeprom.VfoInfo[vfo_num].am_mode) { // show the AM symbol strcpy(String, "AM"); } else { // or show the CTCSS/DCS symbol - const FREQ_Config_t *pConfig = (mode == 1) ? gEeprom.VfoInfo[vfo_num].pTX : gEeprom.VfoInfo[vfo_num].pRX; - const unsigned int code_type = pConfig->CodeType; + const FREQ_Config_t *pConfig = (mode == 1) ? g_eeprom.VfoInfo[vfo_num].pTX : g_eeprom.VfoInfo[vfo_num].pRX; + const unsigned int code_type = pConfig->code_type; const char *code_list[] = {"", "CT", "DCS", "DCR"}; if (code_type < ARRAY_SIZE(code_list)) strcpy(String, code_list[code_type]); @@ -738,28 +738,28 @@ void UI_DisplayMain(void) if (state == VFO_STATE_NORMAL || state == VFO_STATE_ALARM) { // show the TX power const char pwr_list[] = "LMH"; - const unsigned int i = gEeprom.VfoInfo[vfo_num].OUTPUT_POWER; + const unsigned int i = g_eeprom.VfoInfo[vfo_num].output_power; String[0] = (i < ARRAY_SIZE(pwr_list)) ? pwr_list[i] : '\0'; String[1] = '\0'; UI_PrintStringSmall(String, LCD_WIDTH + 46, 0, line + 1); } - if (gEeprom.VfoInfo[vfo_num].freq_config_RX.Frequency != gEeprom.VfoInfo[vfo_num].freq_config_TX.Frequency) + if (g_eeprom.VfoInfo[vfo_num].freq_config_rx.frequency != g_eeprom.VfoInfo[vfo_num].freq_config_tx.frequency) { // show the TX offset symbol const char dir_list[] = "\0+-"; - const unsigned int i = gEeprom.VfoInfo[vfo_num].TX_OFFSET_FREQUENCY_DIRECTION; + const unsigned int i = g_eeprom.VfoInfo[vfo_num].tx_offset_freq_dir; String[0] = (i < sizeof(dir_list)) ? dir_list[i] : '?'; String[1] = '\0'; UI_PrintStringSmall(String, LCD_WIDTH + 54, 0, line + 1); } // show the TX/RX reverse symbol - if (gEeprom.VfoInfo[vfo_num].FrequencyReverse) + if (g_eeprom.VfoInfo[vfo_num].frequency_reverse) UI_PrintStringSmall("R", LCD_WIDTH + 62, 0, line + 1); { // show the narrow band symbol String[0] = '\0'; - if (gEeprom.VfoInfo[vfo_num].CHANNEL_BANDWIDTH == BANDWIDTH_NARROW) + if (g_eeprom.VfoInfo[vfo_num].channel_bandwidth == BANDWIDTH_NARROW) { String[0] = 'N'; String[1] = '\0'; @@ -768,11 +768,11 @@ void UI_DisplayMain(void) } // show the DTMF decoding symbol - if (gEeprom.VfoInfo[vfo_num].DTMF_DECODING_ENABLE || gSetting_KILLED) + if (g_eeprom.VfoInfo[vfo_num].DTMF_decoding_enable || gSetting_KILLED) UI_PrintStringSmall("DTMF", LCD_WIDTH + 78, 0, line + 1); // show the audio scramble symbol - if (gEeprom.VfoInfo[vfo_num].SCRAMBLING_TYPE > 0 && gSetting_ScrambleEnable) + if (g_eeprom.VfoInfo[vfo_num].scrambling_type > 0 && gSetting_ScrambleEnable) UI_PrintStringSmall("SCR", LCD_WIDTH + 106, 0, line + 1); } @@ -804,13 +804,13 @@ void UI_DisplayMain(void) #if defined(ENABLE_AM_FIX) && defined(ENABLE_AM_FIX_SHOW_DATA) // show the AM-FIX debug data - if (rx && gEeprom.VfoInfo[gEeprom.RX_VFO].AM_mode && gSetting_AM_fix) + if (rx && g_eeprom.VfoInfo[g_eeprom.rx_vfo].am_mode && gSetting_AM_fix) { if (gScreenToDisplay != DISPLAY_MAIN || gDTMF_CallState != DTMF_CALL_STATE_NONE) return; center_line = CENTER_LINE_AM_FIX_DATA; - AM_fix_print_data(gEeprom.RX_VFO, String); + AM_fix_print_data(g_eeprom.rx_vfo, String); UI_PrintStringSmall(String, 2, 0, 3); } else @@ -821,7 +821,7 @@ void UI_DisplayMain(void) if (rx) { center_line = CENTER_LINE_RSSI; - UI_DisplayRSSIBar(gCurrentRSSI[gEeprom.RX_VFO], false); + UI_DisplayRSSIBar(gCurrentRSSI[g_eeprom.rx_vfo], false); } else #endif diff --git a/ui/menu.c b/ui/menu.c index 706acf8..b4b84b2 100644 --- a/ui/menu.c +++ b/ui/menu.c @@ -53,9 +53,9 @@ const t_menu_item MenuList[] = {"RxCTCS", VOICE_ID_CTCSS, MENU_R_CTCS }, // was "R_CTCS" {"Tx DCS", VOICE_ID_DCS, MENU_T_DCS }, // was "T_DCS" {"TxCTCS", VOICE_ID_CTCSS, MENU_T_CTCS }, // was "T_CTCS" - {"Tx DIR", VOICE_ID_TX_OFFSET_FREQUENCY_DIRECTION, MENU_SFT_D }, // was "SFT_D" - {"TxOFFS", VOICE_ID_TX_OFFSET_FREQUENCY, MENU_OFFSET }, // was "OFFSET" - {"Tx TO", VOICE_ID_TRANSMIT_OVER_TIME, MENU_TOT }, // was "TOT" + {"Tx DIR", voice_id_tX_OFFSET_FREQ_DIR, MENU_SFT_D }, // was "SFT_D" + {"TxOFFS", voice_id_tX_OFFSET_FREQ, MENU_OFFSET }, // was "OFFSET" + {"Tx TO", voice_id_tRANSMIT_OVER_TIME, MENU_TOT }, // was "TOT" {"Tx VFO", VOICE_ID_INVALID, MENU_XB }, // was "WX" {"2nd RX", VOICE_ID_DUAL_STANDBY, MENU_TDR }, // was "TDR" {"SCRAM", VOICE_ID_SCRAMBLER_ON, MENU_SCR }, // was "SCR" @@ -288,7 +288,7 @@ const char gSubMenu_F_LOCK[6][4] = "438" }; -const char gSubMenu_BACKLIGHT[8][7] = +const char gSubMenu_backlight[8][7] = { "OFF", "5 sec", @@ -556,16 +556,16 @@ void UI_DisplayMenu(void) { #if 1 unsigned int Code; - FREQ_Config_t *pConfig = (gMenuCursor == MENU_R_CTCS) ? &gTxVfo->freq_config_RX : &gTxVfo->freq_config_TX; + FREQ_Config_t *pConfig = (gMenuCursor == MENU_R_CTCS) ? &gTxVfo->freq_config_rx : &gTxVfo->freq_config_tx; if (gSubMenuSelection == 0) { strcpy(String, "OFF"); - if (pConfig->CodeType != CODE_TYPE_CONTINUOUS_TONE) + if (pConfig->code_type != CODE_TYPE_CONTINUOUS_TONE) break; Code = 0; - pConfig->CodeType = CODE_TYPE_OFF; - pConfig->Code = Code; + pConfig->code_type = CODE_TYPE_OFF; + pConfig->code = Code; BK4819_ExitSubAu(); } @@ -573,9 +573,9 @@ void UI_DisplayMenu(void) { sprintf(String, "%u.%uHz", CTCSS_Options[gSubMenuSelection - 1] / 10, CTCSS_Options[gSubMenuSelection - 1] % 10); - pConfig->CodeType = CODE_TYPE_CONTINUOUS_TONE; + pConfig->code_type = CODE_TYPE_CONTINUOUS_TONE; Code = gSubMenuSelection - 1; - pConfig->Code = Code; + pConfig->code = Code; BK4819_SetCTCSSFrequency(CTCSS_Options[Code]); } @@ -643,7 +643,7 @@ void UI_DisplayMenu(void) #endif case MENU_ABR: - strcpy(String, gSubMenu_BACKLIGHT[gSubMenuSelection]); + strcpy(String, gSubMenu_backlight[gSubMenuSelection]); break; case MENU_AM: @@ -800,15 +800,15 @@ void UI_DisplayMenu(void) #endif case MENU_ANI_ID: - strcpy(String, gEeprom.ANI_DTMF_ID); + strcpy(String, g_eeprom.ani_DTMF_id); break; case MENU_UPCODE: - strcpy(String, gEeprom.DTMF_UP_CODE); + strcpy(String, g_eeprom.DTMF_up_code); break; case MENU_DWCODE: - strcpy(String, gEeprom.DTMF_DOWN_CODE); + strcpy(String, g_eeprom.DTMF_down_code); break; case MENU_D_RSP: @@ -980,8 +980,8 @@ void UI_DisplayMenu(void) else UI_GenerateChannelStringEx(String, true, gSubMenuSelection); -// if (gSubMenuSelection == 0xFF || !gEeprom.SCAN_LIST_ENABLED[i]) - if (gSubMenuSelection < 0 || !gEeprom.SCAN_LIST_ENABLED[i]) +// if (gSubMenuSelection == 0xFF || !g_eeprom.scan_list_enabled[i]) + if (gSubMenuSelection < 0 || !g_eeprom.scan_list_enabled[i]) { // channel number UI_PrintString(String, menu_item_x1, menu_item_x2, 0, 8); @@ -1003,15 +1003,15 @@ void UI_DisplayMenu(void) strcpy(String, "--"); UI_PrintStringSmall(String, menu_item_x1, menu_item_x2, 2); - if (IS_MR_CHANNEL(gEeprom.SCANLIST_PRIORITY_CH1[i])) + if (IS_USER_CHANNEL(g_eeprom.scan_list_priority_ch1[i])) { - sprintf(String, "PRI1:%u", gEeprom.SCANLIST_PRIORITY_CH1[i] + 1); + sprintf(String, "PRI1:%u", g_eeprom.scan_list_priority_ch1[i] + 1); UI_PrintString(String, menu_item_x1, menu_item_x2, 3, 8); } - if (IS_MR_CHANNEL(gEeprom.SCANLIST_PRIORITY_CH2[i])) + if (IS_USER_CHANNEL(g_eeprom.scan_list_priority_ch2[i])) { - sprintf(String, "PRI2:%u", gEeprom.SCANLIST_PRIORITY_CH2[i] + 1); + sprintf(String, "PRI2:%u", g_eeprom.scan_list_priority_ch2[i] + 1); UI_PrintString(String, menu_item_x1, menu_item_x2, 5, 8); } } @@ -1032,12 +1032,12 @@ void UI_DisplayMenu(void) UI_PrintString("SCAN", menu_item_x1, menu_item_x2, 4, 8); if (gMenuCursor == MENU_UPCODE) - if (strlen(gEeprom.DTMF_UP_CODE) > 8) - UI_PrintString(gEeprom.DTMF_UP_CODE + 8, menu_item_x1, menu_item_x2, 4, 8); + if (strlen(g_eeprom.DTMF_up_code) > 8) + UI_PrintString(g_eeprom.DTMF_up_code + 8, menu_item_x1, menu_item_x2, 4, 8); if (gMenuCursor == MENU_DWCODE) - if (strlen(gEeprom.DTMF_DOWN_CODE) > 8) - UI_PrintString(gEeprom.DTMF_DOWN_CODE + 8, menu_item_x1, menu_item_x2, 4, 8); + if (strlen(g_eeprom.DTMF_down_code) > 8) + UI_PrintString(g_eeprom.DTMF_down_code + 8, menu_item_x1, menu_item_x2, 4, 8); if (gMenuCursor == MENU_D_LIST && gIsDtmfContactValid) { diff --git a/ui/menu.h b/ui/menu.h index 8325b78..4bbf2b8 100644 --- a/ui/menu.h +++ b/ui/menu.h @@ -20,11 +20,11 @@ #include #include -#include "audio.h" // VOICE_ID_t +#include "audio.h" // voice_id_t typedef struct { const char name[7]; // menu display area only has room for 6 characters - VOICE_ID_t voice_id; + voice_id_t voice_id; uint8_t menu_id; } t_menu_item; @@ -164,7 +164,7 @@ extern const char gSubMenu_PONMSG[4][8]; extern const char gSubMenu_ROGER[3][9]; extern const char gSubMenu_RESET[2][4]; extern const char gSubMenu_F_LOCK[6][4]; -extern const char gSubMenu_BACKLIGHT[8][7]; +extern const char gSubMenu_backlight[8][7]; extern const char gSubMenu_RX_TX[4][6]; #ifdef ENABLE_AM_FIX_TEST1 extern const char gSubMenu_AM_fix_test1[4][8]; diff --git a/ui/status.c b/ui/status.c index 8a55e23..33ff0f2 100644 --- a/ui/status.c +++ b/ui/status.c @@ -96,15 +96,15 @@ void UI_DisplayStatus(const bool test_display) // SCAN indicator if (gScanStateDir != SCAN_OFF || gScreenToDisplay == DISPLAY_SCANNER || test_display) { - if (gNextMrChannel <= MR_CHANNEL_LAST) + if (gNextChannel <= USER_CHANNEL_LAST) { // channel mode - if (gEeprom.SCAN_LIST_DEFAULT == 0) + if (g_eeprom.scan_list_default == 0) UI_PrintStringSmallBuffer("1", line + x); else - if (gEeprom.SCAN_LIST_DEFAULT == 1) + if (g_eeprom.scan_list_default == 1) UI_PrintStringSmallBuffer("2", line + x); else - if (gEeprom.SCAN_LIST_DEFAULT == 2) + if (g_eeprom.scan_list_default == 2) UI_PrintStringSmallBuffer("*", line + x); } else @@ -117,7 +117,7 @@ void UI_DisplayStatus(const bool test_display) #ifdef ENABLE_VOICE // VOICE indicator - if (gEeprom.VOICE_PROMPT != VOICE_PROMPT_OFF || test_display) + if (g_eeprom.voice_prompt != VOICE_PROMPT_OFF || test_display) { memmove(line + x, BITMAP_VoicePrompt, sizeof(BITMAP_VoicePrompt)); x1 = x + sizeof(BITMAP_VoicePrompt); @@ -128,7 +128,7 @@ void UI_DisplayStatus(const bool test_display) #endif // DUAL-WATCH indicator - if (gEeprom.DUAL_WATCH != DUAL_WATCH_OFF || test_display) + if (g_eeprom.dual_watch != DUAL_WATCH_OFF || test_display) { if (gDualWatchActive || test_display) memmove(line + x, BITMAP_TDR1, sizeof(BITMAP_TDR1)); @@ -138,7 +138,7 @@ void UI_DisplayStatus(const bool test_display) x += sizeof(BITMAP_TDR1); // CROSS-VFO indicator - if (gEeprom.CROSS_BAND_RX_TX != CROSS_BAND_OFF || test_display) + if (g_eeprom.cross_vfo_rx_tx != CROSS_BAND_OFF || test_display) { memmove(line + x, BITMAP_XB, sizeof(BITMAP_XB)); x1 = x + sizeof(BITMAP_XB); @@ -147,7 +147,7 @@ void UI_DisplayStatus(const bool test_display) #ifdef ENABLE_VOX // VOX indicator - if (gEeprom.VOX_SWITCH || test_display) + if (g_eeprom.vox_switch || test_display) { memmove(line + x, BITMAP_VOX, sizeof(BITMAP_VOX)); x1 = x + sizeof(BITMAP_VOX); @@ -156,14 +156,14 @@ void UI_DisplayStatus(const bool test_display) #endif // KEY-LOCK indicator - if (gEeprom.KEY_LOCK || test_display) + if (g_eeprom.key_lock || test_display) { memmove(line + x, BITMAP_KeyLock, sizeof(BITMAP_KeyLock)); x += sizeof(BITMAP_KeyLock); x1 = x; } else - if (gWasFKeyPressed) + if (g_was_f_key_pressed) { memmove(line + x, BITMAP_F_Key, sizeof(BITMAP_F_Key)); x += sizeof(BITMAP_F_Key); diff --git a/ui/ui.c b/ui/ui.c index 0ea903a..893a985 100644 --- a/ui/ui.c +++ b/ui/ui.c @@ -94,7 +94,7 @@ void GUI_SelectNextDisplay(GUI_DisplayType_t Display) gAskForConfirmation = 0; gAskToSave = false; gAskToDelete = false; - gWasFKeyPressed = false; + g_was_f_key_pressed = false; gUpdateStatus = true; } diff --git a/ui/welcome.c b/ui/welcome.c index b786751..5368fb3 100644 --- a/ui/welcome.c +++ b/ui/welcome.c @@ -48,12 +48,12 @@ void UI_DisplayWelcome(void) memset(gStatusLine, 0, sizeof(gStatusLine)); memset(gFrameBuffer, 0, sizeof(gFrameBuffer)); - if (gEeprom.POWER_ON_DISPLAY_MODE == POWER_ON_DISPLAY_MODE_NONE) + if (g_eeprom.pwr_on_display_mode == PWR_ON_DISPLAY_MODE_NONE) { ST7565_FillScreen(0xFF); } else - if (gEeprom.POWER_ON_DISPLAY_MODE == POWER_ON_DISPLAY_MODE_FULL_SCREEN) + if (g_eeprom.pwr_on_display_mode == PWR_ON_DISPLAY_MODE_FULL_SCREEN) { ST7565_FillScreen(0xFF); } @@ -63,7 +63,7 @@ void UI_DisplayWelcome(void) memset(WelcomeString1, 0, sizeof(WelcomeString1)); memset(WelcomeString2, 0, sizeof(WelcomeString2)); - if (gEeprom.POWER_ON_DISPLAY_MODE == POWER_ON_DISPLAY_MODE_VOLTAGE) + if (g_eeprom.pwr_on_display_mode == PWR_ON_DISPLAY_MODE_VOLTAGE) { strcpy(WelcomeString0, "VOLTAGE"); sprintf(WelcomeString1, "%u.%02uV %u%%", diff --git a/version.c b/version.c index e64486b..8966e6d 100644 --- a/version.c +++ b/version.c @@ -4,7 +4,7 @@ #ifdef GIT_HASH #define VER GIT_HASH #else - #define VER "231007" + #define VER "231009" #endif #ifndef ONE_OF_ELEVEN_VER