diff --git a/src/TEF6686.cpp b/src/TEF6686.cpp index 6da0c6d..0e54803 100644 --- a/src/TEF6686.cpp +++ b/src/TEF6686.cpp @@ -96,12 +96,12 @@ void TEF6686::setVolume(int8_t volume) { } void TEF6686::setMute() { - mute = true; + mute = true; devTEF_Audio_Set_Mute(1); } void TEF6686::setUnMute() { - mute = false; + mute = false; devTEF_Audio_Set_Mute(0); } @@ -246,41 +246,41 @@ bool TEF6686::readRDS(bool showrdserrors) { //PI if (rds.stationID == 0) rds.stationID = rds.rdsA; - if (rds.region == 0) { - char Hex[16] = { '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'A', 'B', 'C', 'D', 'E', 'F'}; - rds.picode[0] = Hex[(rds.rdsA & 0xF000U) >> 12]; - rds.picode[1] = Hex[(rds.rdsA & 0x0F00U) >> 8]; - rds.picode[2] = Hex[(rds.rdsA & 0x00F0U) >> 4]; - rds.picode[3] = Hex[(rds.rdsA & 0x000FU)]; - rds.picode[4] = '\0'; - } - if (rds.region == 1) { - if (rds.stationID > 4096) { - if (rds.stationID > 21671 &&(rds.stationID & 0xF00U) >> 8 == 0) rds.stationID = ((uint16_t)uint8_t(0xA0 + ((rds.stationID & 0xF000U) >> 12)) << 8) + lowByte(rds.stationID); // C0DE -> ACDE - if (rds.stationID > 21671 && lowByte(rds.stationID) == 0) rds.stationID = 0xAF00 + uint8_t(highByte(rds.stationID)); // CD00 -> AFCD - if (rds.stationID < 39247) { - if (rds.stationID > 21671) { - rds.picode[0] = 'W'; - rds.stationID -= 21672; - } else { - rds.picode[0] = 'K'; - rds.stationID -= 4096; - } - rds.picode[1] = char(rds.stationID / 676 + 65); - rds.picode[2] = char((rds.stationID - 676 * int(rds.stationID / 676)) / 26 + 65); - rds.picode[3] = char(((rds.stationID - 676 * int(rds.stationID / 676)) % 26) + 65); - rds.picode[4] = '\0'; - } else { - rds.stationID -= 4835; - rds.picode[0] = 'K'; - rds.picode[1] = char(rds.stationID / 676 + 65); - rds.picode[2] = char((rds.stationID - 676 * int(rds.stationID / 676)) / 26 + 65); - rds.picode[3] = char(((rds.stationID - 676 * int(rds.stationID / 676)) % 26) + 65); - rds.picode[4] = '\0'; - } - } - } - + if (rds.region == 0) { + char Hex[16] = { '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'A', 'B', 'C', 'D', 'E', 'F'}; + rds.picode[0] = Hex[(rds.rdsA & 0xF000U) >> 12]; + rds.picode[1] = Hex[(rds.rdsA & 0x0F00U) >> 8]; + rds.picode[2] = Hex[(rds.rdsA & 0x00F0U) >> 4]; + rds.picode[3] = Hex[(rds.rdsA & 0x000FU)]; + rds.picode[4] = '\0'; + } + if (rds.region == 1) { + if (rds.stationID > 4096) { + if (rds.stationID > 21671 && (rds.stationID & 0xF00U) >> 8 == 0) rds.stationID = ((uint16_t)uint8_t(0xA0 + ((rds.stationID & 0xF000U) >> 12)) << 8) + lowByte(rds.stationID); // C0DE -> ACDE + if (rds.stationID > 21671 && lowByte(rds.stationID) == 0) rds.stationID = 0xAF00 + uint8_t(highByte(rds.stationID)); // CD00 -> AFCD + if (rds.stationID < 39247) { + if (rds.stationID > 21671) { + rds.picode[0] = 'W'; + rds.stationID -= 21672; + } else { + rds.picode[0] = 'K'; + rds.stationID -= 4096; + } + rds.picode[1] = char(rds.stationID / 676 + 65); + rds.picode[2] = char((rds.stationID - 676 * int(rds.stationID / 676)) / 26 + 65); + rds.picode[3] = char(((rds.stationID - 676 * int(rds.stationID / 676)) % 26) + 65); + rds.picode[4] = '\0'; + } else { + rds.stationID -= 4835; + rds.picode[0] = 'K'; + rds.picode[1] = char(rds.stationID / 676 + 65); + rds.picode[2] = char((rds.stationID - 676 * int(rds.stationID / 676)) / 26 + 65); + rds.picode[3] = char(((rds.stationID - 676 * int(rds.stationID / 676)) % 26) + 65); + rds.picode[4] = '\0'; + } + } + } + rds_group = (rds.rdsB >> 11); if (rds.correctPI == false && rds.correct == true) rds.correctPI = true; switch (rds_group) { @@ -298,9 +298,11 @@ bool TEF6686::readRDS(bool showrdserrors) } if (ps_process == 2) { - RDScharConverter(ps_buffer, rds.PStext, sizeof(rds.PStext) / sizeof(wchar_t)); - rds.stationName = convertToUTF8(rds.PStext); - + for (int i = 0; i < 9; i++) rds.PStext[i] = 0; + rds.stationName = ""; + RDScharConverter(ps_buffer, rds.PStext, sizeof(rds.PStext) / sizeof(wchar_t)); + rds.stationName = convertToUTF8(rds.PStext); + for (int i = 0; i < 9; i++) ps_buffer[i] = '\0'; ps_process = 0; rds.hasPS = true; @@ -311,7 +313,7 @@ bool TEF6686::readRDS(bool showrdserrors) rds.stationTypeCode = (rds.rdsB >> 5) & 0x1F; rds.hasPTY = true; if (rds.region == 0) strcpy(rds.stationType, PTY_EU[rds.stationTypeCode]); - if (rds.region == 1) strcpy(rds.stationType, PTY_USA[rds.stationTypeCode]); + if (rds.region == 1) strcpy(rds.stationType, PTY_USA[rds.stationTypeCode]); //TP-TA-EON-MS if ((bitRead(rds.rdsB, 4)) == 1 && ((bitRead(rds.rdsB, 10)) == 0)) rds.hasEON = true; else rds.hasEON = false; @@ -362,11 +364,12 @@ bool TEF6686::readRDS(bool showrdserrors) if (rds.rtAB != ABold) { offsetold = 0; - rds.stationText = ""; + rds.stationText = ""; if (rt_timer == 64) { - RDScharConverter(stationTextBuffer, rds.RTtext, sizeof(rds.RTtext) / sizeof(wchar_t)); - rds.stationText = convertToUTF8(rds.RTtext); - } + for (int i = 0; i < 65; i++) rds.RTtext[i] = 0; + RDScharConverter(stationTextBuffer, rds.RTtext, sizeof(rds.RTtext) / sizeof(wchar_t)); + rds.stationText = convertToUTF8(rds.RTtext); + } for (int i = 0; i < 65; i++) { rt_buffer[i] = 0; @@ -393,10 +396,12 @@ bool TEF6686::readRDS(bool showrdserrors) if (offset == offsetold) { strcpy(stationTextBuffer, rt_buffer); - for (int i = 0; i < 64; i++) stationTextBuffer[i] = stationTextBuffer[i]; + for (int i = 0; i < 64; i++) stationTextBuffer[i] = stationTextBuffer[i]; if (rt_timer < 64) { - RDScharConverter(stationTextBuffer, rds.RTtext, sizeof(rds.RTtext) / sizeof(wchar_t)); - rds.stationText = convertToUTF8(rds.RTtext); + rds.stationText = ""; + for (int i = 0; i < 65; i++) rds.RTtext[i] = 0; + RDScharConverter(stationTextBuffer, rds.RTtext, sizeof(rds.RTtext) / sizeof(wchar_t)); + rds.stationText = convertToUTF8(rds.RTtext); rt_timer++; } else { rt_timer = 64; @@ -534,11 +539,12 @@ void TEF6686::clearRDS (bool fullsearchrds) rds.stationName = ""; rds.stationText = ""; for (i = 0; i < 9; i++) { -// rds.stationName[i] = 0; + rds.PStext[i] = 0; ps_buffer[i] = 0; } for (i = 0; i < 65; i++) { stationTextBuffer[i] = 0; + rds.RTtext[i] = 0; rt_buffer[i] = 0; rt_buffer2[i] = 0; } @@ -585,6 +591,7 @@ void TEF6686::clearRDS (bool fullsearchrds) ps_process = 1; af_counter = 0; rt_timer = 0; + rds.rdsreset = true; } void TEF6686::tone(uint16_t time, int16_t amplitude, uint16_t frequency) { @@ -622,143 +629,143 @@ void TEF6686::RDScharConverter(const char* input, wchar_t* output, size_t size) for (size_t i = 0; i < size - 1; i++) { char currentChar = input[i]; switch (currentChar) { - case 0x20: if(rds.underscore) output[i] = L'_'; else output[i] = L' '; break; - case 0x21 ... 0x5D: output[i] = static_cast(currentChar); break; - case 0x5E: output[i] = L'―'; break; - case 0x5F: output[i] = L'_'; break; - case 0x60: output[i] = L'‖'; break; - case 0x61 ... 0x7d: output[i] = static_cast(currentChar); break; - case 0x7E: output[i] = L'¯'; break; - case 0x7F: output[i] = L' '; break; - case 0x80: output[i] = L'á'; break; - case 0x81: output[i] = L'à'; break; - case 0x82: output[i] = L'é'; break; - case 0x83: output[i] = L'è'; break; - case 0x84: output[i] = L'í'; break; - case 0x85: output[i] = L'ì'; break; - case 0x86: output[i] = L'ó'; break; - case 0x87: output[i] = L'ò'; break; - case 0x88: output[i] = L'ú'; break; - case 0x89: output[i] = L'ù'; break; - case 0x8A: output[i] = L'Ñ'; break; - case 0x8B: output[i] = L'Ç'; break; - case 0x8C: output[i] = L'Ş'; break; - case 0x8D: output[i] = L'β'; break; - case 0x8E: output[i] = L'¡'; break; - case 0x8F: output[i] = L'IJ'; break; - case 0x90: output[i] = L'â'; break; - case 0x91: output[i] = L'ä'; break; - case 0x92: output[i] = L'ê'; break; - case 0x93: output[i] = L'ë'; break; - case 0x94: output[i] = L'î'; break; - case 0x95: output[i] = L'ï'; break; - case 0x96: output[i] = L'ô'; break; - case 0x97: output[i] = L'ö'; break; - case 0x98: output[i] = L'û'; break; - case 0x99: output[i] = L'ü'; break; - case 0x9A: output[i] = L'ñ'; break; - case 0x9B: output[i] = L'ç'; break; - case 0x9C: output[i] = L'ş'; break; - case 0x9D: output[i] = L'ǧ'; break; - case 0x9E: output[i] = L'ı'; break; - case 0x9F: output[i] = L'ij'; break; - case 0xA0: output[i] = L'ª'; break; - case 0xA1: output[i] = L'α'; break; - case 0xA2: output[i] = L'©'; break; - case 0xA3: output[i] = L'‰'; break; - case 0xA4: output[i] = L'Ǧ'; break; - case 0xA5: output[i] = L'ě'; break; - case 0xA6: output[i] = L'ň'; break; - case 0xA7: output[i] = L'ő'; break; - case 0xA8: output[i] = L'π'; break; - case 0xA9: output[i] = L'€'; break; - case 0xAA: output[i] = L'£'; break; - case 0xAB: output[i] = L'$'; break; - case 0xAC: output[i] = L'←'; break; - case 0xAD: output[i] = L'↑'; break; - case 0xAE: output[i] = L'→'; break; - case 0xAF: output[i] = L'↓'; break; - case 0xB0: output[i] = L'º'; break; - case 0xB1: output[i] = L'¹'; break; - case 0xB2: output[i] = L'²'; break; - case 0xB3: output[i] = L'³'; break; - case 0xB4: output[i] = L'±'; break; - case 0xB5: output[i] = L'İ'; break; - case 0xB6: output[i] = L'ń'; break; - case 0xB7: output[i] = L'ű'; break; - case 0xB8: output[i] = L'µ'; break; - case 0xB9: output[i] = L'¿'; break; - case 0xBA: output[i] = L'÷'; break; - case 0xBB: output[i] = L'°'; break; - case 0xBC: output[i] = L'¼'; break; - case 0xBD: output[i] = L'½'; break; - case 0xBE: output[i] = L'¾'; break; - case 0xBF: output[i] = L'§'; break; - case 0xC0: output[i] = L'Á'; break; - case 0xC1: output[i] = L'À'; break; - case 0xC2: output[i] = L'É'; break; - case 0xC3: output[i] = L'È'; break; - case 0xC4: output[i] = L'Í'; break; - case 0xC5: output[i] = L'Ì'; break; - case 0xC6: output[i] = L'Ó'; break; - case 0xC7: output[i] = L'Ò'; break; - case 0xC8: output[i] = L'Ú'; break; - case 0xC9: output[i] = L'Ù'; break; - case 0xCA: output[i] = L'Ř'; break; - case 0xCB: output[i] = L'Č'; break; - case 0xCC: output[i] = L'Š'; break; - case 0xCD: output[i] = L'Ž'; break; - case 0xCE: output[i] = L'Ð'; break; - case 0xCF: output[i] = L'Ŀ'; break; - case 0xD0: output[i] = L'Â'; break; - case 0xD1: output[i] = L'Ä'; break; - case 0xD2: output[i] = L'Ê'; break; - case 0xD3: output[i] = L'Ë'; break; - case 0xD4: output[i] = L'Î'; break; - case 0xD5: output[i] = L'Ï'; break; - case 0xD6: output[i] = L'Ô'; break; - case 0xD7: output[i] = L'Ö'; break; - case 0xD8: output[i] = L'Û'; break; - case 0xD9: output[i] = L'Ü'; break; - case 0xDA: output[i] = L'ř'; break; - case 0xDB: output[i] = L'č'; break; - case 0xDC: output[i] = L'š'; break; - case 0xDD: output[i] = L'ž'; break; - case 0xDE: output[i] = L'đ'; break; - case 0xDF: output[i] = L'ŀ'; break; - case 0xE0: output[i] = L'Ã'; break; - case 0xE1: output[i] = L'Å'; break; - case 0xE2: output[i] = L'Æ'; break; - case 0xE3: output[i] = L'Œ'; break; - case 0xE4: output[i] = L'ŷ'; break; - case 0xE5: output[i] = L'Ý'; break; - case 0xE6: output[i] = L'Õ'; break; - case 0xE7: output[i] = L'Ø'; break; - case 0xE8: output[i] = L'Þ'; break; - case 0xE9: output[i] = L'Ŋ'; break; - case 0xEA: output[i] = L'Ŕ'; break; - case 0xEB: output[i] = L'Ć'; break; - case 0xEC: output[i] = L'Ś'; break; - case 0xED: output[i] = L'Ź'; break; - case 0xEE: output[i] = L'Ŧ'; break; - case 0xEF: output[i] = L'ð'; break; - case 0xF0: output[i] = L'ã'; break; - case 0xF1: output[i] = L'å'; break; - case 0xF2: output[i] = L'æ'; break; - case 0xF3: output[i] = L'œ'; break; - case 0xF4: output[i] = L'ŵ'; break; - case 0xF5: output[i] = L'ý'; break; - case 0xF6: output[i] = L'õ'; break; - case 0xF7: output[i] = L'ø'; break; - case 0xF8: output[i] = L'þ'; break; - case 0xF9: output[i] = L'ŋ'; break; - case 0xFA: output[i] = L'ŕ'; break; - case 0xFB: output[i] = L'ć'; break; - case 0xFC: output[i] = L'ś'; break; - case 0xFD: output[i] = L'ź'; break; - case 0xFE: output[i] = L'ŧ'; break; - case 0xFF: output[i] = L' '; break; + case 0x20: if (rds.underscore) output[i] = L'_'; else output[i] = L' '; break; + case 0x21 ... 0x5D: output[i] = static_cast(currentChar); break; + case 0x5E: output[i] = L'―'; break; + case 0x5F: output[i] = L'_'; break; + case 0x60: output[i] = L'‖'; break; + case 0x61 ... 0x7d: output[i] = static_cast(currentChar); break; + case 0x7E: output[i] = L'¯'; break; + case 0x7F: output[i] = L' '; break; + case 0x80: output[i] = L'á'; break; + case 0x81: output[i] = L'à'; break; + case 0x82: output[i] = L'é'; break; + case 0x83: output[i] = L'è'; break; + case 0x84: output[i] = L'í'; break; + case 0x85: output[i] = L'ì'; break; + case 0x86: output[i] = L'ó'; break; + case 0x87: output[i] = L'ò'; break; + case 0x88: output[i] = L'ú'; break; + case 0x89: output[i] = L'ù'; break; + case 0x8A: output[i] = L'Ñ'; break; + case 0x8B: output[i] = L'Ç'; break; + case 0x8C: output[i] = L'Ş'; break; + case 0x8D: output[i] = L'β'; break; + case 0x8E: output[i] = L'¡'; break; + case 0x8F: output[i] = L'IJ'; break; + case 0x90: output[i] = L'â'; break; + case 0x91: output[i] = L'ä'; break; + case 0x92: output[i] = L'ê'; break; + case 0x93: output[i] = L'ë'; break; + case 0x94: output[i] = L'î'; break; + case 0x95: output[i] = L'ï'; break; + case 0x96: output[i] = L'ô'; break; + case 0x97: output[i] = L'ö'; break; + case 0x98: output[i] = L'û'; break; + case 0x99: output[i] = L'ü'; break; + case 0x9A: output[i] = L'ñ'; break; + case 0x9B: output[i] = L'ç'; break; + case 0x9C: output[i] = L'ş'; break; + case 0x9D: output[i] = L'ǧ'; break; + case 0x9E: output[i] = L'ı'; break; + case 0x9F: output[i] = L'ij'; break; + case 0xA0: output[i] = L'ª'; break; + case 0xA1: output[i] = L'α'; break; + case 0xA2: output[i] = L'©'; break; + case 0xA3: output[i] = L'‰'; break; + case 0xA4: output[i] = L'Ǧ'; break; + case 0xA5: output[i] = L'ě'; break; + case 0xA6: output[i] = L'ň'; break; + case 0xA7: output[i] = L'ő'; break; + case 0xA8: output[i] = L'π'; break; + case 0xA9: output[i] = L'€'; break; + case 0xAA: output[i] = L'£'; break; + case 0xAB: output[i] = L'$'; break; + case 0xAC: output[i] = L'←'; break; + case 0xAD: output[i] = L'↑'; break; + case 0xAE: output[i] = L'→'; break; + case 0xAF: output[i] = L'↓'; break; + case 0xB0: output[i] = L'º'; break; + case 0xB1: output[i] = L'¹'; break; + case 0xB2: output[i] = L'²'; break; + case 0xB3: output[i] = L'³'; break; + case 0xB4: output[i] = L'±'; break; + case 0xB5: output[i] = L'İ'; break; + case 0xB6: output[i] = L'ń'; break; + case 0xB7: output[i] = L'ű'; break; + case 0xB8: output[i] = L'µ'; break; + case 0xB9: output[i] = L'¿'; break; + case 0xBA: output[i] = L'÷'; break; + case 0xBB: output[i] = L'°'; break; + case 0xBC: output[i] = L'¼'; break; + case 0xBD: output[i] = L'½'; break; + case 0xBE: output[i] = L'¾'; break; + case 0xBF: output[i] = L'§'; break; + case 0xC0: output[i] = L'Á'; break; + case 0xC1: output[i] = L'À'; break; + case 0xC2: output[i] = L'É'; break; + case 0xC3: output[i] = L'È'; break; + case 0xC4: output[i] = L'Í'; break; + case 0xC5: output[i] = L'Ì'; break; + case 0xC6: output[i] = L'Ó'; break; + case 0xC7: output[i] = L'Ò'; break; + case 0xC8: output[i] = L'Ú'; break; + case 0xC9: output[i] = L'Ù'; break; + case 0xCA: output[i] = L'Ř'; break; + case 0xCB: output[i] = L'Č'; break; + case 0xCC: output[i] = L'Š'; break; + case 0xCD: output[i] = L'Ž'; break; + case 0xCE: output[i] = L'Ð'; break; + case 0xCF: output[i] = L'Ŀ'; break; + case 0xD0: output[i] = L'Â'; break; + case 0xD1: output[i] = L'Ä'; break; + case 0xD2: output[i] = L'Ê'; break; + case 0xD3: output[i] = L'Ë'; break; + case 0xD4: output[i] = L'Î'; break; + case 0xD5: output[i] = L'Ï'; break; + case 0xD6: output[i] = L'Ô'; break; + case 0xD7: output[i] = L'Ö'; break; + case 0xD8: output[i] = L'Û'; break; + case 0xD9: output[i] = L'Ü'; break; + case 0xDA: output[i] = L'ř'; break; + case 0xDB: output[i] = L'č'; break; + case 0xDC: output[i] = L'š'; break; + case 0xDD: output[i] = L'ž'; break; + case 0xDE: output[i] = L'đ'; break; + case 0xDF: output[i] = L'ŀ'; break; + case 0xE0: output[i] = L'Ã'; break; + case 0xE1: output[i] = L'Å'; break; + case 0xE2: output[i] = L'Æ'; break; + case 0xE3: output[i] = L'Œ'; break; + case 0xE4: output[i] = L'ŷ'; break; + case 0xE5: output[i] = L'Ý'; break; + case 0xE6: output[i] = L'Õ'; break; + case 0xE7: output[i] = L'Ø'; break; + case 0xE8: output[i] = L'Þ'; break; + case 0xE9: output[i] = L'Ŋ'; break; + case 0xEA: output[i] = L'Ŕ'; break; + case 0xEB: output[i] = L'Ć'; break; + case 0xEC: output[i] = L'Ś'; break; + case 0xED: output[i] = L'Ź'; break; + case 0xEE: output[i] = L'Ŧ'; break; + case 0xEF: output[i] = L'ð'; break; + case 0xF0: output[i] = L'ã'; break; + case 0xF1: output[i] = L'å'; break; + case 0xF2: output[i] = L'æ'; break; + case 0xF3: output[i] = L'œ'; break; + case 0xF4: output[i] = L'ŵ'; break; + case 0xF5: output[i] = L'ý'; break; + case 0xF6: output[i] = L'õ'; break; + case 0xF7: output[i] = L'ø'; break; + case 0xF8: output[i] = L'þ'; break; + case 0xF9: output[i] = L'ŋ'; break; + case 0xFA: output[i] = L'ŕ'; break; + case 0xFB: output[i] = L'ć'; break; + case 0xFC: output[i] = L'ś'; break; + case 0xFD: output[i] = L'ź'; break; + case 0xFE: output[i] = L'ŧ'; break; + case 0xFF: output[i] = L' '; break; } } output[size - 1] = L'\0'; -} \ No newline at end of file +} diff --git a/src/TEF6686.h b/src/TEF6686.h index a8b19c0..9e49db7 100644 --- a/src/TEF6686.h +++ b/src/TEF6686.h @@ -171,6 +171,7 @@ typedef struct _rds_ { bool correct; bool correctPI; bool underscore; + bool rdsreset; } rds_; typedef struct _af_ { @@ -222,12 +223,12 @@ class TEF6686 { void setUnMute(); void setVolume(int8_t volume); void tone(uint16_t time, int16_t amplitude, uint16_t frequency); - uint8_t af_counter; - bool mute; + uint8_t af_counter; + bool mute; private: - void RDScharConverter(const char* input, wchar_t* output, size_t size); - String convertToUTF8(const wchar_t* input); + void RDScharConverter(const char* input, wchar_t* output, size_t size); + String convertToUTF8(const wchar_t* input); uint16_t rdsTimeOut = 32768; uint8_t ps_process; uint8_t rt_process; @@ -240,4 +241,4 @@ class TEF6686 { byte rt_timer; byte offsetold; char stationTextBuffer[65]; -}; \ No newline at end of file +};