diff --git a/TEF6686_ESP32.ino b/TEF6686_ESP32.ino index 2a63a73..c87524b 100644 --- a/TEF6686_ESP32.ino +++ b/TEF6686_ESP32.ino @@ -228,55 +228,7 @@ WiFiUDP Udp; void setup() { setupmode = true; EEPROM.begin(248); - if (EEPROM.readByte(43) != 27) { - 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(); - } + if (EEPROM.readByte(43) != 27) DefaultSettings(); frequency = EEPROM.readUInt(0); VolSet = EEPROM.readInt(4); @@ -394,7 +346,7 @@ void setup() { attachInterrupt(digitalPinToInterrupt(ROTARY_PIN_A), 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; EEPROM.writeByte(39, rotarymode); EEPROM.commit(); @@ -435,7 +387,7 @@ void setup() { analogWrite(SMETERPIN, 0); } - if (digitalRead(ROTARY_BUTTON) == LOW) { + if (digitalRead(ROTARY_BUTTON) == LOW && digitalRead(BWBUTTON) == HIGH) { tft.setFreeFont(FONT14); tft.fillScreen(TFT_BLACK); tft.setTextColor(TFT_WHITE); @@ -452,6 +404,17 @@ void setup() { 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.fillScreen(TFT_BLACK); tft.pushImage (0, 99, 211, 140, pe5pvblogo); @@ -4477,3 +4440,53 @@ void passwordcrypt() { salt = saltkey + XDRGTK_key; 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(); +} diff --git a/src/TEF6686.cpp b/src/TEF6686.cpp index 870ca4d..0e0e6f8 100644 --- a/src/TEF6686.cpp +++ b/src/TEF6686.cpp @@ -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'; correctpi = rds.correct; - if (strcmp(rds.picode, "0000?") == 0) { - memset(rds.picode, 0, sizeof(rds.picode)); - correctpi = rds.correct; - } + if (strcmp(rds.picode, "0000?") == 0) { + memset(rds.picode, 0, sizeof(rds.picode)); + correctpi = rds.correct; + } } // USA Station callsign decoder @@ -311,24 +311,27 @@ void TEF6686::readRDS(bool showrdserrors) case RDS_GROUP_0A: case RDS_GROUP_0B: { + //PS decoder if (showrdserrors || rds.correct) { - //PS decoder - 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 + offset = rds.rdsB & 0x03; // Let's get the character offset for PS - if (!ps_process) { // After new tune just fill the characters 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 + if (ps_process == true && offset == 0) { // Activates every time character offset is at 0, so whole message is received 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 String utf8String = convertToUTF8(PStext); // Convert RDS characterset to ASCII 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 - 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 - 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 uint8_t af_controlCode = rds.rdsC >> 8; @@ -476,14 +479,15 @@ void TEF6686::clearRDS (bool fullsearchrds) rds.hasTP = false; rds.hasTA = false; rds.hasEON = false; - rds.MS = 0; rds.hasCT = false; rds.correct = false; rt_process = false; ps_process = false; - af_counter = 0; rds.rdsreset = true; correctpi = false; + ps_counter = 0; + af_counter = 0; + rds.MS = 0; } void TEF6686::tone(uint16_t time, int16_t amplitude, uint16_t frequency) { diff --git a/src/TEF6686.h b/src/TEF6686.h index 0f86229..19aa9cc 100644 --- a/src/TEF6686.h +++ b/src/TEF6686.h @@ -268,5 +268,6 @@ class TEF6686 { uint16_t rdsDprevious; bool correctpi; bool rtABold; - wchar_t PStext[9] = L""; + wchar_t PStext[9] = L""; + byte ps_counter; }; \ No newline at end of file diff --git a/src/language.h b/src/language.h index 4864d57..05e029a 100644 --- a/src/language.h +++ b/src/language.h @@ -1,6 +1,6 @@ // [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 "Rotary direction changed", "Please release button", @@ -63,10 +63,11 @@ static const char myLanguage[9][66][78] = { "Show SW wavelength", "RDS filter", "Dynamic PI", - "Show squelch", - "Modulation meter", - "AM Noise blanker", - "FM Noise blanker" + "Show squelch", + "Modulation meter", + "AM Noise blanker", + "FM Noise blanker", + "Defaults loaded" }, { "Nederlands", // Dutch @@ -131,10 +132,11 @@ static const char myLanguage[9][66][78] = { "Toon SW golflengte", "RDS filter", "Dynamische PI", - "Toon squelch", - "Modulatie meter", - "AM ruis filter", - "FM ruis filter" + "Toon squelch", + "Modulatie meter", + "AM ruis filter", + "FM ruis filter", + "Opnieuw geconfigureerd" }, { "Polski", // Polish @@ -199,10 +201,11 @@ static const char myLanguage[9][66][78] = { "Pokaz dlugosci fal SW", "RDS filter", "Dynamic PI", - "Show squelch", - "Modulation meter", - "AM Noise blanker", - "FM Noise blanker" + "Show squelch", + "Modulation meter", + "AM Noise blanker", + "FM Noise blanker", + "Defaults loaded" }, { "Hrvatski", // Croatian @@ -270,7 +273,8 @@ static const char myLanguage[9][66][78] = { "Prikaži squelch", "Mjerač modulacije", "AM prigušivač šuma", - "FM prigušivač šuma" + "FM prigušivač šuma", + "Defaults loaded" }, { "Ελληνικά", // Greek @@ -335,10 +339,11 @@ static const char myLanguage[9][66][78] = { "Show SW wavelength", "RDS filter", "Dynamic PI", - "Show squelch", - "Modulation meter", - "AM Noise blanker", - "FM Noise blanker" + "Show squelch", + "Modulation meter", + "AM Noise blanker", + "FM Noise blanker", + "Defaults loaded" }, { "Romana", // Romanian @@ -403,10 +408,11 @@ static const char myLanguage[9][66][78] = { "Show SW wavelength", "RDS filter", "Dynamic PI", - "Show squelch", - "Modulation meter", - "AM Noise blanker", - "FM Noise blanker" + "Show squelch", + "Modulation meter", + "AM Noise blanker", + "FM Noise blanker", + "Defaults loaded" }, { "Deutsch", // German @@ -471,10 +477,11 @@ static const char myLanguage[9][66][78] = { "Show SW wavelength", "RDS filter", "Dynamic PI", - "Show squelch", - "Modulation meter", - "AM Noise blanker", - "FM Noise blanker" + "Show squelch", + "Modulation meter", + "AM Noise blanker", + "FM Noise blanker", + "Defaults loaded" }, { "Czech", // Czech "Směr enkóderu byl změněn", @@ -538,10 +545,11 @@ static const char myLanguage[9][66][78] = { "Show SW wavelength", "RDS filter", "Dynamic PI", - "Show squelch", - "Modulation meter", - "AM Noise blanker", - "FM Noise blanker" + "Show squelch", + "Modulation meter", + "AM Noise blanker", + "FM Noise blanker", + "Defaults loaded" }, { "Slovak", // Slovak "Smer enkóderu bol zmenený", @@ -605,9 +613,10 @@ static const char myLanguage[9][66][78] = { "Show SW wavelength", "RDS filter", "Dynamic PI", - "Show squelch", - "Modulation meter", - "AM Noise blanker", - "FM Noise blanker" + "Show squelch", + "Modulation meter", + "AM Noise blanker", + "FM Noise blanker", + "Defaults loaded" }, };