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:
Sjef Verhoeven PE5PVB
2023-06-20 20:08:51 +02:00
parent f2c04db051
commit 6bd9948d97
4 changed files with 134 additions and 107 deletions

View File

@@ -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();
}

View File

@@ -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) {

View File

@@ -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;
}; };

View File

@@ -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"
}, },
}; };