Added RBDS support with stationcall and underscore in PS

This commit is contained in:
Sjef Verhoeven PE5PVB
2023-06-08 22:40:55 +02:00
parent c2506405fa
commit 05b232fcb4
4 changed files with 342 additions and 161 deletions

View File

@@ -57,14 +57,17 @@ bool Stereostatusold;
bool StereoToggle = true;
bool store;
bool tuned;
bool underscore;
bool USBstatus;
bool XDRMute;
byte region;
byte regionold;
byte language;
byte tunemode;
byte memorypos;
byte memoryposold;
byte menupage = 1;
byte menupagestotal = 2;
bool USBstatus;
bool XDRMute;
byte band;
byte BWset;
byte ContrastSet;
@@ -154,8 +157,8 @@ TFT_eSprite sprite = TFT_eSprite(&tft);
void setup() {
setupmode = true;
EEPROM.begin(221);
if (EEPROM.readByte(43) != 20) {
EEPROM.writeByte(43, 20);
if (EEPROM.readByte(43) != 21) {
EEPROM.writeByte(43, 21);
EEPROM.writeUInt(0, 10000);
EEPROM.writeInt(4, 0);
EEPROM.writeUInt(8, 0);
@@ -181,8 +184,10 @@ void setup() {
EEPROM.writeByte(44, 1);
EEPROM.writeByte(45, 1);
EEPROM.writeByte(46, 0);
EEPROM.writeInt(47, 20);
EEPROM.writeByte(51, 0);
EEPROM.writeInt(55, 20);
EEPROM.writeByte(52, 0);
EEPROM.writeByte(53, 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.commit();
@@ -213,8 +218,10 @@ void setup() {
iMSset = EEPROM.readByte(44);
EQset = EEPROM.readByte(45);
band = EEPROM.readByte(46);
LowLevelSet = EEPROM.readInt(47);
memorypos = EEPROM.readByte(51);
LowLevelSet = EEPROM.readInt(55);
region = EEPROM.readByte(52);
underscore = EEPROM.readByte(53);
for (int i = 0; i < 30; i++) memoryband[i] = EEPROM.readByte(i + 60);
for (int i = 0; i < 30; i++) memory[i] = EEPROM.readUInt((i * 4) + 100);
@@ -368,6 +375,8 @@ void setup() {
radio.setMute();
radio.setSoftmuteFM(softmutefm);
radio.setSoftmuteAM(softmuteam);
if (region == 1) radio.setDeemphasis(2);
radio.rds.region = region;
LowLevelInit = true;
if (ConverterSet >= 200) {
@@ -403,7 +412,8 @@ void loop() {
tft.drawString("120", 164, 146, GFXFF);
tft.drawString("%", 196, 146, GFXFF);
tft.drawString("M", 6, 132, GFXFF);
tft.drawString("PI:", 216, 191, GFXFF);
if (region == 0) tft.drawString("PI:", 216, 191, GFXFF);
if (region == 1) tft.drawString("ID:", 216, 191, GFXFF);
tft.drawString("PS:", 6, 191, GFXFF);
tft.drawString("PTY:", 6, 164, GFXFF);
tft.drawLine(20, 150, 200, 150, TFT_DARKGREY);
@@ -437,7 +447,8 @@ void loop() {
tft.drawString("120", 164, 146, GFXFF);
tft.drawString("%", 196, 146, GFXFF);
tft.drawString("M", 6, 132, GFXFF);
tft.drawString("PI:", 216, 191, GFXFF);
if (region == 0) tft.drawString("PI:", 216, 191, GFXFF);
if (region == 1) tft.drawString("ID:", 216, 191, GFXFF);
tft.drawString("PS:", 6, 191, GFXFF);
tft.drawString("PTY:", 6, 164, GFXFF);
tft.drawLine(20, 150, 200, 150, TFT_GREYOUT);
@@ -590,7 +601,8 @@ void SelectBand() {
radio.getStatusAM(SStatus, USN, WAM, OStatus, BW, MStatus);
if (screenmute == false) BuildDisplay();
tft.setFreeFont(FONT7);
tft.drawString("PI:", 216, 191, GFXFF);
if (region == 0) tft.drawString("PI:", 216, 191, GFXFF);
if (region == 1) tft.drawString("ID:", 216, 191, GFXFF);
tft.drawString("PS:", 6, 191, GFXFF);
tft.drawString("PTY:", 6, 164, GFXFF);
tft.drawBitmap(110, 5, RDSLogo, 67, 22, TFT_GREYOUT);
@@ -712,7 +724,9 @@ void ModeButtonPress() {
EEPROM.writeByte(30, softmutefm);
EEPROM.writeByte(35, language);
EEPROM.writeByte(36, showrdserrors);
EEPROM.writeInt(55, LowLevelSet);
EEPROM.writeInt(47, LowLevelSet);
EEPROM.writeByte(52, region);
EEPROM.writeByte(53, underscore);
EEPROM.commit();
}
while (digitalRead(MODEBUTTON) == LOW) delay(50);
@@ -960,6 +974,21 @@ void ButtonPress() {
tft.setTextColor(TFT_YELLOW);
if (edgebeep) tft.drawCentreString(myLanguage[language][42], 155, 110, GFXFF); else tft.drawCentreString(myLanguage[language][30], 155, 110, GFXFF);
break;
case 130:
tft.setTextColor(TFT_WHITE);
tft.drawCentreString(myLanguage[language][46], 155, 70, GFXFF);
tft.setTextColor(TFT_YELLOW);
if (region == 0) tft.drawCentreString(myLanguage[language][47], 155, 110, GFXFF);
if (region == 1) tft.drawCentreString(myLanguage[language][48], 155, 110, GFXFF);
break;
case 150:
tft.setTextColor(TFT_WHITE);
tft.drawCentreString(myLanguage[language][49], 155, 70, GFXFF);
tft.setTextColor(TFT_YELLOW);
if (underscore) tft.drawCentreString(myLanguage[language][42], 155, 110, GFXFF); else tft.drawCentreString(myLanguage[language][30], 155, 110, GFXFF);
break;
}
}
} else {
@@ -1171,6 +1200,28 @@ void KeyUp() {
tft.setTextColor(TFT_YELLOW);
if (edgebeep) tft.drawCentreString(myLanguage[language][42], 155, 110, GFXFF); else tft.drawCentreString(myLanguage[language][30], 155, 110, GFXFF);
break;
case 130:
tft.setTextColor(TFT_BLACK);
if (region == 0) region = 1; else region = 0;
if (regionold == 0) tft.drawCentreString(myLanguage[language][47], 155, 110, GFXFF);
if (regionold == 1) tft.drawCentreString(myLanguage[language][48], 155, 110, GFXFF);
if (edgebeep) edgebeep = false; else edgebeep = true;
tft.setTextColor(TFT_YELLOW);
if (region == 0) tft.drawCentreString(myLanguage[language][47], 155, 110, GFXFF);
if (region == 1) tft.drawCentreString(myLanguage[language][48], 155, 110, GFXFF);
regionold = region;
if (region == 0) radio.setDeemphasis(1);
if (region == 1) radio.setDeemphasis(2);
radio.rds.region = region;
break;
case 150:
tft.setTextColor(TFT_BLACK);
if (underscore) tft.drawCentreString(myLanguage[language][42], 155, 110, GFXFF); else tft.drawCentreString(myLanguage[language][30], 155, 110, GFXFF);
if (underscore) underscore = false; else underscore = true;
tft.setTextColor(TFT_YELLOW);
if (underscore) tft.drawCentreString(myLanguage[language][42], 155, 110, GFXFF); else tft.drawCentreString(myLanguage[language][30], 155, 110, GFXFF);
}
}
}
@@ -1380,6 +1431,28 @@ void KeyDown() {
tft.setTextColor(TFT_YELLOW);
if (edgebeep) tft.drawCentreString(myLanguage[language][42], 155, 110, GFXFF); else tft.drawCentreString(myLanguage[language][30], 155, 110, GFXFF);
break;
case 130:
tft.setTextColor(TFT_BLACK);
if (region == 0) region = 1; else region = 0;
if (regionold == 0) tft.drawCentreString(myLanguage[language][47], 155, 110, GFXFF);
if (regionold == 1) tft.drawCentreString(myLanguage[language][48], 155, 110, GFXFF);
if (edgebeep) edgebeep = false; else edgebeep = true;
tft.setTextColor(TFT_YELLOW);
if (region == 0) tft.drawCentreString(myLanguage[language][47], 155, 110, GFXFF);
if (region == 1) tft.drawCentreString(myLanguage[language][48], 155, 110, GFXFF);
regionold = region;
if (region == 0) radio.setDeemphasis(1);
if (region == 1) radio.setDeemphasis(2);
radio.rds.region = region;
break;
case 150:
tft.setTextColor(TFT_BLACK);
if (underscore) tft.drawCentreString(myLanguage[language][42], 155, 110, GFXFF); else tft.drawCentreString(myLanguage[language][30], 155, 110, GFXFF);
if (underscore) underscore = false; else underscore = true;
tft.setTextColor(TFT_YELLOW);
if (underscore) tft.drawCentreString(myLanguage[language][42], 155, 110, GFXFF); else tft.drawCentreString(myLanguage[language][30], 155, 110, GFXFF);
}
}
}
@@ -1494,8 +1567,20 @@ void showPS() {
tft.setTextColor(TFT_BLACK);
tft.drawString(PSold, 38, 182, GFXFF);
tft.setTextColor(TFT_YELLOW);
tft.drawString(radio.rds.stationName, 38, 182, GFXFF);
PSold = radio.rds.stationName;
if (underscore) {
char PS_[9];
strcpy (PS_, radio.rds.stationName);
for (int i = 0; i < 8; i++)
{
if (PS_[i] < 0x10) PS_[i] = '0';
if (PS_[i] == 0x20) PS_[i] = '_';
}
tft.drawString(PS_, 38, 182, GFXFF);
PSold = PS_;
} else {
tft.drawString(radio.rds.stationName, 38, 182, GFXFF);
PSold = radio.rds.stationName;
}
strcpy(programServicePrevious, radio.rds.stationName);
}
}
@@ -1596,12 +1681,17 @@ void BuildMenu() {
tft.drawString(myLanguage[language][43], 14, 70, GFXFF);
tft.drawString(myLanguage[language][44], 14, 90, GFXFF);
tft.drawString(myLanguage[language][45], 14, 110, GFXFF);
tft.drawString(myLanguage[language][46], 14, 130, GFXFF);
tft.drawString(myLanguage[language][49], 14, 150, GFXFF);
tft.setTextColor(TFT_YELLOW);
tft.drawRightString(myLanguage[language][0], 305, 30, GFXFF);
if (showrdserrors) tft.drawRightString(myLanguage[language][42], 305, 50, GFXFF); else tft.drawRightString(myLanguage[language][30], 305, 50, GFXFF);
if (softmutefm) tft.drawRightString(myLanguage[language][42], 305, 70, GFXFF); else tft.drawRightString(myLanguage[language][30], 305, 70, GFXFF);
if (softmuteam) tft.drawRightString(myLanguage[language][42], 305, 90, GFXFF); else tft.drawRightString(myLanguage[language][30], 305, 90, GFXFF);
if (edgebeep) tft.drawRightString(myLanguage[language][42], 305, 110, GFXFF); else tft.drawRightString(myLanguage[language][30], 305, 110, GFXFF);
if (region == 0) tft.drawRightString(myLanguage[language][47], 305, 130, GFXFF);
if (region == 1) tft.drawRightString(myLanguage[language][48], 305, 130, GFXFF);
if (underscore) tft.drawRightString(myLanguage[language][42], 305, 150, GFXFF); else tft.drawRightString(myLanguage[language][30], 305, 150, GFXFF);
break;
}
analogWrite(SMETERPIN, 0);
@@ -1656,7 +1746,8 @@ void BuildDisplay() {
tft.drawString("dB", 300, 167, GFXFF);
tft.drawString("S", 6, 100, GFXFF);
tft.drawString("M", 6, 132, GFXFF);
tft.drawString("PI:", 216, 191, GFXFF);
if (region == 0) tft.drawString("PI:", 216, 191, GFXFF);
if (region == 1) tft.drawString("ID:", 216, 191, GFXFF);
tft.drawString("PS:", 6, 191, GFXFF);
tft.drawString("PTY:", 6, 164, GFXFF);
tft.drawString("%", 196, 146, GFXFF);
@@ -2421,12 +2512,12 @@ void XDRGTKRoutine() {
LevelOffset = atol(buff + 1);
if (LevelOffset == 0) {
MuteScreen(0);
LowLevelSet = EEPROM.readInt(55);
LowLevelSet = EEPROM.readInt(47);
Serial.print("G00\n");
}
if (LevelOffset == 10) {
MuteScreen(1);
LowLevelSet = EEPROM.readInt(55);
LowLevelSet = EEPROM.readInt(47);
Serial.print("G10\n");
}
if (LevelOffset == 1) {

View File

@@ -1,42 +1,5 @@
#include "TEF6686.h"
const char* const PTY[]
{
"None",
"News",
"Current Affairs",
"Information",
"Sport",
"Education",
"Drama",
"Cultures",
"Science",
"Varied Speech",
"Pop Music",
"Rock Music",
"Easy Listening",
"Light Classics",
"Serious Classics",
"Other Music",
"Weather",
"Finance",
"Children's Progs",
"Social Affair",
"Religion",
"Phone In",
"Travel & Touring",
"Leisure & Hobby",
"Jazz Music",
"Country Music",
"National Music",
"Oldies Music",
"Folk Music",
"Documentary",
"Alarm Test",
"Alarm!!!",
" "
};
void TEF6686::init(byte TEF) {
uint8_t bootstatus;
Tuner_I2C_Init();
@@ -280,12 +243,41 @@ bool TEF6686::readRDS(bool showrdserrors)
{
//PI
if (rds.stationID == 0) rds.stationID = rds.rdsA;
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 == 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) {
@@ -313,7 +305,8 @@ bool TEF6686::readRDS(bool showrdserrors)
//PTY
rds.stationTypeCode = (rds.rdsB >> 5) & 0x1F;
rds.hasPTY = true;
strcpy(rds.stationType, PTY[rds.stationTypeCode]);
if (rds.region == 0) strcpy(rds.stationType, PTY_EU[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;

View File

@@ -11,7 +11,80 @@ enum RDS_GROUPS {
RDS_GROUP_12A, RDS_GROUP_12B, RDS_GROUP_13A, RDS_GROUP_13B, RDS_GROUP_14A, RDS_GROUP_14B, RDS_GROUP_15A, RDS_GROUP_15B
};
const char* const PTY_EU[] {
"None",
"News",
"Current Affairs",
"Information",
"Sport",
"Education",
"Drama",
"Cultures",
"Science",
"Varied Speech",
"Pop Music",
"Rock Music",
"Easy Listening",
"Light Classics",
"Serious Classics",
"Other Music",
"Weather",
"Finance",
"Children's Progs",
"Social Affair",
"Religion",
"Phone In",
"Travel & Touring",
"Leisure & Hobby",
"Jazz Music",
"Country Music",
"National Music",
"Oldies Music",
"Folk Music",
"Documentary",
"Alarm Test",
"Alarm!!!",
" "
};
const char* const PTY_USA[] {
"None",
"News",
"Information",
"Sports",
"Talk",
"Rock",
"Classic Rock",
"Adult Hits",
"Soft Rock",
"Top 40",
"Country",
"Oldies",
"Soft",
"Nostalgia",
"Jazz",
"Classical",
"Rhythm and Blues ",
"Soft R & B",
"Foreign_Language",
"Religious Music",
"Religious Talk",
"Personality",
"Public",
"College",
"Hablar Espanol",
"Musica Espanol",
"Hip Hop",
" ",
" ",
"Weather",
"Emergency Test",
"ALERT! ALERT!",
" "
};
typedef struct _rds_ {
byte region;
byte stationTypeCode;
char stationName[9];
char stationText[65];
@@ -94,9 +167,9 @@ class TEF6686 {
void setStereoLevel(uint8_t start);
void setUnMute();
void setVolume(int8_t volume);
uint8_t af_counter;
bool mute;
void tone(uint16_t time, int16_t amplitude, uint16_t frequency);
uint8_t af_counter;
bool mute;
private:
uint8_t ascii_converter (uint8_t src);

View File

@@ -1,6 +1,6 @@
// [number of languages][number of texts][max. length of text]
const char myLanguage[6][46][100] = {
const char myLanguage[6][50][100] = {
{ "English", // English
"Rotary direction changed",
"Please release button",
@@ -46,7 +46,11 @@ const char myLanguage[6][46][100] = {
"On",
"Softmute FM",
"Softmute AM",
"Beep at band edge"
"Beep at band edge",
"Region",
"Europe",
"USA",
"Show underscore in PS"
},
{ "Nederlands", // Dutch
@@ -94,106 +98,118 @@ const char myLanguage[6][46][100] = {
"Aan",
"Softmute FM",
"Softmute AM",
"Piep op bandeinde"
"Piep op bandeinde",
"Regio",
"Europa",
"USA",
"Toon underscore in PS"
},
{ "Polski", // Polish
"Kierunek obrotu zmieniony",
"Zwolnij przycisk",
"Obrocono ekran",
"Kalibracja analogowego miernika",
"Zwolnij przycisk gdy gotowe",
"wybrano enkoder optyczny",
"wybrano standardowy enkoder",
"Odbiornik FM/AM",
"Tuner: !Brak!",
"Glosnosc:",
"Konwerter:",
"Dolna granica pasma:",
"Gorna granica pasma:",
"Odchylenie poziomu RF:",
"Prog Stereo:",
"Krawedz dolnoprzep..:",
"Prog dolnoprzepust.:",
"Prog niskiego sygnalu:",
"Kontrast:",
"Ustaw glosnosc",
"Ustaw odchylenie konwertera",
"Ustaw dolna granice pasma",
"Ustaw gorna granice pasma",
"Ustaw odchylenie sygnalu",
"Ustaw prog separacji Stereo",
"Czest. gran. filtra dolnoprzep.",
"Ustaw prog dolnoprzep.",
"Ustaw dolna granice sygnalu",
"Ustaw jasnosc wyswietlacza",
"Wyl.",
"Ekran jest wyciszony!",
"Aby wyl. wyciszenie odznacz RF+",
"WYL.",
"SKANOWANIE...",
"Nie wykryto tunera",
"Ustawiono wersje tunera: v",
"Prosze uruchomic pon. tuner",
"Pokaz bledy RDS",
"Jezyk",
"Wybierz swoj jezyk",
"WCISNIJ MODE ABY ZAMKNAC I ZAPISAC",
"Wlacz.",
"Lagodne wycisz. FM",
"Lagodne wycisz. AM",
"Beep na krawedzi pasma"
"Kierunek obrotu zmieniony",
"Zwolnij przycisk",
"Obrocono ekran",
"Kalibracja analogowego miernika",
"Zwolnij przycisk gdy gotowe",
"wybrano enkoder optyczny",
"wybrano standardowy enkoder",
"Odbiornik FM/AM",
"Tuner: !Brak!",
"Glosnosc:",
"Konwerter:",
"Dolna granica pasma:",
"Gorna granica pasma:",
"Odchylenie poziomu RF:",
"Prog Stereo:",
"Krawedz dolnoprzep..:",
"Prog dolnoprzepust.:",
"Prog niskiego sygnalu:",
"Kontrast:",
"Ustaw glosnosc",
"Ustaw odchylenie konwertera",
"Ustaw dolna granice pasma",
"Ustaw gorna granice pasma",
"Ustaw odchylenie sygnalu",
"Ustaw prog separacji Stereo",
"Czest. gran. filtra dolnoprzep.",
"Ustaw prog dolnoprzep.",
"Ustaw dolna granice sygnalu",
"Ustaw jasnosc wyswietlacza",
"Wyl.",
"Ekran jest wyciszony!",
"Aby wyl. wyciszenie odznacz RF+",
"WYL.",
"SKANOWANIE...",
"Nie wykryto tunera",
"Ustawiono wersje tunera: v",
"Prosze uruchomic pon. tuner",
"Pokaz bledy RDS",
"Jezyk",
"Wybierz swoj jezyk",
"WCISNIJ MODE ABY ZAMKNAC I ZAPISAC",
"Wlacz.",
"Lagodne wycisz. FM",
"Lagodne wycisz. AM",
"Beep na krawedzi pasma",
"Region",
"Europe",
"USA",
"Show underscore in PS"
},
{"Hrvatski", // Croatian
"Smjer enkodera promij.",
"Otpustite gumb",
"Zaslon je okrenut",
"Kalibracija analog. mjerača",
"Otpustite gumb",
"Optički enkoder postav.",
"Standardni enkoder postav.",
"FM/AM prijemnik",
"Prijemnik: !Nije pronađen!",
"Pomak glasnoće:",
"Pomak konvertera:",
"Donja granica opsega:",
"Gornja granica opsega:",
"Pomak RF razine:",
"Razina stereo signala:",
"Granična frekvencija:",
"Razina granične frekv.:",
"Donja granica za signal:",
"Svjetlina:",
"Pomak glasnoće",
"Pomak konvertera",
"Donja granica frekv. opsega",
"Gornja granica frekv. opsega",
"Pomak signala",
"Razina stereo signala",
"Granična frekvencija",
"Razina granične frekv.",
"Donja granica za signal",
"Svjetlina zaslona",
"Isključeno",
"Zaslon je isključen!",
"Da biste uključili zaslon, poništite kvadratić RF+",
"ISK.",
"SKENIRANJE...",
"Prijemnik nije pronađen",
"Postavljena verzija prijemnika: v",
"Molim, ponovno pokrenite prijemnik",
"Prikaži RDS pogreške",
"Jezik",
"Odaberite jezik",
"PRITISNITE MODE ZA IZLAZ I SPREMANJE",
"Uključeno",
"Softmute FM",
"Softmute AM",
"Beep na rubu frekv. opsega"
},
{"Hrvatski", // Croatian
"Smjer enkodera promij.",
"Otpustite gumb",
"Zaslon je okrenut",
"Kalibracija analog. mjerača",
"Otpustite gumb",
"Optički enkoder postav.",
"Standardni enkoder postav.",
"FM/AM prijemnik",
"Prijemnik: !Nije pronađen!",
"Pomak glasnoće:",
"Pomak konvertera:",
"Donja granica opsega:",
"Gornja granica opsega:",
"Pomak RF razine:",
"Razina stereo signala:",
"Granična frekvencija:",
"Razina granične frekv.:",
"Donja granica za signal:",
"Svjetlina:",
"Pomak glasnoće",
"Pomak konvertera",
"Donja granica frekv. opsega",
"Gornja granica frekv. opsega",
"Pomak signala",
"Razina stereo signala",
"Granična frekvencija",
"Razina granične frekv.",
"Donja granica za signal",
"Svjetlina zaslona",
"Isključeno",
"Zaslon je isključen!",
"Da biste uključili zaslon, poništite kvadratić RF+",
"ISK.",
"SKENIRANJE...",
"Prijemnik nije pronađen",
"Postavljena verzija prijemnika: v",
"Molim, ponovno pokrenite prijemnik",
"Prikaži RDS pogreške",
"Jezik",
"Odaberite jezik",
"PRITISNITE MODE ZA IZLAZ I SPREMANJE",
"Uključeno",
"Softmute FM",
"Softmute AM",
"Beep na rubu frekv. opsega",
"Region",
"Europe",
"USA",
"Show underscore in PS"
},
{"Ελληνικά", // Greek
{"Ελληνικά", // Greek
"Η διεύθυνση του ρότορα άλλαξε",
"Παρακαλώ ελευθερώστε το πλήκτρο",
"Η οθόνη αναποδογύρισε",
@@ -238,10 +254,14 @@ const char myLanguage[6][46][100] = {
"Ενεργό",
"Softmute FM",
"Softmute AM",
"Ηχητικό σήμα στο όριο μπάντας"
},
"Ηχητικό σήμα στο όριο μπάντας",
"Region",
"Europe",
"USA",
"Show underscore in PS"
},
{ "Romana", // Roman
{ "Romana", // Roman
"Sens rotire schimbat",
"Eliberati butonul",
"Ecran inversat",
@@ -286,6 +306,10 @@ const char myLanguage[6][46][100] = {
"Pornit",
"FM fara sonor",
"A fara sonorM",
"Sunet la marginea Benzii"
"Sunet la marginea Benzii",
"Region",
"Europe",
"USA",
"Show underscore in PS"
}
};