From fa30f90cf4487d4c9884cb4004f750f4800c52db Mon Sep 17 00:00:00 2001 From: ohmytime Date: Sun, 5 May 2024 17:18:20 +0800 Subject: [PATCH] Air Band support [ongoing] --- TEF6686_ESP32.ino | 321 +++++++++++++++++++++++++++++++++++++++++----- src/TEF6686.cpp | 12 +- src/TEF6686.h | 1 + src/config.h | 9 ++ src/constants.h | 35 ++++- src/gui.cpp | 108 +++++++++++++++- src/language.h | 56 +++++--- 7 files changed, 478 insertions(+), 64 deletions(-) create mode 100644 src/config.h diff --git a/TEF6686_ESP32.ino b/TEF6686_ESP32.ino index 2baeddb..8d76872 100644 --- a/TEF6686_ESP32.ino +++ b/TEF6686_ESP32.ino @@ -17,6 +17,7 @@ #include "src/FREQFONT.h" #include "src/TEF6686.h" #include "src/constants.h" +#include "src/config.h" #include "src/language.h" #include "src/gui.h" #include "src/comms.h" @@ -34,7 +35,6 @@ #define STANDBYLED 19 #define SMETERPIN 27 -// #define CHINA_PORTABLE // uncomment for China Portable build (Simplified Chinese) #define DYNAMIC_SPI_SPEED // uncomment to enable dynamic SPI Speed https://github.com/ohmytime/TFT_eSPI_DynamicSpeed #ifdef ARS @@ -82,6 +82,9 @@ bool memtune; bool menu; bool menuopen; bool mwstepsize; +#ifdef HAS_AIR_BAND +bool airstepsize; +#endif bool nobattery; bool optenc; bool rdsflagreset; @@ -335,6 +338,11 @@ unsigned int frequency_MIBand_75M; unsigned int frequency_MIBand_90M; unsigned int frequency_MW; unsigned int frequency_SW; +#ifdef HAS_AIR_BAND +unsigned int frequency_AIR; +unsigned int AIRHighEdgeSet; +unsigned int AIRLowEdgeSet; +#endif unsigned int frequencyold; unsigned int HighEdgeOIRTSet; unsigned int HighEdgeSet; @@ -445,6 +453,9 @@ void setup() { frequency_LW = EEPROM.readUInt(EE_UINT16_FREQUENCY_LW); frequency_MW = EEPROM.readUInt(EE_UINT16_FREQUENCY_MW); frequency_SW = EEPROM.readUInt(EE_UINT16_FREQUENCY_SW); +#ifdef HAS_AIR_BAND + frequency_AIR = EEPROM.readUInt(EE_UINT16_FREQUENCY_AIR); +#endif XDRGTK_key = EEPROM.readString(EE_STRING_XDRGTK_KEY); usesquelch = EEPROM.readByte(EE_BYTE_USESQUELCH); showmodulation = EEPROM.readByte(EE_BYTE_SHOWMODULATION); @@ -475,6 +486,9 @@ void setup() { radio.rds.fastps = EEPROM.readByte(EE_BYTE_FASTPS); tot = EEPROM.readByte(EE_BYTE_TOT); mwstepsize = EEPROM.readByte(EE_BYTE_MWREGION); +#ifdef HAS_AIR_BAND + airstepsize = EEPROM.readByte(EE_BYTE_AIRSTEPSIZE); +#endif spispeed = EEPROM.readByte(EE_BYTE_SPISPEED); amscansens = EEPROM.readByte(EE_BYTE_AMSCANSENS); fmscansens = EEPROM.readByte(EE_BYTE_FMSCANSENS); @@ -746,12 +760,10 @@ void setup() { radio.setVolume(VolSet); radio.setOffset(LevelOffset); radio.setAMOffset(AMLevelOffset); - - if (band > BAND_GAP) { + if (band > BAND_GAP && band != BAND_AIR) { radio.setAMCoChannel(amcodect, amcodectcount); radio.setAMAttenuation(amgain); } - radio.setStereoLevel(StereoLevel); radio.setHighCutLevel(HighCutLevel); radio.setHighCutOffset(HighCutOffset); @@ -1252,23 +1264,145 @@ void doBandSelectionFM() { } } -void CheckBandForbiddenAM () { +void CheckBandForbiddenAM() { +#ifdef HAS_AIR_BAND switch (band) { case BAND_LW: - if (bandAM == AM_BAND_MW_SW || bandAM == AM_BAND_MW || bandAM == AM_BAND_SW) bandforbidden = 1; else bandforbidden = 0; + if (bandAM == AM_BAND_MW_SW_AIR || bandAM == AM_BAND_MW_SW || bandAM == AM_BAND_MW_AIR || bandAM == AM_BAND_SW_AIR || bandAM == AM_BAND_MW || bandAM == AM_BAND_SW || bandAM == AM_BAND_AIR) + bandforbidden = 1; + else + bandforbidden = 0; break; case BAND_MW: - if (bandAM == AM_BAND_LW_SW || bandAM == AM_BAND_LW || bandAM == AM_BAND_SW) bandforbidden = 1; else bandforbidden = 0; + if (bandAM == AM_BAND_LW_SW_AIR || bandAM == AM_BAND_LW_SW || bandAM == AM_BAND_LW_AIR || bandAM == AM_BAND_SW_AIR || bandAM == AM_BAND_LW || bandAM == AM_BAND_SW || bandAM == AM_BAND_AIR) + bandforbidden = 1; + else + bandforbidden = 0; break; case BAND_SW: - if (bandAM == AM_BAND_LW_MW || bandAM == AM_BAND_LW || bandAM == AM_BAND_MW) bandforbidden = 1; else bandforbidden = 0; + if (bandAM == AM_BAND_LW_MW_AIR || bandAM == AM_BAND_LW_MW || bandAM == AM_BAND_LW_AIR || bandAM == AM_BAND_MW_AIR || bandAM == AM_BAND_LW || bandAM == AM_BAND_MW || bandAM == AM_BAND_AIR) + bandforbidden = 1; + else + bandforbidden = 0; + break; + case BAND_AIR: + if (bandAM == AM_BAND_LW_MW_SW || bandAM == AM_BAND_LW_MW || bandAM == AM_BAND_LW_SW || bandAM == AM_BAND_MW_SW || bandAM == AM_BAND_LW || bandAM == AM_BAND_MW || bandAM == AM_BAND_SW) + bandforbidden = 1; + else + bandforbidden = 0; break; } +#else + switch (band) { + case BAND_LW: + if (bandAM == AM_BAND_MW_SW || bandAM == AM_BAND_MW || bandAM == AM_BAND_SW) bandforbidden = 1; + else bandforbidden = 0; + break; + case BAND_MW: + if (bandAM == AM_BAND_LW_SW || bandAM == AM_BAND_LW || bandAM == AM_BAND_SW) bandforbidden = 1; + else bandforbidden = 0; + break; + case BAND_SW: + if (bandAM == AM_BAND_LW_MW || bandAM == AM_BAND_LW || bandAM == AM_BAND_MW) bandforbidden = 1; + else bandforbidden = 0; + break; + } +#endif } void doBandSelectionAM() { if (band < BAND_GAP) return; +#ifdef HAS_AIR_BAND // has air band + switch (bandAM) { + case AM_BAND_ALL: + break; + case AM_BAND_LW_MW_SW: + if (band == BAND_AIR) { + band = BAND_LW; + SelectBand(); + } + break; + case AM_BAND_LW_MW_AIR: + if (band == BAND_SW) { + band = BAND_LW; + SelectBand(); + } + break; + case AM_BAND_LW_SW_AIR: + if (band == BAND_MW) { + band = BAND_LW; + SelectBand(); + } + break; + case AM_BAND_MW_SW_AIR: + if (band == BAND_LW) { + band = BAND_MW; + SelectBand(); + } + break; + case AM_BAND_LW_MW: + if (band == BAND_SW || band == BAND_AIR) { + band = BAND_LW; + SelectBand(); + } + break; + case AM_BAND_LW_SW: + if (band == BAND_MW || band == BAND_AIR) { + band = BAND_LW; + SelectBand(); + } + break; + case AM_BAND_LW_AIR: + if (band == BAND_MW || band == BAND_SW) { + band = BAND_LW; + SelectBand(); + } + break; + case AM_BAND_MW_SW: + if (band == BAND_LW || band == BAND_AIR) { + band = BAND_MW; + SelectBand(); + } + break; + case AM_BAND_MW_AIR: + if (band == BAND_LW || band == BAND_SW) { + band = BAND_MW; + SelectBand(); + } + break; + case AM_BAND_SW_AIR: + if (band == BAND_LW || band == BAND_MW) { + band = BAND_SW; + SelectBand(); + } + break; + case AM_BAND_LW: + if (band != BAND_LW) { + band = BAND_LW; + SelectBand(); + } + break; + case AM_BAND_MW: + if (band != BAND_MW) { + band = BAND_MW; + SelectBand(); + } + break; + case AM_BAND_SW: + if (band != BAND_SW) { + band = BAND_SW; + SelectBand(); + } + break; + case AM_BAND_AIR: + if (band != BAND_AIR) { + band = BAND_AIR; + SelectBand(); + } + break; + } +#else // has no air band switch (bandAM) { case AM_BAND_ALL: break; @@ -1313,17 +1447,30 @@ void doBandSelectionAM() { SelectBand(); break; } +#endif } void AMjumptoFM() { if (bandFM != FM_BAND_NONE) { if (bandFM == FM_BAND_FM) band = BAND_FM; else band = BAND_OIRT; } else { - // do nothing + FMjumptoAM(); } } void FMjumptoAM() { +#ifdef HAS_AIR_BAND + if (bandAM == AM_BAND_ALL || bandAM == AM_BAND_LW_MW_AIR || bandAM == AM_BAND_LW_SW_AIR || bandAM == AM_BAND_LW_MW || bandAM == AM_BAND_LW_SW || bandAM == AM_BAND_LW_AIR || bandAM == AM_BAND_LW) { + band = BAND_LW; + if (stepsize > 3) stepsize = 3; + } else if (bandAM == AM_BAND_MW_SW || bandAM == AM_BAND_MW_AIR || bandAM == AM_BAND_MW) { + band = BAND_MW; + } else if (bandAM == AM_BAND_SW_AIR || bandAM == AM_BAND_SW) { + band = BAND_SW; + } else if (bandAM == AM_BAND_AIR) { + band = BAND_AIR; + } +#else if (bandAM == AM_BAND_ALL || bandAM == AM_BAND_LW_MW || bandAM == AM_BAND_LW_SW || bandAM == AM_BAND_LW) { band = BAND_LW; if (stepsize > 3) stepsize = 3; @@ -1332,10 +1479,43 @@ void FMjumptoAM() { } else if (bandAM == AM_BAND_SW) { band = BAND_SW; } +#endif } void ToggleBand(byte nowBand) { switch (nowBand) { +#ifdef HAS_AIR_BAND + case BAND_LW: + if (bandAM == AM_BAND_LW_MW_SW || bandAM == AM_BAND_LW_MW_AIR || bandAM == AM_BAND_LW_MW || bandAM == AM_BAND_ALL) { + band = BAND_MW; + } else if (bandAM == AM_BAND_LW_SW_AIR || bandAM == AM_BAND_LW_SW) { + band = BAND_SW; + } else if (bandAM == AM_BAND_LW_MW_AIR || bandAM == AM_BAND_LW_SW_AIR || bandAM == AM_BAND_LW_AIR) { + band = BAND_AIR; + } else if (bandAM == AM_BAND_LW || bandAM == AM_BAND_NONE) { + AMjumptoFM(); + } + break; + case BAND_MW: + if (bandAM == AM_BAND_LW_MW_SW || bandAM == AM_BAND_MW_SW_AIR || bandAM == AM_BAND_MW_SW || bandAM == AM_BAND_ALL) { + band = BAND_SW; + } else if (bandAM == AM_BAND_LW_MW_AIR || bandAM == AM_BAND_MW_AIR) { + band = BAND_AIR; + } else if (bandAM == AM_BAND_MW || bandAM == AM_BAND_NONE) { + AMjumptoFM(); + } + break; + case BAND_SW: + if (bandAM == AM_BAND_LW_SW_AIR || bandAM == AM_BAND_MW_SW_AIR || bandAM == AM_BAND_SW_AIR || bandAM == AM_BAND_ALL) { + band = BAND_AIR; + } else if (bandAM == AM_BAND_LW_MW_SW || bandAM == AM_BAND_LW_SW || bandAM == AM_BAND_MW_SW || bandAM == AM_BAND_SW || bandAM == AM_BAND_NONE) { + AMjumptoFM(); + } + break; + case BAND_AIR: + AMjumptoFM(); + break; +#else // has no air band case BAND_LW: if (bandAM == AM_BAND_LW_MW || bandAM == AM_BAND_ALL) { band = BAND_MW; @@ -1360,8 +1540,9 @@ void ToggleBand(byte nowBand) { break; case BAND_SW: if (bandFM != FM_BAND_NONE) { - if (bandFM == FM_BAND_FM) band = BAND_FM; else band = BAND_OIRT; - } else { + if (bandFM == FM_BAND_FM) band = BAND_FM; + else band = BAND_OIRT; + } else { // FM be disabled if (bandAM == AM_BAND_LW_SW || bandAM == AM_BAND_ALL) { band = BAND_LW; } else if (bandAM == AM_BAND_MW_SW) { @@ -1371,6 +1552,7 @@ void ToggleBand(byte nowBand) { } } break; +#endif case BAND_OIRT: if (bandFM == FM_BAND_ALL || bandFM == FM_BAND_FM) { band = BAND_FM; @@ -1472,10 +1654,13 @@ void StoreFrequency() { EEPROM.writeUInt(EE_UINT16_FREQUENCY_LW, frequency_LW); EEPROM.writeUInt(EE_UINT16_FREQUENCY_MW, frequency_MW); EEPROM.writeUInt(EE_UINT16_FREQUENCY_SW, frequency_SW); +#ifdef HAS_AIR_BAND + EEPROM.writeUInt(EE_UINT16_FREQUENCY_AIR, frequency_AIR); +#endif EEPROM.commit(); } -void LimitAMFrequency() { +void LimitAMFrequency() {//todo air switch (band) { case BAND_LW: frequency_AM = frequency_LW; @@ -1853,10 +2038,23 @@ void SelectBand() { case BAND_LW: freqold = frequency_LW; frequency_AM = frequency_LW; break; case BAND_MW: freqold = frequency_MW; frequency_AM = frequency_MW; break; case BAND_SW: freqold = frequency_SW; frequency_AM = frequency_SW; break; +#ifdef HAS_AIR_BAND + case BAND_AIR: freqold = frequency_AIR; frequency_AM = frequency_AIR;break; +#endif } LimitAMFrequency(); if (!externaltune) CheckBandForbiddenAM(); +#ifdef HAS_AIR_BAND + if (band == BAND_AIR) { + radio.SetFreqAIR(10700); + log_d("BAND SELECT -> 航空的频率: %d",frequency_AIR); + } else { + radio.SetFreqAM(frequency_AM); + } +#else radio.SetFreqAM(frequency_AM); +#endif + log_d("BAND SELECT -> 现在的频率: %d",frequency_AM); radio.setAMAttenuation(amgain); radio.setAMCoChannel(amcodect, amcodectcount); doBW(); @@ -1876,7 +2074,11 @@ void SelectBand() { tftPrint(0, "iMS", 265, 59, GreyoutColor, BackgroundColor, 16); tft.drawRoundRect(286, 56, 32, 20, 5, GreyoutColor); tftPrint(0, "EQ", 303, 59, GreyoutColor, BackgroundColor, 16); + // todo + // if (band == AM_BAND_AIR) tftPrint(-1, "MHz", 258, 76, ActiveColor, ActiveColorSmooth, 28); + // else tftPrint(-1, "KHz", 258, 76, ActiveColor, ActiveColorSmooth, 28); } + log_d("BAND SELECT -> 现在的波段: %d",band); } else { if (tunemode == TUNE_MI_BAND) tunemode = TUNE_MAN; radio.power(0); @@ -2111,7 +2313,7 @@ void Round5K(unsigned int freqAM) { } } -void RoundStep() { +void RoundStep() {//todo air if (band == BAND_FM) { unsigned int freq = frequency; switch (fmdefaultstepsize) { @@ -2166,7 +2368,7 @@ void ButtonPress() { EEPROM.writeByte(memorypos + EE_PRESETS_BAND_START, band); EEPROM.writeByte(memorypos + EE_PRESET_BW_START, BWset); EEPROM.writeByte(memorypos + EE_PRESET_MS_START, StereoToggle); - if (band == BAND_FM) { + if (band == BAND_FM) {//todo air EEPROM.writeUInt((memorypos * 4) + EE_PRESETS_FREQUENCY_START, frequency); } else if (band == BAND_OIRT) { EEPROM.writeUInt((memorypos * 4) + EE_PRESETS_FREQUENCY_START, frequency_OIRT); @@ -2200,7 +2402,7 @@ void ButtonPress() { EEPROM.commit(); - if (band == BAND_FM) { + if (band == BAND_FM) {//todo air presets[memorypos].frequency = frequency; } else if (band == BAND_OIRT) { presets[memorypos].frequency = frequency_OIRT; @@ -2506,22 +2708,36 @@ void DoMemoryPosTune() { band = presets[memorypos].band; } - if (band == BAND_FM) { - frequency = presets[memorypos].frequency; - radio.SetFreq(frequency); - } else if (band == BAND_OIRT) { - frequency_OIRT = presets[memorypos].frequency; - radio.SetFreq(frequency_OIRT); - } else if (band == BAND_LW) { - frequency_LW = presets[memorypos].frequency; - radio.SetFreqAM(frequency_LW); - } else if (band == BAND_MW) { - frequency_MW = presets[memorypos].frequency; - radio.SetFreqAM(frequency_MW); - } else if (band == BAND_SW) { - frequency_SW = presets[memorypos].frequency; - radio.SetFreqAM(frequency_SW); + switch (band) { + case BAND_FM: + frequency = presets[memorypos].frequency; + radio.SetFreq(frequency); + break; + case BAND_OIRT: + frequency = presets[memorypos].frequency; + radio.SetFreq(frequency_OIRT); + break; + case BAND_LW: + frequency = presets[memorypos].frequency; + radio.SetFreq(frequency_LW); + break; + case BAND_MW: + frequency = presets[memorypos].frequency; + radio.SetFreq(frequency_MW); + break; + case BAND_SW: + frequency = presets[memorypos].frequency; + radio.SetFreq(frequency_SW); + break; +#ifdef HAS_AIR_BAND + case BAND_AIR: + frequency = presets[memorypos].frequency; + // radio.SetFreq(frequency_AIR); // todo + radio.SetFreqAM(10700); // todo + break; +#endif } + ShowFreq(0); if (band == BAND_FM || band == BAND_OIRT) { @@ -2593,6 +2809,9 @@ void ShowFreq(int mode) { case BAND_LW: frequency_AM = frequency_LW; break; case BAND_MW: frequency_AM = frequency_MW; break; case BAND_SW: frequency_AM = frequency_SW; break; +#ifdef HAS_AIR_BAND + case BAND_AIR: frequency_AM = frequency_AIR; break; // todo air +#endif } if (!screenmute) { @@ -2609,7 +2828,11 @@ void ShowFreq(int mode) { FrequencySprite.setTextDatum(TR_DATUM); FrequencySprite.setTextColor(FreqColor, FreqColorSmooth, false); - FrequencySprite.drawString(String(frequency_AM) + " ", 218, -6); + if (band == BAND_AIR) { + FrequencySprite.drawString(String(frequency_AM / 1000) + "." + String(frequency_AM % 1000) + " ", 218, -6); + } else { + FrequencySprite.drawString(String(frequency_AM) + " ", 218, -6); + } FrequencySprite.unloadFont(); FrequencySprite.setTextColor(PrimaryColor, PrimaryColorSmooth, false); FrequencySprite.setTextDatum(TL_DATUM); @@ -3071,7 +3294,7 @@ void doSquelch() { SquelchSprite.unloadFont(); } -void updateBW() { +void updateBW() {//todo air if (BWset == 0) { if (!screenmute && !advancedRDS && !afscreen) { tft.drawRoundRect(248, 35, 71, 20, 5, ActiveColor); @@ -3123,7 +3346,8 @@ void updateEQ() { } void updateCodetect() { - if (band > BAND_GAP) { + if ( + band > BAND_GAP && band != BAND_AIR) { if (WAM) { tftPrint(-1, "CO", 50, 61, PrimaryColor, PrimaryColorSmooth, 16); } else { @@ -3433,10 +3657,18 @@ void TuneUp() { } else if (frequency_AM < MWLowEdgeSet) { temp = FREQ_MW_STEP_9K; frequency_AM = (frequency_AM / FREQ_MW_STEP_9K) * FREQ_MW_STEP_9K; - } else { + } else if (frequency_AM < SWHighEdgeSet && frequency_AM > SWLowEdgeSet) { temp = FREQ_SW_STEP_5K; frequency_AM = (frequency_AM / FREQ_SW_STEP_5K) * FREQ_SW_STEP_5K; } +#ifdef HAS_AIR_BAND + else if (frequency_AM < AIRHighEdgeSet && frequency_AM > AIRLowEdgeSet) { + + if (airstepsize == 0) temp = FREQ_AIR_STEP_25K; + else temp = FREQ_AIR_STEP_8K33; + log_d("tune up airband stepsize = %d",airstepsize); + } +#endif } else { if (band == BAND_OIRT) { temp = FREQ_OIRT_STEP_30K; @@ -3501,6 +3733,18 @@ void TuneUp() { radio.SetFreqAM(frequency_AM); frequency_SW = frequency_AM; } +#ifdef HAS_AIR_BAND + else if (band == BAND_AIR) { + log_d("tune up airband = %d",frequency_AM); + frequency_AM += temp; + if (frequency_AIR > AIRHighEdgeSet) { + frequency_AM = AIRLowEdgeSet; + if (edgebeep) EdgeBeeper(); + } + radio.SetFreqAM(frequency_AM); + frequency_AIR = frequency_AM; + } +#endif radio.clearRDS(fullsearchrds); if (RDSSPYUSB) Serial.print("G:\r\nRESET-------\r\n\r\n"); if (RDSSPYTCP) RemoteClient.print("G:\r\nRESET-------\r\n\r\n"); @@ -3759,6 +4003,9 @@ void DefaultSettings(byte userhardwaremodel) { if (userhardwaremodel == BASE_ILI9341) EEPROM.writeUInt(EE_UINT16_FREQUENCY_LW, 180); else EEPROM.writeUInt(EE_UINT16_FREQUENCY_LW, 164); if (userhardwaremodel == BASE_ILI9341) EEPROM.writeUInt(EE_UINT16_FREQUENCY_MW, 540); else EEPROM.writeUInt(EE_UINT16_FREQUENCY_MW, 639); if (userhardwaremodel == BASE_ILI9341) EEPROM.writeUInt(EE_UINT16_FREQUENCY_SW, 1800); else EEPROM.writeUInt(EE_UINT16_FREQUENCY_SW, 5000); +#ifdef HAS_AIR_BAND + EEPROM.writeUInt(EE_UINT16_FREQUENCY_AIR, 135350); +#endif EEPROM.writeString(EE_STRING_XDRGTK_KEY, "password"); if (userhardwaremodel == BASE_ILI9341) EEPROM.writeByte(EE_BYTE_USESQUELCH, 1); else EEPROM.writeByte(EE_BYTE_USESQUELCH, 0); EEPROM.writeByte(EE_BYTE_SHOWMODULATION, 1); @@ -3790,6 +4037,9 @@ void DefaultSettings(byte userhardwaremodel) { EEPROM.writeByte(EE_BYTE_FASTPS, 1); EEPROM.writeByte(EE_BYTE_TOT, 0); EEPROM.writeByte(EE_BYTE_MWREGION, 0); +#ifdef HAS_AIR_BAND + EEPROM.writeByte(EE_BYTE_AIRSTEPSIZE, 0); +#endif EEPROM.writeByte(EE_BYTE_SPISPEED, 0); EEPROM.writeByte(EE_BYTE_AMSCANSENS, 4); EEPROM.writeByte(EE_BYTE_FMSCANSENS, 4); @@ -4016,6 +4266,9 @@ void endMenu() { EEPROM.writeByte(EE_BYTE_FASTPS, radio.rds.fastps); EEPROM.writeByte(EE_BYTE_TOT, tot); EEPROM.writeByte(EE_BYTE_MWREGION, mwstepsize); +#ifdef HAS_AIR_BAND + EEPROM.writeByte(EE_BYTE_AIRSTEPSIZE, airstepsize); +#endif EEPROM.writeByte(EE_BYTE_SPISPEED, spispeed); EEPROM.writeByte(EE_BYTE_AMSCANSENS, amscansens); EEPROM.writeByte(EE_BYTE_FMSCANSENS, fmscansens); diff --git a/src/TEF6686.cpp b/src/TEF6686.cpp index 1327463..2a084dd 100644 --- a/src/TEF6686.cpp +++ b/src/TEF6686.cpp @@ -135,16 +135,16 @@ void TEF6686::init(byte TEF) { if (xtalADC < XTAL_0V_ADC + XTAL_ADC_TOL) { Tuner_Init(tuner_init_tab9216); - log_v("XTAL : 9.216M"); + log_d("TEF668X XTAL : 9.216M"); } else if (xtalADC > XTAL_1V_ADC - XTAL_ADC_TOL && xtalADC < XTAL_1V_ADC + XTAL_ADC_TOL) { Tuner_Init(tuner_init_tab12000); - log_v("XTAL : 12M"); + log_d("TEF668X XTAL : 12M"); } else if (xtalADC > XTAL_2V_ADC - XTAL_ADC_TOL && xtalADC < XTAL_2V_ADC + XTAL_ADC_TOL) { Tuner_Init(tuner_init_tab55000); - log_v("XTAL : 55M"); + log_d("TEF668X XTAL : 55M"); } else { Tuner_Init(tuner_init_tab4000); - log_v("XTAL : 4M"); + log_d("TEF668X XTAL : 4M"); } power(1); Tuner_Init(tuner_init_tab); @@ -178,6 +178,10 @@ void TEF6686::SetFreqAM(uint16_t frequency) { devTEF_Radio_Tune_AM (frequency); } +void TEF6686::SetFreqAIR(uint16_t frequency) { + devTEF_Radio_Tune_AM (10700); +} + void TEF6686::setOffset(int8_t offset) { devTEF_Radio_Set_LevelOffset(offset * 10); } diff --git a/src/TEF6686.h b/src/TEF6686.h index ec33c13..2d461ef 100644 --- a/src/TEF6686.h +++ b/src/TEF6686.h @@ -660,6 +660,7 @@ class TEF6686 { void readRDS(byte showrdserrors); void SetFreq(uint16_t frequency); void SetFreqAM(uint16_t frequency); + void SetFreqAIR(uint16_t frequency); bool getProcessing(uint16_t &highcut, uint16_t &stereo, uint16_t &sthiblend, uint8_t &stband_1, uint8_t &stband_2, uint8_t &stband_3, uint8_t &stband_4); bool getStatus(int16_t &level, uint16_t &USN, uint16_t &WAM, int16_t &offset, uint16_t &bandwidth, uint16_t &modulation, int8_t &snr); bool getStatusAM(int16_t &level, uint16_t &noise, uint16_t &cochannel, int16_t &offset, uint16_t &bandwidth, uint16_t &modulation, int8_t &snr); diff --git a/src/config.h b/src/config.h new file mode 100644 index 0000000..53da484 --- /dev/null +++ b/src/config.h @@ -0,0 +1,9 @@ +#ifndef CONFIG_H +#define CONFIG_H + +#include + +// #define HAS_AIR_BAND // uncomment to enable Air Band(Make sure you have Air Band extend board) +#define CHINA_PORTABLE // uncomment for China Portable build (Simplified Chinese) + +#endif \ No newline at end of file diff --git a/src/constants.h b/src/constants.h index 43c9266..cfd6202 100644 --- a/src/constants.h +++ b/src/constants.h @@ -1,3 +1,5 @@ +#include "config.h" + #define ON 1 #define OFF 0 #define REVERSE false @@ -33,6 +35,10 @@ #define FREQ_MW_STEP_9K 9 #define FREQ_MW_STEP_10K 10 #define FREQ_SW_STEP_5K 5 +#ifdef HAS_AIR_BAND +#define FREQ_AIR_STEP_25K 25 +#define FREQ_AIR_STEP_8K33 8.33 +#endif #define FREQ_OIRT_STEP_30K 3 #define FREQ_FM_STEP_50K 5 #define FREQ_FM_STEP_100K 10 @@ -48,6 +54,10 @@ #define FREQ_SW_LOW_EDGE_MAX (FREQ_SW_160M_START) #define FREQ_SW_HIGH_EDGE_MIN (FREQ_SW_11M_END) #define FREQ_SW_HIGH_EDGE_MAX (FREQ_SW_END) +#ifdef HAS_AIR_BAND +#define FREQ_AIR_LOW_EDGE_MIN 108000 +#define FREQ_AIR_HIGH_EDGE_MIN 137000 +#endif #define FREQ_FM_START 65000 #define FREQ_FM_END 108000 #define FREQ_FM_OIRT_START 6500 // use values of 1/10 * kHz @@ -196,9 +206,13 @@ // EEPROM index defines #define EE_PRESETS_CNT 99 // When set > 99 change the complete EEPROM adressing! -#define EE_CHECKBYTE_VALUE 7 // 0 ~ 255,add new entry, change for new value +#define EE_CHECKBYTE_VALUE 10 // 0 ~ 255,add new entry, change for new value #define EE_PRESETS_FREQUENCY 0 // Default value when memory channel should be skipped! +#ifdef HAS_AIR_BAND +#define EE_TOTAL_CNT 2219 // Total occupied eeprom bytes +#else #define EE_TOTAL_CNT 2214 // Total occupied eeprom bytes +#endif #define EE_PRESETS_BAND_START 0 // 99 * 1 byte #define EE_PRESET_BW_START 99 // 99 * 1 byte @@ -296,6 +310,10 @@ #define EE_BYTE_SCANMEM 2211 #define EE_BYTE_SCANCANCEL 2212 #define EE_BYTE_SCANMUTE 2213 +#ifdef HAS_AIR_BAND +#define EE_BYTE_AIRSTEPSIZE 2114 +#define EE_UINT16_FREQUENCY_AIR 2215 +#endif // End of EEPROM index defines static const char* const unitString[] = {"dBμV", "dBf", "dBm"}; @@ -319,15 +337,28 @@ enum SCAN_CANCEL { // FM band: before BAND_GAP; AM band: after BAND_GAP enum RADIO_BAND { - BAND_OIRT = 0, BAND_FM, BAND_GAP, BAND_LW, BAND_MW, BAND_SW + BAND_OIRT = 0, BAND_FM, BAND_GAP, BAND_LW, BAND_MW, BAND_SW, BAND_AIR }; +#ifndef HAS_AIR_BAND // Toggle: LW -> MW -> SW enum RADIO_AM_BAND_SELECTION { AM_BAND_ALL = 0, AM_BAND_LW_MW, AM_BAND_LW_SW, AM_BAND_MW_SW, AM_BAND_LW, AM_BAND_MW, AM_BAND_SW, AM_BAND_NONE, AM_BAND_CNT }; +#else +// Toggle: LW -> MW -> SW -> AIR +enum RADIO_AM_BAND_SELECTION { + AM_BAND_ALL = 0, + AM_BAND_LW_MW_SW, AM_BAND_LW_MW_AIR, AM_BAND_LW_SW_AIR, AM_BAND_MW_SW_AIR, + AM_BAND_LW_MW, AM_BAND_LW_SW, AM_BAND_LW_AIR, + AM_BAND_MW_SW, AM_BAND_MW_AIR, + AM_BAND_SW_AIR, + AM_BAND_LW, AM_BAND_MW, AM_BAND_SW, AM_BAND_AIR, AM_BAND_NONE, + AM_BAND_CNT +}; +#endif /* end of HAS_AIR_BAND */ // Toggle: OIRT -> FM enum RADIO_FM_BAND_SELECTION { diff --git a/src/gui.cpp b/src/gui.cpp index 52a82cb..d2ed284 100644 --- a/src/gui.cpp +++ b/src/gui.cpp @@ -1,6 +1,7 @@ #include "gui.h" #include "language.h" #include "constants.h" +#include "config.h" #include #include #include @@ -1193,7 +1194,27 @@ void ShowOneLine(byte position, byte item, bool selected) { FullLineSprite.setTextDatum(TR_DATUM); FullLineSprite.setTextColor(PrimaryColor, PrimaryColorSmooth, false); - +#ifdef HAS_AIR_BAND + switch (bandAM) { + case AM_BAND_ALL: FullLineSprite.drawString(myLanguage[language][102] + String(",") + myLanguage[language][103] + String(",") + myLanguage[language][104] + String(",") + myLanguage[language][223], 298, 3); break; + case AM_BAND_LW_MW_SW: FullLineSprite.drawString(myLanguage[language][102] + String(",") + myLanguage[language][103] + String(",") + myLanguage[language][104], 298, 3); break; + case AM_BAND_LW_MW_AIR: FullLineSprite.drawString(myLanguage[language][102] + String(",") + myLanguage[language][103] + String(",") + myLanguage[language][223], 298, 3); break; + case AM_BAND_LW_SW_AIR: FullLineSprite.drawString(myLanguage[language][102] + String(",") + myLanguage[language][104] + String(",") + myLanguage[language][223], 298, 3); break; + case AM_BAND_MW_SW_AIR: FullLineSprite.drawString(myLanguage[language][103] + String(",") + myLanguage[language][104] + String(",") + myLanguage[language][223], 298, 3); break; + case AM_BAND_LW_MW: FullLineSprite.drawString(myLanguage[language][102] + String(",") + myLanguage[language][103], 298, 3); break; + case AM_BAND_LW_SW: FullLineSprite.drawString(myLanguage[language][102] + String(",") + myLanguage[language][104], 298, 3); break; + case AM_BAND_LW_AIR: FullLineSprite.drawString(myLanguage[language][102] + String(",") + myLanguage[language][223], 298, 3); break; + case AM_BAND_MW_SW: FullLineSprite.drawString(myLanguage[language][103] + String(",") + myLanguage[language][104], 298, 3); break; + case AM_BAND_MW_AIR: FullLineSprite.drawString(myLanguage[language][103] + String(",") + myLanguage[language][223], 298, 3); break; + case AM_BAND_SW_AIR: FullLineSprite.drawString(myLanguage[language][104] + String(",") + myLanguage[language][223], 298, 3); break; + case AM_BAND_LW: FullLineSprite.drawString(myLanguage[language][102], 298, 3); break; + case AM_BAND_MW: FullLineSprite.drawString(myLanguage[language][103], 298, 3); break; + case AM_BAND_SW: FullLineSprite.drawString(myLanguage[language][104], 298, 3); break; + case AM_BAND_AIR: FullLineSprite.drawString(myLanguage[language][223], 298, 3); break; + case AM_BAND_NONE: FullLineSprite.drawString(myLanguage[language][83], 298, 3); break; + } + break; +#else switch (bandAM) { case AM_BAND_ALL: FullLineSprite.drawString(myLanguage[language][102] + String(",") + myLanguage[language][103] + String(",") + myLanguage[language][104], 298, 3); break; case AM_BAND_LW_MW: FullLineSprite.drawString(myLanguage[language][102] + String(",") + myLanguage[language][103], 298, 3); break; @@ -1204,7 +1225,8 @@ void ShowOneLine(byte position, byte item, bool selected) { case AM_BAND_SW: FullLineSprite.drawString(myLanguage[language][104], 298, 3); break; case AM_BAND_NONE: FullLineSprite.drawString(myLanguage[language][83], 298, 3); break; } - break; + break; +#endif case DISPLAYSETTINGS: FullLineSprite.setTextDatum(TL_DATUM); @@ -1618,10 +1640,22 @@ void BuildDisplay() { case BAND_LW: tftPrint(-1, myLanguage[language][102], 70, 32, bandColor, PrimaryColorSmooth, 16); break; case BAND_MW: tftPrint(-1, myLanguage[language][103], 70, 32, bandColor, PrimaryColorSmooth, 16); break; case BAND_SW: tftPrint(-1, myLanguage[language][104], 70, 32, bandColor, PrimaryColorSmooth, 16); break; +#ifdef HAS_AIR_BAND + case BAND_AIR: tftPrint(-1, myLanguage[language][223], 70, 32, bandColor, PrimaryColorSmooth, 16); break; +#endif case BAND_FM: tftPrint(-1, myLanguage[language][105], 70, 32, bandColor, PrimaryColorSmooth, 16); break; case BAND_OIRT: tftPrint(-1, myLanguage[language][106], 70, 32, bandColor, PrimaryColorSmooth, 16); break; } - if (band < BAND_GAP) tftPrint(-1, "MHz", 258, 76, ActiveColor, ActiveColorSmooth, 28); else tftPrint(-1, "kHz", 258, 76, ActiveColor, ActiveColorSmooth, 28); + if (band < BAND_GAP) tftPrint(-1, "MHz", 258, 76, ActiveColor, ActiveColorSmooth, 28); + else { +#ifdef HAS_AIR_BAND + if (band == AM_BAND_AIR) + tftPrint(-1, "MHz", 258, 76, ActiveColor, ActiveColorSmooth, 28); + else tftPrint(-1, "KHz", 258, 76, ActiveColor, ActiveColorSmooth, 28); +#else + tftPrint(-1, "KHz", 258, 76, ActiveColor, ActiveColorSmooth, 28); +#endif + } RDSstatusold = false; Stereostatusold = false; @@ -1785,7 +1819,26 @@ void MenuUp() { case ITEM8: bandAM++; if (bandAM > AM_BAND_CNT - 1) bandAM = AM_BAND_ALL; - +#ifdef HAS_AIR_BAND + switch (bandAM) { + case AM_BAND_ALL: OneBigLineSprite.drawString(myLanguage[language][102] + String(",") + myLanguage[language][103] + String(",") + myLanguage[language][104]+ String(",") + myLanguage[language][223], 135, 0); break; + case AM_BAND_LW_MW_SW: OneBigLineSprite.drawString(myLanguage[language][102] + String(",") + myLanguage[language][103] + String(",") + myLanguage[language][104], 135, 0); break; + case AM_BAND_LW_MW_AIR: OneBigLineSprite.drawString(myLanguage[language][102] + String(",") + myLanguage[language][103] + String(",") + myLanguage[language][223], 135, 0); break; + case AM_BAND_LW_SW_AIR: OneBigLineSprite.drawString(myLanguage[language][102] + String(",") + myLanguage[language][104] + String(",") + myLanguage[language][223], 135, 0); break; + case AM_BAND_MW_SW_AIR: OneBigLineSprite.drawString(myLanguage[language][103] + String(",") + myLanguage[language][104] + String(",") + myLanguage[language][223], 135, 0); break; + case AM_BAND_LW_MW: OneBigLineSprite.drawString(myLanguage[language][102] + String(",") + myLanguage[language][103], 135, 0); break; + case AM_BAND_LW_SW: OneBigLineSprite.drawString(myLanguage[language][102] + String(",") + myLanguage[language][104], 135, 0); break; + case AM_BAND_LW_AIR: OneBigLineSprite.drawString(myLanguage[language][102] + String(",") + myLanguage[language][223], 135, 0); break; + case AM_BAND_MW_SW: OneBigLineSprite.drawString(myLanguage[language][103] + String(",") + myLanguage[language][104], 135, 0); break; + case AM_BAND_MW_AIR: OneBigLineSprite.drawString(myLanguage[language][103] + String(",") + myLanguage[language][223], 135, 0); break; + case AM_BAND_SW_AIR: OneBigLineSprite.drawString(myLanguage[language][104] + String(",") + myLanguage[language][223], 135, 0); break; + case AM_BAND_LW: OneBigLineSprite.drawString(myLanguage[language][102], 135, 0); break; + case AM_BAND_MW: OneBigLineSprite.drawString(myLanguage[language][103], 135, 0); break; + case AM_BAND_SW: OneBigLineSprite.drawString(myLanguage[language][104], 135, 0); break; + case AM_BAND_AIR: OneBigLineSprite.drawString(myLanguage[language][223], 135, 0); break; + case AM_BAND_NONE: OneBigLineSprite.drawString(myLanguage[language][83], 135, 0); break; + } +#else switch (bandAM) { case AM_BAND_ALL: OneBigLineSprite.drawString(myLanguage[language][102] + String(",") + myLanguage[language][103] + String(",") + myLanguage[language][104], 135, 0); break; case AM_BAND_LW_MW: OneBigLineSprite.drawString(myLanguage[language][102] + String(",") + myLanguage[language][103], 135, 0); break; @@ -1796,7 +1849,7 @@ void MenuUp() { case AM_BAND_SW: OneBigLineSprite.drawString(myLanguage[language][104], 135, 0); break; case AM_BAND_NONE: OneBigLineSprite.drawString(myLanguage[language][83], 135, 0); break; } - +#endif OneBigLineSprite.pushSprite(24, 118); break; @@ -2589,6 +2642,26 @@ void MenuDown() { bandAM--; if (bandAM > AM_BAND_CNT) bandAM = AM_BAND_NONE; +#ifdef HAS_AIR_BAND + switch (bandAM) { + case AM_BAND_ALL: OneBigLineSprite.drawString(myLanguage[language][102] + String(",") + myLanguage[language][103] + String(",") + myLanguage[language][104]+ String(",") + myLanguage[language][223], 135, 0); break; + case AM_BAND_LW_MW_SW: OneBigLineSprite.drawString(myLanguage[language][102] + String(",") + myLanguage[language][103] + String(",") + myLanguage[language][104], 135, 0); break; + case AM_BAND_LW_MW_AIR: OneBigLineSprite.drawString(myLanguage[language][102] + String(",") + myLanguage[language][103] + String(",") + myLanguage[language][223], 135, 0); break; + case AM_BAND_LW_SW_AIR: OneBigLineSprite.drawString(myLanguage[language][102] + String(",") + myLanguage[language][104] + String(",") + myLanguage[language][223], 135, 0); break; + case AM_BAND_MW_SW_AIR: OneBigLineSprite.drawString(myLanguage[language][103] + String(",") + myLanguage[language][104] + String(",") + myLanguage[language][223], 135, 0); break; + case AM_BAND_LW_MW: OneBigLineSprite.drawString(myLanguage[language][102] + String(",") + myLanguage[language][103], 135, 0); break; + case AM_BAND_LW_SW: OneBigLineSprite.drawString(myLanguage[language][102] + String(",") + myLanguage[language][104], 135, 0); break; + case AM_BAND_LW_AIR: OneBigLineSprite.drawString(myLanguage[language][102] + String(",") + myLanguage[language][223], 135, 0); break; + case AM_BAND_MW_SW: OneBigLineSprite.drawString(myLanguage[language][103] + String(",") + myLanguage[language][104], 135, 0); break; + case AM_BAND_MW_AIR: OneBigLineSprite.drawString(myLanguage[language][103] + String(",") + myLanguage[language][223], 135, 0); break; + case AM_BAND_SW_AIR: OneBigLineSprite.drawString(myLanguage[language][104] + String(",") + myLanguage[language][223], 135, 0); break; + case AM_BAND_LW: OneBigLineSprite.drawString(myLanguage[language][102], 135, 0); break; + case AM_BAND_MW: OneBigLineSprite.drawString(myLanguage[language][103], 135, 0); break; + case AM_BAND_SW: OneBigLineSprite.drawString(myLanguage[language][104], 135, 0); break; + case AM_BAND_AIR: OneBigLineSprite.drawString(myLanguage[language][223], 135, 0); break; + case AM_BAND_NONE: OneBigLineSprite.drawString(myLanguage[language][83], 135, 0); break; + } +#else switch (bandAM) { case AM_BAND_ALL: OneBigLineSprite.drawString(myLanguage[language][102] + String(",") + myLanguage[language][103] + String(",") + myLanguage[language][104], 135, 0); break; case AM_BAND_LW_MW: OneBigLineSprite.drawString(myLanguage[language][102] + String(",") + myLanguage[language][103], 135, 0); break; @@ -2599,6 +2672,8 @@ void MenuDown() { case AM_BAND_SW: OneBigLineSprite.drawString(myLanguage[language][104], 135, 0); break; case AM_BAND_NONE: OneBigLineSprite.drawString(myLanguage[language][83], 135, 0); break; } +#endif + OneBigLineSprite.pushSprite(24, 118); break; @@ -3101,6 +3176,7 @@ void MenuDown() { OneBigLineSprite.drawString((showSWMIBand ? myLanguage[language][42] : myLanguage[language][30]), 135, 0); OneBigLineSprite.pushSprite(24, 118); + break; case ITEM5: @@ -3455,6 +3531,26 @@ void DoMenu() { case ITEM8: Infoboxprint(myLanguage[language][101]); +#ifdef HAS_AIR_BAND + switch (bandAM) { + case AM_BAND_ALL: OneBigLineSprite.drawString(myLanguage[language][102] + String(",") + myLanguage[language][103] + String(",") + myLanguage[language][104]+ String(",") + myLanguage[language][223], 135, 0); break; + case AM_BAND_LW_MW_SW: OneBigLineSprite.drawString(myLanguage[language][102] + String(",") + myLanguage[language][103] + String(",") + myLanguage[language][104], 135, 0); break; + case AM_BAND_LW_MW_AIR: OneBigLineSprite.drawString(myLanguage[language][102] + String(",") + myLanguage[language][103] + String(",") + myLanguage[language][223], 135, 0); break; + case AM_BAND_LW_SW_AIR: OneBigLineSprite.drawString(myLanguage[language][102] + String(",") + myLanguage[language][104] + String(",") + myLanguage[language][223], 135, 0); break; + case AM_BAND_MW_SW_AIR: OneBigLineSprite.drawString(myLanguage[language][103] + String(",") + myLanguage[language][104] + String(",") + myLanguage[language][223], 135, 0); break; + case AM_BAND_LW_MW: OneBigLineSprite.drawString(myLanguage[language][102] + String(",") + myLanguage[language][103], 135, 0); break; + case AM_BAND_LW_SW: OneBigLineSprite.drawString(myLanguage[language][102] + String(",") + myLanguage[language][104], 135, 0); break; + case AM_BAND_LW_AIR: OneBigLineSprite.drawString(myLanguage[language][102] + String(",") + myLanguage[language][223], 135, 0); break; + case AM_BAND_MW_SW: OneBigLineSprite.drawString(myLanguage[language][103] + String(",") + myLanguage[language][104], 135, 0); break; + case AM_BAND_MW_AIR: OneBigLineSprite.drawString(myLanguage[language][103] + String(",") + myLanguage[language][223], 135, 0); break; + case AM_BAND_SW_AIR: OneBigLineSprite.drawString(myLanguage[language][104] + String(",") + myLanguage[language][223], 135, 0); break; + case AM_BAND_LW: OneBigLineSprite.drawString(myLanguage[language][102], 135, 0); break; + case AM_BAND_MW: OneBigLineSprite.drawString(myLanguage[language][103], 135, 0); break; + case AM_BAND_SW: OneBigLineSprite.drawString(myLanguage[language][104], 135, 0); break; + case AM_BAND_AIR: OneBigLineSprite.drawString(myLanguage[language][223], 135, 0); break; + case AM_BAND_NONE: OneBigLineSprite.drawString(myLanguage[language][83], 135, 0); break; + } +#else switch (bandAM) { case AM_BAND_ALL: OneBigLineSprite.drawString(myLanguage[language][102] + String(",") + myLanguage[language][103] + String(",") + myLanguage[language][104], 135, 0); break; case AM_BAND_LW_MW: OneBigLineSprite.drawString(myLanguage[language][102] + String(",") + myLanguage[language][103], 135, 0); break; @@ -3465,6 +3561,8 @@ void DoMenu() { case AM_BAND_SW: OneBigLineSprite.drawString(myLanguage[language][104], 135, 0); break; case AM_BAND_NONE: OneBigLineSprite.drawString(myLanguage[language][83], 135, 0); break; } +#endif + OneBigLineSprite.pushSprite(24, 118); break; diff --git a/src/language.h b/src/language.h index 105b63d..c68b808 100644 --- a/src/language.h +++ b/src/language.h @@ -5,7 +5,7 @@ // [number of languages][number of texts] // *** means the text is the same as in English -static const char* const myLanguage[18][223] PROGMEM = { +static const char* const myLanguage[18][224] PROGMEM = { { "English", // English "Rotary direction changed", // 1 "Please release button", // 2 @@ -228,7 +228,8 @@ static const char* const myLanguage[18][223] PROGMEM = { "Auto cancel scan", // 219 "Correct PI", // 220 "Signal", // 221 - "Mute audio\nwhile scanning" // 222 + "Mute audio\nwhile scanning", // 222 + "AIR" // 223 }, { "Nederlands", // Dutch @@ -453,7 +454,8 @@ static const char* const myLanguage[18][223] PROGMEM = { "Auto afbreken", // 219 "Correcte PI", // 220 "Signaal", // 221 - "Geen geluid\ntijdens scannen" // 222 + "Geen geluid\ntijdens scannen", // 222 + "AIR" // 223 }, { "Polski", // Polish @@ -678,7 +680,8 @@ static const char* const myLanguage[18][223] PROGMEM = { "Automatyczne\nanulowanie skanowania", // 219 "Poprawne PI", // 220 "Sygnał", // 221 - "Wycisz dźwięk\npodczas skanowania" // 222 + "Wycisz dźwięk\npodczas skanowania", // 222 + "AIR" // 223 }, { "Hrvatski", // Croatian @@ -903,7 +906,8 @@ static const char* const myLanguage[18][223] PROGMEM = { "Auto cancel scan", // 219 "Correct PI", // 220 "Signal", // 221 - "Mute audio\nwhile scanning" // 222 + "Mute audio\nwhile scanning", // 222 + "AIR" // 223 }, { "Ελληνικά", // Greek @@ -1128,7 +1132,8 @@ static const char* const myLanguage[18][223] PROGMEM = { "Αυτόματη ακύρωση\nανίχνευσης", // 219 "Σωστό PI", // 220 "Σήμα", // 221 - "Σίγαση ήχου\nκατά την ανίχνευση" // 222 + "Σίγαση ήχου\nκατά την ανίχνευση", // 222 + "AIR" // 223 }, { "Română", // Romanian @@ -1353,7 +1358,8 @@ static const char* const myLanguage[18][223] PROGMEM = { "Auto cancel scan", // 219 "Correct PI", // 220 "Signal", // 221 - "Mute audio\nwhile scanning" // 222 + "Mute audio\nwhile scanning", // 222 + "AIR" // 223 }, { "Deutsch", // German @@ -1578,7 +1584,8 @@ static const char* const myLanguage[18][223] PROGMEM = { "Automatisches Scan-Ende", // 219 "Korrekter PI-Code", // 220 "Signal", // 221 - "Stumm beim Scannen" // 222 + "Stumm beim Scannen", // 222 + "AIR" // 223 }, { "Český", // Czech @@ -1803,7 +1810,8 @@ static const char* const myLanguage[18][223] PROGMEM = { "Auto cancel scan", // 219 "Correct PI", // 220 "Signal", // 221 - "Mute audio\nwhile scanning" // 222 + "Mute audio\nwhile scanning", // 222 + "AIR" // 223 }, { "Slovenský", // Slovak @@ -2028,7 +2036,8 @@ static const char* const myLanguage[18][223] PROGMEM = { "Auto cancel scan", // 219 "Correct PI", // 220 "Signal", // 221 - "Mute audio\nwhile scanning" // 222 + "Mute audio\nwhile scanning", // 222 + "AIR" // 223 }, { "Français", // French @@ -2253,7 +2262,8 @@ static const char* const myLanguage[18][223] PROGMEM = { "Annuler automatiquement", // 219 "PI Correct", // 220 "Signal", // 221 - "Audio muet lors\nde la numérisation" // 222 + "Audio muet lors\nde la numérisation", // 222 + "AIR" // 223 }, { "Български", // Bulgarian @@ -2478,7 +2488,8 @@ static const char* const myLanguage[18][223] PROGMEM = { "Auto cancel scan", // 219 "Correct PI", // 220 "Signal", // 221 - "Mute audio\nwhile scanning" // 222 + "Mute audio\nwhile scanning", // 222 + "AIR" // 223 }, { "Русский", // Russian @@ -2703,7 +2714,8 @@ static const char* const myLanguage[18][223] PROGMEM = { "Auto cancel scan", // 219 "Correct PI", // 220 "Signal", // 221 - "Mute audio\nwhile scanning" // 222 + "Mute audio\nwhile scanning", // 222 + "AIR" // 223 }, { "Українська", // Ukranian @@ -2928,7 +2940,8 @@ static const char* const myLanguage[18][223] PROGMEM = { "Auto cancel scan", // 219 "Correct PI", // 220 "Signal", // 221 - "Mute audio\nwhile scanning" // 222 + "Mute audio\nwhile scanning", // 222 + "AIR" // 223 }, { "Italiano", // Italian @@ -3153,7 +3166,8 @@ static const char* const myLanguage[18][223] PROGMEM = { "Fine scansione automatica", // 219 "PI corretto", // 220 "Signale", // 221 - "Audio silenziato\ndurante scansione" // 222 + "Audio silenziato\ndurante scansione", // 222 + "AIR" // 223 }, { "Simplified Chinese", // Simplified Chinese @@ -3378,7 +3392,8 @@ static const char* const myLanguage[18][223] PROGMEM = { "扫频停台条件", // 219 "节目识别码正确", // 220 "信号超阈值", // 221 - "扫描时静音" // 222 + "扫描时静音", // 222 + "AIR" // 223 }, { "Norsk", // Norwegian @@ -3603,7 +3618,8 @@ static const char* const myLanguage[18][223] PROGMEM = { "Avbryt skanning automatisk", // 219 "korrekt PI", // 220 "Signal", // 221 - "Demp lyden\nmens du skanner" // 222 + "Demp lyden\nmens du skanner", // 222 + "AIR" // 223 }, { "Español", // Spanish @@ -3828,7 +3844,8 @@ static const char* const myLanguage[18][223] PROGMEM = { "Cancelar automáticamente\nla búsqueda", // 219 "PI correcto", // 220 "Señal", // 221 - "Audio mudo\nmientras busca" // 222 + "Audio mudo\nmientras busca", // 222 + "AIR" // 223 }, { "Português", // Portuguese @@ -4053,7 +4070,8 @@ static const char* const myLanguage[18][223] PROGMEM = { "Cancelar automatic.\na pesquisa", // 219 "PI correto", // 220 "Sinal", // 221 - "Mudo áudio\nenquanto procura" // 222 + "Mudo áudio\nenquanto procura", // 222 + "AIR" // 223 } }; #endif