You've already forked TEF6686_ESP32
Fix on PS and factory reset
First PS was erased when 8 chars was reached. Not all stations use 8 char PS. Changed the routine. First 8 RDS decoding runs after a tune command PS is written dirty, to have it DX-fast. After that, PS will be written when offset reaches 0. Also added factory reset. Hold BW+STEP pressed during boot.
This commit is contained in:
@@ -228,55 +228,7 @@ WiFiUDP Udp;
|
|||||||
void setup() {
|
void setup() {
|
||||||
setupmode = true;
|
setupmode = true;
|
||||||
EEPROM.begin(248);
|
EEPROM.begin(248);
|
||||||
if (EEPROM.readByte(43) != 27) {
|
if (EEPROM.readByte(43) != 27) DefaultSettings();
|
||||||
EEPROM.writeByte(43, 27);
|
|
||||||
EEPROM.writeUInt(0, 10000);
|
|
||||||
EEPROM.writeInt(4, 0);
|
|
||||||
EEPROM.writeUInt(8, 0);
|
|
||||||
EEPROM.writeUInt(12, 875);
|
|
||||||
EEPROM.writeUInt(16, 1080);
|
|
||||||
EEPROM.writeByte(20, 50);
|
|
||||||
EEPROM.writeByte(21, 0);
|
|
||||||
EEPROM.writeByte(22, 70);
|
|
||||||
EEPROM.writeByte(23, 0);
|
|
||||||
EEPROM.writeInt(24, 0);
|
|
||||||
EEPROM.writeByte(28, 0);
|
|
||||||
EEPROM.writeByte(29, 0);
|
|
||||||
EEPROM.writeByte(30, 0);
|
|
||||||
EEPROM.writeUInt(31, 828);
|
|
||||||
EEPROM.writeByte(35, 0);
|
|
||||||
EEPROM.writeByte(36, 1);
|
|
||||||
EEPROM.writeByte(37, 0);
|
|
||||||
EEPROM.writeByte(38, 0);
|
|
||||||
EEPROM.writeByte(39, 0);
|
|
||||||
EEPROM.writeByte(40, 0);
|
|
||||||
EEPROM.writeByte(41, 0);
|
|
||||||
EEPROM.writeByte(42, 0);
|
|
||||||
EEPROM.writeByte(44, 1);
|
|
||||||
EEPROM.writeByte(45, 1);
|
|
||||||
EEPROM.writeByte(46, 0);
|
|
||||||
EEPROM.writeInt(47, -10);
|
|
||||||
EEPROM.writeByte(51, 0);
|
|
||||||
EEPROM.writeByte(52, 0);
|
|
||||||
EEPROM.writeByte(53, 0);
|
|
||||||
EEPROM.writeByte(54, 0);
|
|
||||||
EEPROM.writeByte(55, 0);
|
|
||||||
EEPROM.writeByte(56, 1);
|
|
||||||
EEPROM.writeByte(57, 1);
|
|
||||||
EEPROM.writeByte(58, 1);
|
|
||||||
EEPROM.writeByte(59, 0);
|
|
||||||
for (int i = 0; i < 30; i++) EEPROM.writeByte(i + 60, 0);
|
|
||||||
for (int i = 0; i < 30; i++) EEPROM.writeUInt((i * 4) + 100, 8750);
|
|
||||||
EEPROM.writeUInt(221, 180);
|
|
||||||
EEPROM.writeUInt(225, 540);
|
|
||||||
EEPROM.writeUInt(229, 1800);
|
|
||||||
EEPROM.writeString(233, "password");
|
|
||||||
EEPROM.writeByte(244, 1);
|
|
||||||
EEPROM.writeByte(245, 1);
|
|
||||||
EEPROM.writeByte(246, 0);
|
|
||||||
EEPROM.writeByte(247, 0);
|
|
||||||
EEPROM.commit();
|
|
||||||
}
|
|
||||||
|
|
||||||
frequency = EEPROM.readUInt(0);
|
frequency = EEPROM.readUInt(0);
|
||||||
VolSet = EEPROM.readInt(4);
|
VolSet = EEPROM.readInt(4);
|
||||||
@@ -394,7 +346,7 @@ void setup() {
|
|||||||
attachInterrupt(digitalPinToInterrupt(ROTARY_PIN_A), read_encoder, CHANGE);
|
attachInterrupt(digitalPinToInterrupt(ROTARY_PIN_A), read_encoder, CHANGE);
|
||||||
attachInterrupt(digitalPinToInterrupt(ROTARY_PIN_B), read_encoder, CHANGE);
|
attachInterrupt(digitalPinToInterrupt(ROTARY_PIN_B), read_encoder, CHANGE);
|
||||||
|
|
||||||
if (digitalRead(BWBUTTON) == LOW) {
|
if (digitalRead(BWBUTTON) == LOW && digitalRead(ROTARY_BUTTON) == HIGH) {
|
||||||
if (rotarymode == 0) rotarymode = 1; else rotarymode = 0;
|
if (rotarymode == 0) rotarymode = 1; else rotarymode = 0;
|
||||||
EEPROM.writeByte(39, rotarymode);
|
EEPROM.writeByte(39, rotarymode);
|
||||||
EEPROM.commit();
|
EEPROM.commit();
|
||||||
@@ -435,7 +387,7 @@ void setup() {
|
|||||||
analogWrite(SMETERPIN, 0);
|
analogWrite(SMETERPIN, 0);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (digitalRead(ROTARY_BUTTON) == LOW) {
|
if (digitalRead(ROTARY_BUTTON) == LOW && digitalRead(BWBUTTON) == HIGH) {
|
||||||
tft.setFreeFont(FONT14);
|
tft.setFreeFont(FONT14);
|
||||||
tft.fillScreen(TFT_BLACK);
|
tft.fillScreen(TFT_BLACK);
|
||||||
tft.setTextColor(TFT_WHITE);
|
tft.setTextColor(TFT_WHITE);
|
||||||
@@ -452,6 +404,17 @@ void setup() {
|
|||||||
while (digitalRead(ROTARY_BUTTON) == LOW) delay(50);
|
while (digitalRead(ROTARY_BUTTON) == LOW) delay(50);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (digitalRead(ROTARY_BUTTON) == LOW && digitalRead(BWBUTTON) == LOW) {
|
||||||
|
tft.setFreeFont(FONT14);
|
||||||
|
tft.fillScreen(TFT_BLACK);
|
||||||
|
tft.setTextColor(TFT_WHITE);
|
||||||
|
DefaultSettings();
|
||||||
|
tft.drawCentreString(myLanguage[language][66], 155, 77, GFXFF);
|
||||||
|
tft.drawCentreString(myLanguage[language][2], 150, 107, GFXFF);
|
||||||
|
while (digitalRead(ROTARY_BUTTON) == LOW && digitalRead(BWBUTTON) == LOW) delay(50);
|
||||||
|
ESP.restart();
|
||||||
|
}
|
||||||
|
|
||||||
tft.setSwapBytes(true);
|
tft.setSwapBytes(true);
|
||||||
tft.fillScreen(TFT_BLACK);
|
tft.fillScreen(TFT_BLACK);
|
||||||
tft.pushImage (0, 99, 211, 140, pe5pvblogo);
|
tft.pushImage (0, 99, 211, 140, pe5pvblogo);
|
||||||
@@ -4477,3 +4440,53 @@ void passwordcrypt() {
|
|||||||
salt = saltkey + XDRGTK_key;
|
salt = saltkey + XDRGTK_key;
|
||||||
cryptedpassword = String(sha1(salt));
|
cryptedpassword = String(sha1(salt));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void DefaultSettings() {
|
||||||
|
EEPROM.writeByte(43, 27);
|
||||||
|
EEPROM.writeUInt(0, 10000);
|
||||||
|
EEPROM.writeInt(4, 0);
|
||||||
|
EEPROM.writeUInt(8, 0);
|
||||||
|
EEPROM.writeUInt(12, 875);
|
||||||
|
EEPROM.writeUInt(16, 1080);
|
||||||
|
EEPROM.writeByte(20, 50);
|
||||||
|
EEPROM.writeByte(21, 0);
|
||||||
|
EEPROM.writeByte(22, 70);
|
||||||
|
EEPROM.writeByte(23, 0);
|
||||||
|
EEPROM.writeInt(24, 0);
|
||||||
|
EEPROM.writeByte(28, 0);
|
||||||
|
EEPROM.writeByte(29, 0);
|
||||||
|
EEPROM.writeByte(30, 0);
|
||||||
|
EEPROM.writeUInt(31, 828);
|
||||||
|
EEPROM.writeByte(35, 0);
|
||||||
|
EEPROM.writeByte(36, 1);
|
||||||
|
EEPROM.writeByte(37, 0);
|
||||||
|
EEPROM.writeByte(38, 0);
|
||||||
|
EEPROM.writeByte(39, 0);
|
||||||
|
EEPROM.writeByte(40, 0);
|
||||||
|
EEPROM.writeByte(41, 0);
|
||||||
|
EEPROM.writeByte(42, 0);
|
||||||
|
EEPROM.writeByte(44, 1);
|
||||||
|
EEPROM.writeByte(45, 1);
|
||||||
|
EEPROM.writeByte(46, 0);
|
||||||
|
EEPROM.writeInt(47, -10);
|
||||||
|
EEPROM.writeByte(51, 0);
|
||||||
|
EEPROM.writeByte(52, 0);
|
||||||
|
EEPROM.writeByte(53, 0);
|
||||||
|
EEPROM.writeByte(54, 0);
|
||||||
|
EEPROM.writeByte(55, 0);
|
||||||
|
EEPROM.writeByte(56, 1);
|
||||||
|
EEPROM.writeByte(57, 1);
|
||||||
|
EEPROM.writeByte(58, 1);
|
||||||
|
EEPROM.writeByte(59, 0);
|
||||||
|
for (int i = 0; i < 30; i++) EEPROM.writeByte(i + 60, 0);
|
||||||
|
for (int i = 0; i < 30; i++) EEPROM.writeUInt((i * 4) + 100, 8750);
|
||||||
|
EEPROM.writeUInt(221, 180);
|
||||||
|
EEPROM.writeUInt(225, 540);
|
||||||
|
EEPROM.writeUInt(229, 1800);
|
||||||
|
EEPROM.writeString(233, "password");
|
||||||
|
EEPROM.writeByte(244, 1);
|
||||||
|
EEPROM.writeByte(245, 1);
|
||||||
|
EEPROM.writeByte(246, 0);
|
||||||
|
EEPROM.writeByte(247, 0);
|
||||||
|
EEPROM.commit();
|
||||||
|
}
|
||||||
|
|||||||
@@ -265,13 +265,13 @@ void TEF6686::readRDS(bool showrdserrors)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!rds.correct) rds.picode[4] = '?'; else rds.picode[4] = ' '; // Not sure, add a ?
|
if (!rds.correct) rds.picode[4] = '?'; else rds.picode[4] = ' '; // Not sure, add a ?
|
||||||
rds.picode[5] = '\0';
|
rds.picode[5] = '\0';
|
||||||
correctpi = rds.correct;
|
correctpi = rds.correct;
|
||||||
if (strcmp(rds.picode, "0000?") == 0) {
|
if (strcmp(rds.picode, "0000?") == 0) {
|
||||||
memset(rds.picode, 0, sizeof(rds.picode));
|
memset(rds.picode, 0, sizeof(rds.picode));
|
||||||
correctpi = rds.correct;
|
correctpi = rds.correct;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// USA Station callsign decoder
|
// USA Station callsign decoder
|
||||||
@@ -311,24 +311,27 @@ void TEF6686::readRDS(bool showrdserrors)
|
|||||||
case RDS_GROUP_0A:
|
case RDS_GROUP_0A:
|
||||||
case RDS_GROUP_0B: {
|
case RDS_GROUP_0B: {
|
||||||
|
|
||||||
|
//PS decoder
|
||||||
if (showrdserrors || rds.correct) {
|
if (showrdserrors || rds.correct) {
|
||||||
//PS decoder
|
offset = rds.rdsB & 0x03; // Let's get the character offset for PS
|
||||||
offset = rds.rdsB & 0x03; // Get PI character segment
|
|
||||||
ps_buffer[(offset * 2) + 0] = rds.rdsD >> 8; // First character of segment
|
|
||||||
ps_buffer[(offset * 2) + 1] = rds.rdsD & 0xFF; // Second character of segment
|
|
||||||
ps_buffer[(offset * 2) + 2] = '\0'; // Endmarker of segment
|
|
||||||
|
|
||||||
if (!ps_process) { // After new tune just fill the characters received
|
if (ps_process == true && offset == 0) { // Activates every time character offset is at 0, so whole message is received
|
||||||
RDScharConverter(ps_buffer, PStext, sizeof(PStext) / sizeof(wchar_t)); // Convert 8 bit ASCII to 16 bit ASCII
|
|
||||||
String utf8String = convertToUTF8(PStext); // Convert RDS characterset to ASCII
|
|
||||||
rds.stationName = utf8String.substring(0, 8); // Make sure PS does not exceed 8 characters
|
|
||||||
}
|
|
||||||
if (strlen(ps_buffer) == 8) { // Becomes active after a full 8 character PS has been decoded
|
|
||||||
for (byte i = 0; i < 9; i++) PStext[i] = L'\0'; // First erase buffer
|
for (byte i = 0; i < 9; i++) PStext[i] = L'\0'; // First erase buffer
|
||||||
RDScharConverter(ps_buffer, PStext, sizeof(PStext) / sizeof(wchar_t)); // Convert 8 bit ASCII to 16 bit ASCII
|
RDScharConverter(ps_buffer, PStext, sizeof(PStext) / sizeof(wchar_t)); // Convert 8 bit ASCII to 16 bit ASCII
|
||||||
String utf8String = convertToUTF8(PStext); // Convert RDS characterset to ASCII
|
String utf8String = convertToUTF8(PStext); // Convert RDS characterset to ASCII
|
||||||
rds.stationName = utf8String.substring(0, 8); // Make sure PS does not exceed 8 characters
|
rds.stationName = utf8String.substring(0, 8); // Make sure PS does not exceed 8 characters
|
||||||
ps_process = true;
|
}
|
||||||
|
|
||||||
|
ps_buffer[(offset * 2) + 0] = rds.rdsD >> 8; // First character of segment
|
||||||
|
ps_buffer[(offset * 2) + 1] = rds.rdsD & 0xFF; // Second character of segment
|
||||||
|
ps_buffer[(offset * 2) + 2] = '\0'; // Endmarker of segment
|
||||||
|
|
||||||
|
if (ps_process == false) { // Let's get 2 runs of 8 PS characters fast and without refresh
|
||||||
|
ps_counter ++; // Let's count each run
|
||||||
|
RDScharConverter(ps_buffer, PStext, sizeof(PStext) / sizeof(wchar_t)); // Convert 8 bit ASCII to 16 bit ASCII
|
||||||
|
String utf8String = convertToUTF8(PStext); // Convert RDS characterset to ASCII
|
||||||
|
rds.stationName = utf8String.substring(0, 8); // Make sure PS does not exceed 8 characters
|
||||||
|
if (ps_counter == 8) ps_process = true; // OK, we had 8 runs, now let's go the idle PS writing
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -340,10 +343,10 @@ void TEF6686::readRDS(bool showrdserrors)
|
|||||||
}
|
}
|
||||||
|
|
||||||
//TA decoder
|
//TA decoder
|
||||||
rds.hasTA = (bitRead(rds.rdsB, 4)) && (bitRead(rds.rdsB, 10)) & 0x1F;
|
rds.hasTA = (bitRead(rds.rdsB, 4)) && (bitRead(rds.rdsB, 10)) & 0x1F; // Read TA flag
|
||||||
|
|
||||||
//MS decoder
|
//MS decoder
|
||||||
if (((bitRead(rds.rdsB, 3)) & 0x1F) == 1) rds.MS = 1; else rds.MS = 2;
|
if (((bitRead(rds.rdsB, 3)) & 0x1F) == 1) rds.MS = 1; else rds.MS = 2; // Read MS flag
|
||||||
|
|
||||||
//AF decoder
|
//AF decoder
|
||||||
uint8_t af_controlCode = rds.rdsC >> 8;
|
uint8_t af_controlCode = rds.rdsC >> 8;
|
||||||
@@ -476,14 +479,15 @@ void TEF6686::clearRDS (bool fullsearchrds)
|
|||||||
rds.hasTP = false;
|
rds.hasTP = false;
|
||||||
rds.hasTA = false;
|
rds.hasTA = false;
|
||||||
rds.hasEON = false;
|
rds.hasEON = false;
|
||||||
rds.MS = 0;
|
|
||||||
rds.hasCT = false;
|
rds.hasCT = false;
|
||||||
rds.correct = false;
|
rds.correct = false;
|
||||||
rt_process = false;
|
rt_process = false;
|
||||||
ps_process = false;
|
ps_process = false;
|
||||||
af_counter = 0;
|
|
||||||
rds.rdsreset = true;
|
rds.rdsreset = true;
|
||||||
correctpi = false;
|
correctpi = false;
|
||||||
|
ps_counter = 0;
|
||||||
|
af_counter = 0;
|
||||||
|
rds.MS = 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
void TEF6686::tone(uint16_t time, int16_t amplitude, uint16_t frequency) {
|
void TEF6686::tone(uint16_t time, int16_t amplitude, uint16_t frequency) {
|
||||||
|
|||||||
@@ -268,5 +268,6 @@ class TEF6686 {
|
|||||||
uint16_t rdsDprevious;
|
uint16_t rdsDprevious;
|
||||||
bool correctpi;
|
bool correctpi;
|
||||||
bool rtABold;
|
bool rtABold;
|
||||||
wchar_t PStext[9] = L"";
|
wchar_t PStext[9] = L"";
|
||||||
|
byte ps_counter;
|
||||||
};
|
};
|
||||||
@@ -1,6 +1,6 @@
|
|||||||
// [number of languages][number of texts][max. length of text]
|
// [number of languages][number of texts][max. length of text]
|
||||||
|
|
||||||
static const char myLanguage[9][66][78] = {
|
static const char myLanguage[9][67][78] = {
|
||||||
{ "English", // English
|
{ "English", // English
|
||||||
"Rotary direction changed",
|
"Rotary direction changed",
|
||||||
"Please release button",
|
"Please release button",
|
||||||
@@ -63,10 +63,11 @@ static const char myLanguage[9][66][78] = {
|
|||||||
"Show SW wavelength",
|
"Show SW wavelength",
|
||||||
"RDS filter",
|
"RDS filter",
|
||||||
"Dynamic PI",
|
"Dynamic PI",
|
||||||
"Show squelch",
|
"Show squelch",
|
||||||
"Modulation meter",
|
"Modulation meter",
|
||||||
"AM Noise blanker",
|
"AM Noise blanker",
|
||||||
"FM Noise blanker"
|
"FM Noise blanker",
|
||||||
|
"Defaults loaded"
|
||||||
},
|
},
|
||||||
|
|
||||||
{ "Nederlands", // Dutch
|
{ "Nederlands", // Dutch
|
||||||
@@ -131,10 +132,11 @@ static const char myLanguage[9][66][78] = {
|
|||||||
"Toon SW golflengte",
|
"Toon SW golflengte",
|
||||||
"RDS filter",
|
"RDS filter",
|
||||||
"Dynamische PI",
|
"Dynamische PI",
|
||||||
"Toon squelch",
|
"Toon squelch",
|
||||||
"Modulatie meter",
|
"Modulatie meter",
|
||||||
"AM ruis filter",
|
"AM ruis filter",
|
||||||
"FM ruis filter"
|
"FM ruis filter",
|
||||||
|
"Opnieuw geconfigureerd"
|
||||||
},
|
},
|
||||||
|
|
||||||
{ "Polski", // Polish
|
{ "Polski", // Polish
|
||||||
@@ -199,10 +201,11 @@ static const char myLanguage[9][66][78] = {
|
|||||||
"Pokaz dlugosci fal SW",
|
"Pokaz dlugosci fal SW",
|
||||||
"RDS filter",
|
"RDS filter",
|
||||||
"Dynamic PI",
|
"Dynamic PI",
|
||||||
"Show squelch",
|
"Show squelch",
|
||||||
"Modulation meter",
|
"Modulation meter",
|
||||||
"AM Noise blanker",
|
"AM Noise blanker",
|
||||||
"FM Noise blanker"
|
"FM Noise blanker",
|
||||||
|
"Defaults loaded"
|
||||||
},
|
},
|
||||||
|
|
||||||
{ "Hrvatski", // Croatian
|
{ "Hrvatski", // Croatian
|
||||||
@@ -270,7 +273,8 @@ static const char myLanguage[9][66][78] = {
|
|||||||
"Prikaži squelch",
|
"Prikaži squelch",
|
||||||
"Mjerač modulacije",
|
"Mjerač modulacije",
|
||||||
"AM prigušivač šuma",
|
"AM prigušivač šuma",
|
||||||
"FM prigušivač šuma"
|
"FM prigušivač šuma",
|
||||||
|
"Defaults loaded"
|
||||||
},
|
},
|
||||||
|
|
||||||
{ "Ελληνικά", // Greek
|
{ "Ελληνικά", // Greek
|
||||||
@@ -335,10 +339,11 @@ static const char myLanguage[9][66][78] = {
|
|||||||
"Show SW wavelength",
|
"Show SW wavelength",
|
||||||
"RDS filter",
|
"RDS filter",
|
||||||
"Dynamic PI",
|
"Dynamic PI",
|
||||||
"Show squelch",
|
"Show squelch",
|
||||||
"Modulation meter",
|
"Modulation meter",
|
||||||
"AM Noise blanker",
|
"AM Noise blanker",
|
||||||
"FM Noise blanker"
|
"FM Noise blanker",
|
||||||
|
"Defaults loaded"
|
||||||
},
|
},
|
||||||
|
|
||||||
{ "Romana", // Romanian
|
{ "Romana", // Romanian
|
||||||
@@ -403,10 +408,11 @@ static const char myLanguage[9][66][78] = {
|
|||||||
"Show SW wavelength",
|
"Show SW wavelength",
|
||||||
"RDS filter",
|
"RDS filter",
|
||||||
"Dynamic PI",
|
"Dynamic PI",
|
||||||
"Show squelch",
|
"Show squelch",
|
||||||
"Modulation meter",
|
"Modulation meter",
|
||||||
"AM Noise blanker",
|
"AM Noise blanker",
|
||||||
"FM Noise blanker"
|
"FM Noise blanker",
|
||||||
|
"Defaults loaded"
|
||||||
},
|
},
|
||||||
|
|
||||||
{ "Deutsch", // German
|
{ "Deutsch", // German
|
||||||
@@ -471,10 +477,11 @@ static const char myLanguage[9][66][78] = {
|
|||||||
"Show SW wavelength",
|
"Show SW wavelength",
|
||||||
"RDS filter",
|
"RDS filter",
|
||||||
"Dynamic PI",
|
"Dynamic PI",
|
||||||
"Show squelch",
|
"Show squelch",
|
||||||
"Modulation meter",
|
"Modulation meter",
|
||||||
"AM Noise blanker",
|
"AM Noise blanker",
|
||||||
"FM Noise blanker"
|
"FM Noise blanker",
|
||||||
|
"Defaults loaded"
|
||||||
},
|
},
|
||||||
{ "Czech", // Czech
|
{ "Czech", // Czech
|
||||||
"Směr enkóderu byl změněn",
|
"Směr enkóderu byl změněn",
|
||||||
@@ -538,10 +545,11 @@ static const char myLanguage[9][66][78] = {
|
|||||||
"Show SW wavelength",
|
"Show SW wavelength",
|
||||||
"RDS filter",
|
"RDS filter",
|
||||||
"Dynamic PI",
|
"Dynamic PI",
|
||||||
"Show squelch",
|
"Show squelch",
|
||||||
"Modulation meter",
|
"Modulation meter",
|
||||||
"AM Noise blanker",
|
"AM Noise blanker",
|
||||||
"FM Noise blanker"
|
"FM Noise blanker",
|
||||||
|
"Defaults loaded"
|
||||||
},
|
},
|
||||||
{ "Slovak", // Slovak
|
{ "Slovak", // Slovak
|
||||||
"Smer enkóderu bol zmenený",
|
"Smer enkóderu bol zmenený",
|
||||||
@@ -605,9 +613,10 @@ static const char myLanguage[9][66][78] = {
|
|||||||
"Show SW wavelength",
|
"Show SW wavelength",
|
||||||
"RDS filter",
|
"RDS filter",
|
||||||
"Dynamic PI",
|
"Dynamic PI",
|
||||||
"Show squelch",
|
"Show squelch",
|
||||||
"Modulation meter",
|
"Modulation meter",
|
||||||
"AM Noise blanker",
|
"AM Noise blanker",
|
||||||
"FM Noise blanker"
|
"FM Noise blanker",
|
||||||
|
"Defaults loaded"
|
||||||
},
|
},
|
||||||
};
|
};
|
||||||
|
|||||||
Reference in New Issue
Block a user