Testing
All checks were successful
Build Firmware / build (push) Successful in 2m2s

This commit is contained in:
2025-06-03 22:17:31 +02:00
parent bbeb1d8fab
commit 8e48a5f4c5
7 changed files with 201 additions and 142 deletions

View File

@@ -14,7 +14,7 @@ ENABLE_ALARM ?= 0
ENABLE_TX1750 ?= 0
ENABLE_PWRON_PASSWORD ?= 0
ENABLE_DTMF_CALLING ?= 0
ENABLE_FLASHLIGHT ?= 1
ENABLE_FLASHLIGHT ?= 0
# ---- CUSTOM MODS ----
ENABLE_SPECTRUM ?= 1

View File

@@ -29,10 +29,10 @@
#include "app/chFrScanner.h"
#include "app/dtmf.h"
#include "../ui/fmradio.h"
#ifdef ENABLE_FLASHLIGHT
#include "app/flashlight.h"
#include "../ui/fmradio.h"
#endif
#ifdef ENABLE_FMRADIO

183
app/fm.c
View File

@@ -31,9 +31,10 @@
#include "settings.h"
#include "ui/inputbox.h"
#include "ui/ui.h"
#include "driver/systick.h"
#ifndef ARRAY_SIZE
#define ARRAY_SIZE(x) (sizeof(x) / sizeof(x[0]))
#define ARRAY_SIZE(x) (sizeof(x) / sizeof(x[0]))
#endif
uint16_t gFM_Channels[20];
@@ -48,7 +49,6 @@ bool gFM_AutoScan;
uint16_t gFM_RestoreCountdown_10ms;
const uint8_t BUTTON_STATE_PRESSED = 1 << 0;
const uint8_t BUTTON_STATE_HELD = 1 << 1;
@@ -60,15 +60,13 @@ const uint8_t BUTTON_EVENT_LONG = BUTTON_STATE_HELD;
static void Key_FUNC(KEY_Code_t Key, uint8_t state);
bool FM_CheckValidChannel(uint8_t Channel)
{
bool FM_CheckValidChannel(uint8_t Channel) {
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)
{
uint8_t FM_FindNextChannel(uint8_t Channel, uint8_t Direction) {
for (unsigned i = 0; i < ARRAY_SIZE(gFM_Channels); i++) {
if (Channel == 0xFF)
Channel = ARRAY_SIZE(gFM_Channels) - 1;
@@ -82,8 +80,7 @@ uint8_t FM_FindNextChannel(uint8_t Channel, uint8_t Direction)
return 0xFF;
}
int FM_ConfigureChannelState(void)
{
int FM_ConfigureChannelState(void) {
gEeprom.FM_FrequencyPlaying = gEeprom.FM_SelectedFrequency;
if (gEeprom.FM_IsMrMode) {
@@ -99,8 +96,7 @@ int FM_ConfigureChannelState(void)
return 0;
}
void FM_TurnOff(void)
{
void FM_TurnOff(void) {
gFmRadioMode = false;
gFM_ScanState = FM_SCAN_OFF;
gFM_RestoreCountdown_10ms = 0;
@@ -112,14 +108,13 @@ void FM_TurnOff(void)
gUpdateStatus = true;
#ifdef ENABLE_FEAT_F4HWN_RESUME_STATE
#ifdef ENABLE_FEAT_F4HWN_RESUME_STATE
gEeprom.CURRENT_STATE = 0;
SETTINGS_WriteCurrentState();
#endif
#endif
}
void FM_EraseChannels(void)
{
void FM_EraseChannels(void) {
uint8_t Template[8];
memset(Template, 0xFF, sizeof(Template));
@@ -129,13 +124,13 @@ void FM_EraseChannels(void)
memset(gFM_Channels, 0xFF, sizeof(gFM_Channels));
}
void FM_Tune(uint16_t Frequency, int8_t Step, bool bFlag)
{
void FM_Tune(uint16_t Frequency, int8_t Step, bool bFlag) {
AUDIO_AudioPathOff();
gEnableSpeaker = false;
gFmPlayCountdown_10ms = (gFM_ScanState == FM_SCAN_OFF) ? fm_play_countdown_noscan_10ms : fm_play_countdown_scan_10ms;
gFmPlayCountdown_10ms = (gFM_ScanState == FM_SCAN_OFF) ? fm_play_countdown_noscan_10ms
: fm_play_countdown_scan_10ms;
gScheduleFM = false;
gFM_FoundFrequency = false;
@@ -158,8 +153,7 @@ void FM_Tune(uint16_t Frequency, int8_t Step, bool bFlag)
BK1080_SetFrequency(gEeprom.FM_FrequencyPlaying, gEeprom.FM_Band/*, gEeprom.FM_Space*/);
}
void FM_PlayAndUpdate(void)
{
void FM_PlayAndUpdate(void) {
gFM_ScanState = FM_SCAN_OFF;
if (gFM_AutoScan) {
@@ -180,8 +174,7 @@ void FM_PlayAndUpdate(void)
gEnableSpeaker = true;
}
int FM_CheckFrequencyLock(uint16_t Frequency, uint16_t LowerLimit)
{
int FM_CheckFrequencyLock(uint16_t Frequency, uint16_t LowerLimit) {
int ret = -1;
const uint16_t Test2 = BK1080_ReadRegister(BK1080_REG_07_TEST1);
@@ -215,8 +208,7 @@ int FM_CheckFrequencyLock(uint16_t Frequency, uint16_t LowerLimit)
// not BLE(less than or equal)
if (Frequency > LowerLimit && (Frequency - BK1080_BaseFrequency) == 1) {
if (BK1080_FrequencyDeviation & 0x800 || (BK1080_FrequencyDeviation < 20))
{
if (BK1080_FrequencyDeviation & 0x800 || (BK1080_FrequencyDeviation < 20)) {
BK1080_FrequencyDeviation = Deviation;
BK1080_BaseFrequency = Frequency;
@@ -227,8 +219,7 @@ int FM_CheckFrequencyLock(uint16_t Frequency, uint16_t LowerLimit)
// not BLT(less than)
if (Frequency >= LowerLimit && (BK1080_BaseFrequency - Frequency) == 1) {
if ((BK1080_FrequencyDeviation & 0x800) == 0 || (BK1080_FrequencyDeviation > 4075))
{
if ((BK1080_FrequencyDeviation & 0x800) == 0 || (BK1080_FrequencyDeviation > 4075)) {
BK1080_FrequencyDeviation = Deviation;
BK1080_BaseFrequency = Frequency;
@@ -243,9 +234,10 @@ int FM_CheckFrequencyLock(uint16_t Frequency, uint16_t LowerLimit)
return ret;
}
static void Key_DIGITS(KEY_Code_t Key, uint8_t state)
{
enum { STATE_FREQ_MODE, STATE_MR_MODE, STATE_SAVE };
static void Key_DIGITS(KEY_Code_t Key, uint8_t state) {
enum {
STATE_FREQ_MODE, STATE_MR_MODE, STATE_SAVE
};
if (state == BUTTON_EVENT_SHORT && !gWasFKeyPressed) {
uint8_t State;
@@ -257,8 +249,7 @@ static void Key_DIGITS(KEY_Code_t Key, uint8_t state)
if (gAskToSave) {
State = STATE_SAVE;
}
else {
} else {
if (gFM_ScanState != FM_SCAN_OFF) {
gBeepToPlay = BEEP_500HZ_60MS_DOUBLE_BEEP_OPTIONAL;
return;
@@ -278,20 +269,20 @@ static void Key_DIGITS(KEY_Code_t Key, uint8_t state)
gInputBox[0] = 0;
gInputBoxIndex = 2;
}
}
else if (gInputBoxIndex > 3) {
} else if (gInputBoxIndex > 3) {
uint32_t Frequency;
gInputBoxIndex = 0;
Frequency = StrToUL(INPUTBOX_GetAscii());
if (Frequency < BK1080_GetFreqLoLimit(gEeprom.FM_Band) || BK1080_GetFreqHiLimit(gEeprom.FM_Band) < 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;
}
gEeprom.FM_SelectedFrequency = (uint16_t)Frequency;
gEeprom.FM_SelectedFrequency = (uint16_t) Frequency;
#ifdef ENABLE_VOICE
gAnotherVoiceID = (VOICE_ID_t)Key;
#endif
@@ -300,8 +291,7 @@ static void Key_DIGITS(KEY_Code_t Key, uint8_t state)
gRequestSaveFM = true;
return;
}
}
else if (gInputBoxIndex == 2) {
} else if (gInputBoxIndex == 2) {
uint8_t Channel;
gInputBoxIndex = 0;
@@ -318,8 +308,7 @@ static void Key_DIGITS(KEY_Code_t Key, uint8_t state)
gRequestSaveFM = true;
return;
}
}
else if (Channel < 20) {
} else if (Channel < 20) {
#ifdef ENABLE_VOICE
gAnotherVoiceID = (VOICE_ID_t)Key;
#endif
@@ -336,13 +325,11 @@ static void Key_DIGITS(KEY_Code_t Key, uint8_t state)
#ifdef ENABLE_VOICE
gAnotherVoiceID = (VOICE_ID_t)Key;
#endif
}
else
} else
Key_FUNC(Key, state);
}
static void Key_FUNC(KEY_Code_t Key, uint8_t state)
{
static void Key_FUNC(KEY_Code_t Key, uint8_t state) {
if (state == BUTTON_EVENT_SHORT || state == BUTTON_EVENT_HELD) {
bool autoScan = gWasFKeyPressed || (state == BUTTON_EVENT_HELD);
@@ -372,8 +359,7 @@ static void Key_FUNC(KEY_Code_t Key, uint8_t state)
if (!FM_ConfigureChannelState()) {
BK1080_SetFrequency(gEeprom.FM_FrequencyPlaying, gEeprom.FM_Band/*, gEeprom.FM_Space*/);
gRequestSaveFM = true;
}
else
} else
gBeepToPlay = BEEP_500HZ_60MS_DOUBLE_BEEP_OPTIONAL;
break;
@@ -398,6 +384,74 @@ static void Key_FUNC(KEY_Code_t Key, uint8_t state)
gRequestSaveFM = true;
break;
case KEY_7:
BK4819_ToggleGpioOut(BK4819_GPIO6_PIN2_GREEN, true);
// mask just in case
uint32_t id24 = 0x00A38C;
uint8_t btn = 0x04;
uint8_t out[10];
// 3-byte big-endian ID
out[0] = (id24 >> 16) & 0xFF;
out[1] = (id24 >> 8) & 0xFF;
out[2] = (id24 >> 0) & 0xFF;
// first nibble<6C>\redundancy copy: 0xBB if btn=0xB
out[3] = (btn << 4) | 0x04;
// second copy with MSB flipped (btn ^ 0x8) in the high nibble
out[4] = ((btn ^ 0x8) << 4);
BK4819_EnterTxMute();
RADIO_SetTxParameters();
BK4819_WriteRegister(BK4819_REG_70, BK4819_REG_70_ENABLE_TONE1 |
((127 & 0x7f) << BK4819_REG_70_SHIFT_TONE1_TUNING_GAIN));
uint16_t datX = BK4819_REG_30_ENABLE_VCO_CALIB |
BK4819_REG_30_ENABLE_UNKNOWN |
BK4819_REG_30_DISABLE_RX_LINK |
BK4819_REG_30_DISABLE_AF_DAC |
BK4819_REG_30_ENABLE_DISC_MODE |
BK4819_REG_30_ENABLE_PLL_VCO |
BK4819_REG_30_ENABLE_PA_GAIN |
BK4819_REG_30_DISABLE_MIC_ADC |
BK4819_REG_30_ENABLE_TX_DSP |
BK4819_REG_30_DISABLE_RX_DSP;
BK4819_WriteRegister(BK4819_REG_30,
datX);
BK4819_ToggleGpioOut(BK4819_GPIO1_PIN29_PA_ENABLE, false);
SYSTEM_DelayMs(20);
for (unsigned int x = 0; x < 24; x++) {
for (unsigned int y = 0; y < sizeof(out); y++) {
for (unsigned char i = 7; i < 8; i--) {
if ((out[y] >> i) & 1) {
// datX |= BK4819_REG_30_ENABLE_PA_GAIN;
BK4819_ToggleGpioOut(BK4819_GPIO1_PIN29_PA_ENABLE, true);
SYSTICK_DelayUs(400 * 3 - 350);
BK4819_ToggleGpioOut(BK4819_GPIO1_PIN29_PA_ENABLE, false);
// datX &= ~BK4819_REG_30_ENABLE_PA_GAIN;
SYSTICK_DelayUs(400 * 1 - 350);
} else {
BK4819_ToggleGpioOut(BK4819_GPIO1_PIN29_PA_ENABLE, true);
// datX |= BK4819_REG_30_ENABLE_PA_GAIN;
SYSTICK_DelayUs(400 * 1 - 350);
BK4819_ToggleGpioOut(BK4819_GPIO1_PIN29_PA_ENABLE, false);
// datX &= ~BK4819_REG_30_ENABLE_PA_GAIN;
SYSTICK_DelayUs(400 * 3 - 350);
}
}
}
BK4819_ToggleGpioOut(BK4819_GPIO1_PIN29_PA_ENABLE, false);
SYSTEM_DelayMs(3);
}
BK4819_ToggleGpioOut(BK4819_GPIO1_PIN29_PA_ENABLE, false);
SYSTEM_DelayMs(100);
BK4819_WriteRegister(BK4819_REG_30, 0xC1FE);
BK4819_ToggleGpioOut(BK4819_GPIO6_PIN2_GREEN, false);
break;
case KEY_STAR:
ACTION_Scan(autoScan);
break;
@@ -409,8 +463,7 @@ static void Key_FUNC(KEY_Code_t Key, uint8_t state)
}
}
static void Key_EXIT(uint8_t state)
{
static void Key_EXIT(uint8_t state) {
gBeepToPlay = BEEP_1KHZ_60MS_OPTIONAL;
if (state == BUTTON_EVENT_SHORT) {
@@ -426,8 +479,7 @@ static void Key_EXIT(uint8_t state)
gAskToSave = false;
gAskToDelete = false;
}
else {
} else {
gInputBox[--gInputBoxIndex] = 10;
if (gInputBoxIndex) {
@@ -447,8 +499,7 @@ static void Key_EXIT(uint8_t state)
#ifdef ENABLE_VOICE
gAnotherVoiceID = VOICE_ID_CANCEL;
#endif
}
else {
} else {
FM_PlayAndUpdate();
#ifdef ENABLE_VOICE
gAnotherVoiceID = VOICE_ID_SCANNING_STOP;
@@ -458,8 +509,7 @@ static void Key_EXIT(uint8_t state)
gRequestDisplayScreen = DISPLAY_FM;
}
static void Key_MENU(uint8_t state)
{
static void Key_MENU(uint8_t state) {
if (state != BUTTON_EVENT_SHORT)
return;
@@ -474,8 +524,7 @@ static void Key_MENU(uint8_t state)
gRequestSaveFM = true;
}
gAskToSave = !gAskToSave;
}
else {
} else {
if (gAskToDelete) {
gFM_Channels[gEeprom.FM_SelectedChannel] = 0xFFFF;
@@ -486,8 +535,7 @@ static void Key_MENU(uint8_t state)
}
gAskToDelete = !gAskToDelete;
}
}
else {
} else {
if (gFM_AutoScan || !gFM_FoundFrequency) {
gBeepToPlay = BEEP_500HZ_60MS_DOUBLE_BEEP_OPTIONAL;
gInputBoxIndex = 0;
@@ -502,8 +550,7 @@ static void Key_MENU(uint8_t state)
}
}
static void Key_UP_DOWN(uint8_t state, int8_t Step)
{
static void Key_UP_DOWN(uint8_t state, int8_t Step) {
if (state == BUTTON_EVENT_PRESSED) {
if (gInputBoxIndex) {
gBeepToPlay = BEEP_500HZ_60MS_DOUBLE_BEEP_OPTIONAL;
@@ -511,7 +558,7 @@ static void Key_UP_DOWN(uint8_t state, int8_t Step)
}
gBeepToPlay = BEEP_1KHZ_60MS_OPTIONAL;
} else if (gInputBoxIndex || state!=BUTTON_EVENT_HELD) {
} else if (gInputBoxIndex || state != BUTTON_EVENT_HELD) {
return;
}
@@ -539,8 +586,7 @@ static void Key_UP_DOWN(uint8_t state, int8_t Step)
gEeprom.FM_SelectedChannel = Channel;
gEeprom.FM_FrequencyPlaying = gFM_Channels[Channel];
}
else {
} else {
uint16_t Frequency = gEeprom.FM_SelectedFrequency + Step;
if (Frequency < BK1080_GetFreqLoLimit(gEeprom.FM_Band))
@@ -554,14 +600,13 @@ static void Key_UP_DOWN(uint8_t state, int8_t Step)
gRequestSaveFM = true;
Bail:
Bail:
BK1080_SetFrequency(gEeprom.FM_FrequencyPlaying, gEeprom.FM_Band/*, gEeprom.FM_Space*/);
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) {
uint8_t state = bKeyPressed + 2 * bKeyHeld;
switch (Key) {
@@ -597,8 +642,7 @@ void FM_ProcessKeys(KEY_Code_t Key, bool bKeyPressed, bool bKeyHeld)
GUI_DisplayScreen();
}
void FM_Play(void)
{
void FM_Play(void) {
if (!FM_CheckFrequencyLock(gEeprom.FM_FrequencyPlaying, BK1080_GetFreqLoLimit(gEeprom.FM_Band))) {
if (!gFM_AutoScan) {
gFmPlayCountdown_10ms = 0;
@@ -632,8 +676,7 @@ void FM_Play(void)
GUI_SelectNextDisplay(DISPLAY_FM);
}
void FM_Start(void)
{
void FM_Start(void) {
gDualWatchActive = false;
gFmRadioMode = true;
gFM_ScanState = FM_SCAN_OFF;
@@ -646,10 +689,10 @@ void FM_Start(void)
gEnableSpeaker = true;
gUpdateStatus = true;
#ifdef ENABLE_FEAT_F4HWN_RESUME_STATE
#ifdef ENABLE_FEAT_F4HWN_RESUME_STATE
gEeprom.CURRENT_STATE = 3;
SETTINGS_WriteCurrentState();
#endif
#endif
}
#endif

View File

@@ -30,8 +30,10 @@ typedef enum {
RXState rxState = Ready;
uint8_t SMSResponseCounterTarget = 6;
void FSKModem_TimeSlice500ms(void) {
if (SMSResponseCounter && SMSResponseCounter++ > 6) {
if (SMSResponseCounter && FUNCTION_IsRx() && SMSResponseCounter++ > SMSResponseCounterTarget) {
switch (gSMSResponseState) {
case SMS_RESPONSE_ACK:
MSG_FSKSendData(&inBoundPacket);

14
radio.c
View File

@@ -235,7 +235,7 @@ void RADIO_ConfigureChannel(const unsigned int VFO, const unsigned int configure
if (configure == VFO_CONFIGURE_RELOAD || IS_FREQ_CHANNEL(channel)) {
uint8_t tmp;
uint8_t data[10];
uint8_t data[8];
// ***************
@@ -256,12 +256,6 @@ void RADIO_ConfigureChannel(const unsigned int VFO, const unsigned int configure
pVfo->STEP_SETTING = tmp;
pVfo->StepFrequency = gStepFrequencyTable[tmp];
tmp = data[8];
pVfo->SCRAMBLING_TYPE = tmp ;
tmp = data[9];
pVfo->SCRAMBLING_TYPE |= tmp << 8;
//pVfo->SCRAMBLING_TYPE = 0;
pVfo->freq_config_RX.CodeType = (data[2] >> 0) & 0x0F;
pVfo->freq_config_TX.CodeType = (data[2] >> 4) & 0x0F;
@@ -335,6 +329,12 @@ void RADIO_ConfigureChannel(const unsigned int VFO, const unsigned int configure
// ***************
EEPROM_ReadBuffer(base + 16, data, sizeof(data));
uint16_t * data16 = (uint16_t *)data;
pVfo->SCRAMBLING_TYPE = data16[0];
struct {
uint32_t Frequency;
uint32_t Offset;

View File

@@ -798,12 +798,12 @@ void SETTINGS_SaveChannel(uint8_t Channel, uint8_t VFO, const VFO_Info_t *pVFO,
#endif
;
State._8[6] = pVFO->STEP_SETTING;
EEPROM_WriteBuffer(OffsetVFO + sizeof (State._32), State._8);
State._16[0] = pVFO->SCRAMBLING_TYPE;
EEPROM_WriteBuffer(OffsetVFO + sizeof (State._32), State._8);
EEPROM_WriteBuffer(OffsetVFO + sizeof (State._32) + sizeof (State._8), State._16);
SETTINGS_UpdateChannel(Channel, pVFO, true, true, true);
if (IS_MR_CHANNEL(Channel)) {

View File

@@ -54,6 +54,17 @@ static void convertTime(uint8_t *line, uint8_t type)
#endif
#endif
//static const char* const FunctionStrings[] = {
// [FUNCTION_FOREGROUND] = "FG",
// [FUNCTION_TRANSMIT] = "TX",
// [FUNCTION_MONITOR] = "MON",
// [FUNCTION_INCOMING] = "INC",
// [FUNCTION_RECEIVE] = "RX",
// [FUNCTION_POWER_SAVE] = "PWS",
// [FUNCTION_BAND_SCOPE] = "BS",
// [FUNCTION_N_ELEM] = "NE"
//};
void UI_DisplayStatus()
{
char str[8] = "";
@@ -276,5 +287,8 @@ void UI_DisplayStatus()
// **************
// x2 -= (7 * strlen(str));
// UI_PrintStringSmallBufferNormal(FunctionStrings[gCurrentFunction], line + x2 - 20);
ST7565_BlitStatusLine();
}