From 388c3dadf1e4ff7e50c926c8d4da2598e693e1b9 Mon Sep 17 00:00:00 2001 From: Krzysiek Egzmont Date: Tue, 31 Oct 2023 17:23:10 +0100 Subject: [PATCH] SSB, BYP, RAW demodulation modes added #64 --- app/app.c | 19 ++++++------ app/menu.c | 14 +++++---- app/spectrum.c | 29 +++++------------- app/spectrum.h | 16 +--------- audio.c | 4 +-- driver/bk4819-regs.h | 13 ++++++++ driver/bk4819.c | 6 ++++ driver/bk4819.h | 7 +++-- functions.c | 2 +- radio.c | 71 +++++++++++++++++++++++++++++++++++--------- radio.h | 16 ++++++++-- settings.c | 2 +- ui/main.c | 33 +++++++++++--------- ui/menu.c | 3 +- 14 files changed, 146 insertions(+), 89 deletions(-) diff --git a/app/app.c b/app/app.c index 268c77d..a8dc167 100644 --- a/app/app.c +++ b/app/app.c @@ -71,7 +71,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 (gEeprom.VfoInfo[vfo].Modulation != MODULATION_FM && gSetting_AM_fix) rssi -= rssi_gain_diff[vfo]; #endif @@ -526,7 +526,7 @@ void APP_StartListening(FUNCTION_Type_t Function, const bool reset_am_fix) const uint8_t orig_pga = 6; // -3dB #ifdef ENABLE_AM_FIX - if (gRxVfo->AM_mode && gSetting_AM_fix) { // AM RX mode + if (gRxVfo->Modulation != MODULATION_FM && gSetting_AM_fix) { // AM RX mode if (reset_am_fix) AM_fix_reset(chan); // TODO: only reset it when moving channel/frequency AM_fix_10ms(chan); @@ -540,10 +540,11 @@ void APP_StartListening(FUNCTION_Type_t Function, const bool reset_am_fix) } // AF gain - original QS values - if (gRxVfo->AM_mode){ - BK4819_WriteRegister(BK4819_REG_48, 0xB3A8); - } - else { + // if (gRxVfo->Modulation != MODULATION_FM){ + // BK4819_WriteRegister(BK4819_REG_48, 0xB3A8); + // } + // else + { BK4819_WriteRegister(BK4819_REG_48, (11u << 12) | // ??? .. 0 to 15, doesn't seem to make any difference ( 0u << 10) | // AF Rx Gain-1 @@ -554,7 +555,7 @@ void APP_StartListening(FUNCTION_Type_t Function, const bool reset_am_fix) #ifdef ENABLE_VOICE if (gVoiceWriteIndex == 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 + RADIO_SetModulation(gRxVfo->Modulation); // no need, set it now FUNCTION_Select(Function); @@ -1209,8 +1210,8 @@ 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) +// if (gEeprom.VfoInfo[gEeprom.RX_VFO].Modulation != MODULATION_FM && gSetting_AM_fix) + if (gRxVfo->Modulation != MODULATION_FM && gSetting_AM_fix) AM_fix_10ms(gEeprom.RX_VFO); #endif diff --git a/app/menu.c b/app/menu.c index c75d003..3440f06 100644 --- a/app/menu.c +++ b/app/menu.c @@ -232,7 +232,6 @@ int MENU_GetLimits(uint8_t menu_id, int32_t *pMin, int32_t *pMax) case MENU_D_ST: case MENU_D_DCD: case MENU_D_LIVE_DEC: - case MENU_AM: #ifdef ENABLE_NOAA case MENU_NOAA_S: #endif @@ -246,6 +245,11 @@ int MENU_GetLimits(uint8_t menu_id, int32_t *pMin, int32_t *pMax) *pMax = ARRAY_SIZE(gSubMenu_OFF_ON) - 1; break; + case MENU_AM: + *pMin = 0; + *pMax = ARRAY_SIZE(gModulationStr) - 1; + break; + case MENU_SCR: *pMin = 0; *pMax = ARRAY_SIZE(gSubMenu_SCRAMBLER) - 1; @@ -702,7 +706,7 @@ void MENU_AcceptSetting(void) break; case MENU_AM: - gTxVfo->AM_mode = gSubMenuSelection; + gTxVfo->Modulation = gSubMenuSelection; gRequestSaveChannel = 1; return; @@ -1112,7 +1116,7 @@ void MENU_ShowCurrentSetting(void) break; case MENU_AM: - gSubMenuSelection = gTxVfo->AM_mode; + gSubMenuSelection = gTxVfo->Modulation; break; #ifdef ENABLE_AM_FIX @@ -1603,9 +1607,9 @@ static void MENU_Key_STAR(const bool bKeyPressed, const bool bKeyHeld) RADIO_SelectVfos(); #ifdef ENABLE_NOAA - if (!IS_NOAA_CHANNEL(gRxVfo->CHANNEL_SAVE) && gRxVfo->AM_mode == 0) + if (!IS_NOAA_CHANNEL(gRxVfo->CHANNEL_SAVE) && gRxVfo->Modulation == MODULATION_FM) #else - if (gRxVfo->AM_mode == 0) + if (gRxVfo->Modulation == MODULATION_FM) #endif { if (GetCurrentMenuId() == MENU_R_CTCS || GetCurrentMenuId() == MENU_R_DCS) diff --git a/app/spectrum.c b/app/spectrum.c index 2e30d0f..87bf312 100644 --- a/app/spectrum.c +++ b/app/spectrum.c @@ -49,7 +49,6 @@ ScanInfo scanInfo; KeyboardState kbd = {KEY_INVALID, KEY_INVALID, 0}; 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}; @@ -103,7 +102,7 @@ static int Rssi2DBm(uint16_t rssi) { return (rssi >> 1) - 160; } static uint16_t GetRegMenuValue(uint8_t st) { RegisterSpec s = registerSpecs[st]; - return (BK4819_ReadRegister(s.num) >> s.offset) & s.maxValue; + return (BK4819_ReadRegister(s.num) >> s.offset) & s.mask; } static void SetRegMenuValue(uint8_t st, bool add) { @@ -111,14 +110,14 @@ static void SetRegMenuValue(uint8_t st, bool add) { RegisterSpec s = registerSpecs[st]; uint16_t reg = BK4819_ReadRegister(s.num); - if (add && v <= s.maxValue - s.inc) { + if (add && v <= s.mask - s.inc) { v += s.inc; } else if (!add && v >= 0 + s.inc) { v -= s.inc; } // TODO: use max value for bits count in max value, or reset by additional // mask in spec - reg &= ~(s.maxValue << s.offset); + reg &= ~(s.mask << s.offset); BK4819_WriteRegister(s.num, reg | (v << s.offset)); redrawScreen = true; } @@ -225,18 +224,6 @@ static void RestoreRegisters() { BK4819_WriteRegister(BK4819_REG_7E, R7E); } -static void SetModulation(ModulationType type) { - RestoreRegisters(); - uint16_t reg = BK4819_ReadRegister(BK4819_REG_47); - reg &= ~(0b111 << 8); - BK4819_WriteRegister(BK4819_REG_47, reg | (modTypeReg47Values[type] << 8)); - if (type == MOD_USB) { - BK4819_WriteRegister(BK4819_REG_3D, 0b0010101101000101); - BK4819_WriteRegister(BK4819_REG_37, 0x160F); - BK4819_WriteRegister(BK4819_REG_48, 0b0000001110101000); - } -} - static void ToggleAFDAC(bool on) { uint32_t Reg = BK4819_ReadRegister(BK4819_REG_30); Reg &= ~(1 << 9); @@ -489,12 +476,12 @@ static void UpdateFreqChangeStep(bool inc) { } static void ToggleModulation() { - if (settings.modulationType < MOD_USB) { + if (settings.modulationType < MODULATION_UKNOWN - 1) { settings.modulationType++; } else { - settings.modulationType = MOD_FM; + settings.modulationType = MODULATION_FM; } - SetModulation(settings.modulationType); + RADIO_SetModulation(settings.modulationType); redrawScreen = true; } @@ -669,7 +656,7 @@ static void DrawF(uint32_t f) { sprintf(String, "%u.%05u", f / 100000, f % 100000); UI_PrintStringSmall(String, 8, 127, 0); - sprintf(String, "%s", modulationTypeOptions[settings.modulationType]); + sprintf(String, "%3s", gModulationStr[settings.modulationType]); GUI_DisplaySmallest(String, 116, 1, false, true); sprintf(String, "%s", bwOptions[settings.listenBw]); GUI_DisplaySmallest(String, 108, 7, false, true); @@ -1175,7 +1162,7 @@ void APP_RunSpectrum() { newScanStart = true; ToggleRX(true), ToggleRX(false); // hack to prevent noise when squelch off - SetModulation(settings.modulationType = MOD_FM); + RADIO_SetModulation(settings.modulationType = MODULATION_FM); BK4819_SetFilterBandwidth(settings.listenBw = BK4819_FILTER_BW_WIDE, false); RelaunchScan(); diff --git a/app/spectrum.h b/app/spectrum.h index 61ac358..772e62b 100644 --- a/app/spectrum.h +++ b/app/spectrum.h @@ -99,12 +99,6 @@ typedef enum StepsCount { STEPS_16, } StepsCount; -typedef enum ModulationType { - MOD_FM, - MOD_AM, - MOD_USB, -} ModulationType; - typedef enum ScanStep { S_STEP_0_01kHz, S_STEP_0_1kHz, @@ -131,7 +125,7 @@ typedef struct SpectrumSettings { BK4819_FilterBandwidth_t listenBw; int dbMin; int dbMax; - ModulationType modulationType; + ModulationMode_t modulationType; bool backlightState; } SpectrumSettings; @@ -149,14 +143,6 @@ typedef struct ScanInfo { uint8_t measurementsCount; } ScanInfo; -typedef struct RegisterSpec { - char *name; - uint8_t num; - uint8_t offset; - uint16_t maxValue; - uint16_t inc; -} RegisterSpec; - typedef struct PeakInfo { uint16_t t; uint16_t rssi; diff --git a/audio.c b/audio.c index b48373d..e865fdc 100644 --- a/audio.c +++ b/audio.c @@ -289,7 +289,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); + RADIO_SetModulation(gRxVfo->Modulation); #ifdef ENABLE_FMRADIO if (gFmRadioMode) @@ -430,7 +430,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); + RADIO_SetModulation(gRxVfo->Modulation); #ifdef ENABLE_FMRADIO if (gFmRadioMode) diff --git a/driver/bk4819-regs.h b/driver/bk4819-regs.h index 055541a..a896201 100644 --- a/driver/bk4819-regs.h +++ b/driver/bk4819-regs.h @@ -17,6 +17,19 @@ #ifndef BK4819_REGS_H #define BK4819_REGS_H + +typedef struct { + const char *name; + uint8_t num; + uint8_t offset; + uint16_t mask; + uint16_t inc; +} RegisterSpec; + +static const RegisterSpec afcDisableRegSpec = {"AFC Disable", 0x73, 4, 1, 1}; +static const RegisterSpec afOutRegSpec = {"AF Output Select", 0x47, 8, 0xF, 1}; +static const RegisterSpec afDacGainRegSpec = {"AF DAC Gain", 0x48, 0, 0xF, 1}; + enum BK4819_REGISTER_t { BK4819_REG_00 = 0x00U, BK4819_REG_02 = 0x02U, diff --git a/driver/bk4819.c b/driver/bk4819.c index 07db8fc..1d1d7be 100644 --- a/driver/bk4819.c +++ b/driver/bk4819.c @@ -798,6 +798,12 @@ void BK4819_SetAF(BK4819_AF_Type_t AF) BK4819_WriteRegister(BK4819_REG_47, (6u << 12) | (AF << 8) | (1u << 6)); } +void BK4819_SetRegValue(RegisterSpec s, uint16_t v) { + uint16_t reg = BK4819_ReadRegister(s.num); + reg &= ~(s.mask << s.offset); + BK4819_WriteRegister(s.num, reg | (v << s.offset)); +} + void BK4819_RX_TurnOn(void) { // DSP Voltage Setting = 1 diff --git a/driver/bk4819.h b/driver/bk4819.h index 6db5e87..c5dcdb4 100644 --- a/driver/bk4819.h +++ b/driver/bk4819.h @@ -28,12 +28,12 @@ enum BK4819_AF_Type_t BK4819_AF_FM = 1u, // FM BK4819_AF_ALAM = 2u, // BK4819_AF_BEEP = 3u, // - BK4819_AF_BASEBAND1 = 4u, // SSB - BK4819_AF_BASEBAND2 = 5u, // SSB + BK4819_AF_BASEBAND1 = 4u, // RAW + BK4819_AF_BASEBAND2 = 5u, // USB BK4819_AF_CTCO = 6u, // strange LF audio .. maybe the CTCSS LF line ? BK4819_AF_AM = 7u, // AM BK4819_AF_FSKO = 8u, // nothing - BK4819_AF_UNKNOWN3 = 9u, // distorted + BK4819_AF_UNKNOWN3 = 9u, // BYP BK4819_AF_UNKNOWN4 = 10u, // nothing at all BK4819_AF_UNKNOWN5 = 11u, // distorted BK4819_AF_UNKNOWN6 = 12u, // distorted @@ -68,6 +68,7 @@ extern bool gRxIdleMode; void BK4819_Init(void); uint16_t BK4819_ReadRegister(BK4819_REGISTER_t Register); void BK4819_WriteRegister(BK4819_REGISTER_t Register, uint16_t Data); +void BK4819_SetRegValue(RegisterSpec s, uint16_t v); void BK4819_WriteU8(uint8_t Data); void BK4819_WriteU16(uint16_t Data); diff --git a/functions.c b/functions.c index c58bdbe..24f8866 100644 --- a/functions.c +++ b/functions.c @@ -50,7 +50,7 @@ void FUNCTION_Init(void) { gCurrentCodeType = gSelectedCodeType; if (gCssScanMode == CSS_SCAN_MODE_OFF) - gCurrentCodeType = gRxVfo->AM_mode ? CODE_TYPE_OFF : gRxVfo->pRX->CodeType; + gCurrentCodeType = (gRxVfo->Modulation != MODULATION_FM) ? CODE_TYPE_OFF : gRxVfo->pRX->CodeType; } #ifdef ENABLE_NOAA else diff --git a/radio.c b/radio.c index 1e89983..350a69b 100644 --- a/radio.c +++ b/radio.c @@ -44,6 +44,15 @@ uint8_t gSelectedCode; STEP_Setting_t gStepSetting; VfoState_t VfoState[2]; +const char gModulationStr[][4] = +{ + "FM", + "AM", + "USB", + "BYP", + "RAW" +}; + bool RADIO_CheckValidChannel(uint16_t Channel, bool bCheckScanList, uint8_t VFO) { // return true if the channel appears valid @@ -133,7 +142,7 @@ void RADIO_InitInfo(VFO_Info_t *pInfo, const uint8_t ChannelSave, const uint32_t pInfo->Compander = 0; // off if (ChannelSave == (FREQ_CHANNEL_FIRST + BAND2_108MHz)) - pInfo->AM_mode = 1; + pInfo->Modulation = MODULATION_AM; RADIO_ConfigureSquelchAndOutputPower(pInfo); } @@ -253,7 +262,7 @@ void RADIO_ConfigureChannel(const unsigned int VFO, const unsigned int configure if (Tmp > TX_OFFSET_FREQUENCY_DIRECTION_SUB) Tmp = 0; gEeprom.VfoInfo[VFO].TX_OFFSET_FREQUENCY_DIRECTION = Tmp; - gEeprom.VfoInfo[VFO].AM_mode = (Data[3] >> 4) & 1u; + gEeprom.VfoInfo[VFO].Modulation = (Data[3] >> 4); Tmp = Data[6]; if (Tmp >= ARRAY_SIZE(gStepFrequencyTable)) @@ -407,7 +416,7 @@ void RADIO_ConfigureChannel(const unsigned int VFO, const unsigned int configure pConfig->Frequency = 43300000; } - if (gEeprom.VfoInfo[VFO].AM_mode) + if (gEeprom.VfoInfo[VFO].Modulation != MODULATION_FM) { // 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 @@ -605,7 +614,7 @@ void RADIO_SetupRegisters(bool switchToForeground) 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->Modulation == MODULATION_AM && gSetting_AM_fix); BK4819_SetFilterBandwidth(Bandwidth, true); #else BK4819_SetFilterBandwidth(Bandwidth, false); @@ -654,7 +663,13 @@ void RADIO_SetupRegisters(bool switchToForeground) BK4819_ToggleGpioOut(BK4819_GPIO0_PIN28_RX_ENABLE, true); // AF RX Gain and DAC - BK4819_WriteRegister(BK4819_REG_48, 0xB3A8); // 1011 00 111010 1000 + //BK4819_WriteRegister(BK4819_REG_48, 0xB3A8); // 1011 00 111010 1000 + BK4819_WriteRegister(BK4819_REG_48, + (11u << 12) | // ??? .. 0 ~ 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) + InterruptMask = BK4819_REG_3F_SQUELCH_FOUND | BK4819_REG_3F_SQUELCH_LOST; @@ -662,7 +677,7 @@ void RADIO_SetupRegisters(bool switchToForeground) if (!IS_NOAA_CHANNEL(gRxVfo->CHANNEL_SAVE)) #endif { - if (gRxVfo->AM_mode == 0) + if (gRxVfo->Modulation == MODULATION_FM) { // FM uint8_t CodeType = gSelectedCodeType; uint8_t Code = gSelectedCode; @@ -738,15 +753,15 @@ void RADIO_SetupRegisters(bool switchToForeground) #ifdef ENABLE_VOX #ifdef ENABLE_NOAA #ifdef ENABLE_FMRADIO - if (gEeprom.VOX_SWITCH && !gFmRadioMode && !IS_NOAA_CHANNEL(gCurrentVfo->CHANNEL_SAVE) && gCurrentVfo->AM_mode == 0) + if (gEeprom.VOX_SWITCH && !gFmRadioMode && !IS_NOAA_CHANNEL(gCurrentVfo->CHANNEL_SAVE) && gCurrentVfo->Modulation == MODULATION_FM) #else - if (gEeprom.VOX_SWITCH && !IS_NOAA_CHANNEL(gCurrentVfo->CHANNEL_SAVE) && gCurrentVfo->AM_mode == 0) + if (gEeprom.VOX_SWITCH && !IS_NOAA_CHANNEL(gCurrentVfo->CHANNEL_SAVE) && gCurrentVfo->Modulation == MODULATION_FM) #endif #else #ifdef ENABLE_FMRADIO - if (gEeprom.VOX_SWITCH && !gFmRadioMode && gCurrentVfo->AM_mode == 0) + if (gEeprom.VOX_SWITCH && !gFmRadioMode && gCurrentVfo->Modulation == MODULATION_FM) #else - if (gEeprom.VOX_SWITCH && gCurrentVfo->AM_mode == 0) + if (gEeprom.VOX_SWITCH && gCurrentVfo->Modulation == MODULATION_FM) #endif #endif { @@ -758,7 +773,7 @@ void RADIO_SetupRegisters(bool switchToForeground) BK4819_DisableVox(); // RX expander - BK4819_SetCompander((gRxVfo->AM_mode == 0 && gRxVfo->Compander >= 2) ? gRxVfo->Compander : 0); + BK4819_SetCompander((gRxVfo->Modulation == MODULATION_FM && gRxVfo->Compander >= 2) ? gRxVfo->Compander : 0); #if 0 if (!gRxVfo->DTMF_DECODING_ENABLE && !gSetting_KILLED) @@ -855,7 +870,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->Modulation == MODULATION_AM && gSetting_AM_fix); BK4819_SetFilterBandwidth(Bandwidth, true); #else BK4819_SetFilterBandwidth(Bandwidth, false); @@ -866,7 +881,7 @@ void RADIO_SetTxParameters(void) 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->Modulation == MODULATION_FM && (gRxVfo->Compander == 1 || gRxVfo->Compander >= 3)) ? gRxVfo->Compander : 0); BK4819_PrepareTransmit(); @@ -900,6 +915,34 @@ void RADIO_SetTxParameters(void) } } +void RADIO_SetModulation(ModulationMode_t modulation) +{ + BK4819_AF_Type_t mod; + switch(modulation) { + default: + case MODULATION_FM: + mod = BK4819_AF_FM; + break; + case MODULATION_AM: + mod = BK4819_AF_AM; + break; + case MODULATION_USB: + mod = BK4819_AF_BASEBAND2; + break; + case MODULATION_BYP: + mod = BK4819_AF_UNKNOWN3; + break; + case MODULATION_RAW: + mod = BK4819_AF_BASEBAND1; + break; + } + + BK4819_SetAF(mod); + BK4819_SetRegValue(afDacGainRegSpec, 0xF); + BK4819_WriteRegister(BK4819_REG_3D, modulation == MODULATION_USB ? 0 : 0x2AAB); + BK4819_SetRegValue(afcDisableRegSpec, modulation != MODULATION_FM); +} + void RADIO_SetVfoState(VfoState_t State) { if (State == VFO_STATE_NORMAL) @@ -964,7 +1007,7 @@ void RADIO_PrepareTX(void) #endif { #ifndef ENABLE_TX_WHEN_AM - if (gCurrentVfo->AM_mode) + if (gCurrentVfo->Modulation != MODULATION_FM) { // not allowed to TX if in AM mode State = VFO_STATE_TX_DISABLE; } diff --git a/radio.h b/radio.h index b4c20bd..5513cf9 100644 --- a/radio.h +++ b/radio.h @@ -61,6 +61,17 @@ enum VfoState_t }; typedef enum VfoState_t VfoState_t; +typedef enum { + MODULATION_FM, + MODULATION_AM, + MODULATION_USB, + MODULATION_BYP, + MODULATION_RAW, + MODULATION_UKNOWN +} ModulationMode_t; + +extern const char gModulationStr[5][4]; + typedef struct { uint32_t Frequency; @@ -115,7 +126,7 @@ typedef struct VFO_Info_t uint8_t BUSY_CHANNEL_LOCK; - uint8_t AM_mode; + ModulationMode_t Modulation; uint8_t Compander; @@ -154,11 +165,12 @@ void RADIO_SetupRegisters(bool bSwitchToFunction0); void RADIO_ConfigureNOAA(void); #endif void RADIO_SetTxParameters(void); - +void RADIO_SetModulation(ModulationMode_t modulation); void RADIO_SetVfoState(VfoState_t State); void RADIO_PrepareTX(void); void RADIO_EnableCxCSS(void); void RADIO_PrepareCssTX(void); void RADIO_SendEndOfTransmission(void); + #endif diff --git a/settings.c b/settings.c index f3f1505..a76d8b6 100644 --- a/settings.c +++ b/settings.c @@ -215,7 +215,7 @@ void SETTINGS_SaveChannel(uint8_t Channel, uint8_t VFO, const VFO_Info_t *pVFO, 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[3] = (pVFO->Modulation << 4) | pVFO->TX_OFFSET_FREQUENCY_DIRECTION; State[4] = 0 | (pVFO->BUSY_CHANNEL_LOCK << 4) | (pVFO->OUTPUT_POWER << 2) diff --git a/ui/main.c b/ui/main.c index 9179b03..da49191 100644 --- a/ui/main.c +++ b/ui/main.c @@ -562,19 +562,24 @@ void UI_DisplayMain(void) // ************ String[0] = '\0'; - if (gEeprom.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 char *code_list[] = {"", "CT", "DCS", "DCR"}; - if (code_type < ARRAY_SIZE(code_list)) - strcpy(String, code_list[code_type]); - } - UI_PrintStringSmall(String, LCD_WIDTH + 24, 0, line + 1); + + // show the modulation symbol + const char * s = ""; + const ModulationMode_t mod = gEeprom.VfoInfo[vfo_num].Modulation; + switch (mod){ + case MODULATION_FM: { + 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 char *code_list[] = {"", "CT", "DCS", "DCR"}; + if (code_type < ARRAY_SIZE(code_list)) + s = code_list[code_type]; + break; + } + default: + s = gModulationStr[mod]; + break; + } + UI_PrintStringSmall(s, LCD_WIDTH + 24, 0, line + 1); if (state == VFO_STATE_NORMAL || state == VFO_STATE_ALARM) { // show the TX power @@ -633,7 +638,7 @@ void UI_DisplayMain(void) #endif #if defined(ENABLE_AM_FIX) && defined(ENABLE_AM_FIX_SHOW_DATA) - if (rx && gEeprom.VfoInfo[gEeprom.RX_VFO].AM_mode && gSetting_AM_fix) + if (rx && gEeprom.VfoInfo[gEeprom.RX_VFO].Modulation != MODULATION_FM && gSetting_AM_fix) { if (gScreenToDisplay != DISPLAY_MAIN || gDTMF_CallState != DTMF_CALL_STATE_NONE) diff --git a/ui/menu.c b/ui/menu.c index 5e8990b..2fe0920 100644 --- a/ui/menu.c +++ b/ui/menu.c @@ -338,7 +338,6 @@ const char gSubMenu_SCRAMBLER[11][7] = "3500Hz" }; - const t_sidefunction SIDEFUNCTIONS[] = { {"NONE", ACTION_OPT_NONE}, @@ -614,7 +613,7 @@ void UI_DisplayMenu(void) break; case MENU_AM: - strcpy(String, (gSubMenuSelection == 0) ? "FM" : "AM"); + strcpy(String, gModulationStr[gSubMenuSelection]); break; #ifdef ENABLE_AM_FIX_TEST1