Finish FM DX mode

This commit is contained in:
Sjef Verhoeven PE5PVB
2024-04-11 14:25:41 +02:00
parent 085b4a77c5
commit f151473315
3 changed files with 594 additions and 498 deletions
+195 -94
View File
@@ -68,6 +68,7 @@ bool dropout;
bool dynamicPTYold;
bool edgebeep;
bool externaltune;
bool flashing;
bool fmsi;
bool fullsearchrds;
bool hasafold;
@@ -356,6 +357,7 @@ unsigned long aftickerhold;
unsigned long aftimer;
unsigned long eonticker;
unsigned long eontickerhold;
unsigned long flashingtimer;
unsigned long lowsignaltimer;
unsigned long peakholdmillis;
unsigned long rtplusticker;
@@ -799,7 +801,35 @@ void loop() {
}
if (digitalRead(BANDBUTTON) == LOW ) BANDBUTTONPress();
if (scandxmode) {
switch (scancancel) {
case CORRECTPI: if (radio.rds.correctPI != 0) cancelDXScan(); break;
case SIGNAL: if (tuned) cancelDXScan(); break;
}
if (millis() >= flashingtimer + 500) {
flashing = !flashing;
if (flashing) {
if (CurrentSkin == 1) {
tft.pushImage (12, 76, 33, 15, skin1_memon);
} else {
tft.drawRoundRect(1, 79, 42, 20, 5, ActiveColor);
tftPrint(0, "MEM", 22, 82, ActiveColor, ActiveColorSmooth, 16);
}
} else {
if (CurrentSkin == 1) {
tft.pushImage (12, 76, 33, 15, skin1_memoff);
} else {
tft.drawRoundRect(1, 79, 42, 20, 5, GreyoutColor);
tftPrint(0, "MEM", 22, 82, GreyoutColor, BackgroundColor, 16);
}
}
flashingtimer = millis();
}
}
if (scandxmode && millis() >= scantimer + (scanhold * 1000)) {
if (scanmem) {
memorypos++;
if (memorypos > scanstop) memorypos = scanstart;
while (IsStationEmpty()) {
@@ -811,6 +841,10 @@ void loop() {
}
DoMemoryPosTune();
ShowMemoryPos();
} else {
TuneUp();
ShowFreq(0);
}
scantimer = millis();
}
@@ -1380,7 +1414,9 @@ void ToggleBand(byte nowBand) {
}
void BANDBUTTONPress() {
if (scandxmode) cancelDXScan();
if (scandxmode) {
cancelDXScan();
} else {
if (memorystore) {
EEPROM.writeUInt((memorypos * 4) + EE_PRESETS_FREQUENCY_START, EE_PRESETS_FREQUENCY);
EEPROM.commit();
@@ -1418,6 +1454,9 @@ void BANDBUTTONPress() {
if (XDRGTKUSB || XDRGTKTCP) {
if (band == BAND_FM) DataPrint("M0\nT" + String(frequency * 10) + "\n"); else if (band == BAND_OIRT) DataPrint("M0\nT" + String(frequency_OIRT * 10) + "\n"); else DataPrint("M1\nT" + String(frequency_AM) + "\n");
}
} else {
startFMDXScan();
return;
}
ScreensaverTimerRestart();
}
@@ -1436,6 +1475,7 @@ void BANDBUTTONPress() {
}
}
}
}
while (digitalRead(BANDBUTTON) == LOW) delay(50);
delay(100);
}
@@ -1886,7 +1926,9 @@ void SelectBand() {
}
void BWButtonPress() {
if (scandxmode) cancelDXScan();
if (scandxmode) {
cancelDXScan();
} else {
if (!usesquelch) radio.setUnMute();
if (!menu) {
seek = false;
@@ -1919,6 +1961,7 @@ void BWButtonPress() {
}
delay(100);
}
}
}
void doStereoToggle() {
@@ -1959,7 +2002,9 @@ void doStereoToggle() {
}
void ModeButtonPress() {
if (scandxmode) cancelDXScan();
if (scandxmode) {
cancelDXScan();
} else {
if (!usesquelch) radio.setUnMute();
if (advancedRDS) {
BuildDisplay();
@@ -2012,99 +2057,16 @@ void ModeButtonPress() {
if (fmdefaultstepsize == 1) Round100K(frequency); else Round50K(frequency);
EEPROM.writeUInt(EE_UINT16_FREQUENCY_FM, frequency);
}
radio.clearRDS(fullsearchrds);
CheckBandForbiddenFM();
CheckBandForbiddenAM();
menu = false;
menuopen = false;
LowLevelInit = true;
EEPROM.writeByte(EE_BYTE_VOLSET, VolSet);
EEPROM.writeUInt(EE_UINT16_CONVERTERSET, ConverterSet);
EEPROM.writeUInt(EE_UINT16_FMLOWEDGESET, LowEdgeSet);
EEPROM.writeUInt(EE_UINT16_FMHIGHEDGESET, HighEdgeSet);
EEPROM.writeByte(EE_BYTE_CONTRASTSET, ContrastSet);
EEPROM.writeByte(EE_BYTE_STEREOLEVEL, StereoLevel);
EEPROM.writeByte(EE_BYTE_BANDFM, bandFM);
EEPROM.writeByte(EE_BYTE_BANDAM, bandAM);
EEPROM.writeByte(EE_BYTE_HIGHCUTLEVEL, HighCutLevel);
EEPROM.writeByte(EE_BYTE_HIGHCUTOFFSET, HighCutOffset);
EEPROM.writeByte(EE_BYTE_LEVELOFFSET, LevelOffset);
EEPROM.writeByte(EE_BYTE_RTBUFFER, radio.rds.rtbuffer);
EEPROM.writeByte(EE_BYTE_EDGEBEEP, edgebeep);
EEPROM.writeByte(EE_BYTE_SOFTMUTEAM, softmuteam);
EEPROM.writeByte(EE_BYTE_SOFTMUTEFM, softmutefm);
EEPROM.writeByte(EE_BYTE_LANGUAGE, language);
EEPROM.writeByte(EE_BYTE_SHOWRDSERRORS, showrdserrors);
EEPROM.writeByte(EE_BYTE_LOWLEVELSET, LowLevelSet);
EEPROM.writeByte(EE_BYTE_REGION, region);
EEPROM.writeByte(EE_BYTE_RDS_UNDERSCORE, radio.underscore);
EEPROM.writeByte(EE_BYTE_USBMODE, USBmode);
EEPROM.writeByte(EE_BYTE_WIFI, wifi);
EEPROM.writeByte(EE_BYTE_SUBNETCLIENT, subnetclient);
EEPROM.writeByte(EE_BYTE_SHOWSWMIBAND, showSWMIBand);
EEPROM.writeByte(EE_BYTE_RDS_FILTER, radio.rds.filter);
EEPROM.writeByte(EE_BYTE_RDS_PIERRORS, radio.rds.pierrors);
EEPROM.writeByte(EE_BYTE_USESQUELCH, usesquelch);
EEPROM.writeByte(EE_BYTE_SHOWMODULATION, showmodulation);
EEPROM.writeByte(EE_BYTE_AM_NB, amnb);
EEPROM.writeByte(EE_BYTE_FM_NB, fmnb);
EEPROM.writeByte(EE_BYTE_AUDIOMODE, audiomode);
EEPROM.writeByte(EE_BYTE_TOUCH_ROTATING, touchrotating);
EEPROM.writeUInt(EE_UINT16_LOWEDGEOIRTSET, LowEdgeOIRTSet);
EEPROM.writeUInt(EE_UINT16_HIGHEDGEOIRTSET, HighEdgeOIRTSet);
EEPROM.writeByte(EE_BYTE_HARDWARE_MODEL, hardwaremodel);
EEPROM.writeByte(EE_BYTE_POWEROPTIONS, poweroptions);
EEPROM.writeByte(EE_BYTE_CURRENTTHEME, CurrentTheme);
EEPROM.writeByte(EE_BYTE_FMDEFAULTSTEPSIZE, fmdefaultstepsize);
EEPROM.writeByte(EE_BYTE_SCREENSAVERSET, screensaverset);
EEPROM.writeInt(EE_INT16_AMLEVELOFFSET, AMLevelOffset);
EEPROM.writeByte(EE_BYTE_UNIT, unit);
EEPROM.writeByte(EE_BYTE_AF, af);
EEPROM.writeByte(EE_BYTE_STEREO, StereoToggle);
EEPROM.writeByte(EE_BYTE_BATTERY_OPTIONS, batteryoptions);
EEPROM.writeByte(EE_BYTE_AM_CO_DECT, amcodect);
EEPROM.writeByte(EE_BYTE_AM_CO_DECT_COUNT, amcodectcount);
EEPROM.writeByte(EE_BYTE_AM_RF_GAIN, amgain);
EEPROM.writeByte(EE_BYTE_SORTAF, radio.rds.sortaf);
EEPROM.writeByte(EE_BYTE_STATIONLISTID, stationlistid);
EEPROM.writeByte(EE_BYTE_FM_DEEMPHASIS, fmdeemphasis);
EEPROM.writeByte(EE_BYTE_FASTPS, radio.rds.fastps);
EEPROM.writeByte(EE_BYTE_TOT, tot);
EEPROM.writeByte(EE_BYTE_MWREGION, mwstepsize);
EEPROM.writeByte(EE_BYTE_SPISPEED, spispeed);
EEPROM.writeByte(EE_BYTE_AMSCANSENS, amscansens);
EEPROM.writeByte(EE_BYTE_FMSCANSENS, fmscansens);
EEPROM.writeByte(EE_BYTE_FREQFONT, freqfont);
EEPROM.writeByte(EE_BYTE_SKIN, CurrentSkin);
EEPROM.writeByte(EE_BYTE_XDRGTKMUTE, XDRGTKMuteScreen);
EEPROM.writeByte(EE_BYTE_FMAGC, fmagc);
EEPROM.writeByte(EE_BYTE_AMAGC, amagc);
EEPROM.writeByte(EE_BYTE_FMSI, fmsi);
EEPROM.writeByte(EE_BYTE_SCANSTART, scanstart);
EEPROM.writeByte(EE_BYTE_SCANSTOP, scanstop);
EEPROM.writeByte(EE_BYTE_SCANHOLD, scanhold);
EEPROM.writeByte(EE_BYTE_SCANMEM, scanmem);
EEPROM.writeByte(EE_BYTE_SCANCANCEL, scancancel);
EEPROM.writeByte(EE_BYTE_SCANMUTE, scanmute);
EEPROM.commit();
if (af == 2) radio.rds.afreg = true; else radio.rds.afreg = false;
if (!usesquelch) radio.setUnMute();
Serial.end();
if (wifi) remoteip = IPAddress (WiFi.localIP()[0], WiFi.localIP()[1], WiFi.localIP()[2], subnetclient);
if (USBmode) Serial.begin(19200); else Serial.begin(115200);
UpdateFonts(0);
FullLineSprite.unloadFont();
OneBigLineSprite.unloadFont();
BuildDisplay();
ShowSignalLevel();
ShowBW();
MWLowEdgeSet = mwstepsize == false ? FREQ_MW_LOW_EDGE_MIN_9K : FREQ_MW_LOW_EDGE_MIN_10K;
MWHighEdgeSet = mwstepsize == false ? FREQ_MW_HIGH_EDGE_MAX_9K : FREQ_MW_HIGH_EDGE_MAX_10K;
doBandSelectionFM();
doBandSelectionAM();
ScreensaverTimerSet(screensaverOptions[screensaverset]);
if (screensaverset) ScreensaverTimerRestart();
endMenu();
} else {
if (submenu) {
if (menuopen) {
@@ -2126,6 +2088,7 @@ void ModeButtonPress() {
}
}
}
}
while (digitalRead(MODEBUTTON) == LOW) delay(50);
delay(100);
}
@@ -2243,7 +2206,9 @@ void RoundStep() {
}
void ButtonPress() {
if (scandxmode) cancelDXScan();
if (scandxmode) {
cancelDXScan();
} else {
if (!usesquelch) radio.setUnMute();
if (advancedRDS) BuildDisplay();
if (!menu) {
@@ -2400,12 +2365,15 @@ void ButtonPress() {
} else {
DoMenu();
}
}
while (digitalRead(ROTARY_BUTTON) == LOW) delay(50);
}
void KeyUp() {
if (scandxmode) cancelDXScan();
rotary = 0;
if (scandxmode) {
cancelDXScan();
} else {
if (!afscreen) {
if (!menu) {
switch (tunemode) {
@@ -2465,11 +2433,14 @@ void KeyUp() {
MenuUp();
}
}
}
}
void KeyDown() {
if (scandxmode) cancelDXScan();
rotary = 0;
if (scandxmode) {
cancelDXScan();
} else {
if (!afscreen) {
if (!menu) {
switch (tunemode) {
@@ -2528,6 +2499,7 @@ void KeyDown() {
MenuDown();
}
}
}
}
bool IsStationEmpty() {
@@ -2540,7 +2512,7 @@ bool IsStationEmpty() {
bool IsFrequencyUsed(unsigned int freq) {
bool result = false;
for (byte x = scanstart; x <= scanstop; x++) {
if (presets[x].frequency == freq) {
if (presets[x].band == BAND_FM && presets[x].frequency == freq) {
result = true;
break;
}
@@ -2647,6 +2619,8 @@ void DoMemoryPosTune() {
}
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");
String stationText = "";
if (presets[memorypos].RDSPS[0] != '\0') {
@@ -3210,7 +3184,7 @@ void doSquelch() {
if (language == LANGUAGE_CHS) SquelchSprite.loadFont(FONT16_CHS); else SquelchSprite.loadFont(FONT16);
if (!XDRGTKUSB && !XDRGTKTCP && usesquelch) {
if (!XDRGTKUSB && !XDRGTKTCP && usesquelch && (!scandxmode || (scandxmode && !scanmute))) {
if (!screenmute && usesquelch && !advancedRDS && !afscreen) {
if (!menu && (Squelch > Squelchold + 2 || Squelch < Squelchold - 2)) {
SquelchSprite.setTextColor(PrimaryColor, PrimaryColorSmooth, false);
@@ -3238,7 +3212,7 @@ void doSquelch() {
}
}
if ((XDRGTKUSB || XDRGTKTCP)) {
if ((XDRGTKUSB || XDRGTKTCP) && (!scandxmode || (scandxmode && !scanmute))) {
if (!XDRMute) {
if (Squelch != -1) {
if (Squelch < SStatus || Squelch == -100 || Squelch == 0) {
@@ -3312,7 +3286,7 @@ void doSquelch() {
}
}
}
} else if (usesquelch) {
} else if (usesquelch && (!scandxmode || (scandxmode && !scanmute))) {
if (Squelch != 920) {
if (Squelch < SStatus || Squelch == -100 || Squelch == 0) {
if (!seek) radio.setUnMute();
@@ -3835,6 +3809,12 @@ void TuneUp() {
if (band == BAND_FM) {
frequency += temp;
if (scandxmode) {
while (IsFrequencyUsed(frequency)) {
frequency += temp;
}
}
if (fmdefaultstepsize == 2 && stepsize == 0 && frequency == 8795) frequency = 8790;
if (frequency >= (HighEdgeSet * 10) + 1) {
frequency = LowEdgeSet * 10;
@@ -4333,3 +4313,124 @@ void cancelDXScan() {
ShowTuneMode();
ShowMemoryPos();
}
void endMenu() {
radio.clearRDS(fullsearchrds);
menu = false;
menuopen = false;
LowLevelInit = true;
EEPROM.writeByte(EE_BYTE_VOLSET, VolSet);
EEPROM.writeUInt(EE_UINT16_CONVERTERSET, ConverterSet);
EEPROM.writeUInt(EE_UINT16_FMLOWEDGESET, LowEdgeSet);
EEPROM.writeUInt(EE_UINT16_FMHIGHEDGESET, HighEdgeSet);
EEPROM.writeByte(EE_BYTE_CONTRASTSET, ContrastSet);
EEPROM.writeByte(EE_BYTE_STEREOLEVEL, StereoLevel);
EEPROM.writeByte(EE_BYTE_BANDFM, bandFM);
EEPROM.writeByte(EE_BYTE_BANDAM, bandAM);
EEPROM.writeByte(EE_BYTE_HIGHCUTLEVEL, HighCutLevel);
EEPROM.writeByte(EE_BYTE_HIGHCUTOFFSET, HighCutOffset);
EEPROM.writeByte(EE_BYTE_LEVELOFFSET, LevelOffset);
EEPROM.writeByte(EE_BYTE_RTBUFFER, radio.rds.rtbuffer);
EEPROM.writeByte(EE_BYTE_EDGEBEEP, edgebeep);
EEPROM.writeByte(EE_BYTE_SOFTMUTEAM, softmuteam);
EEPROM.writeByte(EE_BYTE_SOFTMUTEFM, softmutefm);
EEPROM.writeByte(EE_BYTE_LANGUAGE, language);
EEPROM.writeByte(EE_BYTE_SHOWRDSERRORS, showrdserrors);
EEPROM.writeByte(EE_BYTE_LOWLEVELSET, LowLevelSet);
EEPROM.writeByte(EE_BYTE_REGION, region);
EEPROM.writeByte(EE_BYTE_RDS_UNDERSCORE, radio.underscore);
EEPROM.writeByte(EE_BYTE_USBMODE, USBmode);
EEPROM.writeByte(EE_BYTE_WIFI, wifi);
EEPROM.writeByte(EE_BYTE_SUBNETCLIENT, subnetclient);
EEPROM.writeByte(EE_BYTE_SHOWSWMIBAND, showSWMIBand);
EEPROM.writeByte(EE_BYTE_RDS_FILTER, radio.rds.filter);
EEPROM.writeByte(EE_BYTE_RDS_PIERRORS, radio.rds.pierrors);
EEPROM.writeByte(EE_BYTE_USESQUELCH, usesquelch);
EEPROM.writeByte(EE_BYTE_SHOWMODULATION, showmodulation);
EEPROM.writeByte(EE_BYTE_AM_NB, amnb);
EEPROM.writeByte(EE_BYTE_FM_NB, fmnb);
EEPROM.writeByte(EE_BYTE_AUDIOMODE, audiomode);
EEPROM.writeByte(EE_BYTE_TOUCH_ROTATING, touchrotating);
EEPROM.writeUInt(EE_UINT16_LOWEDGEOIRTSET, LowEdgeOIRTSet);
EEPROM.writeUInt(EE_UINT16_HIGHEDGEOIRTSET, HighEdgeOIRTSet);
EEPROM.writeByte(EE_BYTE_HARDWARE_MODEL, hardwaremodel);
EEPROM.writeByte(EE_BYTE_POWEROPTIONS, poweroptions);
EEPROM.writeByte(EE_BYTE_CURRENTTHEME, CurrentTheme);
EEPROM.writeByte(EE_BYTE_FMDEFAULTSTEPSIZE, fmdefaultstepsize);
EEPROM.writeByte(EE_BYTE_SCREENSAVERSET, screensaverset);
EEPROM.writeInt(EE_INT16_AMLEVELOFFSET, AMLevelOffset);
EEPROM.writeByte(EE_BYTE_UNIT, unit);
EEPROM.writeByte(EE_BYTE_AF, af);
EEPROM.writeByte(EE_BYTE_STEREO, StereoToggle);
EEPROM.writeByte(EE_BYTE_BATTERY_OPTIONS, batteryoptions);
EEPROM.writeByte(EE_BYTE_AM_CO_DECT, amcodect);
EEPROM.writeByte(EE_BYTE_AM_CO_DECT_COUNT, amcodectcount);
EEPROM.writeByte(EE_BYTE_AM_RF_GAIN, amgain);
EEPROM.writeByte(EE_BYTE_SORTAF, radio.rds.sortaf);
EEPROM.writeByte(EE_BYTE_STATIONLISTID, stationlistid);
EEPROM.writeByte(EE_BYTE_FM_DEEMPHASIS, fmdeemphasis);
EEPROM.writeByte(EE_BYTE_FASTPS, radio.rds.fastps);
EEPROM.writeByte(EE_BYTE_TOT, tot);
EEPROM.writeByte(EE_BYTE_MWREGION, mwstepsize);
EEPROM.writeByte(EE_BYTE_SPISPEED, spispeed);
EEPROM.writeByte(EE_BYTE_AMSCANSENS, amscansens);
EEPROM.writeByte(EE_BYTE_FMSCANSENS, fmscansens);
EEPROM.writeByte(EE_BYTE_FREQFONT, freqfont);
EEPROM.writeByte(EE_BYTE_SKIN, CurrentSkin);
EEPROM.writeByte(EE_BYTE_XDRGTKMUTE, XDRGTKMuteScreen);
EEPROM.writeByte(EE_BYTE_FMAGC, fmagc);
EEPROM.writeByte(EE_BYTE_AMAGC, amagc);
EEPROM.writeByte(EE_BYTE_FMSI, fmsi);
EEPROM.writeByte(EE_BYTE_SCANSTART, scanstart);
EEPROM.writeByte(EE_BYTE_SCANSTOP, scanstop);
EEPROM.writeByte(EE_BYTE_SCANHOLD, scanhold);
EEPROM.writeByte(EE_BYTE_SCANMEM, scanmem);
EEPROM.writeByte(EE_BYTE_SCANCANCEL, scancancel);
EEPROM.writeByte(EE_BYTE_SCANMUTE, scanmute);
EEPROM.commit();
if (af == 2) radio.rds.afreg = true; else radio.rds.afreg = false;
Serial.end();
if (wifi) remoteip = IPAddress (WiFi.localIP()[0], WiFi.localIP()[1], WiFi.localIP()[2], subnetclient);
if (USBmode) Serial.begin(19200); else Serial.begin(115200);
UpdateFonts(0);
FullLineSprite.unloadFont();
OneBigLineSprite.unloadFont();
BuildDisplay();
}
void startFMDXScan() {
memorypos = scanstart;
scanmodeold = tunemode;
if (scanmem) {
tunemode = TUNE_MEM;
if (band != BAND_FM) {
band = BAND_FM;
SelectBand();
}
endMenu();
DoMemoryPosTune();
} else {
tunemode = TUNE_MAN;
if (band != BAND_FM) {
band = BAND_FM;
SelectBand();
endMenu();
}
endMenu();
TuneUp();
ShowFreq(0);
}
if (scanmute) {
radio.setMute();
if (CurrentSkin == 1) {
tft.pushImage (106, 3, 27, 23, skin1_muteon);
} else {
tft.drawBitmap(92, 4, Speaker, 26, 22, PrimaryColor);
}
SQ = true;
Squelchold = -2;
}
scantimer = millis();
scandxmode = true;
}
+1 -9
View File
@@ -4185,15 +4185,7 @@ void DoMenu() {
Infoboxprint(myLanguage[language][214]);
OneBigLineSprite.pushSprite(24, 118);
} else {
menuopen = false;
menu = false;
memorypos = scanstart;
scanmodeold = tunemode;
tunemode = TUNE_MEM;
BuildDisplay();
DoMemoryPosTune();
scantimer = millis();
scandxmode = true;
startFMDXScan();
}
break;
+3
View File
@@ -224,6 +224,9 @@ extern void updateiMS();
extern void updateEQ();
extern void doTheme();
extern void tryWiFi();
extern void TuneUp();
extern void endMenu();
extern void startFMDXScan();
extern void DoMemoryPosTune();
extern void UpdateFonts(bool mode);
extern void tftPrint(int8_t offset, const String & text, int16_t x, int16_t y, int color, int smoothcolor, uint8_t fontsize);