diff --git a/app/action.c b/app/action.c index bfc3295..b99b583 100644 --- a/app/action.c +++ b/app/action.c @@ -368,7 +368,7 @@ static void ACTION_Scan_FM(bool bRestart) gFM_AutoScan = true; gFM_ChannelPosition = 0; FM_EraseChannels(); - freq = gEeprom.FM_LowerLimit; + freq = BK1080_GetFreqLoLimit(gEeprom.FM_Band); } else { gFM_AutoScan = false; gFM_ChannelPosition = 0; diff --git a/app/app.c b/app/app.c index 26d4390..330cc81 100644 --- a/app/app.c +++ b/app/app.c @@ -447,7 +447,7 @@ void APP_StartListening(FUNCTION_Type_t function) #ifdef ENABLE_FMRADIO if (gFmRadioMode) - BK1080_Init(0, false); + BK1080_Init0(); #endif // clear the other vfo's rssi level (to hide the antenna symbol) diff --git a/app/fm.c b/app/fm.c index 934495a..d53a731 100644 --- a/app/fm.c +++ b/app/fm.c @@ -62,7 +62,9 @@ static void Key_FUNC(KEY_Code_t Key, uint8_t state); bool FM_CheckValidChannel(uint8_t Channel) { - return (Channel < ARRAY_SIZE(gFM_Channels) && (gFM_Channels[Channel] >= 760 && gFM_Channels[Channel] < 1080)); + return Channel < ARRAY_SIZE(gFM_Channels) && + gFM_Channels[Channel] >= BK1080_GetFreqLoLimit(gEeprom.FM_Band) && + gFM_Channels[Channel] < BK1080_GetFreqHiLimit(gEeprom.FM_Band); } uint8_t FM_FindNextChannel(uint8_t Channel, uint8_t Direction) @@ -106,7 +108,7 @@ void FM_TurnOff(void) AUDIO_AudioPathOff(); gEnableSpeaker = false; - BK1080_Init(0, false); + BK1080_Init0(); gUpdateStatus = true; } @@ -138,17 +140,17 @@ void FM_Tune(uint16_t Frequency, int8_t Step, bool bFlag) if (!bFlag) { Frequency += Step; - if (Frequency < gEeprom.FM_LowerLimit) - Frequency = gEeprom.FM_UpperLimit; - else if (Frequency > gEeprom.FM_UpperLimit) - Frequency = gEeprom.FM_LowerLimit; + if (Frequency < BK1080_GetFreqLoLimit(gEeprom.FM_Band)) + Frequency = BK1080_GetFreqHiLimit(gEeprom.FM_Band); + else if (Frequency > BK1080_GetFreqHiLimit(gEeprom.FM_Band)) + Frequency = BK1080_GetFreqLoLimit(gEeprom.FM_Band); gEeprom.FM_FrequencyPlaying = Frequency; } gFM_ScanState = Step; - BK1080_SetFrequency(gEeprom.FM_FrequencyPlaying); + BK1080_SetFrequency(gEeprom.FM_FrequencyPlaying, gEeprom.FM_Band/*, gEeprom.FM_Space*/); } void FM_PlayAndUpdate(void) @@ -161,7 +163,7 @@ void FM_PlayAndUpdate(void) } FM_ConfigureChannelState(); - BK1080_SetFrequency(gEeprom.FM_FrequencyPlaying); + BK1080_SetFrequency(gEeprom.FM_FrequencyPlaying, gEeprom.FM_Band/*, gEeprom.FM_Space*/); SETTINGS_SaveFM(); gFmPlayCountdown_10ms = 0; @@ -261,7 +263,7 @@ static void Key_DIGITS(KEY_Code_t Key, uint8_t state) gInputBoxIndex = 0; Frequency = StrToUL(INPUTBOX_GetAscii()); - if (Frequency < gEeprom.FM_LowerLimit || gEeprom.FM_UpperLimit < Frequency) { + if (Frequency < BK1080_GetFreqLoLimit(gEeprom.FM_Band) || BK1080_GetFreqHiLimit(gEeprom.FM_Band) < Frequency) { gBeepToPlay = BEEP_500HZ_60MS_DOUBLE_BEEP_OPTIONAL; gRequestDisplayScreen = DISPLAY_FM; return; @@ -272,7 +274,7 @@ static void Key_DIGITS(KEY_Code_t Key, uint8_t state) gAnotherVoiceID = (VOICE_ID_t)Key; #endif gEeprom.FM_FrequencyPlaying = gEeprom.FM_SelectedFrequency; - BK1080_SetFrequency(gEeprom.FM_FrequencyPlaying); + BK1080_SetFrequency(gEeprom.FM_FrequencyPlaying, gEeprom.FM_Band/*, gEeprom.FM_Space*/); gRequestSaveFM = true; return; } @@ -290,7 +292,7 @@ static void Key_DIGITS(KEY_Code_t Key, uint8_t state) #endif gEeprom.FM_SelectedChannel = Channel; gEeprom.FM_FrequencyPlaying = gFM_Channels[Channel]; - BK1080_SetFrequency(gEeprom.FM_FrequencyPlaying); + BK1080_SetFrequency(gEeprom.FM_FrequencyPlaying, gEeprom.FM_Band/*, gEeprom.FM_Space*/); gRequestSaveFM = true; return; } @@ -332,11 +334,21 @@ static void Key_FUNC(KEY_Code_t Key, uint8_t state) ACTION_FM(); break; + case KEY_1: + gEeprom.FM_Band++; + gRequestSaveFM = true; + break; + + // case KEY_2: + // gEeprom.FM_Space = (gEeprom.FM_Space + 1) % 3; + // gRequestSaveFM = true; + // break; + case KEY_3: gEeprom.FM_IsMrMode = !gEeprom.FM_IsMrMode; if (!FM_ConfigureChannelState()) { - BK1080_SetFrequency(gEeprom.FM_FrequencyPlaying); + BK1080_SetFrequency(gEeprom.FM_FrequencyPlaying, gEeprom.FM_Band/*, gEeprom.FM_Space*/); gRequestSaveFM = true; } else @@ -424,7 +436,7 @@ static void Key_MENU(uint8_t state) gFM_Channels[gEeprom.FM_SelectedChannel] = 0xFFFF; FM_ConfigureChannelState(); - BK1080_SetFrequency(gEeprom.FM_FrequencyPlaying); + BK1080_SetFrequency(gEeprom.FM_FrequencyPlaying, gEeprom.FM_Band/*, gEeprom.FM_Space*/); gRequestSaveFM = true; } @@ -487,10 +499,10 @@ static void Key_UP_DOWN(uint8_t state, int8_t Step) else { uint16_t Frequency = gEeprom.FM_SelectedFrequency + Step; - if (Frequency < gEeprom.FM_LowerLimit) - Frequency = gEeprom.FM_UpperLimit; - else if (Frequency > gEeprom.FM_UpperLimit) - Frequency = gEeprom.FM_LowerLimit; + if (Frequency < BK1080_GetFreqLoLimit(gEeprom.FM_Band)) + Frequency = BK1080_GetFreqHiLimit(gEeprom.FM_Band); + else if (Frequency > BK1080_GetFreqHiLimit(gEeprom.FM_Band)) + Frequency = BK1080_GetFreqLoLimit(gEeprom.FM_Band); gEeprom.FM_FrequencyPlaying = Frequency; gEeprom.FM_SelectedFrequency = gEeprom.FM_FrequencyPlaying; @@ -499,7 +511,7 @@ static void Key_UP_DOWN(uint8_t state, int8_t Step) gRequestSaveFM = true; Bail: - BK1080_SetFrequency(gEeprom.FM_FrequencyPlaying); + BK1080_SetFrequency(gEeprom.FM_FrequencyPlaying, gEeprom.FM_Band/*, gEeprom.FM_Space*/); gRequestDisplayScreen = DISPLAY_FM; } @@ -542,7 +554,7 @@ 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(gEeprom.FM_FrequencyPlaying, BK1080_GetFreqLoLimit(gEeprom.FM_Band))) { if (!gFM_AutoScan) { gFmPlayCountdown_10ms = 0; gFM_FoundFrequency = true; @@ -567,7 +579,7 @@ void FM_Play(void) } } - if (gFM_AutoScan && gEeprom.FM_FrequencyPlaying >= gEeprom.FM_UpperLimit) + if (gFM_AutoScan && gEeprom.FM_FrequencyPlaying >= BK1080_GetFreqHiLimit(1)) FM_PlayAndUpdate(); else FM_Tune(gEeprom.FM_FrequencyPlaying, gFM_ScanState, false); @@ -582,7 +594,7 @@ void FM_Start(void) gFM_ScanState = FM_SCAN_OFF; gFM_RestoreCountdown_10ms = 0; - BK1080_Init(gEeprom.FM_FrequencyPlaying, true); + BK1080_Init(gEeprom.FM_FrequencyPlaying, gEeprom.FM_Band/*, gEeprom.FM_Space*/); AUDIO_AudioPathOn(); diff --git a/board.c b/board.c index 9274cb0..0396d15 100644 --- a/board.c +++ b/board.c @@ -495,7 +495,7 @@ void BOARD_Init(void) BOARD_ADC_Init(); ST7565_Init(); #ifdef ENABLE_FMRADIO - BK1080_Init(0, false); + BK1080_Init0(); #endif #if defined(ENABLE_UART) || defined(ENABLED_AIRCOPY) diff --git a/driver/bk1080.c b/driver/bk1080.c index c395612..b14af1a 100644 --- a/driver/bk1080.c +++ b/driver/bk1080.c @@ -39,11 +39,16 @@ static bool gIsInitBK1080; uint16_t BK1080_BaseFrequency; uint16_t BK1080_FrequencyDeviation; -void BK1080_Init(uint16_t Frequency, bool bDoScan) +void BK1080_Init0(void) +{ + BK1080_Init(0,0/*,0*/); +} + +void BK1080_Init(uint16_t freq, uint8_t band/*, uint8_t space*/) { unsigned int i; - if (bDoScan) { + if (freq) { GPIO_ClearBit(&GPIOB->DATA, GPIOB_PIN_BK1080); if (!gIsInitBK1080) { @@ -63,8 +68,8 @@ void BK1080_Init(uint16_t Frequency, bool bDoScan) BK1080_WriteRegister(BK1080_REG_02_POWER_CONFIGURATION, 0x0201); } - BK1080_WriteRegister(BK1080_REG_05_SYSTEM_CONFIGURATION2, 0x0A5F); - BK1080_SetFrequency(Frequency); + BK1080_WriteRegister(BK1080_REG_05_SYSTEM_CONFIGURATION2, 0x0A1F); + BK1080_SetFrequency(freq, band/*, space*/); } else { BK1080_WriteRegister(BK1080_REG_02_POWER_CONFIGURATION, 0x0241); @@ -100,9 +105,19 @@ void BK1080_Mute(bool Mute) BK1080_WriteRegister(BK1080_REG_02_POWER_CONFIGURATION, Mute ? 0x4201 : 0x0201); } -void BK1080_SetFrequency(uint16_t frequency) +void BK1080_SetFrequency(uint16_t frequency, uint8_t band/*, uint8_t space*/) { - uint16_t channel = frequency - 760; + //uint8_t spacings[] = {20,10,5}; + //space %= 3; + + uint16_t channel = (frequency - BK1080_GetFreqLoLimit(band))/* * 10 / spacings[space]*/; + + uint16_t regval = BK1080_ReadRegister(BK1080_REG_05_SYSTEM_CONFIGURATION2); + regval = (regval & ~(0b11 << 6)) | ((band & 0b11) << 6); + //regval = (regval & ~(0b11 << 4)) | ((space & 0b11) << 4); + + BK1080_WriteRegister(BK1080_REG_05_SYSTEM_CONFIGURATION2, regval); + BK1080_WriteRegister(BK1080_REG_03_CHANNEL, channel); SYSTEM_DelayMs(10); BK1080_WriteRegister(BK1080_REG_03_CHANNEL, channel | 0x8000); @@ -113,3 +128,17 @@ void BK1080_GetFrequencyDeviation(uint16_t Frequency) BK1080_BaseFrequency = Frequency; BK1080_FrequencyDeviation = BK1080_ReadRegister(BK1080_REG_07) / 16; } + +uint16_t BK1080_GetFreqLoLimit(uint8_t band) +{ + uint16_t lim[] = {875, 760, 760, 640}; + return lim[band % 4]; +} + +uint16_t BK1080_GetFreqHiLimit(uint8_t band) +{ + band %= 4; + uint16_t lim[] = {1080, 1080, 900, 760}; + return lim[band % 4]; +} + diff --git a/driver/bk1080.h b/driver/bk1080.h index 61fddc6..9652225 100644 --- a/driver/bk1080.h +++ b/driver/bk1080.h @@ -24,11 +24,14 @@ extern uint16_t BK1080_BaseFrequency; extern uint16_t BK1080_FrequencyDeviation; -void BK1080_Init(uint16_t Frequency, bool bDoScan); +void BK1080_Init0(void); +void BK1080_Init(uint16_t Frequency, uint8_t band/*, uint8_t space*/); uint16_t BK1080_ReadRegister(BK1080_Register_t Register); void BK1080_WriteRegister(BK1080_Register_t Register, uint16_t Value); void BK1080_Mute(bool Mute); -void BK1080_SetFrequency(uint16_t frequency); +uint16_t BK1080_GetFreqLoLimit(uint8_t band); +uint16_t BK1080_GetFreqHiLimit(uint8_t band); +void BK1080_SetFrequency(uint16_t frequency, uint8_t band/*, uint8_t space*/); void BK1080_GetFrequencyDeviation(uint16_t Frequency); #endif diff --git a/functions.c b/functions.c index 69a70e9..e4f631b 100644 --- a/functions.c +++ b/functions.c @@ -152,7 +152,7 @@ void FUNCTION_Transmit() #if defined(ENABLE_FMRADIO) if (gFmRadioMode) - BK1080_Init(0, false); + BK1080_Init0(); #endif #ifdef ENABLE_ALARM diff --git a/settings.c b/settings.c index 4b99282..68a1926 100644 --- a/settings.c +++ b/settings.c @@ -20,6 +20,7 @@ #ifdef ENABLE_FMRADIO #include "app/fm.h" #endif +#include "driver/bk1080.h" #include "driver/bk4819.h" #include "driver/eeprom.h" #include "misc.h" @@ -89,17 +90,20 @@ void SETTINGS_InitEEPROM(void) { uint16_t selFreq; uint8_t selChn; - uint8_t isMrMode; + uint8_t isMrMode:1; + uint8_t band:2; + //uint8_t space:2; } __attribute__((packed)) fmCfg; EEPROM_ReadBuffer(0x0E88, &fmCfg, 4); - gEeprom.FM_LowerLimit = 760; - gEeprom.FM_UpperLimit = 1080; + gEeprom.FM_Band = fmCfg.band; + //gEeprom.FM_Space = fmCfg.space; gEeprom.FM_SelectedFrequency = - (fmCfg.selFreq >= gEeprom.FM_LowerLimit && fmCfg.selFreq <= gEeprom.FM_UpperLimit) ? fmCfg.selFreq : 960; + (fmCfg.selFreq >= BK1080_GetFreqLoLimit(gEeprom.FM_Band) && fmCfg.selFreq <= BK1080_GetFreqHiLimit(gEeprom.FM_Band)) ? + fmCfg.selFreq : BK1080_GetFreqLoLimit(gEeprom.FM_Band); gEeprom.FM_SelectedChannel = fmCfg.selChn; - gEeprom.FM_IsMrMode = (fmCfg.isMrMode < 2) ? fmCfg.isMrMode : false; + gEeprom.FM_IsMrMode = fmCfg.isMrMode; } // 0E40..0E67 @@ -415,25 +419,28 @@ void SETTINGS_FactoryReset(bool bIsAll) } #ifdef ENABLE_FMRADIO - void SETTINGS_SaveFM(void) +void SETTINGS_SaveFM(void) { - unsigned int i; + union { + struct { + uint16_t selFreq; + uint8_t selChn; + uint8_t isMrMode:1; + uint8_t band:2; + //uint8_t space:2; + }; + uint8_t __raw[8]; + } __attribute__((packed)) fmCfg; - struct - { - uint16_t Frequency; - uint8_t Channel; - bool IsChannelSelected; - uint8_t Padding[4]; - } State; + memset(fmCfg.__raw, 0xFF, sizeof(fmCfg.__raw)); + fmCfg.selChn = gEeprom.FM_SelectedChannel; + fmCfg.selFreq = gEeprom.FM_SelectedFrequency; + fmCfg.isMrMode = gEeprom.FM_IsMrMode; + fmCfg.band = gEeprom.FM_Band; + //fmCfg.space = gEeprom.FM_Space; + EEPROM_WriteBuffer(0x0E88, fmCfg.__raw); - memset(&State, 0xFF, sizeof(State)); - State.Channel = gEeprom.FM_SelectedChannel; - State.Frequency = gEeprom.FM_SelectedFrequency; - State.IsChannelSelected = gEeprom.FM_IsMrMode; - - EEPROM_WriteBuffer(0x0E88, &State); - for (i = 0; i < 5; i++) + for (unsigned i = 0; i < 5; i++) EEPROM_WriteBuffer(0x0E40 + (i * 8), &gFM_Channels[i * 4]); } #endif diff --git a/settings.h b/settings.h index 1f04ca3..eadf2fe 100644 --- a/settings.h +++ b/settings.h @@ -148,8 +148,8 @@ typedef struct { uint8_t FM_SelectedChannel; bool FM_IsMrMode; uint16_t FM_FrequencyPlaying; - uint16_t FM_LowerLimit; - uint16_t FM_UpperLimit; + uint8_t FM_Band : 2; + //uint8_t FM_Space : 2; #endif uint8_t SQUELCH_LEVEL; diff --git a/ui/fmradio.c b/ui/fmradio.c index a6b5bc8..022464b 100644 --- a/ui/fmradio.c +++ b/ui/fmradio.c @@ -19,6 +19,7 @@ #include #include "app/fm.h" +#include "driver/bk1080.h" #include "driver/st7565.h" #include "external/printf/printf.h" #include "misc.h" @@ -34,7 +35,19 @@ void UI_DisplayFM(void) char *pPrintStr = String; UI_DisplayClear(); - UI_PrintString("FM", 0, 127, 0, 12); + UI_PrintString("FM", 2, 0, 0, 8); + + sprintf(String, "%d%s-%dM", + BK1080_GetFreqLoLimit(gEeprom.FM_Band)/10, + gEeprom.FM_Band == 0 ? ".5" : "", + BK1080_GetFreqHiLimit(gEeprom.FM_Band)/10 + ); + + UI_PrintStringSmallNormal(String, 1, 0, 6); + + //uint8_t spacings[] = {20,10,5}; + //sprintf(String, "%d0k", spacings[gEeprom.FM_Space % 3]); + //UI_PrintStringSmallNormal(String, 127 - 4*7, 0, 6); if (gAskToSave) { pPrintStr = "SAVE?"; @@ -61,7 +74,7 @@ void UI_DisplayFM(void) pPrintStr = "M-SCAN"; } - UI_PrintString(pPrintStr, 0, 127, 2, 10); + UI_PrintString(pPrintStr, 0, 127, 3, 10); // memory, vfo, scan memset(String, 0, sizeof(String)); if (gAskToSave || (gEeprom.FM_IsMrMode && gInputBoxIndex > 0)) { @@ -76,12 +89,12 @@ void UI_DisplayFM(void) sprintf(String, "%.3s.%.1s",ascii, ascii + 3); } - UI_DisplayFrequency(String, 32, 4, gInputBoxIndex == 0); + UI_DisplayFrequency(String, 36, 1, gInputBoxIndex == 0); // frequency ST7565_BlitFullScreen(); return; } - UI_PrintString(String, 0, 127, 4, 10); + UI_PrintString(String, 0, 127, 1, 10); ST7565_BlitFullScreen(); }