0
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:
OneOfEleven 2023-10-08 11:40:17 +01:00
parent 06c7d79b4b
commit 0547452589
24 changed files with 977 additions and 630 deletions

View File

@ -1319,7 +1319,7 @@ void APP_CheckKeys(void)
{ // PTT pressed { // PTT pressed
if (++gPttDebounceCounter >= 3) // 30ms if (++gPttDebounceCounter >= 3) // 30ms
{ // start transmitting { // start transmitting
boot_counter_10ms = 0; boot_counter_10ms = 0; // cancel the boot-up screen
gPttDebounceCounter = 0; gPttDebounceCounter = 0;
gPttIsPressed = true; gPttIsPressed = true;
APP_ProcessKey(KEY_PTT, true, false); APP_ProcessKey(KEY_PTT, true, false);
@ -1333,8 +1333,16 @@ void APP_CheckKeys(void)
// scan the hardware keys // scan the hardware keys
Key = KEYBOARD_Poll(); Key = KEYBOARD_Poll();
if (Key != KEY_INVALID) if (Key == KEY_INVALID)
boot_counter_10ms = 0; // cancel boot screen/beeps if any key pressed {
// gKeyReading0 = KEY_INVALID;
// gKeyReading1 = KEY_INVALID;
// gDebounceCounter = 0;
// gKeyBeingHeld = false;
// return;
}
boot_counter_10ms = 0; // cancel boot screen/beeps
if (gKeyReading0 != Key) if (gKeyReading0 != Key)
{ // new key pressed { // new key pressed
@ -1549,10 +1557,12 @@ void APP_TimeSlice10ms(void)
if (gScanDelay_10ms > 0) if (gScanDelay_10ms > 0)
{ {
gScanDelay_10ms--; if (--gScanDelay_10ms > 0)
{
APP_CheckKeys(); APP_CheckKeys();
return; return;
} }
}
if (gScannerEditState != SCAN_EDIT_STATE_NONE) if (gScannerEditState != SCAN_EDIT_STATE_NONE)
{ {
@ -1564,36 +1574,33 @@ void APP_TimeSlice10ms(void)
{ {
case SCAN_CSS_STATE_OFF: case SCAN_CSS_STATE_OFF:
// must be RF frequency scanning if we're here ?
if (!BK4819_GetFrequencyScanResult(&Result)) if (!BK4819_GetFrequencyScanResult(&Result))
break; break;
// accept only within 1kHz
Delta = Result - gScanFrequency; Delta = Result - gScanFrequency;
gScanHitCount = (abs(Delta) < 100) ? gScanHitCount + 1 : 0;
BK4819_DisableFrequencyScan();
#if 0 #if 0
gScanFrequency = Result; gScanFrequency = Result;
#else #else
{ { // round to nearest step multiple
const uint32_t step = StepFrequencyTable[gStepSetting]; const uint32_t step = StepFrequencyTable[gStepSetting];
gScanFrequency = ((Result + (step / 2)) / step) * step; // round to nearest step multiple gScanFrequency = ((Result + (step / 2)) / step) * step;
// gScanFrequency = (Result / step) * step; // round down
} }
#endif #endif
Delta = abs(Delta);
gScanHitCount = (Delta < 100) ? gScanHitCount + 1 : 0;
BK4819_DisableFrequencyScan();
if (gScanHitCount < 3) if (gScanHitCount < 3)
{ { // keep scanning for an RF carrier
BK4819_EnableFrequencyScan(); BK4819_EnableFrequencyScan();
} }
else else
{ { // RF carrier found .. stop RF scanning
BK4819_SetScanFrequency(gScanFrequency); BK4819_SetScanFrequency(gScanFrequency);
// start CTCSS/CTDSS scanning
gScanCssResultCode = 0xFF; gScanCssResultCode = 0xFF;
gScanCssResultType = 0xFF; gScanCssResultType = 0xFF;
gScanHitCount = 0; gScanHitCount = 0;
@ -1602,12 +1609,10 @@ void APP_TimeSlice10ms(void)
gScanCssState = SCAN_CSS_STATE_SCANNING; gScanCssState = SCAN_CSS_STATE_SCANNING;
GUI_SelectNextDisplay(DISPLAY_SCANNER); GUI_SelectNextDisplay(DISPLAY_SCANNER);
gUpdateStatus = true; gUpdateStatus = true;
} }
gScanDelay_10ms = scan_delay_10ms; gScanDelay_10ms = scan_freq_css_delay_10ms;
//gScanDelay_10ms = 1; // 10ms
break; break;
case SCAN_CSS_STATE_SCANNING: 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); BK4819_SetScanFrequency(gScanFrequency);
gScanDelay_10ms = scan_delay_10ms; gScanDelay_10ms = scan_freq_css_delay_10ms;
break; break;
} }
@ -1686,22 +1691,22 @@ void APP_TimeSlice10ms(void)
void cancelUserInputModes(void) void cancelUserInputModes(void)
{ {
gKeyInputCountdown = 0; if (gDTMF_InputMode || gDTMF_InputBox_Index > 0)
if (gDTMF_InputMode || gDTMF_InputBox_Index > 0 || gInputBoxIndex > 0)
{ {
DTMF_clear_input_box(); DTMF_clear_input_box();
gInputBoxIndex = 0;
gBeepToPlay = BEEP_500HZ_60MS_DOUBLE_BEEP_OPTIONAL; gBeepToPlay = BEEP_500HZ_60MS_DOUBLE_BEEP_OPTIONAL;
gRequestDisplayScreen = DISPLAY_MAIN; gRequestDisplayScreen = DISPLAY_MAIN;
gUpdateDisplay = true; gUpdateDisplay = true;
} }
if (gWasFKeyPressed) if (gWasFKeyPressed || gKeyInputCountdown > 0 || gInputBoxIndex > 0)
{ {
gWasFKeyPressed = false; gWasFKeyPressed = false;
gInputBoxIndex = 0;
gKeyInputCountdown = 0;
gBeepToPlay = BEEP_500HZ_60MS_DOUBLE_BEEP_OPTIONAL; gBeepToPlay = BEEP_500HZ_60MS_DOUBLE_BEEP_OPTIONAL;
gUpdateStatus = true; gUpdateStatus = true;
gUpdateDisplay = true;
} }
} }
@ -1997,7 +2002,6 @@ void APP_TimeSlice500ms(void)
if (gDTMF_DecodeRingCountdown_500ms > 0) if (gDTMF_DecodeRingCountdown_500ms > 0)
{ // make "ring-ring" sound { // make "ring-ring" sound
gDTMF_DecodeRingCountdown_500ms--; gDTMF_DecodeRingCountdown_500ms--;
AUDIO_PlayBeep(BEEP_880HZ_200MS); AUDIO_PlayBeep(BEEP_880HZ_200MS);
} }
} }
@ -2012,10 +2016,19 @@ void APP_TimeSlice500ms(void)
{ {
if (--gDTMF_auto_reset_time_500ms == 0) if (--gDTMF_auto_reset_time_500ms == 0)
{ {
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; gDTMF_CallState = DTMF_CALL_STATE_NONE;
gUpdateDisplay = true; 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) if (gDTMF_IsTx && gDTMF_TxStopCountdown_500ms > 0)
@ -2083,12 +2096,12 @@ void CHANNEL_Next(const bool bFlag, const int8_t scan_direction)
bScanKeepFrequency = false; 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; bool bFlag = false;
if (Key == KEY_INVALID) // if (Key == KEY_INVALID)
return; // return;
const bool backlight_was_on = GPIO_CheckBit(&GPIOB->DATA, GPIOB_PIN_BACKLIGHT); 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 else
{ {
if (Key != KEY_PTT) if (Key != KEY_PTT || gSetting_backlight_on_tx_rx == 1 || gSetting_backlight_on_tx_rx == 3)
BACKLIGHT_TurnOn(); BACKLIGHT_TurnOn();
if (Key == KEY_EXIT && bKeyHeld) 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; gDTMF_RX_live_timeout = 0;
gUpdateDisplay = true; gUpdateDisplay = true;
} }
// cancel user input
cancelUserInputModes();
} }
if (gScreenToDisplay == DISPLAY_MENU) // 1of11 if (gScreenToDisplay == DISPLAY_MENU) // 1of11
@ -2232,7 +2248,6 @@ static void APP_ProcessKey(KEY_Code_t Key, bool bKeyPressed, bool bKeyHeld)
{ {
if (bKeyHeld) if (bKeyHeld)
bFlag = true; bFlag = true;
if (!bKeyPressed) if (!bKeyPressed)
{ {
bFlag = true; bFlag = true;
@ -2334,7 +2349,7 @@ static void APP_ProcessKey(KEY_Code_t Key, bool bKeyPressed, bool bKeyHeld)
{ {
case DISPLAY_MAIN: case DISPLAY_MAIN:
MAIN_ProcessKeys(Key, bKeyPressed, bKeyHeld); MAIN_ProcessKeys(Key, bKeyPressed, bKeyHeld);
bKeyHeld = false; // allow the channel setting to be saved // bKeyHeld = false; // allow the channel setting to be saved
break; break;
#ifdef ENABLE_FMRADIO #ifdef ENABLE_FMRADIO
@ -2375,9 +2390,6 @@ static void APP_ProcessKey(KEY_Code_t Key, bool bKeyPressed, bool bKeyHeld)
if (!bKeyHeld && bKeyPressed) if (!bKeyHeld && bKeyPressed)
gBeepToPlay = BEEP_500HZ_60MS_DOUBLE_BEEP_OPTIONAL; gBeepToPlay = BEEP_500HZ_60MS_DOUBLE_BEEP_OPTIONAL;
} }
else
if (Key == KEY_EXIT && bKeyHeld)
cancelUserInputModes();
Skip: Skip:
if (gBeepToPlay != BEEP_NONE) if (gBeepToPlay != BEEP_NONE)
@ -2399,7 +2411,6 @@ Skip:
if (gFlagStopScan) if (gFlagStopScan)
{ {
BK4819_StopScan(); BK4819_StopScan();
gFlagStopScan = false; gFlagStopScan = false;
} }
@ -2506,6 +2517,8 @@ Skip:
if (gFlagStartScan) if (gFlagStartScan)
{ {
gFlagStartScan = false;
gMonitor = false; gMonitor = false;
#ifdef ENABLE_VOICE #ifdef ENABLE_VOICE
@ -2516,7 +2529,6 @@ Skip:
SCANNER_Start(); SCANNER_Start();
gRequestDisplayScreen = DISPLAY_SCANNER; gRequestDisplayScreen = DISPLAY_SCANNER;
gFlagStartScan = false;
} }
if (gFlagPrepareTX) if (gFlagPrepareTX)
@ -2536,6 +2548,7 @@ Skip:
#endif #endif
GUI_SelectNextDisplay(gRequestDisplayScreen); GUI_SelectNextDisplay(gRequestDisplayScreen);
gRequestDisplayScreen = DISPLAY_INVALID; gRequestDisplayScreen = DISPLAY_INVALID;
gUpdateDisplay = true;
} }

View File

@ -33,7 +33,8 @@ typedef enum DTMF_State_t DTMF_State_t;
enum DTMF_CallState_t { enum DTMF_CallState_t {
DTMF_CALL_STATE_NONE = 0, DTMF_CALL_STATE_NONE = 0,
DTMF_CALL_STATE_CALL_OUT, DTMF_CALL_STATE_CALL_OUT,
DTMF_CALL_STATE_RECEIVED DTMF_CALL_STATE_RECEIVED,
DTMF_CALL_STATE_RECEIVED_STAY
}; };
enum DTMF_DecodeResponse_t { enum DTMF_DecodeResponse_t {
@ -60,6 +61,11 @@ enum DTMF_CallMode_t {
DTMF_CALL_MODE_DTMF DTMF_CALL_MODE_DTMF
}; };
enum { // seconds
DTMF_HOLD_MIN = 5,
DTMF_HOLD_MAX = 60
};
typedef enum DTMF_CallMode_t DTMF_CallMode_t; typedef enum DTMF_CallMode_t DTMF_CallMode_t;
extern char gDTMF_String[15]; extern char gDTMF_String[15];

View File

@ -119,11 +119,11 @@ void GENERIC_Key_PTT(bool bKeyPressed)
gInputBoxIndex = 0; gInputBoxIndex = 0;
if (!bKeyPressed || gSerialConfigCountDown_500ms > 0) if (!bKeyPressed || gSerialConfigCountDown_500ms > 0)
{ { // PTT released
//if (gScreenToDisplay == DISPLAY_MAIN)
{
if (gCurrentFunction == FUNCTION_TRANSMIT) if (gCurrentFunction == FUNCTION_TRANSMIT)
{ { // we are transmitting .. stop
if (gFlagEndTransmission) if (gFlagEndTransmission)
{ {
FUNCTION_Select(FUNCTION_FOREGROUND); FUNCTION_Select(FUNCTION_FOREGROUND);
@ -133,65 +133,77 @@ void GENERIC_Key_PTT(bool bKeyPressed)
APP_EndTransmission(); APP_EndTransmission();
if (gEeprom.REPEATER_TAIL_TONE_ELIMINATION == 0) if (gEeprom.REPEATER_TAIL_TONE_ELIMINATION == 0)
{
FUNCTION_Select(FUNCTION_FOREGROUND); FUNCTION_Select(FUNCTION_FOREGROUND);
}
else else
gRTTECountdown = gEeprom.REPEATER_TAIL_TONE_ELIMINATION * 10; gRTTECountdown = gEeprom.REPEATER_TAIL_TONE_ELIMINATION * 10;
} }
gFlagEndTransmission = false; gFlagEndTransmission = false;
#ifdef ENABLE_VOX #ifdef ENABLE_VOX
gVOX_NoiseDetected = false; gVOX_NoiseDetected = false;
#endif #endif
}
RADIO_SetVfoState(VFO_STATE_NORMAL); RADIO_SetVfoState(VFO_STATE_NORMAL);
if (gScreenToDisplay != DISPLAY_MENU) // 1of11 .. don't close the menu if (gScreenToDisplay != DISPLAY_MENU) // 1of11 .. don't close the menu
gRequestDisplayScreen = DISPLAY_MAIN; gRequestDisplayScreen = DISPLAY_MAIN;
}
return; return;
} }
gInputBoxIndex = 0; // PTT pressed
return;
}
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) if (gScanStateDir != SCAN_OFF)
{ { // frequency/channel scanning . .stop
SCANNER_Stop(); SCANNER_Stop();
}
else
if (gCssScanMode != CSS_SCAN_MODE_OFF)
{ // CTCSS/CDCSS scanning .. stop
MENU_StopCssScan();
gPttDebounceCounter = 0; #ifdef ENABLE_VOICE
gPttIsPressed = false; gAnotherVoiceID = VOICE_ID_SCANNING_STOP;
#endif
}
if (gScreenToDisplay != DISPLAY_MENU) // 1of11 .. don't close the menu goto cancel_tx;
gRequestDisplayScreen = DISPLAY_MAIN;
return;
} }
#ifdef ENABLE_FMRADIO #ifdef ENABLE_FMRADIO
if (gFM_ScanState == FM_SCAN_OFF) if (gFM_ScanState != FM_SCAN_OFF)
{ // FM radio is scanning .. stop
FM_PlayAndUpdate();
#ifdef ENABLE_VOICE
gAnotherVoiceID = VOICE_ID_SCANNING_STOP;
#endif #endif
{ gRequestDisplayScreen = DISPLAY_FM;
if (gCssScanMode == CSS_SCAN_MODE_OFF) goto cancel_tx;
{ }
#endif
#ifdef ENABLE_FMRADIO #ifdef ENABLE_FMRADIO
if (gScreenToDisplay == DISPLAY_FM) if (gScreenToDisplay == DISPLAY_FM)
{ goto start_tx; // listening to the FM radio .. start TX'ing
gRequestDisplayScreen = DISPLAY_MAIN;
gInputBoxIndex = 0;
gPttIsPressed = false;
gPttDebounceCounter = 0;
return;
}
#endif #endif
if (gScreenToDisplay != DISPLAY_SCANNER)
{
if (gCurrentFunction == FUNCTION_TRANSMIT && gRTTECountdown == 0) if (gCurrentFunction == FUNCTION_TRANSMIT && gRTTECountdown == 0)
{ { // already transmitting
gInputBoxIndex = 0; gInputBoxIndex = 0;
return; return;
} }
@ -199,23 +211,19 @@ void GENERIC_Key_PTT(bool bKeyPressed)
if (gScreenToDisplay != DISPLAY_MENU) // 1of11 .. don't close the menu if (gScreenToDisplay != DISPLAY_MENU) // 1of11 .. don't close the menu
gRequestDisplayScreen = DISPLAY_MAIN; gRequestDisplayScreen = DISPLAY_MAIN;
if (!gDTMF_InputMode) if (!gDTMF_InputMode && gDTMF_InputBox_Index == 0)
{ goto start_tx; // wasn't entering a DTMF code .. start TX'ing (maybe)
gFlagPrepareTX = true;
gInputBoxIndex = 0;
return;
}
gDTMF_InputMode = false; // was entering a DTMF string
// gUpdateDisplay = true;
if (gDTMF_InputBox_Index > 0 || gDTMF_PreviousIndex > 0) if (gDTMF_InputBox_Index > 0 || gDTMF_PreviousIndex > 0)
{ { // going to transmit a DTMF string
if (gDTMF_InputBox_Index == 0)
gDTMF_InputBox_Index = gDTMF_PreviousIndex; 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)) if (gDTMF_InputBox_Index < sizeof(gDTMF_InputBox))
gDTMF_InputBox[gDTMF_InputBox_Index] = 0; gDTMF_InputBox[gDTMF_InputBox_Index] = 0; // NULL term the string
#if 0 #if 0
// append our DTMF ID to the inputted DTMF code - // append our DTMF ID to the inputted DTMF code -
@ -223,54 +231,42 @@ void GENERIC_Key_PTT(bool bKeyPressed)
if (gDTMF_InputBox_Index == 3) if (gDTMF_InputBox_Index == 3)
gDTMF_CallMode = DTMF_CheckGroupCall(gDTMF_InputBox, 3); gDTMF_CallMode = DTMF_CheckGroupCall(gDTMF_InputBox, 3);
else else
gDTMF_CallMode = DTMF_CALL_MODE_DTMF;
#else #else
// append our DTMF ID to the inputted DTMF code - // 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 the user inputted code is exactly 3 digits long and D-DCD is enabled
if (gDTMF_InputBox_Index == 3 && gTxVfo->DTMF_DECODING_ENABLE > 0) if (gDTMF_InputBox_Index == 3 && gTxVfo->DTMF_DECODING_ENABLE > 0)
gDTMF_CallMode = DTMF_CheckGroupCall(gDTMF_InputBox, 3); gDTMF_CallMode = DTMF_CheckGroupCall(gDTMF_InputBox, 3);
else else
#endif
gDTMF_CallMode = DTMF_CALL_MODE_DTMF; gDTMF_CallMode = DTMF_CALL_MODE_DTMF;
#endif
strcpy(gDTMF_String, gDTMF_InputBox); // remember the DTMF string
gDTMF_PreviousIndex = gDTMF_InputBox_Index; gDTMF_PreviousIndex = gDTMF_InputBox_Index;
DTMF_clear_input_box(); strcpy(gDTMF_String, gDTMF_InputBox);
gDTMF_ReplyState = DTMF_REPLY_ANI; gDTMF_ReplyState = DTMF_REPLY_ANI;
gDTMF_State = DTMF_STATE_0; gDTMF_State = DTMF_STATE_0;
}
DTMF_clear_input_box();
start_tx:
// request start TX
gFlagPrepareTX = true; gFlagPrepareTX = true;
} goto done;
return; cancel_tx:
} if (gPttIsPressed)
gEeprom.CROSS_BAND_RX_TX = gBackupCROSS_BAND_RX_TX;
gFlagStopScan = true;
gVfoConfigureMode = VFO_CONFIGURE_RELOAD;
gFlagResetVfos = true;
gUpdateStatus = true;
}
else
{ {
MENU_StopCssScan(); gPttIsPressed = false;
if (gScreenToDisplay != DISPLAY_MENU) // 1of11 .. don't close the menu
gRequestDisplayScreen = DISPLAY_MENU;
}
}
#ifdef ENABLE_FMRADIO
else
{
FM_PlayAndUpdate();
gRequestDisplayScreen = DISPLAY_FM;
}
#endif
#ifdef ENABLE_VOICE
gAnotherVoiceID = VOICE_ID_SCANNING_STOP;
#endif
gPttWasPressed = true; 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;
}

View File

@ -195,12 +195,12 @@ static void processFKeyFunction(const KEY_Code_t Key, const bool beep)
gWasFKeyPressed = false; gWasFKeyPressed = false;
gFlagStartScan = true; gFlagStartScan = true;
gScanSingleFrequency = false; 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; gEeprom.CROSS_BAND_RX_TX = CROSS_BAND_OFF;
gUpdateStatus = true; gUpdateStatus = true;
if (beep) // if (beep)
gBeepToPlay = BEEP_1KHZ_60MS_OPTIONAL; // gBeepToPlay = BEEP_1KHZ_60MS_OPTIONAL;
break; break;
@ -700,7 +700,7 @@ static void MAIN_Key_STAR(bool bKeyPressed, bool bKeyHeld)
// scan the CTCSS/DCS code // scan the CTCSS/DCS code
gFlagStartScan = true; gFlagStartScan = true;
gScanSingleFrequency = 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; gEeprom.CROSS_BAND_RX_TX = CROSS_BAND_OFF;
} }
@ -821,31 +821,25 @@ void MAIN_ProcessKeys(KEY_Code_t Key, bool bKeyPressed, bool bKeyHeld)
} }
#endif #endif
if (gDTMF_InputMode && bKeyPressed) if (gDTMF_InputMode && bKeyPressed && !bKeyHeld)
{
if (!bKeyHeld)
{ {
const char Character = DTMF_GetCharacter(Key); const char Character = DTMF_GetCharacter(Key);
if (Character != 0xFF) if (Character != 0xFF)
{ // add key to DTMF string { // add key to DTMF string
DTMF_Append(Character); DTMF_Append(Character);
gKeyInputCountdown = key_input_timeout_500ms; gKeyInputCountdown = key_input_timeout_500ms;
gRequestDisplayScreen = DISPLAY_MAIN; gRequestDisplayScreen = DISPLAY_MAIN;
gPttWasReleased = true; gPttWasReleased = true;
gBeepToPlay = BEEP_1KHZ_60MS_OPTIONAL; gBeepToPlay = BEEP_1KHZ_60MS_OPTIONAL;
return; return;
} }
} }
}
// TODO: ??? // TODO: ???
if (Key > KEY_PTT) // if (Key > KEY_PTT)
{ // {
Key = KEY_SIDE2; // what's this doing ??? // Key = KEY_SIDE2; // what's this doing ???
} // }
switch (Key) switch (Key)
{ {

View File

@ -314,8 +314,8 @@ int MENU_GetLimits(uint8_t Cursor, int32_t *pMin, int32_t *pMax)
break; break;
case MENU_D_HOLD: case MENU_D_HOLD:
*pMin = 5; *pMin = DTMF_HOLD_MIN;
*pMax = 60; *pMax = DTMF_HOLD_MAX;
break; break;
case MENU_D_PRE: case MENU_D_PRE:
@ -1079,6 +1079,30 @@ void MENU_ShowCurrentSetting(void)
case MENU_D_HOLD: case MENU_D_HOLD:
gSubMenuSelection = gEeprom.DTMF_auto_reset_time; 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; break;
case MENU_D_PRE: case MENU_D_PRE:

View File

@ -95,7 +95,7 @@ static void SCANNER_Key_EXIT(bool bKeyPressed, bool bKeyHeld)
case SCAN_EDIT_STATE_NONE: case SCAN_EDIT_STATE_NONE:
gRequestDisplayScreen = DISPLAY_MAIN; gRequestDisplayScreen = DISPLAY_MAIN;
gEeprom.CROSS_BAND_RX_TX = gBackupCROSS_BAND_RX_TX; gEeprom.CROSS_BAND_RX_TX = gBackup_CROSS_BAND_RX_TX;
gUpdateStatus = true; gUpdateStatus = true;
gFlagStopScan = true; gFlagStopScan = true;
gVfoConfigureMode = VFO_CONFIGURE_RELOAD; gVfoConfigureMode = VFO_CONFIGURE_RELOAD;
@ -166,8 +166,6 @@ static void SCANNER_Key_MENU(bool bKeyPressed, bool bKeyHeld)
{ {
#if 0 #if 0
// can't make head nor tail of what's being done here :(
uint32_t Freq250 = FREQUENCY_FloorToStep(gScanFrequency, 250, 0); uint32_t Freq250 = FREQUENCY_FloorToStep(gScanFrequency, 250, 0);
uint32_t Freq625 = FREQUENCY_FloorToStep(gScanFrequency, 625, 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 small_step = STEP_2_5kHz;
const STEP_Setting_t big_step = STEP_6_25kHz; const STEP_Setting_t big_step = STEP_6_25kHz;
#endif #endif
const uint32_t small_step_freq = StepFrequencyTable[small_step]; const uint32_t small_step_freq = StepFrequencyTable[small_step];
const uint32_t big_step_freq = StepFrequencyTable[big_step]; const uint32_t big_step_freq = StepFrequencyTable[big_step];
@ -255,11 +254,12 @@ static void SCANNER_Key_MENU(bool bKeyPressed, bool bKeyHeld)
} }
gScanCssState = SCAN_CSS_STATE_FOUND; gScanCssState = SCAN_CSS_STATE_FOUND;
#ifdef ENABLE_VOICE #ifdef ENABLE_VOICE
gAnotherVoiceID = VOICE_ID_MEMORY_CHANNEL; gAnotherVoiceID = VOICE_ID_MEMORY_CHANNEL;
#endif #endif
gRequestDisplayScreen = DISPLAY_SCANNER;
gRequestDisplayScreen = DISPLAY_SCANNER;
gUpdateStatus = true; gUpdateStatus = true;
break; break;
@ -452,7 +452,7 @@ void SCANNER_Start(void)
DTMF_clear_RX(); DTMF_clear_RX();
gScanDelay_10ms = scan_delay_10ms; gScanDelay_10ms = scan_freq_css_delay_10ms;
gScanCssResultCode = 0xFF; gScanCssResultCode = 0xFF;
gScanCssResultType = 0xFF; gScanCssResultType = 0xFF;
gScanHitCount = 0; gScanHitCount = 0;
@ -467,6 +467,7 @@ void SCANNER_Start(void)
g_SquelchLost = false; g_SquelchLost = false;
gScannerEditState = SCAN_EDIT_STATE_NONE; gScannerEditState = SCAN_EDIT_STATE_NONE;
gScanProgressIndicator = 0; gScanProgressIndicator = 0;
// gFlagStartScan = false;
gUpdateStatus = true; gUpdateStatus = true;
} }
@ -475,6 +476,9 @@ void SCANNER_Stop(void)
{ {
const uint8_t Previous = gRestoreMrChannel; const uint8_t Previous = gRestoreMrChannel;
if (gScanStateDir == SCAN_OFF)
return; // but, but, we weren't !
gScanStateDir = SCAN_OFF; gScanStateDir = SCAN_OFF;
if (!bScanKeepFrequency) if (!bScanKeepFrequency)

File diff suppressed because it is too large Load Diff

View File

@ -31,6 +31,7 @@
#include "../font.h" #include "../font.h"
#include "../frequencies.h" #include "../frequencies.h"
#include "../helper/battery.h" #include "../helper/battery.h"
#include "../helper/measurements.h"
#include "../misc.h" #include "../misc.h"
#include "../radio.h" #include "../radio.h"
#include "../settings.h" #include "../settings.h"
@ -41,17 +42,19 @@
static const uint8_t DrawingEndY = 40; 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[] = { static const uint16_t scanStepValues[] = {
1, 10, 50, 100, 1, 10, 50, 100,
250, 500, 625, 833, 1000, 1250, 2500, 10000, 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 // RX RXw TX BW
// 0b0 000 000 001 01 1000 // 0b0 000 000 001 01 1000
// 1 // 1
@ -122,17 +125,16 @@ typedef enum ScanStep {
} ScanStep; } ScanStep;
typedef struct SpectrumSettings { typedef struct SpectrumSettings {
uint32_t frequencyChangeStep;
StepsCount stepsCount; StepsCount stepsCount;
ScanStep scanStepIndex; ScanStep scanStepIndex;
uint32_t frequencyChangeStep;
uint16_t scanDelay; uint16_t scanDelay;
uint16_t rssiTriggerLevel; uint16_t rssiTriggerLevel;
bool backlightState;
BK4819_FilterBandwidth_t bw; BK4819_FilterBandwidth_t bw;
BK4819_FilterBandwidth_t listenBw; BK4819_FilterBandwidth_t listenBw;
int dbMin;
int dbMax;
ModulationType modulationType; ModulationType modulationType;
bool backlightState;
} SpectrumSettings; } SpectrumSettings;
typedef struct KeyboardState { typedef struct KeyboardState {
@ -150,7 +152,7 @@ typedef struct ScanInfo {
} ScanInfo; } ScanInfo;
typedef struct RegisterSpec { typedef struct RegisterSpec {
char *name; const char *name;
uint8_t num; uint8_t num;
uint8_t offset; uint8_t offset;
uint16_t maxValue; uint16_t maxValue;
@ -160,10 +162,56 @@ typedef struct RegisterSpec {
typedef struct PeakInfo { typedef struct PeakInfo {
uint16_t t; uint16_t t;
uint16_t rssi; uint16_t rssi;
uint32_t f;
uint8_t i; uint8_t i;
uint32_t f;
} PeakInfo; } 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); void APP_RunSpectrum(void);
#endif /* ifndef SPECTRUM_H */ #endif /* ifndef SPECTRUM_H */

16
board.c
View File

@ -623,17 +623,17 @@ void BOARD_EEPROM_Init(void)
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_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_GROUP_CALL_CODE = DTMF_ValidateCodes((char *)(Data + 2), 1) ? Data[2] : '#';
gEeprom.DTMF_DECODE_RESPONSE = (Data[3] < 4) ? Data[3] : 0; gEeprom.DTMF_DECODE_RESPONSE = (Data[3] < 4) ? Data[3] : DTMF_DEC_RESPONSE_RING;
gEeprom.DTMF_auto_reset_time = (Data[4] < 61) ? Data[4] : (Data[4] >= 5) ? Data[4] : 10; 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 : 300; gEeprom.DTMF_PRELOAD_TIME = (Data[5] < 101) ? Data[5] * 10 : 200;
gEeprom.DTMF_FIRST_CODE_PERSIST_TIME = (Data[6] < 101) ? Data[6] * 10 : 100; 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 : 100; gEeprom.DTMF_HASH_CODE_PERSIST_TIME = (Data[7] < 101) ? Data[7] * 10 : 70;
// 0ED8..0EDF // 0ED8..0EDF
EEPROM_ReadBuffer(0x0ED8, Data, 8); EEPROM_ReadBuffer(0x0ED8, Data, 8);
gEeprom.DTMF_CODE_PERSIST_TIME = (Data[0] < 101) ? Data[0] * 10 : 100; gEeprom.DTMF_CODE_PERSIST_TIME = (Data[0] < 101) ? Data[0] * 10 : 70;
gEeprom.DTMF_CODE_INTERVAL_TIME = (Data[1] < 101) ? Data[1] * 10 : 100; gEeprom.DTMF_CODE_INTERVAL_TIME = (Data[1] < 101) ? Data[1] * 10 : 70;
gEeprom.PERMIT_REMOTE_KILL = (Data[2] < 2) ? Data[2] : true; gEeprom.PERMIT_REMOTE_KILL = (Data[2] < 2) ? Data[2] : false;
// 0EE0..0EE7 // 0EE0..0EE7
EEPROM_ReadBuffer(0x0EE0, Data, 8); EEPROM_ReadBuffer(0x0EE0, Data, 8);

View File

@ -1478,33 +1478,78 @@ uint8_t BK4819_GetAfTxRx(void)
bool BK4819_GetFrequencyScanResult(uint32_t *pFrequency) bool BK4819_GetFrequencyScanResult(uint32_t *pFrequency)
{ {
const uint16_t High = BK4819_ReadRegister(BK4819_REG_0D); // **********
const bool Finished = (High & 0x8000) == 0; // REG_0D read only
if (Finished) //
{ // <15> frequency scan indicator
const uint16_t Low = BK4819_ReadRegister(BK4819_REG_0E); // 1 = busy
*pFrequency = (uint32_t)((High & 0x7FF) << 16) | Low; // 0 = finished
} //
return 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) BK4819_CssScanResult_t BK4819_GetCxCSSScanResult(uint32_t *pCdcssFreq, uint16_t *pCtcssFreq)
{ {
// **********
// 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; uint16_t Low;
uint16_t High = BK4819_ReadRegister(BK4819_REG_69);
if ((High & 0x8000) == 0) if (((High >> 15) & 1u) == 0)
{ { // CDCSS
Low = BK4819_ReadRegister(BK4819_REG_6A); 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; return BK4819_CSS_RESULT_CDCSS;
} }
Low = BK4819_ReadRegister(BK4819_REG_68); Low = BK4819_ReadRegister(BK4819_REG_68);
if (((Low >> 15) & 1u) == 0)
if ((Low & 0x8000) == 0) { // CTCSS
{ *pCtcssFreq = ((uint32_t)(Low & 0x1FFF) * 4843) / 10000;
*pCtcssFreq = ((Low & 0x1FFF) * 4843) / 10000;
return BK4819_CSS_RESULT_CTCSS; return BK4819_CSS_RESULT_CTCSS;
} }
@ -1513,12 +1558,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)
@ -1532,7 +1611,7 @@ void BK4819_SetScanFrequency(uint32_t Frequency)
// 0 = Disable // 0 = Disable
// //
// <14> 0 // <14> 0
// 1 = GPIO0Input for CDCSS // 1 = GPIO-0 input for CDCSS
// 0 = Normal Mode (for BK4819 v3) // 0 = Normal Mode (for BK4819 v3)
// //
// <13> 0 // <13> 0
@ -1547,8 +1626,8 @@ void BK4819_SetScanFrequency(uint32_t Frequency)
// 1 = 24bit // 1 = 24bit
// 0 = 23bit // 0 = 23bit
// //
// <10> 0 1050HzDetectionMode // <10> 0 1050Hz detection mode
// 1 = 1050/4 Detect Enable, CTC1 should be set to 1050/4 Hz // 1 = 1050/4 detect enable, CTC1 should be set to 1050/4 Hz
// //
// <9> 0 Auto CDCSS Bw Mode // <9> 0 Auto CDCSS Bw Mode
// 1 = Disable // 1 = Disable

View File

@ -104,6 +104,8 @@ KEY_Code_t KEYBOARD_Poll(void)
for (unsigned int j = 0; j < ARRAY_SIZE(keyboard); j++) for (unsigned int j = 0; j < ARRAY_SIZE(keyboard); j++)
{ {
uint16_t reg; uint16_t reg;
unsigned int i;
unsigned int k;
// Set all high // Set all high
GPIOA->DATA |= 1u << GPIOA_PIN_KEYBOARD_4 | GPIOA->DATA |= 1u << GPIOA_PIN_KEYBOARD_4 |
@ -114,11 +116,22 @@ KEY_Code_t KEYBOARD_Poll(void)
// Clear the pin we are selecting // Clear the pin we are selecting
GPIOA->DATA &= keyboard[j].set_to_zero_mask; GPIOA->DATA &= keyboard[j].set_to_zero_mask;
// Wait for the pins to stabilize // 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;
SYSTICK_DelayUs(1); SYSTICK_DelayUs(1);
// Read all 4 GPIO pins at once reg2 = GPIOA->DATA;
reg = 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++) for (unsigned int i = 0; i < ARRAY_SIZE(keyboard[j].pins); i++)
{ {

View File

@ -29,26 +29,17 @@ void SYSTICK_Init(void)
void SYSTICK_DelayUs(uint32_t Delay) void SYSTICK_DelayUs(uint32_t Delay)
{ {
uint32_t i; const uint32_t ticks = Delay * gTickMultiplier;
uint32_t Start; uint32_t i = 0;
uint32_t Previous; uint32_t Start = SysTick->LOAD;
uint32_t Previous = SysTick->VAL;
do {
uint32_t Current; uint32_t Current;
uint32_t Delta; uint32_t Delta;
while ((Current = SysTick->VAL) == Previous) {}
i = 0; Delta = (Current < Previous) ? -Current : Start - Current;
Start = SysTick->LOAD;
Previous = SysTick->VAL;
do {
do {
Current = SysTick->VAL;
} while (Current == Previous);
if (Current < Previous) {
Delta = -Current;
} else {
Delta = Start - Current;
}
i += Delta + Previous; i += Delta + Previous;
Previous = Current; Previous = Current;
} while (i < Delay * gTickMultiplier); } while (i < ticks);
} }

Binary file not shown.

Binary file not shown.

View File

@ -101,6 +101,7 @@ 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 FREQUENCY_FloorToStep(uint32_t Upper, uint32_t Step, uint32_t Lower)
{ {
#if 1
uint32_t Index; uint32_t Index;
if (Step == 833) if (Step == 833)
@ -118,6 +119,9 @@ uint32_t FREQUENCY_FloorToStep(uint32_t Upper, uint32_t Step, uint32_t Lower)
Index = (Upper - Lower) / Step; Index = (Upper - Lower) / Step;
return Lower + (Step * Index); return Lower + (Step * Index);
#else
return Lower + (((Upper - Lower) / Step) * Step);
#endif
} }
int TX_freq_check(const uint32_t Frequency) int TX_freq_check(const uint32_t Frequency)

View File

@ -116,8 +116,12 @@ void FUNCTION_Select(FUNCTION_Type_t Function)
gFM_RestoreCountdown_10ms = fm_restore_countdown_10ms; gFM_RestoreCountdown_10ms = fm_restore_countdown_10ms;
#endif #endif
if (gDTMF_CallState == DTMF_CALL_STATE_CALL_OUT || gDTMF_CallState == DTMF_CALL_STATE_RECEIVED) if (gDTMF_CallState == DTMF_CALL_STATE_CALL_OUT ||
gDTMF_auto_reset_time_500ms = 1 + (gEeprom.DTMF_auto_reset_time * 2); 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; gUpdateStatus = true;
return; return;

4
misc.c
View File

@ -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_repeat_10ms = 80 / 10; // 80ms .. MUST be less than 'key_repeat_delay'
const uint16_t key_debounce_10ms = 20 / 10; // 20ms 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_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 ? const uint16_t dual_watch_count_after_rx_10ms = 1000 / 10; // 1 sec after RX ends ?
@ -224,7 +224,7 @@ bool gKeyBeingHeld;
bool gPttIsPressed; bool gPttIsPressed;
uint8_t gPttDebounceCounter; uint8_t gPttDebounceCounter;
uint8_t gMenuListCount; uint8_t gMenuListCount;
uint8_t gBackupCROSS_BAND_RX_TX; uint8_t gBackup_CROSS_BAND_RX_TX;
uint8_t gScanDelay_10ms; uint8_t gScanDelay_10ms;
#ifdef ENABLE_AIRCOPY #ifdef ENABLE_AIRCOPY
uint8_t gAircopySendCountdown; uint8_t gAircopySendCountdown;

4
misc.h
View File

@ -113,7 +113,7 @@ extern const uint16_t key_repeat_delay_10ms;
extern const uint16_t key_repeat_10ms; extern const uint16_t key_repeat_10ms;
extern const uint16_t key_debounce_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; extern const uint16_t battery_save_count_10ms;
@ -296,7 +296,7 @@ extern bool gKeyBeingHeld;
extern bool gPttIsPressed; extern bool gPttIsPressed;
extern uint8_t gPttDebounceCounter; extern uint8_t gPttDebounceCounter;
extern uint8_t gMenuListCount; extern uint8_t gMenuListCount;
extern uint8_t gBackupCROSS_BAND_RX_TX; extern uint8_t gBackup_CROSS_BAND_RX_TX;
extern uint8_t gScanDelay_10ms; extern uint8_t gScanDelay_10ms;
#ifdef ENABLE_AIRCOPY #ifdef ENABLE_AIRCOPY
extern uint8_t gAircopySendCountdown; extern uint8_t gAircopySendCountdown;

View File

@ -1093,8 +1093,7 @@ void RADIO_SendEndOfTransmission(void)
BK4819_PlaySingleTone(2475, 250, 28, gEeprom.DTMF_SIDE_TONE); BK4819_PlaySingleTone(2475, 250, 28, gEeprom.DTMF_SIDE_TONE);
if (gDTMF_CallState == DTMF_CALL_STATE_NONE && 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_TX_DOWN || gCurrentVfo->DTMF_PTT_ID_TX_MODE == PTT_ID_BOTH))
gCurrentVfo->DTMF_PTT_ID_TX_MODE == PTT_ID_BOTH))
{ // end-of-tx { // end-of-tx
if (gEeprom.DTMF_SIDE_TONE) if (gEeprom.DTMF_SIDE_TONE)
{ {

View File

@ -53,7 +53,8 @@ void SystickHandler(void)
gNextTimeslice = true; gNextTimeslice = true;
if ((gGlobalSysTickCounter % 50) == 0) if ((gGlobalSysTickCounter % 50) == 0)
{ { // 500ms tick
gNextTimeslice_500ms = true; gNextTimeslice_500ms = true;
DECREMENT_AND_TRIGGER(gTxTimerCountdown_500ms, gTxTimeoutReached); DECREMENT_AND_TRIGGER(gTxTimerCountdown_500ms, gTxTimeoutReached);

View File

@ -31,6 +31,5 @@ void INPUTBOX_Append(const KEY_Code_t Digit)
if (Digit >= KEY_0 && Digit != KEY_INVALID) if (Digit >= KEY_0 && Digit != KEY_INVALID)
gInputBox[gInputBoxIndex++] = (char)(Digit - KEY_0); gInputBox[gInputBoxIndex++] = (char)(Digit - KEY_0);
// gInputBox[gInputBoxIndex++] = Digit;
} }

View File

@ -377,7 +377,7 @@ void UI_DisplayMain(void)
if (gDTMF_CallState == DTMF_CALL_STATE_CALL_OUT) if (gDTMF_CallState == DTMF_CALL_STATE_CALL_OUT)
strcpy(String, (gDTMF_State == DTMF_STATE_CALL_OUT_RSP) ? "CALL OUT(RSP)" : "CALL OUT"); strcpy(String, (gDTMF_State == DTMF_STATE_CALL_OUT_RSP) ? "CALL OUT(RSP)" : "CALL OUT");
else 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); sprintf(String, "CALL FRM:%s", (DTMF_FindContact(gDTMF_Caller, Contact)) ? Contact : gDTMF_Caller);
else else
if (gDTMF_IsTx) if (gDTMF_IsTx)
@ -396,7 +396,7 @@ void UI_DisplayMain(void)
if (gDTMF_CallState == DTMF_CALL_STATE_CALL_OUT) if (gDTMF_CallState == DTMF_CALL_STATE_CALL_OUT)
sprintf(String, ">%s", (DTMF_FindContact(gDTMF_String, Contact)) ? Contact : gDTMF_String); sprintf(String, ">%s", (DTMF_FindContact(gDTMF_String, Contact)) ? Contact : gDTMF_String);
else 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); sprintf(String, ">%s", (DTMF_FindContact(gDTMF_Callee, Contact)) ? Contact : gDTMF_Callee);
else else
if (gDTMF_IsTx) if (gDTMF_IsTx)
@ -735,8 +735,7 @@ void UI_DisplayMain(void)
#if defined(ENABLE_AM_FIX) && defined(ENABLE_AM_FIX_SHOW_DATA) #if defined(ENABLE_AM_FIX) && defined(ENABLE_AM_FIX_SHOW_DATA)
if (rx && gEeprom.VfoInfo[gEeprom.RX_VFO].AM_mode && gSetting_AM_fix) if (rx && gEeprom.VfoInfo[gEeprom.RX_VFO].AM_mode && gSetting_AM_fix)
{ {
if (gScreenToDisplay != DISPLAY_MAIN || if (gScreenToDisplay != DISPLAY_MAIN || gDTMF_CallState != DTMF_CALL_STATE_NONE)
gDTMF_CallState != DTMF_CALL_STATE_NONE)
return; return;
center_line = CENTER_LINE_AM_FIX_DATA; 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 len = strlen(gDTMF_RX_live);
const unsigned int idx = (len > (17 - 5)) ? len - (17 - 5) : 0; // limit to last 'n' chars const unsigned int idx = (len > (17 - 5)) ? len - (17 - 5) : 0; // limit to last 'n' chars
if (gScreenToDisplay != DISPLAY_MAIN || if (gScreenToDisplay != DISPLAY_MAIN || gDTMF_CallState != DTMF_CALL_STATE_NONE)
gDTMF_CallState != DTMF_CALL_STATE_NONE)
return; return;
center_line = CENTER_LINE_DTMF_DEC; center_line = CENTER_LINE_DTMF_DEC;
@ -779,8 +777,7 @@ void UI_DisplayMain(void)
const unsigned int len = gDTMF_RX_index; const unsigned int len = gDTMF_RX_index;
const unsigned int idx = (len > (17 - 5)) ? len - (17 - 5) : 0; // limit to last 'n' chars const unsigned int idx = (len > (17 - 5)) ? len - (17 - 5) : 0; // limit to last 'n' chars
if (gScreenToDisplay != DISPLAY_MAIN || if (gScreenToDisplay != DISPLAY_MAIN || gDTMF_CallState != DTMF_CALL_STATE_NONE)
gDTMF_CallState != DTMF_CALL_STATE_NONE)
return; return;
center_line = CENTER_LINE_DTMF_DEC; center_line = CENTER_LINE_DTMF_DEC;
@ -795,8 +792,7 @@ void UI_DisplayMain(void)
else else
if (gChargingWithTypeC) if (gChargingWithTypeC)
{ // charging .. show the battery state { // charging .. show the battery state
if (gScreenToDisplay != DISPLAY_MAIN || if (gScreenToDisplay != DISPLAY_MAIN || gDTMF_CallState != DTMF_CALL_STATE_NONE)
gDTMF_CallState != DTMF_CALL_STATE_NONE)
return; return;
center_line = CENTER_LINE_CHARGE_DATA; center_line = CENTER_LINE_CHARGE_DATA;

View File

@ -816,7 +816,30 @@ void UI_DisplayMenu(void)
break; break;
case MENU_D_HOLD: 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; break;
case MENU_D_PRE: case MENU_D_PRE:

View File

@ -70,7 +70,6 @@ void UI_DisplayScanner(void)
else else
if (gScanCssState == SCAN_CSS_STATE_FOUND) if (gScanCssState == SCAN_CSS_STATE_FOUND)
{ {
// strcpy(String, "SCAN COMPLETE");
strcpy(String, "* repeat M save"); strcpy(String, "* repeat M save");
text_centered = true; text_centered = true;
} }