From 95d986ca3b199926b37aa92debbc4e5a5daa3429 Mon Sep 17 00:00:00 2001 From: Dmitry Date: Sun, 10 Sep 2023 14:38:28 +0300 Subject: [PATCH] =?UTF-8?q?=D0=A3=D0=B4=D0=B0=D0=BB=D0=B5=D0=BD=D1=8B=20FM?= =?UTF-8?q?=20=D0=B8=20=D1=81=D0=B8=D0=B3=D0=BD=D0=B0=D0=BB=20=D1=82=D1=80?= =?UTF-8?q?=D0=B5=D0=B2=D0=BE=D0=B3=D0=B8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .gitignore | 1 + Makefile | 3 - app/action.c | 74 ++---- app/action.h | 6 +- app/app.c | 87 +------ app/dtmf.c | 1 - app/fm.c | 540 ------------------------------------------- app/fm.h | 59 ----- app/generic.c | 19 +- app/main.c | 34 ++- app/uart.c | 8 - audio.c | 18 -- board.c | 9 +- driver/bk1080-regs.h | 57 ----- driver/bk1080.c | 115 --------- driver/bk1080.h | 35 --- firmware.packed.bin | Bin 56922 -> 52922 bytes functions.c | 11 - misc.h | 2 +- radio.c | 7 +- scheduler.c | 6 +- settings.c | 22 -- ui/fmradio.c | 90 -------- ui/fmradio.h | 23 -- ui/main.c | 2 +- ui/status.c | 5 +- ui/ui.c | 6 - ui/ui.h | 5 +- 28 files changed, 51 insertions(+), 1194 deletions(-) delete mode 100644 app/fm.c delete mode 100644 app/fm.h delete mode 100644 driver/bk1080-regs.h delete mode 100644 driver/bk1080.c delete mode 100644 driver/bk1080.h delete mode 100644 ui/fmradio.c delete mode 100644 ui/fmradio.h diff --git a/.gitignore b/.gitignore index 3747a14..db3ec6a 100644 --- a/.gitignore +++ b/.gitignore @@ -7,3 +7,4 @@ sram-overlay.bin *.bin firmware +make.sh \ No newline at end of file diff --git a/Makefile b/Makefile index b8cc111..8fff338 100644 --- a/Makefile +++ b/Makefile @@ -15,7 +15,6 @@ OBJS += external/printf/printf.o OBJS += driver/adc.o OBJS += driver/aes.o OBJS += driver/backlight.o -OBJS += driver/bk1080.o OBJS += driver/bk4819.o OBJS += driver/crc.o OBJS += driver/eeprom.o @@ -33,7 +32,6 @@ OBJS += driver/uart.o OBJS += app/action.o OBJS += app/app.o OBJS += app/dtmf.o -OBJS += app/fm.o OBJS += app/generic.o OBJS += app/main.o OBJS += app/menu.o @@ -53,7 +51,6 @@ OBJS += radio.o OBJS += scheduler.o OBJS += settings.o OBJS += ui/battery.o -OBJS += ui/fmradio.o OBJS += ui/helper.o OBJS += ui/inputbox.o OBJS += ui/lock.o diff --git a/app/action.c b/app/action.c index 463b9a7..5f1bb8c 100644 --- a/app/action.c +++ b/app/action.c @@ -18,11 +18,9 @@ #include "app/app.h" #include "app/dtmf.h" -#include "app/fm.h" #include "app/scanner.h" #include "audio.h" #include "bsp/dp32g030/gpio.h" -#include "driver/bk1080.h" #include "driver/bk4819.h" #include "driver/gpio.h" #include "functions.h" @@ -69,42 +67,11 @@ static void ACTION_Monitor(void) { gScanPauseMode = true; } RADIO_SetupRegisters(true); - if (gFmRadioMode) { - FM_Start(); - gRequestDisplayScreen = DISPLAY_FM; - } else { - gRequestDisplayScreen = gScreenToDisplay; - } + gRequestDisplayScreen = gScreenToDisplay; } void ACTION_Scan(bool bRestart) { - if (gFmRadioMode) { - if (gCurrentFunction != FUNCTION_RECEIVE && - gCurrentFunction != FUNCTION_MONITOR && - gCurrentFunction != FUNCTION_TRANSMIT) { - uint16_t Frequency; - - GUI_SelectNextDisplay(DISPLAY_FM); - if (gFM_ScanState != FM_SCAN_OFF) { - FM_PlayAndUpdate(); - gAnotherVoiceID = VOICE_ID_SCANNING_STOP; - } else { - if (bRestart) { - gFM_AutoScan = true; - gFM_ChannelPosition = 0; - FM_EraseChannels(); - Frequency = gEeprom.FM_LowerLimit; - } else { - gFM_AutoScan = false; - gFM_ChannelPosition = 0; - Frequency = gEeprom.FM_FrequencyPlaying; - } - BK1080_GetFrequencyDeviation(Frequency); - FM_Tune(Frequency, 1, bRestart); - gAnotherVoiceID = VOICE_ID_SCANNING_BEGIN; - } - } - } else if (gScreenToDisplay != DISPLAY_SCANNER) { + if (gScreenToDisplay != DISPLAY_SCANNER) { RADIO_SelectVfos(); GUI_SelectNextDisplay(DISPLAY_MAIN); if (gScanState != SCAN_OFF) { @@ -126,35 +93,20 @@ void ACTION_Vox(void) { gUpdateStatus = true; } -static void ACTION_AlarmOr1750(bool b1750) { +static void ACTION_1750(void) { gInputBoxIndex = 0; - if (b1750) { - gAlarmState = ALARM_STATE_TX1750; - } else { - gAlarmState = ALARM_STATE_TXALARM; - } + gAlarmState = ALARM_STATE_TX1750; gAlarmRunningCounter = 0; gFlagPrepareTX = true; gRequestDisplayScreen = DISPLAY_MAIN; } -void ACTION_FM(void) { - if (gCurrentFunction != FUNCTION_TRANSMIT && - gCurrentFunction != FUNCTION_MONITOR) { - if (gFmRadioMode) { - FM_TurnOff(); - gInputBoxIndex = 0; - gVoxResumeCountdown = 80; - gFlagReconfigureVfos = true; - gRequestDisplayScreen = DISPLAY_MAIN; - return; - } - RADIO_SelectVfos(); - RADIO_SetupRegisters(true); - FM_Start(); - gInputBoxIndex = 0; - gRequestDisplayScreen = DISPLAY_FM; - } +void ACTION_SwitchAB(void) { + //временная заглушка +} + +void ACTION_VFOMR(void) { + //временная заглушка } void ACTION_Handle(KEY_Code_t Key, bool bKeyPressed, bool bKeyHeld) { @@ -218,13 +170,13 @@ void ACTION_Handle(KEY_Code_t Key, bool bKeyPressed, bool bKeyHeld) { ACTION_Vox(); break; case 6: - ACTION_AlarmOr1750(false); + ACTION_VFOMR(); break; case 7: - ACTION_FM(); + ACTION_SwitchAB(); break; case 8: - ACTION_AlarmOr1750(true); + ACTION_1750(); break; } } diff --git a/app/action.h b/app/action.h index 1aeb1fb..dbaeb32 100644 --- a/app/action.h +++ b/app/action.h @@ -19,13 +19,11 @@ #include "driver/keyboard.h" -//static void ACTION_FlashLight(void) + void ACTION_Power(void); -//static void ACTION_Monitor(void) void ACTION_Scan(bool bFlag); void ACTION_Vox(void); -//static void ACTION_AlarmOr1750(bool b1750) -void ACTION_FM(void); + void ACTION_Handle(KEY_Code_t Key, bool bKeyPressed, bool bKeyHeld); diff --git a/app/app.c b/app/app.c index bd75579..19457d5 100644 --- a/app/app.c +++ b/app/app.c @@ -17,11 +17,9 @@ #include "app/app.h" #include - #include "ARMCM0.h" #include "app/action.h" #include "app/dtmf.h" -#include "app/fm.h" #include "app/generic.h" #include "app/main.h" #include "app/menu.h" @@ -31,7 +29,6 @@ #include "board.h" #include "bsp/dp32g030/gpio.h" #include "driver/backlight.h" -#include "driver/bk1080.h" #include "driver/bk4819.h" #include "driver/gpio.h" #include "driver/keyboard.h" @@ -279,9 +276,6 @@ static void APP_HandleFunction(void) { } void APP_StartListening(FUNCTION_Type_t Function) { - if (gFmRadioMode) { - BK1080_Init(0, false); - } gVFO_RSSI_Level[gEeprom.RX_CHANNEL == 0] = 0; GPIO_SetBit(&GPIOC->DATA, GPIOC_PIN_AUDIO_PATH); gEnableSpeaker = true; @@ -328,7 +322,7 @@ void APP_StartListening(FUNCTION_Type_t Function) { } } FUNCTION_Select(Function); - if (Function == FUNCTION_MONITOR || gFmRadioMode) { + if (Function == FUNCTION_MONITOR) { GUI_SelectNextDisplay(DISPLAY_MAIN); return; } @@ -513,7 +507,7 @@ static void APP_HandleVox(void) { } if (gCurrentFunction != FUNCTION_RECEIVE && gCurrentFunction != FUNCTION_MONITOR && gScanState == SCAN_OFF && - gCssScanMode == CSS_SCAN_MODE_OFF && !gFmRadioMode) { + gCssScanMode == CSS_SCAN_MODE_OFF) { if (gVOX_NoiseDetected) { if (g_VOX_Lost) { gVoxStopCountdown = 100; @@ -572,9 +566,7 @@ void APP_Update(void) { if (gCurrentFunction != FUNCTION_TRANSMIT) { APP_HandleFunction(); } - if (gFmRadioCountdown) { - return; - } + if (gScreenToDisplay != DISPLAY_SCANNER && gScanState != SCAN_OFF && gScheduleScanListen && !gPttIsPressed && gVoiceWriteIndex == 0) { @@ -607,8 +599,7 @@ void APP_Update(void) { gEeprom.DUAL_WATCH != DUAL_WATCH_OFF) { if (gScheduleDualWatch && gVoiceWriteIndex == 0) { if (gScanState == SCAN_OFF && gCssScanMode == CSS_SCAN_MODE_OFF) { - if (!gPttIsPressed && !gFmRadioMode && - gDTMF_CallState == DTMF_CALL_STATE_NONE && + if (!gPttIsPressed && gDTMF_CallState == DTMF_CALL_STATE_NONE && gCurrentFunction != FUNCTION_POWER_SAVE) { DUALWATCH_Alternate(); if (gRxVfoIsActive && gScreenToDisplay == DISPLAY_MAIN) { @@ -623,13 +614,6 @@ void APP_Update(void) { } } - if (gFM_ScanState != FM_SCAN_OFF && gScheduleFM && - gCurrentFunction != FUNCTION_MONITOR && - gCurrentFunction != FUNCTION_RECEIVE && - gCurrentFunction != FUNCTION_TRANSMIT) { - FM_Play(); - gScheduleFM = false; - } if (gEeprom.VOX_SWITCH) { APP_HandleVox(); @@ -637,7 +621,7 @@ void APP_Update(void) { if (gSchedulePowerSave) { if (gEeprom.BATTERY_SAVE == 0 || gScanState != SCAN_OFF || - gCssScanMode != CSS_SCAN_MODE_OFF || gFmRadioMode || + gCssScanMode != CSS_SCAN_MODE_OFF || gPttIsPressed || gScreenToDisplay != DISPLAY_MAIN || gKeyBeingHeld || gDTMF_CallState != DTMF_CALL_STATE_NONE) { gBatterySaveCountdown = 1000; @@ -777,12 +761,6 @@ void APP_TimeSlice10ms(void) { } } - // Skipping authentic device checks - - if (gFmRadioCountdown) { - return; - } - if (gFlashLightState == FLASHLIGHT_BLINK && (gFlashLightBlinkCounter & 15U) == 0) { GPIO_FlipBit(&GPIOC->DATA, GPIOC_PIN_FLASHLIGHT); @@ -839,13 +817,7 @@ void APP_TimeSlice10ms(void) { } } } - if (gFmRadioMode && gFM_RestoreCountdown) { - gFM_RestoreCountdown--; - if (gFM_RestoreCountdown == 0) { - FM_Start(); - GUI_SelectNextDisplay(DISPLAY_FM); - } - } + if (gScreenToDisplay == DISPLAY_SCANNER) { uint32_t Result; int32_t Delta; @@ -945,7 +917,6 @@ void APP_TimeSlice10ms(void) { } void APP_TimeSlice500ms(void) { - // Skipped authentic device check if (gKeypadLocked) { gKeypadLocked--; @@ -954,12 +925,7 @@ void APP_TimeSlice500ms(void) { } } - // Skipped authentic device check - if (gFmRadioCountdown) { - gFmRadioCountdown--; - return; - } if (gReducedService) { BOARD_ADC_GetBatteryInfo(&gBatteryCurrentVoltage, &gBatteryCurrent); if (gBatteryCurrent > 500 || @@ -971,7 +937,6 @@ void APP_TimeSlice500ms(void) { gBatteryCheckCounter++; - // Skipped authentic device check if (gCurrentFunction != FUNCTION_TRANSMIT) { if ((gBatteryCheckCounter & 1) == 0) { @@ -987,8 +952,7 @@ void APP_TimeSlice500ms(void) { gCurrentRSSI = BK4819_GetRSSI(); UI_UpdateRSSI(gCurrentRSSI); } - if ((gFM_ScanState == FM_SCAN_OFF || gAskToSave) && - gScanState == SCAN_OFF && gCssScanMode == CSS_SCAN_MODE_OFF) { + if (gAskToSave && (gScanState == SCAN_OFF) && (gCssScanMode == CSS_SCAN_MODE_OFF)) { if (gBacklightCountdown) { gBacklightCountdown--; if (gBacklightCountdown == 0) { @@ -1026,33 +990,13 @@ void APP_TimeSlice500ms(void) { gDTMF_InputIndex = 0; gAskToSave = false; gAskToDelete = false; - if (gFmRadioMode && - gCurrentFunction != FUNCTION_RECEIVE && - gCurrentFunction != FUNCTION_MONITOR && - gCurrentFunction != FUNCTION_TRANSMIT) { - GUI_SelectNextDisplay(DISPLAY_FM); - } else { - GUI_SelectNextDisplay(DISPLAY_MAIN); - } + GUI_SelectNextDisplay(DISPLAY_MAIN); } } } } } - if (!gPttIsPressed && gFM_ResumeCountdown) { - gFM_ResumeCountdown--; - if (gFM_ResumeCountdown == 0) { - RADIO_SetVfoState(VFO_STATE_NORMAL); - if (gCurrentFunction != FUNCTION_RECEIVE && - gCurrentFunction != FUNCTION_TRANSMIT && - gCurrentFunction != FUNCTION_MONITOR && gFmRadioMode) { - FM_Start(); - GUI_SelectNextDisplay(DISPLAY_FM); - } - } - } - if (gLowBattery) { gLowBatteryBlink = ++gLowBatteryCountdown & 1; UI_DisplayBattery(gLowBatteryCountdown); @@ -1186,10 +1130,6 @@ static void APP_ProcessKey(KEY_Code_t Key, bool bKeyPressed, bool bKeyHeld) { SETTINGS_SaveSettings(); gFlagSaveSettings = false; } - if (gFlagSaveFM) { - SETTINGS_SaveFM(); - gFlagSaveFM = false; - } if (gFlagSaveChannel) { SETTINGS_SaveChannel(gTxVfo->CHANNEL_SAVE, gEeprom.TX_CHANNEL, gTxVfo, gFlagSaveChannel); @@ -1356,9 +1296,6 @@ static void APP_ProcessKey(KEY_Code_t Key, bool bKeyPressed, bool bKeyHeld) { case DISPLAY_MAIN: MAIN_ProcessKeys(Key, bKeyPressed, bKeyHeld); break; - case DISPLAY_FM: - FM_ProcessKeys(Key, bKeyPressed, bKeyHeld); - break; case DISPLAY_MENU: MENU_ProcessKeys(Key, bKeyPressed, bKeyHeld); break; @@ -1399,14 +1336,6 @@ static void APP_ProcessKey(KEY_Code_t Key, bool bKeyPressed, bool bKeyHeld) { gRequestSaveSettings = false; gUpdateStatus = true; } - if (gRequestSaveFM) { - if (!bKeyHeld) { - SETTINGS_SaveFM(); - } else { - gFlagSaveFM = true; - } - gRequestSaveFM = false; - } if (gRequestSaveVFO) { if (!bKeyHeld) { SETTINGS_SaveVfoIndices(); diff --git a/app/dtmf.c b/app/dtmf.c index 79243a3..1efe3f4 100644 --- a/app/dtmf.c +++ b/app/dtmf.c @@ -15,7 +15,6 @@ */ #include -#include "app/fm.h" #include "app/scanner.h" #include "bsp/dp32g030/gpio.h" #include "driver/bk4819.h" diff --git a/app/fm.c b/app/fm.c deleted file mode 100644 index 31204e6..0000000 --- a/app/fm.c +++ /dev/null @@ -1,540 +0,0 @@ -/* Copyright 2023 Dual Tachyon - * https://github.com/DualTachyon - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -#include -#include "app/action.h" -#include "app/fm.h" -#include "app/generic.h" -#include "audio.h" -#include "bsp/dp32g030/gpio.h" -#include "driver/bk1080.h" -#include "driver/eeprom.h" -#include "driver/gpio.h" -#include "functions.h" -#include "misc.h" -#include "settings.h" -#include "ui/inputbox.h" -#include "ui/ui.h" - -uint16_t gFM_Channels[20]; -bool gFmRadioMode; -uint8_t gFmRadioCountdown; -volatile uint16_t gFmPlayCountdown; -volatile int8_t gFM_ScanState; -bool gFM_AutoScan; -uint8_t gFM_ChannelPosition; -bool gFM_FoundFrequency; -bool gFM_AutoScan; -uint8_t gFM_ResumeCountdown; -uint16_t gFM_RestoreCountdown; - -bool FM_CheckValidChannel(uint8_t Channel) -{ - if (Channel < 20 && (gFM_Channels[Channel] >= 760 && gFM_Channels[Channel] < 1080)) { - return true; - } - - return false; -} - -uint8_t FM_FindNextChannel(uint8_t Channel, uint8_t Direction) -{ - uint8_t i; - - for (i = 0; i < 20; i++) { - Channel %= 20; - if (FM_CheckValidChannel(Channel)) { - return Channel; - } - Channel += Direction; - } - - return 0xFF; -} - -int FM_ConfigureChannelState(void) -{ - uint8_t Channel; - - gEeprom.FM_FrequencyPlaying = gEeprom.FM_SelectedFrequency; - if (gEeprom.FM_IsMrMode) { - Channel = FM_FindNextChannel(gEeprom.FM_SelectedChannel, FM_CHANNEL_UP); - if (Channel == 0xFF) { - gEeprom.FM_IsMrMode = false; - return -1; - } - gEeprom.FM_SelectedChannel = Channel; - gEeprom.FM_FrequencyPlaying = gFM_Channels[Channel]; - } - - return 0; -} - -void FM_TurnOff(void) -{ - gFmRadioMode = false; - gFM_ScanState = FM_SCAN_OFF; - gFM_RestoreCountdown = 0; - GPIO_ClearBit(&GPIOC->DATA, GPIOC_PIN_AUDIO_PATH); - gEnableSpeaker = false; - BK1080_Init(0, false); - gUpdateStatus = true; -} - -void FM_EraseChannels(void) -{ - uint8_t i; - uint8_t Template[8]; - - memset(Template, 0xFF, sizeof(Template)); - for (i = 0; i < 5; i++) { - EEPROM_WriteBuffer(0x0E40 + (i * 8), Template); - } - - memset(gFM_Channels, 0xFF, sizeof(gFM_Channels)); -} - -void FM_Tune(uint16_t Frequency, int8_t Step, bool bFlag) -{ - GPIO_ClearBit(&GPIOC->DATA, GPIOC_PIN_AUDIO_PATH); - gEnableSpeaker = false; - if (gFM_ScanState == FM_SCAN_OFF) { - gFmPlayCountdown = 120; - } else { - gFmPlayCountdown = 10; - } - gScheduleFM = false; - gFM_FoundFrequency = false; - gAskToSave = false; - gAskToDelete = false; - gEeprom.FM_FrequencyPlaying = Frequency; - if (!bFlag) { - Frequency += Step; - if (Frequency < gEeprom.FM_LowerLimit) { - Frequency = gEeprom.FM_UpperLimit; - } else if (Frequency > gEeprom.FM_UpperLimit) { - Frequency = gEeprom.FM_LowerLimit; - } - gEeprom.FM_FrequencyPlaying = Frequency; - } - - gFM_ScanState = Step; - BK1080_SetFrequency(gEeprom.FM_FrequencyPlaying); -} - -void FM_PlayAndUpdate(void) -{ - gFM_ScanState = FM_SCAN_OFF; - if (gFM_AutoScan) { - gEeprom.FM_IsMrMode = true; - gEeprom.FM_SelectedChannel = 0; - } - FM_ConfigureChannelState(); - BK1080_SetFrequency(gEeprom.FM_FrequencyPlaying); - SETTINGS_SaveFM(); - gFmPlayCountdown = 0; - gScheduleFM = false; - gAskToSave = false; - GPIO_SetBit(&GPIOC->DATA, GPIOC_PIN_AUDIO_PATH); - gEnableSpeaker = true; -} - -int FM_CheckFrequencyLock(uint16_t Frequency, uint16_t LowerLimit) -{ - uint16_t Test2; - uint16_t Deviation; - int ret = -1; - - Test2 = BK1080_ReadRegister(BK1080_REG_07); - // This is supposed to be a signed value, but above function is unsigned - Deviation = BK1080_REG_07_GET_FREQD(Test2); - - if (BK1080_REG_07_GET_SNR(Test2) >= 2) { - uint16_t Status; - - Status = BK1080_ReadRegister(BK1080_REG_10); - if ((Status & BK1080_REG_10_MASK_AFCRL) == BK1080_REG_10_AFCRL_NOT_RAILED && BK1080_REG_10_GET_RSSI(Status) >= 10) { - // if (Deviation > -281 && Deviation < 280) - if (Deviation < 280 || Deviation > 3815) { - // not BLE(less than or equal) - if (Frequency > LowerLimit && (Frequency - BK1080_BaseFrequency) == 1) { - if (BK1080_FrequencyDeviation & 0x800) { - goto Bail; - } - if (BK1080_FrequencyDeviation < 20) { - goto Bail; - } - } - // not BLT(less than) - if (Frequency >= LowerLimit && (BK1080_BaseFrequency - Frequency) == 1) { - if ((BK1080_FrequencyDeviation & 0x800) == 0) { - goto Bail; - } - // if (BK1080_FrequencyDeviation > -21) { - if (BK1080_FrequencyDeviation > 4075) { - goto Bail; - } - } - ret = 0; - } - } - } - -Bail: - BK1080_FrequencyDeviation = Deviation; - BK1080_BaseFrequency = Frequency; - - return ret; -} - -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_SAVE 2 - - if (!bKeyHeld && bKeyPressed) { - if (!gWasFKeyPressed) { - uint8_t State; - - if (gAskToDelete) { - gBeepToPlay = BEEP_500HZ_60MS_DOUBLE_BEEP_OPTIONAL; - return; - } - if (gAskToSave) { - State = STATE_SAVE; - } else { - if (gFM_ScanState != FM_SCAN_OFF) { - gBeepToPlay = BEEP_500HZ_60MS_DOUBLE_BEEP_OPTIONAL; - return; - } - if (gEeprom.FM_IsMrMode) { - State = STATE_MR_MODE; - } else { - State = STATE_FREQ_MODE; - } - } - INPUTBOX_Append(Key); - gRequestDisplayScreen = DISPLAY_FM; - if (State == STATE_FREQ_MODE) { - if (gInputBoxIndex == 1) { - if (gInputBox[0] > 1) { - gInputBox[1] = gInputBox[0]; - gInputBox[0] = 0; - gInputBoxIndex = 2; - } - } else if (gInputBoxIndex > 3) { - uint32_t Frequency; - - gInputBoxIndex = 0; - NUMBER_Get(gInputBox, &Frequency); - Frequency = Frequency / 10000; - if (Frequency < gEeprom.FM_LowerLimit || gEeprom.FM_UpperLimit < Frequency) { - gBeepToPlay = BEEP_500HZ_60MS_DOUBLE_BEEP_OPTIONAL; - gRequestDisplayScreen = DISPLAY_FM; - return; - } - gEeprom.FM_SelectedFrequency = (uint16_t)Frequency; - gAnotherVoiceID = (VOICE_ID_t)Key; - gEeprom.FM_FrequencyPlaying = gEeprom.FM_SelectedFrequency; - BK1080_SetFrequency(gEeprom.FM_FrequencyPlaying); - gRequestSaveFM = true; - return; - } - } else if (gInputBoxIndex == 2) { - uint8_t Channel; - - gInputBoxIndex = 0; - Channel = ((gInputBox[0] * 10) + gInputBox[1]) - 1; - if (State == STATE_MR_MODE) { - if (FM_CheckValidChannel(Channel)) { - gAnotherVoiceID = (VOICE_ID_t)Key; - gEeprom.FM_SelectedChannel = Channel; - gEeprom.FM_FrequencyPlaying = gFM_Channels[Channel]; - BK1080_SetFrequency(gEeprom.FM_FrequencyPlaying); - gRequestSaveFM = true; - return; - } - } else if (Channel < 20) { - gAnotherVoiceID = (VOICE_ID_t)Key; - gRequestDisplayScreen = DISPLAY_FM; - gInputBoxIndex = 0; - gFM_ChannelPosition = Channel; - return; - } - gBeepToPlay = BEEP_500HZ_60MS_DOUBLE_BEEP_OPTIONAL; - return; - } - gAnotherVoiceID = (VOICE_ID_t)Key; - return; - } - gBeepToPlay = BEEP_1KHZ_60MS_OPTIONAL; - gWasFKeyPressed = false; - gUpdateStatus = true; - gRequestDisplayScreen = DISPLAY_FM; - switch (Key) { - case KEY_0: - ACTION_FM(); - break; - - case KEY_1: - gEeprom.FM_IsMrMode = !gEeprom.FM_IsMrMode; - if (!FM_ConfigureChannelState()) { - BK1080_SetFrequency(gEeprom.FM_FrequencyPlaying); - gRequestSaveFM = true; - } else { - gBeepToPlay = BEEP_500HZ_60MS_DOUBLE_BEEP_OPTIONAL; - } - break; - - case KEY_2: - ACTION_Scan(true); - break; - - case KEY_3: - ACTION_Scan(false); - break; - - default: - gBeepToPlay = BEEP_500HZ_60MS_DOUBLE_BEEP_OPTIONAL; - break; - } - } -} - -static void FM_Key_EXIT(bool bKeyPressed, bool bKeyHeld) -{ - if (bKeyHeld) { - return; - } - if (!bKeyPressed) { - return; - } - gBeepToPlay = BEEP_1KHZ_60MS_OPTIONAL; - if (gFM_ScanState == FM_SCAN_OFF) { - if (gInputBoxIndex == 0) { - if (!gAskToSave && !gAskToDelete) { - ACTION_FM(); - return; - } - gAskToSave = false; - gAskToDelete = false; - } else { - gInputBoxIndex--; - gInputBox[gInputBoxIndex] = 10; - if (gInputBoxIndex) { - if (gInputBoxIndex != 1) { - gRequestDisplayScreen = DISPLAY_FM; - return; - } - if (gInputBox[0] != 0) { - gRequestDisplayScreen = DISPLAY_FM; - return; - } - } - gInputBoxIndex = 0; - } - gAnotherVoiceID = VOICE_ID_CANCEL; - } else { - FM_PlayAndUpdate(); - gAnotherVoiceID = VOICE_ID_SCANNING_STOP; - } - gRequestDisplayScreen = DISPLAY_FM; -} - -static void FM_Key_MENU(bool bKeyPressed, bool bKeyHeld) -{ - if (bKeyHeld) { - return; - } - if (!bKeyPressed) { - return; - } - - gRequestDisplayScreen = DISPLAY_FM; - gBeepToPlay = BEEP_1KHZ_60MS_OPTIONAL; - - if (gFM_ScanState == FM_SCAN_OFF) { - if (!gEeprom.FM_IsMrMode) { - if (gAskToSave) { - gFM_Channels[gFM_ChannelPosition] = gEeprom.FM_FrequencyPlaying; - gAskToSave = false; - gRequestSaveFM = true; - } else { - gAskToSave = true; - } - } else { - if (gAskToDelete) { - gFM_Channels[gEeprom.FM_SelectedChannel] = 0xFFFF; - FM_ConfigureChannelState(); - BK1080_SetFrequency(gEeprom.FM_FrequencyPlaying); - gRequestSaveFM = true; - gAskToDelete = false; - } else { - gAskToDelete = true; - } - } - } else { - if (gFM_AutoScan || !gFM_FoundFrequency) { - gBeepToPlay = BEEP_500HZ_60MS_DOUBLE_BEEP_OPTIONAL; - gInputBoxIndex = 0; - return; - } else if (gAskToSave) { - gFM_Channels[gFM_ChannelPosition] = gEeprom.FM_FrequencyPlaying; - gAskToSave = false; - gRequestSaveFM = true; - } else { - gAskToSave = true; - } - } -} - -static void FM_Key_UP_DOWN(bool bKeyPressed, bool bKeyHeld, int8_t Step) -{ - if (bKeyHeld || !bKeyPressed) { - if (gInputBoxIndex) { - return; - } - if (!bKeyPressed) { - return; - } - } else { - if (gInputBoxIndex) { - gBeepToPlay = BEEP_500HZ_60MS_DOUBLE_BEEP_OPTIONAL; - return; - } - gBeepToPlay = BEEP_1KHZ_60MS_OPTIONAL; - } - if (gAskToSave) { - gRequestDisplayScreen = DISPLAY_FM; - gFM_ChannelPosition = NUMBER_AddWithWraparound(gFM_ChannelPosition, Step, 0, 19); - return; - } - if (gFM_ScanState != FM_SCAN_OFF) { - if (gFM_AutoScan) { - gBeepToPlay = BEEP_500HZ_60MS_DOUBLE_BEEP_OPTIONAL; - return; - } - FM_Tune(gEeprom.FM_FrequencyPlaying, Step, false); - gRequestDisplayScreen = DISPLAY_FM; - return; - } - if (gEeprom.FM_IsMrMode) { - uint8_t Channel; - - Channel = FM_FindNextChannel(gEeprom.FM_SelectedChannel + Step, Step); - if (Channel == 0xFF || gEeprom.FM_SelectedChannel == Channel) { - goto Bail; - } - gEeprom.FM_SelectedChannel = Channel; - gEeprom.FM_FrequencyPlaying = gFM_Channels[Channel]; - } else { - uint16_t Frequency; - - Frequency = gEeprom.FM_SelectedFrequency + Step; - if (Frequency < gEeprom.FM_LowerLimit) { - Frequency = gEeprom.FM_UpperLimit; - } else if (Frequency > gEeprom.FM_UpperLimit) { - Frequency = gEeprom.FM_LowerLimit; - } - gEeprom.FM_FrequencyPlaying = Frequency; - gEeprom.FM_SelectedFrequency = gEeprom.FM_FrequencyPlaying; - } - gRequestSaveFM = true; - -Bail: - BK1080_SetFrequency(gEeprom.FM_FrequencyPlaying); - gRequestDisplayScreen = DISPLAY_FM; -} - -void FM_ProcessKeys(KEY_Code_t Key, bool bKeyPressed, bool bKeyHeld) -{ - switch (Key) { - case KEY_0: case KEY_1: case KEY_2: case KEY_3: - case KEY_4: case KEY_5: case KEY_6: case KEY_7: - case KEY_8: case KEY_9: - FM_Key_DIGITS(Key, bKeyPressed, bKeyHeld); - break; - case KEY_MENU: - FM_Key_MENU(bKeyPressed, bKeyHeld); - return; - case KEY_UP: - FM_Key_UP_DOWN(bKeyPressed, bKeyHeld, 1); - break; - case KEY_DOWN: - FM_Key_UP_DOWN(bKeyPressed, bKeyHeld, -1); - break;; - case KEY_EXIT: - FM_Key_EXIT(bKeyPressed, bKeyHeld); - break; - case KEY_F: - GENERIC_Key_F(bKeyPressed, bKeyHeld); - break; - case KEY_PTT: - GENERIC_Key_PTT(bKeyPressed); - break; - default: - if (!bKeyHeld && bKeyPressed) { - gBeepToPlay = BEEP_500HZ_60MS_DOUBLE_BEEP_OPTIONAL; - } - break; - } -} - -void FM_Play(void) -{ - if (!FM_CheckFrequencyLock(gEeprom.FM_FrequencyPlaying, gEeprom.FM_LowerLimit)) { - if (!gFM_AutoScan) { - gFmPlayCountdown = 0; - gFM_FoundFrequency = true; - if (!gEeprom.FM_IsMrMode) { - gEeprom.FM_SelectedFrequency = gEeprom.FM_FrequencyPlaying; - } - GPIO_SetBit(&GPIOC->DATA, GPIOC_PIN_AUDIO_PATH); - gEnableSpeaker = true; - GUI_SelectNextDisplay(DISPLAY_FM); - return; - } - if (gFM_ChannelPosition < 20) { - gFM_Channels[gFM_ChannelPosition++] = gEeprom.FM_FrequencyPlaying; - } - if (gFM_ChannelPosition >= 20) { - FM_PlayAndUpdate(); - GUI_SelectNextDisplay(DISPLAY_FM); - return; - } - } - - if (gFM_AutoScan && gEeprom.FM_FrequencyPlaying >= gEeprom.FM_UpperLimit) { - FM_PlayAndUpdate(); - } else { - FM_Tune(gEeprom.FM_FrequencyPlaying, gFM_ScanState, false); - } - - GUI_SelectNextDisplay(DISPLAY_FM); -} - -void FM_Start(void) -{ - gFmRadioMode = true; - gFM_ScanState = FM_SCAN_OFF; - gFM_RestoreCountdown = 0; - BK1080_Init(gEeprom.FM_FrequencyPlaying, true); - GPIO_SetBit(&GPIOC->DATA, GPIOC_PIN_AUDIO_PATH); - gEnableSpeaker = true; - gUpdateStatus = true; -} - diff --git a/app/fm.h b/app/fm.h deleted file mode 100644 index 1c0b9e8..0000000 --- a/app/fm.h +++ /dev/null @@ -1,59 +0,0 @@ -/* Copyright 2023 Dual Tachyon - * https://github.com/DualTachyon - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -#ifndef APP_FM_H -#define APP_FM_H - -#include "driver/keyboard.h" - -#define FM_CHANNEL_UP 0x01 -#define FM_CHANNEL_DOWN 0xFF - -enum { - FM_SCAN_OFF = 0U, -}; - -extern uint16_t gFM_Channels[20]; -extern bool gFmRadioMode; -extern uint8_t gFmRadioCountdown; -extern volatile uint16_t gFmPlayCountdown; -extern volatile int8_t gFM_ScanState; -extern bool gFM_AutoScan; -extern uint8_t gFM_ChannelPosition; -// Doubts about whether this should be signed or not. -extern uint16_t gFM_FrequencyDeviation; -extern bool gFM_FoundFrequency; -extern bool gFM_AutoScan; -extern uint8_t gFM_ResumeCountdown; -extern uint16_t gFM_RestoreCountdown; - -bool FM_CheckValidChannel(uint8_t Channel); -uint8_t FM_FindNextChannel(uint8_t Channel, uint8_t Direction); -int FM_ConfigureChannelState(void); -void FM_TurnOff(void); -void FM_EraseChannels(void); - -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_Play(void); -void FM_Start(void); - -#endif - diff --git a/app/generic.c b/app/generic.c index e32b8ec..b9141f9 100644 --- a/app/generic.c +++ b/app/generic.c @@ -15,7 +15,6 @@ */ #include "app/app.h" -#include "app/fm.h" #include "app/generic.h" #include "app/scanner.h" #include "audio.h" @@ -52,7 +51,7 @@ void GENERIC_Key_F(bool bKeyPressed, bool bKeyHeld) gEeprom.KEY_LOCK = !gEeprom.KEY_LOCK; gRequestSaveSettings = true; } else { - if ((gFmRadioMode || gScreenToDisplay != DISPLAY_MAIN) && gScreenToDisplay != DISPLAY_FM) { + if (gScreenToDisplay != DISPLAY_MAIN) { return; } gWasFKeyPressed = !gWasFKeyPressed; @@ -62,14 +61,6 @@ void GENERIC_Key_F(bool bKeyPressed, bool bKeyHeld) gUpdateStatus = true; } } else { - if (gScreenToDisplay != DISPLAY_FM) { - gBeepToPlay = BEEP_1KHZ_60MS_OPTIONAL; - return; - } - if (gFM_ScanState == FM_SCAN_OFF) { - gBeepToPlay = BEEP_1KHZ_60MS_OPTIONAL; - return; - } gBeepToPlay = BEEP_440HZ_500MS; gPttWasReleased = true; } @@ -110,9 +101,9 @@ void GENERIC_Key_PTT(bool bKeyPressed) return; } - if (gFM_ScanState == FM_SCAN_OFF) { + if (gCssScanMode == CSS_SCAN_MODE_OFF) { - if (gScreenToDisplay == DISPLAY_MENU || gScreenToDisplay == DISPLAY_FM) { + if (gScreenToDisplay == DISPLAY_MENU) { gRequestDisplayScreen = DISPLAY_MAIN; gInputBoxIndex = 0; gPttIsPressed = false; @@ -161,10 +152,6 @@ void GENERIC_Key_PTT(bool bKeyPressed) RADIO_StopCssScan(); gRequestDisplayScreen = DISPLAY_MENU; } - } else { - FM_PlayAndUpdate(); - gRequestDisplayScreen = DISPLAY_FM; - } gAnotherVoiceID = VOICE_ID_SCANNING_STOP; gPttWasPressed = true; } diff --git a/app/main.c b/app/main.c index ccb3379..c80efcc 100644 --- a/app/main.c +++ b/app/main.c @@ -20,7 +20,6 @@ #include "app/action.h" #include "app/app.h" -#include "app/fm.h" #include "app/generic.h" #include "app/scanner.h" #include "audio.h" @@ -236,24 +235,22 @@ static void MAIN_Key_DIGITS(KEY_Code_t Key, bool bKeyPressed, bool bKeyHeld) { static void MAIN_Key_EXIT(bool bKeyPressed, bool bKeyHeld) { if (!bKeyHeld && bKeyPressed) { gBeepToPlay = BEEP_1KHZ_60MS_OPTIONAL; - if (!gFmRadioMode) { - if (gScanState == SCAN_OFF) { - if (gInputBoxIndex == 0) { - return; - } - gInputBoxIndex--; - gInputBox[gInputBoxIndex] = 10; - if (gInputBoxIndex == 0) { - gAnotherVoiceID = VOICE_ID_CANCEL; - } + if (gScanState == SCAN_OFF) { + if (gInputBoxIndex == 0) { + return; + } + gInputBoxIndex--; + gInputBox[gInputBoxIndex] = 10; + if (gInputBoxIndex == 0) { + gAnotherVoiceID = VOICE_ID_CANCEL; + } } else { SCANNER_Stop(); gAnotherVoiceID = VOICE_ID_SCANNING_STOP; } - gRequestDisplayScreen = DISPLAY_MAIN; - return; - } - ACTION_FM(); + gRequestDisplayScreen = DISPLAY_MAIN; + return; + } } @@ -373,12 +370,7 @@ static void MAIN_Key_UP_DOWN(bool bKeyPressed, bool bKeyHeld, } void MAIN_ProcessKeys(KEY_Code_t Key, bool bKeyPressed, bool bKeyHeld) { - if (gFmRadioMode && Key != KEY_PTT && Key != KEY_EXIT) { - if (!bKeyHeld && bKeyPressed) { - gBeepToPlay = BEEP_500HZ_60MS_DOUBLE_BEEP_OPTIONAL; - } - return; - } + if (gDTMF_InputMode && !bKeyHeld && bKeyPressed) { char Character = DTMF_GetCharacter(Key); if (Character != 0xFF) { diff --git a/app/uart.c b/app/uart.c index 705ca02..4d1ccc9 100644 --- a/app/uart.c +++ b/app/uart.c @@ -15,7 +15,6 @@ */ #include -#include "app/fm.h" #include "app/uart.h" #include "board.h" #include "bsp/dp32g030/dma.h" @@ -214,7 +213,6 @@ static void CMD_0514(const uint8_t *pBuffer) const CMD_0514_t *pCmd = (const CMD_0514_t *)pBuffer; Timestamp = pCmd->Timestamp; - gFmRadioCountdown = 4; GPIO_ClearBit(&GPIOB->DATA, GPIOB_PIN_BACKLIGHT); SendVersion(); } @@ -228,8 +226,6 @@ static void CMD_051B(const uint8_t *pBuffer) if (pCmd->Timestamp != Timestamp) { return; } - - gFmRadioCountdown = 4; memset(&Reply, 0, sizeof(Reply)); Reply.Header.ID = 0x051C; Reply.Header.Size = pCmd->Size + 4; @@ -259,8 +255,6 @@ static void CMD_051D(const uint8_t *pBuffer) } bReloadEeprom = false; - - gFmRadioCountdown = 4; Reply.Header.ID = 0x051E; Reply.Header.Size = sizeof(Reply.Data); Reply.Data.Offset = pCmd->Offset; @@ -324,8 +318,6 @@ static void CMD_052D(const uint8_t *pBuffer) const CMD_052D_t *pCmd = (const CMD_052D_t *)pBuffer; REPLY_052D_t Reply; bool bIsLocked; - - gFmRadioCountdown = 4; Reply.Header.ID = 0x052E; Reply.Header.Size = sizeof(Reply.Data); diff --git a/audio.c b/audio.c index c0c7404..0f0336e 100644 --- a/audio.c +++ b/audio.c @@ -14,10 +14,8 @@ * limitations under the License. */ -#include "app/fm.h" #include "audio.h" #include "bsp/dp32g030/gpio.h" -#include "driver/bk1080.h" #include "driver/bk4819.h" #include "driver/gpio.h" #include "driver/system.h" @@ -83,10 +81,6 @@ void AUDIO_PlayBeep(BEEP_Type_t Beep) if (gCurrentFunction == FUNCTION_POWER_SAVE && gRxIdleMode) { BK4819_RX_TurnOn(); } - - if (gFmRadioMode) { - BK1080_Mute(true); - } SYSTEM_DelayMs(20); switch (Beep) { case BEEP_1KHZ_60MS_OPTIONAL: @@ -138,9 +132,6 @@ void AUDIO_PlayBeep(BEEP_Type_t Beep) if (gEnableSpeaker) { GPIO_SetBit(&GPIOC->DATA, GPIOC_PIN_AUDIO_PATH); } - if (gFmRadioMode) { - BK1080_Mute(false); - } if (gCurrentFunction == FUNCTION_POWER_SAVE && gRxIdleMode) { BK4819_Sleep(); } @@ -193,9 +184,6 @@ void AUDIO_PlaySingleVoice(bool bFlag) if (gCurrentFunction == FUNCTION_RECEIVE || gCurrentFunction == FUNCTION_MONITOR) { BK4819_SetAF(BK4819_AF_MUTE); } - if (gFmRadioMode) { - BK1080_Mute(true); - } GPIO_SetBit(&GPIOC->DATA, GPIOC_PIN_AUDIO_PATH); gVoxResumeCountdown = 2000; SYSTEM_DelayMs(5); @@ -212,9 +200,6 @@ void AUDIO_PlaySingleVoice(bool bFlag) BK4819_SetAF(BK4819_AF_OPEN); } } - if (gFmRadioMode) { - BK1080_Mute(false); - } if (!gEnableSpeaker) { GPIO_ClearBit(&GPIOC->DATA, GPIOC_PIN_AUDIO_PATH); } @@ -327,9 +312,6 @@ void AUDIO_PlayQueuedVoice(void) BK4819_SetAF(BK4819_AF_OPEN); } } - if (gFmRadioMode) { - BK1080_Mute(false); - } if (!gEnableSpeaker) { GPIO_ClearBit(&GPIOC->DATA, GPIOC_PIN_AUDIO_PATH); } diff --git a/board.c b/board.c index 622c191..935094a 100644 --- a/board.c +++ b/board.c @@ -17,14 +17,12 @@ #include #include "app/dtmf.h" -#include "app/fm.h" #include "board.h" #include "bsp/dp32g030/gpio.h" #include "bsp/dp32g030/portcon.h" #include "bsp/dp32g030/saradc.h" #include "bsp/dp32g030/syscon.h" #include "driver/adc.h" -#include "driver/bk1080.h" #include "driver/bk4819.h" #include "driver/crc.h" #include "driver/eeprom.h" @@ -335,7 +333,6 @@ void BOARD_Init(void) BOARD_GPIO_Init(); BOARD_ADC_Init(); ST7565_Init(); - BK1080_Init(0, false); CRC_Init(); } @@ -395,9 +392,9 @@ void BOARD_EEPROM_Init(void) gEeprom.FM_SelectedChannel = FM.SelectedChannel; gEeprom.FM_IsMrMode = (FM.IsMrMode < 2) ? FM.IsMrMode : false; - // 0E40..0E67 - EEPROM_ReadBuffer(0x0E40, gFM_Channels, sizeof(gFM_Channels)); - FM_ConfigureChannelState(); + // 0E40..0E67 - здесь были каналы FM + //EEPROM_ReadBuffer(0x0E40, gFM_Channels, sizeof(gFM_Channels)); + // 0E90..0E97 EEPROM_ReadBuffer(0x0E90, Data, 8); diff --git a/driver/bk1080-regs.h b/driver/bk1080-regs.h deleted file mode 100644 index 49dfdfc..0000000 --- a/driver/bk1080-regs.h +++ /dev/null @@ -1,57 +0,0 @@ -/* Copyright 2023 Dual Tachyon - * https://github.com/DualTachyon - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -#ifndef BK1080_REGS_H -#define BK1080_REGS_H - -enum BK1080_Register_t { - BK1080_REG_00 = 0x00U, - BK1080_REG_02_POWER_CONFIGURATION = 0x02U, - BK1080_REG_03_CHANNEL = 0x03U, - BK1080_REG_05_SYSTEM_CONFIGURATION2 = 0x05U, - BK1080_REG_07 = 0x07U, - BK1080_REG_10 = 0x0AU, - BK1080_REG_25_INTERNAL = 0x19U, -}; - -typedef enum BK1080_Register_t BK1080_Register_t; - -// REG 07 - -#define BK1080_REG_07_SHIFT_FREQD 4 -#define BK1080_REG_07_SHIFT_SNR 0 - -#define BK1080_REG_07_MASK_FREQD (0xFFFU << BK1080_REG_07_SHIFT_FREQD) -#define BK1080_REG_07_MASK_SNR (0x00FU << BK1080_REG_07_SHIFT_SNR) - -#define BK1080_REG_07_GET_FREQD(x) (((x) & BK1080_REG_07_MASK_FREQD) >> BK1080_REG_07_SHIFT_FREQD) -#define BK1080_REG_07_GET_SNR(x) (((x) & BK1080_REG_07_MASK_SNR) >> BK1080_REG_07_SHIFT_SNR) - -// REG 10 - -#define BK1080_REG_10_SHIFT_AFCRL 12 -#define BK1080_REG_10_SHIFT_RSSI 0 - -#define BK1080_REG_10_MASK_AFCRL (0x01U << BK1080_REG_10_SHIFT_AFCRL) -#define BK1080_REG_10_MASK_RSSI (0xFFU << BK1080_REG_10_SHIFT_RSSI) - -#define BK1080_REG_10_AFCRL_NOT_RAILED (0U << BK1080_REG_10_SHIFT_AFCRL) -#define BK1080_REG_10_AFCRL_RAILED (1U << BK1080_REG_10_SHIFT_AFCRL) - -#define BK1080_REG_10_GET_RSSI(x) (((x) & BK1080_REG_10_MASK_RSSI) >> BK1080_REG_10_SHIFT_RSSI) - -#endif - diff --git a/driver/bk1080.c b/driver/bk1080.c deleted file mode 100644 index 7c9d6bb..0000000 --- a/driver/bk1080.c +++ /dev/null @@ -1,115 +0,0 @@ -/* Copyright 2023 Dual Tachyon - * https://github.com/DualTachyon - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -#include "bsp/dp32g030/gpio.h" -#include "bk1080.h" -#include "driver/gpio.h" -#include "driver/i2c.h" -#include "driver/system.h" -#include "misc.h" - -#define ARRAY_SIZE(a) (sizeof(a) / sizeof(a[0])) - -static const uint16_t BK1080_RegisterTable[] = { - 0x0008, 0x1080, 0x0201, 0x0000, - 0x40C0, 0x0A1F, 0x002E, 0x02FF, - 0x5B11, 0x0000, 0x411E, 0x0000, - 0xCE00, 0x0000, 0x0000, 0x1000, - 0x3197, 0x0000, 0x13FF, 0x9852, - 0x0000, 0x0000, 0x0008, 0x0000, - 0x51E1, 0xA8BC, 0x2645, 0x00E4, - 0x1CD8, 0x3A50, 0xEAE0, 0x3000, - 0x0200, 0x0000, -}; - -static bool gIsInitBK1080; - -uint16_t BK1080_BaseFrequency; -uint16_t BK1080_FrequencyDeviation; - -void BK1080_Init(uint16_t Frequency, bool bDoScan) -{ - uint8_t i; - - if (bDoScan) { - GPIO_ClearBit(&GPIOB->DATA, GPIOB_PIN_BK1080); - - if (!gIsInitBK1080) { - for (i = 0; i < ARRAY_SIZE(BK1080_RegisterTable); i++) { - BK1080_WriteRegister(i, BK1080_RegisterTable[i]); - } - SYSTEM_DelayMs(250); - BK1080_WriteRegister(BK1080_REG_25_INTERNAL, 0xA83C); - BK1080_WriteRegister(BK1080_REG_25_INTERNAL, 0xA8BC); - SYSTEM_DelayMs(60); - gIsInitBK1080 = true; - } else { - BK1080_WriteRegister(BK1080_REG_02_POWER_CONFIGURATION, 0x0201); - } - BK1080_WriteRegister(BK1080_REG_05_SYSTEM_CONFIGURATION2, 0x0A5F); - BK1080_WriteRegister(BK1080_REG_03_CHANNEL, Frequency - 760); - SYSTEM_DelayMs(10); - BK1080_WriteRegister(BK1080_REG_03_CHANNEL, (Frequency - 760) | 0x8000); - } else { - BK1080_WriteRegister(BK1080_REG_02_POWER_CONFIGURATION, 0x0241); - GPIO_SetBit(&GPIOB->DATA, GPIOB_PIN_BK1080); - } -} - -uint16_t BK1080_ReadRegister(BK1080_Register_t Register) -{ - uint8_t Value[2]; - - I2C_Start(); - I2C_Write(0x80); - I2C_Write((Register << 1) | I2C_READ); - I2C_ReadBuffer(Value, sizeof(Value)); - I2C_Stop(); - return (Value[0] << 8) | Value[1]; -} - -void BK1080_WriteRegister(BK1080_Register_t Register, uint16_t Value) -{ - I2C_Start(); - I2C_Write(0x80); - I2C_Write((Register << 1) | I2C_WRITE); - Value = ((Value >> 8) & 0xFF) | ((Value & 0xFF) << 8); - I2C_WriteBuffer(&Value, sizeof(Value)); - I2C_Stop(); -} - -void BK1080_Mute(bool Mute) -{ - if (Mute) { - BK1080_WriteRegister(BK1080_REG_02_POWER_CONFIGURATION, 0x4201); - } else { - BK1080_WriteRegister(BK1080_REG_02_POWER_CONFIGURATION, 0x0201); - } -} - -void BK1080_SetFrequency(uint16_t Frequency) -{ - BK1080_WriteRegister(BK1080_REG_03_CHANNEL, Frequency - 760); - SYSTEM_DelayMs(10); - BK1080_WriteRegister(BK1080_REG_03_CHANNEL, (Frequency - 760) | 0x8000); -} - -void BK1080_GetFrequencyDeviation(uint16_t Frequency) -{ - BK1080_BaseFrequency = Frequency; - BK1080_FrequencyDeviation = BK1080_ReadRegister(BK1080_REG_07) / 16; -} - diff --git a/driver/bk1080.h b/driver/bk1080.h deleted file mode 100644 index ed1f9c1..0000000 --- a/driver/bk1080.h +++ /dev/null @@ -1,35 +0,0 @@ -/* Copyright 2023 Dual Tachyon - * https://github.com/DualTachyon - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -#ifndef DRIVER_BK1080_H -#define DRIVER_BK1080_H - -#include -#include -#include "driver/bk1080-regs.h" - -extern uint16_t BK1080_BaseFrequency; -extern uint16_t BK1080_FrequencyDeviation; - -void BK1080_Init(uint16_t Frequency, bool bDoScan); -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); -void BK1080_GetFrequencyDeviation(uint16_t Frequency); - -#endif - diff --git a/firmware.packed.bin b/firmware.packed.bin index fba0817597ad1df802e4d1d9af10b446895ea703..0ed9d119793b257a87f7f86c250dc75923309401 100644 GIT binary patch delta 49878 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 Bo=X4# delta 53897 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�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 diff --git a/functions.c b/functions.c index a2f3e62..999a820 100644 --- a/functions.c +++ b/functions.c @@ -19,10 +19,8 @@ #include #include "app/dtmf.h" -#include "app/fm.h" #include "bsp/dp32g030/gpio.h" #include "dcs.h" -#include "driver/bk1080.h" #include "driver/bk4819.h" #include "driver/gpio.h" #include "driver/system.h" @@ -65,7 +63,6 @@ void FUNCTION_Init(void) { void FUNCTION_Select(FUNCTION_Type_t Function) { FUNCTION_Type_t PreviousFunction; bool bWasPowerSave; - uint16_t Countdown = 0; PreviousFunction = gCurrentFunction; bWasPowerSave = (PreviousFunction == FUNCTION_POWER_SAVE); @@ -88,9 +85,6 @@ void FUNCTION_Select(FUNCTION_Type_t Function) { gVFO_RSSI_Level[0] = 0; gVFO_RSSI_Level[1] = 0; } else if (PreviousFunction == FUNCTION_RECEIVE) { - if (gFmRadioMode) { - Countdown = 500; - } if (gDTMF_CallState == DTMF_CALL_STATE_CALL_OUT || gDTMF_CallState == DTMF_CALL_STATE_RECEIVED) { gDTMF_AUTO_RESET_TIME = @@ -116,10 +110,6 @@ void FUNCTION_Select(FUNCTION_Type_t Function) { return; case FUNCTION_TRANSMIT: - if (gFmRadioMode) { - BK1080_Init(0, false); - } - if (gAlarmState == ALARM_STATE_TXALARM && gEeprom.ALARM_MODE != ALARM_MODE_TONE) { gAlarmState = ALARM_STATE_ALARM; @@ -163,5 +153,4 @@ void FUNCTION_Select(FUNCTION_Type_t Function) { } gBatterySaveCountdown = 1000; gSchedulePowerSave = false; - gFM_RestoreCountdown = Countdown; } diff --git a/misc.h b/misc.h index 5abe4b1..b11952e 100644 --- a/misc.h +++ b/misc.h @@ -184,7 +184,7 @@ extern volatile bool gSchedulePowerSave; extern volatile bool gBatterySaveCountdownExpired; extern volatile bool gScheduleDualWatch; extern volatile bool gSystickFlag10; -extern volatile bool gScheduleFM; + extern uint16_t gCurrentRSSI; diff --git a/radio.c b/radio.c index 6ff5662..a4ede9b 100644 --- a/radio.c +++ b/radio.c @@ -19,7 +19,6 @@ #include #include "app/dtmf.h" -#include "app/fm.h" #include "audio.h" #include "bsp/dp32g030/gpio.h" #include "dcs.h" @@ -553,7 +552,7 @@ void RADIO_SetupRegisters(bool bSwitchToFunction0) { } } - if (gEeprom.VOX_SWITCH && !gFmRadioMode && !gCurrentVfo->IsAM) { + if (gEeprom.VOX_SWITCH && !gCurrentVfo->IsAM) { BK4819_EnableVox(gEeprom.VOX1_THRESHOLD, gEeprom.VOX0_THRESHOLD); InterruptMask |= 0 | BK4819_REG_3F_VOX_FOUND | BK4819_REG_3F_VOX_LOST; } else { @@ -619,7 +618,6 @@ void RADIO_SetVfoState(VfoState_t State) { if (State == VFO_STATE_NORMAL) { VfoState[0] = VFO_STATE_NORMAL; VfoState[1] = VFO_STATE_NORMAL; - gFM_ResumeCountdown = 0; } else { if (State == VFO_STATE_VOL_HIGH) { VfoState[0] = VFO_STATE_VOL_HIGH; @@ -634,7 +632,6 @@ void RADIO_SetVfoState(VfoState_t State) { } VfoState[Channel] = State; } - gFM_ResumeCountdown = 5; } gUpdateDisplay = true; } @@ -748,4 +745,4 @@ void RADIO_SendEndOfTransmission(void) { gEnableSpeaker = false; } BK4819_ExitDTMF_TX(true); -} +} \ No newline at end of file diff --git a/scheduler.c b/scheduler.c index cbe8ab7..01d90ba 100644 --- a/scheduler.c +++ b/scheduler.c @@ -14,7 +14,6 @@ * limitations under the License. */ -#include "app/fm.h" #include "app/scanner.h" #include "audio.h" #include "functions.h" @@ -80,10 +79,7 @@ void SystickHandler(void) DECREMENT_AND_TRIGGER(gCountdownToPlayNextVoice, gFlagPlayQueuedVoice); - if (gFM_ScanState != FM_SCAN_OFF && gCurrentFunction != FUNCTION_MONITOR) { - if (gCurrentFunction != FUNCTION_TRANSMIT && gCurrentFunction != FUNCTION_RECEIVE) { - DECREMENT_AND_TRIGGER(gFmPlayCountdown, gScheduleFM); - } + if (gCurrentFunction != FUNCTION_MONITOR) { } if (gVoxStopCountdown) { gVoxStopCountdown--; diff --git a/settings.c b/settings.c index d8d5279..14e89d3 100644 --- a/settings.c +++ b/settings.c @@ -18,34 +18,12 @@ #include -#include "app/fm.h" #include "driver/eeprom.h" #include "driver/uart.h" #include "misc.h" EEPROM_Config_t gEeprom; -void SETTINGS_SaveFM(void) { - uint8_t i; - struct { - uint16_t Frequency; - uint8_t Channel; - bool IsChannelSelected; - uint8_t Padding[4]; - } State; - - UART_LogSend("sFm\r\n", 5); - - 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++) { - EEPROM_WriteBuffer(0x0E40 + (i * 8), &gFM_Channels[i * 4]); - } -} void SETTINGS_SaveVfoIndices(void) { uint8_t State[8]; diff --git a/ui/fmradio.c b/ui/fmradio.c deleted file mode 100644 index 851a010..0000000 --- a/ui/fmradio.c +++ /dev/null @@ -1,90 +0,0 @@ -/* Copyright 2023 Dual Tachyon - * https://github.com/DualTachyon - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -#include -#include "app/fm.h" -#include "driver/st7565.h" -#include "external/printf/printf.h" -#include "misc.h" -#include "settings.h" -#include "ui/fmradio.h" -#include "ui/helper.h" -#include "ui/inputbox.h" -#include "ui/ui.h" - -void UI_DisplayFM(void) -{ - uint8_t i; - char String[16]; - - memset(gFrameBuffer, 0, sizeof(gFrameBuffer)); - - memset(String, 0, sizeof(String)); - strcpy(String, "FM"); - - UI_PrintString(String, 0, 127, 0, 12, true); - memset(String, 0, sizeof(String)); - - if (gAskToSave) { - strcpy(String, "SAVE?"); - } else if (gAskToDelete) { - strcpy(String, "DEL?"); - } else { - if (gFM_ScanState == FM_SCAN_OFF) { - if (!gEeprom.FM_IsMrMode) { - for (i = 0; i < 20; i++) { - if (gEeprom.FM_FrequencyPlaying == gFM_Channels[i]) { - sprintf(String, "VFO(CH%02d)", i + 1); - break; - } - } - if (i == 20) { - strcpy(String, "VFO"); - } - } else { - sprintf(String, "MR(CH%02d)", gEeprom.FM_SelectedChannel + 1); - } - } else { - if (!gFM_AutoScan) { - strcpy(String, "M-SCAN"); - } else { - sprintf(String, "A-SCAN(%d)", gFM_ChannelPosition + 1); - } - } - } - - UI_PrintString(String, 0, 127, 2, 10, true); - memset(String, 0, sizeof(String)); - - if (gAskToSave || (gEeprom.FM_IsMrMode && gInputBoxIndex)) { - UI_GenerateChannelString(String, gFM_ChannelPosition); - } else if (!gAskToDelete) { - if (gInputBoxIndex == 0) { - NUMBER_ToDigits(gEeprom.FM_FrequencyPlaying * 10000, String); - UI_DisplayFrequency(String, 23, 4, false, true); - } else { - UI_DisplayFrequency(gInputBox, 23, 4, true, false); - } - ST7565_BlitFullScreen(); - return; - } else { - sprintf(String, "CH-%02d", gEeprom.FM_SelectedChannel + 1); - } - - UI_PrintString(String, 0, 127, 4, 10, true); - ST7565_BlitFullScreen(); -} - diff --git a/ui/fmradio.h b/ui/fmradio.h deleted file mode 100644 index 8309e9e..0000000 --- a/ui/fmradio.h +++ /dev/null @@ -1,23 +0,0 @@ -/* Copyright 2023 Dual Tachyon - * https://github.com/DualTachyon - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -#ifndef UI_FM_H -#define UI_FM_H - -void UI_DisplayFM(void); - -#endif - diff --git a/ui/main.c b/ui/main.c index b33ed91..0c36855 100644 --- a/ui/main.c +++ b/ui/main.c @@ -31,7 +31,7 @@ void UI_DisplayMain(void) { char String[16]; uint8_t i; - + memset(gFrameBuffer, 0, sizeof(gFrameBuffer)); if (gEeprom.KEY_LOCK && gKeypadLocked) { UI_PrintString("Long Press #", 0, 127, 1, 8, true); diff --git a/ui/status.c b/ui/status.c index 5555025..0ddd533 100644 --- a/ui/status.c +++ b/ui/status.c @@ -15,7 +15,6 @@ */ #include -#include "app/fm.h" #include "bitmaps.h" #include "driver/keyboard.h" #include "driver/st7565.h" @@ -67,9 +66,7 @@ void UI_DisplayStatus(void) if (gEeprom.VOICE_PROMPT != VOICE_PROMPT_OFF) { memcpy(gStatusLine + 34, BITMAP_VoicePrompt, sizeof(BITMAP_VoicePrompt)); } - if (gFmRadioMode) { - memcpy(gStatusLine + 21, BITMAP_FM, sizeof(BITMAP_FM)); - } + ST7565_BlitStatusLine(); } diff --git a/ui/ui.c b/ui/ui.c index 09c22f2..8e55af3 100644 --- a/ui/ui.c +++ b/ui/ui.c @@ -16,11 +16,9 @@ #include #include "app/dtmf.h" -#include "app/fm.h" #include "app/scanner.h" #include "driver/keyboard.h" #include "misc.h" -#include "ui/fmradio.h" #include "ui/inputbox.h" #include "ui/main.h" #include "ui/menu.h" @@ -40,9 +38,6 @@ void GUI_DisplayScreen(void) case DISPLAY_MAIN: UI_DisplayMain(); break; - case DISPLAY_FM: - UI_DisplayFM(); - break; case DISPLAY_MENU: UI_DisplayMenu(); break; @@ -62,7 +57,6 @@ void GUI_SelectNextDisplay(GUI_DisplayType_t Display) gIsInSubMenu = false; gCssScanMode = CSS_SCAN_MODE_OFF; gScanState = SCAN_OFF; - gFM_ScanState = FM_SCAN_OFF; gAskForConfirmation = 0; gDTMF_InputMode = false; gDTMF_InputIndex = 0; diff --git a/ui/ui.h b/ui/ui.h index 236d3be..744713d 100644 --- a/ui/ui.h +++ b/ui/ui.h @@ -22,9 +22,8 @@ enum GUI_DisplayType_t { DISPLAY_MAIN = 0x00U, - DISPLAY_FM = 0x01U, - DISPLAY_MENU = 0x02U, - DISPLAY_SCANNER = 0x03U, + DISPLAY_MENU = 0x01U, + DISPLAY_SCANNER = 0x02U, DISPLAY_INVALID = 0xFFU, };