18 Commits
v0.13 ... v0.14

Author SHA1 Message Date
Krzysiek Egzmont
e6ac0d1d8d Import bk4819 changes 2023-10-26 18:30:35 +02:00
Krzysiek Egzmont
eda199d47a Back-light PWM 2023-10-26 18:20:28 +02:00
Krzysiek Egzmont
012c375f2e Fix build error 2023-10-26 10:55:33 +02:00
Krzysiek Egzmont
4a96dfa6ce AM fix gains adjusted 2023-10-25 23:24:45 +02:00
Krzysiek Egzmont
ec10aec0c4 Fix monitor listens on the opposite VFO when XB with DW is active at the same time 2023-10-25 21:35:34 +02:00
Krzysiek Egzmont
49c2c6b405 Refactor 2023-10-25 20:56:03 +02:00
Krzysiek Egzmont
38b1e5cbaa #45 piotr022 style S-meter 2023-10-25 14:39:21 +02:00
Krzysiek Egzmont
9a64a18010 #44 Channel/frequency scanner remember last found channel 2023-10-25 02:34:52 +02:00
Krzysiek Egzmont
72eddd009b Refactor 2023-10-25 01:26:14 +02:00
Krzysiek Egzmont
77d58eb8f5 Stop scan with MENU button and accept scan result 2023-10-24 04:09:46 +02:00
Krzysiek Egzmont
856dbe083d Increase DTMF string buffers size 2023-10-24 03:43:48 +02:00
Krzysiek Egzmont
50cc34ad9b Refactor 2023-10-24 03:42:34 +02:00
Krzysiek Egzmont
c996577a0b Fix frequency wraparound over band limit 2023-10-24 03:31:43 +02:00
Krzysiek Egzmont
e877820594 Change upper limit of airband to 137MHz 2023-10-24 03:29:50 +02:00
Krzysiek Egzmont
8ab123c927 Add new "VFO/MR" configurable button function 2023-10-24 02:34:29 +02:00
Krzysiek Egzmont
a510b89c6a Refactor frequency rounding 2023-10-24 02:25:01 +02:00
Krzysiek Egzmont
8b41a1fa66 Fix offset display in menu 2023-10-24 01:56:27 +02:00
Krzysiek Egzmont
99fc8a8311 FIX #43: frequent offset menu is not working properly 2023-10-24 01:54:57 +02:00
35 changed files with 950 additions and 676 deletions

View File

@@ -51,10 +51,10 @@
// <7:5> = LNA Gain // <7:5> = LNA Gain
// 7 = 0dB // 7 = 0dB
// 6 = -2dB // 6 = -2dB
// 5 = -4dB // 5 = -4dB < original value
// 4 = -6dB // 4 = -6dB
// 3 = -9dB // 3 = -9dB
// 2 = -14dB < original value // 2 = -14dB
// 1 = -19dB // 1 = -19dB
// 0 = -24dB // 0 = -24dB
// //
@@ -192,26 +192,26 @@
{0x03D3, -20}, // 77 .. 3 6 2 3 .. 0dB -2dB -3dB -15dB .. -20dB {0x03D3, -20}, // 77 .. 3 6 2 3 .. 0dB -2dB -3dB -15dB .. -20dB
{0x03BB, -19}, // 78 .. 3 5 3 3 .. 0dB -4dB 0dB -15dB .. -19dB {0x03BB, -19}, // 78 .. 3 5 3 3 .. 0dB -4dB 0dB -15dB .. -19dB
{0x037C, -18}, // 79 .. 3 3 3 4 .. 0dB -9dB 0dB -9dB .. -18dB {0x037C, -18}, // 79 .. 3 3 3 4 .. 0dB -9dB 0dB -9dB .. -18dB
{0x035E, -17}, // 80 .. 3 2 3 6 .. 0dB -14dB 0dB -3dB .. -17dB original {0x03CC, -17}, // 80 .. 3 6 1 4 .. 0dB -2dB -6dB -9dB .. -17dB
{0x03C5, -16}, // 81 .. 3 6 0 5 .. 0dB -2dB -8dB -6dB .. -16dB {0x03C5, -16}, // 81 .. 3 6 0 5 .. 0dB -2dB -8dB -6dB .. -16dB
{0x03EC, -15}, // 82 .. 3 7 1 4 .. 0dB 0dB -6dB -9dB .. -15dB {0x03EC, -15}, // 82 .. 3 7 1 4 .. 0dB 0dB -6dB -9dB .. -15dB
{0x035F, -14}, // 83 .. 3 2 3 7 .. 0dB -14dB 0dB 0dB .. -14dB {0x035F, -14}, // 83 .. 3 2 3 7 .. 0dB -14dB 0dB 0dB .. -14dB
{0x03C6, -13}, // 84 .. 3 6 0 6 .. 0dB -2dB -8dB -3dB .. -13dB {0x03BC, -13}, // 84 .. 3 5 3 4 .. 0dB -4dB 0dB -9dB .. -13dB
{0x0377, -12}, // 85 .. 3 3 2 7 .. 0dB -9dB -3dB 0dB .. -12dB {0x038F, -12}, // 85 .. 3 4 1 7 .. 0dB -6dB -6dB 0dB .. -12dB
{0x03E6, -11}, // 86 .. 3 7 0 6 .. 0dB 0dB -8dB -3dB .. -11dB {0x03E6, -11}, // 86 .. 3 7 0 6 .. 0dB 0dB -8dB -3dB .. -11dB
{0x03BD, -10}, // 87 .. 3 5 3 5 .. 0dB -4dB 0dB -6dB .. -10dB {0x03AF, -10}, // 87 .. 3 5 1 7 .. 0dB -4dB -6dB 0dB .. -10dB
{0x03F5, -9}, // 88 .. 3 7 2 5 .. 0dB 0dB -3dB -6dB .. -9dB {0x03F5, -9 }, // 88 .. 3 7 2 5 .. 0dB 0dB -3dB -6dB .. -9dB
{0x03DD, -8}, // 89 .. 3 6 3 5 .. 0dB -2dB 0dB -6dB .. -8dB {0x03D6, -8 }, // 89 .. 3 6 2 6 .. 0dB -2dB -3dB -3dB .. -8dB
{0x03B7, -7}, // 90 .. 3 5 2 7 .. 0dB -4dB -3dB 0dB .. -7dB {0x03BE, -7 }, // 90 .. 3 5 3 6 .. 0dB -4dB 0dB -3dB .. -7dB original
{0x03F6, -6}, // 91 .. 3 7 2 6 .. 0dB 0dB -3dB -3dB .. -6dB {0x03F6, -6 }, // 91 .. 3 7 2 6 .. 0dB 0dB -3dB -3dB .. -6dB
{0x03D7, -5}, // 92 .. 3 6 2 7 .. 0dB -2dB -3dB 0dB .. -5dB {0x03DE, -5 }, // 92 .. 3 6 3 6 .. 0dB -2dB 0dB -3dB .. -5dB
{0x03BF, -4}, // 93 .. 3 5 3 7 .. 0dB -4dB 0dB 0dB .. -4dB {0x03BF, -4 }, // 93 .. 3 5 3 7 .. 0dB -4dB 0dB 0dB .. -4dB
{0x03F7, -3}, // 94 .. 3 7 2 7 .. 0dB 0dB -3dB 0dB .. -3dB {0x03F7, -3 }, // 94 .. 3 7 2 7 .. 0dB 0dB -3dB 0dB .. -3dB
{0x03DF, -2}, // 95 .. 3 6 3 7 .. 0dB -2dB 0dB 0dB .. -2dB {0x03DF, -2 }, // 95 .. 3 6 3 7 .. 0dB -2dB 0dB 0dB .. -2dB
{0x03FF, 0} // 96 .. 3 7 3 7 .. 0dB 0dB 0dB 0dB .. 0dB {0x03FF, 0 }, // 96 .. 3 7 3 7 .. 0dB 0dB 0dB 0dB .. 0dB
}; };
static const unsigned int original_index = 80; static const unsigned int original_index = 90;
#endif #endif

View File

@@ -116,7 +116,7 @@ void ACTION_Monitor(void)
void ACTION_Scan(bool bRestart) void ACTION_Scan(bool bRestart)
{ {
#ifdef ENABLE_FMRADIO #ifdef ENABLE_FMRADIO
if (gFmRadioMode) if (gFmRadioMode)
{ {
if (gCurrentFunction != FUNCTION_RECEIVE && if (gCurrentFunction != FUNCTION_RECEIVE &&
@@ -131,9 +131,9 @@ void ACTION_Scan(bool bRestart)
{ {
FM_PlayAndUpdate(); FM_PlayAndUpdate();
#ifdef ENABLE_VOICE #ifdef ENABLE_VOICE
gAnotherVoiceID = VOICE_ID_SCANNING_STOP; gAnotherVoiceID = VOICE_ID_SCANNING_STOP;
#endif #endif
} }
else else
{ {
@@ -155,16 +155,14 @@ void ACTION_Scan(bool bRestart)
BK1080_GetFrequencyDeviation(Frequency); BK1080_GetFrequencyDeviation(Frequency);
FM_Tune(Frequency, 1, bRestart); FM_Tune(Frequency, 1, bRestart);
#ifdef ENABLE_VOICE
#ifdef ENABLE_VOICE
gAnotherVoiceID = VOICE_ID_SCANNING_BEGIN; gAnotherVoiceID = VOICE_ID_SCANNING_BEGIN;
#endif #endif
} }
} }
return; return;
} }
#endif #endif
if (gScreenToDisplay != DISPLAY_SCANNER) if (gScreenToDisplay != DISPLAY_SCANNER)
{ // not scanning { // not scanning
@@ -178,23 +176,23 @@ void ACTION_Scan(bool bRestart)
RADIO_SelectVfos(); RADIO_SelectVfos();
#ifdef ENABLE_NOAA #ifdef ENABLE_NOAA
if (IS_NOT_NOAA_CHANNEL(gRxVfo->CHANNEL_SAVE)) if (!IS_NOAA_CHANNEL(gRxVfo->CHANNEL_SAVE))
#endif #endif
{ {
GUI_SelectNextDisplay(DISPLAY_MAIN); GUI_SelectNextDisplay(DISPLAY_MAIN);
if (gScanStateDir != SCAN_OFF) if (gScanStateDir != SCAN_OFF)
{ // already scanning { // already scanning
if (gNextMrChannel <= MR_CHANNEL_LAST) if (IS_MR_CHANNEL(gNextMrChannel))
{ // channel mode { // channel mode
// keep scanning but toggle between scan lists // keep scanning but toggle between scan lists
gEeprom.SCAN_LIST_DEFAULT = (gEeprom.SCAN_LIST_DEFAULT + 1) % 3; gEeprom.SCAN_LIST_DEFAULT = (gEeprom.SCAN_LIST_DEFAULT + 1) % 3;
// jump to the next channel // jump to the next channel
SCANNER_NextChannel(false, gScanStateDir); SCANNER_ScanChannels(false, gScanStateDir);
gScanPauseDelayIn_10ms = 1; gScanPauseDelayIn_10ms = 1;
gScheduleScanListen = false; gScheduleScanListen = false;
@@ -213,7 +211,7 @@ void ACTION_Scan(bool bRestart)
else else
{ // start scanning { // start scanning
SCANNER_NextChannel(true, SCAN_FWD); SCANNER_ScanChannels(true, SCAN_FWD);
#ifdef ENABLE_VOICE #ifdef ENABLE_VOICE
AUDIO_SetVoiceID(0, VOICE_ID_SCANNING_BEGIN); AUDIO_SetVoiceID(0, VOICE_ID_SCANNING_BEGIN);
@@ -231,12 +229,12 @@ void ACTION_Scan(bool bRestart)
} }
else else
// if (!bRestart) // if (!bRestart)
if (!bRestart && gNextMrChannel <= MR_CHANNEL_LAST) if (!bRestart && IS_MR_CHANNEL(gNextMrChannel))
{ // channel mode, keep scanning but toggle between scan lists { // channel mode, keep scanning but toggle between scan lists
gEeprom.SCAN_LIST_DEFAULT = (gEeprom.SCAN_LIST_DEFAULT + 1) % 3; gEeprom.SCAN_LIST_DEFAULT = (gEeprom.SCAN_LIST_DEFAULT + 1) % 3;
// jump to the next channel // jump to the next channel
SCANNER_NextChannel(false, gScanStateDir); SCANNER_ScanChannels(false, gScanStateDir);
gScanPauseDelayIn_10ms = 1; gScanPauseDelayIn_10ms = 1;
gScheduleScanListen = false; gScheduleScanListen = false;
@@ -437,5 +435,8 @@ void ACTION_Handle(KEY_Code_t Key, bool bKeyPressed, bool bKeyHeld)
case ACTION_OPT_A_B: case ACTION_OPT_A_B:
COMMON_SwitchVFOs(); COMMON_SwitchVFOs();
break; break;
case ACTION_OPT_VFO_MR:
COMMON_SwitchVFOMode();
break;
} }
} }

View File

@@ -57,7 +57,7 @@ void AIRCOPY_SendMessage(void)
BK4819_SendFSKData(g_FSK_Buffer); BK4819_SendFSKData(g_FSK_Buffer);
BK4819_SetupPowerAmplifier(0, 0); BK4819_SetupPowerAmplifier(0, 0);
BK4819_ToggleGpioOut(BK4819_GPIO1_PIN29, false); BK4819_ToggleGpioOut(BK4819_GPIO1_PIN29_PA_ENABLE, false);
gAircopySendCountdown = 30; gAircopySendCountdown = 30;
} }
@@ -141,8 +141,7 @@ static void AIRCOPY_Key_DIGITS(KEY_Code_t Key, bool bKeyPressed, bool bKeyHeld)
gAnotherVoiceID = (VOICE_ID_t)Key; gAnotherVoiceID = (VOICE_ID_t)Key;
#endif #endif
gRxVfo->Band = i; gRxVfo->Band = i;
Frequency += 75; Frequency = FREQUENCY_RoundToStep(Frequency, gRxVfo->StepFrequency);
Frequency = FREQUENCY_FloorToStep(Frequency, gRxVfo->StepFrequency, 0);
gRxVfo->freq_config_RX.Frequency = Frequency; gRxVfo->freq_config_RX.Frequency = Frequency;
gRxVfo->freq_config_TX.Frequency = Frequency; gRxVfo->freq_config_TX.Frequency = Frequency;
RADIO_ConfigureSquelchAndOutputPower(gRxVfo); RADIO_ConfigureSquelchAndOutputPower(gRxVfo);

154
app/app.c
View File

@@ -62,12 +62,6 @@
#include "ui/status.h" #include "ui/status.h"
#include "ui/ui.h" #include "ui/ui.h"
// original QS front end register settings
const uint8_t orig_lna_short = 3; // 0dB
const uint8_t orig_lna = 2; // -14dB
const uint8_t orig_mixer = 3; // 0dB
const uint8_t orig_pga = 6; // -3dB
static void APP_ProcessKey(KEY_Code_t Key, bool bKeyPressed, bool bKeyHeld); static void APP_ProcessKey(KEY_Code_t Key, bool bKeyPressed, bool bKeyHeld);
static void updateRSSI(const int vfo) static void updateRSSI(const int vfo)
@@ -308,7 +302,7 @@ static void APP_HandleReceive(void)
if (g_SquelchLost) if (g_SquelchLost)
{ {
#ifdef ENABLE_NOAA #ifdef ENABLE_NOAA
if (!gEndOfRxDetectedMaybe && IS_NOT_NOAA_CHANNEL(gRxVfo->CHANNEL_SAVE)) if (!gEndOfRxDetectedMaybe && !IS_NOAA_CHANNEL(gRxVfo->CHANNEL_SAVE))
#else #else
if (!gEndOfRxDetectedMaybe) if (!gEndOfRxDetectedMaybe)
#endif #endif
@@ -473,47 +467,25 @@ void APP_StartListening(FUNCTION_Type_t Function, const bool reset_am_fix)
if (gSetting_KILLED) if (gSetting_KILLED)
return; return;
#ifdef ENABLE_FMRADIO #ifdef ENABLE_FMRADIO
if (gFmRadioMode) if (gFmRadioMode)
BK1080_Init(0, false); BK1080_Init(0, false);
#endif #endif
// clear the other vfo's rssi level (to hide the antenna symbol) // clear the other vfo's rssi level (to hide the antenna symbol)
gVFO_RSSI_bar_level[(chan + 1) & 1u] = 0; gVFO_RSSI_bar_level[(chan + 1) & 1u] = 0;
GPIO_SetBit(&GPIOC->DATA, GPIOC_PIN_AUDIO_PATH); GPIO_SetBit(&GPIOC->DATA, GPIOC_PIN_AUDIO_PATH);
gEnableSpeaker = true; gEnableSpeaker = true;
if (gSetting_backlight_on_tx_rx >= BACKLIGHT_ON_TR_RX) if (gSetting_backlight_on_tx_rx >= BACKLIGHT_ON_TR_RX)
BACKLIGHT_TurnOn(); BACKLIGHT_TurnOn();
if (gScanStateDir != SCAN_OFF) if (gScanStateDir != SCAN_OFF)
{ SCANNER_Found();
switch (gEeprom.SCAN_RESUME_MODE)
{
case SCAN_RESUME_TO:
if (!gScanPauseMode)
{
gScanPauseDelayIn_10ms = scan_pause_delay_in_1_10ms;
gScheduleScanListen = false;
gScanPauseMode = true;
}
break;
case SCAN_RESUME_CO: #ifdef ENABLE_NOAA
case SCAN_RESUME_SE: if (IS_NOAA_CHANNEL(gRxVfo->CHANNEL_SAVE) && gIsNoaaMode) {
gScanPauseDelayIn_10ms = 0;
gScheduleScanListen = false;
break;
}
bScanKeepFrequency = true;
}
#ifdef ENABLE_NOAA
if (IS_NOAA_CHANNEL(gRxVfo->CHANNEL_SAVE) && gIsNoaaMode)
{
gRxVfo->CHANNEL_SAVE = gNoaaChannel + NOAA_CHANNEL_FIRST; gRxVfo->CHANNEL_SAVE = gNoaaChannel + NOAA_CHANNEL_FIRST;
gRxVfo->pRX->Frequency = NoaaFrequencyTable[gNoaaChannel]; gRxVfo->pRX->Frequency = NoaaFrequencyTable[gNoaaChannel];
gRxVfo->pTX->Frequency = NoaaFrequencyTable[gNoaaChannel]; gRxVfo->pTX->Frequency = NoaaFrequencyTable[gNoaaChannel];
@@ -522,7 +494,7 @@ void APP_StartListening(FUNCTION_Type_t Function, const bool reset_am_fix)
gNOAA_Countdown_10ms = 500; // 5 sec gNOAA_Countdown_10ms = 500; // 5 sec
gScheduleNOAA = false; gScheduleNOAA = false;
} }
#endif #endif
if (gCssScanMode != CSS_SCAN_MODE_OFF) if (gCssScanMode != CSS_SCAN_MODE_OFF)
gCssScanMode = CSS_SCAN_MODE_FOUND; gCssScanMode = CSS_SCAN_MODE_FOUND;
@@ -545,48 +517,51 @@ void APP_StartListening(FUNCTION_Type_t Function, const bool reset_am_fix)
} }
{ // RF RX front end gain { // RF RX front end gain
// original QS front end register settings
// 0x03BE 00000 011 101 11 110
const uint8_t orig_lna_short = 3; // 0dB
const uint8_t orig_lna = 5; // -4dB
const uint8_t orig_mixer = 3; // 0dB
const uint8_t orig_pga = 6; // -3dB
// original setting #ifdef ENABLE_AM_FIX
uint16_t lna_short = orig_lna_short; if (gRxVfo->AM_mode && gSetting_AM_fix) { // AM RX mode
uint16_t lna = orig_lna;
uint16_t mixer = orig_mixer;
uint16_t pga = orig_pga;
#ifdef ENABLE_AM_FIX
if (gRxVfo->AM_mode && gSetting_AM_fix)
{ // AM RX mode
if (reset_am_fix) if (reset_am_fix)
AM_fix_reset(chan); // TODO: only reset it when moving channel/frequency AM_fix_reset(chan); // TODO: only reset it when moving channel/frequency
AM_fix_10ms(chan); AM_fix_10ms(chan);
} }
else else { // FM RX mode
{ // FM RX mode BK4819_WriteRegister(BK4819_REG_13, (orig_lna_short << 8) | (orig_lna << 5) | (orig_mixer << 3) | (orig_pga << 0));
BK4819_WriteRegister(BK4819_REG_13, (lna_short << 8) | (lna << 5) | (mixer << 3) | (pga << 0));
} }
#else #else
BK4819_WriteRegister(BK4819_REG_13, (lna_short << 8) | (lna << 5) | (mixer << 3) | (pga << 0)); BK4819_WriteRegister(BK4819_REG_13, (orig_lna_short << 8) | (orig_lna << 5) | (orig_mixer << 3) | (orig_pga << 0));
#endif #endif
} }
// AF gain - original QS values // AF gain - original QS values
if (gRxVfo->AM_mode){
BK4819_WriteRegister(0x48, 0xB3A8);
}
else {
BK4819_WriteRegister(BK4819_REG_48, BK4819_WriteRegister(BK4819_REG_48,
(11u << 12) | // ??? .. 0 to 15, doesn't seem to make any difference (11u << 12) | // ??? .. 0 to 15, doesn't seem to make any difference
( 0u << 10) | // AF Rx Gain-1 ( 0u << 10) | // AF Rx Gain-1
(gEeprom.VOLUME_GAIN << 4) | // AF Rx Gain-2 (gEeprom.VOLUME_GAIN << 4) | // AF Rx Gain-2
(gEeprom.DAC_GAIN << 0)); // AF DAC Gain (after Gain-1 and Gain-2) (gEeprom.DAC_GAIN << 0)); // AF DAC Gain (after Gain-1 and Gain-2)
}
#ifdef ENABLE_VOICE #ifdef ENABLE_VOICE
if (gVoiceWriteIndex == 0) // AM/FM RX mode will be set when the voice has finished if (gVoiceWriteIndex == 0) // AM/FM RX mode will be set when the voice has finished
#endif #endif
BK4819_SetAF(gRxVfo->AM_mode ? BK4819_AF_AM : BK4819_AF_FM); // no need, set it now BK4819_SetAF(gRxVfo->AM_mode ? BK4819_AF_AM : BK4819_AF_FM); // no need, set it now
FUNCTION_Select(Function); FUNCTION_Select(Function);
#ifdef ENABLE_FMRADIO #ifdef ENABLE_FMRADIO
if (Function == FUNCTION_MONITOR || gFmRadioMode) if (Function == FUNCTION_MONITOR || gFmRadioMode)
#else #else
if (Function == FUNCTION_MONITOR) if (Function == FUNCTION_MONITOR)
#endif #endif
{ // squelch is disabled { // squelch is disabled
if (gScreenToDisplay != DISPLAY_MENU) // 1of11 .. don't close the menu if (gScreenToDisplay != DISPLAY_MENU) // 1of11 .. don't close the menu
GUI_SelectNextDisplay(DISPLAY_MAIN); GUI_SelectNextDisplay(DISPLAY_MAIN);
@@ -597,28 +572,14 @@ void APP_StartListening(FUNCTION_Type_t Function, const bool reset_am_fix)
gUpdateStatus = true; gUpdateStatus = true;
} }
uint32_t APP_SetFrequencyByStep(VFO_Info_t *pInfo, int8_t Step) uint32_t APP_SetFrequencyByStep(VFO_Info_t *pInfo, int8_t direction)
{ {
uint32_t Frequency = pInfo->freq_config_RX.Frequency + (Step * pInfo->StepFrequency); uint32_t Frequency = FREQUENCY_RoundToStep(pInfo->freq_config_RX.Frequency + (direction * pInfo->StepFrequency), pInfo->StepFrequency);
if (pInfo->StepFrequency == 833)
{
const uint32_t Lower = frequencyBandTable[pInfo->Band].lower;
const uint32_t Delta = Frequency - Lower;
uint32_t Base = (Delta / 2500) * 2500;
const uint32_t Index = ((Delta - Base) % 2500) / 833;
if (Index == 2)
Base++;
Frequency = Lower + Base + (Index * 833);
}
if (Frequency >= frequencyBandTable[pInfo->Band].upper) if (Frequency >= frequencyBandTable[pInfo->Band].upper)
Frequency = frequencyBandTable[pInfo->Band].lower; Frequency = frequencyBandTable[pInfo->Band].lower;
else else if (Frequency < frequencyBandTable[pInfo->Band].lower)
if (Frequency < frequencyBandTable[pInfo->Band].lower) Frequency = FREQUENCY_RoundToStep(frequencyBandTable[pInfo->Band].upper - pInfo->StepFrequency, pInfo->StepFrequency);
Frequency = FREQUENCY_FloorToStep(frequencyBandTable[pInfo->Band].upper, pInfo->StepFrequency, frequencyBandTable[pInfo->Band].lower);
return Frequency; return Frequency;
} }
@@ -636,7 +597,7 @@ static void DUALWATCH_Alternate(void)
#ifdef ENABLE_NOAA #ifdef ENABLE_NOAA
if (gIsNoaaMode) if (gIsNoaaMode)
{ {
if (IS_NOT_NOAA_CHANNEL(gEeprom.ScreenChannel[0]) || IS_NOT_NOAA_CHANNEL(gEeprom.ScreenChannel[1])) if (!IS_NOAA_CHANNEL(gEeprom.ScreenChannel[0]) || !IS_NOAA_CHANNEL(gEeprom.ScreenChannel[1]))
gEeprom.RX_VFO = (gEeprom.RX_VFO + 1) & 1; gEeprom.RX_VFO = (gEeprom.RX_VFO + 1) & 1;
else else
gEeprom.RX_VFO = 0; gEeprom.RX_VFO = 0;
@@ -1052,7 +1013,7 @@ void APP_Update(void)
{ {
gBatterySaveCountdown_10ms = battery_save_count_10ms; gBatterySaveCountdown_10ms = battery_save_count_10ms;
} }
else if ((IS_NOT_NOAA_CHANNEL(gEeprom.ScreenChannel[0]) && IS_NOT_NOAA_CHANNEL(gEeprom.ScreenChannel[1])) || !gIsNoaaMode) else if ((!IS_NOAA_CHANNEL(gEeprom.ScreenChannel[0]) && !IS_NOAA_CHANNEL(gEeprom.ScreenChannel[1])) || !gIsNoaaMode)
{ {
//if (gCurrentFunction != FUNCTION_POWER_SAVE) //if (gCurrentFunction != FUNCTION_POWER_SAVE)
FUNCTION_Select(FUNCTION_POWER_SAVE); FUNCTION_Select(FUNCTION_POWER_SAVE);
@@ -1129,7 +1090,7 @@ void APP_Update(void)
BK4819_DisableVox(); BK4819_DisableVox();
BK4819_Sleep(); BK4819_Sleep();
BK4819_ToggleGpioOut(BK4819_GPIO0_PIN28, false); BK4819_ToggleGpioOut(BK4819_GPIO0_PIN28_RX_ENABLE, false);
// Authentic device checked removed // Authentic device checked removed
@@ -1377,7 +1338,7 @@ void APP_TimeSlice10ms(void)
RADIO_EnableCxCSS(); RADIO_EnableCxCSS();
BK4819_SetupPowerAmplifier(0, 0); BK4819_SetupPowerAmplifier(0, 0);
BK4819_ToggleGpioOut(BK4819_GPIO1_PIN29, false); BK4819_ToggleGpioOut(BK4819_GPIO1_PIN29_PA_ENABLE, false);
BK4819_Enable_AfDac_DiscMode_TxDsp(); BK4819_Enable_AfDac_DiscMode_TxDsp();
BK4819_ToggleGpioOut(BK4819_GPIO5_PIN1_RED, false); BK4819_ToggleGpioOut(BK4819_GPIO5_PIN1_RED, false);
@@ -1650,11 +1611,16 @@ void APP_TimeSlice500ms(void)
} }
#endif #endif
if (gBacklightCountdown > 0 && !gAskToSave && gCssScanMode == CSS_SCAN_MODE_OFF) if (gBacklightCountdown > 0 &&
if (gScreenToDisplay != DISPLAY_MENU || GetCurrentMenuId() != MENU_ABR) // don't turn off backlight if user is in backlight menu option !gAskToSave &&
if (--gBacklightCountdown == 0) gCssScanMode == CSS_SCAN_MODE_OFF &&
if (gEeprom.BACKLIGHT < (ARRAY_SIZE(gSubMenu_BACKLIGHT) - 1)) // don't turn off backlight if user is in backlight menu option
GPIO_ClearBit(&GPIOB->DATA, GPIOB_PIN_BACKLIGHT); // turn backlight off !(gScreenToDisplay == DISPLAY_MENU && (GetCurrentMenuId() == MENU_ABR || GetCurrentMenuId() == MENU_ABR_MAX))
)
{ if (--gBacklightCountdown == 0)
if (gEeprom.BACKLIGHT_TIME < (ARRAY_SIZE(gSubMenu_BACKLIGHT) - 1)) // backlight is not set to be always on
BACKLIGHT_TurnOff(); // turn backlight off
}
if (gSerialConfigCountDown_500ms > 0) if (gSerialConfigCountDown_500ms > 0)
{ {
@@ -1726,10 +1692,9 @@ void APP_TimeSlice500ms(void)
{ {
gMenuCountdown = 0; gMenuCountdown = 0;
if (gEeprom.BACKLIGHT == 0) if (gEeprom.BACKLIGHT_TIME == 0) // backlight always off
{ {
gBacklightCountdown = 0; BACKLIGHT_TurnOff(); // turn the backlight OFF
GPIO_ClearBit(&GPIOB->DATA, GPIOB_PIN_BACKLIGHT); // turn the backlight OFF
} }
if (gInputBoxIndex > 0 || gDTMF_InputMode) if (gInputBoxIndex > 0 || gDTMF_InputMode)
@@ -1846,8 +1811,8 @@ void APP_TimeSlice500ms(void)
ST7565_HardwareReset(); ST7565_HardwareReset();
if (gEeprom.BACKLIGHT < (ARRAY_SIZE(gSubMenu_BACKLIGHT) - 1)) if (gEeprom.BACKLIGHT_TIME < (ARRAY_SIZE(gSubMenu_BACKLIGHT) - 1))
GPIO_ClearBit(&GPIOB->DATA, GPIOB_PIN_BACKLIGHT); // turn the backlight off BACKLIGHT_TurnOff(); // turn the backlight off
} }
#ifdef ENABLE_VOICE #ifdef ENABLE_VOICE
else else
@@ -1946,9 +1911,7 @@ void APP_TimeSlice500ms(void)
static void APP_ProcessKey(KEY_Code_t Key, bool bKeyPressed, bool bKeyHeld) static void APP_ProcessKey(KEY_Code_t Key, bool bKeyPressed, bool bKeyHeld)
{ {
const bool backlight_was_on = GPIO_CheckBit(&GPIOB->DATA, GPIOB_PIN_BACKLIGHT); if (Key == KEY_EXIT && !BACKLIGHT_IsOn() && gEeprom.BACKLIGHT_TIME > 0)
if (Key == KEY_EXIT && !backlight_was_on && gEeprom.BACKLIGHT > 0)
{ // just turn the light on for now so the user can see what's what { // just turn the light on for now so the user can see what's what
BACKLIGHT_TurnOn(); BACKLIGHT_TurnOn();
gBeepToPlay = BEEP_NONE; gBeepToPlay = BEEP_NONE;
@@ -1998,9 +1961,16 @@ static void APP_ProcessKey(KEY_Code_t Key, bool bKeyPressed, bool bKeyHeld)
} }
else // key pressed or held else // key pressed or held
{ {
if (Key != KEY_PTT || gSetting_backlight_on_tx_rx == BACKLIGHT_ON_TR_TX const uint8_t s = gSetting_backlight_on_tx_rx;
|| gSetting_backlight_on_tx_rx == BACKLIGHT_ON_TR_TXRX) const int m = GetCurrentMenuId();
if ( //not when PTT and the backlight shouldn't turn on on TX
!(Key == KEY_PTT && s != BACKLIGHT_ON_TR_TX && s != BACKLIGHT_ON_TR_TXRX)
// not in the backlight menu
&& !(gScreenToDisplay == DISPLAY_MENU && ( m == MENU_ABR || m == MENU_ABR_MAX || m == MENU_ABR_MIN))
)
{
BACKLIGHT_TurnOn(); BACKLIGHT_TurnOn();
}
if (Key == KEY_EXIT && bKeyHeld) if (Key == KEY_EXIT && bKeyHeld)
{ // exit key held pressed { // exit key held pressed

View File

@@ -23,14 +23,9 @@
#include "frequencies.h" #include "frequencies.h"
#include "radio.h" #include "radio.h"
extern const uint8_t orig_lna_short;
extern const uint8_t orig_lna;
extern const uint8_t orig_mixer;
extern const uint8_t orig_pga;
void APP_EndTransmission(void); void APP_EndTransmission(void);
void APP_StartListening(FUNCTION_Type_t Function, const bool reset_am_fix); void APP_StartListening(FUNCTION_Type_t Function, const bool reset_am_fix);
uint32_t APP_SetFrequencyByStep(VFO_Info_t *pInfo, int8_t Step); uint32_t APP_SetFrequencyByStep(VFO_Info_t *pInfo, int8_t direction);
void APP_Update(void); void APP_Update(void);
void APP_TimeSlice10ms(void); void APP_TimeSlice10ms(void);
void APP_TimeSlice500ms(void); void APP_TimeSlice500ms(void);

View File

@@ -1,3 +1,4 @@
#include "audio.h"
#include "functions.h" #include "functions.h"
#include "misc.h" #include "misc.h"
#include "settings.h" #include "settings.h"
@@ -35,3 +36,38 @@ void COMMON_SwitchVFOs()
gRequestDisplayScreen = DISPLAY_MAIN; gRequestDisplayScreen = DISPLAY_MAIN;
} }
void COMMON_SwitchVFOMode()
{
#ifdef ENABLE_NOAA
if (gEeprom.VFO_OPEN && !IS_NOAA_CHANNEL(gTxVfo->CHANNEL_SAVE))
#else
if (gEeprom.VFO_OPEN)
#endif
{
if (IS_MR_CHANNEL(gTxVfo->CHANNEL_SAVE))
{ // swap to frequency mode
gEeprom.ScreenChannel[gEeprom.TX_VFO] = gEeprom.FreqChannel[gEeprom.TX_VFO];
#ifdef ENABLE_VOICE
gAnotherVoiceID = VOICE_ID_FREQUENCY_MODE;
#endif
gRequestSaveVFO = true;
gVfoConfigureMode = VFO_CONFIGURE_RELOAD;
return;
}
uint8_t Channel = RADIO_FindNextChannel(gEeprom.MrChannel[gEeprom.TX_VFO], 1, false, 0);
if (Channel != 0xFF)
{ // swap to channel mode
gEeprom.ScreenChannel[gEeprom.TX_VFO] = Channel;
#ifdef ENABLE_VOICE
AUDIO_SetVoiceID(0, VOICE_ID_CHANNEL_MODE);
AUDIO_SetDigitVoice(1, Channel + 1);
gAnotherVoiceID = (VOICE_ID_t)0xFE;
#endif
gRequestSaveVFO = true;
gVfoConfigureMode = VFO_CONFIGURE_RELOAD;
return;
}
}
}

View File

@@ -8,5 +8,6 @@
void COMMON_KeypadLockToggle(); void COMMON_KeypadLockToggle();
void COMMON_SwitchVFOs(); void COMMON_SwitchVFOs();
void COMMON_SwitchVFOMode();
#endif #endif

View File

@@ -203,7 +203,7 @@ void DTMF_Append(const char code)
void DTMF_HandleRequest(void) void DTMF_HandleRequest(void)
{ // proccess the RX'ed DTMF characters { // proccess the RX'ed DTMF characters
char String[20]; char String[21];
unsigned int Offset; unsigned int Offset;
if (!gDTMF_RX_pending) if (!gDTMF_RX_pending)
@@ -383,7 +383,7 @@ void DTMF_HandleRequest(void)
void DTMF_Reply(void) void DTMF_Reply(void)
{ {
uint16_t Delay; uint16_t Delay;
char String[20]; char String[23];
const char *pString = NULL; const char *pString = NULL;
switch (gDTMF_ReplyState) switch (gDTMF_ReplyState)

View File

@@ -183,39 +183,7 @@ static void processFKeyFunction(const KEY_Code_t Key, const bool beep)
break; break;
case KEY_3: case KEY_3:
#ifdef ENABLE_NOAA COMMON_SwitchVFOMode();
if (gEeprom.VFO_OPEN && IS_NOT_NOAA_CHANNEL(gTxVfo->CHANNEL_SAVE))
#else
if (gEeprom.VFO_OPEN)
#endif
{
uint8_t Channel;
if (IS_MR_CHANNEL(gTxVfo->CHANNEL_SAVE))
{ // swap to frequency mode
gEeprom.ScreenChannel[Vfo] = gEeprom.FreqChannel[gEeprom.TX_VFO];
#ifdef ENABLE_VOICE
gAnotherVoiceID = VOICE_ID_FREQUENCY_MODE;
#endif
gRequestSaveVFO = true;
gVfoConfigureMode = VFO_CONFIGURE_RELOAD;
break;
}
Channel = RADIO_FindNextChannel(gEeprom.MrChannel[gEeprom.TX_VFO], 1, false, 0);
if (Channel != 0xFF)
{ // swap to channel mode
gEeprom.ScreenChannel[Vfo] = Channel;
#ifdef ENABLE_VOICE
AUDIO_SetVoiceID(0, VOICE_ID_CHANNEL_MODE);
AUDIO_SetDigitVoice(1, Channel + 1);
gAnotherVoiceID = (VOICE_ID_t)0xFE;
#endif
gRequestSaveVFO = true;
gVfoConfigureMode = VFO_CONFIGURE_RELOAD;
break;
}
}
if (beep) if (beep)
gBeepToPlay = BEEP_500HZ_60MS_DOUBLE_BEEP_OPTIONAL; gBeepToPlay = BEEP_500HZ_60MS_DOUBLE_BEEP_OPTIONAL;
@@ -239,7 +207,7 @@ static void processFKeyFunction(const KEY_Code_t Key, const bool beep)
if(beep) { if(beep) {
#ifdef ENABLE_NOAA #ifdef ENABLE_NOAA
if (IS_NOT_NOAA_CHANNEL(gTxVfo->CHANNEL_SAVE)) if (!IS_NOAA_CHANNEL(gTxVfo->CHANNEL_SAVE))
{ {
gEeprom.ScreenChannel[Vfo] = gEeprom.NoaaChannel[gEeprom.TX_VFO]; gEeprom.ScreenChannel[Vfo] = gEeprom.NoaaChannel[gEeprom.TX_VFO];
} }
@@ -390,7 +358,7 @@ static void MAIN_Key_DIGITS(KEY_Code_t Key, bool bKeyPressed, bool bKeyHeld)
} }
// #ifdef ENABLE_NOAA // #ifdef ENABLE_NOAA
// if (IS_NOT_NOAA_CHANNEL(gTxVfo->CHANNEL_SAVE)) // if (!IS_NOAA_CHANNEL(gTxVfo->CHANNEL_SAVE))
// #endif // #endif
if (IS_FREQ_CHANNEL(gTxVfo->CHANNEL_SAVE)) if (IS_FREQ_CHANNEL(gTxVfo->CHANNEL_SAVE))
{ // user is entering a frequency { // user is entering a frequency
@@ -444,10 +412,7 @@ static void MAIN_Key_DIGITS(KEY_Code_t Key, bool bKeyPressed, bool bKeyHeld)
RADIO_ConfigureChannel(Vfo, VFO_CONFIGURE_RELOAD); RADIO_ConfigureChannel(Vfo, VFO_CONFIGURE_RELOAD);
} }
// Frequency += 75; // is this meant to be rounding ? Frequency = FREQUENCY_RoundToStep(Frequency, gTxVfo->StepFrequency);
Frequency += gTxVfo->StepFrequency / 2; // no idea, but this is
Frequency = FREQUENCY_FloorToStep(Frequency, gTxVfo->StepFrequency, frequencyBandTable[gTxVfo->Band].lower);
if (Frequency >= BX4819_band1.upper && Frequency < BX4819_band2.lower) if (Frequency >= BX4819_band1.upper && Frequency < BX4819_band2.lower)
{ // clamp the frequency to the limit { // clamp the frequency to the limit
@@ -540,7 +505,7 @@ static void MAIN_Key_EXIT(bool bKeyPressed, bool bKeyHeld)
} }
else else
{ {
bScanKeepFrequency = false; gScanKeepResult = false;
SCANNER_Stop(); SCANNER_Stop();
#ifdef ENABLE_VOICE #ifdef ENABLE_VOICE
@@ -613,6 +578,11 @@ static void MAIN_Key_MENU(const bool bKeyPressed, const bool bKeyHeld)
if (bFlag) if (bFlag)
{ {
if (gScanStateDir != SCAN_OFF) {
SCANNER_Stop();
return;
}
gFlagRefreshSetting = true; gFlagRefreshSetting = true;
gRequestDisplayScreen = DISPLAY_MENU; gRequestDisplayScreen = DISPLAY_MENU;
#ifdef ENABLE_VOICE #ifdef ENABLE_VOICE
@@ -662,7 +632,7 @@ static void MAIN_Key_STAR(bool bKeyPressed, bool bKeyHeld)
{ {
#ifdef ENABLE_NOAA #ifdef ENABLE_NOAA
if (gScanStateDir == SCAN_OFF && IS_NOT_NOAA_CHANNEL(gTxVfo->CHANNEL_SAVE)) if (gScanStateDir == SCAN_OFF && !IS_NOAA_CHANNEL(gTxVfo->CHANNEL_SAVE))
#else #else
if (gScanStateDir == SCAN_OFF) if (gScanStateDir == SCAN_OFF)
#endif #endif
@@ -740,7 +710,7 @@ static void MAIN_Key_UP_DOWN(bool bKeyPressed, bool bKeyHeld, int8_t Direction)
if (gScanStateDir == SCAN_OFF) if (gScanStateDir == SCAN_OFF)
{ {
#ifdef ENABLE_NOAA #ifdef ENABLE_NOAA
if (IS_NOT_NOAA_CHANNEL(Channel)) if (!IS_NOAA_CHANNEL(Channel))
#endif #endif
{ {
uint8_t Next; uint8_t Next;
@@ -794,7 +764,7 @@ static void MAIN_Key_UP_DOWN(bool bKeyPressed, bool bKeyHeld, int8_t Direction)
} }
// jump to the next channel // jump to the next channel
SCANNER_NextChannel(false, Direction); SCANNER_ScanChannels(false, Direction);
gScanPauseDelayIn_10ms = 1; gScanPauseDelayIn_10ms = 1;
gScheduleScanListen = false; gScheduleScanListen = false;

View File

@@ -117,6 +117,16 @@ int MENU_GetLimits(uint8_t menu_id, int32_t *pMin, int32_t *pMax)
*pMax = ARRAY_SIZE(gSubMenu_BACKLIGHT) - 1; *pMax = ARRAY_SIZE(gSubMenu_BACKLIGHT) - 1;
break; break;
case MENU_ABR_MIN:
*pMin = 0;
*pMax = 9;
break;
case MENU_ABR_MAX:
*pMin = 1;
*pMax = 10;
break;
case MENU_F_LOCK: case MENU_F_LOCK:
*pMin = 0; *pMin = 0;
*pMax = ARRAY_SIZE(gSubMenu_F_LOCK) - 1; *pMax = ARRAY_SIZE(gSubMenu_F_LOCK) - 1;
@@ -516,7 +526,17 @@ void MENU_AcceptSetting(void)
#endif #endif
case MENU_ABR: case MENU_ABR:
gEeprom.BACKLIGHT = gSubMenuSelection; gEeprom.BACKLIGHT_TIME = gSubMenuSelection;
break;
case MENU_ABR_MIN:
gEeprom.BACKLIGHT_MIN = gSubMenuSelection;
gEeprom.BACKLIGHT_MAX = MAX(gSubMenuSelection + 1 , gEeprom.BACKLIGHT_MAX);
break;
case MENU_ABR_MAX:
gEeprom.BACKLIGHT_MAX = gSubMenuSelection;
gEeprom.BACKLIGHT_MIN = MIN(gSubMenuSelection - 1, gEeprom.BACKLIGHT_MIN);
break; break;
case MENU_ABR_ON_TX_RX: case MENU_ABR_ON_TX_RX:
@@ -934,17 +954,22 @@ void MENU_ShowCurrentSetting(void)
gSubMenuSelection = gEeprom.BATTERY_SAVE; gSubMenuSelection = gEeprom.BATTERY_SAVE;
break; break;
#ifdef ENABLE_VOX #ifdef ENABLE_VOX
case MENU_VOX: case MENU_VOX:
gSubMenuSelection = gEeprom.VOX_SWITCH ? gEeprom.VOX_LEVEL + 1 : 0; gSubMenuSelection = gEeprom.VOX_SWITCH ? gEeprom.VOX_LEVEL + 1 : 0;
break; break;
#endif #endif
case MENU_ABR: case MENU_ABR:
gSubMenuSelection = gEeprom.BACKLIGHT; gSubMenuSelection = gEeprom.BACKLIGHT_TIME;
break;
gBacklightCountdown = 0; case MENU_ABR_MIN:
GPIO_SetBit(&GPIOB->DATA, GPIOB_PIN_BACKLIGHT); // turn the backlight ON while in backlight menu gSubMenuSelection = gEeprom.BACKLIGHT_MIN;
break;
case MENU_ABR_MAX:
gSubMenuSelection = gEeprom.BACKLIGHT_MAX;
break; break;
case MENU_ABR_ON_TX_RX: case MENU_ABR_ON_TX_RX:
@@ -963,11 +988,11 @@ void MENU_ShowCurrentSetting(void)
gSubMenuSelection = gEeprom.TX_TIMEOUT_TIMER; gSubMenuSelection = gEeprom.TX_TIMEOUT_TIMER;
break; break;
#ifdef ENABLE_VOICE #ifdef ENABLE_VOICE
case MENU_VOICE: case MENU_VOICE:
gSubMenuSelection = gEeprom.VOICE_PROMPT; gSubMenuSelection = gEeprom.VOICE_PROMPT;
break; break;
#endif #endif
case MENU_SC_REV: case MENU_SC_REV:
gSubMenuSelection = gEeprom.SCAN_RESUME_MODE; gSubMenuSelection = gEeprom.SCAN_RESUME_MODE;
@@ -1001,11 +1026,11 @@ void MENU_ShowCurrentSetting(void)
gSubMenuSelection = gEeprom.MIC_SENSITIVITY; gSubMenuSelection = gEeprom.MIC_SENSITIVITY;
break; break;
#ifdef ENABLE_AUDIO_BAR #ifdef ENABLE_AUDIO_BAR
case MENU_MIC_BAR: case MENU_MIC_BAR:
gSubMenuSelection = gSetting_mic_bar; gSubMenuSelection = gSetting_mic_bar;
break; break;
#endif #endif
case MENU_COMPAND: case MENU_COMPAND:
gSubMenuSelection = gTxVfo->Compander; gSubMenuSelection = gTxVfo->Compander;
@@ -1081,11 +1106,11 @@ void MENU_ShowCurrentSetting(void)
gSubMenuSelection = gTxVfo->AM_mode; gSubMenuSelection = gTxVfo->AM_mode;
break; break;
#ifdef ENABLE_AM_FIX #ifdef ENABLE_AM_FIX
case MENU_AM_FIX: case MENU_AM_FIX:
gSubMenuSelection = gSetting_AM_fix; gSubMenuSelection = gSetting_AM_fix;
break; break;
#endif #endif
#ifdef ENABLE_AM_FIX_TEST1 #ifdef ENABLE_AM_FIX_TEST1
case MENU_AM_FIX_TEST1: case MENU_AM_FIX_TEST1:
@@ -1267,8 +1292,8 @@ static void MENU_Key_0_to_9(KEY_Code_t Key, bool bKeyPressed, bool bKeyHeld)
gAnotherVoiceID = (VOICE_ID_t)Key; gAnotherVoiceID = (VOICE_ID_t)Key;
#endif #endif
Frequency = StrToUL(INPUTBOX_GetAscii()); Frequency = StrToUL(INPUTBOX_GetAscii())*100;
gSubMenuSelection = FREQUENCY_FloorToStep(Frequency + 75, gTxVfo->StepFrequency, 0); gSubMenuSelection = FREQUENCY_RoundToStep(Frequency, gTxVfo->StepFrequency);
gInputBoxIndex = 0; gInputBoxIndex = 0;
return; return;
@@ -1293,7 +1318,7 @@ static void MENU_Key_0_to_9(KEY_Code_t Key, bool bKeyPressed, bool bKeyHeld)
Value = ((gInputBox[0] * 100) + (gInputBox[1] * 10) + gInputBox[2]) - 1; Value = ((gInputBox[0] * 100) + (gInputBox[1] * 10) + gInputBox[2]) - 1;
if (Value <= MR_CHANNEL_LAST) if (IS_MR_CHANNEL(Value))
{ {
#ifdef ENABLE_VOICE #ifdef ENABLE_VOICE
gAnotherVoiceID = (VOICE_ID_t)Key; gAnotherVoiceID = (VOICE_ID_t)Key;
@@ -1377,10 +1402,9 @@ static void MENU_Key_EXIT(bool bKeyPressed, bool bKeyHeld)
gRequestDisplayScreen = DISPLAY_MAIN; gRequestDisplayScreen = DISPLAY_MAIN;
if (gEeprom.BACKLIGHT == 0) if (gEeprom.BACKLIGHT_TIME == 0) // backlight set to always off
{ {
gBacklightCountdown = 0; BACKLIGHT_TurnOff(); // turn the backlight OFF
GPIO_ClearBit(&GPIOB->DATA, GPIOB_PIN_BACKLIGHT); // turn the backlight OFF
} }
} }
else else
@@ -1566,7 +1590,7 @@ static void MENU_Key_STAR(const bool bKeyPressed, const bool bKeyHeld)
RADIO_SelectVfos(); RADIO_SelectVfos();
#ifdef ENABLE_NOAA #ifdef ENABLE_NOAA
if (IS_NOT_NOAA_CHANNEL(gRxVfo->CHANNEL_SAVE) && gRxVfo->AM_mode == 0) if (!IS_NOAA_CHANNEL(gRxVfo->CHANNEL_SAVE) && gRxVfo->AM_mode == 0)
#else #else
if (gRxVfo->AM_mode == 0) if (gRxVfo->AM_mode == 0)
#endif #endif
@@ -1658,10 +1682,9 @@ static void MENU_Key_UP_DOWN(bool bKeyPressed, bool bKeyHeld, int8_t Direction)
gRequestDisplayScreen = DISPLAY_MENU; gRequestDisplayScreen = DISPLAY_MENU;
if (GetCurrentMenuId() != MENU_ABR && gEeprom.BACKLIGHT == 0) if (GetCurrentMenuId() != MENU_ABR && gEeprom.BACKLIGHT_TIME == 0) // backlight always off and not in the backlight menu
{ {
gBacklightCountdown = 0; BACKLIGHT_TurnOff();
GPIO_ClearBit(&GPIOB->DATA, GPIOB_PIN_BACKLIGHT); // turn the backlight OFF
} }
return; return;
@@ -1678,7 +1701,7 @@ static void MENU_Key_UP_DOWN(bool bKeyPressed, bool bKeyHeld, int8_t Direction)
else else
Offset = 0; Offset = 0;
gSubMenuSelection = FREQUENCY_FloorToStep(Offset, gTxVfo->StepFrequency, 0); gSubMenuSelection = FREQUENCY_RoundToStep(Offset, gTxVfo->StepFrequency);
gRequestDisplayScreen = DISPLAY_MENU; gRequestDisplayScreen = DISPLAY_MENU;
return; return;
} }

View File

@@ -43,9 +43,21 @@ uint8_t gScanProgressIndicator;
uint8_t gScanHitCount; uint8_t gScanHitCount;
bool gScanUseCssResult; bool gScanUseCssResult;
int8_t gScanStateDir; int8_t gScanStateDir;
bool bScanKeepFrequency; bool gScanKeepResult;
uint8_t gRestoreMrChannel;
uint8_t gRestoreCROSS_BAND_RX_TX; typedef enum {
SCAN_NEXT_CHAN_SCANLIST1 = 0,
SCAN_NEXT_CHAN_SCANLIST2,
SCAN_NEXT_CHAN_DUAL_WATCH,
SCAN_NEXT_CHAN_MR,
SCAN_NEXT_NUM
} scan_next_chan_t;
scan_next_chan_t currentScanList;
uint32_t initialFrqOrChan;
uint8_t initialCROSS_BAND_RX_TX;
uint32_t lastFoundFrqOrChan;
static void SCANNER_Key_DIGITS(KEY_Code_t Key, bool bKeyPressed, bool bKeyHeld) static void SCANNER_Key_DIGITS(KEY_Code_t Key, bool bKeyPressed, bool bKeyHeld)
{ {
@@ -72,7 +84,7 @@ static void SCANNER_Key_DIGITS(KEY_Code_t Key, bool bKeyPressed, bool bKeyHeld)
gInputBoxIndex = 0; gInputBoxIndex = 0;
Channel = ((gInputBox[0] * 100) + (gInputBox[1] * 10) + gInputBox[2]) - 1; Channel = ((gInputBox[0] * 100) + (gInputBox[1] * 10) + gInputBox[2]) - 1;
if (Channel <= MR_CHANNEL_LAST) if (IS_MR_CHANNEL(Channel))
{ {
#ifdef ENABLE_VOICE #ifdef ENABLE_VOICE
gAnotherVoiceID = (VOICE_ID_t)Key; gAnotherVoiceID = (VOICE_ID_t)Key;
@@ -167,38 +179,23 @@ static void SCANNER_Key_MENU(bool bKeyPressed, bool bKeyHeld)
case 0: case 0:
if (!gScanSingleFrequency) if (!gScanSingleFrequency)
{ {
int16_t Delta625; uint32_t freq250 = FREQUENCY_RoundToStep(gScanFrequency, 250);
uint32_t Freq250 = FREQUENCY_FloorToStep(gScanFrequency, 250, 0); uint32_t freq625 = FREQUENCY_RoundToStep(gScanFrequency, 625);
uint32_t Freq625 = FREQUENCY_FloorToStep(gScanFrequency, 625, 0);
int16_t Delta250 = (int16_t)gScanFrequency - (int16_t)Freq250;
if (125 < Delta250) uint32_t diff250 = gScanFrequency > freq250 ? gScanFrequency - freq250 : freq250 - gScanFrequency;
{ uint32_t diff625 = gScanFrequency > freq625 ? gScanFrequency - freq625 : freq625 - gScanFrequency;
Delta250 = 250 - Delta250;
Freq250 += 250;
}
Delta625 = (int16_t)gScanFrequency - (int16_t)Freq625; if(diff250 > diff625) {
if (312 < Delta625)
{
Delta625 = 625 - Delta625;
Freq625 += 625;
}
if (Delta625 < Delta250)
{
gStepSetting = STEP_6_25kHz; gStepSetting = STEP_6_25kHz;
gScanFrequency = Freq625; gScanFrequency = freq625;
} }
else else {
{
gStepSetting = STEP_2_5kHz; gStepSetting = STEP_2_5kHz;
gScanFrequency = Freq250; gScanFrequency = freq250;
} }
} }
if (gTxVfo->CHANNEL_SAVE <= MR_CHANNEL_LAST) if (IS_MR_CHANNEL(gTxVfo->CHANNEL_SAVE))
{ {
gScannerEditState = 1; gScannerEditState = 1;
gScanChannel = gTxVfo->CHANNEL_SAVE; gScanChannel = gTxVfo->CHANNEL_SAVE;
@@ -252,7 +249,7 @@ static void SCANNER_Key_MENU(bool bKeyPressed, bool bKeyHeld)
gTxVfo->freq_config_TX.Code = gScanCssResultCode; gTxVfo->freq_config_TX.Code = gScanCssResultCode;
} }
if (gTxVfo->CHANNEL_SAVE <= MR_CHANNEL_LAST) if (IS_MR_CHANNEL(gTxVfo->CHANNEL_SAVE))
{ {
Channel = gScanChannel; Channel = gScanChannel;
gEeprom.MrChannel[gEeprom.TX_VFO] = Channel; gEeprom.MrChannel[gEeprom.TX_VFO] = Channel;
@@ -425,49 +422,72 @@ void SCANNER_Start(void)
gScanProgressIndicator = 0; gScanProgressIndicator = 0;
} }
void SCANNER_Found()
{
switch (gEeprom.SCAN_RESUME_MODE)
{
case SCAN_RESUME_TO:
if (!gScanPauseMode)
{
gScanPauseDelayIn_10ms = scan_pause_delay_in_1_10ms;
gScheduleScanListen = false;
gScanPauseMode = true;
}
break;
case SCAN_RESUME_CO:
case SCAN_RESUME_SE:
gScanPauseDelayIn_10ms = 0;
gScheduleScanListen = false;
break;
}
if (IS_MR_CHANNEL(gRxVfo->CHANNEL_SAVE)) { //memory scan
lastFoundFrqOrChan = gRxVfo->CHANNEL_SAVE;
}
else { // frequency scan
lastFoundFrqOrChan = gRxVfo->freq_config_RX.Frequency;
}
gScanKeepResult = true;
}
void SCANNER_Stop(void) void SCANNER_Stop(void)
{ {
if(gRestoreCROSS_BAND_RX_TX != CROSS_BAND_OFF) { if(initialCROSS_BAND_RX_TX != CROSS_BAND_OFF) {
gEeprom.CROSS_BAND_RX_TX = gRestoreCROSS_BAND_RX_TX; gEeprom.CROSS_BAND_RX_TX = initialCROSS_BAND_RX_TX;
gRestoreCROSS_BAND_RX_TX = CROSS_BAND_OFF; initialCROSS_BAND_RX_TX = CROSS_BAND_OFF;
} }
gScanStateDir = SCAN_OFF; gScanStateDir = SCAN_OFF;
if (!bScanKeepFrequency) const uint32_t chFr = gScanKeepResult ? lastFoundFrqOrChan : initialFrqOrChan;
{ const bool channelChanged = chFr != initialFrqOrChan;
if (gNextMrChannel <= MR_CHANNEL_LAST) if (IS_MR_CHANNEL(gNextMrChannel)) {
{ gEeprom.MrChannel[gEeprom.RX_VFO] = chFr;
gEeprom.MrChannel[gEeprom.RX_VFO] = gRestoreMrChannel; gEeprom.ScreenChannel[gEeprom.RX_VFO] = chFr;
gEeprom.ScreenChannel[gEeprom.RX_VFO] = gRestoreMrChannel;
RADIO_ConfigureChannel(gEeprom.RX_VFO, VFO_CONFIGURE_RELOAD); RADIO_ConfigureChannel(gEeprom.RX_VFO, VFO_CONFIGURE_RELOAD);
if(channelChanged) {
SETTINGS_SaveVfoIndices();
gUpdateStatus = true;
} }
else }
{ else {
gRxVfo->freq_config_RX.Frequency = gRestoreFrequency; gRxVfo->freq_config_RX.Frequency = chFr;
RADIO_ApplyOffset(gRxVfo); RADIO_ApplyOffset(gRxVfo);
RADIO_ConfigureSquelchAndOutputPower(gRxVfo); RADIO_ConfigureSquelchAndOutputPower(gRxVfo);
if(channelChanged) {
SETTINGS_SaveChannel(gRxVfo->CHANNEL_SAVE, gEeprom.RX_VFO, gRxVfo, 1);
} }
}
RADIO_SetupRegisters(true); RADIO_SetupRegisters(true);
gUpdateDisplay = true; gUpdateDisplay = true;
return;
}
if (gRxVfo->CHANNEL_SAVE > MR_CHANNEL_LAST)
{
RADIO_ApplyOffset(gRxVfo);
RADIO_ConfigureSquelchAndOutputPower(gRxVfo);
SETTINGS_SaveChannel(gRxVfo->CHANNEL_SAVE, gEeprom.RX_VFO, gRxVfo, 1);
return;
}
SETTINGS_SaveVfoIndices();
gUpdateStatus = true;
} }
static void SCANNER_NextFreqChannel(void) static void NextFreqChannel(void)
{ {
gRxVfo->freq_config_RX.Frequency = APP_SetFrequencyByStep(gRxVfo, gScanStateDir); gRxVfo->freq_config_RX.Frequency = APP_SetFrequencyByStep(gRxVfo, gScanStateDir);
@@ -481,11 +501,10 @@ static void SCANNER_NextFreqChannel(void)
gScanPauseDelayIn_10ms = scan_pause_delay_in_6_10ms; gScanPauseDelayIn_10ms = scan_pause_delay_in_6_10ms;
#endif #endif
bScanKeepFrequency = false;
gUpdateDisplay = true; gUpdateDisplay = true;
} }
static void SCANNER_NextMemChannel(void) static void NextMemChannel(void)
{ {
static unsigned int prev_mr_chan = 0; static unsigned int prev_mr_chan = 0;
const bool enabled = (gEeprom.SCAN_LIST_DEFAULT < 2) ? gEeprom.SCAN_LIST_ENABLED[gEeprom.SCAN_LIST_DEFAULT] : true; const bool enabled = (gEeprom.SCAN_LIST_DEFAULT < 2) ? gEeprom.SCAN_LIST_ENABLED[gEeprom.SCAN_LIST_DEFAULT] : true;
@@ -496,7 +515,7 @@ static void SCANNER_NextMemChannel(void)
if (enabled) if (enabled)
{ {
switch (gCurrentScanList) switch (currentScanList)
{ {
case SCAN_NEXT_CHAN_SCANLIST1: case SCAN_NEXT_CHAN_SCANLIST1:
prev_mr_chan = gNextMrChannel; prev_mr_chan = gNextMrChannel;
@@ -505,7 +524,7 @@ static void SCANNER_NextMemChannel(void)
{ {
if (RADIO_CheckValidChannel(chan1, false, 0)) if (RADIO_CheckValidChannel(chan1, false, 0))
{ {
gCurrentScanList = SCAN_NEXT_CHAN_SCANLIST1; currentScanList = SCAN_NEXT_CHAN_SCANLIST1;
gNextMrChannel = chan1; gNextMrChannel = chan1;
break; break;
} }
@@ -516,7 +535,7 @@ static void SCANNER_NextMemChannel(void)
{ {
if (RADIO_CheckValidChannel(chan2, false, 0)) if (RADIO_CheckValidChannel(chan2, false, 0))
{ {
gCurrentScanList = SCAN_NEXT_CHAN_SCANLIST2; currentScanList = SCAN_NEXT_CHAN_SCANLIST2;
gNextMrChannel = chan2; gNextMrChannel = chan2;
break; break;
} }
@@ -530,9 +549,9 @@ static void SCANNER_NextMemChannel(void)
// { // {
// chan = (gEeprom.RX_VFO + 1) & 1u; // chan = (gEeprom.RX_VFO + 1) & 1u;
// chan = gEeprom.ScreenChannel[chan]; // chan = gEeprom.ScreenChannel[chan];
// if (chan <= MR_CHANNEL_LAST) // if (IS_MR_CHANNEL(chan))
// { // {
// gCurrentScanList = SCAN_NEXT_CHAN_DUAL_WATCH; // currentScanList = SCAN_NEXT_CHAN_DUAL_WATCH;
// gNextMrChannel = chan; // gNextMrChannel = chan;
// break; // break;
// } // }
@@ -540,7 +559,7 @@ static void SCANNER_NextMemChannel(void)
default: default:
case SCAN_NEXT_CHAN_MR: case SCAN_NEXT_CHAN_MR:
gCurrentScanList = SCAN_NEXT_CHAN_MR; currentScanList = SCAN_NEXT_CHAN_MR;
gNextMrChannel = prev_mr_chan; gNextMrChannel = prev_mr_chan;
chan = 0xff; chan = 0xff;
break; break;
@@ -552,9 +571,7 @@ static void SCANNER_NextMemChannel(void)
chan = RADIO_FindNextChannel(gNextMrChannel + gScanStateDir, gScanStateDir, (gEeprom.SCAN_LIST_DEFAULT < 2) ? true : false, gEeprom.SCAN_LIST_DEFAULT); chan = RADIO_FindNextChannel(gNextMrChannel + gScanStateDir, gScanStateDir, (gEeprom.SCAN_LIST_DEFAULT < 2) ? true : false, gEeprom.SCAN_LIST_DEFAULT);
if (chan == 0xFF) if (chan == 0xFF)
{ // no valid channel found { // no valid channel found
chan = MR_CHANNEL_FIRST; chan = MR_CHANNEL_FIRST;
// return;
} }
gNextMrChannel = chan; gNextMrChannel = chan;
@@ -577,44 +594,46 @@ static void SCANNER_NextMemChannel(void)
gScanPauseDelayIn_10ms = scan_pause_delay_in_3_10ms; gScanPauseDelayIn_10ms = scan_pause_delay_in_3_10ms;
#endif #endif
bScanKeepFrequency = false;
if (enabled) if (enabled)
if (++gCurrentScanList >= SCAN_NEXT_NUM) if (++currentScanList >= SCAN_NEXT_NUM)
gCurrentScanList = SCAN_NEXT_CHAN_SCANLIST1; // back round we go currentScanList = SCAN_NEXT_CHAN_SCANLIST1; // back round we go
} }
void SCANNER_NextChannel(const bool storeBackupSettings, const int8_t scan_direction) void SCANNER_ScanChannels(const bool storeBackupSettings, const int8_t scan_direction)
{ {
if (storeBackupSettings) { if (storeBackupSettings) {
gRestoreCROSS_BAND_RX_TX = gEeprom.CROSS_BAND_RX_TX; initialCROSS_BAND_RX_TX = gEeprom.CROSS_BAND_RX_TX;
gEeprom.CROSS_BAND_RX_TX = CROSS_BAND_OFF; gEeprom.CROSS_BAND_RX_TX = CROSS_BAND_OFF;
gScanKeepResult = false;
} }
RADIO_SelectVfos(); RADIO_SelectVfos();
gNextMrChannel = gRxVfo->CHANNEL_SAVE; gNextMrChannel = gRxVfo->CHANNEL_SAVE;
gCurrentScanList = SCAN_NEXT_CHAN_SCANLIST1; currentScanList = SCAN_NEXT_CHAN_SCANLIST1;
gScanStateDir = scan_direction; gScanStateDir = scan_direction;
if (gNextMrChannel <= MR_CHANNEL_LAST) if (IS_MR_CHANNEL(gNextMrChannel))
{ // channel mode { // channel mode
if (storeBackupSettings) if (storeBackupSettings) {
gRestoreMrChannel = gNextMrChannel; initialFrqOrChan = gRxVfo->CHANNEL_SAVE;
SCANNER_NextMemChannel(); lastFoundFrqOrChan = initialFrqOrChan;
}
NextMemChannel();
} }
else else
{ // frequency mode { // frequency mode
if (storeBackupSettings) if (storeBackupSettings) {
gRestoreFrequency = gRxVfo->freq_config_RX.Frequency; initialFrqOrChan = gRxVfo->freq_config_RX.Frequency;
SCANNER_NextFreqChannel(); lastFoundFrqOrChan = initialFrqOrChan;
}
NextFreqChannel();
} }
gScanPauseDelayIn_10ms = scan_pause_delay_in_2_10ms; gScanPauseDelayIn_10ms = scan_pause_delay_in_2_10ms;
gScheduleScanListen = false; gScheduleScanListen = false;
gRxReceptionMode = RX_MODE_NONE; gRxReceptionMode = RX_MODE_NONE;
gScanPauseMode = false; gScanPauseMode = false;
bScanKeepFrequency = false;
} }
void SCANNER_ContinueScanning() void SCANNER_ContinueScanning()
@@ -624,14 +643,14 @@ void SCANNER_ContinueScanning()
if (gCurrentFunction == FUNCTION_INCOMING) if (gCurrentFunction == FUNCTION_INCOMING)
APP_StartListening(gMonitor ? FUNCTION_MONITOR : FUNCTION_RECEIVE, true); APP_StartListening(gMonitor ? FUNCTION_MONITOR : FUNCTION_RECEIVE, true);
else else
SCANNER_NextFreqChannel(); // switch to next frequency NextFreqChannel(); // switch to next frequency
} }
else else
{ {
if (gCurrentCodeType == CODE_TYPE_OFF && gCurrentFunction == FUNCTION_INCOMING) if (gCurrentCodeType == CODE_TYPE_OFF && gCurrentFunction == FUNCTION_INCOMING)
APP_StartListening(gMonitor ? FUNCTION_MONITOR : FUNCTION_RECEIVE, true); APP_StartListening(gMonitor ? FUNCTION_MONITOR : FUNCTION_RECEIVE, true);
else else
SCANNER_NextMemChannel(); // switch to next channel NextMemChannel(); // switch to next channel
} }
gScanPauseMode = false; gScanPauseMode = false;

View File

@@ -53,12 +53,13 @@ extern uint8_t gScanProgressIndicator;
extern uint8_t gScanHitCount; extern uint8_t gScanHitCount;
extern bool gScanUseCssResult; extern bool gScanUseCssResult;
extern int8_t gScanStateDir; extern int8_t gScanStateDir;
extern bool bScanKeepFrequency; extern bool gScanKeepResult;
void SCANNER_ProcessKeys(KEY_Code_t Key, bool bKeyPressed, bool bKeyHeld); void SCANNER_ProcessKeys(KEY_Code_t Key, bool bKeyPressed, bool bKeyHeld);
void SCANNER_Start(void); void SCANNER_Start(void);
void SCANNER_Found();
void SCANNER_Stop(void); void SCANNER_Stop(void);
void SCANNER_NextChannel(const bool storeBackupSettings, const int8_t scan_direction); void SCANNER_ScanChannels(const bool storeBackupSettings, const int8_t scan_direction);
void SCANNER_ContinueScanning(); void SCANNER_ContinueScanning();
#endif #endif

View File

@@ -14,7 +14,8 @@
* limitations under the License. * limitations under the License.
*/ */
#include "../app/spectrum.h" #include "app/spectrum.h"
#include "driver/backlight.h"
struct FrequencyBandInfo { struct FrequencyBandInfo {
uint32_t lower; uint32_t lower;
@@ -493,9 +494,9 @@ static void ToggleListeningBW() {
static void ToggleBacklight() { static void ToggleBacklight() {
settings.backlightState = !settings.backlightState; settings.backlightState = !settings.backlightState;
if (settings.backlightState) { if (settings.backlightState) {
GPIO_SetBit(&GPIOB->DATA, GPIOB_PIN_BACKLIGHT); BACKLIGHT_TurnOn();
} else { } else {
GPIO_ClearBit(&GPIOB->DATA, GPIOB_PIN_BACKLIGHT); BACKLIGHT_TurnOff();
} }
} }

View File

@@ -27,6 +27,7 @@
#include "bsp/dp32g030/dma.h" #include "bsp/dp32g030/dma.h"
#include "bsp/dp32g030/gpio.h" #include "bsp/dp32g030/gpio.h"
#include "driver/aes.h" #include "driver/aes.h"
#include "driver/backlight.h"
#include "driver/bk4819.h" #include "driver/bk4819.h"
#include "driver/crc.h" #include "driver/crc.h"
#include "driver/eeprom.h" #include "driver/eeprom.h"
@@ -238,7 +239,7 @@ static void CMD_0514(const uint8_t *pBuffer)
gSerialConfigCountDown_500ms = 12; // 6 sec gSerialConfigCountDown_500ms = 12; // 6 sec
// turn the LCD backlight off // turn the LCD backlight off
GPIO_ClearBit(&GPIOB->DATA, GPIOB_PIN_BACKLIGHT); BACKLIGHT_TurnOff();
SendVersion(); SendVersion();
} }
@@ -413,7 +414,7 @@ static void CMD_052F(const uint8_t *pBuffer)
Timestamp = pCmd->Timestamp; Timestamp = pCmd->Timestamp;
// turn the LCD backlight off // turn the LCD backlight off
GPIO_ClearBit(&GPIOB->DATA, GPIOB_PIN_BACKLIGHT); BACKLIGHT_TurnOff();
SendVersion(); SendVersion();
} }

29
board.c
View File

@@ -23,6 +23,7 @@
#include "board.h" #include "board.h"
#include "bsp/dp32g030/gpio.h" #include "bsp/dp32g030/gpio.h"
#include "bsp/dp32g030/portcon.h" #include "bsp/dp32g030/portcon.h"
#include "bsp/dp32g030/pwmplus.h"
#include "bsp/dp32g030/saradc.h" #include "bsp/dp32g030/saradc.h"
#include "bsp/dp32g030/syscon.h" #include "bsp/dp32g030/syscon.h"
#include "driver/adc.h" #include "driver/adc.h"
@@ -94,8 +95,6 @@ void BOARD_GPIO_Init(void)
| GPIO_DIR_6_MASK // INPUT | GPIO_DIR_6_MASK // INPUT
); );
GPIOB->DIR |= 0 GPIOB->DIR |= 0
// Back light
| GPIO_DIR_6_BITS_OUTPUT
// ST7565 // ST7565
| GPIO_DIR_9_BITS_OUTPUT | GPIO_DIR_9_BITS_OUTPUT
// ST7565 + SWD IO // ST7565 + SWD IO
@@ -189,8 +188,8 @@ void BOARD_PORTCON_Init(void)
| PORTCON_PORTB_SEL0_B7_MASK | PORTCON_PORTB_SEL0_B7_MASK
); );
PORTCON_PORTB_SEL0 |= 0 PORTCON_PORTB_SEL0 |= 0
// Back light // Back light PWM
| PORTCON_PORTB_SEL0_B6_BITS_GPIOB6 | PORTCON_PORTB_SEL0_B6_BITS_PWMP0_CH0
// SPI0 SSN // SPI0 SSN
| PORTCON_PORTB_SEL0_B7_BITS_SPI0_SSN | PORTCON_PORTB_SEL0_B7_BITS_SPI0_SSN
; ;
@@ -471,6 +470,23 @@ void BOARD_PORTCON_Init(void)
; ;
} }
static void BacklightPWM_Init()
{
// 48MHz / 94 / 1024 ~ 500Hz
PWM_PLUS0_CLKSRC |= ((94) << 16);
PWM_PLUS0_PERIOD = 1023;
PWM_PLUS0_GEN =
PWMPLUS_GEN_CH0_OE_BITS_ENABLE |
PWMPLUS_GEN_CH0_OUTINV_BITS_ENABLE |
0;
PWM_PLUS0_CFG =
PWMPLUS_CFG_CNT_REP_BITS_ENABLE |
PWMPLUS_CFG_COUNTER_EN_BITS_ENABLE |
0;
}
void BOARD_ADC_Init(void) void BOARD_ADC_Init(void)
{ {
ADC_Config_t Config; ADC_Config_t Config;
@@ -508,6 +524,7 @@ void BOARD_Init(void)
{ {
BOARD_PORTCON_Init(); BOARD_PORTCON_Init();
BOARD_GPIO_Init(); BOARD_GPIO_Init();
BacklightPWM_Init();
BOARD_ADC_Init(); BOARD_ADC_Init();
ST7565_Init(true); ST7565_Init(true);
#ifdef ENABLE_FMRADIO #ifdef ENABLE_FMRADIO
@@ -540,11 +557,13 @@ void BOARD_EEPROM_Init(void)
// 0E78..0E7F // 0E78..0E7F
EEPROM_ReadBuffer(0x0E78, Data, 8); EEPROM_ReadBuffer(0x0E78, Data, 8);
gEeprom.BACKLIGHT_MAX = (Data[0] & 0xF) <= 10 ? (Data[0] & 0xF) : 10;
gEeprom.BACKLIGHT_MIN = (Data[0] >> 4) < gEeprom.BACKLIGHT_MAX ? (Data[0] >> 4) : 0;
gEeprom.CHANNEL_DISPLAY_MODE = (Data[1] < 4) ? Data[1] : MDF_FREQUENCY; // 4 instead of 3 - extra display mode gEeprom.CHANNEL_DISPLAY_MODE = (Data[1] < 4) ? Data[1] : MDF_FREQUENCY; // 4 instead of 3 - extra display mode
gEeprom.CROSS_BAND_RX_TX = (Data[2] < 3) ? Data[2] : CROSS_BAND_OFF; gEeprom.CROSS_BAND_RX_TX = (Data[2] < 3) ? Data[2] : CROSS_BAND_OFF;
gEeprom.BATTERY_SAVE = (Data[3] < 5) ? Data[3] : 4; gEeprom.BATTERY_SAVE = (Data[3] < 5) ? Data[3] : 4;
gEeprom.DUAL_WATCH = (Data[4] < 3) ? Data[4] : DUAL_WATCH_CHAN_A; gEeprom.DUAL_WATCH = (Data[4] < 3) ? Data[4] : DUAL_WATCH_CHAN_A;
gEeprom.BACKLIGHT = (Data[5] < ARRAY_SIZE(gSubMenu_BACKLIGHT)) ? Data[5] : 3; gEeprom.BACKLIGHT_TIME = (Data[5] < ARRAY_SIZE(gSubMenu_BACKLIGHT)) ? Data[5] : 3;
gEeprom.TAIL_NOTE_ELIMINATION = (Data[6] < 2) ? Data[6] : false; gEeprom.TAIL_NOTE_ELIMINATION = (Data[6] < 2) ? Data[6] : false;
gEeprom.VFO_OPEN = (Data[7] < 2) ? Data[7] : true; gEeprom.VFO_OPEN = (Data[7] < 2) ? Data[7] : true;

146
bsp/dp32g030/pwmplus.h Normal file
View File

@@ -0,0 +1,146 @@
#ifndef HARDWARE_DP32G030_PWMPLUS_H
#define HARDWARE_DP32G030_PWMPLUS_H
#define PWM_PLUS0_BASE_ADDR 0x400B4000U
//---------------
#define PWMPLUS_CFG 0x00U
#define PWMPLUS_CFG_COUNTER_EN_SHIFT 0U
#define PWMPLUS_CFG_COUNTER_EN_WIDTH 1U
#define PWMPLUS_CFG_COUNTER_EN_MASK (((1U << PWMPLUS_CFG_COUNTER_EN_WIDTH) - 1U) << PWMPLUS_CFG_COUNTER_EN_SHIFT)
#define PWMPLUS_CFG_COUNTER_EN_VALUE_ENABLE 1U
#define PWMPLUS_CFG_COUNTER_EN_BITS_ENABLE (PWMPLUS_CFG_COUNTER_EN_VALUE_ENABLE << PWMPLUS_CFG_COUNTER_EN_SHIFT)
#define PWMPLUS_CFG_CNT_TYPE_SHIFT 1U
#define PWMPLUS_CFG_CNT_REP_SHIFT 2U
#define PWMPLUS_CFG_CNT_REP_WIDTH 1U
#define PWMPLUS_CFG_CNT_REP_VALUE_ENABLE 1U
#define PWMPLUS_CFG_CNT_REP_BITS_ENABLE (PWMPLUS_CFG_CNT_REP_VALUE_ENABLE << PWMPLUS_CFG_CNT_REP_SHIFT)
#define PWMPLUS_CFG_OUT_MODE_SHIFT 3U
#define PWMPLUS_CFG_OUT_MODE_VALUE_ENABLE 1U
#define PWMPLUS_CFG_OUT_MODE_BITS_ENABLE (PWMPLUS_CFG_OUT_MODE_VALUE_ENABLE << PWMPLUS_CFG_OUT_MODE_SHIFT)
#define PWMPLUS_CFG_AUTO_RELOAD_SHIFT 8U
//---------------
#define PWMPLUS_GEN 0x04U
#define PWMPLUS_GEN_CH0_OE_SHIFT 24U
#define PWMPLUS_GEN_CH0_OE_WIDTH 1U
#define PWMPLUS_GEN_CH0_OE_VALUE_ENABLE 1U
#define PWMPLUS_GEN_CH0_OE_BITS_ENABLE (PWMPLUS_GEN_CH0_OE_VALUE_ENABLE << PWMPLUS_GEN_CH0_OE_SHIFT)
#define PWMPLUS_GEN_CH0_OUTINV_SHIFT 16U
#define PWMPLUS_GEN_CH0_OUTINV_WIDTH 1U
#define PWMPLUS_GEN_CH0_OUTINV_VALUE_ENABLE 1U
#define PWMPLUS_GEN_CH0_OUTINV_BITS_ENABLE (PWMPLUS_GEN_CH0_OUTINV_VALUE_ENABLE << PWMPLUS_GEN_CH0_OUTINV_SHIFT)
#define PWMPLUS_GEN_CH0_START_SHIFT 8U
#define PWMPLUS_GEN_CH0_START_WIDTH 1U
#define PWMPLUS_GEN_CH0_START_VALUE_ENABLE 1U
#define PWMPLUS_GEN_CH0_START_BITS_ENABLE (PWMPLUS_GEN_CH0_START_VALUE_ENABLE << PWMPLUS_GEN_CH0_START_SHIFT)
#define PWMPLUS_GEN_CH0_IDLE_SHIFT 0U
#define PWMPLUS_GEN_CH0_IDLE_WIDTH 1U
#define PWMPLUS_GEN_CH0_IDLE_VALUE_ENABLE 1U
#define PWMPLUS_GEN_CH0_IDLE_BITS_ENABLE (PWMPLUS_GEN_CH0_IDLE_VALUE_ENABLE << PWMPLUS_GEN_CH0_IDLE_SHIFT)
//---------------
#define PWMPLUS_CLKSRC 0x08U
#define PWMPLUS_BRAKE_CFG 0x0CU
#define PWMPLUS_MASK_LEV 0x10U
#define PWMPLUS_PERIOD 0x1CU
#define PWMPLUS_CH0_COMP 0x20U
#define PWMPLUS_CH1_COMP 0x24U
#define PWMPLUS_CH2_COMP 0x28U
#define PWMPLUS_CH0_DT 0x30U
#define PWMPLUS_CH1_DT 0x34U
#define PWMPLUS_CH2_DT 0x38U
#define PWMPLUS_TRIG_COMP 0x40U
#define PWMPLUS_TRIG_CFG 0x44U
#define PWMPLUS_IE 0x60U
#define PWMPLUS_IF 0x64U
#define PWMPLUS_SWLOAD 0x84U
#define PWMPLUS_MASK_EN 0x88
#define PWMPLUS_CNT_ST 0xE0
#define PWMPLUS_BRAKE_ST 0xE4
#define PWM_PLUS0_CFG_ADDR (PWM_PLUS0_BASE_ADDR + PWMPLUS_CFG)
#define PWM_PLUS0_CFG (*(volatile uint32_t *)PWM_PLUS0_CFG_ADDR)
#define PWM_PLUS0_GEN_ADDR (PWM_PLUS0_BASE_ADDR + PWMPLUS_GEN)
#define PWM_PLUS0_GEN (*(volatile uint32_t *)PWM_PLUS0_GEN_ADDR)
#define PWM_PLUS0_CLKSRC_ADDR (PWM_PLUS0_BASE_ADDR + PWMPLUS_CLKSRC)
#define PWM_PLUS0_CLKSRC (*(volatile uint32_t *)PWM_PLUS0_CLKSRC_ADDR)
#define PWM_PLUS0_BRAKE_CFG_ADDR (PWM_PLUS0_BASE_ADDR + PWMPLUS_BRAKE_CFG)
#define PWM_PLUS0_BRAKE_CFG (*(volatile uint32_t *)PWM_PLUS0_BRAKE_CFG_ADDR)
#define PWM_PLUS0_MASK_LEV_ADDR (PWM_PLUS0_BASE_ADDR + PWMPLUS_MASK_LEV)
#define PWM_PLUS0_MASK_LEV (*(volatile uint32_t *)PWM_PLUS0_MASK_LEV_ADDR)
#define PWM_PLUS0_PERIOD_ADDR (PWM_PLUS0_BASE_ADDR + PWMPLUS_PERIOD)
#define PWM_PLUS0_PERIOD (*(volatile uint32_t *)PWM_PLUS0_PERIOD_ADDR)
#define PWM_PLUS0_CH0_COMP_ADDR (PWM_PLUS0_BASE_ADDR + PWMPLUS_CH0_COMP)
#define PWM_PLUS0_CH0_COMP (*(volatile uint32_t *)PWM_PLUS0_CH0_COMP_ADDR)
#define PWM_PLUS0_CH1_COMP_ADDR (PWM_PLUS0_BASE_ADDR + PWMPLUS_CH1_COMP)
#define PWM_PLUS0_CH1_COMP (*(volatile uint32_t *)PWM_PLUS0_CH1_COMP_ADDR)
#define PWM_PLUS0_CH2_COMP_ADDR (PWM_PLUS0_BASE_ADDR + PWMPLUS_CH2_COMP)
#define PWM_PLUS0_CH2_COMP (*(volatile uint32_t *)PWM_PLUS0_CH2_COMP_ADDR)
#define PWM_PLUS0_CH0_DT_ADDR (PWM_PLUS0_BASE_ADDR + PWMPLUS_CH0_DT)
#define PWM_PLUS0_CH0_DT (*(volatile uint32_t *)PWM_PLUS0_CH0_DT_ADDR)
#define PWM_PLUS0_CH1_DT_ADDR (PWM_PLUS0_BASE_ADDR + PWMPLUS_CH1_DT)
#define PWM_PLUS0_CH1_DT (*(volatile uint32_t *)PWM_PLUS0_CH1_DT_ADDR)
#define PWM_PLUS0_CH2_DT_ADDR (PWM_PLUS0_BASE_ADDR + PWMPLUS_CH2_DT)
#define PWM_PLUS0_CH2_DT (*(volatile uint32_t *)PWM_PLUS0_CH2_DT_ADDR)
#define PWM_PLUS0_TRIG_COMP_ADDR (PWM_PLUS0_BASE_ADDR + PWMPLUS_TRIG_COMP)
#define PWM_PLUS0_TRIG_COMP (*(volatile uint32_t *)PWM_PLUS0_TRIG_COMP_ADDR)
#define PWM_PLUS0_TRIG_CFG_ADDR (PWM_PLUS0_BASE_ADDR + PWMPLUS_TRIG_CFG)
#define PWM_PLUS0_TRIG_CFG (*(volatile uint32_t *)PWM_PLUS0_TRIG_CFG_ADDR)
#define PWM_PLUS0_IE_ADDR (PWM_PLUS0_BASE_ADDR + PWMPLUS_IE)
#define PWM_PLUS0_IE (*(volatile uint32_t *)PWM_PLUS0_IE_ADDR)
#define PWM_PLUS0_IF_ADDR (PWM_PLUS0_BASE_ADDR + PWMPLUS_IF)
#define PWM_PLUS0_IF (*(volatile uint32_t *)PWM_PLUS0_IF_ADDR)
#define PWM_PLUS0_SWLOAD_ADDR (PWM_PLUS0_BASE_ADDR + PWMPLUS_SWLOAD)
#define PWM_PLUS0_SWLOAD (*(volatile uint32_t *)PWM_PLUS0_SWLOAD_ADDR)
#define PWM_PLUS0_MASK_EN_ADDR (PWM_PLUS0_BASE_ADDR + PWMPLUS_MASK_EN)
#define PWM_PLUS0_MASK_EN (*(volatile uint32_t *)PWM_PLUS0_MASK_EN_ADDR)
#define PWM_PLUS0_CNT_ST_ADDR (PWM_PLUS0_BASE_ADDR + PWMPLUS_CNT_ST)
#define PWM_PLUS0_CNT_ST (*(volatile uint32_t *)PWM_PLUS0_CNT_ST_ADDR)
#define PWM_PLUS0_BRAKE_ST_ADDR (PWM_PLUS0_BASE_ADDR + PWMPLUS_BRAKE_ST)
#define PWM_PLUS0_BRAKE_ST (*(volatile uint32_t *)PWM_PLUS0_BRAKE_ST_ADDR)
#endif

View File

@@ -16,21 +16,25 @@
#include "backlight.h" #include "backlight.h"
#include "bsp/dp32g030/gpio.h" #include "bsp/dp32g030/gpio.h"
#include "bsp/dp32g030/pwmplus.h"
#include "driver/gpio.h" #include "driver/gpio.h"
#include "settings.h" #include "settings.h"
// this is decremented once every 500ms // this is decremented once every 500ms
uint16_t gBacklightCountdown = 0; uint16_t gBacklightCountdown = 0;
bool backlightOn;
void BACKLIGHT_TurnOn(void) void BACKLIGHT_TurnOn(void)
{ {
if (gEeprom.BACKLIGHT == 0) if (gEeprom.BACKLIGHT_TIME == 0)
return; return;
// turn the backlight ON backlightOn = true;
GPIO_SetBit(&GPIOB->DATA, GPIOB_PIN_BACKLIGHT);
switch (gEeprom.BACKLIGHT) // turn the backlight ON
BACKLIGHT_SetBrightness(gEeprom.BACKLIGHT_MAX);
switch (gEeprom.BACKLIGHT_TIME)
{ {
default: default:
case 1: // 5 sec case 1: // 5 sec
@@ -58,3 +62,21 @@ void BACKLIGHT_TurnOn(void)
gBacklightCountdown *= 2; gBacklightCountdown *= 2;
} }
void BACKLIGHT_TurnOff()
{
BACKLIGHT_SetBrightness(gEeprom.BACKLIGHT_MIN);
gBacklightCountdown = 0;
backlightOn = false;
}
bool BACKLIGHT_IsOn()
{
return backlightOn;
}
void BACKLIGHT_SetBrightness(uint8_t brigtness)
{
PWM_PLUS0_CH0_COMP = (1 << brigtness) - 1;
//PWM_PLUS0_SWLOAD = 1;
}

View File

@@ -18,10 +18,15 @@
#define DRIVER_BACKLIGHT_H #define DRIVER_BACKLIGHT_H
#include <stdint.h> #include <stdint.h>
#include <stdbool.h>
extern uint16_t gBacklightCountdown; extern uint16_t gBacklightCountdown;
extern uint8_t gBacklightBrightness;
void BACKLIGHT_TurnOn(void); void BACKLIGHT_TurnOn();
void BACKLIGHT_TurnOff();
bool BACKLIGHT_IsOn();
void BACKLIGHT_SetBrightness(uint8_t brigtness);
#endif #endif

View File

@@ -95,10 +95,10 @@ enum BK4819_REGISTER_t {
typedef enum BK4819_REGISTER_t BK4819_REGISTER_t; typedef enum BK4819_REGISTER_t BK4819_REGISTER_t;
enum BK4819_GPIO_PIN_t { enum BK4819_GPIO_PIN_t {
BK4819_GPIO0_PIN28 = 0, BK4819_GPIO0_PIN28_RX_ENABLE = 0,
BK4819_GPIO1_PIN29 = 1, BK4819_GPIO1_PIN29_PA_ENABLE = 1,
BK4819_GPIO3_PIN31 = 3, BK4819_GPIO3_PIN31_UHF_LNA = 3,
BK4819_GPIO4_PIN32 = 4, BK4819_GPIO4_PIN32_VHF_LNA = 4,
BK4819_GPIO5_PIN1_RED = 5, BK4819_GPIO5_PIN1_RED = 5,
BK4819_GPIO6_PIN2_GREEN = 6, BK4819_GPIO6_PIN2_GREEN = 6,
}; };

View File

@@ -51,8 +51,8 @@ void BK4819_Init(void)
BK4819_WriteRegister(BK4819_REG_37, 0x1D0F); BK4819_WriteRegister(BK4819_REG_37, 0x1D0F);
BK4819_WriteRegister(BK4819_REG_36, 0x0022); BK4819_WriteRegister(BK4819_REG_36, 0x0022);
BK4819_SetAGC(0); BK4819_DisableAGC();
// BK4819_SetAGC(1); // BK4819_EnableAGC();
BK4819_WriteRegister(BK4819_REG_19, 0b0001000001000001); // <15> MIC AGC 1 = disable 0 = enable BK4819_WriteRegister(BK4819_REG_19, 0b0001000001000001); // <15> MIC AGC 1 = disable 0 = enable
@@ -232,10 +232,28 @@ void BK4819_WriteU16(uint16_t Data)
} }
} }
void BK4819_SetAGC(uint8_t Value) void BK4819_DisableAGC()
{ {
if (Value == 0) // REG_7E
{ //
// <15> 0 AGC Fix Mode.
// 1=Fix; 0=Auto.
//
// <14:12> 0b011 AGC Fix Index.
// 011=Max, then 010,001,000,111,110,101,100(min).
//
// <5:3> 0b101 DC Filter Band Width for Tx (MIC In).
// 000=Bypass DC filter;
//
// <2:0> 0b110 DC Filter Band Width for Rx (IF In).
// 000=Bypass DC filter;
//
BK4819_WriteRegister(0x7E,
(1u << 15) | // 0 AGC fix mode
(3u << 12) | // 3 AGC fix index
(5u << 3) | // 5 DC Filter band width for Tx (MIC In)
(6u << 0)); // 6 DC Filter band width for Rx (I.F In)
// REG_10 // REG_10
// //
// 0x0038 Rx AGC Gain Table[0]. (Index Max->Min is 3,2,1,0,-1) // 0x0038 Rx AGC Gain Table[0]. (Index Max->Min is 3,2,1,0,-1)
@@ -274,7 +292,7 @@ void BK4819_SetAGC(uint8_t Value)
// 1 = -27dB // 1 = -27dB
// 0 = -33dB // 0 = -33dB
// //
BK4819_WriteRegister(BK4819_REG_13, (3u << 8) | (2u << 5) | (3u << 3) | (6u << 0)); // 000000 11 101 11 110 BK4819_WriteRegister(BK4819_REG_13, (3u << 8) | (5u << 5) | (3u << 3) | (6u << 0)); // 000000 11 101 11 110
BK4819_WriteRegister(BK4819_REG_12, 0x037B); // 000000 11 011 11 011 BK4819_WriteRegister(BK4819_REG_12, 0x037B); // 000000 11 011 11 011
BK4819_WriteRegister(BK4819_REG_11, 0x027B); // 000000 10 011 11 011 BK4819_WriteRegister(BK4819_REG_11, 0x027B); // 000000 10 011 11 011
@@ -283,12 +301,35 @@ void BK4819_SetAGC(uint8_t Value)
BK4819_WriteRegister(BK4819_REG_49, 0x2A38); BK4819_WriteRegister(BK4819_REG_49, 0x2A38);
BK4819_WriteRegister(BK4819_REG_7B, 0x8420); BK4819_WriteRegister(BK4819_REG_7B, 0x8420);
} }
else
if (Value == 1)
{ // what does this do ???
unsigned int i; void BK4819_EnableAGC()
{
// TODO: See if this attenuates overloading
// signals as well as boosting weak ones
//
// REG_7E
//
// <15> 0 AGC Fix Mode.
// 1=Fix; 0=Auto.
//
// <14:12> 0b011 AGC Fix Index.
// 011=Max, then 010,001,000,111,110,101,100(min).
//
// <5:3> 0b101 DC Filter Band Width for Tx (MIC In).
// 000=Bypass DC filter;
//
// <2:0> 0b110 DC Filter Band Width for Rx (IF In).
// 000=Bypass DC filter;
// default fix index too strong, set to min (011->100)
//BK4819_WriteRegister(0x7E, (1u << 15) | (4u << 12) | (5u << 3) | (6u << 0));
BK4819_WriteRegister(0x7E,
(0u << 15) | // 0 AGC fix mode
(3u << 12) | // 3 AGC fix index
(5u << 3) | // 5 DC Filter band width for Tx (MIC In)
(6u << 0)); // 6 DC Filter band width for Rx (I.F In)
// REG_10 // REG_10
// //
@@ -328,7 +369,7 @@ void BK4819_SetAGC(uint8_t Value)
// 1 = -27dB // 1 = -27dB
// 0 = -33dB // 0 = -33dB
// //
BK4819_WriteRegister(BK4819_REG_13, (3u << 8) | (2u << 5) | (3u << 3) | (6u << 0)); BK4819_WriteRegister(BK4819_REG_13, (3u << 8) | (5u << 5) | (3u << 3) | (6u << 0));
BK4819_WriteRegister(BK4819_REG_12, 0x037C); // 000000 11 011 11 100 BK4819_WriteRegister(BK4819_REG_12, 0x037C); // 000000 11 011 11 100
BK4819_WriteRegister(BK4819_REG_11, 0x027B); // 000000 10 011 11 011 BK4819_WriteRegister(BK4819_REG_11, 0x027B); // 000000 10 011 11 011
@@ -341,9 +382,9 @@ void BK4819_SetAGC(uint8_t Value)
BK4819_WriteRegister(BK4819_REG_7C, 0x595E); BK4819_WriteRegister(BK4819_REG_7C, 0x595E);
BK4819_WriteRegister(BK4819_REG_20, 0x8DEF); BK4819_WriteRegister(BK4819_REG_20, 0x8DEF);
for (i = 0; i < 8; i++) for (uint8_t i = 0; i < 8; i++) {
// Bug? The bit 0x2000 below overwrites the (i << 13) //BK4819_WriteRegister(BK4819_REG_06, ((i << 13) | 0x2500u) + 0x036u);
BK4819_WriteRegister(BK4819_REG_06, ((i << 13) | 0x2500u) + 0x036u); BK4819_WriteRegister(BK4819_REG_06, (i & 7) << 13 | 0x4A << 7 | 0x36);
} }
} }
@@ -760,19 +801,13 @@ void BK4819_SetupSquelch(
// 0 ~ 255 // 0 ~ 255
// //
BK4819_WriteRegister(BK4819_REG_4E, // 01 101 11 1 00000000 BK4819_WriteRegister(BK4819_REG_4E, // 01 101 11 1 00000000
#ifndef ENABLE_FASTER_CHANNEL_SCAN
// original (*) // original (*)
(1u << 14) | // 1 ??? (1u << 14) | // 1 ???
(3u << 11) | // *5 squelch = open delay .. 0 ~ 7 (5u << 11) | // *5 squelch = open delay .. 0 ~ 7
(2u << 9) | // *3 squelch = close delay .. 0 ~ 3 (6u << 9) | // *3 squelch = close delay .. 0 ~ 3
SquelchOpenGlitchThresh); // 0 ~ 255 SquelchOpenGlitchThresh); // 0 ~ 255
#else
// faster (but twitchier)
(1u << 14) | // 1 ???
(2u << 11) | // *5 squelch = open delay .. 0 ~ 7
(1u << 9) | // *3 squelch = close delay .. 0 ~ 3
SquelchOpenGlitchThresh); // 0 ~ 255
#endif
// REG_4F // REG_4F
// //
@@ -804,7 +839,8 @@ void BK4819_SetAF(BK4819_AF_Type_t AF)
// AF Output Inverse Mode = Inverse // AF Output Inverse Mode = Inverse
// Undocumented bits 0x2040 // Undocumented bits 0x2040
// //
BK4819_WriteRegister(BK4819_REG_47, 0x6040 | (AF << 8)); // BK4819_WriteRegister(BK4819_REG_47, 0x6040 | (AF << 8));
BK4819_WriteRegister(BK4819_REG_47, (6u << 12) | (AF << 8) | (1u << 6));
} }
void BK4819_RX_TurnOn(void) void BK4819_RX_TurnOn(void)
@@ -843,20 +879,20 @@ void BK4819_RX_TurnOn(void)
void BK4819_PickRXFilterPathBasedOnFrequency(uint32_t Frequency) void BK4819_PickRXFilterPathBasedOnFrequency(uint32_t Frequency)
{ {
if (Frequency < 28000000) if (Frequency < 28000000)
{ { // VHF
BK4819_ToggleGpioOut(BK4819_GPIO4_PIN32, true); BK4819_ToggleGpioOut(BK4819_GPIO4_PIN32_VHF_LNA, true);
BK4819_ToggleGpioOut(BK4819_GPIO3_PIN31, false); BK4819_ToggleGpioOut(BK4819_GPIO3_PIN31_UHF_LNA, false);
} }
else else
if (Frequency == 0xFFFFFFFF) if (Frequency == 0xFFFFFFFF)
{ { // OFF
BK4819_ToggleGpioOut(BK4819_GPIO4_PIN32, false); BK4819_ToggleGpioOut(BK4819_GPIO4_PIN32_VHF_LNA, false);
BK4819_ToggleGpioOut(BK4819_GPIO3_PIN31, false); BK4819_ToggleGpioOut(BK4819_GPIO3_PIN31_UHF_LNA, false);
} }
else else
{ { // UHF
BK4819_ToggleGpioOut(BK4819_GPIO4_PIN32, false); BK4819_ToggleGpioOut(BK4819_GPIO4_PIN32_VHF_LNA, false);
BK4819_ToggleGpioOut(BK4819_GPIO3_PIN31, true); BK4819_ToggleGpioOut(BK4819_GPIO3_PIN31_UHF_LNA, true);
} }
} }
@@ -975,14 +1011,14 @@ void BK4819_EnableDTMF(void)
// <3:0> 14 Max symbol number for SelCall detection // <3:0> 14 Max symbol number for SelCall detection
// //
// const uint16_t threshold = 24; // default, but doesn't decode non-QS radios // const uint16_t threshold = 24; // default, but doesn't decode non-QS radios
const uint16_t threshold = 160; // but 128 ~ 247 does const uint16_t threshold = 130; // but 128 ~ 247 does
BK4819_WriteRegister(BK4819_REG_24, // 1 00011000 1 1 1 1110 BK4819_WriteRegister(BK4819_REG_24, // 1 00011000 1 1 1 1110
(1u << BK4819_REG_24_SHIFT_UNKNOWN_15) | (1u << BK4819_REG_24_SHIFT_UNKNOWN_15) |
(threshold << BK4819_REG_24_SHIFT_THRESHOLD) | // 0 ~ 255 (threshold << BK4819_REG_24_SHIFT_THRESHOLD) | // 0 ~ 255
(1u << BK4819_REG_24_SHIFT_UNKNOWN_6) | (1u << BK4819_REG_24_SHIFT_UNKNOWN_6) |
BK4819_REG_24_ENABLE | BK4819_REG_24_ENABLE |
BK4819_REG_24_SELECT_DTMF | BK4819_REG_24_SELECT_DTMF |
(14u << BK4819_REG_24_SHIFT_MAX_SYMBOLS)); // 0 ~ 15 (15u << BK4819_REG_24_SHIFT_MAX_SYMBOLS)); // 0 ~ 15
} }
void BK4819_PlayTone(uint16_t Frequency, bool bTuningGainSwitch) void BK4819_PlayTone(uint16_t Frequency, bool bTuningGainSwitch)
@@ -1198,7 +1234,7 @@ void BK4819_Conditional_RX_TurnOn_and_GPIO6_Enable(void)
{ {
if (gRxIdleMode) if (gRxIdleMode)
{ {
BK4819_ToggleGpioOut(BK4819_GPIO0_PIN28, true); BK4819_ToggleGpioOut(BK4819_GPIO0_PIN28_RX_ENABLE, true);
BK4819_RX_TurnOn(); BK4819_RX_TurnOn();
} }
} }
@@ -1249,30 +1285,30 @@ void BK4819_PlayDTMF(char Code)
uint16_t tone1 = 0; uint16_t tone1 = 0;
uint16_t tone2 = 0; uint16_t tone2 = 0;
switch (Code) // Hz Hz switch (Code)
{ // {
case '0': tone1 = 9715; tone2 = 13793; break; // 941 1336 case '0': tone1 = 941; tone2 = 1336; break;
case '1': tone1 = 7196; tone2 = 12482; break; // 679 1209 case '1': tone1 = 679; tone2 = 1209; break;
case '2': tone1 = 7196; tone2 = 13793; break; // 697 1336 case '2': tone1 = 697; tone2 = 1336; break;
case '3': tone1 = 7196; tone2 = 15249; break; // 679 1477 case '3': tone1 = 679; tone2 = 1477; break;
case '4': tone1 = 7950; tone2 = 12482; break; // 770 1209 case '4': tone1 = 770; tone2 = 1209; break;
case '5': tone1 = 7950; tone2 = 13793; break; // 770 1336 case '5': tone1 = 770; tone2 = 1336; break;
case '6': tone1 = 7950; tone2 = 15249; break; // 770 1477 case '6': tone1 = 770; tone2 = 1477; break;
case '7': tone1 = 8796; tone2 = 12482; break; // 852 1209 case '7': tone1 = 852; tone2 = 1209; break;
case '8': tone1 = 8796; tone2 = 13793; break; // 852 1336 case '8': tone1 = 852; tone2 = 1336; break;
case '9': tone1 = 8796; tone2 = 15249; break; // 852 1477 case '9': tone1 = 852; tone2 = 1477; break;
case 'A': tone1 = 7196; tone2 = 16860; break; // 679 1633 case 'A': tone1 = 679; tone2 = 1633; break;
case 'B': tone1 = 7950; tone2 = 16860; break; // 770 1633 case 'B': tone1 = 770; tone2 = 1633; break;
case 'C': tone1 = 8796; tone2 = 16860; break; // 852 1633 case 'C': tone1 = 852; tone2 = 1633; break;
case 'D': tone1 = 9715; tone2 = 16860; break; // 941 1633 case 'D': tone1 = 941; tone2 = 1633; break;
case '*': tone1 = 9715; tone2 = 12482; break; // 941 1209 case '*': tone1 = 941; tone2 = 1209; break;
case '#': tone1 = 9715; tone2 = 15249; break; // 941 1477 case '#': tone1 = 941; tone2 = 1477; break;
} }
if (tone1 > 0) if (tone1 > 0)
BK4819_WriteRegister(BK4819_REG_71, tone1); BK4819_WriteRegister(BK4819_REG_71, (((uint32_t)tone1 * 103244) + 5000) / 10000); // with rounding
if (tone2 > 0) if (tone2 > 0)
BK4819_WriteRegister(BK4819_REG_72, tone2); BK4819_WriteRegister(BK4819_REG_72, (((uint32_t)tone2 * 103244) + 5000) / 10000); // with rounding
} }
void BK4819_PlayDTMFString(const char *pString, bool bDelayFirst, uint16_t FirstCodePersistTime, uint16_t HashCodePersistTime, uint16_t CodePersistTime, uint16_t CodeInternalTime) void BK4819_PlayDTMFString(const char *pString, bool bDelayFirst, uint16_t FirstCodePersistTime, uint16_t HashCodePersistTime, uint16_t CodePersistTime, uint16_t CodeInternalTime)
@@ -1513,12 +1549,46 @@ BK4819_CssScanResult_t BK4819_GetCxCSSScanResult(uint32_t *pCdcssFreq, uint16_t
void BK4819_DisableFrequencyScan(void) void BK4819_DisableFrequencyScan(void)
{ {
BK4819_WriteRegister(BK4819_REG_32, 0x0244); // REG_32
//
// <15:14> 0 frequency scan time
// 0 = 0.2 sec
// 1 = 0.4 sec
// 2 = 0.8 sec
// 3 = 1.6 sec
//
// <13:1> ???
//
// <0> 0 frequency scan enable
// 1 = enable
// 0 = disable
//
BK4819_WriteRegister(BK4819_REG_32, // 0x0244); // 00 0000100100010 0
( 0u << 14) | // 0 frequency scan Time
(290u << 1) | // ???
( 0u << 0)); // 0 frequency scan enable
} }
void BK4819_EnableFrequencyScan(void) void BK4819_EnableFrequencyScan(void)
{ {
BK4819_WriteRegister(BK4819_REG_32, 0x0245); // 00 0000100100010 1 // REG_32
//
// <15:14> 0 frequency scan time
// 0 = 0.2 sec
// 1 = 0.4 sec
// 2 = 0.8 sec
// 3 = 1.6 sec
//
// <13:1> ???
//
// <0> 0 frequency scan enable
// 1 = enable
// 0 = disable
//
BK4819_WriteRegister(BK4819_REG_32, // 0x0245); // 00 0000100100010 1
( 0u << 14) | // 0 frequency scan time
(290u << 1) | // ???
( 1u << 0)); // 1 frequency scan enable
} }
void BK4819_SetScanFrequency(uint32_t Frequency) void BK4819_SetScanFrequency(uint32_t Frequency)

View File

@@ -70,7 +70,8 @@ void BK4819_WriteRegister(BK4819_REGISTER_t Register, uint16_t Data);
void BK4819_WriteU8(uint8_t Data); void BK4819_WriteU8(uint8_t Data);
void BK4819_WriteU16(uint16_t Data); void BK4819_WriteU16(uint16_t Data);
void BK4819_SetAGC(uint8_t Value); void BK4819_EnableAGC();
void BK4819_DisableAGC();
void BK4819_ToggleGpioOut(BK4819_GPIO_PIN_t Pin, bool bSet); void BK4819_ToggleGpioOut(BK4819_GPIO_PIN_t Pin, bool bSet);

View File

@@ -26,22 +26,22 @@ const freq_band_table_t frequencyBandTable[7] =
{ {
#ifndef ENABLE_WIDE_RX #ifndef ENABLE_WIDE_RX
// QS original // QS original
{ 5000000, 7600000}, {.lower = 5000000, .upper = 7600000},
{10800000, 13600000}, {.lower = 10800000, .upper = 13700000},
{13600000, 17400000}, {.lower = 13700000, .upper = 17400000},
{17400000, 35000000}, {.lower = 17400000, .upper = 35000000},
{35000000, 40000000}, {.lower = 35000000, .upper = 40000000},
{40000000, 47000000}, {.lower = 40000000, .upper = 47000000},
{47000000, 60000000} {.lower = 47000000, .upper = 60000000}
#else #else
// extended range // extended range
{ 1800000, 10800000}, {.lower = BX4819_band1.lower, .upper = 10800000},
{10800000, 13600000}, {.lower = 10800000, .upper = 13700000},
{13600000, 17400000}, {.lower = 13700000, .upper = 17400000},
{17400000, 35000000}, {.lower = 17400000, .upper = 35000000},
{35000000, 40000000}, {.lower = 35000000, .upper = 40000000},
{40000000, 47000000}, {.lower = 40000000, .upper = 47000000},
{47000000, 130000000} {.lower = 47000000, .upper = BX4819_band2.upper}
#endif #endif
}; };
@@ -100,25 +100,21 @@ uint8_t FREQUENCY_CalculateOutputPower(uint8_t TxpLow, uint8_t TxpMid, uint8_t T
return TxpMid; return TxpMid;
} }
uint32_t FREQUENCY_FloorToStep(uint32_t Upper, uint32_t Step, uint32_t Lower) static int32_t rnd(int32_t freq, uint16_t step)
{ {
uint32_t Index; return (freq + (step + 1) / 2) / step * step;
}
if (Step == 833) uint32_t FREQUENCY_RoundToStep(uint32_t freq, uint16_t step)
{ {
const uint32_t Delta = Upper - Lower; if(step == 833) {
uint32_t Base = (Delta / 2500) * 2500; uint32_t base = freq/2500*2500;
const uint32_t Index = ((Delta - Base) % 2500) / 833; int f = rnd(freq - base, step);
int x = f / step;
if (Index == 2) return base + f + (x == 3);
Base++;
return Lower + Base + (Index * 833);
} }
Index = (Upper - Lower) / Step; return rnd(freq, step);
return Lower + (Step * Index);
} }
int TX_freq_check(const uint32_t Frequency) int TX_freq_check(const uint32_t Frequency)
@@ -134,17 +130,17 @@ int TX_freq_check(const uint32_t Frequency)
switch (gSetting_F_LOCK) switch (gSetting_F_LOCK)
{ {
case F_LOCK_OFF: case F_LOCK_OFF:
if (Frequency >= 13600000 && Frequency < 17400000) if (Frequency >= frequencyBandTable[BAND3_137MHz].lower && Frequency < frequencyBandTable[BAND3_137MHz].upper)
return 0; return 0;
if (Frequency >= 17400000 && Frequency < 35000000) if (Frequency >= frequencyBandTable[BAND4_174MHz].lower && Frequency < frequencyBandTable[BAND4_174MHz].upper)
if (gSetting_200TX) if (gSetting_200TX)
return 0; return 0;
if (Frequency >= 35000000 && Frequency < 40000000) if (Frequency >= frequencyBandTable[BAND5_350MHz].lower && Frequency < frequencyBandTable[BAND5_350MHz].upper)
if (gSetting_350TX && gSetting_350EN) if (gSetting_350TX && gSetting_350EN)
return 0; return 0;
if (Frequency >= 40000000 && Frequency < 47000000) if (Frequency >= frequencyBandTable[BAND6_400MHz].lower && Frequency < frequencyBandTable[BAND6_400MHz].upper)
return 0; return 0;
if (Frequency >= 47000000 && Frequency <= 60000000) if (Frequency >= frequencyBandTable[BAND7_470MHz].lower && Frequency <= 60000000)
if (gSetting_500TX) if (gSetting_500TX)
return 0; return 0;
break; break;
@@ -171,14 +167,14 @@ int TX_freq_check(const uint32_t Frequency)
break; break;
case F_LOCK_430: case F_LOCK_430:
if (Frequency >= 13600000 && Frequency < 17400000) if (Frequency >= frequencyBandTable[BAND3_137MHz].lower && Frequency < 17400000)
return 0; return 0;
if (Frequency >= 40000000 && Frequency < 43000000) if (Frequency >= 40000000 && Frequency < 43000000)
return 0; return 0;
break; break;
case F_LOCK_438: case F_LOCK_438:
if (Frequency >= 13600000 && Frequency < 17400000) if (Frequency >= frequencyBandTable[BAND3_137MHz].lower && Frequency < 17400000)
return 0; return 0;
if (Frequency >= 40000000 && Frequency < 43800000) if (Frequency >= 40000000 && Frequency < 43800000)
return 0; return 0;

View File

@@ -35,7 +35,7 @@ enum FREQUENCY_Band_t {
BAND_NONE = -1, BAND_NONE = -1,
BAND1_50MHz = 0, BAND1_50MHz = 0,
BAND2_108MHz, BAND2_108MHz,
BAND3_136MHz, BAND3_137MHz,
BAND4_174MHz, BAND4_174MHz,
BAND5_350MHz, BAND5_350MHz,
BAND6_400MHz, BAND6_400MHz,
@@ -76,7 +76,7 @@ extern const uint16_t StepFrequencyTable[7];
FREQUENCY_Band_t FREQUENCY_GetBand(uint32_t Frequency); FREQUENCY_Band_t FREQUENCY_GetBand(uint32_t Frequency);
uint8_t FREQUENCY_CalculateOutputPower(uint8_t TxpLow, uint8_t TxpMid, uint8_t TxpHigh, int32_t LowerLimit, int32_t Middle, int32_t UpperLimit, int32_t Frequency); uint8_t FREQUENCY_CalculateOutputPower(uint8_t TxpLow, uint8_t TxpMid, uint8_t TxpHigh, int32_t LowerLimit, int32_t Middle, int32_t UpperLimit, int32_t Frequency);
uint32_t FREQUENCY_FloorToStep(uint32_t Upper, uint32_t Step, uint32_t Lower); uint32_t FREQUENCY_RoundToStep(uint32_t freq, uint16_t step);
int TX_freq_check(const uint32_t Frequency); int TX_freq_check(const uint32_t Frequency);
int RX_freq_check(const uint32_t Frequency); int RX_freq_check(const uint32_t Frequency);

View File

@@ -43,7 +43,7 @@ FUNCTION_Type_t gCurrentFunction;
void FUNCTION_Init(void) void FUNCTION_Init(void)
{ {
#ifdef ENABLE_NOAA #ifdef ENABLE_NOAA
if (IS_NOT_NOAA_CHANNEL(gRxVfo->CHANNEL_SAVE)) if (!IS_NOAA_CHANNEL(gRxVfo->CHANNEL_SAVE))
#endif #endif
{ {
gCurrentCodeType = gSelectedCodeType; gCurrentCodeType = gSelectedCodeType;
@@ -145,7 +145,7 @@ void FUNCTION_Select(FUNCTION_Type_t Function)
BK4819_DisableVox(); BK4819_DisableVox();
BK4819_Sleep(); BK4819_Sleep();
BK4819_ToggleGpioOut(BK4819_GPIO0_PIN28, false); BK4819_ToggleGpioOut(BK4819_GPIO0_PIN28_RX_ENABLE, false);
gUpdateStatus = true; gUpdateStatus = true;

9
main.c
View File

@@ -61,7 +61,8 @@ void Main(void)
| SYSCON_DEV_CLK_GATE_SPI0_BITS_ENABLE | SYSCON_DEV_CLK_GATE_SPI0_BITS_ENABLE
| SYSCON_DEV_CLK_GATE_SARADC_BITS_ENABLE | SYSCON_DEV_CLK_GATE_SARADC_BITS_ENABLE
| SYSCON_DEV_CLK_GATE_CRC_BITS_ENABLE | SYSCON_DEV_CLK_GATE_CRC_BITS_ENABLE
| SYSCON_DEV_CLK_GATE_AES_BITS_ENABLE; | SYSCON_DEV_CLK_GATE_AES_BITS_ENABLE
| SYSCON_DEV_CLK_GATE_PWM_PLUS0_BITS_ENABLE;
SYSTICK_Init(); SYSTICK_Init();
BOARD_Init(); BOARD_Init();
@@ -140,10 +141,10 @@ void Main(void)
{ {
FUNCTION_Select(FUNCTION_POWER_SAVE); FUNCTION_Select(FUNCTION_POWER_SAVE);
if (gEeprom.BACKLIGHT < (ARRAY_SIZE(gSubMenu_BACKLIGHT) - 1)) if (gEeprom.BACKLIGHT_TIME < (ARRAY_SIZE(gSubMenu_BACKLIGHT) - 1)) // backlight is not set to be always on
GPIO_ClearBit(&GPIOB->DATA, GPIOB_PIN_BACKLIGHT); // turn the backlight OFF BACKLIGHT_TurnOff(); // turn the backlight OFF
else else
GPIO_SetBit(&GPIOB->DATA, GPIOB_PIN_BACKLIGHT); // turn the backlight ON BACKLIGHT_TurnOn(); // turn the backlight ON
gReducedService = true; gReducedService = true;
} }

3
misc.c
View File

@@ -201,9 +201,6 @@ uint16_t gLowBatteryCountdown;
uint8_t gNextMrChannel; uint8_t gNextMrChannel;
ReceptionMode_t gRxReceptionMode; ReceptionMode_t gRxReceptionMode;
enum scan_next_chan_t gCurrentScanList;
uint32_t gRestoreFrequency;
bool gRxVfoIsActive; bool gRxVfoIsActive;
#ifdef ENABLE_ALARM #ifdef ENABLE_ALARM
uint8_t gAlarmToneCounter; uint8_t gAlarmToneCounter;

14
misc.h
View File

@@ -35,9 +35,7 @@
#define IS_MR_CHANNEL(x) ((x) <= MR_CHANNEL_LAST) #define IS_MR_CHANNEL(x) ((x) <= MR_CHANNEL_LAST)
#define IS_FREQ_CHANNEL(x) ((x) >= FREQ_CHANNEL_FIRST && (x) <= FREQ_CHANNEL_LAST) #define IS_FREQ_CHANNEL(x) ((x) >= FREQ_CHANNEL_FIRST && (x) <= FREQ_CHANNEL_LAST)
#define IS_VALID_CHANNEL(x) ((x) < LAST_CHANNEL) #define IS_VALID_CHANNEL(x) ((x) < LAST_CHANNEL)
#define IS_NOAA_CHANNEL(x) ((x) >= NOAA_CHANNEL_FIRST && (x) <= NOAA_CHANNEL_LAST) #define IS_NOAA_CHANNEL(x) ((x) >= NOAA_CHANNEL_FIRST && (x) <= NOAA_CHANNEL_LAST)
#define IS_NOT_NOAA_CHANNEL(x) ((x) <= FREQ_CHANNEL_LAST)
enum { enum {
MR_CHANNEL_FIRST = 0, MR_CHANNEL_FIRST = 0,
@@ -85,15 +83,6 @@ enum CssScanMode_t
}; };
typedef enum CssScanMode_t CssScanMode_t; typedef enum CssScanMode_t CssScanMode_t;
enum scan_next_chan_t {
SCAN_NEXT_CHAN_SCANLIST1 = 0,
SCAN_NEXT_CHAN_SCANLIST2,
SCAN_NEXT_CHAN_DUAL_WATCH,
SCAN_NEXT_CHAN_MR,
SCAN_NEXT_NUM
};
typedef enum scan_next_chan_t scan_next_chan_t;
enum BacklightOnRxTx_t { enum BacklightOnRxTx_t {
BACKLIGHT_ON_TR_OFF, BACKLIGHT_ON_TR_OFF,
BACKLIGHT_ON_TR_TX, BACKLIGHT_ON_TR_TX,
@@ -283,9 +272,6 @@ extern uint16_t gLowBatteryCountdown;
extern uint8_t gNextMrChannel; extern uint8_t gNextMrChannel;
extern ReceptionMode_t gRxReceptionMode; extern ReceptionMode_t gRxReceptionMode;
extern scan_next_chan_t gCurrentScanList;
extern uint32_t gRestoreFrequency;
//TRUE when dual watch is momentarly suspended and RX_VFO is locked to either last TX or RX //TRUE when dual watch is momentarly suspended and RX_VFO is locked to either last TX or RX
extern bool gRxVfoIsActive; extern bool gRxVfoIsActive;
extern uint8_t gAlarmToneCounter; extern uint8_t gAlarmToneCounter;

59
radio.c
View File

@@ -51,7 +51,7 @@ bool RADIO_CheckValidChannel(uint16_t Channel, bool bCheckScanList, uint8_t VFO)
uint8_t PriorityCh1; uint8_t PriorityCh1;
uint8_t PriorityCh2; uint8_t PriorityCh2;
if (Channel > MR_CHANNEL_LAST) if (!IS_MR_CHANNEL(Channel))
return false; return false;
Attributes = gMR_ChannelAttributes[Channel]; Attributes = gMR_ChannelAttributes[Channel];
@@ -97,12 +97,12 @@ uint8_t RADIO_FindNextChannel(uint8_t Channel, int8_t Direction, bool bCheckScan
{ {
unsigned int i; unsigned int i;
for (i = 0; i <= MR_CHANNEL_LAST; i++) for (i = 0; IS_MR_CHANNEL(i); i++)
{ {
if (Channel == 0xFF) if (Channel == 0xFF)
Channel = MR_CHANNEL_LAST; Channel = MR_CHANNEL_LAST;
else else
if (Channel > MR_CHANNEL_LAST) if (!IS_MR_CHANNEL(Channel))
Channel = MR_CHANNEL_FIRST; Channel = MR_CHANNEL_FIRST;
if (RADIO_CheckValidChannel(Channel, bCheckScanList, VFO)) if (RADIO_CheckValidChannel(Channel, bCheckScanList, VFO))
@@ -176,7 +176,7 @@ void RADIO_ConfigureChannel(const unsigned int VFO, const unsigned int configure
} }
#endif #endif
if (Channel <= MR_CHANNEL_LAST) if (IS_MR_CHANNEL(Channel))
{ {
Channel = RADIO_FindNextChannel(Channel, RADIO_CHANNEL_UP, false, VFO); Channel = RADIO_FindNextChannel(Channel, RADIO_CHANNEL_UP, false, VFO);
if (Channel == 0xFF) if (Channel == 0xFF)
@@ -200,7 +200,7 @@ void RADIO_ConfigureChannel(const unsigned int VFO, const unsigned int configure
uint8_t Index; uint8_t Index;
if (Channel <= MR_CHANNEL_LAST) if (IS_MR_CHANNEL(Channel))
{ {
Channel = gEeprom.FreqChannel[VFO]; Channel = gEeprom.FreqChannel[VFO];
gEeprom.ScreenChannel[VFO] = gEeprom.FreqChannel[VFO]; gEeprom.ScreenChannel[VFO] = gEeprom.FreqChannel[VFO];
@@ -218,7 +218,7 @@ void RADIO_ConfigureChannel(const unsigned int VFO, const unsigned int configure
Band = BAND6_400MHz; Band = BAND6_400MHz;
} }
if (Channel <= MR_CHANNEL_LAST) if (IS_MR_CHANNEL(Channel))
{ {
gEeprom.VfoInfo[VFO].Band = Band; gEeprom.VfoInfo[VFO].Band = Band;
gEeprom.VfoInfo[VFO].SCANLIST1_PARTICIPATION = !!(Attributes & MR_CH_SCANLIST1); gEeprom.VfoInfo[VFO].SCANLIST1_PARTICIPATION = !!(Attributes & MR_CH_SCANLIST1);
@@ -235,7 +235,7 @@ void RADIO_ConfigureChannel(const unsigned int VFO, const unsigned int configure
gEeprom.VfoInfo[VFO].SCANLIST2_PARTICIPATION = bParticipation2; gEeprom.VfoInfo[VFO].SCANLIST2_PARTICIPATION = bParticipation2;
gEeprom.VfoInfo[VFO].CHANNEL_SAVE = Channel; gEeprom.VfoInfo[VFO].CHANNEL_SAVE = Channel;
if (Channel <= MR_CHANNEL_LAST) if (IS_MR_CHANNEL(Channel))
Base = Channel * 16; Base = Channel * 16;
else else
Base = 0x0C80 + ((Channel - FREQ_CHANNEL_FIRST) * 32) + (VFO * 16); Base = 0x0C80 + ((Channel - FREQ_CHANNEL_FIRST) * 32) + (VFO * 16);
@@ -361,10 +361,8 @@ void RADIO_ConfigureChannel(const unsigned int VFO, const unsigned int configure
Frequency = pRadio->freq_config_RX.Frequency; Frequency = pRadio->freq_config_RX.Frequency;
#if 1
// fix previously set incorrect band // fix previously set incorrect band
Band = FREQUENCY_GetBand(Frequency); Band = FREQUENCY_GetBand(Frequency);
#endif
if (Frequency < frequencyBandTable[Band].lower) if (Frequency < frequencyBandTable[Band].lower)
Frequency = frequencyBandTable[Band].lower; Frequency = frequencyBandTable[Band].lower;
@@ -373,20 +371,19 @@ void RADIO_ConfigureChannel(const unsigned int VFO, const unsigned int configure
Frequency = frequencyBandTable[Band].upper; Frequency = frequencyBandTable[Band].upper;
else else
if (Channel >= FREQ_CHANNEL_FIRST) if (Channel >= FREQ_CHANNEL_FIRST)
Frequency = FREQUENCY_FloorToStep(Frequency, gEeprom.VfoInfo[VFO].StepFrequency, frequencyBandTable[Band].lower); Frequency = FREQUENCY_RoundToStep(Frequency, gEeprom.VfoInfo[VFO].StepFrequency);
pRadio->freq_config_RX.Frequency = Frequency; pRadio->freq_config_RX.Frequency = Frequency;
if (Frequency >= 10800000 && Frequency < 13600000) if (Frequency >= frequencyBandTable[BAND2_108MHz].upper && Frequency < frequencyBandTable[BAND2_108MHz].upper)
gEeprom.VfoInfo[VFO].TX_OFFSET_FREQUENCY_DIRECTION = TX_OFFSET_FREQUENCY_DIRECTION_OFF; gEeprom.VfoInfo[VFO].TX_OFFSET_FREQUENCY_DIRECTION = TX_OFFSET_FREQUENCY_DIRECTION_OFF;
else else if (!IS_MR_CHANNEL(Channel))
if (Channel > MR_CHANNEL_LAST) gEeprom.VfoInfo[VFO].TX_OFFSET_FREQUENCY = FREQUENCY_RoundToStep(gEeprom.VfoInfo[VFO].TX_OFFSET_FREQUENCY, gEeprom.VfoInfo[VFO].StepFrequency);
gEeprom.VfoInfo[VFO].TX_OFFSET_FREQUENCY = FREQUENCY_FloorToStep(gEeprom.VfoInfo[VFO].TX_OFFSET_FREQUENCY, gEeprom.VfoInfo[VFO].StepFrequency, 0);
RADIO_ApplyOffset(pRadio); RADIO_ApplyOffset(pRadio);
memset(gEeprom.VfoInfo[VFO].Name, 0, sizeof(gEeprom.VfoInfo[VFO].Name)); memset(gEeprom.VfoInfo[VFO].Name, 0, sizeof(gEeprom.VfoInfo[VFO].Name));
if (Channel < MR_CHANNEL_LAST) if (IS_MR_CHANNEL(Channel))
{ // 16 bytes allocated to the channel name but only 10 used, the rest are 0's { // 16 bytes allocated to the channel name but only 10 used, the rest are 0's
EEPROM_ReadBuffer(0x0F50 + (Channel * 16), gEeprom.VfoInfo[VFO].Name + 0, 8); EEPROM_ReadBuffer(0x0F50 + (Channel * 16), gEeprom.VfoInfo[VFO].Name + 0, 8);
EEPROM_ReadBuffer(0x0F58 + (Channel * 16), gEeprom.VfoInfo[VFO].Name + 8, 2); EEPROM_ReadBuffer(0x0F58 + (Channel * 16), gEeprom.VfoInfo[VFO].Name + 8, 2);
@@ -555,17 +552,17 @@ void RADIO_ApplyOffset(VFO_Info_t *pInfo)
static void RADIO_SelectCurrentVfo(void) static void RADIO_SelectCurrentVfo(void)
{ {
// if crossband is active the gCurrentVfo is gTxVfo (gTxVfo/TX_VFO is only ever changed by the user) // if crossband is active and DW not the gCurrentVfo is gTxVfo (gTxVfo/TX_VFO is only ever changed by the user)
// otherwise it is set to gRxVfo // otherwise it is set to gRxVfo which is set to gTxVfo in RADIO_SelectVfos
// so in the end gCurrentVfo is equal to gTxVfo unless dual watch changes it on incomming transmition (again, this can only happen when XB off) // so in the end gCurrentVfo is equal to gTxVfo unless dual watch changes it on incomming transmition (again, this can only happen when XB off)
// note: it is called only in certain situations so could not by up-to-date // note: it is called only in certain situations so could be not up-to-date
gCurrentVfo = (gEeprom.CROSS_BAND_RX_TX == CROSS_BAND_OFF) ? gRxVfo : gTxVfo; gCurrentVfo = (gEeprom.CROSS_BAND_RX_TX == CROSS_BAND_OFF || gEeprom.DUAL_WATCH != DUAL_WATCH_OFF) ? gRxVfo : gTxVfo;
} }
void RADIO_SelectVfos(void) void RADIO_SelectVfos(void)
{ {
// if crossband is used then RX_VFO is the opposite to the TX_VFO // if crossband without DW is used then RX_VFO is the opposite to the TX_VFO
gEeprom.RX_VFO = (gEeprom.CROSS_BAND_RX_TX == CROSS_BAND_OFF) ? gEeprom.TX_VFO : !gEeprom.TX_VFO; gEeprom.RX_VFO = (gEeprom.CROSS_BAND_RX_TX == CROSS_BAND_OFF || gEeprom.DUAL_WATCH != DUAL_WATCH_OFF) ? gEeprom.TX_VFO : !gEeprom.TX_VFO;
gTxVfo = &gEeprom.VfoInfo[gEeprom.TX_VFO]; gTxVfo = &gEeprom.VfoInfo[gEeprom.TX_VFO];
gRxVfo = &gEeprom.VfoInfo[gEeprom.RX_VFO]; gRxVfo = &gEeprom.VfoInfo[gEeprom.RX_VFO];
@@ -605,7 +602,7 @@ void RADIO_SetupRegisters(bool bSwitchToFunction0)
BK4819_SetupPowerAmplifier(0, 0); BK4819_SetupPowerAmplifier(0, 0);
BK4819_ToggleGpioOut(BK4819_GPIO1_PIN29, false); BK4819_ToggleGpioOut(BK4819_GPIO1_PIN29_PA_ENABLE, false);
while (1) while (1)
{ {
@@ -622,7 +619,7 @@ void RADIO_SetupRegisters(bool bSwitchToFunction0)
BK4819_WriteRegister(BK4819_REG_7D, 0xE940 | (gEeprom.MIC_SENSITIVITY_TUNING & 0x1f)); BK4819_WriteRegister(BK4819_REG_7D, 0xE940 | (gEeprom.MIC_SENSITIVITY_TUNING & 0x1f));
#ifdef ENABLE_NOAA #ifdef ENABLE_NOAA
if (IS_NOT_NOAA_CHANNEL(gRxVfo->CHANNEL_SAVE) || !gIsNoaaMode) if (!IS_NOAA_CHANNEL(gRxVfo->CHANNEL_SAVE) || !gIsNoaaMode)
Frequency = gRxVfo->pRX->Frequency; Frequency = gRxVfo->pRX->Frequency;
else else
Frequency = NoaaFrequencyTable[gNoaaChannel]; Frequency = NoaaFrequencyTable[gNoaaChannel];
@@ -639,7 +636,7 @@ void RADIO_SetupRegisters(bool bSwitchToFunction0)
BK4819_PickRXFilterPathBasedOnFrequency(Frequency); BK4819_PickRXFilterPathBasedOnFrequency(Frequency);
// what does this in do ? // what does this in do ?
BK4819_ToggleGpioOut(BK4819_GPIO0_PIN28, true); BK4819_ToggleGpioOut(BK4819_GPIO0_PIN28_RX_ENABLE, true);
// AF RX Gain and DAC // 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
@@ -647,7 +644,7 @@ void RADIO_SetupRegisters(bool bSwitchToFunction0)
InterruptMask = BK4819_REG_3F_SQUELCH_FOUND | BK4819_REG_3F_SQUELCH_LOST; InterruptMask = BK4819_REG_3F_SQUELCH_FOUND | BK4819_REG_3F_SQUELCH_LOST;
#ifdef ENABLE_NOAA #ifdef ENABLE_NOAA
if (IS_NOT_NOAA_CHANNEL(gRxVfo->CHANNEL_SAVE)) if (!IS_NOAA_CHANNEL(gRxVfo->CHANNEL_SAVE))
#endif #endif
{ {
if (gRxVfo->AM_mode == 0) if (gRxVfo->AM_mode == 0)
@@ -726,9 +723,9 @@ void RADIO_SetupRegisters(bool bSwitchToFunction0)
#ifdef ENABLE_VOX #ifdef ENABLE_VOX
#ifdef ENABLE_NOAA #ifdef ENABLE_NOAA
#ifdef ENABLE_FMRADIO #ifdef ENABLE_FMRADIO
if (gEeprom.VOX_SWITCH && !gFmRadioMode && IS_NOT_NOAA_CHANNEL(gCurrentVfo->CHANNEL_SAVE) && gCurrentVfo->AM_mode == 0) if (gEeprom.VOX_SWITCH && !gFmRadioMode && !IS_NOAA_CHANNEL(gCurrentVfo->CHANNEL_SAVE) && gCurrentVfo->AM_mode == 0)
#else #else
if (gEeprom.VOX_SWITCH && IS_NOT_NOAA_CHANNEL(gCurrentVfo->CHANNEL_SAVE) && gCurrentVfo->AM_mode == 0) if (gEeprom.VOX_SWITCH && !IS_NOAA_CHANNEL(gCurrentVfo->CHANNEL_SAVE) && gCurrentVfo->AM_mode == 0)
#endif #endif
#else #else
#ifdef ENABLE_FMRADIO #ifdef ENABLE_FMRADIO
@@ -791,9 +788,9 @@ void RADIO_SetupRegisters(bool bSwitchToFunction0)
{ {
if (gEeprom.DUAL_WATCH != DUAL_WATCH_OFF) if (gEeprom.DUAL_WATCH != DUAL_WATCH_OFF)
{ {
if (IS_NOT_NOAA_CHANNEL(gEeprom.ScreenChannel[0])) if (!IS_NOAA_CHANNEL(gEeprom.ScreenChannel[0]))
{ {
if (IS_NOT_NOAA_CHANNEL(gEeprom.ScreenChannel[1])) if (!IS_NOAA_CHANNEL(gEeprom.ScreenChannel[1]))
{ {
gIsNoaaMode = false; gIsNoaaMode = false;
return; return;
@@ -833,7 +830,7 @@ void RADIO_SetTxParameters(void)
gEnableSpeaker = false; gEnableSpeaker = false;
BK4819_ToggleGpioOut(BK4819_GPIO0_PIN28, false); BK4819_ToggleGpioOut(BK4819_GPIO0_PIN28_RX_ENABLE, false);
switch (Bandwidth) switch (Bandwidth)
{ {
@@ -862,7 +859,7 @@ void RADIO_SetTxParameters(void)
BK4819_PickRXFilterPathBasedOnFrequency(gCurrentVfo->pTX->Frequency); BK4819_PickRXFilterPathBasedOnFrequency(gCurrentVfo->pTX->Frequency);
BK4819_ToggleGpioOut(BK4819_GPIO1_PIN29, true); BK4819_ToggleGpioOut(BK4819_GPIO1_PIN29_PA_ENABLE, true);
SYSTEM_DelayMs(5); SYSTEM_DelayMs(5);

View File

@@ -73,7 +73,14 @@ typedef struct VFO_Info_t
{ {
FREQ_Config_t freq_config_RX; FREQ_Config_t freq_config_RX;
FREQ_Config_t freq_config_TX; FREQ_Config_t freq_config_TX;
// this is for a purpose of the FrequencyReverse function
// it points to freq_config_RX normally and to freq_config_TX if reverse function is active
//
FREQ_Config_t *pRX; FREQ_Config_t *pRX;
// this is for a purpose of the FrequencyReverse function
// it points to freq_config_TX normally and to freq_config_RX if reverse function is active
FREQ_Config_t *pTX; FREQ_Config_t *pTX;
uint32_t TX_OFFSET_FREQUENCY; uint32_t TX_OFFSET_FREQUENCY;

View File

@@ -96,12 +96,12 @@ void SETTINGS_SaveSettings(void)
State[7] = gEeprom.MIC_SENSITIVITY; State[7] = gEeprom.MIC_SENSITIVITY;
EEPROM_WriteBuffer(0x0E70, State); EEPROM_WriteBuffer(0x0E70, State);
State[0] = 0xFF; State[0] = (gEeprom.BACKLIGHT_MIN << 4) + gEeprom.BACKLIGHT_MAX;
State[1] = gEeprom.CHANNEL_DISPLAY_MODE; State[1] = gEeprom.CHANNEL_DISPLAY_MODE;
State[2] = gEeprom.CROSS_BAND_RX_TX; State[2] = gEeprom.CROSS_BAND_RX_TX;
State[3] = gEeprom.BATTERY_SAVE; State[3] = gEeprom.BATTERY_SAVE;
State[4] = gEeprom.DUAL_WATCH; State[4] = gEeprom.DUAL_WATCH;
State[5] = gEeprom.BACKLIGHT; State[5] = gEeprom.BACKLIGHT_TIME;
State[6] = gEeprom.TAIL_NOTE_ELIMINATION; State[6] = gEeprom.TAIL_NOTE_ELIMINATION;
State[7] = gEeprom.VFO_OPEN; State[7] = gEeprom.VFO_OPEN;
EEPROM_WriteBuffer(0x0E78, State); EEPROM_WriteBuffer(0x0E78, State);
@@ -123,11 +123,11 @@ void SETTINGS_SaveSettings(void)
#endif #endif
EEPROM_WriteBuffer(0x0E98, Password); EEPROM_WriteBuffer(0x0E98, Password);
#ifdef ENABLE_VOICE
memset(State, 0xFF, sizeof(State)); memset(State, 0xFF, sizeof(State));
#ifdef ENABLE_VOICE
State[0] = gEeprom.VOICE_PROMPT; State[0] = gEeprom.VOICE_PROMPT;
EEPROM_WriteBuffer(0x0EA0, State); EEPROM_WriteBuffer(0x0EA0, State);
#endif #endif
#if defined(ENABLE_ALARM) || defined(ENABLE_TX1750) #if defined(ENABLE_ALARM) || defined(ENABLE_TX1750)
State[0] = gEeprom.ALARM_MODE; State[0] = gEeprom.ALARM_MODE;
@@ -190,19 +190,19 @@ void SETTINGS_SaveSettings(void)
void SETTINGS_SaveChannel(uint8_t Channel, uint8_t VFO, const VFO_Info_t *pVFO, uint8_t Mode) void SETTINGS_SaveChannel(uint8_t Channel, uint8_t VFO, const VFO_Info_t *pVFO, uint8_t Mode)
{ {
#ifdef ENABLE_NOAA #ifdef ENABLE_NOAA
if (IS_NOT_NOAA_CHANNEL(Channel)) if (!IS_NOAA_CHANNEL(Channel))
#endif #endif
{ {
const uint16_t OffsetMR = Channel * 16; const uint16_t OffsetMR = Channel * 16;
uint16_t OffsetVFO = OffsetMR; uint16_t OffsetVFO = OffsetMR;
if (Channel > MR_CHANNEL_LAST) if (!IS_MR_CHANNEL(Channel))
{ // it's a VFO, not a channel { // it's a VFO, not a channel
OffsetVFO = (VFO == 0) ? 0x0C80 : 0x0C90; OffsetVFO = (VFO == 0) ? 0x0C80 : 0x0C90;
OffsetVFO += (Channel - FREQ_CHANNEL_FIRST) * 32; OffsetVFO += (Channel - FREQ_CHANNEL_FIRST) * 32;
} }
if (Mode >= 2 || Channel > MR_CHANNEL_LAST) if (Mode >= 2 || !IS_MR_CHANNEL(Channel))
{ // copy VFO to a channel { // copy VFO to a channel
uint8_t State[8]; uint8_t State[8];
@@ -227,7 +227,7 @@ void SETTINGS_SaveChannel(uint8_t Channel, uint8_t VFO, const VFO_Info_t *pVFO,
SETTINGS_UpdateChannel(Channel, pVFO, true); SETTINGS_UpdateChannel(Channel, pVFO, true);
if (Channel <= MR_CHANNEL_LAST) if (IS_MR_CHANNEL(Channel))
{ // it's a memory channel { // it's a memory channel
#ifndef ENABLE_KEEP_MEM_NAME #ifndef ENABLE_KEEP_MEM_NAME
@@ -265,7 +265,7 @@ void SETTINGS_SaveBatteryCalibration(const uint16_t * batteryCalibration)
void SETTINGS_UpdateChannel(uint8_t Channel, const VFO_Info_t *pVFO, bool keep) void SETTINGS_UpdateChannel(uint8_t Channel, const VFO_Info_t *pVFO, bool keep)
{ {
#ifdef ENABLE_NOAA #ifdef ENABLE_NOAA
if (IS_NOT_NOAA_CHANNEL(Channel)) if (!IS_NOAA_CHANNEL(Channel))
#endif #endif
{ {
uint8_t State[8]; uint8_t State[8];
@@ -290,7 +290,7 @@ void SETTINGS_UpdateChannel(uint8_t Channel, const VFO_Info_t *pVFO, bool keep)
gMR_ChannelAttributes[Channel] = Attributes; gMR_ChannelAttributes[Channel] = Attributes;
// #ifndef ENABLE_KEEP_MEM_NAME // #ifndef ENABLE_KEEP_MEM_NAME
if (Channel <= MR_CHANNEL_LAST) if (IS_MR_CHANNEL(Channel))
{ // it's a memory channel { // it's a memory channel
const uint16_t OffsetMR = Channel * 16; const uint16_t OffsetMR = Channel * 16;

View File

@@ -82,6 +82,7 @@ enum {
ACTION_OPT_1750, ACTION_OPT_1750,
ACTION_OPT_KEYLOCK, ACTION_OPT_KEYLOCK,
ACTION_OPT_A_B, ACTION_OPT_A_B,
ACTION_OPT_VFO_MR,
ACTION_OPT_LEN ACTION_OPT_LEN
}; };
@@ -159,7 +160,7 @@ typedef struct {
uint8_t DUAL_WATCH; uint8_t DUAL_WATCH;
uint8_t CROSS_BAND_RX_TX; uint8_t CROSS_BAND_RX_TX;
uint8_t BATTERY_SAVE; uint8_t BATTERY_SAVE;
uint8_t BACKLIGHT; uint8_t BACKLIGHT_TIME;
uint8_t SCAN_RESUME_MODE; uint8_t SCAN_RESUME_MODE;
uint8_t SCAN_LIST_DEFAULT; uint8_t SCAN_LIST_DEFAULT;
bool SCAN_LIST_ENABLED[2]; bool SCAN_LIST_ENABLED[2];
@@ -227,6 +228,8 @@ typedef struct {
uint8_t field79_0x97; uint8_t field79_0x97;
uint8_t KEY_M_LONG_PRESS_ACTION; uint8_t KEY_M_LONG_PRESS_ACTION;
uint8_t BACKLIGHT_MIN;
uint8_t BACKLIGHT_MAX;
} EEPROM_Config_t; } EEPROM_Config_t;
extern EEPROM_Config_t gEeprom; extern EEPROM_Config_t gEeprom;

View File

@@ -118,30 +118,31 @@ void UI_DisplayAudioBar(void)
#if defined(ENABLE_RSSI_BAR) #if defined(ENABLE_RSSI_BAR)
void UI_DisplayRSSIBar(const int16_t rssi, const bool now) void UI_DisplayRSSIBar(const int16_t rssi, const bool now)
{ {
// const int16_t s0_dBm = -127; // S0 .. base level
const int16_t s0_dBm = -147; // S0 .. base level const int16_t s0_dBm = -147; // S0 .. base level
const int16_t s9_dBm = s0_dBm + (6 * 9); // S9 .. 6dB/S-Point
const int16_t bar_max_dBm = s9_dBm + 30; // S9+30dB
// const int16_t bar_min_dBm = s0_dBm + (6 * 0); // S0
const int16_t bar_min_dBm = s0_dBm + (6 * 4); // S4
// ************
const unsigned int txt_width = 7 * 8; // 8 text chars const unsigned int txt_width = 7 * 8; // 8 text chars
const unsigned int bar_x = 2 + txt_width + 4; // X coord of bar graph const unsigned int bar_x = 2 + txt_width + 4; // X coord of bar graph
const unsigned int bar_width = LCD_WIDTH - 1 - bar_x;
const int16_t rssi_dBm = (rssi / 2) - 160; const int16_t rssi_dBm = (rssi / 2) - 160;
const int16_t clamped_dBm = (rssi_dBm <= bar_min_dBm) ? bar_min_dBm : (rssi_dBm >= bar_max_dBm) ? bar_max_dBm : rssi_dBm;
const unsigned int bar_range_dB = bar_max_dBm - bar_min_dBm;
const unsigned int len = ((clamped_dBm - bar_min_dBm) * bar_width) / bar_range_dB;
const unsigned int line = 3; const unsigned int line = 3;
uint8_t *p_line = gFrameBuffer[line]; uint8_t *p_line = gFrameBuffer[line];
char str[16];
char s[16]; const char plus[] = {
unsigned int i; 0b00011000,
0b00011000,
0b01111110,
0b01111110,
0b01111110,
0b00011000,
0b00011000,
};
const char hollowBar[] = {
0b01111111,
0b01000001,
0b01000001,
0b01111111
};
if (gEeprom.KEY_LOCK && gKeypadLocked > 0) if (gEeprom.KEY_LOCK && gKeypadLocked > 0)
return; // display is in use return; // display is in use
@@ -154,28 +155,27 @@ void UI_DisplayRSSIBar(const int16_t rssi, const bool now)
if (now) if (now)
memset(p_line, 0, LCD_WIDTH); memset(p_line, 0, LCD_WIDTH);
if (rssi_dBm >= (s9_dBm + 6)) const uint8_t s_level = MIN(MAX((rssi_dBm - s0_dBm) / 6, 0), 9);
{ // S9+XXdB, 1dB increment uint8_t overS9Bars = MAX(0, 73 + rssi_dBm)/10;
const char *fmt[] = {"%3d 9+%u ", "%3d 9+%2u "};
const unsigned int s9_dB = ((rssi_dBm - s9_dBm) <= 99) ? rssi_dBm - s9_dBm : 99;
sprintf(s, (s9_dB < 10) ? fmt[0] : fmt[1], rssi_dBm, s9_dB);
}
else
{ // S0 ~ S9, 6dB per S-point
const unsigned int s_level = (rssi_dBm >= s0_dBm) ? (rssi_dBm - s0_dBm) / 6 : 0;
sprintf(s, "%4d S%u ", rssi_dBm, s_level);
}
UI_PrintStringSmall(s, 2, 0, line);
#if 1 if(overS9Bars == 0) {
// solid bar sprintf(str, "% 4d S%d", rssi_dBm, s_level);
for (i = 0; i < bar_width; i++) }
p_line[bar_x + i] = (i > len) ? ((i & 1) == 0) ? 0x41 : 0x00 : ((i & 1) == 0) ? 0x7f : 0x3e; else {
#else sprintf(str, "% 4d %d0", rssi_dBm, overS9Bars);
// knuled bar memcpy(p_line + 2 + 7*5, &plus, ARRAY_SIZE(plus));
for (i = 0; i < bar_width; i += 2) }
p_line[bar_x + i] = (i <= len) ? 0x7f : 0x41;
#endif UI_PrintStringSmall(str, 2, 0, line);
for(uint8_t i = 0; i < s_level; i++) { // S bars
for(uint8_t j = 0; j < 4; j++)
p_line[bar_x + i * 5 + j] = (~(0x7F >> (i+1))) & 0x7F;
}
overS9Bars = MIN(overS9Bars, 4);
for(uint8_t i = 0; i < overS9Bars; i++) { // +10 hollow bars
memcpy(p_line + (bar_x + (i + 9) * 5), &hollowBar, ARRAY_SIZE(hollowBar));
}
if (now) if (now)
ST7565_BlitFullScreen(); ST7565_BlitFullScreen();
@@ -271,7 +271,7 @@ void UI_DisplayMain(void)
{ {
const unsigned int line0 = 0; // text screen line const unsigned int line0 = 0; // text screen line
const unsigned int line1 = 4; const unsigned int line1 = 4;
char String[16]; char String[22];
unsigned int vfo_num; unsigned int vfo_num;
center_line = CENTER_LINE_NONE; center_line = CENTER_LINE_NONE;
@@ -389,7 +389,7 @@ void UI_DisplayMain(void)
} }
} }
if (gEeprom.ScreenChannel[vfo_num] <= MR_CHANNEL_LAST) if (IS_MR_CHANNEL(gEeprom.ScreenChannel[vfo_num]))
{ // channel mode { // channel mode
const unsigned int x = 2; const unsigned int x = 2;
const bool inputting = (gInputBoxIndex == 0 || gEeprom.TX_VFO != vfo_num) ? false : true; const bool inputting = (gInputBoxIndex == 0 || gEeprom.TX_VFO != vfo_num) ? false : true;
@@ -471,7 +471,7 @@ void UI_DisplayMain(void)
frequency = gEeprom.VfoInfo[vfo_num].pTX->Frequency; frequency = gEeprom.VfoInfo[vfo_num].pTX->Frequency;
} }
if (gEeprom.ScreenChannel[vfo_num] <= MR_CHANNEL_LAST) if (IS_MR_CHANNEL(gEeprom.ScreenChannel[vfo_num]))
{ // it's a channel { // it's a channel
// show the scan list assigment symbols // show the scan list assigment symbols

View File

@@ -83,6 +83,8 @@ const t_menu_item MenuList[] =
{"POnMsg", VOICE_ID_INVALID, MENU_PONMSG }, {"POnMsg", VOICE_ID_INVALID, MENU_PONMSG },
{"BatTxt", VOICE_ID_INVALID, MENU_BAT_TXT }, {"BatTxt", VOICE_ID_INVALID, MENU_BAT_TXT },
{"BackLt", VOICE_ID_INVALID, MENU_ABR }, // was "ABR" {"BackLt", VOICE_ID_INVALID, MENU_ABR }, // was "ABR"
{"BLMin", VOICE_ID_INVALID, MENU_ABR_MIN },
{"BLMax", VOICE_ID_INVALID, MENU_ABR_MAX },
{"BltTRX", VOICE_ID_INVALID, MENU_ABR_ON_TX_RX }, {"BltTRX", VOICE_ID_INVALID, MENU_ABR_ON_TX_RX },
{"Beep", VOICE_ID_BEEP_PROMPT, MENU_BEEP }, {"Beep", VOICE_ID_BEEP_PROMPT, MENU_BEEP },
#ifdef ENABLE_VOICE #ifdef ENABLE_VOICE
@@ -351,6 +353,7 @@ const t_sidefunction SIDEFUNCTIONS[] =
#endif #endif
{"LOCK\nKEYPAD", ACTION_OPT_KEYLOCK}, {"LOCK\nKEYPAD", ACTION_OPT_KEYLOCK},
{"SWITCH\nVFO", ACTION_OPT_A_B}, {"SWITCH\nVFO", ACTION_OPT_A_B},
{"VFO/MR", ACTION_OPT_VFO_MR},
}; };
const t_sidefunction* gSubMenu_SIDEFUNCTIONS = SIDEFUNCTIONS; const t_sidefunction* gSubMenu_SIDEFUNCTIONS = SIDEFUNCTIONS;
const uint8_t gSubMenu_SIDEFUNCTIONS_size = ARRAY_SIZE(SIDEFUNCTIONS); const uint8_t gSubMenu_SIDEFUNCTIONS_size = ARRAY_SIZE(SIDEFUNCTIONS);
@@ -549,21 +552,13 @@ void UI_DisplayMenu(void)
case MENU_OFFSET: case MENU_OFFSET:
if (!gIsInSubMenu || gInputBoxIndex == 0) if (!gIsInSubMenu || gInputBoxIndex == 0)
{ {
sprintf(String, "%d.%05u", gSubMenuSelection / 100000, abs(gSubMenuSelection) % 100000); sprintf(String, "%3d.%05u", gSubMenuSelection / 100000, abs(gSubMenuSelection) % 100000);
UI_PrintString(String, menu_item_x1, menu_item_x2, 1, 8); UI_PrintString(String, menu_item_x1, menu_item_x2, 1, 8);
} }
else else
{ {
for (i = 0; i < 3; i++) const char * ascii = INPUTBOX_GetAscii();
String[i ] = (gInputBox[i] == 10) ? '-' : gInputBox[i] + '0'; sprintf(String, "%.3s.%.3s ",ascii, ascii + 3);
String[3] = '.';
for (i = 3; i < 6; i++)
String[i + 1] = (gInputBox[i] == 10) ? '-' : gInputBox[i] + '0';
String[ 7] = '-';
String[ 8] = '-';
String[ 9] = 0;
String[10] = 0;
String[11] = 0;
UI_PrintString(String, menu_item_x1, menu_item_x2, 1, 8); UI_PrintString(String, menu_item_x1, menu_item_x2, 1, 8);
} }
@@ -597,6 +592,16 @@ void UI_DisplayMenu(void)
case MENU_ABR: case MENU_ABR:
strcpy(String, gSubMenu_BACKLIGHT[gSubMenuSelection]); strcpy(String, gSubMenu_BACKLIGHT[gSubMenuSelection]);
BACKLIGHT_SetBrightness(-1);
break;
case MENU_ABR_MIN:
case MENU_ABR_MAX:
sprintf(String, "%d", gSubMenuSelection);
if(gIsInSubMenu)
BACKLIGHT_SetBrightness(gSubMenuSelection);
else
BACKLIGHT_SetBrightness(-1);
break; break;
case MENU_AM: case MENU_AM:

View File

@@ -53,6 +53,8 @@ enum
#endif #endif
MENU_ABR, MENU_ABR,
MENU_ABR_ON_TX_RX, MENU_ABR_ON_TX_RX,
MENU_ABR_MIN,
MENU_ABR_MAX,
MENU_TDR, MENU_TDR,
MENU_BEEP, MENU_BEEP,
#ifdef ENABLE_VOICE #ifdef ENABLE_VOICE

View File

@@ -88,7 +88,7 @@ void UI_DisplayStatus(const bool test_display)
// SCAN indicator // SCAN indicator
if (gScanStateDir != SCAN_OFF || gScreenToDisplay == DISPLAY_SCANNER || test_display) if (gScanStateDir != SCAN_OFF || gScreenToDisplay == DISPLAY_SCANNER || test_display)
{ {
if (gNextMrChannel <= MR_CHANNEL_LAST && gScreenToDisplay != DISPLAY_SCANNER) if (IS_MR_CHANNEL(gNextMrChannel) && gScreenToDisplay != DISPLAY_SCANNER)
{ // channel mode { // channel mode
if (gEeprom.SCAN_LIST_DEFAULT == 0) if (gEeprom.SCAN_LIST_DEFAULT == 0)
UI_PrintStringSmallBuffer("1", line + x); UI_PrintStringSmallBuffer("1", line + x);