From 61527d12819bcce1c01cb9b2c4c5457d782e6234 Mon Sep 17 00:00:00 2001 From: Krzysiek Egzmont Date: Tue, 31 Oct 2023 13:53:57 +0100 Subject: [PATCH] More frequency steps --- app/menu.c | 6 ++--- frequencies.c | 32 +++++++++++++++++++++------ frequencies.h | 61 ++++++++++++++++++++++++++------------------------- radio.c | 6 ++--- ui/menu.c | 6 +++-- 5 files changed, 66 insertions(+), 45 deletions(-) diff --git a/app/menu.c b/app/menu.c index fb2b16b..ce65b5c 100644 --- a/app/menu.c +++ b/app/menu.c @@ -109,7 +109,7 @@ int MENU_GetLimits(uint8_t menu_id, int32_t *pMin, int32_t *pMax) case MENU_STEP: *pMin = 0; - *pMax = ARRAY_SIZE(StepFrequencyTable) - 1; + *pMax = ARRAY_SIZE(gStepFrequencyTable) - 1; break; case MENU_ABR: @@ -381,7 +381,7 @@ void MENU_AcceptSetting(void) break; case MENU_STEP: - gTxVfo->STEP_SETTING = gSubMenuSelection; + gTxVfo->STEP_SETTING = FREQUENCY_GetStepIdxFromSortedIdx(gSubMenuSelection); if (IS_FREQ_CHANNEL(gTxVfo->CHANNEL_SAVE)) { gRequestSaveChannel = 1; @@ -878,7 +878,7 @@ void MENU_ShowCurrentSetting(void) break; case MENU_STEP: - gSubMenuSelection = gTxVfo->STEP_SETTING; + gSubMenuSelection = FREQUENCY_GetSortedIdxFromStepIdx(gTxVfo->STEP_SETTING); break; case MENU_TXP: diff --git a/frequencies.c b/frequencies.c index 94f1a81..0a6cd41 100644 --- a/frequencies.c +++ b/frequencies.c @@ -61,13 +61,29 @@ 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 - // includes 1.25kHz step - const uint16_t StepFrequencyTable[7] = {125, 250, 625, 1000, 1250, 2500, 833}; -#endif + +const uint16_t gStepFrequencyTable[] = { + 250, 500, 625, 1000, 1250, 2500, 833, + 1, 5, 10, 25, 50, 100, 125, 1500, 3000, 5000, 10000, 12500, 25000, 50000 + }; + + +const uint8_t StepSortedIndexes[] = { + STEP_0_01kHz, STEP_0_05kHz, STEP_0_1kHz, STEP_0_25kHz, STEP_0_5kHz, STEP_1kHz, STEP_1_25kHz, STEP_2_5kHz, STEP_5kHz, STEP_6_25kHz, + STEP_8_33kHz, STEP_10kHz, STEP_12_5kHz, STEP_15kHz, STEP_25kHz, STEP_30kHz, STEP_50kHz, STEP_100kHz, + STEP_125kHz, STEP_250kHz, STEP_500kHz +}; +uint8_t FREQUENCY_GetStepIdxFromSortedIdx(uint8_t sortedIdx) +{ + return StepSortedIndexes[sortedIdx]; +} +uint8_t FREQUENCY_GetSortedIdxFromStepIdx(uint8_t stepIdx) +{ + for(uint8_t i = 0; i < ARRAY_SIZE(gStepFrequencyTable); i++) + if(StepSortedIndexes[i] == stepIdx) + return i; + return 0; +} FREQUENCY_Band_t FREQUENCY_GetBand(uint32_t Frequency) { @@ -102,6 +118,8 @@ uint8_t FREQUENCY_CalculateOutputPower(uint8_t TxpLow, uint8_t TxpMid, uint8_t T static int32_t rnd(int32_t freq, uint16_t step) { +if(step == 1) + return freq; return (freq + (step + 1) / 2) / step * step; } diff --git a/frequencies.h b/frequencies.h index c8bd900..e721452 100644 --- a/frequencies.h +++ b/frequencies.h @@ -19,8 +19,6 @@ #include -#define ENABLE_12_5KHZ_STEP - typedef struct { const uint32_t lower; const uint32_t upper; @@ -31,7 +29,7 @@ extern const freq_band_table_t BX4819_band2; extern const freq_band_table_t frequencyBandTable[7]; -enum FREQUENCY_Band_t { +typedef enum { BAND_NONE = -1, BAND1_50MHz = 0, BAND2_108MHz, @@ -40,35 +38,35 @@ enum FREQUENCY_Band_t { BAND5_350MHz, BAND6_400MHz, BAND7_470MHz -}; -typedef enum FREQUENCY_Band_t FREQUENCY_Band_t; +} FREQUENCY_Band_t; -#ifndef ENABLE_12_5KHZ_STEP - // QS steps - enum STEP_Setting_t { - STEP_2_5kHz = 0, - STEP_5_0kHz, - STEP_6_25kHz, - STEP_10_0kHz, - STEP_12_5kHz, - STEP_25_0kHz, - STEP_8_33kHz - }; -#else - // includes 1.25kHz step - enum STEP_Setting_t { - STEP_1_25kHz = 0, - STEP_2_5kHz, - STEP_6_25kHz, - STEP_10_0kHz, - STEP_12_5kHz, - STEP_25_0kHz, - STEP_8_33kHz - }; -#endif -typedef enum STEP_Setting_t STEP_Setting_t; -extern const uint16_t StepFrequencyTable[7]; +typedef enum { + STEP_2_5kHz, + STEP_5kHz, + STEP_6_25kHz, + STEP_10kHz, + STEP_12_5kHz, + STEP_25kHz, + STEP_8_33kHz, + STEP_0_01kHz, + STEP_0_05kHz, + STEP_0_1kHz, + STEP_0_25kHz, + STEP_0_5kHz, + STEP_1kHz, + STEP_1_25kHz, + STEP_15kHz, + STEP_30kHz, + STEP_50kHz, + STEP_100kHz, + STEP_125kHz, + STEP_250kHz, + STEP_500kHz, +} STEP_Setting_t; + + +extern const uint16_t gStepFrequencyTable[21]; #ifdef ENABLE_NOAA extern const uint32_t NoaaFrequencyTable[10]; @@ -78,6 +76,9 @@ FREQUENCY_Band_t FREQUENCY_GetBand(uint32_t Frequency); uint8_t FREQUENCY_CalculateOutputPower(uint8_t TxpLow, uint8_t TxpMid, uint8_t TxpHigh, int32_t LowerLimit, int32_t Middle, int32_t UpperLimit, int32_t Frequency); uint32_t FREQUENCY_RoundToStep(uint32_t freq, uint16_t step); +uint8_t FREQUENCY_GetStepIdxFromSortedIdx(uint8_t sortedIdx); +uint8_t FREQUENCY_GetSortedIdxFromStepIdx(uint8_t step); + int TX_freq_check(const uint32_t Frequency); int RX_freq_check(const uint32_t Frequency); diff --git a/radio.c b/radio.c index ba7ed7a..11b3012 100644 --- a/radio.c +++ b/radio.c @@ -122,7 +122,7 @@ void RADIO_InitInfo(VFO_Info_t *pInfo, const uint8_t ChannelSave, const uint32_t pInfo->SCANLIST1_PARTICIPATION = true; pInfo->SCANLIST2_PARTICIPATION = true; pInfo->STEP_SETTING = STEP_12_5kHz; - pInfo->StepFrequency = StepFrequencyTable[pInfo->STEP_SETTING]; + pInfo->StepFrequency = gStepFrequencyTable[pInfo->STEP_SETTING]; pInfo->CHANNEL_SAVE = ChannelSave; pInfo->FrequencyReverse = false; pInfo->OUTPUT_POWER = OUTPUT_POWER_LOW; @@ -256,10 +256,10 @@ void RADIO_ConfigureChannel(const unsigned int VFO, const unsigned int configure gEeprom.VfoInfo[VFO].AM_mode = (Data[3] >> 4) & 1u; Tmp = Data[6]; - if (Tmp >= ARRAY_SIZE(StepFrequencyTable)) + if (Tmp >= ARRAY_SIZE(gStepFrequencyTable)) Tmp = STEP_12_5kHz; gEeprom.VfoInfo[VFO].STEP_SETTING = Tmp; - gEeprom.VfoInfo[VFO].StepFrequency = StepFrequencyTable[Tmp]; + gEeprom.VfoInfo[VFO].StepFrequency = gStepFrequencyTable[Tmp]; Tmp = Data[7]; if (Tmp > (ARRAY_SIZE(gSubMenu_SCRAMBLER) - 1)) diff --git a/ui/menu.c b/ui/menu.c index 63ce4a6..5e8990b 100644 --- a/ui/menu.c +++ b/ui/menu.c @@ -495,9 +495,11 @@ void UI_DisplayMenu(void) break; #endif - case MENU_STEP: - sprintf(String, "%d.%02ukHz", StepFrequencyTable[gSubMenuSelection] / 100, abs(StepFrequencyTable[gSubMenuSelection]) % 100); + case MENU_STEP: { + uint16_t step = gStepFrequencyTable[FREQUENCY_GetStepIdxFromSortedIdx(gSubMenuSelection)]; + sprintf(String, "%d.%02ukHz", step / 100, step % 100); break; + } case MENU_TXP: strcpy(String, gSubMenu_TXP[gSubMenuSelection]);