diff --git a/Makefile b/Makefile index 65b6a5e..3909a88 100644 --- a/Makefile +++ b/Makefile @@ -100,6 +100,7 @@ CFLAGS += -DDISABLE_AIRCOPY CFLAGS += -DDISABLE_ALARM CFLAGS += -DKEEP_MEM_NAME CFLAGS += -DCHAN_NAME_FREQ +CFLAGS += -DRX_ANY_FREQ #CFLAGS += -DENABLE_TX_WHEN_AM #CFLAGS += -DSINGLE_VFO_CHAN #CFLAGS += -DBAND_SCOPE diff --git a/README.md b/README.md index 72d1c7e..e9e3ff4 100644 --- a/README.md +++ b/README.md @@ -18,6 +18,7 @@ You can edit those changes by (currently) editing the MakeFile, look for these l * CFLAGS += -DDISABLE_ALARM .. remove the ALARM transmit option from the firmware * CFLAGS += -DKEEP_MEM_NAME .. keep the memory channels name when re-saving a channel * CFLAGS += -DCHAN_NAME_FREQ .. show the channel frequency (as well as channel number/name) +* CFLAGS += -DRX_ANY_FREQ .. allow RX on any frequency from 18MHz to 1300MHz * #CFLAGS += -DENABLE_TX_WHEN_AM .. enable TX when radio set to AM (radio does NOT do AM, the adverts are false) * #CFLAGS += -DSINGLE_VFO_CHAN .. (not yet implemented) show a single VFO/CHANNEL if dual-watch/cross-band are disabled * #CFLAGS += -DBAND_SCOPE .. (not yet implemented) add a band scope/spectrum/panadapter option diff --git a/app/app.c b/app/app.c index c6e06aa..88afaa4 100644 --- a/app/app.c +++ b/app/app.c @@ -440,12 +440,12 @@ void APP_SetFrequencyByStep(VFO_Info_t *pInfo, int8_t Step) { uint32_t Frequency = pInfo->ConfigRX.Frequency + (Step * pInfo->StepFrequency); - if (Frequency > gUpperLimitFrequencyBandTable[pInfo->Band]) - Frequency = gLowerLimitFrequencyBandTable[pInfo->Band]; - else if (Frequency < gLowerLimitFrequencyBandTable[pInfo->Band]) Frequency = FREQUENCY_FloorToStep(gUpperLimitFrequencyBandTable[pInfo->Band], pInfo->StepFrequency, gLowerLimitFrequencyBandTable[pInfo->Band]); - + else + if (Frequency > gUpperLimitFrequencyBandTable[pInfo->Band]) + Frequency = gLowerLimitFrequencyBandTable[pInfo->Band]; + pInfo->ConfigRX.Frequency = Frequency; } diff --git a/app/main.c b/app/main.c index 8630fd0..b37ca1c 100644 --- a/app/main.c +++ b/app/main.c @@ -104,7 +104,7 @@ static void MAIN_Key_DIGITS(KEY_Code_t Key, bool bKeyPressed, bool bKeyHeld) unsigned int i; for (i = 0; i < 7; i++) { - if (Frequency <= gUpperLimitFrequencyBandTable[i] && (gLowerLimitFrequencyBandTable[i] <= Frequency)) + if (Frequency >= gLowerLimitFrequencyBandTable[i] && Frequency <= gUpperLimitFrequencyBandTable[i]) { #ifndef DISABLE_VOICE gAnotherVoiceID = (VOICE_ID_t)Key; @@ -129,6 +129,7 @@ static void MAIN_Key_DIGITS(KEY_Code_t Key, bool bKeyPressed, bool bKeyHeld) return; } } + } } #ifndef DISABLE_NOAA diff --git a/app/menu.c b/app/menu.c index a3de621..cd613ae 100644 --- a/app/menu.c +++ b/app/menu.c @@ -160,7 +160,7 @@ int MENU_GetLimits(uint8_t Cursor, uint8_t *pMin, uint8_t *pMax) case MENU_TXP: case MENU_SFT_D: case MENU_TDR: - case MENU_WX: + case MENU_XB: #ifndef DISABLE_VOICE case MENU_VOICE: #endif @@ -419,7 +419,7 @@ void MENU_AcceptSetting(void) gUpdateStatus = true; return; - case MENU_WX: + case MENU_XB: #ifndef DISABLE_NOAA if (IS_NOAA_CHANNEL(gEeprom.ScreenChannel[0])) return; @@ -767,7 +767,7 @@ void MENU_ShowCurrentSetting(void) gSubMenuSelection = gEeprom.DUAL_WATCH; break; - case MENU_WX: + case MENU_XB: gSubMenuSelection = gEeprom.CROSS_BAND_RX_TX; break; diff --git a/app/scanner.h b/app/scanner.h index c5f5086..cb4ebe2 100644 --- a/app/scanner.h +++ b/app/scanner.h @@ -20,36 +20,38 @@ #include "dcs.h" #include "driver/keyboard.h" -enum SCAN_CssState_t { - SCAN_CSS_STATE_OFF = 0U, - SCAN_CSS_STATE_SCANNING = 1U, - SCAN_CSS_STATE_FOUND = 2U, - SCAN_CSS_STATE_FAILED = 3U, +enum SCAN_CssState_t +{ + SCAN_CSS_STATE_OFF = 0, + SCAN_CSS_STATE_SCANNING, + SCAN_CSS_STATE_FOUND, + SCAN_CSS_STATE_FAILED }; typedef enum SCAN_CssState_t SCAN_CssState_t; -enum { - SCAN_OFF = 0U, +enum +{ + SCAN_OFF = 0, }; -extern DCS_CodeType_t gScanCssResultType; -extern uint8_t gScanCssResultCode; -extern bool gFlagStartScan; -extern bool gFlagStopScan; -extern bool gScanSingleFrequency; -extern uint8_t gScannerEditState; -extern uint8_t gScanChannel; -extern uint32_t gScanFrequency; -extern bool gScanPauseMode; -extern SCAN_CssState_t gScanCssState; -extern volatile bool gScheduleScanListen; +extern DCS_CodeType_t gScanCssResultType; +extern uint8_t gScanCssResultCode; +extern bool gFlagStartScan; +extern bool gFlagStopScan; +extern bool gScanSingleFrequency; +extern uint8_t gScannerEditState; +extern uint8_t gScanChannel; +extern uint32_t gScanFrequency; +extern bool gScanPauseMode; +extern SCAN_CssState_t gScanCssState; +extern volatile bool gScheduleScanListen; extern volatile uint16_t ScanPauseDelayIn10msec; -extern uint8_t gScanProgressIndicator; -extern uint8_t gScanHitCount; -extern bool gScanUseCssResult; -extern uint8_t gScanState; -extern bool bScanKeepFrequency; +extern uint8_t gScanProgressIndicator; +extern uint8_t gScanHitCount; +extern bool gScanUseCssResult; +extern uint8_t gScanState; +extern bool bScanKeepFrequency; void SCANNER_ProcessKeys(KEY_Code_t Key, bool bKeyPressed, bool bKeyHeld); void SCANNER_Start(void); diff --git a/bitmaps.c b/bitmaps.c index a40c4dd..d0bec09 100644 --- a/bitmaps.c +++ b/bitmaps.c @@ -174,12 +174,14 @@ const uint8_t BITMAP_VOX[] = 0b01000000, 0b00100000, 0b00011111, + 0b00000000, 0b00111110, 0b01000001, 0b01000001, 0b01000001, 0b00111110, + 0b00000000, 0b01100011, 0b00010100, @@ -188,21 +190,42 @@ const uint8_t BITMAP_VOX[] = 0b01100011 }; -const uint8_t BITMAP_WX[] = -{ - 0b00000000, - 0b01111111, - 0b00100000, - 0b00011000, - 0b00100000, - 0b01111111, - 0b00000000, - 0b01100011, - 0b00010100, - 0b00001000, - 0b00010100, - 0b01100011 -}; +#if 0 + const uint8_t BITMAP_WX[] = + { + 0b00000000, + 0b01111111, + 0b00100000, + 0b00011000, + 0b00100000, + 0b01111111, + + 0b00000000, + 0b01100011, + 0b00010100, + 0b00001000, + 0b00010100, + 0b01100011 + }; +#else + // 'XB' (cross-band) + const uint8_t BITMAP_XB[] = + { + 0b00000000, + 0b01100011, + 0b00010100, + 0b00001000, + 0b00010100, + 0b01100011, + + 0b00000000, + 0b01111111, + 0b01001001, + 0b01001001, + 0b01001001, + 0b00110110 + }; +#endif const uint8_t BITMAP_TDR[] = { @@ -212,6 +235,7 @@ const uint8_t BITMAP_TDR[] = 0b01000001, 0b01000001, 0b00111110, + 0b00000000, 0b01111111, 0b00100000, @@ -243,6 +267,7 @@ const uint8_t BITMAP_FM[] = 0b00001001, 0b00001001, 0b00000001, + 0b00000000, 0b01111111, 0b00000010, @@ -260,6 +285,7 @@ const uint8_t BITMAP_FM[] = 0b00001000, 0b00010000, 0b01111111, + 0b00000000, 0b01000110, 0b01001001, @@ -366,6 +392,7 @@ const uint8_t BITMAP_TX[] = 0b00000001, 0b00000001, 0b00000001, + 0b00000000, 0b01100011, 0b00100010, @@ -386,6 +413,7 @@ const uint8_t BITMAP_RX[] = 0b00011001, 0b00101001, 0b01000110, + 0b00000000, 0b01100011, 0b00100010, @@ -461,18 +489,21 @@ const uint8_t BITMAP_DTMF[] = 0b01000001, 0b01000001, 0b00111110, + 0b00000000, 0b00000001, 0b00000001, 0b01111111, 0b00000001, 0b00000001, + 0b00000000, 0b01111111, 0b00000010, 0b00001100, 0b00000010, 0b01111111, + 0b00000000, 0b01111111, 0b00001001, @@ -489,12 +520,14 @@ const uint8_t BITMAP_Scramble[] = 0b01001001, 0b01001001, 0b00110010, + 0b00000000, 0b00111110, 0b01000001, 0b01000001, 0b01000001, 0b00100010, + 0b00000000, 0b01111111, 0b00001001, @@ -571,6 +604,7 @@ const uint8_t BITMAP_AM[] = 0b00010001, 0b00010010, 0b01111100, + 0b00000000, 0b01111111, 0b00000010, @@ -587,6 +621,7 @@ const uint8_t BITMAP_CT[] = 0b01000001, 0b01000001, 0b00100010, + 0b00000000, 0b00000001, 0b00000001, @@ -603,12 +638,14 @@ const uint8_t BITMAP_DCS[] = 0b01000001, 0b01000001, 0b00111110, + 0b00000000, 0b00111110, 0b01000001, 0b01000001, 0b01000001, 0b00100010, + 0b00000000, 0b00100110, 0b01001001, diff --git a/bitmaps.h b/bitmaps.h index 7fa284a..c94c76a 100644 --- a/bitmaps.h +++ b/bitmaps.h @@ -13,19 +13,27 @@ extern const uint8_t BITMAP_BatteryLevel4[18]; extern const uint8_t BITMAP_BatteryLevel5[18]; extern const uint8_t BITMAP_USB_C[9]; + extern const uint8_t BITMAP_KeyLock[9]; extern const uint8_t BITMAP_F_Key[10]; extern const uint8_t BITMAP_VOX[18]; -extern const uint8_t BITMAP_WX[12]; +#if 0 + extern const uint8_t BITMAP_WX[12]; +#else + extern const uint8_t BITMAP_XB[12]; +#endif + extern const uint8_t BITMAP_TDR[12]; + #ifndef DISABLE_VOICE extern const uint8_t BITMAP_VoicePrompt[9]; #endif extern const uint8_t BITMAP_FM[12]; + #ifndef DISABLE_NOAA extern const uint8_t BITMAP_NOAA[12]; #endif @@ -54,6 +62,7 @@ extern const uint8_t BITMAP_ReverseMode[8]; extern const uint8_t BITMAP_NarrowBand[8]; extern const uint8_t BITMAP_DTMF[24]; + extern const uint8_t BITMAP_Scramble[18]; extern const uint8_t BITMAP_Add[8]; diff --git a/firmware b/firmware index d60bb5d..944902f 100644 Binary files a/firmware and b/firmware differ diff --git a/firmware.bin b/firmware.bin index f35bb52..d223b53 100644 Binary files a/firmware.bin and b/firmware.bin differ diff --git a/firmware.packed.bin b/firmware.packed.bin index 63710d0..43d8a30 100644 Binary files a/firmware.packed.bin and b/firmware.packed.bin differ diff --git a/frequencies.c b/frequencies.c index b04cc26..f89b283 100644 --- a/frequencies.c +++ b/frequencies.c @@ -18,9 +18,16 @@ #include "misc.h" #include "settings.h" +const uint32_t bx_min_Hz = 1800000; // 18MHz +const uint32_t bx_max_Hz = 130000000; // 1300MHz + const uint32_t LowerLimitFrequencyBandTable[7] = { - 5000000, + #ifndef RX_ANY_FREQ + 5000000, + #else + 1800000, + #endif 10800000, 13600000, 17400000, @@ -48,7 +55,11 @@ const uint32_t UpperLimitFrequencyBandTable[7] = 34999990, 39999990, 46999990, - 60000000 + #ifndef RX_ANY_FREQ + 60000000 + #else + 130000000 + #endif }; #ifndef DISABLE_NOAA @@ -91,23 +102,27 @@ const uint32_t UpperLimitFrequencyBandTable[7] = FREQUENCY_Band_t FREQUENCY_GetBand(uint32_t Frequency) { - if (Frequency >= 5000000 && Frequency < 10800000) - return BAND1_50MHz; - if (Frequency >= 10800000 && Frequency < 13600000) - return BAND2_108MHz; - if (Frequency >= 13600000 && Frequency < 17400000) - return BAND3_136MHz; - if (Frequency >= 17400000 && Frequency < 35000000) - return BAND4_174MHz; - if (Frequency >= 35000000 && Frequency < 40000000) - return BAND5_350MHz; - if (Frequency >= 40000000 && Frequency < 47000000) - return BAND6_400MHz; - if (Frequency >= 47000000 && Frequency < 60000000) +// if (Frequency >= 60000000 && Frequency <= bx_max_Hz) +// return BAND7_470MHz; + if (Frequency >= 47000000) return BAND7_470MHz; + if (Frequency >= 40000000) + return BAND6_400MHz; + if (Frequency >= 35000000) + return BAND5_350MHz; + if (Frequency >= 17400000) + return BAND4_174MHz; + if (Frequency >= 13600000) + return BAND3_136MHz; + if (Frequency >= 10800000) + return BAND2_108MHz; +// if (Frequency >= 5000000) +// return BAND1_50MHz; +// if (Frequency >= bx_min_Hz) + return BAND1_50MHz; // TODO: Double check the assembly - return BAND6_400MHz; +// return BAND6_400MHz; } 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) diff --git a/frequencies.h b/frequencies.h index 20eba98..1d64099 100644 --- a/frequencies.h +++ b/frequencies.h @@ -21,6 +21,9 @@ #include "radio.h" +extern const uint32_t bx_min_Hz; +extern const uint32_t bx_max_Hz; + enum FREQUENCY_Band_t { BAND1_50MHz = 0, @@ -34,13 +37,15 @@ enum FREQUENCY_Band_t typedef enum FREQUENCY_Band_t FREQUENCY_Band_t; -extern const uint32_t LowerLimitFrequencyBandTable[7]; -extern const uint32_t MiddleFrequencyBandTable[7]; -extern const uint32_t UpperLimitFrequencyBandTable[7]; +extern const uint32_t LowerLimitFrequencyBandTable[7]; +extern const uint32_t MiddleFrequencyBandTable[7]; +extern const uint32_t UpperLimitFrequencyBandTable[7]; + #ifndef DISABLE_NOAA - extern const uint32_t NoaaFrequencyTable[10]; + extern const uint32_t NoaaFrequencyTable[10]; #endif -extern const uint16_t StepFrequencyTable[6]; + +extern const uint16_t StepFrequencyTable[6]; 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); diff --git a/radio.c b/radio.c index 4ba9066..6e357c5 100644 --- a/radio.c +++ b/radio.c @@ -351,6 +351,7 @@ void RADIO_ConfigureChannel(uint8_t VFO, uint32_t Arg) else if (Channel >= FREQ_CHANNEL_FIRST) Frequency = FREQUENCY_FloorToStep(Frequency, gEeprom.VfoInfo[VFO].StepFrequency, gLowerLimitFrequencyBandTable[Band]); + pRadio->ConfigRX.Frequency = Frequency; if (Frequency >= 10800000 && Frequency < 13600000) @@ -438,15 +439,14 @@ void RADIO_ConfigureSquelchAndOutputPower(VFO_Info_t *pInfo) EEPROM_ReadBuffer(0x1ED0 + (Band * 16) + (pInfo->OUTPUT_POWER * 3), Txp, 3); - pInfo->TXP_CalculatedSetting = - FREQUENCY_CalculateOutputPower( - Txp[0], - Txp[1], - Txp[2], - LowerLimitFrequencyBandTable[Band], - MiddleFrequencyBandTable[Band], - UpperLimitFrequencyBandTable[Band], - pInfo->pTX->Frequency); + pInfo->TXP_CalculatedSetting = FREQUENCY_CalculateOutputPower( + Txp[0], + Txp[1], + Txp[2], + LowerLimitFrequencyBandTable[Band], + MiddleFrequencyBandTable[Band], + UpperLimitFrequencyBandTable[Band], + pInfo->pTX->Frequency); } void RADIO_ApplyOffset(VFO_Info_t *pInfo) diff --git a/ui/main.c b/ui/main.c index 8fbc57c..bffa730 100644 --- a/ui/main.c +++ b/ui/main.c @@ -126,6 +126,7 @@ void UI_DisplayMain(void) if (bIsSameVfo) memcpy(pLine0 + 2, BITMAP_VFO_Default, sizeof(BITMAP_VFO_Default)); else + //if (gEeprom.CROSS_BAND_RX_TX != CROSS_BAND_OFF) memcpy(pLine0 + 2, BITMAP_VFO_NotDefault, sizeof(BITMAP_VFO_NotDefault)); } diff --git a/ui/menu.c b/ui/menu.c index d588895..ff7a288 100644 --- a/ui/menu.c +++ b/ui/menu.c @@ -438,7 +438,7 @@ void UI_DisplayMenu(void) break; case MENU_TDR: - case MENU_WX: + case MENU_XB: strcpy(String, gSubMenu_CHAN[gSubMenuSelection]); break; diff --git a/ui/menu.h b/ui/menu.h index abb3f68..626115a 100644 --- a/ui/menu.h +++ b/ui/menu.h @@ -39,7 +39,7 @@ enum MENU_VOX, MENU_ABR, MENU_TDR, - MENU_WX, + MENU_XB, MENU_BEEP, MENU_TOT, #ifndef DISABLE_VOICE diff --git a/ui/scanner.c b/ui/scanner.c index c953774..738260d 100644 --- a/ui/scanner.c +++ b/ui/scanner.c @@ -26,56 +26,60 @@ void UI_DisplayScanner(void) { - char String[16]; - bool bCentered; + char String[16]; + bool bCentered; uint8_t Start; memset(gFrameBuffer, 0, sizeof(gFrameBuffer)); - memset(String, 0, sizeof(String)); - if (gScanSingleFrequency || (gScanCssState != SCAN_CSS_STATE_OFF && gScanCssState != SCAN_CSS_STATE_FAILED)) { + memset(String, 0, sizeof(String)); + if (gScanSingleFrequency || (gScanCssState != SCAN_CSS_STATE_OFF && gScanCssState != SCAN_CSS_STATE_FAILED)) sprintf(String, "FREQ:%.5f", gScanFrequency * 1e-05); - } else { + else sprintf(String, "FREQ:**.*****"); - } UI_PrintString(String, 2, 0, 1, 8); - memset(String, 0, sizeof(String)); - if (gScanCssState < SCAN_CSS_STATE_FOUND || !gScanUseCssResult) { + memset(String, 0, sizeof(String)); + if (gScanCssState < SCAN_CSS_STATE_FOUND || !gScanUseCssResult) sprintf(String, "CTC:******"); - } else if (gScanCssResultType == CODE_TYPE_CONTINUOUS_TONE) { + else + if (gScanCssResultType == CODE_TYPE_CONTINUOUS_TONE) sprintf(String, "CTC:%.1fHz", CTCSS_Options[gScanCssResultCode] * 0.1); - } else { + else sprintf(String, "DCS:D%03oN", DCS_Options[gScanCssResultCode]); - } - UI_PrintString(String, 2, 0, 3, 8); - memset(String, 0, sizeof(String)); - if (gScannerEditState == 2) { + memset(String, 0, sizeof(String)); + if (gScannerEditState == 2) + { strcpy(String, "SAVE?"); - Start = 0; + + Start = 0; bCentered = 1; - } else { - if (gScannerEditState == 1) { + } + else + { + if (gScannerEditState == 1) + { strcpy(String, "SAVE:"); UI_GenerateChannelStringEx(String + 5, gShowChPrefix, gScanChannel); - } else if (gScanCssState < SCAN_CSS_STATE_FOUND) { + } + else + if (gScanCssState < SCAN_CSS_STATE_FOUND) + { strcpy(String, "SCAN"); memset(String + 4, '.', (gScanProgressIndicator & 7) + 1); - } else { - if (gScanCssState == SCAN_CSS_STATE_FOUND) { - strcpy(String, "SCAN CMP."); - } else { - strcpy(String, "SCAN FAIL."); - } } - Start = 2; + else + if (gScanCssState == SCAN_CSS_STATE_FOUND) + strcpy(String, "SCAN CMP."); + else + strcpy(String, "SCAN FAIL."); + + Start = 2; bCentered = 0; } - UI_PrintString(String, Start, bCentered ? 127 : 0, 5, 8); ST7565_BlitFullScreen(); } - diff --git a/ui/status.c b/ui/status.c index f19c4af..2e91bf3 100644 --- a/ui/status.c +++ b/ui/status.c @@ -65,7 +65,7 @@ void UI_DisplayStatus(void) memcpy(gStatusLine + 71, BITMAP_VOX, sizeof(BITMAP_VOX)); if (gEeprom.CROSS_BAND_RX_TX != CROSS_BAND_OFF) - memcpy(gStatusLine + 58, BITMAP_WX, sizeof(BITMAP_WX)); + memcpy(gStatusLine + 58, BITMAP_XB, sizeof(BITMAP_XB)); if (gEeprom.DUAL_WATCH != DUAL_WATCH_OFF) memcpy(gStatusLine + 45, BITMAP_TDR, sizeof(BITMAP_TDR));