mirror of
https://github.com/OneOfEleven/uv-k5-firmware-custom.git
synced 2025-04-28 14:21:25 +03:00
Edited "D HOLD" times to include "STAY ON SCREEN" option
This commit is contained in:
parent
06c7d79b4b
commit
0547452589
109
app/app.c
109
app/app.c
@ -1319,7 +1319,7 @@ void APP_CheckKeys(void)
|
||||
{ // PTT pressed
|
||||
if (++gPttDebounceCounter >= 3) // 30ms
|
||||
{ // start transmitting
|
||||
boot_counter_10ms = 0;
|
||||
boot_counter_10ms = 0; // cancel the boot-up screen
|
||||
gPttDebounceCounter = 0;
|
||||
gPttIsPressed = true;
|
||||
APP_ProcessKey(KEY_PTT, true, false);
|
||||
@ -1333,8 +1333,16 @@ void APP_CheckKeys(void)
|
||||
// scan the hardware keys
|
||||
Key = KEYBOARD_Poll();
|
||||
|
||||
if (Key != KEY_INVALID)
|
||||
boot_counter_10ms = 0; // cancel boot screen/beeps if any key pressed
|
||||
if (Key == KEY_INVALID)
|
||||
{
|
||||
// gKeyReading0 = KEY_INVALID;
|
||||
// gKeyReading1 = KEY_INVALID;
|
||||
// gDebounceCounter = 0;
|
||||
// gKeyBeingHeld = false;
|
||||
// return;
|
||||
}
|
||||
|
||||
boot_counter_10ms = 0; // cancel boot screen/beeps
|
||||
|
||||
if (gKeyReading0 != Key)
|
||||
{ // new key pressed
|
||||
@ -1549,9 +1557,11 @@ void APP_TimeSlice10ms(void)
|
||||
|
||||
if (gScanDelay_10ms > 0)
|
||||
{
|
||||
gScanDelay_10ms--;
|
||||
APP_CheckKeys();
|
||||
return;
|
||||
if (--gScanDelay_10ms > 0)
|
||||
{
|
||||
APP_CheckKeys();
|
||||
return;
|
||||
}
|
||||
}
|
||||
|
||||
if (gScannerEditState != SCAN_EDIT_STATE_NONE)
|
||||
@ -1564,36 +1574,33 @@ void APP_TimeSlice10ms(void)
|
||||
{
|
||||
case SCAN_CSS_STATE_OFF:
|
||||
|
||||
// must be RF frequency scanning if we're here ?
|
||||
|
||||
if (!BK4819_GetFrequencyScanResult(&Result))
|
||||
break;
|
||||
|
||||
// accept only within 1kHz
|
||||
Delta = Result - gScanFrequency;
|
||||
gScanHitCount = (abs(Delta) < 100) ? gScanHitCount + 1 : 0;
|
||||
|
||||
BK4819_DisableFrequencyScan();
|
||||
|
||||
#if 0
|
||||
gScanFrequency = Result;
|
||||
#else
|
||||
{
|
||||
{ // round to nearest step multiple
|
||||
const uint32_t step = StepFrequencyTable[gStepSetting];
|
||||
gScanFrequency = ((Result + (step / 2)) / step) * step; // round to nearest step multiple
|
||||
// gScanFrequency = (Result / step) * step; // round down
|
||||
gScanFrequency = ((Result + (step / 2)) / step) * step;
|
||||
}
|
||||
#endif
|
||||
|
||||
Delta = abs(Delta);
|
||||
|
||||
gScanHitCount = (Delta < 100) ? gScanHitCount + 1 : 0;
|
||||
|
||||
BK4819_DisableFrequencyScan();
|
||||
|
||||
if (gScanHitCount < 3)
|
||||
{
|
||||
{ // keep scanning for an RF carrier
|
||||
BK4819_EnableFrequencyScan();
|
||||
}
|
||||
else
|
||||
{
|
||||
{ // RF carrier found .. stop RF scanning
|
||||
BK4819_SetScanFrequency(gScanFrequency);
|
||||
|
||||
// start CTCSS/CTDSS scanning
|
||||
gScanCssResultCode = 0xFF;
|
||||
gScanCssResultType = 0xFF;
|
||||
gScanHitCount = 0;
|
||||
@ -1602,12 +1609,10 @@ void APP_TimeSlice10ms(void)
|
||||
gScanCssState = SCAN_CSS_STATE_SCANNING;
|
||||
|
||||
GUI_SelectNextDisplay(DISPLAY_SCANNER);
|
||||
|
||||
gUpdateStatus = true;
|
||||
gUpdateStatus = true;
|
||||
}
|
||||
|
||||
gScanDelay_10ms = scan_delay_10ms;
|
||||
//gScanDelay_10ms = 1; // 10ms
|
||||
gScanDelay_10ms = scan_freq_css_delay_10ms;
|
||||
break;
|
||||
|
||||
case SCAN_CSS_STATE_SCANNING:
|
||||
@ -1652,10 +1657,10 @@ void APP_TimeSlice10ms(void)
|
||||
}
|
||||
}
|
||||
|
||||
if (gScanCssState < SCAN_CSS_STATE_FOUND)
|
||||
{
|
||||
if (gScanCssState == SCAN_CSS_STATE_OFF || gScanCssState == SCAN_CSS_STATE_SCANNING)
|
||||
{ // re-start scan
|
||||
BK4819_SetScanFrequency(gScanFrequency);
|
||||
gScanDelay_10ms = scan_delay_10ms;
|
||||
gScanDelay_10ms = scan_freq_css_delay_10ms;
|
||||
break;
|
||||
}
|
||||
|
||||
@ -1686,22 +1691,22 @@ void APP_TimeSlice10ms(void)
|
||||
|
||||
void cancelUserInputModes(void)
|
||||
{
|
||||
gKeyInputCountdown = 0;
|
||||
|
||||
if (gDTMF_InputMode || gDTMF_InputBox_Index > 0 || gInputBoxIndex > 0)
|
||||
if (gDTMF_InputMode || gDTMF_InputBox_Index > 0)
|
||||
{
|
||||
DTMF_clear_input_box();
|
||||
gInputBoxIndex = 0;
|
||||
gBeepToPlay = BEEP_500HZ_60MS_DOUBLE_BEEP_OPTIONAL;
|
||||
gRequestDisplayScreen = DISPLAY_MAIN;
|
||||
gUpdateDisplay = true;
|
||||
}
|
||||
|
||||
if (gWasFKeyPressed)
|
||||
if (gWasFKeyPressed || gKeyInputCountdown > 0 || gInputBoxIndex > 0)
|
||||
{
|
||||
gWasFKeyPressed = false;
|
||||
gBeepToPlay = BEEP_500HZ_60MS_DOUBLE_BEEP_OPTIONAL;
|
||||
gUpdateStatus = true;
|
||||
gWasFKeyPressed = false;
|
||||
gInputBoxIndex = 0;
|
||||
gKeyInputCountdown = 0;
|
||||
gBeepToPlay = BEEP_500HZ_60MS_DOUBLE_BEEP_OPTIONAL;
|
||||
gUpdateStatus = true;
|
||||
gUpdateDisplay = true;
|
||||
}
|
||||
}
|
||||
|
||||
@ -1997,7 +2002,6 @@ void APP_TimeSlice500ms(void)
|
||||
if (gDTMF_DecodeRingCountdown_500ms > 0)
|
||||
{ // make "ring-ring" sound
|
||||
gDTMF_DecodeRingCountdown_500ms--;
|
||||
|
||||
AUDIO_PlayBeep(BEEP_880HZ_200MS);
|
||||
}
|
||||
}
|
||||
@ -2012,10 +2016,19 @@ void APP_TimeSlice500ms(void)
|
||||
{
|
||||
if (--gDTMF_auto_reset_time_500ms == 0)
|
||||
{
|
||||
gDTMF_CallState = DTMF_CALL_STATE_NONE;
|
||||
if (gDTMF_CallState == DTMF_CALL_STATE_RECEIVED && gEeprom.DTMF_auto_reset_time >= DTMF_HOLD_MAX)
|
||||
gDTMF_CallState = DTMF_CALL_STATE_RECEIVED_STAY; // keep message on-screen till a key is pressed
|
||||
else
|
||||
gDTMF_CallState = DTMF_CALL_STATE_NONE;
|
||||
gUpdateDisplay = true;
|
||||
}
|
||||
}
|
||||
|
||||
// if (gDTMF_CallState != DTMF_CALL_STATE_RECEIVED_STAY)
|
||||
// {
|
||||
// gDTMF_CallState = DTMF_CALL_STATE_NONE;
|
||||
// gUpdateDisplay = true;
|
||||
// }
|
||||
}
|
||||
|
||||
if (gDTMF_IsTx && gDTMF_TxStopCountdown_500ms > 0)
|
||||
@ -2083,12 +2096,12 @@ void CHANNEL_Next(const bool bFlag, const int8_t scan_direction)
|
||||
bScanKeepFrequency = false;
|
||||
}
|
||||
|
||||
static void APP_ProcessKey(KEY_Code_t Key, bool bKeyPressed, bool bKeyHeld)
|
||||
static void APP_ProcessKey(const KEY_Code_t Key, const bool bKeyPressed, const bool bKeyHeld)
|
||||
{
|
||||
bool bFlag = false;
|
||||
|
||||
if (Key == KEY_INVALID)
|
||||
return;
|
||||
// if (Key == KEY_INVALID)
|
||||
// return;
|
||||
|
||||
const bool backlight_was_on = GPIO_CheckBit(&GPIOB->DATA, GPIOB_PIN_BACKLIGHT);
|
||||
|
||||
@ -2142,7 +2155,7 @@ static void APP_ProcessKey(KEY_Code_t Key, bool bKeyPressed, bool bKeyHeld)
|
||||
}
|
||||
else
|
||||
{
|
||||
if (Key != KEY_PTT)
|
||||
if (Key != KEY_PTT || gSetting_backlight_on_tx_rx == 1 || gSetting_backlight_on_tx_rx == 3)
|
||||
BACKLIGHT_TurnOn();
|
||||
|
||||
if (Key == KEY_EXIT && bKeyHeld)
|
||||
@ -2155,6 +2168,9 @@ static void APP_ProcessKey(KEY_Code_t Key, bool bKeyPressed, bool bKeyHeld)
|
||||
gDTMF_RX_live_timeout = 0;
|
||||
gUpdateDisplay = true;
|
||||
}
|
||||
|
||||
// cancel user input
|
||||
cancelUserInputModes();
|
||||
}
|
||||
|
||||
if (gScreenToDisplay == DISPLAY_MENU) // 1of11
|
||||
@ -2232,7 +2248,6 @@ static void APP_ProcessKey(KEY_Code_t Key, bool bKeyPressed, bool bKeyHeld)
|
||||
{
|
||||
if (bKeyHeld)
|
||||
bFlag = true;
|
||||
|
||||
if (!bKeyPressed)
|
||||
{
|
||||
bFlag = true;
|
||||
@ -2334,7 +2349,7 @@ static void APP_ProcessKey(KEY_Code_t Key, bool bKeyPressed, bool bKeyHeld)
|
||||
{
|
||||
case DISPLAY_MAIN:
|
||||
MAIN_ProcessKeys(Key, bKeyPressed, bKeyHeld);
|
||||
bKeyHeld = false; // allow the channel setting to be saved
|
||||
// bKeyHeld = false; // allow the channel setting to be saved
|
||||
break;
|
||||
|
||||
#ifdef ENABLE_FMRADIO
|
||||
@ -2375,9 +2390,6 @@ static void APP_ProcessKey(KEY_Code_t Key, bool bKeyPressed, bool bKeyHeld)
|
||||
if (!bKeyHeld && bKeyPressed)
|
||||
gBeepToPlay = BEEP_500HZ_60MS_DOUBLE_BEEP_OPTIONAL;
|
||||
}
|
||||
else
|
||||
if (Key == KEY_EXIT && bKeyHeld)
|
||||
cancelUserInputModes();
|
||||
|
||||
Skip:
|
||||
if (gBeepToPlay != BEEP_NONE)
|
||||
@ -2399,7 +2411,6 @@ Skip:
|
||||
if (gFlagStopScan)
|
||||
{
|
||||
BK4819_StopScan();
|
||||
|
||||
gFlagStopScan = false;
|
||||
}
|
||||
|
||||
@ -2506,6 +2517,8 @@ Skip:
|
||||
|
||||
if (gFlagStartScan)
|
||||
{
|
||||
gFlagStartScan = false;
|
||||
|
||||
gMonitor = false;
|
||||
|
||||
#ifdef ENABLE_VOICE
|
||||
@ -2516,7 +2529,6 @@ Skip:
|
||||
SCANNER_Start();
|
||||
|
||||
gRequestDisplayScreen = DISPLAY_SCANNER;
|
||||
gFlagStartScan = false;
|
||||
}
|
||||
|
||||
if (gFlagPrepareTX)
|
||||
@ -2536,6 +2548,7 @@ Skip:
|
||||
#endif
|
||||
|
||||
GUI_SelectNextDisplay(gRequestDisplayScreen);
|
||||
|
||||
gRequestDisplayScreen = DISPLAY_INVALID;
|
||||
|
||||
gUpdateDisplay = true;
|
||||
}
|
||||
|
@ -33,7 +33,8 @@ typedef enum DTMF_State_t DTMF_State_t;
|
||||
enum DTMF_CallState_t {
|
||||
DTMF_CALL_STATE_NONE = 0,
|
||||
DTMF_CALL_STATE_CALL_OUT,
|
||||
DTMF_CALL_STATE_RECEIVED
|
||||
DTMF_CALL_STATE_RECEIVED,
|
||||
DTMF_CALL_STATE_RECEIVED_STAY
|
||||
};
|
||||
|
||||
enum DTMF_DecodeResponse_t {
|
||||
@ -60,6 +61,11 @@ enum DTMF_CallMode_t {
|
||||
DTMF_CALL_MODE_DTMF
|
||||
};
|
||||
|
||||
enum { // seconds
|
||||
DTMF_HOLD_MIN = 5,
|
||||
DTMF_HOLD_MAX = 60
|
||||
};
|
||||
|
||||
typedef enum DTMF_CallMode_t DTMF_CallMode_t;
|
||||
|
||||
extern char gDTMF_String[15];
|
||||
|
262
app/generic.c
262
app/generic.c
@ -119,158 +119,154 @@ void GENERIC_Key_PTT(bool bKeyPressed)
|
||||
gInputBoxIndex = 0;
|
||||
|
||||
if (!bKeyPressed || gSerialConfigCountDown_500ms > 0)
|
||||
{
|
||||
//if (gScreenToDisplay == DISPLAY_MAIN)
|
||||
{
|
||||
if (gCurrentFunction == FUNCTION_TRANSMIT)
|
||||
{ // PTT released
|
||||
|
||||
if (gCurrentFunction == FUNCTION_TRANSMIT)
|
||||
{ // we are transmitting .. stop
|
||||
|
||||
if (gFlagEndTransmission)
|
||||
{
|
||||
if (gFlagEndTransmission)
|
||||
{
|
||||
FUNCTION_Select(FUNCTION_FOREGROUND);
|
||||
}
|
||||
else
|
||||
{
|
||||
APP_EndTransmission();
|
||||
|
||||
if (gEeprom.REPEATER_TAIL_TONE_ELIMINATION == 0)
|
||||
{
|
||||
FUNCTION_Select(FUNCTION_FOREGROUND);
|
||||
}
|
||||
else
|
||||
gRTTECountdown = gEeprom.REPEATER_TAIL_TONE_ELIMINATION * 10;
|
||||
}
|
||||
|
||||
gFlagEndTransmission = false;
|
||||
#ifdef ENABLE_VOX
|
||||
gVOX_NoiseDetected = false;
|
||||
#endif
|
||||
FUNCTION_Select(FUNCTION_FOREGROUND);
|
||||
}
|
||||
else
|
||||
{
|
||||
APP_EndTransmission();
|
||||
|
||||
if (gEeprom.REPEATER_TAIL_TONE_ELIMINATION == 0)
|
||||
FUNCTION_Select(FUNCTION_FOREGROUND);
|
||||
else
|
||||
gRTTECountdown = gEeprom.REPEATER_TAIL_TONE_ELIMINATION * 10;
|
||||
}
|
||||
|
||||
gFlagEndTransmission = false;
|
||||
|
||||
#ifdef ENABLE_VOX
|
||||
gVOX_NoiseDetected = false;
|
||||
#endif
|
||||
|
||||
RADIO_SetVfoState(VFO_STATE_NORMAL);
|
||||
|
||||
if (gScreenToDisplay != DISPLAY_MENU) // 1of11 .. don't close the menu
|
||||
gRequestDisplayScreen = DISPLAY_MAIN;
|
||||
|
||||
return;
|
||||
}
|
||||
|
||||
return;
|
||||
}
|
||||
|
||||
// PTT pressed
|
||||
|
||||
if (gScanStateDir != SCAN_OFF || // frequency/channel scanning
|
||||
gScreenToDisplay == DISPLAY_SCANNER || // CTCSS/CDCSS scanning
|
||||
gCssScanMode != CSS_SCAN_MODE_OFF) // " "
|
||||
{ // we're scanning .. stop
|
||||
|
||||
if (gScreenToDisplay == DISPLAY_SCANNER)
|
||||
{ // CTCSS/CDCSS scanning .. stop
|
||||
gEeprom.CROSS_BAND_RX_TX = gBackup_CROSS_BAND_RX_TX;
|
||||
gFlagStopScan = true;
|
||||
gVfoConfigureMode = VFO_CONFIGURE_RELOAD;
|
||||
gFlagResetVfos = true;
|
||||
}
|
||||
else
|
||||
if (gScanStateDir != SCAN_OFF)
|
||||
{ // frequency/channel scanning . .stop
|
||||
SCANNER_Stop();
|
||||
}
|
||||
else
|
||||
if (gCssScanMode != CSS_SCAN_MODE_OFF)
|
||||
{ // CTCSS/CDCSS scanning .. stop
|
||||
MENU_StopCssScan();
|
||||
|
||||
#ifdef ENABLE_VOICE
|
||||
gAnotherVoiceID = VOICE_ID_SCANNING_STOP;
|
||||
#endif
|
||||
}
|
||||
|
||||
goto cancel_tx;
|
||||
}
|
||||
|
||||
#ifdef ENABLE_FMRADIO
|
||||
if (gFM_ScanState != FM_SCAN_OFF)
|
||||
{ // FM radio is scanning .. stop
|
||||
FM_PlayAndUpdate();
|
||||
#ifdef ENABLE_VOICE
|
||||
gAnotherVoiceID = VOICE_ID_SCANNING_STOP;
|
||||
#endif
|
||||
gRequestDisplayScreen = DISPLAY_FM;
|
||||
goto cancel_tx;
|
||||
}
|
||||
#endif
|
||||
|
||||
#ifdef ENABLE_FMRADIO
|
||||
if (gScreenToDisplay == DISPLAY_FM)
|
||||
goto start_tx; // listening to the FM radio .. start TX'ing
|
||||
#endif
|
||||
|
||||
if (gCurrentFunction == FUNCTION_TRANSMIT && gRTTECountdown == 0)
|
||||
{ // already transmitting
|
||||
gInputBoxIndex = 0;
|
||||
return;
|
||||
}
|
||||
|
||||
if (gScanStateDir != SCAN_OFF)
|
||||
{
|
||||
SCANNER_Stop();
|
||||
if (gScreenToDisplay != DISPLAY_MENU) // 1of11 .. don't close the menu
|
||||
gRequestDisplayScreen = DISPLAY_MAIN;
|
||||
|
||||
gPttDebounceCounter = 0;
|
||||
gPttIsPressed = false;
|
||||
if (!gDTMF_InputMode && gDTMF_InputBox_Index == 0)
|
||||
goto start_tx; // wasn't entering a DTMF code .. start TX'ing (maybe)
|
||||
|
||||
if (gScreenToDisplay != DISPLAY_MENU) // 1of11 .. don't close the menu
|
||||
gRequestDisplayScreen = DISPLAY_MAIN;
|
||||
// was entering a DTMF string
|
||||
|
||||
return;
|
||||
if (gDTMF_InputBox_Index > 0 || gDTMF_PreviousIndex > 0)
|
||||
{ // going to transmit a DTMF string
|
||||
|
||||
if (gDTMF_InputBox_Index == 0 && gDTMF_PreviousIndex > 0)
|
||||
gDTMF_InputBox_Index = gDTMF_PreviousIndex; // use the previous DTMF string
|
||||
|
||||
if (gDTMF_InputBox_Index < sizeof(gDTMF_InputBox))
|
||||
gDTMF_InputBox[gDTMF_InputBox_Index] = 0; // NULL term the string
|
||||
|
||||
#if 0
|
||||
// append our DTMF ID to the inputted DTMF code -
|
||||
// IF the user inputted code is exactly 3 digits long
|
||||
if (gDTMF_InputBox_Index == 3)
|
||||
gDTMF_CallMode = DTMF_CheckGroupCall(gDTMF_InputBox, 3);
|
||||
else
|
||||
gDTMF_CallMode = DTMF_CALL_MODE_DTMF;
|
||||
#else
|
||||
// append our DTMF ID to the inputted DTMF code -
|
||||
// IF the user inputted code is exactly 3 digits long and D-DCD is enabled
|
||||
if (gDTMF_InputBox_Index == 3 && gTxVfo->DTMF_DECODING_ENABLE > 0)
|
||||
gDTMF_CallMode = DTMF_CheckGroupCall(gDTMF_InputBox, 3);
|
||||
else
|
||||
gDTMF_CallMode = DTMF_CALL_MODE_DTMF;
|
||||
#endif
|
||||
|
||||
// remember the DTMF string
|
||||
gDTMF_PreviousIndex = gDTMF_InputBox_Index;
|
||||
strcpy(gDTMF_String, gDTMF_InputBox);
|
||||
|
||||
gDTMF_ReplyState = DTMF_REPLY_ANI;
|
||||
gDTMF_State = DTMF_STATE_0;
|
||||
}
|
||||
|
||||
#ifdef ENABLE_FMRADIO
|
||||
if (gFM_ScanState == FM_SCAN_OFF)
|
||||
#endif
|
||||
DTMF_clear_input_box();
|
||||
|
||||
start_tx:
|
||||
// request start TX
|
||||
gFlagPrepareTX = true;
|
||||
goto done;
|
||||
|
||||
cancel_tx:
|
||||
if (gPttIsPressed)
|
||||
{
|
||||
if (gCssScanMode == CSS_SCAN_MODE_OFF)
|
||||
{
|
||||
#ifdef ENABLE_FMRADIO
|
||||
if (gScreenToDisplay == DISPLAY_FM)
|
||||
{
|
||||
gRequestDisplayScreen = DISPLAY_MAIN;
|
||||
gInputBoxIndex = 0;
|
||||
gPttIsPressed = false;
|
||||
gPttDebounceCounter = 0;
|
||||
return;
|
||||
}
|
||||
#endif
|
||||
|
||||
if (gScreenToDisplay != DISPLAY_SCANNER)
|
||||
{
|
||||
if (gCurrentFunction == FUNCTION_TRANSMIT && gRTTECountdown == 0)
|
||||
{
|
||||
gInputBoxIndex = 0;
|
||||
return;
|
||||
}
|
||||
|
||||
if (gScreenToDisplay != DISPLAY_MENU) // 1of11 .. don't close the menu
|
||||
gRequestDisplayScreen = DISPLAY_MAIN;
|
||||
|
||||
if (!gDTMF_InputMode)
|
||||
{
|
||||
gFlagPrepareTX = true;
|
||||
gInputBoxIndex = 0;
|
||||
return;
|
||||
}
|
||||
|
||||
gDTMF_InputMode = false;
|
||||
// gUpdateDisplay = true;
|
||||
|
||||
if (gDTMF_InputBox_Index > 0 || gDTMF_PreviousIndex > 0)
|
||||
{
|
||||
if (gDTMF_InputBox_Index == 0)
|
||||
gDTMF_InputBox_Index = gDTMF_PreviousIndex;
|
||||
|
||||
if (gDTMF_InputBox_Index < sizeof(gDTMF_InputBox))
|
||||
gDTMF_InputBox[gDTMF_InputBox_Index] = 0;
|
||||
|
||||
#if 0
|
||||
// append our DTMF ID to the inputted DTMF code -
|
||||
// IF the user inputted code is exactly 3 digits long
|
||||
if (gDTMF_InputBox_Index == 3)
|
||||
gDTMF_CallMode = DTMF_CheckGroupCall(gDTMF_InputBox, 3);
|
||||
else
|
||||
#else
|
||||
// append our DTMF ID to the inputted DTMF code -
|
||||
// IF the user inputted code is exactly 3 digits long and D-DCD is enabled
|
||||
if (gDTMF_InputBox_Index == 3 && gTxVfo->DTMF_DECODING_ENABLE > 0)
|
||||
gDTMF_CallMode = DTMF_CheckGroupCall(gDTMF_InputBox, 3);
|
||||
else
|
||||
#endif
|
||||
gDTMF_CallMode = DTMF_CALL_MODE_DTMF;
|
||||
|
||||
strcpy(gDTMF_String, gDTMF_InputBox);
|
||||
gDTMF_PreviousIndex = gDTMF_InputBox_Index;
|
||||
DTMF_clear_input_box();
|
||||
|
||||
gDTMF_ReplyState = DTMF_REPLY_ANI;
|
||||
gDTMF_State = DTMF_STATE_0;
|
||||
|
||||
gFlagPrepareTX = true;
|
||||
}
|
||||
|
||||
return;
|
||||
}
|
||||
|
||||
gEeprom.CROSS_BAND_RX_TX = gBackupCROSS_BAND_RX_TX;
|
||||
gFlagStopScan = true;
|
||||
gVfoConfigureMode = VFO_CONFIGURE_RELOAD;
|
||||
gFlagResetVfos = true;
|
||||
|
||||
gUpdateStatus = true;
|
||||
}
|
||||
else
|
||||
{
|
||||
MENU_StopCssScan();
|
||||
|
||||
if (gScreenToDisplay != DISPLAY_MENU) // 1of11 .. don't close the menu
|
||||
gRequestDisplayScreen = DISPLAY_MENU;
|
||||
}
|
||||
gPttIsPressed = false;
|
||||
gPttWasPressed = true;
|
||||
}
|
||||
#ifdef ENABLE_FMRADIO
|
||||
else
|
||||
{
|
||||
FM_PlayAndUpdate();
|
||||
gRequestDisplayScreen = DISPLAY_FM;
|
||||
}
|
||||
#endif
|
||||
|
||||
#ifdef ENABLE_VOICE
|
||||
gAnotherVoiceID = VOICE_ID_SCANNING_STOP;
|
||||
#endif
|
||||
|
||||
gPttWasPressed = true;
|
||||
done:
|
||||
gPttDebounceCounter = 0;
|
||||
if (gScreenToDisplay != DISPLAY_MENU && gRequestDisplayScreen != DISPLAY_FM) // 1of11 .. don't close the menu
|
||||
gRequestDisplayScreen = DISPLAY_MAIN;
|
||||
gUpdateStatus = true;
|
||||
gUpdateDisplay = true;
|
||||
}
|
||||
|
42
app/main.c
42
app/main.c
@ -195,12 +195,12 @@ static void processFKeyFunction(const KEY_Code_t Key, const bool beep)
|
||||
gWasFKeyPressed = false;
|
||||
gFlagStartScan = true;
|
||||
gScanSingleFrequency = false;
|
||||
gBackupCROSS_BAND_RX_TX = gEeprom.CROSS_BAND_RX_TX;
|
||||
gBackup_CROSS_BAND_RX_TX = gEeprom.CROSS_BAND_RX_TX;
|
||||
gEeprom.CROSS_BAND_RX_TX = CROSS_BAND_OFF;
|
||||
gUpdateStatus = true;
|
||||
|
||||
if (beep)
|
||||
gBeepToPlay = BEEP_1KHZ_60MS_OPTIONAL;
|
||||
// if (beep)
|
||||
// gBeepToPlay = BEEP_1KHZ_60MS_OPTIONAL;
|
||||
|
||||
break;
|
||||
|
||||
@ -700,7 +700,7 @@ static void MAIN_Key_STAR(bool bKeyPressed, bool bKeyHeld)
|
||||
// scan the CTCSS/DCS code
|
||||
gFlagStartScan = true;
|
||||
gScanSingleFrequency = true;
|
||||
gBackupCROSS_BAND_RX_TX = gEeprom.CROSS_BAND_RX_TX;
|
||||
gBackup_CROSS_BAND_RX_TX = gEeprom.CROSS_BAND_RX_TX;
|
||||
gEeprom.CROSS_BAND_RX_TX = CROSS_BAND_OFF;
|
||||
}
|
||||
|
||||
@ -821,31 +821,25 @@ void MAIN_ProcessKeys(KEY_Code_t Key, bool bKeyPressed, bool bKeyHeld)
|
||||
}
|
||||
#endif
|
||||
|
||||
if (gDTMF_InputMode && bKeyPressed)
|
||||
if (gDTMF_InputMode && bKeyPressed && !bKeyHeld)
|
||||
{
|
||||
if (!bKeyHeld)
|
||||
{
|
||||
const char Character = DTMF_GetCharacter(Key);
|
||||
if (Character != 0xFF)
|
||||
{ // add key to DTMF string
|
||||
DTMF_Append(Character);
|
||||
|
||||
gKeyInputCountdown = key_input_timeout_500ms;
|
||||
|
||||
gRequestDisplayScreen = DISPLAY_MAIN;
|
||||
|
||||
gPttWasReleased = true;
|
||||
gBeepToPlay = BEEP_1KHZ_60MS_OPTIONAL;
|
||||
return;
|
||||
}
|
||||
const char Character = DTMF_GetCharacter(Key);
|
||||
if (Character != 0xFF)
|
||||
{ // add key to DTMF string
|
||||
DTMF_Append(Character);
|
||||
gKeyInputCountdown = key_input_timeout_500ms;
|
||||
gRequestDisplayScreen = DISPLAY_MAIN;
|
||||
gPttWasReleased = true;
|
||||
gBeepToPlay = BEEP_1KHZ_60MS_OPTIONAL;
|
||||
return;
|
||||
}
|
||||
}
|
||||
|
||||
// TODO: ???
|
||||
if (Key > KEY_PTT)
|
||||
{
|
||||
Key = KEY_SIDE2; // what's this doing ???
|
||||
}
|
||||
// if (Key > KEY_PTT)
|
||||
// {
|
||||
// Key = KEY_SIDE2; // what's this doing ???
|
||||
// }
|
||||
|
||||
switch (Key)
|
||||
{
|
||||
|
28
app/menu.c
28
app/menu.c
@ -314,8 +314,8 @@ int MENU_GetLimits(uint8_t Cursor, int32_t *pMin, int32_t *pMax)
|
||||
break;
|
||||
|
||||
case MENU_D_HOLD:
|
||||
*pMin = 5;
|
||||
*pMax = 60;
|
||||
*pMin = DTMF_HOLD_MIN;
|
||||
*pMax = DTMF_HOLD_MAX;
|
||||
break;
|
||||
|
||||
case MENU_D_PRE:
|
||||
@ -1079,6 +1079,30 @@ void MENU_ShowCurrentSetting(void)
|
||||
|
||||
case MENU_D_HOLD:
|
||||
gSubMenuSelection = gEeprom.DTMF_auto_reset_time;
|
||||
|
||||
if (gSubMenuSelection <= DTMF_HOLD_MIN)
|
||||
gSubMenuSelection = DTMF_HOLD_MIN;
|
||||
else
|
||||
if (gSubMenuSelection <= 10)
|
||||
gSubMenuSelection = 10;
|
||||
else
|
||||
if (gSubMenuSelection <= 20)
|
||||
gSubMenuSelection = 20;
|
||||
else
|
||||
if (gSubMenuSelection <= 30)
|
||||
gSubMenuSelection = 30;
|
||||
else
|
||||
if (gSubMenuSelection <= 40)
|
||||
gSubMenuSelection = 40;
|
||||
else
|
||||
if (gSubMenuSelection <= 50)
|
||||
gSubMenuSelection = 50;
|
||||
else
|
||||
if (gSubMenuSelection < DTMF_HOLD_MAX)
|
||||
gSubMenuSelection = 50;
|
||||
else
|
||||
gSubMenuSelection = DTMF_HOLD_MAX;
|
||||
|
||||
break;
|
||||
|
||||
case MENU_D_PRE:
|
||||
|
@ -95,7 +95,7 @@ static void SCANNER_Key_EXIT(bool bKeyPressed, bool bKeyHeld)
|
||||
case SCAN_EDIT_STATE_NONE:
|
||||
gRequestDisplayScreen = DISPLAY_MAIN;
|
||||
|
||||
gEeprom.CROSS_BAND_RX_TX = gBackupCROSS_BAND_RX_TX;
|
||||
gEeprom.CROSS_BAND_RX_TX = gBackup_CROSS_BAND_RX_TX;
|
||||
gUpdateStatus = true;
|
||||
gFlagStopScan = true;
|
||||
gVfoConfigureMode = VFO_CONFIGURE_RELOAD;
|
||||
@ -166,8 +166,6 @@ static void SCANNER_Key_MENU(bool bKeyPressed, bool bKeyHeld)
|
||||
{
|
||||
|
||||
#if 0
|
||||
// can't make head nor tail of what's being done here :(
|
||||
|
||||
uint32_t Freq250 = FREQUENCY_FloorToStep(gScanFrequency, 250, 0);
|
||||
uint32_t Freq625 = FREQUENCY_FloorToStep(gScanFrequency, 625, 0);
|
||||
|
||||
@ -207,6 +205,7 @@ static void SCANNER_Key_MENU(bool bKeyPressed, bool bKeyHeld)
|
||||
const STEP_Setting_t small_step = STEP_2_5kHz;
|
||||
const STEP_Setting_t big_step = STEP_6_25kHz;
|
||||
#endif
|
||||
|
||||
const uint32_t small_step_freq = StepFrequencyTable[small_step];
|
||||
const uint32_t big_step_freq = StepFrequencyTable[big_step];
|
||||
|
||||
@ -254,12 +253,13 @@ static void SCANNER_Key_MENU(bool bKeyPressed, bool bKeyHeld)
|
||||
gScannerEditState = SCAN_EDIT_STATE_DONE;
|
||||
}
|
||||
|
||||
gScanCssState = SCAN_CSS_STATE_FOUND;
|
||||
#ifdef ENABLE_VOICE
|
||||
gAnotherVoiceID = VOICE_ID_MEMORY_CHANNEL;
|
||||
#endif
|
||||
gRequestDisplayScreen = DISPLAY_SCANNER;
|
||||
gScanCssState = SCAN_CSS_STATE_FOUND;
|
||||
|
||||
#ifdef ENABLE_VOICE
|
||||
gAnotherVoiceID = VOICE_ID_MEMORY_CHANNEL;
|
||||
#endif
|
||||
|
||||
gRequestDisplayScreen = DISPLAY_SCANNER;
|
||||
gUpdateStatus = true;
|
||||
break;
|
||||
|
||||
@ -452,7 +452,7 @@ void SCANNER_Start(void)
|
||||
|
||||
DTMF_clear_RX();
|
||||
|
||||
gScanDelay_10ms = scan_delay_10ms;
|
||||
gScanDelay_10ms = scan_freq_css_delay_10ms;
|
||||
gScanCssResultCode = 0xFF;
|
||||
gScanCssResultType = 0xFF;
|
||||
gScanHitCount = 0;
|
||||
@ -467,6 +467,7 @@ void SCANNER_Start(void)
|
||||
g_SquelchLost = false;
|
||||
gScannerEditState = SCAN_EDIT_STATE_NONE;
|
||||
gScanProgressIndicator = 0;
|
||||
// gFlagStartScan = false;
|
||||
|
||||
gUpdateStatus = true;
|
||||
}
|
||||
@ -475,6 +476,9 @@ void SCANNER_Stop(void)
|
||||
{
|
||||
const uint8_t Previous = gRestoreMrChannel;
|
||||
|
||||
if (gScanStateDir == SCAN_OFF)
|
||||
return; // but, but, we weren't !
|
||||
|
||||
gScanStateDir = SCAN_OFF;
|
||||
|
||||
if (!bScanKeepFrequency)
|
||||
|
770
app/spectrum.c
770
app/spectrum.c
File diff suppressed because it is too large
Load Diff
@ -31,6 +31,7 @@
|
||||
#include "../font.h"
|
||||
#include "../frequencies.h"
|
||||
#include "../helper/battery.h"
|
||||
#include "../helper/measurements.h"
|
||||
#include "../misc.h"
|
||||
#include "../radio.h"
|
||||
#include "../settings.h"
|
||||
@ -41,17 +42,19 @@
|
||||
|
||||
static const uint8_t DrawingEndY = 40;
|
||||
|
||||
static const uint8_t U8RssiMap[] = {
|
||||
121, 115, 109, 103, 97, 91, 85, 79, 73, 63,
|
||||
};
|
||||
|
||||
static const uint16_t scanStepValues[] = {
|
||||
1, 10, 50, 100,
|
||||
|
||||
250, 500, 625, 833, 1000, 1250, 2500, 10000,
|
||||
};
|
||||
|
||||
static const uint16_t scanStepBWRegValues[] = {
|
||||
static const uint8_t gStepSettingToIndex[] = {
|
||||
[STEP_2_5kHz] = 4, [STEP_5_0kHz] = 5, [STEP_6_25kHz] = 6,
|
||||
[STEP_10_0kHz] = 8, [STEP_12_5kHz] = 9, [STEP_25_0kHz] = 10,
|
||||
[STEP_8_33kHz] = 7,
|
||||
};
|
||||
|
||||
static const uint16_t scanStepBWRegValues[12] = {
|
||||
// RX RXw TX BW
|
||||
// 0b0 000 000 001 01 1000
|
||||
// 1
|
||||
@ -122,17 +125,16 @@ typedef enum ScanStep {
|
||||
} ScanStep;
|
||||
|
||||
typedef struct SpectrumSettings {
|
||||
uint32_t frequencyChangeStep;
|
||||
StepsCount stepsCount;
|
||||
ScanStep scanStepIndex;
|
||||
uint32_t frequencyChangeStep;
|
||||
uint16_t scanDelay;
|
||||
uint16_t rssiTriggerLevel;
|
||||
|
||||
bool backlightState;
|
||||
BK4819_FilterBandwidth_t bw;
|
||||
BK4819_FilterBandwidth_t listenBw;
|
||||
int dbMin;
|
||||
int dbMax;
|
||||
ModulationType modulationType;
|
||||
bool backlightState;
|
||||
} SpectrumSettings;
|
||||
|
||||
typedef struct KeyboardState {
|
||||
@ -150,7 +152,7 @@ typedef struct ScanInfo {
|
||||
} ScanInfo;
|
||||
|
||||
typedef struct RegisterSpec {
|
||||
char *name;
|
||||
const char *name;
|
||||
uint8_t num;
|
||||
uint8_t offset;
|
||||
uint16_t maxValue;
|
||||
@ -160,10 +162,56 @@ typedef struct RegisterSpec {
|
||||
typedef struct PeakInfo {
|
||||
uint16_t t;
|
||||
uint16_t rssi;
|
||||
uint32_t f;
|
||||
uint8_t i;
|
||||
uint32_t f;
|
||||
} PeakInfo;
|
||||
|
||||
typedef struct MovingAverage {
|
||||
uint16_t mean[128];
|
||||
uint16_t buf[4][128];
|
||||
uint16_t min, mid, max;
|
||||
uint16_t t;
|
||||
} MovingAverage;
|
||||
|
||||
typedef struct FreqPreset {
|
||||
char name[16];
|
||||
uint32_t fStart;
|
||||
uint32_t fEnd;
|
||||
StepsCount stepsCountIndex;
|
||||
uint8_t stepSizeIndex;
|
||||
ModulationType modulationType;
|
||||
BK4819_FilterBandwidth_t listenBW;
|
||||
} FreqPreset;
|
||||
|
||||
static const FreqPreset freqPresets[] = {
|
||||
{"17m", 1806800, 1831800, STEPS_128, S_STEP_1_0kHz, MOD_USB,
|
||||
BK4819_FILTER_BW_NARROWER},
|
||||
{"15m", 2100000, 2145000, STEPS_128, S_STEP_1_0kHz, MOD_USB,
|
||||
BK4819_FILTER_BW_NARROWER},
|
||||
{"12m", 2489000, 2514000, STEPS_128, S_STEP_1_0kHz, MOD_USB,
|
||||
BK4819_FILTER_BW_NARROWER},
|
||||
{"CB", 2697500, 2785500, STEPS_128, S_STEP_5_0kHz, MOD_FM,
|
||||
BK4819_FILTER_BW_NARROW},
|
||||
{"10m", 2800000, 2970000, STEPS_128, S_STEP_1_0kHz, MOD_USB,
|
||||
BK4819_FILTER_BW_NARROWER},
|
||||
{"AIR", 11800000, 13500000, STEPS_128, S_STEP_100_0kHz, MOD_AM,
|
||||
BK4819_FILTER_BW_NARROW},
|
||||
{"2m", 14400000, 14600000, STEPS_128, S_STEP_25_0kHz, MOD_FM,
|
||||
BK4819_FILTER_BW_NARROW},
|
||||
{"JD1", 15175000, 15400000, STEPS_128, S_STEP_25_0kHz, MOD_FM,
|
||||
BK4819_FILTER_BW_NARROW},
|
||||
{"JD2", 15500000, 15600000, STEPS_64, S_STEP_25_0kHz, MOD_FM,
|
||||
BK4819_FILTER_BW_NARROW},
|
||||
{"LPD", 43307500, 43477500, STEPS_128, S_STEP_25_0kHz, MOD_FM,
|
||||
BK4819_FILTER_BW_WIDE},
|
||||
{"PMR", 44600625, 44620000, STEPS_16, S_STEP_12_5kHz, MOD_FM,
|
||||
BK4819_FILTER_BW_NARROW},
|
||||
{"FRS/GM 462", 46256250, 46272500, STEPS_16, S_STEP_12_5kHz, MOD_FM,
|
||||
BK4819_FILTER_BW_NARROW},
|
||||
{"FRS/GM 467", 46756250, 46771250, STEPS_16, S_STEP_12_5kHz, MOD_FM,
|
||||
BK4819_FILTER_BW_NARROW},
|
||||
};
|
||||
|
||||
void APP_RunSpectrum(void);
|
||||
|
||||
#endif /* ifndef SPECTRUM_H */
|
||||
|
20
board.c
20
board.c
@ -616,24 +616,24 @@ void BOARD_EEPROM_Init(void)
|
||||
#endif
|
||||
gEeprom.ROGER = (Data[1] < 3) ? Data[1] : ROGER_MODE_OFF;
|
||||
gEeprom.REPEATER_TAIL_TONE_ELIMINATION = (Data[2] < 11) ? Data[2] : 0;
|
||||
gEeprom.TX_VFO = (Data[3] < 2) ? Data[3] : 0;
|
||||
gEeprom.TX_VFO = (Data[3] < 2) ? Data[3] : 0;
|
||||
|
||||
// 0ED0..0ED7
|
||||
EEPROM_ReadBuffer(0x0ED0, Data, 8);
|
||||
gEeprom.DTMF_SIDE_TONE = (Data[0] < 2) ? Data[0] : true;
|
||||
gEeprom.DTMF_SIDE_TONE = (Data[0] < 2) ? Data[0] : true;
|
||||
gEeprom.DTMF_SEPARATE_CODE = DTMF_ValidateCodes((char *)(Data + 1), 1) ? Data[1] : '*';
|
||||
gEeprom.DTMF_GROUP_CALL_CODE = DTMF_ValidateCodes((char *)(Data + 2), 1) ? Data[2] : '#';
|
||||
gEeprom.DTMF_DECODE_RESPONSE = (Data[3] < 4) ? Data[3] : 0;
|
||||
gEeprom.DTMF_auto_reset_time = (Data[4] < 61) ? Data[4] : (Data[4] >= 5) ? Data[4] : 10;
|
||||
gEeprom.DTMF_PRELOAD_TIME = (Data[5] < 101) ? Data[5] * 10 : 300;
|
||||
gEeprom.DTMF_FIRST_CODE_PERSIST_TIME = (Data[6] < 101) ? Data[6] * 10 : 100;
|
||||
gEeprom.DTMF_HASH_CODE_PERSIST_TIME = (Data[7] < 101) ? Data[7] * 10 : 100;
|
||||
gEeprom.DTMF_DECODE_RESPONSE = (Data[3] < 4) ? Data[3] : DTMF_DEC_RESPONSE_RING;
|
||||
gEeprom.DTMF_auto_reset_time = (Data[4] <= DTMF_HOLD_MAX) ? Data[4] : (Data[4] >= DTMF_HOLD_MIN) ? Data[4] : DTMF_HOLD_MAX;
|
||||
gEeprom.DTMF_PRELOAD_TIME = (Data[5] < 101) ? Data[5] * 10 : 200;
|
||||
gEeprom.DTMF_FIRST_CODE_PERSIST_TIME = (Data[6] < 101) ? Data[6] * 10 : 70;
|
||||
gEeprom.DTMF_HASH_CODE_PERSIST_TIME = (Data[7] < 101) ? Data[7] * 10 : 70;
|
||||
|
||||
// 0ED8..0EDF
|
||||
EEPROM_ReadBuffer(0x0ED8, Data, 8);
|
||||
gEeprom.DTMF_CODE_PERSIST_TIME = (Data[0] < 101) ? Data[0] * 10 : 100;
|
||||
gEeprom.DTMF_CODE_INTERVAL_TIME = (Data[1] < 101) ? Data[1] * 10 : 100;
|
||||
gEeprom.PERMIT_REMOTE_KILL = (Data[2] < 2) ? Data[2] : true;
|
||||
gEeprom.DTMF_CODE_PERSIST_TIME = (Data[0] < 101) ? Data[0] * 10 : 70;
|
||||
gEeprom.DTMF_CODE_INTERVAL_TIME = (Data[1] < 101) ? Data[1] * 10 : 70;
|
||||
gEeprom.PERMIT_REMOTE_KILL = (Data[2] < 2) ? Data[2] : false;
|
||||
|
||||
// 0EE0..0EE7
|
||||
EEPROM_ReadBuffer(0x0EE0, Data, 8);
|
||||
|
123
driver/bk4819.c
123
driver/bk4819.c
@ -1478,33 +1478,78 @@ uint8_t BK4819_GetAfTxRx(void)
|
||||
|
||||
bool BK4819_GetFrequencyScanResult(uint32_t *pFrequency)
|
||||
{
|
||||
const uint16_t High = BK4819_ReadRegister(BK4819_REG_0D);
|
||||
const bool Finished = (High & 0x8000) == 0;
|
||||
if (Finished)
|
||||
{
|
||||
const uint16_t Low = BK4819_ReadRegister(BK4819_REG_0E);
|
||||
*pFrequency = (uint32_t)((High & 0x7FF) << 16) | Low;
|
||||
}
|
||||
return Finished;
|
||||
// **********
|
||||
// REG_0D read only
|
||||
//
|
||||
// <15> frequency scan indicator
|
||||
// 1 = busy
|
||||
// 0 = finished
|
||||
//
|
||||
// <14:11> ???
|
||||
//
|
||||
// <10:0> frequency scan high 16 bits
|
||||
//
|
||||
// **********
|
||||
// REG_0E read only
|
||||
//
|
||||
// <15:0> frequency scan low 16 bits
|
||||
//
|
||||
// **********
|
||||
// (REG_0D <10:0> << 16) | (REG_0E <15:0>) .. unit is 10Hz
|
||||
//
|
||||
const uint16_t high = BK4819_ReadRegister(BK4819_REG_0D);
|
||||
const uint16_t low = BK4819_ReadRegister(BK4819_REG_0E);
|
||||
const bool finished = ((high >> 15) & 1u) == 0;
|
||||
*pFrequency = ((uint32_t)(high & 0x07FF) << 16) | low;
|
||||
return finished;
|
||||
}
|
||||
|
||||
BK4819_CssScanResult_t BK4819_GetCxCSSScanResult(uint32_t *pCdcssFreq, uint16_t *pCtcssFreq)
|
||||
{
|
||||
uint16_t Low;
|
||||
uint16_t High = BK4819_ReadRegister(BK4819_REG_69);
|
||||
// **********
|
||||
// REG_68 read only
|
||||
//
|
||||
// <15> CTCSS scan indicator
|
||||
// 1 = busy
|
||||
// 0 = found
|
||||
//
|
||||
// <12:0> CTCSS frequency (Hz)
|
||||
// div by 20.64888 ... 13M / 26M XTAL
|
||||
// div by 20.97152 ... 12.8M / 19.2M / 25.6M / 38.4M XTAL
|
||||
//
|
||||
// **********
|
||||
// REG_69 read only
|
||||
//
|
||||
// <15> CDCSS scan indicator
|
||||
// 1 = busy
|
||||
// 0 = found
|
||||
//
|
||||
// <14> 23 or 24 bit CDCSS Indicator (BK4819v3)
|
||||
// 1 = 24 bit
|
||||
// 0 = 23 bit
|
||||
//
|
||||
// <11:0> CDCSS High 12 bits
|
||||
//
|
||||
// **********
|
||||
// REG_6A read only
|
||||
//
|
||||
// <11:0> CDCSS Low 12 bits
|
||||
//
|
||||
//
|
||||
const uint16_t High = BK4819_ReadRegister(BK4819_REG_69);
|
||||
uint16_t Low;
|
||||
|
||||
if ((High & 0x8000) == 0)
|
||||
{
|
||||
if (((High >> 15) & 1u) == 0)
|
||||
{ // CDCSS
|
||||
Low = BK4819_ReadRegister(BK4819_REG_6A);
|
||||
*pCdcssFreq = ((High & 0xFFF) << 12) | (Low & 0xFFF);
|
||||
*pCdcssFreq = ((uint32_t)(High & 0xFFF) << 12) | (Low & 0xFFF);
|
||||
return BK4819_CSS_RESULT_CDCSS;
|
||||
}
|
||||
|
||||
Low = BK4819_ReadRegister(BK4819_REG_68);
|
||||
|
||||
if ((Low & 0x8000) == 0)
|
||||
{
|
||||
*pCtcssFreq = ((Low & 0x1FFF) * 4843) / 10000;
|
||||
if (((Low >> 15) & 1u) == 0)
|
||||
{ // CTCSS
|
||||
*pCtcssFreq = ((uint32_t)(Low & 0x1FFF) * 4843) / 10000;
|
||||
return BK4819_CSS_RESULT_CTCSS;
|
||||
}
|
||||
|
||||
@ -1513,12 +1558,46 @@ BK4819_CssScanResult_t BK4819_GetCxCSSScanResult(uint32_t *pCdcssFreq, uint16_t
|
||||
|
||||
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)
|
||||
{
|
||||
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)
|
||||
@ -1532,7 +1611,7 @@ void BK4819_SetScanFrequency(uint32_t Frequency)
|
||||
// 0 = Disable
|
||||
//
|
||||
// <14> 0
|
||||
// 1 = GPIO0Input for CDCSS
|
||||
// 1 = GPIO-0 input for CDCSS
|
||||
// 0 = Normal Mode (for BK4819 v3)
|
||||
//
|
||||
// <13> 0
|
||||
@ -1547,8 +1626,8 @@ void BK4819_SetScanFrequency(uint32_t Frequency)
|
||||
// 1 = 24bit
|
||||
// 0 = 23bit
|
||||
//
|
||||
// <10> 0 1050HzDetectionMode
|
||||
// 1 = 1050/4 Detect Enable, CTC1 should be set to 1050/4 Hz
|
||||
// <10> 0 1050Hz detection mode
|
||||
// 1 = 1050/4 detect enable, CTC1 should be set to 1050/4 Hz
|
||||
//
|
||||
// <9> 0 Auto CDCSS Bw Mode
|
||||
// 1 = Disable
|
||||
|
@ -104,6 +104,8 @@ KEY_Code_t KEYBOARD_Poll(void)
|
||||
for (unsigned int j = 0; j < ARRAY_SIZE(keyboard); j++)
|
||||
{
|
||||
uint16_t reg;
|
||||
unsigned int i;
|
||||
unsigned int k;
|
||||
|
||||
// Set all high
|
||||
GPIOA->DATA |= 1u << GPIOA_PIN_KEYBOARD_4 |
|
||||
@ -114,11 +116,22 @@ KEY_Code_t KEYBOARD_Poll(void)
|
||||
// Clear the pin we are selecting
|
||||
GPIOA->DATA &= keyboard[j].set_to_zero_mask;
|
||||
|
||||
// Wait for the pins to stabilize
|
||||
SYSTICK_DelayUs(1);
|
||||
// Read all 4 GPIO pins at once .. with de-noise, max of 8 sample loops
|
||||
for (i = 0, k = 0, reg = 0; i < 3 && k < 8; i++, k++)
|
||||
{
|
||||
uint16_t reg2;
|
||||
|
||||
// Read all 4 GPIO pins at once
|
||||
reg = GPIOA->DATA;
|
||||
SYSTICK_DelayUs(1);
|
||||
|
||||
reg2 = GPIOA->DATA;
|
||||
if (reg != reg2)
|
||||
{ // noise
|
||||
reg = reg2;
|
||||
i = 0;
|
||||
}
|
||||
}
|
||||
if (i < 3)
|
||||
break; // noise is too bad
|
||||
|
||||
for (unsigned int i = 0; i < ARRAY_SIZE(keyboard[j].pins); i++)
|
||||
{
|
||||
|
@ -29,26 +29,17 @@ void SYSTICK_Init(void)
|
||||
|
||||
void SYSTICK_DelayUs(uint32_t Delay)
|
||||
{
|
||||
uint32_t i;
|
||||
uint32_t Start;
|
||||
uint32_t Previous;
|
||||
uint32_t Current;
|
||||
uint32_t Delta;
|
||||
|
||||
i = 0;
|
||||
Start = SysTick->LOAD;
|
||||
Previous = SysTick->VAL;
|
||||
const uint32_t ticks = Delay * gTickMultiplier;
|
||||
uint32_t i = 0;
|
||||
uint32_t Start = SysTick->LOAD;
|
||||
uint32_t Previous = SysTick->VAL;
|
||||
do {
|
||||
do {
|
||||
Current = SysTick->VAL;
|
||||
} while (Current == Previous);
|
||||
if (Current < Previous) {
|
||||
Delta = -Current;
|
||||
} else {
|
||||
Delta = Start - Current;
|
||||
}
|
||||
i += Delta + Previous;
|
||||
uint32_t Current;
|
||||
uint32_t Delta;
|
||||
while ((Current = SysTick->VAL) == Previous) {}
|
||||
Delta = (Current < Previous) ? -Current : Start - Current;
|
||||
i += Delta + Previous;
|
||||
Previous = Current;
|
||||
} while (i < Delay * gTickMultiplier);
|
||||
} while (i < ticks);
|
||||
}
|
||||
|
||||
|
BIN
firmware.bin
BIN
firmware.bin
Binary file not shown.
Binary file not shown.
@ -101,23 +101,27 @@ uint8_t FREQUENCY_CalculateOutputPower(uint8_t TxpLow, uint8_t TxpMid, uint8_t T
|
||||
|
||||
uint32_t FREQUENCY_FloorToStep(uint32_t Upper, uint32_t Step, uint32_t Lower)
|
||||
{
|
||||
uint32_t Index;
|
||||
|
||||
if (Step == 833)
|
||||
{
|
||||
const uint32_t Delta = Upper - Lower;
|
||||
uint32_t Base = (Delta / 2500) * 2500;
|
||||
const uint32_t Index = ((Delta - Base) % 2500) / 833;
|
||||
|
||||
if (Index == 2)
|
||||
Base++;
|
||||
|
||||
return Lower + Base + (Index * 833);
|
||||
}
|
||||
|
||||
Index = (Upper - Lower) / Step;
|
||||
|
||||
return Lower + (Step * Index);
|
||||
#if 1
|
||||
uint32_t Index;
|
||||
|
||||
if (Step == 833)
|
||||
{
|
||||
const uint32_t Delta = Upper - Lower;
|
||||
uint32_t Base = (Delta / 2500) * 2500;
|
||||
const uint32_t Index = ((Delta - Base) % 2500) / 833;
|
||||
|
||||
if (Index == 2)
|
||||
Base++;
|
||||
|
||||
return Lower + Base + (Index * 833);
|
||||
}
|
||||
|
||||
Index = (Upper - Lower) / Step;
|
||||
|
||||
return Lower + (Step * Index);
|
||||
#else
|
||||
return Lower + (((Upper - Lower) / Step) * Step);
|
||||
#endif
|
||||
}
|
||||
|
||||
int TX_freq_check(const uint32_t Frequency)
|
||||
|
@ -116,8 +116,12 @@ void FUNCTION_Select(FUNCTION_Type_t Function)
|
||||
gFM_RestoreCountdown_10ms = fm_restore_countdown_10ms;
|
||||
#endif
|
||||
|
||||
if (gDTMF_CallState == DTMF_CALL_STATE_CALL_OUT || gDTMF_CallState == DTMF_CALL_STATE_RECEIVED)
|
||||
gDTMF_auto_reset_time_500ms = 1 + (gEeprom.DTMF_auto_reset_time * 2);
|
||||
if (gDTMF_CallState == DTMF_CALL_STATE_CALL_OUT ||
|
||||
gDTMF_CallState == DTMF_CALL_STATE_RECEIVED ||
|
||||
gDTMF_CallState == DTMF_CALL_STATE_RECEIVED_STAY)
|
||||
{
|
||||
gDTMF_auto_reset_time_500ms = gEeprom.DTMF_auto_reset_time * 2;
|
||||
}
|
||||
|
||||
gUpdateStatus = true;
|
||||
return;
|
||||
|
4
misc.c
4
misc.c
@ -38,7 +38,7 @@ const uint16_t key_repeat_delay_10ms = 400 / 10; // 400ms
|
||||
const uint16_t key_repeat_10ms = 80 / 10; // 80ms .. MUST be less than 'key_repeat_delay'
|
||||
const uint16_t key_debounce_10ms = 20 / 10; // 20ms
|
||||
|
||||
const uint8_t scan_delay_10ms = 210 / 10; // 210ms
|
||||
const uint8_t scan_freq_css_delay_10ms = 210 / 10; // 210ms .. don't reduce this
|
||||
|
||||
const uint16_t dual_watch_count_after_tx_10ms = 3600 / 10; // 3.6 sec after TX ends
|
||||
const uint16_t dual_watch_count_after_rx_10ms = 1000 / 10; // 1 sec after RX ends ?
|
||||
@ -224,7 +224,7 @@ bool gKeyBeingHeld;
|
||||
bool gPttIsPressed;
|
||||
uint8_t gPttDebounceCounter;
|
||||
uint8_t gMenuListCount;
|
||||
uint8_t gBackupCROSS_BAND_RX_TX;
|
||||
uint8_t gBackup_CROSS_BAND_RX_TX;
|
||||
uint8_t gScanDelay_10ms;
|
||||
#ifdef ENABLE_AIRCOPY
|
||||
uint8_t gAircopySendCountdown;
|
||||
|
4
misc.h
4
misc.h
@ -113,7 +113,7 @@ extern const uint16_t key_repeat_delay_10ms;
|
||||
extern const uint16_t key_repeat_10ms;
|
||||
extern const uint16_t key_debounce_10ms;
|
||||
|
||||
extern const uint8_t scan_delay_10ms;
|
||||
extern const uint8_t scan_freq_css_delay_10ms;
|
||||
|
||||
extern const uint16_t battery_save_count_10ms;
|
||||
|
||||
@ -296,7 +296,7 @@ extern bool gKeyBeingHeld;
|
||||
extern bool gPttIsPressed;
|
||||
extern uint8_t gPttDebounceCounter;
|
||||
extern uint8_t gMenuListCount;
|
||||
extern uint8_t gBackupCROSS_BAND_RX_TX;
|
||||
extern uint8_t gBackup_CROSS_BAND_RX_TX;
|
||||
extern uint8_t gScanDelay_10ms;
|
||||
#ifdef ENABLE_AIRCOPY
|
||||
extern uint8_t gAircopySendCountdown;
|
||||
|
3
radio.c
3
radio.c
@ -1093,8 +1093,7 @@ void RADIO_SendEndOfTransmission(void)
|
||||
BK4819_PlaySingleTone(2475, 250, 28, gEeprom.DTMF_SIDE_TONE);
|
||||
|
||||
if (gDTMF_CallState == DTMF_CALL_STATE_NONE &&
|
||||
(gCurrentVfo->DTMF_PTT_ID_TX_MODE == PTT_ID_TX_DOWN ||
|
||||
gCurrentVfo->DTMF_PTT_ID_TX_MODE == PTT_ID_BOTH))
|
||||
(gCurrentVfo->DTMF_PTT_ID_TX_MODE == PTT_ID_TX_DOWN || gCurrentVfo->DTMF_PTT_ID_TX_MODE == PTT_ID_BOTH))
|
||||
{ // end-of-tx
|
||||
if (gEeprom.DTMF_SIDE_TONE)
|
||||
{
|
||||
|
@ -53,7 +53,8 @@ void SystickHandler(void)
|
||||
gNextTimeslice = true;
|
||||
|
||||
if ((gGlobalSysTickCounter % 50) == 0)
|
||||
{
|
||||
{ // 500ms tick
|
||||
|
||||
gNextTimeslice_500ms = true;
|
||||
|
||||
DECREMENT_AND_TRIGGER(gTxTimerCountdown_500ms, gTxTimeoutReached);
|
||||
|
@ -31,6 +31,5 @@ void INPUTBOX_Append(const KEY_Code_t Digit)
|
||||
|
||||
if (Digit >= KEY_0 && Digit != KEY_INVALID)
|
||||
gInputBox[gInputBoxIndex++] = (char)(Digit - KEY_0);
|
||||
// gInputBox[gInputBoxIndex++] = Digit;
|
||||
}
|
||||
|
||||
|
16
ui/main.c
16
ui/main.c
@ -377,7 +377,7 @@ void UI_DisplayMain(void)
|
||||
if (gDTMF_CallState == DTMF_CALL_STATE_CALL_OUT)
|
||||
strcpy(String, (gDTMF_State == DTMF_STATE_CALL_OUT_RSP) ? "CALL OUT(RSP)" : "CALL OUT");
|
||||
else
|
||||
if (gDTMF_CallState == DTMF_CALL_STATE_RECEIVED)
|
||||
if (gDTMF_CallState == DTMF_CALL_STATE_RECEIVED || gDTMF_CallState == DTMF_CALL_STATE_RECEIVED_STAY)
|
||||
sprintf(String, "CALL FRM:%s", (DTMF_FindContact(gDTMF_Caller, Contact)) ? Contact : gDTMF_Caller);
|
||||
else
|
||||
if (gDTMF_IsTx)
|
||||
@ -396,7 +396,7 @@ void UI_DisplayMain(void)
|
||||
if (gDTMF_CallState == DTMF_CALL_STATE_CALL_OUT)
|
||||
sprintf(String, ">%s", (DTMF_FindContact(gDTMF_String, Contact)) ? Contact : gDTMF_String);
|
||||
else
|
||||
if (gDTMF_CallState == DTMF_CALL_STATE_RECEIVED)
|
||||
if (gDTMF_CallState == DTMF_CALL_STATE_RECEIVED || gDTMF_CallState == DTMF_CALL_STATE_RECEIVED_STAY)
|
||||
sprintf(String, ">%s", (DTMF_FindContact(gDTMF_Callee, Contact)) ? Contact : gDTMF_Callee);
|
||||
else
|
||||
if (gDTMF_IsTx)
|
||||
@ -735,8 +735,7 @@ void UI_DisplayMain(void)
|
||||
#if defined(ENABLE_AM_FIX) && defined(ENABLE_AM_FIX_SHOW_DATA)
|
||||
if (rx && gEeprom.VfoInfo[gEeprom.RX_VFO].AM_mode && gSetting_AM_fix)
|
||||
{
|
||||
if (gScreenToDisplay != DISPLAY_MAIN ||
|
||||
gDTMF_CallState != DTMF_CALL_STATE_NONE)
|
||||
if (gScreenToDisplay != DISPLAY_MAIN || gDTMF_CallState != DTMF_CALL_STATE_NONE)
|
||||
return;
|
||||
|
||||
center_line = CENTER_LINE_AM_FIX_DATA;
|
||||
@ -763,8 +762,7 @@ void UI_DisplayMain(void)
|
||||
const unsigned int len = strlen(gDTMF_RX_live);
|
||||
const unsigned int idx = (len > (17 - 5)) ? len - (17 - 5) : 0; // limit to last 'n' chars
|
||||
|
||||
if (gScreenToDisplay != DISPLAY_MAIN ||
|
||||
gDTMF_CallState != DTMF_CALL_STATE_NONE)
|
||||
if (gScreenToDisplay != DISPLAY_MAIN || gDTMF_CallState != DTMF_CALL_STATE_NONE)
|
||||
return;
|
||||
|
||||
center_line = CENTER_LINE_DTMF_DEC;
|
||||
@ -779,8 +777,7 @@ void UI_DisplayMain(void)
|
||||
const unsigned int len = gDTMF_RX_index;
|
||||
const unsigned int idx = (len > (17 - 5)) ? len - (17 - 5) : 0; // limit to last 'n' chars
|
||||
|
||||
if (gScreenToDisplay != DISPLAY_MAIN ||
|
||||
gDTMF_CallState != DTMF_CALL_STATE_NONE)
|
||||
if (gScreenToDisplay != DISPLAY_MAIN || gDTMF_CallState != DTMF_CALL_STATE_NONE)
|
||||
return;
|
||||
|
||||
center_line = CENTER_LINE_DTMF_DEC;
|
||||
@ -795,8 +792,7 @@ void UI_DisplayMain(void)
|
||||
else
|
||||
if (gChargingWithTypeC)
|
||||
{ // charging .. show the battery state
|
||||
if (gScreenToDisplay != DISPLAY_MAIN ||
|
||||
gDTMF_CallState != DTMF_CALL_STATE_NONE)
|
||||
if (gScreenToDisplay != DISPLAY_MAIN || gDTMF_CallState != DTMF_CALL_STATE_NONE)
|
||||
return;
|
||||
|
||||
center_line = CENTER_LINE_CHARGE_DATA;
|
||||
|
25
ui/menu.c
25
ui/menu.c
@ -816,7 +816,30 @@ void UI_DisplayMenu(void)
|
||||
break;
|
||||
|
||||
case MENU_D_HOLD:
|
||||
sprintf(String, "%ds", gSubMenuSelection);
|
||||
// only allow 5, 10, 20, 30, 40, 50 or "STAY ON SCREEN" (60)
|
||||
switch (gSubMenuSelection)
|
||||
{
|
||||
case 4: gSubMenuSelection = 60; break;
|
||||
case 6: gSubMenuSelection = 10; break;
|
||||
case 9: gSubMenuSelection = 5; break;
|
||||
case 11: gSubMenuSelection = 20; break;
|
||||
case 19: gSubMenuSelection = 10; break;
|
||||
case 21: gSubMenuSelection = 30; break;
|
||||
case 29: gSubMenuSelection = 20; break;
|
||||
case 31: gSubMenuSelection = 40; break;
|
||||
case 39: gSubMenuSelection = 30; break;
|
||||
case 41: gSubMenuSelection = 50; break;
|
||||
case 49: gSubMenuSelection = 40; break;
|
||||
case 51: gSubMenuSelection = 60; break;
|
||||
case 59: gSubMenuSelection = 50; break;
|
||||
case 61: gSubMenuSelection = 5; break;
|
||||
}
|
||||
|
||||
if (gSubMenuSelection < DTMF_HOLD_MAX)
|
||||
sprintf(String, "%d sec", gSubMenuSelection);
|
||||
else
|
||||
strcpy(String, "STAY ON\nSCREEN"); // 60
|
||||
|
||||
break;
|
||||
|
||||
case MENU_D_PRE:
|
||||
|
@ -70,7 +70,6 @@ void UI_DisplayScanner(void)
|
||||
else
|
||||
if (gScanCssState == SCAN_CSS_STATE_FOUND)
|
||||
{
|
||||
// strcpy(String, "SCAN COMPLETE");
|
||||
strcpy(String, "* repeat M save");
|
||||
text_centered = true;
|
||||
}
|
||||
|
Loading…
x
Reference in New Issue
Block a user