0
mirror of https://github.com/OneOfEleven/uv-k5-firmware-custom.git synced 2025-04-28 14:21:25 +03:00

Fix F+4 and F+* scanning

This commit is contained in:
OneOfEleven 2023-10-07 15:12:53 +01:00
parent f93f3659f9
commit 06c7d79b4b
12 changed files with 209 additions and 154 deletions

View File

@ -20,6 +20,7 @@ ENABLE_BIG_FREQ := 0
ENABLE_SMALL_BOLD := 1
ENABLE_KEEP_MEM_NAME := 1
ENABLE_WIDE_RX := 1
ENABLE_1250HZ_STEP := 1
ENABLE_TX_WHEN_AM := 0
ENABLE_F_CAL_MENU := 0
ENABLE_CTCSS_TAIL_PHASE_SHIFT := 1
@ -254,6 +255,9 @@ endif
ifeq ($(ENABLE_WIDE_RX),1)
CFLAGS += -DENABLE_WIDE_RX
endif
ifeq ($(ENABLE_1250HZ_STEP),1)
CFLAGS += -DENABLE_1250HZ_STEP
endif
ifeq ($(ENABLE_TX_WHEN_AM),1)
CFLAGS += -DENABLE_TX_WHEN_AM
endif

View File

@ -47,6 +47,7 @@ ENABLE_BIG_FREQ := 0 big font frequencies (like original QS
ENABLE_SMALL_BOLD := 1 bold channel name/no. (when name + freq channel display mode)
ENABLE_KEEP_MEM_NAME := 1 maintain channel name when (re)saving memory channel
ENABLE_WIDE_RX := 1 full 18MHz to 1300MHz RX (though front-end/PA not designed for full range)
ENABLE_1250HZ_STEP := 1 enable smaller 1.25kHz frequency steps
ENABLE_TX_WHEN_AM := 0 allow TX (always FM) when RX is set to AM
ENABLE_F_CAL_MENU := 0 enable/disable the radios hidden frequency calibration menu
ENABLE_CTCSS_TAIL_PHASE_SHIFT := 1 standard CTCSS tail phase shift rather than QS's own 55Hz tone method

View File

@ -15,6 +15,7 @@
*/
#include <string.h>
#include <stdlib.h> // abs()
#include "app/action.h"
#ifdef ENABLE_AIRCOPY
@ -1553,7 +1554,7 @@ void APP_TimeSlice10ms(void)
return;
}
if (gScannerEditState != 0)
if (gScannerEditState != SCAN_EDIT_STATE_NONE)
{
APP_CheckKeys();
return;
@ -1576,15 +1577,13 @@ void APP_TimeSlice10ms(void)
{
const uint32_t step = StepFrequencyTable[gStepSetting];
gScanFrequency = ((Result + (step / 2)) / step) * step; // round to nearest step multiple
// gScanFrequency = (Result / step) * step; // round down
}
#endif
if (Delta < 0)
Delta = -Delta;
if (Delta < 100)
gScanHitCount++;
else
gScanHitCount = 0;
Delta = abs(Delta);
gScanHitCount = (Delta < 100) ? gScanHitCount + 1 : 0;
BK4819_DisableFrequencyScan();
@ -1972,7 +1971,9 @@ void APP_TimeSlice500ms(void)
}
}
if (gScreenToDisplay == DISPLAY_SCANNER && gScannerEditState == 0 && gScanCssState < SCAN_CSS_STATE_FOUND)
if (gScreenToDisplay == DISPLAY_SCANNER &&
gScannerEditState == SCAN_EDIT_STATE_NONE &&
gScanCssState < SCAN_CSS_STATE_FOUND)
{
gScanProgressIndicator++;

View File

@ -702,8 +702,6 @@ static void MAIN_Key_STAR(bool bKeyPressed, bool bKeyHeld)
gScanSingleFrequency = true;
gBackupCROSS_BAND_RX_TX = gEeprom.CROSS_BAND_RX_TX;
gEeprom.CROSS_BAND_RX_TX = CROSS_BAND_OFF;
ACTION_Scan(false);
}
gPttWasReleased = true;

View File

@ -31,7 +31,7 @@ uint8_t gScanCssResultCode;
bool gFlagStartScan;
bool gFlagStopScan;
bool gScanSingleFrequency;
uint8_t gScannerEditState;
SCAN_edit_state_t gScannerEditState;
uint8_t gScanChannel;
uint32_t gScanFrequency;
bool gScanPauseMode;
@ -48,7 +48,7 @@ static void SCANNER_Key_DIGITS(KEY_Code_t Key, bool bKeyPressed, bool bKeyHeld)
{
if (!bKeyHeld && bKeyPressed)
{
if (gScannerEditState == 1)
if (gScannerEditState == SCAN_EDIT_STATE_BUSY)
{
uint16_t Channel;
@ -92,7 +92,7 @@ static void SCANNER_Key_EXIT(bool bKeyPressed, bool bKeyHeld)
switch (gScannerEditState)
{
case 0:
case SCAN_EDIT_STATE_NONE:
gRequestDisplayScreen = DISPLAY_MAIN;
gEeprom.CROSS_BAND_RX_TX = gBackupCROSS_BAND_RX_TX;
@ -105,7 +105,7 @@ static void SCANNER_Key_EXIT(bool bKeyPressed, bool bKeyHeld)
#endif
break;
case 1:
case SCAN_EDIT_STATE_BUSY:
if (gInputBoxIndex > 0)
{
gInputBox[--gInputBoxIndex] = 10;
@ -115,8 +115,8 @@ static void SCANNER_Key_EXIT(bool bKeyPressed, bool bKeyHeld)
// Fallthrough
case 2:
gScannerEditState = 0;
case SCAN_EDIT_STATE_DONE:
gScannerEditState = SCAN_EDIT_STATE_NONE;
#ifdef ENABLE_VOICE
gAnotherVoiceID = VOICE_ID_CANCEL;
#endif
@ -161,49 +161,97 @@ static void SCANNER_Key_MENU(bool bKeyPressed, bool bKeyHeld)
switch (gScannerEditState)
{
case 0:
case SCAN_EDIT_STATE_NONE:
if (!gScanSingleFrequency)
{
int16_t Delta625;
uint32_t Freq250 = FREQUENCY_FloorToStep(gScanFrequency, 250, 0);
uint32_t Freq625 = FREQUENCY_FloorToStep(gScanFrequency, 625, 0);
int16_t Delta250 = (int16_t)gScanFrequency - (int16_t)Freq250;
if (125 < Delta250)
{
Delta250 = 250 - Delta250;
Freq250 += 250;
}
#if 0
// can't make head nor tail of what's being done here :(
Delta625 = (int16_t)gScanFrequency - (int16_t)Freq625;
uint32_t Freq250 = FREQUENCY_FloorToStep(gScanFrequency, 250, 0);
uint32_t Freq625 = FREQUENCY_FloorToStep(gScanFrequency, 625, 0);
if (312 < Delta625)
{
Delta625 = 625 - Delta625;
Freq625 += 625;
}
int16_t Delta250 = (int16_t)gScanFrequency - (int16_t)Freq250;
int16_t Delta625;
if (Delta625 < Delta250)
{
gStepSetting = STEP_6_25kHz;
gScanFrequency = Freq625;
}
else
{
gStepSetting = STEP_2_5kHz;
gScanFrequency = Freq250;
}
if (125 < Delta250)
{
Delta250 = 250 - Delta250;
Freq250 += 250;
}
Delta625 = (int16_t)gScanFrequency - (int16_t)Freq625;
if (312 < Delta625)
{
Delta625 = 625 - Delta625;
Freq625 += 625;
}
if (Delta625 < Delta250)
{
gStepSetting = STEP_6_25kHz;
gScanFrequency = Freq625;
}
else
{
gStepSetting = STEP_2_5kHz;
gScanFrequency = Freq250;
}
#else
#ifdef ENABLE_1250HZ_STEP
const STEP_Setting_t small_step = STEP_1_25kHz;
const STEP_Setting_t big_step = STEP_6_25kHz;
#else
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];
uint32_t freq_small_step = FREQUENCY_FloorToStep(gScanFrequency, small_step_freq, 0);
uint32_t freq_big_step = FREQUENCY_FloorToStep(gScanFrequency, big_step_freq, 0);
int32_t delta_small_step = (int32_t)gScanFrequency - freq_small_step;
int32_t delta_big_step = (int32_t)gScanFrequency - freq_big_step;
if (delta_small_step > 125)
{
delta_small_step = StepFrequencyTable[small_step] - delta_small_step;
freq_big_step += small_step_freq;
}
delta_big_step = (int32_t)gScanFrequency - freq_big_step;
if (delta_big_step > 312)
{
delta_big_step = big_step_freq - delta_big_step;
freq_big_step += big_step_freq;
}
if (delta_small_step >= delta_big_step)
{
gStepSetting = small_step;
gScanFrequency = freq_small_step;
}
else
{
gStepSetting = big_step;
gScanFrequency = freq_big_step;
}
#endif
}
if (gTxVfo->CHANNEL_SAVE <= MR_CHANNEL_LAST)
{
gScannerEditState = 1;
gScannerEditState = SCAN_EDIT_STATE_BUSY;
gScanChannel = gTxVfo->CHANNEL_SAVE;
gShowChPrefix = RADIO_CheckValidChannel(gTxVfo->CHANNEL_SAVE, false, 0);
}
else
{
gScannerEditState = 2;
gScannerEditState = SCAN_EDIT_STATE_DONE;
}
gScanCssState = SCAN_CSS_STATE_FOUND;
@ -215,16 +263,16 @@ static void SCANNER_Key_MENU(bool bKeyPressed, bool bKeyHeld)
gUpdateStatus = true;
break;
case 1:
case SCAN_EDIT_STATE_BUSY:
if (gInputBoxIndex == 0)
{
gBeepToPlay = BEEP_1KHZ_60MS_OPTIONAL;
gRequestDisplayScreen = DISPLAY_SCANNER;
gScannerEditState = 2;
gScannerEditState = SCAN_EDIT_STATE_DONE;
}
break;
case 2:
case SCAN_EDIT_STATE_DONE:
if (!gScanSingleFrequency)
{
RADIO_InitInfo(gTxVfo, gTxVfo->CHANNEL_SAVE, gScanFrequency);
@ -235,8 +283,8 @@ static void SCANNER_Key_MENU(bool bKeyPressed, bool bKeyHeld)
gTxVfo->freq_config_RX.Code = gScanCssResultCode;
}
gTxVfo->freq_config_TX = gTxVfo->freq_config_RX;
gTxVfo->STEP_SETTING = gStepSetting;
gTxVfo->freq_config_TX = gTxVfo->freq_config_RX;
gTxVfo->STEP_SETTING = gStepSetting;
}
else
{
@ -251,23 +299,26 @@ static void SCANNER_Key_MENU(bool bKeyPressed, bool bKeyHeld)
if (gTxVfo->CHANNEL_SAVE <= MR_CHANNEL_LAST)
{
Channel = gScanChannel;
Channel = gScanChannel;
gEeprom.MrChannel[gEeprom.TX_VFO] = Channel;
}
else
{
Channel = gTxVfo->Band + FREQ_CHANNEL_FIRST;
Channel = gTxVfo->Band + FREQ_CHANNEL_FIRST;
gEeprom.FreqChannel[gEeprom.TX_VFO] = Channel;
}
gTxVfo->CHANNEL_SAVE = Channel;
gTxVfo->CHANNEL_SAVE = Channel;
gEeprom.ScreenChannel[gEeprom.TX_VFO] = Channel;
gRequestSaveChannel = 2;
#ifdef ENABLE_VOICE
gAnotherVoiceID = VOICE_ID_CONFIRM;
gAnotherVoiceID = VOICE_ID_CONFIRM;
#endif
gRequestDisplayScreen = DISPLAY_SCANNER;
gRequestSaveChannel = 2;
gScannerEditState = 0;
gScannerEditState = SCAN_EDIT_STATE_NONE;
gRequestDisplayScreen = DISPLAY_SCANNER;
break;
default:
@ -302,7 +353,7 @@ static void SCANNER_Key_UP_DOWN(bool bKeyPressed, bool pKeyHeld, int8_t Directio
gBeepToPlay = BEEP_1KHZ_60MS_OPTIONAL;
}
if (gScannerEditState == 1)
if (gScannerEditState == SCAN_EDIT_STATE_BUSY)
{
gScanChannel = NUMBER_AddWithWraparound(gScanChannel, Direction, 0, MR_CHANNEL_LAST);
gShowChPrefix = RADIO_CheckValidChannel(gScanChannel, false, 0);
@ -389,8 +440,6 @@ void SCANNER_Start(void)
BK4819_PickRXFilterPathBasedOnFrequency(gScanFrequency);
BK4819_SetScanFrequency(gScanFrequency);
gUpdateStatus = true;
}
else
{
@ -399,8 +448,6 @@ void SCANNER_Start(void)
BK4819_PickRXFilterPathBasedOnFrequency(0xFFFFFFFF);
BK4819_EnableFrequencyScan();
gUpdateStatus = true;
}
DTMF_clear_RX();
@ -418,8 +465,10 @@ void SCANNER_Start(void)
g_VOX_Lost = false;
#endif
g_SquelchLost = false;
gScannerEditState = 0;
gScannerEditState = SCAN_EDIT_STATE_NONE;
gScanProgressIndicator = 0;
gUpdateStatus = true;
}
void SCANNER_Stop(void)

View File

@ -20,29 +20,34 @@
#include "dcs.h"
#include "driver/keyboard.h"
enum SCAN_CssState_t
enum SCAN_CssState_e
{
SCAN_CSS_STATE_OFF = 0,
SCAN_CSS_STATE_SCANNING,
SCAN_CSS_STATE_FOUND,
SCAN_CSS_STATE_FAILED
};
typedef enum SCAN_CssState_e SCAN_CssState_t;
typedef enum SCAN_CssState_t SCAN_CssState_t;
enum
{
enum {
SCAN_REV = -1,
SCAN_OFF = 0,
SCAN_FWD = +1
};
enum SCAN_edit_state_e {
SCAN_EDIT_STATE_NONE = 0,
SCAN_EDIT_STATE_BUSY,
SCAN_EDIT_STATE_DONE
};
typedef enum SCAN_edit_state_e SCAN_edit_state_t;
extern DCS_CodeType_t gScanCssResultType;
extern uint8_t gScanCssResultCode;
extern bool gFlagStartScan;
extern bool gFlagStopScan;
extern bool gScanSingleFrequency;
extern uint8_t gScannerEditState;
extern SCAN_edit_state_t gScannerEditState;
extern uint8_t gScanChannel;
extern uint32_t gScanFrequency;
extern bool gScanPauseMode;

Binary file not shown.

Binary file not shown.

View File

@ -61,12 +61,12 @@ const freq_band_table_t frequencyBandTable[7] =
};
#endif
#ifndef ENABLE_12_5KHZ_STEP
// QS steps (*10 Hz)
const uint16_t StepFrequencyTable[7] = {250, 500, 625, 1000, 1250, 2500, 833};
#else
#ifdef ENABLE_1250HZ_STEP
// includes 1.25kHz step
const uint16_t StepFrequencyTable[7] = {125, 250, 625, 1000, 1250, 2500, 833};
#else
// QS steps (*10 Hz)
const uint16_t StepFrequencyTable[7] = {250, 500, 625, 1000, 1250, 2500, 833};
#endif
FREQUENCY_Band_t FREQUENCY_GetBand(uint32_t Frequency)

View File

@ -19,8 +19,6 @@
#include <stdint.h>
#define ENABLE_12_5KHZ_STEP
typedef struct {
const uint32_t lower;
const uint32_t upper;
@ -43,22 +41,22 @@ enum FREQUENCY_Band_t {
};
typedef enum FREQUENCY_Band_t FREQUENCY_Band_t;
#ifndef ENABLE_12_5KHZ_STEP
// QS steps
#ifdef ENABLE_1250HZ_STEP
// includes 1.25kHz step
enum STEP_Setting_t {
STEP_2_5kHz = 0,
STEP_5_0kHz,
STEP_1_25kHz = 0,
STEP_2_5kHz,
STEP_6_25kHz,
STEP_10_0kHz,
STEP_12_5kHz,
STEP_25_0kHz,
STEP_8_33kHz
};
};
#else
// includes 1.25kHz step
// QS steps
enum STEP_Setting_t {
STEP_1_25kHz = 0,
STEP_2_5kHz,
STEP_2_5kHz = 0,
STEP_5_0kHz,
STEP_6_25kHz,
STEP_10_0kHz,
STEP_12_5kHz,

View File

@ -341,6 +341,7 @@ const char gSubMenu_SCRAMBLER[11][7] =
};
const char gSubMenu_SIDE_BUTT[9][16] =
//const char gSubMenu_SIDE_BUTT[10][16] =
{
"NONE",
"FLASH\nLIGHT",
@ -350,7 +351,8 @@ const char gSubMenu_SIDE_BUTT[9][16] =
"VOX\non\\off",
"ALARM\non\\off",
"FM RADIO\non\\off",
"TX\n1750Hz"
"TX\n1750Hz",
// "2nd PTT",
};
// ***************************************************************************************

View File

@ -30,8 +30,7 @@
void UI_DisplayScanner(void)
{
char String[16];
bool bCentered;
uint8_t Start;
bool text_centered = false;
memset(gFrameBuffer, 0, sizeof(gFrameBuffer));
@ -49,7 +48,7 @@ void UI_DisplayScanner(void)
memset(String, 0, sizeof(String));
if (gScanCssState < SCAN_CSS_STATE_FOUND || !gScanUseCssResult)
strcpy(String, " CTC scanning");
strcpy(String, "CODE scanning");
else
if (gScanCssResultType == CODE_TYPE_CONTINUOUS_TONE)
sprintf(String, " CTC %u.%uHz", CTCSS_Options[gScanCssResultCode] / 10, CTCSS_Options[gScanCssResultCode] % 10);
@ -58,42 +57,40 @@ void UI_DisplayScanner(void)
UI_PrintString(String, 2, 0, 3, 8);
memset(String, 0, sizeof(String));
if (gScannerEditState == 2)
switch (gScannerEditState)
{
strcpy(String, "SAVE ?");
default:
case SCAN_EDIT_STATE_NONE:
if (gScanCssState < SCAN_CSS_STATE_FOUND)
{ // rolling indicator
memset(String, 0, sizeof(String));
memset(String, '.', 15);
String[gScanProgressIndicator % 15] = '#';
}
else
if (gScanCssState == SCAN_CSS_STATE_FOUND)
{
// strcpy(String, "SCAN COMPLETE");
strcpy(String, "* repeat M save");
text_centered = true;
}
else
{
strcpy(String, "SCAN FAIL");
}
break;
Start = 0;
bCentered = 1;
}
else
{
if (gScannerEditState == 1)
{
case SCAN_EDIT_STATE_BUSY:
strcpy(String, "SAVE ");
UI_GenerateChannelStringEx(String + 5, gShowChPrefix, gScanChannel);
}
else
if (gScanCssState < SCAN_CSS_STATE_FOUND)
{
memset(String, 0, sizeof(String));
memset(String, '.', 15);
String[gScanProgressIndicator % 15] = '#';
}
else
if (gScanCssState == SCAN_CSS_STATE_FOUND)
{
// strcpy(String, "SCAN CMP");
strcpy(String, " '*' to save");
}
else
{
strcpy(String, "SCAN FAIL");
}
break;
Start = 2;
bCentered = 0;
case SCAN_EDIT_STATE_DONE:
text_centered = true;
strcpy(String, "SAVE ?");
break;
}
UI_PrintString(String, Start, bCentered ? 127 : 0, 5, 8);
UI_PrintString(String, text_centered ? 0 : 2, text_centered ? 127 : 0, 5, 8);
ST7565_BlitFullScreen();
}