From d79358fa489a32cf9b3dc235d4348878d04c76ac Mon Sep 17 00:00:00 2001 From: KubaPro010 Date: Sat, 14 Feb 2026 18:29:55 +0100 Subject: [PATCH] Lots of minor changes --- include/language.h | 4266 ++++++++++++++++++------------------- include/system_console.h | 6 +- lib/TFT_eSPI/TFT_eSPI.cpp | 972 +-------- lib/TFT_eSPI/TFT_eSPI.h | 145 +- src/RdsPiBuffer.cpp | 2 +- src/gui.cpp | 322 ++- src/logbook.cpp | 10 +- src/main.cpp | 50 +- src/rds.cpp | 6 +- 9 files changed, 2486 insertions(+), 3293 deletions(-) diff --git a/include/language.h b/include/language.h index 89d744e..ff1bb95 100644 --- a/include/language.h +++ b/include/language.h @@ -24,7 +24,7 @@ Process: } */ -static const char* const myLanguage[22][298] PROGMEM = { +static const char* const myLanguage[22][297] PROGMEM = { { "English", // English "Rotary direction changed", // 1 "Please release button", // 2 @@ -112,16 +112,16 @@ static const char* const myLanguage[22][298] PROGMEM = { "No AF available", // 84 "No EON available", // 85 "No RT+ available", // 86 - "FM default stepsize", // 78 - "Screensaver", // 79 - "Sec", // 80 - "Clock mode", // 81 - "1% brightness", // 82 - "25% brightness", // 83 - "50% brightness", // 84 - "AM RF Level offset", // 85 - "Signalmeter unit", // 86 - "Use AF", // 87 + "FM default stepsize", // 87 + "Screensaver", // 88 + "Sec", // 89 + "Clock mode", // 90 + "1% brightness", // 91 + "25% brightness", // 92 + "50% brightness", // 93 + "AM RF Level offset", // 94 + "Signalmeter unit", // 95 + "Use AF", // 96 "Select FM Band", // 97 "Select AM Band", // 98 "LW", // 99 @@ -226,103 +226,102 @@ static const char* const myLanguage[22][298] PROGMEM = { "Large", // 198 "All", // 199 "Fast PS", // 200 - "Default", // 201 TODO: remove - "Mute screen on\nXDRGTK connection", // 202 - "FMSI stereo\nimprovement", // 203 - "Function only available\non TEF6687/6689!", // 204 - "Function not available\non selected skin!", // 205 - "Begin scanning\nmemory channels", // 206 - "Stop scanning\nmemory channels", // 207 - "Wait time", // 208 - "Start DX scanning", // 209 - "FM DX Options", // 210 - "Abort! The start channel\nis marked as skipped.", // 211 - "Auto sort AF", // 212 - "Memory channels", // 213 - "Exclude", // 214 - "Only", // 215 - "Auto cancel scan", // 216 - "Correct PI", // 217 - "Signal", // 218 - "Mute audio\nwhile scanning", // 219 - "AIR", // 220 - "5 sec. bandbutton press", // 221 - "Power off", // 222 - "Screen off", // 223 - "Disabled", // 224 - "None", // 225 - "News", // 226 - "Current Affairs", // 227 - "Information", // 228 - "Sport", // 229 - "Education", // 230 - "Drama", // 231 - "Culture", // 232 - "Science", // 233 - "Varied", // 234 - "Pop Music", // 235 - "Rock Music", // 236 - "Easy Listening", // 237 - "Light Classical", // 238 - "Serious Classical", // 239 - "Other Music", // 240 - "Weather", // 241 - "Finance", // 242 - "Children's Progs", // 243 - "Social Affairs", // 244 - "Religion", // 245 - "Phone-In", // 246 - "Travel", // 247 - "Leisure", // 248 - "Jazz Music", // 249 - "Country Music", // 250 - "National Music", // 251 - "Oldies Music", // 252 - "Folk Music", // 253 - "Documentary", // 254 - "Alarm Test", // 255 - "Alarm!!!", // 256 - "Initial", // 257 - "Always", // 258 - "Show clock", // 259 - "Show long PS", // 260 - "Start frequency", // 261 - "Stop frequency", // 262 - "Start memory channel", // 263 - "Stop memory channel", // 264 - "Only store with RDS", // 265 - "Start auto memory", // 266 - "Auto memory", // 267 - "Stationlist ID", // 268 - "Found", // 269 - "Abort! Out of memorychannels", // 270 - "Abort! User pressed button", // 271 - "Scan finished without errors", // 272 - "Clear memory channels", // 273 - "cleared", // 274 - "Prevent double PI", // 275 - "Range", // 276 - "Full", // 277 - "Wait time on\nsignal only", // 278 - "Press highlighted corner", // 279 - "To calibrate touchscreen", // 280 - "Hold BW button to\nstop DX scanner", // 281 - "Select Bandwidth", // 282 - "Your logbook", // 283 - "Download logbook", // 284 - "Logbook is empty", // 285 - "Go to bottom", // 286 - "Entry added\nto the logbook", // 287 - "Error adding\nentry to the logbook", // 288 - "Clear logbook", // 289 - "Logbook cleared", // 290 - "Clear failed", // 291 - "Can't add entry!\nLogbook is full!", // 292 - "Autologger", // 293 - "Auto DST on NTP time", // 294 - "Set NTP time offset", // 295 - "The logbook contains over 130 entries, which the viewer cannot process. Please download the CSV file to process it.", // 296 - "Canada" // 297 + "Mute screen on\nXDRGTK connection", // 201 + "FMSI stereo\nimprovement", // 202 + "Function only available\non TEF6687/6689!", // 203 + "Function not available\non selected skin!", // 204 + "Begin scanning\nmemory channels", // 205 + "Stop scanning\nmemory channels", // 206 + "Wait time", // 207 + "Start DX scanning", // 208 + "FM DX Options", // 209 + "Abort! The start channel\nis marked as skipped.", // 210 + "Auto sort AF", // 211 + "Memory channels", // 212 + "Exclude", // 213 + "Only", // 214 + "Auto cancel scan", // 215 + "Correct PI", // 216 + "Signal", // 217 + "Mute audio\nwhile scanning", // 218 + "AIR", // 219 + "5 sec. bandbutton press", // 220 + "Power off", // 221 + "Screen off", // 222 + "Disabled", // 223 + "None", // 224 + "News", // 225 + "Current Affairs", // 226 + "Information", // 227 + "Sport", // 228 + "Education", // 229 + "Drama", // 230 + "Culture", // 231 + "Science", // 232 + "Varied", // 233 + "Pop Music", // 234 + "Rock Music", // 235 + "Easy Listening", // 236 + "Light Classical", // 237 + "Serious Classical", // 238 + "Other Music", // 239 + "Weather", // 240 + "Finance", // 241 + "Children's Progs", // 242 + "Social Affairs", // 243 + "Religion", // 244 + "Phone-In", // 245 + "Travel", // 246 + "Leisure", // 247 + "Jazz Music", // 248 + "Country Music", // 249 + "National Music", // 250 + "Oldies Music", // 251 + "Folk Music", // 252 + "Documentary", // 253 + "Alarm Test", // 254 + "Alarm!!!", // 255 + "Initial", // 256 + "Always", // 257 + "Show clock", // 258 + "Show long PS", // 259 + "Start frequency", // 260 + "Stop frequency", // 261 + "Start memory channel", // 262 + "Stop memory channel", // 263 + "Only store with RDS", // 264 + "Start auto memory", // 265 + "Auto memory", // 266 + "Stationlist ID", // 267 + "Found", // 268 + "Abort! Out of memorychannels", // 269 + "Abort! User pressed button", // 270 + "Scan finished without errors", // 271 + "Clear memory channels", // 272 + "cleared", // 273 + "Prevent double PI", // 274 + "Range", // 275 + "Full", // 276 + "Wait time on\nsignal only", // 277 + "Press highlighted corner", // 278 + "To calibrate touchscreen", // 279 + "Hold BW button to\nstop DX scanner", // 280 + "Select Bandwidth", // 281 + "Your logbook", // 282 + "Download logbook", // 283 + "Logbook is empty", // 284 + "Go to bottom", // 285 + "Entry added\nto the logbook", // 286 + "Error adding\nentry to the logbook", // 287 + "Clear logbook", // 288 + "Logbook cleared", // 289 + "Clear failed", // 290 + "Can't add entry!\nLogbook is full!", // 291 + "Autologger", // 292 + "Auto DST on NTP time", // 293 + "Set NTP time offset", // 294 + "The logbook contains over 130 entries, which the viewer cannot process. Please download the CSV file to process it.", // 295 + "Canada" // 296 }, { "Nederlands", // Dutch @@ -526,103 +525,102 @@ static const char* const myLanguage[22][298] PROGMEM = { "Middel", // 198 "Alles", // 199 "Snelle PS", // 200 - "Standaard", // 201 - "Scherm uit bij\nXDRGTK verbinding", // 202 - "FMSI stereo\nverbetering", // 203 - "Alleen beschikbaar op\nTEF6687/6689!", // 204 - "Niet beschikbaar op\ngekozen uiterlijk!", // 205 - "Begin zoeken\ngeheugenkanaal", // 206 - "Eind zoeken\ngeheugenkanaal", // 207 - "Wachttijd", // 208 - "Start DX zoeken", // 209 - "FM DX Opties", // 210 - "Fout! Startkanaal is\ngemarkeerd als skip", // 211 - "Auto AF sorteren", // 212 - "Geheugenkanalen", // 213 - "Uitsluiten", // 214 - "Enkel", // 215 - "Auto afbreken", // 216 - "Correcte PI", // 217 - "Signaal", // 218 - "Geen geluid\ntijdens scannen", // 219 - "AIR", // 220 - "5 sec.\nbandbutton ingedrukt", // 221 - "Uitschakelen", // 222 - "Scherm uit", // 223 - "Geen functie", // 224 - "Niet gedefinieerd", // 225 - "Nieuws", // 226 - "Actualiteit", // 227 - "Informatie", // 228 - "Sport", // 229 - "Educatie", // 230 - "Drama", // 231 - "Cultuur", // 232 - "Wetenschap", // 233 - "Varia", // 234 - "Popmuziek", // 235 - "Rockmuziek", // 236 - "Melodie", // 237 - "Licht klassiek", // 238 - "Klassieke muziek", // 239 - "Muziek", // 240 - "Het weer", // 241 - "Economie", // 242 - "Voor kinderen", // 243 - "Maatschappelijk", // 244 - "Religie", // 245 - "Doe mee !", // 246 - "Reizen", // 247 - "Vrije tijd", // 248 - "Jazz", // 249 - "Countrymuziek", // 250 - "Nationale muziek", // 251 - "Gouwe ouwe", // 252 - "Volksmuziek", // 253 - "Documentaires", // 254 - "Alarmtest", // 255 - "Alarm ! ALARM !", // 256 - "Initieel", // 257 - "Altijd", // 258 - "Toon klok", // 259 - "Toon long PS", // 260 - "Start frequentie", // 261 - "Stop frequentie", // 262 - "Start geheugen\nkanaal", // 263 - "Stop geheugen\nkanaal", // 264 - "Alleen met\nRDS opslaan", // 265 - "Start auto\ngeheugen kanaal", // 266 - "Auto geheugen kanaal", // 267 - "Stationlist ID", // 268 - "Gevonden", // 269 - "Afgebroken! Geheugen vol", // 270 - "Afgebroken! Knop ingedrukt", // 271 - "Zoeken zonder fouten voltooid", // 272 - "Wis geheugenkanalen", // 273 - "gewist", // 274 - "Voorkom dubbele PI", // 275 - "Bereik", // 276 - "Volledig", // 277 - "Wachttijd alleen\nbij signaal", // 278 - "Druk op aangegeven hoeken", // 279 - "om scherm te calibreren", // 280 - "Houdt BW knop lang\ningedrukt om te stoppen", // 281 - "Selecteer bandbreedte", // 282 - "Jouw logboek", // 283 - "Download logboek", // 284 - "Logboek is leeg", // 285 - "Ga naar einde", // 286 - "Toegevoegd aan\nhet logboek", // 287 - "Toevoegen aan\nlogboek mislukt!", // 288 - "Logboek legen", // 289 - "Logboek geleegd", // 290 - "Legen mislukt", // 291 - "Toevoegen mislukt!\nLogboek is vol!", // 292 - "Automatisch loggen", // 293 - "Auto zomertijd\nop NTP tijd", // 294 - "NTP tijdverschil\ninstellen", // 295 - "Het logboek bevat meer dan 130 items, die de viewer niet kan verwerken. Download alstublieft het CSV-bestand om het te bekijken.", // 296 - "Canada" // 297 + "Scherm uit bij\nXDRGTK verbinding", // 201 + "FMSI stereo\nverbetering", // 202 + "Alleen beschikbaar op\nTEF6687/6689!", // 203 + "Niet beschikbaar op\ngekozen uiterlijk!", // 204 + "Begin zoeken\ngeheugenkanaal", // 205 + "Eind zoeken\ngeheugenkanaal", // 206 + "Wachttijd", // 207 + "Start DX zoeken", // 208 + "FM DX Opties", // 209 + "Fout! Startkanaal is\ngemarkeerd als skip", // 210 + "Auto AF sorteren", // 211 + "Geheugenkanalen", // 212 + "Uitsluiten", // 213 + "Enkel", // 214 + "Auto afbreken", // 215 + "Correcte PI", // 216 + "Signaal", // 217 + "Geen geluid\ntijdens scannen", // 218 + "AIR", // 219 + "5 sec.\nbandbutton ingedrukt", // 220 + "Uitschakelen", // 221 + "Scherm uit", // 222 + "Geen functie", // 223 + "Niet gedefinieerd", // 224 + "Nieuws", // 225 + "Actualiteit", // 226 + "Informatie", // 227 + "Sport", // 228 + "Educatie", // 229 + "Drama", // 230 + "Cultuur", // 231 + "Wetenschap", // 232 + "Varia", // 233 + "Popmuziek", // 234 + "Rockmuziek", // 235 + "Melodie", // 236 + "Licht klassiek", // 237 + "Klassieke muziek", // 238 + "Muziek", // 239 + "Het weer", // 240 + "Economie", // 241 + "Voor kinderen", // 242 + "Maatschappelijk", // 243 + "Religie", // 244 + "Doe mee !", // 245 + "Reizen", // 246 + "Vrije tijd", // 247 + "Jazz", // 248 + "Countrymuziek", // 249 + "Nationale muziek", // 250 + "Gouwe ouwe", // 251 + "Volksmuziek", // 252 + "Documentaires", // 253 + "Alarmtest", // 254 + "Alarm ! ALARM !", // 255 + "Initieel", // 256 + "Altijd", // 257 + "Toon klok", // 258 + "Toon long PS", // 259 + "Start frequentie", // 260 + "Stop frequentie", // 261 + "Start geheugen\nkanaal", // 262 + "Stop geheugen\nkanaal", // 263 + "Alleen met\nRDS opslaan", // 264 + "Start auto\ngeheugen kanaal", // 265 + "Auto geheugen kanaal", // 266 + "Stationlist ID", // 267 + "Gevonden", // 268 + "Afgebroken! Geheugen vol", // 269 + "Afgebroken! Knop ingedrukt", // 270 + "Zoeken zonder fouten voltooid", // 271 + "Wis geheugenkanalen", // 272 + "gewist", // 273 + "Voorkom dubbele PI", // 274 + "Bereik", // 275 + "Volledig", // 276 + "Wachttijd alleen\nbij signaal", // 277 + "Druk op aangegeven hoeken", // 278 + "om scherm te calibreren", // 279 + "Houdt BW knop lang\ningedrukt om te stoppen", // 280 + "Selecteer bandbreedte", // 281 + "Jouw logboek", // 282 + "Download logboek", // 283 + "Logboek is leeg", // 284 + "Ga naar einde", // 285 + "Toegevoegd aan\nhet logboek", // 286 + "Toevoegen aan\nlogboek mislukt!", // 287 + "Logboek legen", // 288 + "Logboek geleegd", // 289 + "Legen mislukt", // 290 + "Toevoegen mislukt!\nLogboek is vol!", // 291 + "Automatisch loggen", // 292 + "Auto zomertijd\nop NTP tijd", // 293 + "NTP tijdverschil\ninstellen", // 294 + "Het logboek bevat meer dan 130 items, die de viewer niet kan verwerken. Download alstublieft het CSV-bestand om het te bekijken.", // 295 + "Canada" // 296 }, { "Polski", // Polish @@ -826,103 +824,102 @@ static const char* const myLanguage[22][298] PROGMEM = { "Duże", // 198 "Wszystkie", // 199 "Szybki PS", // 200 - "Domyslny", // 201 - "Wylacz ekran gdy\npołączony z XDR-GTK", // 202 - "Ulepszenie \nstereo FMSI", // 203 - "Funkcja dostępna tylko\nna TEF6687/6689!", // 204 - "Funkcja niedostępna\nz wybranym motywem!", // 205 - "Rozpocznij skanowanie\nkanałów pamięci", // 206 - "Zatrzymaj skanowanie\nkanałów pamięci", // 207 - "Czas oczekiwania", // 208 - "Rozpocznij skanowanie DX", // 209 - "Opcje FM DX", // 210 - "Błąd! Początkowy kanał\njest pominięty.", // 211 - "Automat. sortowanie AF", // 212 - "Kanały pamięci", // 213 - "Wyklucz", // 214 - "Uwzględnij", // 215 - "Automatyczne\nanulowanie skanowania", // 216 - "Poprawne PI", // 217 - "Sygnał", // 218 - "Wycisz dźwięk\npodczas skanowania", // 219 - "AIR", // 220 - "5 sek. naciśnięcie przyc. BAND", // 221 - "Wyłącz", // 222 - "Wyłącz ekran", // 223 - "Wyłączone", // 224 - "Niezdefiniowany", // 225 - "Wiadomości", // 226 - "Sprawy bieżące", // 227 - "Informacje", // 228 - "Sport", // 229 - "Edukacja", // 230 - "Dramat", // 231 - "Kultura", // 232 - "Nauka", // 233 - "Różne", // 234 - "Muzyka Popowa", // 235 - "Muzyka Rockowa", // 236 - "Muzyka lekka", // 237 - "Lekka muz. klas.", // 238 - "Muz. klas. pow.", // 239 - "Inna muzyka", // 240 - "Pogoda", // 241 - "Finanse", // 242 - "Prog. dla dzieci", // 243 - "Sprawy społeczne", // 244 - "Religia", // 245 - "Telefon.Udział.", // 246 - "Podróże", // 247 - "Czas wolny", // 248 - "Muzyka Jazz", // 249 - "Muzyka Country", // 250 - "Muzyka narodowa", // 251 - "Stare przeboje", // 252 - "Muzyka ludowa", // 253 - "Dokument", // 254 - "Alarm Test", // 255 - "Alarm", // 256 - "Na start", // 257 - "Zawsze", // 258 - "Pokaż zegar", // 259 - "Pokaż długi PS", // 260 - "Częstotliwość początkowa", // 261 - "Częstotliwość końcowa", // 262 - "Początkowy kanał pamięci", // 263 - "Końcowy kanał pamięci", // 264 - "Zapisuj tylko z RDS", // 265 - "Rozpocznij auto zapamiętywanie", // 266 - "Auto zapamiętywanie", // 267 - "Identyfikator Stationlist", // 268 - "Znaleziono", // 269 - "Przerywam! Brak wolnych kanałów", // 270 - "Przerywam! Naciśnięto przycisk", // 271 - "Skanowanie zakończone pomyślnie", // 272 - "Wyczyść kanały pamięci", // 273 - "wyczyszczono", // 274 - "Unikaj podwójnego PI", // 275 - "Zakres", // 276 - "Pełne", // 277 - "Czekaj tylko gdy\nwykryto stację", // 278 - "Naciśnij zaznaczony róg", // 279 - "Aby skalibrować ekran", // 280 - "Aby zatrzymać,\nprzytrzymaj przycisk BW", // 281 - "Wybierz szer. pasma", // 282 - "Twój wykaz", // 283 - "Pobierz wykaz", // 284 - "Wykaz jest pusty", // 285 - "Przejdź na dół", // 286 - "Dodano do wykazu", // 287 - "Bład aktualizacji!", // 288 - "Wyczyść wykaz", // 289 - "Wykaz wyczyszczony", // 290 - "Błąd wyczyszczenia", // 291 - "Wykaz pełny!", // 292 - "Autologowanie stacji", // 293 - "Auto czas letni wg NTP", // 294 - "Ustaw odchyl. czasu NTP", // 295 - "Wykaz zawiera ponad 130 wpisów, których przeglądarka nie może pokazać. Pobierz plik CSV, aby je przetworzyć.", // 296 - "Kanada" // 297 + "Wylacz ekran gdy\npołączony z XDR-GTK", // 201 + "Ulepszenie \nstereo FMSI", // 202 + "Funkcja dostępna tylko\nna TEF6687/6689!", // 203 + "Funkcja niedostępna\nz wybranym motywem!", // 204 + "Rozpocznij skanowanie\nkanałów pamięci", // 205 + "Zatrzymaj skanowanie\nkanałów pamięci", // 206 + "Czas oczekiwania", // 207 + "Rozpocznij skanowanie DX", // 208 + "Opcje FM DX", // 209 + "Błąd! Początkowy kanał\njest pominięty.", // 210 + "Automat. sortowanie AF", // 211 + "Kanały pamięci", // 212 + "Wyklucz", // 213 + "Uwzględnij", // 214 + "Automatyczne\nanulowanie skanowania", // 215 + "Poprawne PI", // 216 + "Sygnał", // 217 + "Wycisz dźwięk\npodczas skanowania", // 218 + "AIR", // 219 + "5 sek. naciśnięcie przyc. BAND", // 220 + "Wyłącz", // 221 + "Wyłącz ekran", // 222 + "Wyłączone", // 223 + "Niezdefiniowany", // 224 + "Wiadomości", // 225 + "Sprawy bieżące", // 226 + "Informacje", // 227 + "Sport", // 228 + "Edukacja", // 229 + "Dramat", // 230 + "Kultura", // 231 + "Nauka", // 232 + "Różne", // 233 + "Muzyka Popowa", // 234 + "Muzyka Rockowa", // 235 + "Muzyka lekka", // 236 + "Lekka muz. klas.", // 237 + "Muz. klas. pow.", // 238 + "Inna muzyka", // 239 + "Pogoda", // 240 + "Finanse", // 241 + "Prog. dla dzieci", // 242 + "Sprawy społeczne", // 243 + "Religia", // 244 + "Telefon.Udział.", // 245 + "Podróże", // 246 + "Czas wolny", // 247 + "Muzyka Jazz", // 248 + "Muzyka Country", // 249 + "Muzyka narodowa", // 250 + "Stare przeboje", // 251 + "Muzyka ludowa", // 252 + "Dokument", // 253 + "Alarm Test", // 254 + "Alarm", // 255 + "Na start", // 256 + "Zawsze", // 257 + "Pokaż zegar", // 258 + "Pokaż długi PS", // 259 + "Częstotliwość początkowa", // 260 + "Częstotliwość końcowa", // 261 + "Początkowy kanał pamięci", // 262 + "Końcowy kanał pamięci", // 263 + "Zapisuj tylko z RDS", // 264 + "Rozpocznij auto zapamiętywanie", // 265 + "Auto zapamiętywanie", // 266 + "Identyfikator Stationlist", // 267 + "Znaleziono", // 268 + "Przerywam! Brak wolnych kanałów", // 269 + "Przerywam! Naciśnięto przycisk", // 270 + "Skanowanie zakończone pomyślnie", // 271 + "Wyczyść kanały pamięci", // 272 + "wyczyszczono", // 273 + "Unikaj podwójnego PI", // 274 + "Zakres", // 275 + "Pełne", // 276 + "Czekaj tylko gdy\nwykryto stację", // 277 + "Naciśnij zaznaczony róg", // 278 + "Aby skalibrować ekran", // 279 + "Aby zatrzymać,\nprzytrzymaj przycisk BW", // 280 + "Wybierz szer. pasma", // 281 + "Twój wykaz", // 282 + "Pobierz wykaz", // 283 + "Wykaz jest pusty", // 284 + "Przejdź na dół", // 285 + "Dodano do wykazu", // 286 + "Bład aktualizacji!", // 287 + "Wyczyść wykaz", // 288 + "Wykaz wyczyszczony", // 289 + "Błąd wyczyszczenia", // 290 + "Wykaz pełny!", // 291 + "Autologowanie stacji", // 292 + "Auto czas letni wg NTP", // 293 + "Ustaw odchyl. czasu NTP", // 294 + "Wykaz zawiera ponad 130 wpisów, których przeglądarka nie może pokazać. Pobierz plik CSV, aby je przetworzyć.", // 295 + "Kanada" // 296 }, { "Hrvatski", // Croatian @@ -1126,103 +1123,102 @@ static const char* const myLanguage[22][298] PROGMEM = { "Veliko", // 198 "Sve", // 199 "Brzi PS", // 200 - "Zadano", // 201 - "Isključi zaslon\ntijekom veze XDRGTK-om", // 202 - "Poboljšanje\nFMSI stereo-a", // 203 - "Funkcija dostupna samo\nna TEF6687/6689!", // 204 - "Funkcija nije dostupna\na odabranoj temi dizajna!", // 205 - "Pokreni skeniranje\nmemorijskih kanala", // 206 - "Zaustavi skeniranje\nmemorijskih kanala", // 207 - "Vrijeme čekanja", // 208 - "Pokreni DX skeniranje", // 209 - "FM DX opcije", // 210 - "Prekid! Početni kanal je\noznačen kao preskočen.", // 211 - "Autom. sortiranje AF-a", // 212 - "Memorijski kanali", // 213 - "Isključeno", // 214 - "Samo", // 215 - "Autom. otkazivanje skeniranja", // 216 - "Točan PI", // 217 - "Signal", // 218 - "Isključi zvuk\ntijekom skeniranja", // 219 - "AIR", // 220 - "Pritisnite tipku band 5 sekundi", // 221 - "Isključivanje", // 222 - "Isključi zaslon", // 223 - "Onemogućeno", // 224 - "Neodređeno", // 225 - "Vijesti", // 226 - "Aktualno", // 227 - "Obavijesti", // 228 - "Sport", // 229 - "Obrazovanje", // 230 - "Drama", // 231 - "Kultura", // 232 - "Znanost", // 233 - "Razno", // 234 - "Pop glazba", // 235 - "Rock glazba", // 236 - "Zabavna glazba", // 237 - "Lagana klasična", // 238 - "Ozbiljna glazba", // 239 - "Ostala glazba", // 240 - "Vrijeme", // 241 - "Financije", // 242 - "Dječji program", // 243 - "Društvena događ", // 244 - "Religija", // 245 - "Kontakt program", // 246 - "Putovanja", // 247 - "Slobodno vrijeme", // 248 - "Jazz glazba", // 249 - "Country glazba", // 250 - "Domaća glazba", // 251 - "Stari hitovi", // 252 - "Narodna glazba", // 253 - "Dokumentarno", // 254 - "Testni alarm!", // 255 - "Alarm !", // 256 - "Početno", // 257 - "Uvijek", // 258 - "Prikaži sat", // 259 - "Prikaži dugi PS", // 260 - "Početna frekvencija", // 261 - "Završna frekvencija", // 262 - "Početni memorijski kanal", // 263 - "Završni memorijski kanal", // 264 - "Samo spremi s RDS-om", // 265 - "Pokreni autom. memoriju", // 266 - "Autom. memorija", // 267 - "ID StationList", // 268 - "Pronađeno", // 269 - "Prekid! Nema memorijskih kanala", // 270 - "Prekid! Korisnik je pritisnuo gumb", // 271 - "Skeniranje završeno bez grešaka", // 272 - "Očisti memorijske kanale", // 273 - "Očišćeno", // 274 - "Spriječi dupli PI", // 275 - "Raspon", // 276 - "Puno", // 277 - "Vrijeme čekanja na\nsignal samo", // 278 - "Pritisnite istaknuti kut", // 279 - "Za kalibraciju zaslona osjetljivog na dodir", // 280 - "Držite BW gumb za\nzaustavljanje DX skenera", // 281 - "Odabir širine pojasa", // 282 - "Vaš dnevnik", // 283 - "Preuzmi dnevnik", // 284 - "Dnevnik je prazan", // 285 - "Idi na dno", // 286 - "Unos dodan u dnevnik", // 287 - "Greška pri dodavanju unosa u dnevnik", // 288 - "Očisti dnevnik", // 289 - "Dnevnik očišćen", // 290 - "Čišćenje nije uspjelo", // 291 - "Ne mogu dodati unos!\nDnevnik je pun!", // 292 - "Autologger", // 293 - "Auto DST na NTP vremenu", // 294 - "Postavi NTP pomak vremena", // 295 - "Dnevnik sadrži preko 130 unosa, koje preglednik ne može obraditi. Preuzmite CSV datoteku za obradu.", // 296 - "Canada" // 297 + "Isključi zaslon\ntijekom veze XDRGTK-om", // 201 + "Poboljšanje\nFMSI stereo-a", // 202 + "Funkcija dostupna samo\nna TEF6687/6689!", // 203 + "Funkcija nije dostupna\na odabranoj temi dizajna!", // 204 + "Pokreni skeniranje\nmemorijskih kanala", // 205 + "Zaustavi skeniranje\nmemorijskih kanala", // 206 + "Vrijeme čekanja", // 207 + "Pokreni DX skeniranje", // 208 + "FM DX opcije", // 209 + "Prekid! Početni kanal je\noznačen kao preskočen.", // 210 + "Autom. sortiranje AF-a", // 211 + "Memorijski kanali", // 212 + "Isključeno", // 213 + "Samo", // 214 + "Autom. otkazivanje skeniranja", // 215 + "Točan PI", // 216 + "Signal", // 217 + "Isključi zvuk\ntijekom skeniranja", // 218 + "AIR", // 219 + "Pritisnite tipku band 5 sekundi", // 220 + "Isključivanje", // 221 + "Isključi zaslon", // 222 + "Onemogućeno", // 223 + "Neodređeno", // 224 + "Vijesti", // 225 + "Aktualno", // 226 + "Obavijesti", // 227 + "Sport", // 228 + "Obrazovanje", // 229 + "Drama", // 230 + "Kultura", // 231 + "Znanost", // 232 + "Razno", // 233 + "Pop glazba", // 234 + "Rock glazba", // 235 + "Zabavna glazba", // 236 + "Lagana klasična", // 237 + "Ozbiljna glazba", // 238 + "Ostala glazba", // 239 + "Vrijeme", // 240 + "Financije", // 241 + "Dječji program", // 242 + "Društvena događ", // 243 + "Religija", // 244 + "Kontakt program", // 245 + "Putovanja", // 246 + "Slobodno vrijeme", // 247 + "Jazz glazba", // 248 + "Country glazba", // 249 + "Domaća glazba", // 250 + "Stari hitovi", // 251 + "Narodna glazba", // 252 + "Dokumentarno", // 253 + "Testni alarm!", // 254 + "Alarm !", // 255 + "Početno", // 256 + "Uvijek", // 257 + "Prikaži sat", // 258 + "Prikaži dugi PS", // 259 + "Početna frekvencija", // 260 + "Završna frekvencija", // 261 + "Početni memorijski kanal", // 262 + "Završni memorijski kanal", // 263 + "Samo spremi s RDS-om", // 264 + "Pokreni autom. memoriju", // 265 + "Autom. memorija", // 266 + "ID StationList", // 267 + "Pronađeno", // 268 + "Prekid! Nema memorijskih kanala", // 269 + "Prekid! Korisnik je pritisnuo gumb", // 270 + "Skeniranje završeno bez grešaka", // 271 + "Očisti memorijske kanale", // 272 + "Očišćeno", // 273 + "Spriječi dupli PI", // 274 + "Raspon", // 275 + "Puno", // 276 + "Vrijeme čekanja na\nsignal samo", // 277 + "Pritisnite istaknuti kut", // 278 + "Za kalibraciju zaslona osjetljivog na dodir", // 279 + "Držite BW gumb za\nzaustavljanje DX skenera", // 280 + "Odabir širine pojasa", // 281 + "Vaš dnevnik", // 282 + "Preuzmi dnevnik", // 283 + "Dnevnik je prazan", // 284 + "Idi na dno", // 285 + "Unos dodan u dnevnik", // 286 + "Greška pri dodavanju unosa u dnevnik", // 287 + "Očisti dnevnik", // 288 + "Dnevnik očišćen", // 289 + "Čišćenje nije uspjelo", // 290 + "Ne mogu dodati unos!\nDnevnik je pun!", // 291 + "Autologger", // 292 + "Auto DST na NTP vremenu", // 293 + "Postavi NTP pomak vremena", // 294 + "Dnevnik sadrži preko 130 unosa, koje preglednik ne može obraditi. Preuzmite CSV datoteku za obradu.", // 295 + "Canada" // 296 }, { "Ελληνικά", // Greek @@ -1426,103 +1422,102 @@ static const char* const myLanguage[22][298] PROGMEM = { "Μεγάλο", // 198 "Όλα", // 199 "Γρήγορο PS", // 200 - "Προεπιλογή", // 201 - "Μαύρη οθόνη σε\nσύνδεση XDRGTK", // 202 - "FMSI βελτίωση\nήχου στέρεο", // 203 - "Λειτουργία διαθέσιμη\nμόνο στα TEF6687/6689!", // 204 - "Λειτουργία μη διαθέσιμη\nσε αυτή την εμφάνιση!", // 205 - "Εκκίνηση ανίχνευσης\nκαναλιών μνήμης", // 206 - "Διακοπή ανίχνευσης\nκαναλιών μνήμης", // 207 - "Χρόνος αναμονής", // 208 - "Εκκίνηση DX ανίχνευσης", // 209 - "Επιλογές FM DX", // 210 - "Ματαίωση! Λείπει\nτο κανάλι εκκίνησης.", // 211 - "Αυτόματη ταξινόμηση\nAF", // 212 - "Κανάλια μνήμης", // 213 - "Εξαίρεση", // 214 - "Μόνο", // 215 - "Αυτόματη ακύρωση\nανίχνευσης", // 216 - "Σωστό PI", // 217 - "Σήμα", // 218 - "Σίγαση ήχου\nκατά την ανίχνευση", // 219 - "AIR", // 220 - "Πιέση πλήκτρου\nμπάντας 5 δευτ.", // 221 - "Σβήσιμο", // 222 - "Σβήσιμο οθόνης", // 223 - "Ανενεργό", // 224 - "Κανένα", // 225 - "Ειδήσεις", // 226 - "Επικαιρότητα", // 227 - "Πληροφόρηση", // 228 - "Σπορ", // 229 - "Εκπαίδευση", // 230 - "Δράμα", // 231 - "Πολιτισμός", // 232 - "Επιστήμη", // 233 - "Ποικίλο", // 234 - "Ποπ μουσική", // 235 - "Ροκ μουσική", // 236 - "Εύκολη ακρόαση", // 237 - "Ελαφρά κλασική", // 238 - "Σοβαρή κλασική", // 239 - "Άλλη μουσική", // 240 - "Καιρός", // 241 - "Οικονομικά", // 242 - "Παιδικό πρόγραμμα", // 243 - "Κοινωνικά", // 244 - "Θρησκεία", // 245 - "Τηλεφωνικά", // 246 - "Ταξίδια", // 247 - "Ελεύθερος χρόνος", // 248 - "Τζαζ μουσική", // 249 - "Κάντρι μουσική", // 250 - "Εθνική μουσική", // 251 - "Παλαιές επιτυχίες", // 252 - "Παραδοσιακή μουσική", // 253 - "Ντοκιμαντέρ", // 254 - "Δοκιμή συναγερμού", // 255 - "Συναγερμός!!!", // 256 - "Αρχικό", // 257 + "Μαύρη οθόνη σε\nσύνδεση XDRGTK", // 201 + "FMSI βελτίωση\nήχου στέρεο", // 202 + "Λειτουργία διαθέσιμη\nμόνο στα TEF6687/6689!", // 203 + "Λειτουργία μη διαθέσιμη\nσε αυτή την εμφάνιση!", // 204 + "Εκκίνηση ανίχνευσης\nκαναλιών μνήμης", // 205 + "Διακοπή ανίχνευσης\nκαναλιών μνήμης", // 206 + "Χρόνος αναμονής", // 207 + "Εκκίνηση DX ανίχνευσης", // 208 + "Επιλογές FM DX", // 209 + "Ματαίωση! Λείπει\nτο κανάλι εκκίνησης.", // 210 + "Αυτόματη ταξινόμηση\nAF", // 211 + "Κανάλια μνήμης", // 212 + "Εξαίρεση", // 213 + "Μόνο", // 214 + "Αυτόματη ακύρωση\nανίχνευσης", // 215 + "Σωστό PI", // 216 + "Σήμα", // 217 + "Σίγαση ήχου\nκατά την ανίχνευση", // 218 + "AIR", // 219 + "Πιέση πλήκτρου\nμπάντας 5 δευτ.", // 220 + "Σβήσιμο", // 221 + "Σβήσιμο οθόνης", // 222 + "Ανενεργό", // 223 + "Κανένα", // 224 + "Ειδήσεις", // 225 + "Επικαιρότητα", // 226 + "Πληροφόρηση", // 227 + "Σπορ", // 228 + "Εκπαίδευση", // 229 + "Δράμα", // 230 + "Πολιτισμός", // 231 + "Επιστήμη", // 232 + "Ποικίλο", // 233 + "Ποπ μουσική", // 234 + "Ροκ μουσική", // 235 + "Εύκολη ακρόαση", // 236 + "Ελαφρά κλασική", // 237 + "Σοβαρή κλασική", // 238 + "Άλλη μουσική", // 239 + "Καιρός", // 240 + "Οικονομικά", // 241 + "Παιδικό πρόγραμμα", // 242 + "Κοινωνικά", // 243 + "Θρησκεία", // 244 + "Τηλεφωνικά", // 245 + "Ταξίδια", // 246 + "Ελεύθερος χρόνος", // 247 + "Τζαζ μουσική", // 248 + "Κάντρι μουσική", // 249 + "Εθνική μουσική", // 250 + "Παλαιές επιτυχίες", // 251 + "Παραδοσιακή μουσική", // 252 + "Ντοκιμαντέρ", // 253 + "Δοκιμή συναγερμού", // 254 + "Συναγερμός!!!", // 255 + "Αρχικό", // 256 "Πάντα", //261 - "Εμφάνιση ρολογιού", // 259 - "Εμφάνιση μεγάλου PS", // 260 - "Συχνότητα εκκίνησης", // 261 - "Τελική συχνότητα", // 262 - "Αρχικό κανάλι μνήμης", // 263 - "Τελικό κανάλι μνήμης", // 264 - "Αποθήκευση μόνο\nμε RDS", // 265 - "Εκκίνηση\nαυτόματης μνήμης", // 266 - "Αυτόματη μνήμη", // 267 - "ID λίστας σταθμών", // 268 - "Βρέθηκαν", // 269 - "Ματαίωση! Τα κανάλια\nμνήμης εξαντλήθηκαν", // 270 - "Ματαίωση! Πιέση\nπλήκτρου χρήστη", // 271 - "Η ανίχνευση ολοκληρώθηκε\nχωρίς σφάλματα", // 272 - "Εκκαθάριση\nκαναλιών μνήμης", // 273 - "έγινε εκκαθάριση", // 274 - "Αποφυγή διπλού PI", // 275 - "Εύρος", // 276 - "Πλήρης", // 277 - "Αναμονή μόνο σε\nυπάρξη σήματος", // 278 - "Πιέστε την επισημασμένη\nγωνία για βαθμονόμηση", // 279 - "της οθόνης αφής", // 280 - "Κρατήστε το BW για\nδιακοπή της DX σάρωσης", // 281 - "Επιλογή εύρους μπάντας", // 282 - "Το βιβλίο καταγραφών σας", // 283 - "Λήψη βιβλίου καταγραφών", // 284 - "Το βιβλίο καταγραφών είναι άδειο", // 285 - "Μετάβαση στον πάτο", // 286 - "Προστέθηκε\nστις καταγραφές", // 287 - "Σφάλμα προσθήκης\nστις καταγραφές", // 288 - "Εκκαθάριση βιβλίου\nκαταγραφών", // 289 - "Εκκαθαρίστηκε", // 290 - "Αποτυχία εκκαθάρισης", // 291 - "Αδυναμία προσθήκης!\nΒιβλίο γεμάτο!", // 292 - "Αυτόματη καταγραφή", // 293 - "Αυτόματο DST\nσε ώρα NTP", // 294 - "Ολίσθηση ώρας NTP", // 295 - "Το βιβλίο περιέχει πάνω από 130 καταγραφές, και είναι αδύνατη η επεξεργασία τους από το χρήστη. Κάντε λήψη του αρχείου CSV για να το επεξεργαστείτε.", // 296 - "Καναδάς" // 297 + "Εμφάνιση ρολογιού", // 258 + "Εμφάνιση μεγάλου PS", // 259 + "Συχνότητα εκκίνησης", // 260 + "Τελική συχνότητα", // 261 + "Αρχικό κανάλι μνήμης", // 262 + "Τελικό κανάλι μνήμης", // 263 + "Αποθήκευση μόνο\nμε RDS", // 264 + "Εκκίνηση\nαυτόματης μνήμης", // 265 + "Αυτόματη μνήμη", // 266 + "ID λίστας σταθμών", // 267 + "Βρέθηκαν", // 268 + "Ματαίωση! Τα κανάλια\nμνήμης εξαντλήθηκαν", // 269 + "Ματαίωση! Πιέση\nπλήκτρου χρήστη", // 270 + "Η ανίχνευση ολοκληρώθηκε\nχωρίς σφάλματα", // 271 + "Εκκαθάριση\nκαναλιών μνήμης", // 272 + "έγινε εκκαθάριση", // 273 + "Αποφυγή διπλού PI", // 274 + "Εύρος", // 275 + "Πλήρης", // 276 + "Αναμονή μόνο σε\nυπάρξη σήματος", // 277 + "Πιέστε την επισημασμένη\nγωνία για βαθμονόμηση", // 278 + "της οθόνης αφής", // 279 + "Κρατήστε το BW για\nδιακοπή της DX σάρωσης", // 280 + "Επιλογή εύρους μπάντας", // 281 + "Το βιβλίο καταγραφών σας", // 282 + "Λήψη βιβλίου καταγραφών", // 283 + "Το βιβλίο καταγραφών είναι άδειο", // 284 + "Μετάβαση στον πάτο", // 285 + "Προστέθηκε\nστις καταγραφές", // 286 + "Σφάλμα προσθήκης\nστις καταγραφές", // 287 + "Εκκαθάριση βιβλίου\nκαταγραφών", // 288 + "Εκκαθαρίστηκε", // 289 + "Αποτυχία εκκαθάρισης", // 290 + "Αδυναμία προσθήκης!\nΒιβλίο γεμάτο!", // 291 + "Αυτόματη καταγραφή", // 292 + "Αυτόματο DST\nσε ώρα NTP", // 293 + "Ολίσθηση ώρας NTP", // 294 + "Το βιβλίο περιέχει πάνω από 130 καταγραφές, και είναι αδύνατη η επεξεργασία τους από το χρήστη. Κάντε λήψη του αρχείου CSV για να το επεξεργαστείτε.", // 295 + "Καναδάς" // 296 }, { "Română", // Romanian @@ -1726,103 +1721,102 @@ static const char* const myLanguage[22][298] PROGMEM = { "Mare", // 198 "Tot", // 199 "PS rapid", // 200 - "Mod implicit", // 201 - "Ecran oprit, conectat la XDRGTK", // 202 - "FMSI stereo îmbunătățit", // 203 - "Funcție activă doar la\nTEF6687/6689!", // 204 - "Funcție indisponibilă\nla acest skin!", // 205 - "Scanare începută\nmemorare posturi", // 206 - "Scanare terminată\nmemorare posturi", // 207 - "Așteaptă", // 208 - "Începe scanarea DX", // 209 - "FM DX Opțiuni", // 210 - "Terminat! Programul de pornire\neste ignorat.", // 211 - "Sortare automată AF", // 212 - "Memorare programe", // 213 - "Exclude", // 214 - "Doar", // 215 - "Auto oprire scanare", // 216 - "PI corect", // 217 - "Semnal", // 218 - "Audio oprit\ncând scanează", // 219 - "AIR", // 220 - "Apasă 5sec. butonul bandă", // 221 - "Oprit", // 222 - "Ecran oprit", // 223 - "Dezactivat", // 224 - "Nedefinit", // 225 - "Știri", // 226 - "Actualități", // 227 - "Informații", // 228 - "Sport", // 229 - "Educație", // 230 - "Teatru", // 231 - "Cultură", // 232 - "Știință", // 233 - "Varietăți", // 234 - "Muzică pop", // 235 - "Muzică rock", // 236 - "Muzică ușoară", // 237 - "Clasic Lejer", // 238 - "Muzică Clasică", // 239 - "Altă Muzică", // 240 - "Meteo", // 241 - "Finanțe", // 242 - "Copii", // 243 - "Social", // 244 - "Religie", // 245 - "Phone-In", // 246 - "Călătorii", // 247 - "Timp Liber", // 248 - "Muzică de Jazz", // 249 - "Muzică Country", // 250 - "Muzică Națională", // 251 - "Muzica Retro", // 252 - "Muzică Populară", // 253 - "Documentar", // 254 - "Test Alarmă", // 255 - "Alarmă!!!", // 256 - "Inițial", // 257 - "Mereu", // 258 - "Arată ceasul", // 259 - "Arată PS lung", // 260 - "Frecvență de început", // 261 - "Frecvență de oprire", // 262 - "Canal de memorie de început", // 263 - "Canal de memorie de oprire", // 264 - "Stochează doar cu RDS", // 265 - "Începe memoria automată", // 266 - "Memorie automată", // 267 - "Listă ID posturi", // 268 - "Găsit", // 269 - "Anulat! Memoria canalelor este plină", // 270 - "Anulat! Utilizatorul a apăsat un buton", // 271 - "Scanarea s-a terminat fără erori", // 272 - "Șterge canalele de memorie", // 273 - "Șters", // 274 - "Previne dublarea PI", // 275 - "Interval", // 276 - "Complet", // 277 - "Timp de așteptare doar\npe semnal", // 278 - "Apasă colțul evidențiat", // 279 - "Pentru calibrarea ecranului tactil", // 280 - "Ține apăsat BW pentru\noprirea scannerului DX", // 281 - "Selectează lățimea de bandă", // 282 - "Jurnalul tău", // 283 - "Descarcă jurnalul", // 284 - "Jurnalul este gol", // 285 - "Du-te la final", // 286 - "Adăugat în jurnal", // 287 - "Eroare la adăugarea\nîn jurnal", // 288 - "Șterge jurnalul", // 289 - "Jurnal șters", // 290 - "Ștergerea a eșuat", // 291 - "Nu se poate adăuga!\nJurnalul este plin!", // 292 - "Autologger", // 293 - "Auto DST pe ora NTP", // 294 - "Setează offsetul pentru ora NTP", // 295 - "Jurnalul conține peste 130 de intrări, pe care vizualizatorul nu le poate procesa. Te rog descarcă fișierul CSV pentru a le procesa.", // 296 - "Canada" // 297 + "Ecran oprit, conectat la XDRGTK", // 201 + "FMSI stereo îmbunătățit", // 202 + "Funcție activă doar la\nTEF6687/6689!", // 203 + "Funcție indisponibilă\nla acest skin!", // 204 + "Scanare începută\nmemorare posturi", // 205 + "Scanare terminată\nmemorare posturi", // 206 + "Așteaptă", // 207 + "Începe scanarea DX", // 208 + "FM DX Opțiuni", // 209 + "Terminat! Programul de pornire\neste ignorat.", // 210 + "Sortare automată AF", // 211 + "Memorare programe", // 212 + "Exclude", // 213 + "Doar", // 214 + "Auto oprire scanare", // 215 + "PI corect", // 216 + "Semnal", // 217 + "Audio oprit\ncând scanează", // 218 + "AIR", // 219 + "Apasă 5sec. butonul bandă", // 220 + "Oprit", // 221 + "Ecran oprit", // 222 + "Dezactivat", // 223 + "Nedefinit", // 224 + "Știri", // 225 + "Actualități", // 226 + "Informații", // 227 + "Sport", // 228 + "Educație", // 229 + "Teatru", // 230 + "Cultură", // 231 + "Știință", // 232 + "Varietăți", // 233 + "Muzică pop", // 234 + "Muzică rock", // 235 + "Muzică ușoară", // 236 + "Clasic Lejer", // 237 + "Muzică Clasică", // 238 + "Altă Muzică", // 239 + "Meteo", // 240 + "Finanțe", // 241 + "Copii", // 242 + "Social", // 243 + "Religie", // 244 + "Phone-In", // 245 + "Călătorii", // 246 + "Timp Liber", // 247 + "Muzică de Jazz", // 248 + "Muzică Country", // 249 + "Muzică Națională", // 250 + "Muzica Retro", // 251 + "Muzică Populară", // 252 + "Documentar", // 253 + "Test Alarmă", // 254 + "Alarmă!!!", // 255 + "Inițial", // 256 + "Mereu", // 257 + "Arată ceasul", // 258 + "Arată PS lung", // 259 + "Frecvență de început", // 260 + "Frecvență de oprire", // 261 + "Canal de memorie de început", // 262 + "Canal de memorie de oprire", // 263 + "Stochează doar cu RDS", // 264 + "Începe memoria automată", // 265 + "Memorie automată", // 266 + "Listă ID posturi", // 267 + "Găsit", // 268 + "Anulat! Memoria canalelor este plină", // 269 + "Anulat! Utilizatorul a apăsat un buton", // 270 + "Scanarea s-a terminat fără erori", // 271 + "Șterge canalele de memorie", // 272 + "Șters", // 273 + "Previne dublarea PI", // 274 + "Interval", // 275 + "Complet", // 276 + "Timp de așteptare doar\npe semnal", // 277 + "Apasă colțul evidențiat", // 278 + "Pentru calibrarea ecranului tactil", // 279 + "Ține apăsat BW pentru\noprirea scannerului DX", // 280 + "Selectează lățimea de bandă", // 281 + "Jurnalul tău", // 282 + "Descarcă jurnalul", // 283 + "Jurnalul este gol", // 284 + "Du-te la final", // 285 + "Adăugat în jurnal", // 286 + "Eroare la adăugarea\nîn jurnal", // 287 + "Șterge jurnalul", // 288 + "Jurnal șters", // 289 + "Ștergerea a eșuat", // 290 + "Nu se poate adăuga!\nJurnalul este plin!", // 291 + "Autologger", // 292 + "Auto DST pe ora NTP", // 293 + "Setează offsetul pentru ora NTP", // 294 + "Jurnalul conține peste 130 de intrări, pe care vizualizatorul nu le poate procesa. Te rog descarcă fișierul CSV pentru a le procesa.", // 295 + "Canada" // 296 }, { "Deutsch", // German @@ -2026,103 +2020,102 @@ static const char* const myLanguage[22][298] PROGMEM = { "Viel", // 198 "Maximal", // 199 "Schnelles PS", // 200 - "Standard", // 201 - "Bildschirm aus bei\nXDRGTK-Verbindung", // 202 - "FMSI Stereo-\nVerbesserung", // 203 - "Funktion nur für\nTEF6687/6689 verfügbar!", // 204 - "Funktion für ausgewählten\nSkin nicht verfügbar!", // 205 - "Starte Scan mit\nSpeicherplatz", // 206 - "Stoppe Scan mit\nSpeicherplatz", // 207 - "Wartezeit", // 208 - "Starte DX-Scan", // 209 - "UKW DX-Optionen", // 210 - "Abbruch! Start-Speicher-\nplatz ist nicht belegt", // 211 - "AF Autosortierung", // 212 - "Speicherplätze scannen", // 213 - "Nein", // 214 - "Ja, ausschließlich", // 215 - "Automatisches\nScan-Ende", // 216 - "Korrekter PI-Code", // 217 - "Signal", // 218 - "Stumm beim Scannen", // 219 - "AIR", // 220 - "BAND-Knopf\n5 Sek. drücken", // 221 - "Ausschalten", // 222 - "Bildschirmschoner", // 223 - "Deaktiviert", // 224 - "Nicht definiert", // 225 - "Nachrichten", // 226 - "Aktuelle Info", // 227 - "Service Programm", // 228 - "Sport", // 229 - "Bildung", // 230 - "Hörspiel + Lit", // 231 - "Kultur+Gesellsch", // 232 - "Wissenschaft", // 233 - "Unterhaltung", // 234 - "Pop Musik", // 235 - "Rock Musik", // 236 - "Unterhalt Musik", // 237 - "Leichte Klassik", // 238 - "Ernste Klassik", // 239 - "Spezielle Musik", // 240 - "Wetter", // 241 - "Wirtschaft", // 242 - "Kinderprogramm", // 243 - "Soziales", // 244 - "Religion", // 245 - "Anrufsendung", // 246 - "Reiseinformation", // 247 - "Freizeit", // 248 - "Jazz", // 249 - "Country Musik", // 250 - "Landesmusik", // 251 - "Oldies Musik", // 252 - "Folklore", // 253 - "Feature", // 254 - "Alarm Test", // 255 - "Alarm! Alarm!", // 256 - "Anfänglich", // 257 - "Immer", // 258 - "Uhr anzeigen", // 259 - "Zeige langes PS", // 260 - "Start-Frequenz", // 261 - "Stopp-Frequenz", // 262 - "Start-Speicherplatz", // 263 - "Stopp-Speicherplatz", // 264 - "Speichern nur mit RDS", // 265 - "Starte Auto-Speichern", // 266 - "Auto-Speichern", // 267 - "Stationlist-ID", // 268 - "gefunden", // 269 - "Abbruch! Speicherplätze voll", // 270 - "Abbruch! Taste wurde gedrückt", // 271 - "Scan ohne Fehler beendet", // 272 - "Lösche Speicherplätze", // 273 - "gelöscht", // 274 - "Doppelte PI verhindern", // 275 - "Bereich", // 276 - "Voll", // 277 - "Wartezeit nur wenn\nSignal vorhanden", // 278 - "Markierte Ecke drücken", // 279 - "zum Kalibrieren des Touchscrees", // 280 - "Zum Stoppen des DX-Scans\nTaste BW lange drücken", // 281 - "Bandbreite wählen", // 282 - "Dein Logbuch", // 283 - "Logbuch herunterladen", // 284 - "Logbuch ist leer", // 285 - "Zum Ende gehen", // 286 - "Logbuch-Eintrag\nwurde erstellt", // 287 - "Logbuch-Eintrag\nist fehlgeschlagen", // 288 - "Logbuch löschen", // 289 - "Logbuch gelöscht", // 290 - "Löschen fehlgeschlagen", // 291 - "Logbucheintrag nicht möglich\nLogbuch ist voll!", // 292 - "Automatisch loggen", // 293 - "Auto-Sommerzeit\nüber NTP", // 294 - "NTP-Zeitversatz\neinstellen", // 295 - "Das Logbuch enthält mehr als 130 Einträge, was das Anzeigeprogramm nicht verarbeiten kann. Bitte lade die CSV-Datei zum Verarbeiten herunter.", // 296 - "Kanada" // 297 + "Bildschirm aus bei\nXDRGTK-Verbindung", // 201 + "FMSI Stereo-\nVerbesserung", // 202 + "Funktion nur für\nTEF6687/6689 verfügbar!", // 203 + "Funktion für ausgewählten\nSkin nicht verfügbar!", // 204 + "Starte Scan mit\nSpeicherplatz", // 205 + "Stoppe Scan mit\nSpeicherplatz", // 206 + "Wartezeit", // 207 + "Starte DX-Scan", // 208 + "UKW DX-Optionen", // 209 + "Abbruch! Start-Speicher-\nplatz ist nicht belegt", // 210 + "AF Autosortierung", // 211 + "Speicherplätze scannen", // 212 + "Nein", // 213 + "Ja, ausschließlich", // 214 + "Automatisches\nScan-Ende", // 215 + "Korrekter PI-Code", // 216 + "Signal", // 217 + "Stumm beim Scannen", // 218 + "AIR", // 219 + "BAND-Knopf\n5 Sek. drücken", // 220 + "Ausschalten", // 221 + "Bildschirmschoner", // 222 + "Deaktiviert", // 223 + "Nicht definiert", // 224 + "Nachrichten", // 225 + "Aktuelle Info", // 226 + "Service Programm", // 227 + "Sport", // 228 + "Bildung", // 229 + "Hörspiel + Lit", // 230 + "Kultur+Gesellsch", // 231 + "Wissenschaft", // 232 + "Unterhaltung", // 233 + "Pop Musik", // 234 + "Rock Musik", // 235 + "Unterhalt Musik", // 236 + "Leichte Klassik", // 237 + "Ernste Klassik", // 238 + "Spezielle Musik", // 239 + "Wetter", // 240 + "Wirtschaft", // 241 + "Kinderprogramm", // 242 + "Soziales", // 243 + "Religion", // 244 + "Anrufsendung", // 245 + "Reiseinformation", // 246 + "Freizeit", // 247 + "Jazz", // 248 + "Country Musik", // 249 + "Landesmusik", // 250 + "Oldies Musik", // 251 + "Folklore", // 252 + "Feature", // 253 + "Alarm Test", // 254 + "Alarm! Alarm!", // 255 + "Anfänglich", // 256 + "Immer", // 257 + "Uhr anzeigen", // 258 + "Zeige langes PS", // 259 + "Start-Frequenz", // 260 + "Stopp-Frequenz", // 261 + "Start-Speicherplatz", // 262 + "Stopp-Speicherplatz", // 263 + "Speichern nur mit RDS", // 264 + "Starte Auto-Speichern", // 265 + "Auto-Speichern", // 266 + "Stationlist-ID", // 267 + "gefunden", // 268 + "Abbruch! Speicherplätze voll", // 269 + "Abbruch! Taste wurde gedrückt", // 270 + "Scan ohne Fehler beendet", // 271 + "Lösche Speicherplätze", // 272 + "gelöscht", // 273 + "Doppelte PI verhindern", // 274 + "Bereich", // 275 + "Voll", // 276 + "Wartezeit nur wenn\nSignal vorhanden", // 277 + "Markierte Ecke drücken", // 278 + "zum Kalibrieren des Touchscrees", // 279 + "Zum Stoppen des DX-Scans\nTaste BW lange drücken", // 280 + "Bandbreite wählen", // 281 + "Dein Logbuch", // 282 + "Logbuch herunterladen", // 283 + "Logbuch ist leer", // 284 + "Zum Ende gehen", // 285 + "Logbuch-Eintrag\nwurde erstellt", // 286 + "Logbuch-Eintrag\nist fehlgeschlagen", // 287 + "Logbuch löschen", // 288 + "Logbuch gelöscht", // 289 + "Löschen fehlgeschlagen", // 290 + "Logbucheintrag nicht möglich\nLogbuch ist voll!", // 291 + "Automatisch loggen", // 292 + "Auto-Sommerzeit\nüber NTP", // 293 + "NTP-Zeitversatz\neinstellen", // 294 + "Das Logbuch enthält mehr als 130 Einträge, was das Anzeigeprogramm nicht verarbeiten kann. Bitte lade die CSV-Datei zum Verarbeiten herunter.", // 295 + "Kanada" // 296 }, { "Čeština", // Czech @@ -2326,103 +2319,102 @@ static const char* const myLanguage[22][298] PROGMEM = { "Velké", // 198 "Vše", // 199 "Rychlé načtení PS", // 200 - "Výchozí", // 201 - "Vypnout displej při\nXDRGTK připojení", // 202 - "FMSI stereo\nvylepšení", // 203 - "Funkce dostupná pouze\nu TEF6687/6689!", // 204 - "Funkce není dostupná\nu zvoleného skinu!", // 205 - "Začít skenování\nod předvolby č.", // 206 - "Skončit skenování\nu předvolby č.", // 207 - "Doba čekání", // 208 - "Spustit DX skenování", // 209 - "Nastavení FM DX", // 210 - "Přerušeno! Začáteční předvolba\nje označena jako prázdná.", // 211 - "Auto řazení AF", // 212 - "Předvolby paměti", // 213 - "Vyloučit", // 214 - "Pouze", // 215 - "Automaticky zastavit\nskenování", // 216 - "Korektní PI", // 217 - "Signál", // 218 - "Ztlumit zvuk\nběhem skenování", // 219 - "AIR", // 220 - "Po 5 sec. stisknutí\ntl. BAND", // 221 - "Vypnout", // 222 - "Vypnout displej", // 223 - "Zakázáno", // 224 - "Nedefinovaný", // 225 - "Zprávy", // 226 - "Publicistika", // 227 - "Informace", // 228 - "Sport", // 229 - "Vzdělání", // 230 - "Drama", // 231 - "Kultura", // 232 - "Věda", // 233 - "Různé žánry", // 234 - "Popová hudba", // 235 - "Rocková hudba", // 236 - "Oddychová hudba", // 237 - "Klasická hudba", // 238 - "Vážná hudba", // 239 - "Jiná hudba", // 240 - "Počasí", // 241 - "Finance", // 242 - "Dětský program", // 243 - "Společenská tém.", // 244 - "Naboženství", // 245 - "Telefonáty", // 246 - "Cestování", // 247 - "Zábava", // 248 - "Jazzová hudba", // 249 - "Country hudba", // 250 - "Národní hudba", // 251 - "Oldies hudba", // 252 - "Folková hudba", // 253 - "Dokumenty", // 254 - "Alarm Test", // 255 - "Alarm – Alarm !", // 256 - "Počáteční", // 257 - "Vždy", // 258 - "Zobrazit hodiny", // 259 - "Zobrazit long PS", // 260 - "Počáteční frekvence", // 261 - "Poslední frekvence", // 262 - "Počáteční paměťový kanál", // 263 - "Poslední paměťový kanál", // 264 - "Ukládat jen s RDS", // 265 - "Spustit automatickou paměť", // 266 - "Automatická paměť", // 267 - "ID seznamu stanic", // 268 - "Nalezeno", // 269 - "Přerušeno! Nedostatek paměťových kanálů", // 270 - "Přerušeno! Uživatel stiskl tlačítko", // 271 - "Skenování dokončen bez chyb", // 272 - "Vymazat paměťové kanály", // 273 - "vymazáno", // 274 - "Zamezit dvojitému PI", // 275 - "Rozsah", // 276 - "Plný", // 277 - "Čekací doba pouze na\nsignal", // 278 - "Stiskněte zvýrazněný roh", // 279 - "Pro kalibraci dotekové obrazovky", // 280 - "Pro zastavení\npodržte tlačítko BW", // 281 - "Vyberte šířku pásma", // 282 - "Váš logbook", // 283 - "Stáhnout logbook", // 284 - "Logbook je prázdný", // 285 - "Přejít na konec", // 286 - "Přidáno do logu", // 287 - "Chyba při přidávání\npoložky do logbooku", // 288 - "Vymazat logbook", // 289 - "Logbook vymazán", // 290 - "Vymazání se nezdařilo", // 291 - "Nelze přidat položku!\nLogbook je plný!", // 292 - "Automatický logger", // 293 - "Auto DST u NTP času", // 294 - "Nastavte časový posun NTP", // 295 - "Logbook obsahuje více než 130 položek, které prohlížeč nedokáže zpracovat. Pro zpracování všech položek si stáhněte CSV soubor.", // 296 - "Canada" // 297 + "Vypnout displej při\nXDRGTK připojení", // 201 + "FMSI stereo\nvylepšení", // 202 + "Funkce dostupná pouze\nu TEF6687/6689!", // 203 + "Funkce není dostupná\nu zvoleného skinu!", // 204 + "Začít skenování\nod předvolby č.", // 205 + "Skončit skenování\nu předvolby č.", // 206 + "Doba čekání", // 207 + "Spustit DX skenování", // 208 + "Nastavení FM DX", // 209 + "Přerušeno! Začáteční předvolba\nje označena jako prázdná.", // 210 + "Auto řazení AF", // 211 + "Předvolby paměti", // 212 + "Vyloučit", // 213 + "Pouze", // 214 + "Automaticky zastavit\nskenování", // 215 + "Korektní PI", // 216 + "Signál", // 217 + "Ztlumit zvuk\nběhem skenování", // 218 + "AIR", // 219 + "Po 5 sec. stisknutí\ntl. BAND", // 220 + "Vypnout", // 221 + "Vypnout displej", // 222 + "Zakázáno", // 223 + "Nedefinovaný", // 224 + "Zprávy", // 225 + "Publicistika", // 226 + "Informace", // 227 + "Sport", // 228 + "Vzdělání", // 229 + "Drama", // 230 + "Kultura", // 231 + "Věda", // 232 + "Různé žánry", // 233 + "Popová hudba", // 234 + "Rocková hudba", // 235 + "Oddychová hudba", // 236 + "Klasická hudba", // 237 + "Vážná hudba", // 238 + "Jiná hudba", // 239 + "Počasí", // 240 + "Finance", // 241 + "Dětský program", // 242 + "Společenská tém.", // 243 + "Naboženství", // 244 + "Telefonáty", // 245 + "Cestování", // 246 + "Zábava", // 247 + "Jazzová hudba", // 248 + "Country hudba", // 249 + "Národní hudba", // 250 + "Oldies hudba", // 251 + "Folková hudba", // 252 + "Dokumenty", // 253 + "Alarm Test", // 254 + "Alarm – Alarm !", // 255 + "Počáteční", // 256 + "Vždy", // 257 + "Zobrazit hodiny", // 258 + "Zobrazit long PS", // 259 + "Počáteční frekvence", // 260 + "Poslední frekvence", // 261 + "Počáteční paměťový kanál", // 262 + "Poslední paměťový kanál", // 263 + "Ukládat jen s RDS", // 264 + "Spustit automatickou paměť", // 265 + "Automatická paměť", // 266 + "ID seznamu stanic", // 267 + "Nalezeno", // 268 + "Přerušeno! Nedostatek paměťových kanálů", // 269 + "Přerušeno! Uživatel stiskl tlačítko", // 270 + "Skenování dokončen bez chyb", // 271 + "Vymazat paměťové kanály", // 272 + "vymazáno", // 273 + "Zamezit dvojitému PI", // 274 + "Rozsah", // 275 + "Plný", // 276 + "Čekací doba pouze na\nsignal", // 277 + "Stiskněte zvýrazněný roh", // 278 + "Pro kalibraci dotekové obrazovky", // 279 + "Pro zastavení\npodržte tlačítko BW", // 280 + "Vyberte šířku pásma", // 281 + "Váš logbook", // 282 + "Stáhnout logbook", // 283 + "Logbook je prázdný", // 284 + "Přejít na konec", // 285 + "Přidáno do logu", // 286 + "Chyba při přidávání\npoložky do logbooku", // 287 + "Vymazat logbook", // 288 + "Logbook vymazán", // 289 + "Vymazání se nezdařilo", // 290 + "Nelze přidat položku!\nLogbook je plný!", // 291 + "Automatický logger", // 292 + "Auto DST u NTP času", // 293 + "Nastavte časový posun NTP", // 294 + "Logbook obsahuje více než 130 položek, které prohlížeč nedokáže zpracovat. Pro zpracování všech položek si stáhněte CSV soubor.", // 295 + "Canada" // 296 }, { "Magyar", // Hungarian @@ -2626,103 +2618,102 @@ static const char* const myLanguage[22][298] PROGMEM = { "Nagy", // 198 "Mind", // 199 "Gyors PS", // 200 - "Alap", // 201 - "Képernyő némítása\nXDRGTK kapcsolaton", // 202 - "FMSI sztereó\njavítás", // 203 - "Funkció csak a\nTEF6687/6689-hez!", // 204 - "Funkció nem elérhető\nebben a kinézetben!", // 205 - "Mem. csat. szkennelésének\nelkezdése", // 206 - "Mem. csat. szkennelésének\nbefejezése", // 207 - "Várakozási idő", // 208 - "DX szkennelés indítása", // 209 - "FM DX Opciók", // 210 - "Megszakítva! A kezdőcsatorna\nkihagyottnak van jelölve.", // 211 - "Auto AF rendezés", // 212 - "Memóriacsatornák", // 213 - "Kizárása", // 214 - "Csak", // 215 - "Auto keresés\nmegszakítása", // 216 - "Jó PI esetén", // 217 - "Jel esetén", // 218 - "Hang némítása\nkeresés közben", // 219 - "AIR", // 220 - "5 mp. sávgombnyomás", // 221 - "Kikapcsolás", // 222 - "Képernyőnémítás", // 223 - "Letiltva", // 224 - "Nincs", // 225 - "Hírek", // 226 - "Aktuális események", // 227 - "Információ", // 228 - "Sport", // 229 - "Oktatás", // 230 - "Dráma", // 231 - "Kultúra", // 232 - "Tudomány", // 233 - "Változatos", // 234 - "Pop Zene", // 235 - "Rock Zene", // 236 - "Könnyűzene", // 237 - "Könnyű Klasszikus", // 238 - "Komoly Klasszikus", // 239 - "Egyéb Zene", // 240 - "Időjárás", // 241 - "Pénzügy", // 242 - "Gyermekprogramok", // 243 - "Társadalmi ügyek", // 244 - "Vallás", // 245 - "Betelefonálós", // 246 - "Utazás", // 247 - "Szabadidő", // 248 - "Jazz Zene", // 249 - "Country Zene", // 250 - "Nemzeti Zene", // 251 - "Régi Zene", // 252 - "Népi Zene", // 253 - "Dokumentumfilm", // 254 - "Riasztás Teszt", // 255 - "Riasztás!!!", // 256 - "Kezdeti", // 257 - "Mindig", // 258 - "Óra mutatása", // 259 - "Hosszú PS mutatása", // 260 - "Indítási frekvencia", // 261 - "Befejezési frekvencia", // 262 - "Memóriacsatorna\nmentés indítása", // 263 - "Memóriacsatorna\nmentés leállítása", // 264 - "Csak RDS-el tárolja", // 265 - "Auto memória indítása", // 266 - "Auto memória", // 267 - "Stationlist ID", // 268 - "Megtalálva", // 269 - "Megszakítva! Nincs\nmemóriacsatorna", // 270 - "Megszakítva! Felhasználó\nmegnyomta a gombot", // 271 - "Szkennelés hiba\nnélkül befejeződött", // 272 - "Memóriacsatornák törlése", // 273 - "törölve", // 274 - "Kettős PI\nmegakadályozása", // 275 - "Tartomány", // 276 - "Teljes", // 277 - "Várakozási idő\ncsak jel esetén", // 278 - "Nyomd meg a kiemelt sarkot", // 279 - "Érintőképernyő kalibrálásához", // 280 - "Tartsd lenyomva a\nBW-t a megállításhoz", // 281 - "Sávszélesség választása", // 282 - "A logbookod", // 283 - "Logbook letöltése", // 284 - "A logbook üres", // 285 - "Ugrás az aljára", // 286 - "Hozzáadva a loghoz", // 287 - "Hiba a naplóhoz adáskor", // 288 - "Logbook törlése", // 289 - "Logbook törölve", // 290 - "Sikertelen törlés", // 291 - "Nem adható hozzá!\nLogbook megtelt!", // 292 - "Auto logoló", // 293 - "Auto nyári idő(DST)\nNTP idő szerint", // 294 - "NTP időeltolás beállítása", // 295 - "A napló több mint 130 bejegyzést tartalmaz, amelyeket a megtekintő nem tud feldolgozni. Kérlek, töltsd le a CSV fájlt a megtekintéshez.", // 296 - "Kanada" // 297 + "Képernyő némítása\nXDRGTK kapcsolaton", // 201 + "FMSI sztereó\njavítás", // 202 + "Funkció csak a\nTEF6687/6689-hez!", // 203 + "Funkció nem elérhető\nebben a kinézetben!", // 204 + "Mem. csat. szkennelésének\nelkezdése", // 205 + "Mem. csat. szkennelésének\nbefejezése", // 206 + "Várakozási idő", // 207 + "DX szkennelés indítása", // 208 + "FM DX Opciók", // 209 + "Megszakítva! A kezdőcsatorna\nkihagyottnak van jelölve.", // 210 + "Auto AF rendezés", // 211 + "Memóriacsatornák", // 212 + "Kizárása", // 213 + "Csak", // 214 + "Auto keresés\nmegszakítása", // 215 + "Jó PI esetén", // 216 + "Jel esetén", // 217 + "Hang némítása\nkeresés közben", // 218 + "AIR", // 219 + "5 mp. sávgombnyomás", // 220 + "Kikapcsolás", // 221 + "Képernyőnémítás", // 222 + "Letiltva", // 223 + "Nincs", // 224 + "Hírek", // 225 + "Aktuális események", // 226 + "Információ", // 227 + "Sport", // 228 + "Oktatás", // 229 + "Dráma", // 230 + "Kultúra", // 231 + "Tudomány", // 232 + "Változatos", // 233 + "Pop Zene", // 234 + "Rock Zene", // 235 + "Könnyűzene", // 236 + "Könnyű Klasszikus", // 237 + "Komoly Klasszikus", // 238 + "Egyéb Zene", // 239 + "Időjárás", // 240 + "Pénzügy", // 241 + "Gyermekprogramok", // 242 + "Társadalmi ügyek", // 243 + "Vallás", // 244 + "Betelefonálós", // 245 + "Utazás", // 246 + "Szabadidő", // 247 + "Jazz Zene", // 248 + "Country Zene", // 249 + "Nemzeti Zene", // 250 + "Régi Zene", // 251 + "Népi Zene", // 252 + "Dokumentumfilm", // 253 + "Riasztás Teszt", // 254 + "Riasztás!!!", // 255 + "Kezdeti", // 256 + "Mindig", // 257 + "Óra mutatása", // 258 + "Hosszú PS mutatása", // 259 + "Indítási frekvencia", // 260 + "Befejezési frekvencia", // 261 + "Memóriacsatorna\nmentés indítása", // 262 + "Memóriacsatorna\nmentés leállítása", // 263 + "Csak RDS-el tárolja", // 264 + "Auto memória indítása", // 265 + "Auto memória", // 266 + "Stationlist ID", // 267 + "Megtalálva", // 268 + "Megszakítva! Nincs\nmemóriacsatorna", // 269 + "Megszakítva! Felhasználó\nmegnyomta a gombot", // 270 + "Szkennelés hiba\nnélkül befejeződött", // 271 + "Memóriacsatornák törlése", // 272 + "törölve", // 273 + "Kettős PI\nmegakadályozása", // 274 + "Tartomány", // 275 + "Teljes", // 276 + "Várakozási idő\ncsak jel esetén", // 277 + "Nyomd meg a kiemelt sarkot", // 278 + "Érintőképernyő kalibrálásához", // 279 + "Tartsd lenyomva a\nBW-t a megállításhoz", // 280 + "Sávszélesség választása", // 281 + "A logbookod", // 282 + "Logbook letöltése", // 283 + "A logbook üres", // 284 + "Ugrás az aljára", // 285 + "Hozzáadva a loghoz", // 286 + "Hiba a naplóhoz adáskor", // 287 + "Logbook törlése", // 288 + "Logbook törölve", // 289 + "Sikertelen törlés", // 290 + "Nem adható hozzá!\nLogbook megtelt!", // 291 + "Auto logoló", // 292 + "Auto nyári idő(DST)\nNTP idő szerint", // 293 + "NTP időeltolás beállítása", // 294 + "A napló több mint 130 bejegyzést tartalmaz, amelyeket a megtekintő nem tud feldolgozni. Kérlek, töltsd le a CSV fájlt a megtekintéshez.", // 295 + "Kanada" // 296 }, { "Français", // French @@ -2926,103 +2917,102 @@ static const char* const myLanguage[22][298] PROGMEM = { "Grosses", // 198 "Toutes", // 199 "PS rapide", // 200 - "Défaut", // 201 - "Arrêt écran à la\nconnexion XDRGTK", // 202 - "Amélioration\nde la stéréo FMSI", // 203 - "Fonction disponible\nsur TEF6687/6689!", // 204 - "Fonction non disponible\nsur ce mode d'affichage !", // 205 - "Début du scan\ndes canaux mémorisés", // 206 - "Fin du scan\ndes canaux mémorisés", // 207 - "Temps d'attente", // 208 - "Démarrer le scan DX", // 209 - "Options FM DX", // 210 - "Abandon ! Le canal de\ndépart est indiqué comme ignoré.", // 211 - "Tri automatique\nde la liste AF", // 212 - "Canaux en mémoire", // 213 - "Exclure", // 214 - "Uniquement", // 215 - "Interrompre le scan\nautomatiquement", // 216 - "Code PI correct", // 217 - "Signal", // 218 - "Mettre l'audio en\nsourdine lors du scan", // 219 - "AIR", // 220 - "Appui de 5 sec.\nsur BAND", // 221 - "Éteindre l'appareil", // 222 - "Éteindre l'écran", // 223 - "Désactivé", // 224 - "Non défini", // 225 - "Actualités", // 226 - "Affaires courantes", // 227 - "Information", // 228 - "Sport", // 229 - "Éducation", // 230 - "Fiction", // 231 - "Culture", // 232 - "Science", // 233 - "Varié", // 234 - "Musique Pop", // 235 - "Musique Rock", // 236 - "Musique légère", // 237 - "Classique Léger", // 238 - "Classique Sérieux", // 239 - "Autre Musique", // 240 - "Météo", // 241 - "Economie", // 242 - "Prog. pour enfants", // 243 - "Affaires sociales", // 244 - "Religion", // 245 - "Ligne ouverte", // 246 - "Voyage", // 247 - "Loisirs", // 248 - "Musique Jazz", // 249 - "Musique Country", // 250 - "Musique Nationale", // 251 - "Musique Rétro", // 252 - "Folklore", // 253 - "Documentaire", // 254 - "TEST d'alerte", // 255 - "Alerte !", // 256 - "Initial", // 257 - "Toujours", // 258 - "Afficher l'horloge", // 259 - "Afficher le PS long", // 260 - "Fréquence initialle", // 261 - "Fréquence finale", // 262 - "Canal\nde mémoire initial", // 263 - "Canal\nde mémoire final", // 264 - "Mémoriser avec\nRDS uniquement", // 265 - "Démarrer la mémorisation\nautomatique", // 266 - "Mémorisation\nautomatique", // 267 - "Identifiant\nStationlist", // 268 - "Trouvé", // 269 - "Abandon! Mémoire de\ncanaux pleine", // 270 - "Abandon! Bouton\npressé par l'utilisateur", // 271 - "Scan terminé\nsans erreurs", // 272 - "Effacer les canaux\nmémorisés", // 273 - "effacé", // 274 - "Empêcher doublon PI", // 275 - "Plage", // 276 - "Complet", // 277 - "Temps d'attente\nuniquement sur le signal", // 278 - "Appuyez sur le coin\nindiqué pour ", // 279 - "calibrer l'écran tactile", // 280 - "Pressez BW pour\narrêter le scanner DX", // 281 - "Sélectionner la bande passante", // 282 - "Votre journal de bord", // 283 - "Télécharger le journal de bord", // 284 - "Journal de bord vide", // 285 - "Aller en bas", // 286 - "Entrée ajoutée au journal de bord", // 287 - "Erreur lors de l'ajout\nau journal de bord", // 288 - "Effacer le journal\nde bord", // 289 - "Journal effacé", // 290 - "Échec lors de\nla suppression", // 291 - "Impossible d'ajouter l'entrée!\nJournal de bord plein!", // 292 - "Log automatique", // 293 - "DST automatique\nsur l'heure NTP", // 294 - "Décalage horaire NTP", // 295 - "Le journal de bord contient plus de 130 entrées que la liste ne peut pas afficher. Veuillez télécharger le fichier CSV.", // 296 - "Canada" // 297 + "Arrêt écran à la\nconnexion XDRGTK", // 201 + "Amélioration\nde la stéréo FMSI", // 202 + "Fonction disponible\nsur TEF6687/6689!", // 203 + "Fonction non disponible\nsur ce mode d'affichage !", // 204 + "Début du scan\ndes canaux mémorisés", // 205 + "Fin du scan\ndes canaux mémorisés", // 206 + "Temps d'attente", // 207 + "Démarrer le scan DX", // 208 + "Options FM DX", // 209 + "Abandon ! Le canal de\ndépart est indiqué comme ignoré.", // 210 + "Tri automatique\nde la liste AF", // 211 + "Canaux en mémoire", // 212 + "Exclure", // 213 + "Uniquement", // 214 + "Interrompre le scan\nautomatiquement", // 215 + "Code PI correct", // 216 + "Signal", // 217 + "Mettre l'audio en\nsourdine lors du scan", // 218 + "AIR", // 219 + "Appui de 5 sec.\nsur BAND", // 220 + "Éteindre l'appareil", // 221 + "Éteindre l'écran", // 222 + "Désactivé", // 223 + "Non défini", // 224 + "Actualités", // 225 + "Affaires courantes", // 226 + "Information", // 227 + "Sport", // 228 + "Éducation", // 229 + "Fiction", // 230 + "Culture", // 231 + "Science", // 232 + "Varié", // 233 + "Musique Pop", // 234 + "Musique Rock", // 235 + "Musique légère", // 236 + "Classique Léger", // 237 + "Classique Sérieux", // 238 + "Autre Musique", // 239 + "Météo", // 240 + "Economie", // 241 + "Prog. pour enfants", // 242 + "Affaires sociales", // 243 + "Religion", // 244 + "Ligne ouverte", // 245 + "Voyage", // 246 + "Loisirs", // 247 + "Musique Jazz", // 248 + "Musique Country", // 249 + "Musique Nationale", // 250 + "Musique Rétro", // 251 + "Folklore", // 252 + "Documentaire", // 253 + "TEST d'alerte", // 254 + "Alerte !", // 255 + "Initial", // 256 + "Toujours", // 257 + "Afficher l'horloge", // 258 + "Afficher le PS long", // 259 + "Fréquence initialle", // 260 + "Fréquence finale", // 261 + "Canal\nde mémoire initial", // 262 + "Canal\nde mémoire final", // 263 + "Mémoriser avec\nRDS uniquement", // 264 + "Démarrer la mémorisation\nautomatique", // 265 + "Mémorisation\nautomatique", // 266 + "Identifiant\nStationlist", // 267 + "Trouvé", // 268 + "Abandon! Mémoire de\ncanaux pleine", // 269 + "Abandon! Bouton\npressé par l'utilisateur", // 270 + "Scan terminé\nsans erreurs", // 271 + "Effacer les canaux\nmémorisés", // 272 + "effacé", // 273 + "Empêcher doublon PI", // 274 + "Plage", // 275 + "Complet", // 276 + "Temps d'attente\nuniquement sur le signal", // 277 + "Appuyez sur le coin\nindiqué pour ", // 278 + "calibrer l'écran tactile", // 279 + "Pressez BW pour\narrêter le scanner DX", // 280 + "Sélectionner la bande passante", // 281 + "Votre journal de bord", // 282 + "Télécharger le journal de bord", // 283 + "Journal de bord vide", // 284 + "Aller en bas", // 285 + "Entrée ajoutée au journal de bord", // 286 + "Erreur lors de l'ajout\nau journal de bord", // 287 + "Effacer le journal\nde bord", // 288 + "Journal effacé", // 289 + "Échec lors de\nla suppression", // 290 + "Impossible d'ajouter l'entrée!\nJournal de bord plein!", // 291 + "Log automatique", // 292 + "DST automatique\nsur l'heure NTP", // 293 + "Décalage horaire NTP", // 294 + "Le journal de bord contient plus de 130 entrées que la liste ne peut pas afficher. Veuillez télécharger le fichier CSV.", // 295 + "Canada" // 296 }, { "Български", // Bulgarian @@ -3226,103 +3216,102 @@ static const char* const myLanguage[22][298] PROGMEM = { "Голям", // 198 "Всички", // 199 "Бърз PS", // 200 - "По подразбиране", // 201 - "Заглушаване на\nекран при XDRGTK", // 202 - "Подобряване на\nстерео FMSI", // 203 - "Функцията е достъпна\nсамо за TEF6687/6689!", // 204 - "Функцията не е\nдостъпна за облика!", // 205 - "Сканиране на\nканали в паметта", // 206 - "Спиране на\nсканиране на канали", // 207 - "Време за изчакване", // 208 - "Стартиране на DX сканер", // 209 - "Опции за FM DX", // 210 - "Началният канал\nе пропуснат.", // 211 - "Автоматично\nсортиране на AF", // 212 - "Канали в паметта", // 213 - "Изключване", // 214 - "Само", // 215 - "Автоматично прекратяване", // 216 - "Коригиране на PI", // 217 - "Сигнал", // 218 - "Заглушаване на\nзвука при сканиране", // 219 - "Въздушен", // 220 - "5 сек. натискане\nна band бутон", // 221 - "Изключване на\nзахранването", // 222 - "Изключване на екрана", // 223 - "Изключено", // 224 - "Няма", // 225 - "Новини", // 226 - "Актуални събития", // 227 - "Информация", // 228 - "Спорт", // 229 - "Образование", // 230 - "Драма", // 231 - "Култура", // 232 - "Наука", // 233 - "Разнообразие", // 234 - "Поп музика", // 235 - "Рок музика", // 236 - "Лека музика", // 237 - "Лека класика", // 238 - "Сериозна класика", // 239 - "Друга музика", // 240 - "Време", // 241 - "Финанси", // 242 - "Детски програми", // 243 - "Социални въпроси", // 244 - "Религия", // 245 - "Телефонен ефир", // 246 - "Пътувания", // 247 - "Свободно време", // 248 - "Джаз музика", // 249 - "Кънтри музика", // 250 - "Национална музика", // 251 - "Стари хитове", // 252 - "Фолк музика", // 253 - "Документален", // 254 - "Тест на аларма", // 255 - "Аларма!!!", // 256 - "Начален", // 257 - "Винаги", // 258 - "Показване на\nчасовника", // 259 - "Показване на\nдълго PS", // 260 - "Начална честота", // 261 - "Крайна честота", // 262 - "Начален канал\nв паметта", // 263 - "Краен канал в паметта", // 264 - "Запазване само с RDS", // 265 - "Стартиране на\nавтоматична памет", // 266 - "Автоматична памет", // 267 - "ID на списък с станции", // 268 - "Намерено", // 269 - "Няма свободни\nканали.", // 270 - "Потребителят\nнатисна бутон.", // 271 - "Сканирането завърши без грешки.", // 272 - "Изчистване на\nканали в паметта", // 273 - "Изчистено", // 274 - "Предотвратяване на\nдублиране на PI", // 275 - "Обхват", // 276 - "Пълен", // 277 - "Време за изчакване\nпри сигнал", // 278 - "Натиснете маркирания ъгъл", // 279 - "За калибриране\nна докосване", // 280 - "Задръжте BW бутона\nза да спрете сканера", // 281 - "Избор на честотна\nлента", // 282 - "Вашият дневник", // 283 - "Изтегляне на\nдневника", // 284 - "Дневникът е празен", // 285 - "Отидете в края", // 286 - "Записът е добавен\nв дневника", // 287 - "Грешка при добавяне в дневника", // 288 - "Изчистване на дневника", // 289 - "Дневникът е изчистен", // 290 - "Изчистването не\nбе успешно", // 291 - "Не може да се добави запис!\nДневникът е пълен!", // 292 - "Автоматичен дневник", // 293 - "Автоматично лятно\nвреме по NTP", // 294 - "Отместване на NTP", // 295 - "Дневникът съдържа над 130 записа, които не могат да бъдат обработени. Моля, изтеглете CSV файла за обработка.", // 296 - "Канада" // 297 + "Заглушаване на\nекран при XDRGTK", // 201 + "Подобряване на\nстерео FMSI", // 202 + "Функцията е достъпна\nсамо за TEF6687/6689!", // 203 + "Функцията не е\nдостъпна за облика!", // 204 + "Сканиране на\nканали в паметта", // 205 + "Спиране на\nсканиране на канали", // 206 + "Време за изчакване", // 207 + "Стартиране на DX сканер", // 208 + "Опции за FM DX", // 209 + "Началният канал\nе пропуснат.", // 210 + "Автоматично\nсортиране на AF", // 211 + "Канали в паметта", // 212 + "Изключване", // 213 + "Само", // 214 + "Автоматично прекратяване", // 215 + "Коригиране на PI", // 216 + "Сигнал", // 217 + "Заглушаване на\nзвука при сканиране", // 218 + "Въздушен", // 219 + "5 сек. натискане\nна band бутон", // 220 + "Изключване на\nзахранването", // 221 + "Изключване на екрана", // 222 + "Изключено", // 223 + "Няма", // 224 + "Новини", // 225 + "Актуални събития", // 226 + "Информация", // 227 + "Спорт", // 228 + "Образование", // 229 + "Драма", // 230 + "Култура", // 231 + "Наука", // 232 + "Разнообразие", // 233 + "Поп музика", // 234 + "Рок музика", // 235 + "Лека музика", // 236 + "Лека класика", // 237 + "Сериозна класика", // 238 + "Друга музика", // 239 + "Време", // 240 + "Финанси", // 241 + "Детски програми", // 242 + "Социални въпроси", // 243 + "Религия", // 244 + "Телефонен ефир", // 245 + "Пътувания", // 246 + "Свободно време", // 247 + "Джаз музика", // 248 + "Кънтри музика", // 249 + "Национална музика", // 250 + "Стари хитове", // 251 + "Фолк музика", // 252 + "Документален", // 253 + "Тест на аларма", // 254 + "Аларма!!!", // 255 + "Начален", // 256 + "Винаги", // 257 + "Показване на\nчасовника", // 258 + "Показване на\nдълго PS", // 259 + "Начална честота", // 260 + "Крайна честота", // 261 + "Начален канал\nв паметта", // 262 + "Краен канал в паметта", // 263 + "Запазване само с RDS", // 264 + "Стартиране на\nавтоматична памет", // 265 + "Автоматична памет", // 266 + "ID на списък с станции", // 267 + "Намерено", // 268 + "Няма свободни\nканали.", // 269 + "Потребителят\nнатисна бутон.", // 270 + "Сканирането завърши без грешки.", // 271 + "Изчистване на\nканали в паметта", // 272 + "Изчистено", // 273 + "Предотвратяване на\nдублиране на PI", // 274 + "Обхват", // 275 + "Пълен", // 276 + "Време за изчакване\nпри сигнал", // 277 + "Натиснете маркирания ъгъл", // 278 + "За калибриране\nна докосване", // 279 + "Задръжте BW бутона\nза да спрете сканера", // 280 + "Избор на честотна\nлента", // 281 + "Вашият дневник", // 282 + "Изтегляне на\nдневника", // 283 + "Дневникът е празен", // 284 + "Отидете в края", // 285 + "Записът е добавен\nв дневника", // 286 + "Грешка при добавяне в дневника", // 287 + "Изчистване на дневника", // 288 + "Дневникът е изчистен", // 289 + "Изчистването не\nбе успешно", // 290 + "Не може да се добави запис!\nДневникът е пълен!", // 291 + "Автоматичен дневник", // 292 + "Автоматично лятно\nвреме по NTP", // 293 + "Отместване на NTP", // 294 + "Дневникът съдържа над 130 записа, които не могат да бъдат обработени. Моля, изтеглете CSV файла за обработка.", // 295 + "Канада" // 296 }, { "Русский", // Russian @@ -3526,103 +3515,102 @@ static const char* const myLanguage[22][298] PROGMEM = { "Больше", // 198 "Все", // 199 "Быстрый PS", // 200 - "По умолчанию", // 201 - "Гасить дисплей при\nработе с XDRGTK", // 202 - "FMSI стерео\nулучшение", // 203 - "Доступно только\nна TEF6687/6689", // 204 - "Функция недоступна\nна этом оформлении", // 205 - "Стартовый канал\nпамяти", // 206 - "Конечный канал\nпамяти", // 207 - "Время ожидания", // 208 - "Начать DX-сканирование", // 209 - "Настройки FM DX сканера", // 210 - "Прервано! Стартовый канал\nпомечен для пропуска.", // 211 - "Сортировка AF-частот", // 212 - "Каналы памяти", // 213 - "Кроме", // 214 - "Только", // 215 - "Автоматическая отмена\nсканирования", // 216 - "При корректном PI", // 217 - "При наличии сигнала", // 218 - "Отключать аудио\nпри сканировании", // 219 - "Эфир", // 220 - "5 сек. нажатие Band", // 221 - "Отключить тюнер", // 222 - "Отключить экран", // 223 - "Запрещено", // 224 - "Не определено", // 225 - "Новости", // 226 - "Аналитика", // 227 - "Информация", // 228 - "Спорт", // 229 - "Образование", // 230 - "Драма", // 231 - "Культура", // 232 - "Наука", // 233 - "Разное", // 234 - "Поп М", // 235 - "Рок М", // 236 - "Лёгкая музыка", // 237 - "Лёгкая классика", // 238 - "Классика", // 239 - "Другая музыка", // 240 - "Погода", // 241 - "Финансы", // 242 - "Детские прогр", // 243 - "Общество", // 244 - "Религия", // 245 - "Открытая линия", // 246 - "Туризм", // 247 - "Досуг", // 248 - "Джаз", // 249 - "Музыка кантри", // 250 - "Национальная М", // 251 - "Олдис", // 252 - "Народная музыка", // 253 - "Документалистика", // 254 - "Тревога тест", // 255 - "Тревога!", // 256 - "Начальный", // 257 - "Всегда", // 258 - "Показать часы", // 259 - "Показывать длинный PS", // 260 - "Начальная частота", // 261 - "Конечная частота", // 262 - "Начальный канал памяти", // 263 - "Конечный канал памяти", // 264 - "Сохранять только с RDS", // 265 - "Начать автозапоминание", // 266 - "Автозапоминание", // 267 - "Stationlist идентификатор", // 268 - "Найдено", // 269 - "Прервано! Нехватка памяти", // 270 - "Прервано! Нажата кнопка", // 271 - "Сканирование завершено без ошибок", // 272 - "Очистить каналы памяти", // 273 - "очищено", // 274 - "Предотвращать дубль PI", // 275 - "Диапазон", // 276 - "Полный", // 277 - "Время ожидания\nпри сигнале", // 278 - "Нажмите на подсвеченный угол", // 279 - "Калибровка тачскрина", // 280 - "Переключение инверсии экрана", // 281 - "Выбрать ширину полосы", // 282 - "Ваш лог-файл", // 283 - "Скачать лог-файл", // 284 - "Лог-файл пуст", // 285 - "Вниз", // 286 - "Добавлено в лог-файл", // 287 - "Обновление не удалось!", // 288 - "Очистить лог-файл", // 289 - "Лог-файл очищен", // 290 - "Очистить не удалось", // 291 - "Смещение времени NTP", // 292 - "Автологгер", // 293 - "Автоматическое летнее время по NTP", // 294 - "Смещение времени NTP", // 295 - "В логе более 130 записей, которые программа просмотра не может обработать. Загрузите файл CSV для его обработки.", // 296 - "Канада" // 297 + "Гасить дисплей при\nработе с XDRGTK", // 201 + "FMSI стерео\nулучшение", // 202 + "Доступно только\nна TEF6687/6689", // 203 + "Функция недоступна\nна этом оформлении", // 204 + "Стартовый канал\nпамяти", // 205 + "Конечный канал\nпамяти", // 206 + "Время ожидания", // 207 + "Начать DX-сканирование", // 208 + "Настройки FM DX сканера", // 209 + "Прервано! Стартовый канал\nпомечен для пропуска.", // 210 + "Сортировка AF-частот", // 211 + "Каналы памяти", // 212 + "Кроме", // 213 + "Только", // 214 + "Автоматическая отмена\nсканирования", // 215 + "При корректном PI", // 216 + "При наличии сигнала", // 217 + "Отключать аудио\nпри сканировании", // 218 + "Эфир", // 219 + "5 сек. нажатие Band", // 220 + "Отключить тюнер", // 221 + "Отключить экран", // 222 + "Запрещено", // 223 + "Не определено", // 224 + "Новости", // 225 + "Аналитика", // 226 + "Информация", // 227 + "Спорт", // 228 + "Образование", // 229 + "Драма", // 230 + "Культура", // 231 + "Наука", // 232 + "Разное", // 233 + "Поп М", // 234 + "Рок М", // 235 + "Лёгкая музыка", // 236 + "Лёгкая классика", // 237 + "Классика", // 238 + "Другая музыка", // 239 + "Погода", // 240 + "Финансы", // 241 + "Детские прогр", // 242 + "Общество", // 243 + "Религия", // 244 + "Открытая линия", // 245 + "Туризм", // 246 + "Досуг", // 247 + "Джаз", // 248 + "Музыка кантри", // 249 + "Национальная М", // 250 + "Олдис", // 251 + "Народная музыка", // 252 + "Документалистика", // 253 + "Тревога тест", // 254 + "Тревога!", // 255 + "Начальный", // 256 + "Всегда", // 257 + "Показать часы", // 258 + "Показывать длинный PS", // 259 + "Начальная частота", // 260 + "Конечная частота", // 261 + "Начальный канал памяти", // 262 + "Конечный канал памяти", // 263 + "Сохранять только с RDS", // 264 + "Начать автозапоминание", // 265 + "Автозапоминание", // 266 + "Stationlist идентификатор", // 267 + "Найдено", // 268 + "Прервано! Нехватка памяти", // 269 + "Прервано! Нажата кнопка", // 270 + "Сканирование завершено без ошибок", // 271 + "Очистить каналы памяти", // 272 + "очищено", // 273 + "Предотвращать дубль PI", // 274 + "Диапазон", // 275 + "Полный", // 276 + "Время ожидания\nпри сигнале", // 277 + "Нажмите на подсвеченный угол", // 278 + "Калибровка тачскрина", // 279 + "Переключение инверсии экрана", // 280 + "Выбрать ширину полосы", // 281 + "Ваш лог-файл", // 282 + "Скачать лог-файл", // 283 + "Лог-файл пуст", // 284 + "Вниз", // 285 + "Добавлено в лог-файл", // 286 + "Обновление не удалось!", // 287 + "Очистить лог-файл", // 288 + "Лог-файл очищен", // 289 + "Очистить не удалось", // 290 + "Смещение времени NTP", // 291 + "Автологгер", // 292 + "Автоматическое летнее время по NTP", // 293 + "Смещение времени NTP", // 294 + "В логе более 130 записей, которые программа просмотра не может обработать. Загрузите файл CSV для его обработки.", // 295 + "Канада" // 296 }, { "Українська", // Ukranian @@ -3826,103 +3814,102 @@ static const char* const myLanguage[22][298] PROGMEM = { "Велика", // 198 "Все", // 199 "Швидкий PS", // 200 - "За замовчуванням", // 201 - "Вимкнути екран під час\nпідключення XDRGTK", // 202 - "Покращення стерео FMSI", // 203 - "Функція доступна лише\nна TEF6687/6689!", // 204 - "Функція недоступна\nна даній темі!", // 205 - "Почати сканування\nканалів пам'яті", // 206 - "Зупинити сканування\nканалів пам'яті", // 207 - "Час очікування", // 208 - "Почати DX-пошук", // 209 - "Налаштування FM DX", // 210 - "Скасовано! Початковий канал\nпозначено як пропущений", // 211 - "Автоматичне\nсортування AF", // 212 - "Канали пам'яті", // 213 - "Крім", // 214 - "Лише", // 215 - "Автоматичне скасування\nсканування", // 216 - "Виправити PI", // 217 - "Сигнал", // 218 - "Вимкнути звук\nпід час сканування", // 219 - "Ефір", // 220 - "Дія, якщо тримати BAND 5 секунд", // 221 - "Вимкнення приймача", // 222 - "Вимкнення екрану", // 223 - "Відключено", // 224 - "Немає", // 225 - "Новини", // 226 - "Поточні події", // 227 - "Інформація", // 228 - "Спорт", // 229 - "Освіта", // 230 - "Драма", // 231 - "Культура", // 232 - "Наука", // 233 - "Різне", // 234 - "Попмузика", // 235 - "Рок-музика", // 236 - "Легка музика", // 237 - "Легка класика", // 238 - "Класика", // 239 - "Інша музика", // 240 - "Погода", // 241 - "Фінанси", // 242 - "Дитячі програми", // 243 - "Соціальні програми", // 244 - "Релігія", // 245 - "Телефонні вітання", // 246 - "Подорожі", // 247 - "Дозвілля", // 248 - "Джаз", // 249 - "Кантрі", // 250 - "Національна музика", // 251 - "Стара музика", // 252 - "Фольклор", // 253 - "Документалістика", // 254 - "Випробування тривоги", // 255 - "Тривога!!!", // 256 - "Початковий", // 257 - "Завжди", // 258 - "Показати годинник", // 259 - "Показати довгий PS", // 260 - "Початкова частота", // 261 - "Кінцева частота", // 262 - "Початковий канал пам'яті", // 263 - "Кінцевий канал пам'яті", // 264 - "Зберігати лише з RDS", // 265 - "Запуск автопам'яті", // 266 - "Автопам'ять", // 267 - "Stationlist ID", // 268 - "Знайдено", // 269 - "Скасовано! Немає\nканалів пам'яті", // 270 - "Скасовано! Користувач\nнатиснув кнопку", // 271 - "Сканування завершено\nбез помилок", // 272 - "Очистити канали\nпам'яті", // 273 - "очищено", // 274 - "Запобігти подвійному PI", // 275 - "Діапазон", // 276 - "Повний", // 277 - "Час очікування лише за сигналом", // 278 - "Натисніть виділений кут", // 279 - "Щоб налаштувати сенсор", // 280 - "Тримайте BAND, щоб зупинити пошук DX", // 281 - "Вибір пропускної здатності", // 282 - "Твій журнал", // 283 - "Завантажити журнал", // 284 - "Твій журнал є порожнім", // 285 - "Вниз", // 286 - "Додано до журналу", // 287 - "Помилка оновлення!", // 288 - "Очистити журнал", // 289 - "Очищено", // 290 - "Не вдалося очистити", // 291 - "Твій журнал повний!", // 292 - "Автореєстратор", // 293 - "Автоматичний літній\nчас за NTP", // 294 - "Встановити зміщення\nчасу NTP", // 295 - "Журнал містить понад 130 записів, які оглядач не може обробити. Будь ласка, завантажте файл CSV, щоб обробити його.", // 296 - "Канада" // 297 + "Вимкнути екран під час\nпідключення XDRGTK", // 201 + "Покращення стерео FMSI", // 202 + "Функція доступна лише\nна TEF6687/6689!", // 203 + "Функція недоступна\nна даній темі!", // 204 + "Почати сканування\nканалів пам'яті", // 205 + "Зупинити сканування\nканалів пам'яті", // 206 + "Час очікування", // 207 + "Почати DX-пошук", // 208 + "Налаштування FM DX", // 209 + "Скасовано! Початковий канал\nпозначено як пропущений", // 210 + "Автоматичне\nсортування AF", // 211 + "Канали пам'яті", // 212 + "Крім", // 213 + "Лише", // 214 + "Автоматичне скасування\nсканування", // 215 + "Виправити PI", // 216 + "Сигнал", // 217 + "Вимкнути звук\nпід час сканування", // 218 + "Ефір", // 219 + "Дія, якщо тримати BAND 5 секунд", // 220 + "Вимкнення приймача", // 221 + "Вимкнення екрану", // 222 + "Відключено", // 223 + "Немає", // 224 + "Новини", // 225 + "Поточні події", // 226 + "Інформація", // 227 + "Спорт", // 228 + "Освіта", // 229 + "Драма", // 230 + "Культура", // 231 + "Наука", // 232 + "Різне", // 233 + "Попмузика", // 234 + "Рок-музика", // 235 + "Легка музика", // 236 + "Легка класика", // 237 + "Класика", // 238 + "Інша музика", // 239 + "Погода", // 240 + "Фінанси", // 241 + "Дитячі програми", // 242 + "Соціальні програми", // 243 + "Релігія", // 244 + "Телефонні вітання", // 245 + "Подорожі", // 246 + "Дозвілля", // 247 + "Джаз", // 248 + "Кантрі", // 249 + "Національна музика", // 250 + "Стара музика", // 251 + "Фольклор", // 252 + "Документалістика", // 253 + "Випробування тривоги", // 254 + "Тривога!!!", // 255 + "Початковий", // 256 + "Завжди", // 257 + "Показати годинник", // 258 + "Показати довгий PS", // 259 + "Початкова частота", // 260 + "Кінцева частота", // 261 + "Початковий канал пам'яті", // 262 + "Кінцевий канал пам'яті", // 263 + "Зберігати лише з RDS", // 264 + "Запуск автопам'яті", // 265 + "Автопам'ять", // 266 + "Stationlist ID", // 267 + "Знайдено", // 268 + "Скасовано! Немає\nканалів пам'яті", // 269 + "Скасовано! Користувач\nнатиснув кнопку", // 270 + "Сканування завершено\nбез помилок", // 271 + "Очистити канали\nпам'яті", // 272 + "очищено", // 273 + "Запобігти подвійному PI", // 274 + "Діапазон", // 275 + "Повний", // 276 + "Час очікування лише за сигналом", // 277 + "Натисніть виділений кут", // 278 + "Щоб налаштувати сенсор", // 279 + "Тримайте BAND, щоб зупинити пошук DX", // 280 + "Вибір пропускної здатності", // 281 + "Твій журнал", // 282 + "Завантажити журнал", // 283 + "Твій журнал є порожнім", // 284 + "Вниз", // 285 + "Додано до журналу", // 286 + "Помилка оновлення!", // 287 + "Очистити журнал", // 288 + "Очищено", // 289 + "Не вдалося очистити", // 290 + "Твій журнал повний!", // 291 + "Автореєстратор", // 292 + "Автоматичний літній\nчас за NTP", // 293 + "Встановити зміщення\nчасу NTP", // 294 + "Журнал містить понад 130 записів, які оглядач не може обробити. Будь ласка, завантажте файл CSV, щоб обробити його.", // 295 + "Канада" // 296 }, { "Italiano", // Italian @@ -4126,103 +4113,102 @@ static const char* const myLanguage[22][298] PROGMEM = { "Grande", // 198 "Tutto", // 199 "PS veloce", // 200 - "Predefinito", // 201 - "Disattiva schermo su\nconnessione XDRGTK", // 202 - "Miglioramento stereo FMSI", // 203 - "Funzione disponibile solo su TEF6687/6689!", // 204 - "Funzione non disponibile su skin selezionata!", // 205 - "Inizia scansione\ncanali di memoria", // 206 - "Ferma scansione\ncanali di memoria", // 207 - "Tempo di attesa", // 208 - "Inizia scansione DX", // 209 - "Opzioni FM DX", // 210 - "Abortito! Canale iniziale contrass. da saltare", // 211 - "Auto ordina AF", // 212 - "Canali di memoria", // 213 - "Escludi", // 214 - "Solo", // 215 - "Annulla scansione automatica", // 216 - "Correggi PI", // 217 - "Segnale", // 218 - "Disattiva audio\nmentre scansiona", // 219 - "AEREO", // 220 - "Premi per 5 sec. il pulsante di banda", // 221 - "Spegni", // 222 - "Schermo spento", // 223 - "Disabilitato", // 224 - "Nessuno", // 225 - "Notizie", // 226 - "Affari correnti", // 227 - "Informazioni", // 228 - "Sport", // 229 - "Educazione", // 230 - "Dramma", // 231 - "Cultura", // 232 - "Scienza", // 233 - "Varietà", // 234 - "Musica Pop", // 235 - "Musica Rock", // 236 - "Musica facile", // 237 - "Classica leggera", // 238 - "Classica seria", // 239 - "Altra musica", // 240 - "Meteo", // 241 - "Finanza", // 242 - "Programmi per bambini", // 243 - "Affari sociali", // 244 - "Religione", // 245 - "Telefonata", // 246 - "Viaggio", // 247 - "Tempo libero", // 248 - "Musica Jazz", // 249 - "Musica Country", // 250 - "Musica Nazionale", // 251 - "Musica Oldies", // 252 - "Musica Folk", // 253 - "Documentario", // 254 - "Test allarme", // 255 - "Allarme!!!", // 256 - "Iniziale", // 257 - "Sempre", // 258 - "Mostra orologio", // 259 - "Mostra PS lungo", // 260 - "Inizia frequenza", // 261 - "Ferma frequenza", // 262 - "Inizia canale memoria", // 263 - "Ferma canale memoria", // 264 - "Memorizza solo con RDS", // 265 - "Inizia auto memoria", // 266 - "Auto memoria", // 267 - "ID Stationlist", // 268 - "Trovato", // 269 - "Abortito! Canali di memoria esauriti", // 270 - "Abortito! L'utente ha premuto il pulsante", // 271 - "Scansione terminata senza errori", // 272 - "Cancella canali di memoria", // 273 - "Cancellato", // 274 - "Prevenire doppio PI", // 275 - "Range", // 276 - "Completo", // 277 - "Tempo di attesa su\nsolo segnale", // 278 - "Premi angolo evidenziato", // 279 - "Per calibrare touchscreen", // 280 - "Tieni premuto il tasto BW per\nfermare scanner DX", // 281 - "Seleziona larghezza di banda", // 282 - "Il tuo registro dei log", // 283 - "Scarica registro dei log", // 284 - "Registro dei log vuoto", // 285 - "Vai in fondo", // 286 - "Voce aggiunta\nal registro dei log", // 287 - "Errore nell'aggiunta\nvoce al registro dei log", // 288 - "Cancella registro", // 289 - "Registro cancellato", // 290 - "Cancellazione fallita", // 291 - "Impossibile aggiungere voce!\nRegistro dei log pieno!", // 292 - "Autologger", // 293 - "Auto DST su tempo NTP", // 294 - "Imposta offset orario NTP", // 295 - "Registro dei log con + di 130 voci, il visualizzatore non può gestirle. Scarica il file CSV per gestirlo.", // 296 - "Canada" // 297 + "Disattiva schermo su\nconnessione XDRGTK", // 201 + "Miglioramento stereo FMSI", // 202 + "Funzione disponibile solo su TEF6687/6689!", // 203 + "Funzione non disponibile su skin selezionata!", // 204 + "Inizia scansione\ncanali di memoria", // 205 + "Ferma scansione\ncanali di memoria", // 206 + "Tempo di attesa", // 207 + "Inizia scansione DX", // 208 + "Opzioni FM DX", // 209 + "Abortito! Canale iniziale contrass. da saltare", // 210 + "Auto ordina AF", // 211 + "Canali di memoria", // 212 + "Escludi", // 213 + "Solo", // 214 + "Annulla scansione automatica", // 215 + "Correggi PI", // 216 + "Segnale", // 217 + "Disattiva audio\nmentre scansiona", // 218 + "AEREO", // 219 + "Premi per 5 sec. il pulsante di banda", // 220 + "Spegni", // 221 + "Schermo spento", // 222 + "Disabilitato", // 223 + "Nessuno", // 224 + "Notizie", // 225 + "Affari correnti", // 226 + "Informazioni", // 227 + "Sport", // 228 + "Educazione", // 229 + "Dramma", // 230 + "Cultura", // 231 + "Scienza", // 232 + "Varietà", // 233 + "Musica Pop", // 234 + "Musica Rock", // 235 + "Musica facile", // 236 + "Classica leggera", // 237 + "Classica seria", // 238 + "Altra musica", // 239 + "Meteo", // 240 + "Finanza", // 241 + "Programmi per bambini", // 242 + "Affari sociali", // 243 + "Religione", // 244 + "Telefonata", // 245 + "Viaggio", // 246 + "Tempo libero", // 247 + "Musica Jazz", // 248 + "Musica Country", // 249 + "Musica Nazionale", // 250 + "Musica Oldies", // 251 + "Musica Folk", // 252 + "Documentario", // 253 + "Test allarme", // 254 + "Allarme!!!", // 255 + "Iniziale", // 256 + "Sempre", // 257 + "Mostra orologio", // 258 + "Mostra PS lungo", // 259 + "Inizia frequenza", // 260 + "Ferma frequenza", // 261 + "Inizia canale memoria", // 262 + "Ferma canale memoria", // 263 + "Memorizza solo con RDS", // 264 + "Inizia auto memoria", // 265 + "Auto memoria", // 266 + "ID Stationlist", // 267 + "Trovato", // 268 + "Abortito! Canali di memoria esauriti", // 269 + "Abortito! L'utente ha premuto il pulsante", // 270 + "Scansione terminata senza errori", // 271 + "Cancella canali di memoria", // 272 + "Cancellato", // 273 + "Prevenire doppio PI", // 274 + "Range", // 275 + "Completo", // 276 + "Tempo di attesa su\nsolo segnale", // 277 + "Premi angolo evidenziato", // 278 + "Per calibrare touchscreen", // 279 + "Tieni premuto il tasto BW per\nfermare scanner DX", // 280 + "Seleziona larghezza di banda", // 281 + "Il tuo registro dei log", // 282 + "Scarica registro dei log", // 283 + "Registro dei log vuoto", // 284 + "Vai in fondo", // 285 + "Voce aggiunta\nal registro dei log", // 286 + "Errore nell'aggiunta\nvoce al registro dei log", // 287 + "Cancella registro", // 288 + "Registro cancellato", // 289 + "Cancellazione fallita", // 290 + "Impossibile aggiungere voce!\nRegistro dei log pieno!", // 291 + "Autologger", // 292 + "Auto DST su tempo NTP", // 293 + "Imposta offset orario NTP", // 294 + "Registro dei log con + di 130 voci, il visualizzatore non può gestirle. Scarica il file CSV per gestirlo.", // 295 + "Canada" // 296 }, { "Simplified Chinese", // Simplified Chinese @@ -4426,103 +4412,102 @@ static const char* const myLanguage[22][298] PROGMEM = { "大", // 198 "全部", // 199 "快速 PS", // 200 - "默认", // 201 - "XDRGTK 连结时冻结屏幕", // 202 - "FMSI 立体声加强", // 203 - "此功能仅限 TEF6687/6689!", // 204 - "此主题不支持该功能!", // 205 - "开始扫描存储信道", // 206 - "停止扫描存储信道", // 207 - "扫描等待时间", // 208 - "开始 DX 扫描", // 209 - "FM DX 选项", // 210 - "取消! 所选信道被跳过.", // 211 - "自动排列 AF", // 212 - "已存储信道", // 213 - "不扫描", // 214 - "只扫描", // 215 - "自动取消扫描", // 216 - "正确的 PI", // 217 - "信号", // 218 - "扫描时静音", // 219 - "航空", // 220 - "按下波段键 5秒", // 221 - "关机", // 222 - "熄屏", // 223 - "禁止", // 224 - "无节目", // 225 - "News", // 226 - "Current Affairs", // 227 - "Information", // 228 - "Sport", // 229 - "Education", // 230 - "Drama", // 231 - "Culture", // 232 - "Science", // 233 - "Varied", // 234 - "Pop Music", // 235 - "Rock Music", // 236 - "Easy Listening", // 237 - "Light Classical", // 238 - "Serious Classical", // 239 - "Other Music", // 240 - "Weather", // 241 - "Finance", // 242 - "Children's Progs", // 243 - "Social Affairs", // 244 - "Religion", // 245 - "Phone-In", // 246 - "Travel", // 247 - "Leisure", // 248 - "Jazz Music", // 249 - "Country Music", // 250 - "National Music", // 251 - "Oldies Music", // 252 - "Folk Music", // 253 - "Documentary", // 254 - "警报测试", // 255 - "警报!!!", // 256 - "仅初次", // 257 - "总是", // 258 - "显示时间", // 259 - "显示长的 PS", // 260 - "开始频率", // 261 - "停止频率", // 262 - "开始的记忆信道", // 263 - "停止的记忆信道", // 264 - "只存储RDS电台", // 265 - "开始搜索并存台", // 266 - "自动搜台并存储", // 267 - "电台列表ID", // 268 - "搜索到", // 269 - "取消! 存储已满", // 270 - "取消! 用户终止了操作", // 271 - "成功完成搜索", // 272 - "删除存储信道", // 273 - "删除了", // 274 - "防止双 PI", // 275 - "一定范围内", // 276 - "全部", // 277 - "无信号不停留", // 278 - "触摸区边沿高亮", // 279 - "校准触摸屏", // 280 - "按住BW按钮停止DX扫描仪", // 281 - "选择带宽", // 282 - "你的 log记录", // 283 - "下载 log记录", // 284 - "log为空", // 285 - "跳到底部", // 286 - "添加到log记录", // 287 - "更新失败!", // 288 - "清除log记录", // 289 - "log记录已清除", // 290 - "清除失败", // 291 - "log记录已满!", // 292 - "自动记录日志", // 293 - "联网自动同步本机时间", // 294 - "设置NTP时区", // 295 - "该日志包含超过130个条目,观看者无法处理。请下载CSV文件进行处理。", // 296 - "加拿大" // 297 + "XDRGTK 连结时冻结屏幕", // 201 + "FMSI 立体声加强", // 202 + "此功能仅限 TEF6687/6689!", // 203 + "此主题不支持该功能!", // 204 + "开始扫描存储信道", // 205 + "停止扫描存储信道", // 206 + "扫描等待时间", // 207 + "开始 DX 扫描", // 208 + "FM DX 选项", // 209 + "取消! 所选信道被跳过.", // 210 + "自动排列 AF", // 211 + "已存储信道", // 212 + "不扫描", // 213 + "只扫描", // 214 + "自动取消扫描", // 215 + "正确的 PI", // 216 + "信号", // 217 + "扫描时静音", // 218 + "航空", // 219 + "按下波段键 5秒", // 220 + "关机", // 221 + "熄屏", // 222 + "禁止", // 223 + "无节目", // 224 + "News", // 225 + "Current Affairs", // 226 + "Information", // 227 + "Sport", // 228 + "Education", // 229 + "Drama", // 230 + "Culture", // 231 + "Science", // 232 + "Varied", // 233 + "Pop Music", // 234 + "Rock Music", // 235 + "Easy Listening", // 236 + "Light Classical", // 237 + "Serious Classical", // 238 + "Other Music", // 239 + "Weather", // 240 + "Finance", // 241 + "Children's Progs", // 242 + "Social Affairs", // 243 + "Religion", // 244 + "Phone-In", // 245 + "Travel", // 246 + "Leisure", // 247 + "Jazz Music", // 248 + "Country Music", // 249 + "National Music", // 250 + "Oldies Music", // 251 + "Folk Music", // 252 + "Documentary", // 253 + "警报测试", // 254 + "警报!!!", // 255 + "仅初次", // 256 + "总是", // 257 + "显示时间", // 258 + "显示长的 PS", // 259 + "开始频率", // 260 + "停止频率", // 261 + "开始的记忆信道", // 262 + "停止的记忆信道", // 263 + "只存储RDS电台", // 264 + "开始搜索并存台", // 265 + "自动搜台并存储", // 266 + "电台列表ID", // 267 + "搜索到", // 268 + "取消! 存储已满", // 269 + "取消! 用户终止了操作", // 270 + "成功完成搜索", // 271 + "删除存储信道", // 272 + "删除了", // 273 + "防止双 PI", // 274 + "一定范围内", // 275 + "全部", // 276 + "无信号不停留", // 277 + "触摸区边沿高亮", // 278 + "校准触摸屏", // 279 + "按住BW按钮停止DX扫描仪", // 280 + "选择带宽", // 281 + "你的 log记录", // 282 + "下载 log记录", // 283 + "log为空", // 284 + "跳到底部", // 285 + "添加到log记录", // 286 + "更新失败!", // 287 + "清除log记录", // 288 + "log记录已清除", // 289 + "清除失败", // 290 + "log记录已满!", // 291 + "自动记录日志", // 292 + "联网自动同步本机时间", // 293 + "设置NTP时区", // 294 + "该日志包含超过130个条目,观看者无法处理。请下载CSV文件进行处理。", // 295 + "加拿大" // 296 }, { "Norsk", // Norwegian @@ -4726,103 +4711,102 @@ static const char* const myLanguage[22][298] PROGMEM = { "Mye", // 198 "Alt", // 199 "Rask PS", // 200 - "Standard", // 201 - "Demp skjerm under\nXDRGTK-tilkobling", // 202 - "FMSI stereo forbedring", // 203 - "Funksjon kun tilgjengelig\npå TEF6687/6689!", // 204 - "Funksjon ikke tilgjengelig\npå valgt skin!", // 205 - "Start skanning av\nminnekanaler", // 206 - "Stopp skanning av\nminnekanaler", // 207 - "Ventetid", // 208 - "Start DX-skanning", // 209 - "FM DX-alternativer", // 210 - "Avbryt! Startkanalen er\nmerket som hoppet over", // 211 - "Auto-sorter AF", // 212 - "Minnekanaler", // 213 - "Ekskluder", // 214 - "Kun", // 215 - "Auto-avbryt skanning", // 216 - "Korriger PI", // 217 - "Signal", // 218 - "Demp lyd under\nskanning", // 219 - "AIR", // 220 - "Hold BAND-knappen i 5 sek", // 221 - "Slå av", // 222 - "Slå av skjerm", // 223 - "Deaktivert", // 224 - "Ingen", // 225 - "Nyheter", // 226 - "Aktualiteter", // 227 - "Informasjon", // 228 - "Sport", // 229 - "Utdanning", // 230 - "Drama", // 231 - "Kultur", // 232 - "Vitenskap", // 233 - "Underholdning", // 234 - "Popmusikk", // 235 - "Rockmusikk", // 236 - "Lett musikk", // 237 - "Lett klassisk", // 238 - "Klassisk musikk", // 239 - "Annen musikk", // 240 - "Værmelding", // 241 - "Økonomi", // 242 - "Barneprogrammer", // 243 - "Sosiale spørsmål", // 244 - "Religion", // 245 - "Ring inn", // 246 - "Reise", // 247 - "Fritid", // 248 - "Jazz", // 249 - "Countrymusikk", // 250 - "Nasjonal musikk", // 251 - "Gammelpop", // 252 - "Folkemusikk", // 253 - "Dokumentar", // 254 - "Alarmtest", // 255 - "ALARM!", // 256 - "Innledende", // 257 - "Alltid", // 258 - "Vis klokke", // 259 - "Vis lang PS", // 260 - "Startfrekvens", // 261 - "Stoppfrekvens", // 262 - "Start minnekanal", // 263 - "Stopp minnekanal", // 264 - "Lagre kun med RDS", // 265 - "Start auto-minne", // 266 - "Auto-minne", // 267 - "Stationlist-ID", // 268 - "Funnet", // 269 - "Avbrutt! Ingen minnekanaler", // 270 - "Avbrutt! Bruker trykket knapp", // 271 - "Skanning fullført uten feil", // 272 - "Slett minnekanaler", // 273 - "ryddet", // 274 - "Forhindre doble PI-er", // 275 - "Spekter", // 276 - "Fullt", // 277 - "Ventetid kun\nved signal", // 278 - "Trykk på uthevet hjørne", // 279 - "Kalibrer berøringsskjerm", // 280 - "Hold BW-knappen for å\nstoppe DX-skanning", // 281 - "Velg båndbredde", // 282 - "Din loggbok", // 283 - "Last ned loggbok", // 284 - "Loggbok er tom", // 285 - "Gå til bunn", // 286 - "Oppføring lagt til i loggen", // 287 - "Feil ved lagring i loggen", // 288 - "Tøm loggbok", // 289 - "Loggbok tømt", // 290 - "Tømming mislyktes", // 291 - "Kan ikke lagre!\nLoggbok er full!", // 292 - "Autologger", // 293 - "Auto sommertid med NTP", // 294 - "Angi NTP-tidsforskyvning", // 295 - "Loggbok har over 130 oppføringer.\nLast ned CSV for behandling.", // 296 - "Canada" // 297 + "Demp skjerm under\nXDRGTK-tilkobling", // 201 + "FMSI stereo forbedring", // 202 + "Funksjon kun tilgjengelig\npå TEF6687/6689!", // 203 + "Funksjon ikke tilgjengelig\npå valgt skin!", // 204 + "Start skanning av\nminnekanaler", // 205 + "Stopp skanning av\nminnekanaler", // 206 + "Ventetid", // 207 + "Start DX-skanning", // 208 + "FM DX-alternativer", // 209 + "Avbryt! Startkanalen er\nmerket som hoppet over", // 210 + "Auto-sorter AF", // 211 + "Minnekanaler", // 212 + "Ekskluder", // 213 + "Kun", // 214 + "Auto-avbryt skanning", // 215 + "Korriger PI", // 216 + "Signal", // 217 + "Demp lyd under\nskanning", // 218 + "AIR", // 219 + "Hold BAND-knappen i 5 sek", // 220 + "Slå av", // 221 + "Slå av skjerm", // 222 + "Deaktivert", // 223 + "Ingen", // 224 + "Nyheter", // 225 + "Aktualiteter", // 226 + "Informasjon", // 227 + "Sport", // 228 + "Utdanning", // 229 + "Drama", // 230 + "Kultur", // 231 + "Vitenskap", // 232 + "Underholdning", // 233 + "Popmusikk", // 234 + "Rockmusikk", // 235 + "Lett musikk", // 236 + "Lett klassisk", // 237 + "Klassisk musikk", // 238 + "Annen musikk", // 239 + "Værmelding", // 240 + "Økonomi", // 241 + "Barneprogrammer", // 242 + "Sosiale spørsmål", // 243 + "Religion", // 244 + "Ring inn", // 245 + "Reise", // 246 + "Fritid", // 247 + "Jazz", // 248 + "Countrymusikk", // 249 + "Nasjonal musikk", // 250 + "Gammelpop", // 251 + "Folkemusikk", // 252 + "Dokumentar", // 253 + "Alarmtest", // 254 + "ALARM!", // 255 + "Innledende", // 256 + "Alltid", // 257 + "Vis klokke", // 258 + "Vis lang PS", // 259 + "Startfrekvens", // 260 + "Stoppfrekvens", // 261 + "Start minnekanal", // 262 + "Stopp minnekanal", // 263 + "Lagre kun med RDS", // 264 + "Start auto-minne", // 265 + "Auto-minne", // 266 + "Stationlist-ID", // 267 + "Funnet", // 268 + "Avbrutt! Ingen minnekanaler", // 269 + "Avbrutt! Bruker trykket knapp", // 270 + "Skanning fullført uten feil", // 271 + "Slett minnekanaler", // 272 + "ryddet", // 273 + "Forhindre doble PI-er", // 274 + "Spekter", // 275 + "Fullt", // 276 + "Ventetid kun\nved signal", // 277 + "Trykk på uthevet hjørne", // 278 + "Kalibrer berøringsskjerm", // 279 + "Hold BW-knappen for å\nstoppe DX-skanning", // 280 + "Velg båndbredde", // 281 + "Din loggbok", // 282 + "Last ned loggbok", // 283 + "Loggbok er tom", // 284 + "Gå til bunn", // 285 + "Oppføring lagt til i loggen", // 286 + "Feil ved lagring i loggen", // 287 + "Tøm loggbok", // 288 + "Loggbok tømt", // 289 + "Tømming mislyktes", // 290 + "Kan ikke lagre!\nLoggbok er full!", // 291 + "Autologger", // 292 + "Auto sommertid med NTP", // 293 + "Angi NTP-tidsforskyvning", // 294 + "Loggbok har over 130 oppføringer.\nLast ned CSV for behandling.", // 295 + "Canada" // 296 }, { "Español", // Spanish @@ -5026,103 +5010,102 @@ static const char* const myLanguage[22][298] PROGMEM = { "Grande", // 198 "Todo", // 199 "PS rápido", // 200 - "Predeterminado", // 201 - "Silenciar pantalla\nen conexión XDRGTK", // 202 - "Mejora estéreo FMSI", // 203 - "¡Función solo para\nTEF6687/6689!", // 204 - "¡Función no disponible\nen skin seleccionada!", // 205 - "Iniciar escaneo\nde memorias", // 206 - "Detener escaneo\nde memorias", // 207 - "Tiempo de espera", // 208 - "Iniciar escaneo DX", // 209 - "Opciones FM DX", // 210 - "¡Abortar! Canal inicial\nmarcado como omitido", // 211 - "Ordenar AF automático", // 212 - "Canales guardados", // 213 - "Excluir", // 214 - "Solo", // 215 - "Cancelaciòn automàtica", // 216 - "PI correcto", // 217 - "Señal", // 218 - "Silenciar audio\ndurante escaneo", // 219 - "AIR", // 220 - "Mantener BANDA 5 seg.", // 221 - "Apagar", // 222 - "Apagar pantalla", // 223 - "Desactivado", // 224 - "Ninguno", // 225 - "Noticias", // 226 - "Magazine", // 227 - "Información", // 228 - "Deportes", // 229 - "Educación", // 230 - "Drama", // 231 - "Cultura", // 232 - "Ciencia", // 233 - "Variedades", // 234 - "Música pop", // 235 - "Música rock", // 236 - "Música ligera", // 237 - "Clásica ligera", // 238 - "Clásica seria", // 239 - "Otros géneros", // 240 - "Meteorología", // 241 - "Finanzas", // 242 - "Infantiles", // 243 - "Sociedad", // 244 - "Religión", // 245 - "Llamadas en vivo", // 246 - "Viajes", // 247 - "Ocio", // 248 - "Jazz", // 249 - "Country", // 250 - "Música nacional", // 251 - "Música de Ayer", // 252 - "Folclórica", // 253 - "Documental", // 254 - "Prueba de alarma", // 255 - "¡ALARMA!", // 256 - "Inicial", // 257 - "Siempre", // 258 - "Mostrar reloj", // 259 - "Mostrar PS largo", // 260 - "Frecuencia inicial", // 261 - "Frecuencia final", // 262 - "Canal inicial", // 263 - "Canal final", // 264 - "Guardar solo\ncon RDS", // 265 - "Iniciar memoria\nautomática", // 266 - "Memoria automática", // 267 - "ID Stationlist", // 268 - "Encontrado", // 269 - "¡Error! Sin memorias", // 270 - "¡Cancelado! Usuario\ndetuvo", // 271 - "Escaneo exitoso", // 272 - "Borrar memorias", // 273 - "borrado", // 274 - "Evitar PI duplicado", // 275 - "Rango", // 276 - "Completo", // 277 - "Esperar solo\ncon señal", // 278 - "Toque la esquina\nresaltada", // 279 - "Calibrar pantalla\ntáctil", // 280 - "Mantenga BW para\ndetener DX", // 281 - "Seleccionar ancho\nde banda", // 282 - "Libro de registro", // 283 - "Descargar registro", // 284 - "Registro vacío", // 285 - "Ir al final", // 286 - "Entrada añadida", // 287 - "Error al añadir", // 288 - "Borrar registro", // 289 - "Registro borrado", // 290 - "Error al borrar", // 291 - "¡Registro lleno!\nNo se puede añadir", // 292 - "Autoregistro", // 293 - "DST automático (NTP)", // 294 - "Ajustar\ndesplazamiento NTP", // 295 - "El registro tiene +130 entradas.\nDescargue el CSV.", // 296 - "Canadá" // 297 + "Silenciar pantalla\nen conexión XDRGTK", // 201 + "Mejora estéreo FMSI", // 202 + "¡Función solo para\nTEF6687/6689!", // 203 + "¡Función no disponible\nen skin seleccionada!", // 204 + "Iniciar escaneo\nde memorias", // 205 + "Detener escaneo\nde memorias", // 206 + "Tiempo de espera", // 207 + "Iniciar escaneo DX", // 208 + "Opciones FM DX", // 209 + "¡Abortar! Canal inicial\nmarcado como omitido", // 210 + "Ordenar AF automático", // 211 + "Canales guardados", // 212 + "Excluir", // 213 + "Solo", // 214 + "Cancelaciòn automàtica", // 215 + "PI correcto", // 216 + "Señal", // 217 + "Silenciar audio\ndurante escaneo", // 218 + "AIR", // 219 + "Mantener BANDA 5 seg.", // 220 + "Apagar", // 221 + "Apagar pantalla", // 222 + "Desactivado", // 223 + "Ninguno", // 224 + "Noticias", // 225 + "Magazine", // 226 + "Información", // 227 + "Deportes", // 228 + "Educación", // 229 + "Drama", // 230 + "Cultura", // 231 + "Ciencia", // 232 + "Variedades", // 233 + "Música pop", // 234 + "Música rock", // 235 + "Música ligera", // 236 + "Clásica ligera", // 237 + "Clásica seria", // 238 + "Otros géneros", // 239 + "Meteorología", // 240 + "Finanzas", // 241 + "Infantiles", // 242 + "Sociedad", // 243 + "Religión", // 244 + "Llamadas en vivo", // 245 + "Viajes", // 246 + "Ocio", // 247 + "Jazz", // 248 + "Country", // 249 + "Música nacional", // 250 + "Música de Ayer", // 251 + "Folclórica", // 252 + "Documental", // 253 + "Prueba de alarma", // 254 + "¡ALARMA!", // 255 + "Inicial", // 256 + "Siempre", // 257 + "Mostrar reloj", // 258 + "Mostrar PS largo", // 259 + "Frecuencia inicial", // 260 + "Frecuencia final", // 261 + "Canal inicial", // 262 + "Canal final", // 263 + "Guardar solo\ncon RDS", // 264 + "Iniciar memoria\nautomática", // 265 + "Memoria automática", // 266 + "ID Stationlist", // 267 + "Encontrado", // 268 + "¡Error! Sin memorias", // 269 + "¡Cancelado! Usuario\ndetuvo", // 270 + "Escaneo exitoso", // 271 + "Borrar memorias", // 272 + "borrado", // 273 + "Evitar PI duplicado", // 274 + "Rango", // 275 + "Completo", // 276 + "Esperar solo\ncon señal", // 277 + "Toque la esquina\nresaltada", // 278 + "Calibrar pantalla\ntáctil", // 279 + "Mantenga BW para\ndetener DX", // 280 + "Seleccionar ancho\nde banda", // 281 + "Libro de registro", // 282 + "Descargar registro", // 283 + "Registro vacío", // 284 + "Ir al final", // 285 + "Entrada añadida", // 286 + "Error al añadir", // 287 + "Borrar registro", // 288 + "Registro borrado", // 289 + "Error al borrar", // 290 + "¡Registro lleno!\nNo se puede añadir", // 291 + "Autoregistro", // 292 + "DST automático (NTP)", // 293 + "Ajustar\ndesplazamiento NTP", // 294 + "El registro tiene +130 entradas.\nDescargue el CSV.", // 295 + "Canadá" // 296 }, { "Português", // Portuguese @@ -5326,103 +5309,102 @@ static const char* const myLanguage[22][298] PROGMEM = { "Grande", // 198 "Tudo", // 199 "PS rápido", // 200 - "Predefinição", // 201 - "Tela mudo na\nconexão XDRGTK", // 202 - "FMSI melhoria\ndo som estéreo", // 203 - "Função disponível apenas\nno TEF6687/6689!", // 204 - "Função não disponível\nno skin selecionado!", // 205 - "Comece a pesquisar\ncanais de memória", // 206 - "Pare de pesquisar\ncanais de memória", // 207 - "Tempo de espera", // 208 - "Comece a pesquisar DX", // 209 - "Opções FM DX", // 210 - "Abortar! O canal\ninicial é ignorado.", // 211 - "Classificar AF\nautomaticamente", // 212 - "Canais memorizados", // 213 - "Excluir", // 214 - "Apenas", // 215 - "Cancelar automatic.\na pesquisa", // 216 - "PI correto", // 217 - "Sinal", // 218 - "Mudo áudio\nenquanto procura", // 219 - "AIR", // 220 - "Pressione o botão\nbanda por 5 seg.", // 221 - "Desligar", // 222 - "Tela desligado", // 223 - "Inativo", // 224 - "Não definido", // 225 - "Notícias", // 226 - "Actualidade", // 227 - "Informação", // 228 - "Desporto", // 229 - "Educação", // 230 - "Rádio – Teatro", // 231 - "Cultura", // 232 - "Ciência", // 233 - "Variado", // 234 - "Música Pop", // 235 - "Música Rock", // 236 - "Música Ligeira", // 237 - "Clássica Ligeira", // 238 - "Música Clássica", // 239 - "Outras Músicas", // 240 - "Meteorologia", // 241 - "Economia", // 242 - "Progr. Infantil", // 243 - "Acontec. Social", // 244 - "Religião", // 245 - "Phone-In", // 246 - "Viagens", // 247 - "Lazer", // 248 - "Música de Jazz", // 249 - "Música Country", // 250 - "Música Nacional", // 251 - "Música Antiga", // 252 - "Música Folk", // 253 - "Documentário", // 254 - "Teste de Alarme", // 255 - "Alarme – Alarme !", // 256 - "Inicial", // 257 - "Sempre", // 258 - "Mostrar relógio", // 259 - "Mostrar PS longo", // 260 - "Iniciar frequência", // 261 - "Parar frequência", // 262 - "Iniciar canal\nde memória", // 263 - "Parar canal de memória", // 264 - "Somente armazenar\ncom RDS", // 265 - "Iniciar memória automática", // 266 - "Memória automática", // 267 - "ID da lista de estações", // 268 - "Encontrado", // 269 - "Abortar! Sem canais\nde memória disponíveis", // 270 - "Abortar! Usuário\npressionou o botão", // 271 - "Verificação concluída\nsem erros", // 272 - "Limpar canais\nde memória", // 273 - "limpo", // 274 - "Prevenir PI duplo", // 275 - "Intervalo", // 276 - "Completo", // 277 - "Espera tempo apenas\nquando sinal", // 278 - "Pressione o\ncanto inscrito", // 279 - "Para calibração\nda tela de toque", // 280 - "Segure BW para parar", // 281 - "Selecione largura de banda", // 282 - "Seu livro de registro", // 283 - "Baixar livro de registro", // 284 - "O livro de registro está vazio", // 285 - "Ir para o final", // 286 - "Adicionado ao registro", // 287 - "Falha na atualização!", // 288 - "Limpar livro\nde registro", // 289 - "Livro limpo", // 290 - "Falha ao limpar", // 291 - "Não é possível adicionar!\nO livro está cheio!", // 292 - "Registrador automático", // 293 - "DST automático\nno horário NTP", // 294 - "Definir deslocamento\nde tempo NTP", // 295 - "O diário de bordo contém mais de 130 entradas que o espectador não consegue processar. Descarregue o ficheiro CSV para processá-lo.", // 296 - "Canadá" // 297 + "Tela mudo na\nconexão XDRGTK", // 201 + "FMSI melhoria\ndo som estéreo", // 202 + "Função disponível apenas\nno TEF6687/6689!", // 203 + "Função não disponível\nno skin selecionado!", // 204 + "Comece a pesquisar\ncanais de memória", // 205 + "Pare de pesquisar\ncanais de memória", // 206 + "Tempo de espera", // 207 + "Comece a pesquisar DX", // 208 + "Opções FM DX", // 209 + "Abortar! O canal\ninicial é ignorado.", // 210 + "Classificar AF\nautomaticamente", // 211 + "Canais memorizados", // 212 + "Excluir", // 213 + "Apenas", // 214 + "Cancelar automatic.\na pesquisa", // 215 + "PI correto", // 216 + "Sinal", // 217 + "Mudo áudio\nenquanto procura", // 218 + "AIR", // 219 + "Pressione o botão\nbanda por 5 seg.", // 220 + "Desligar", // 221 + "Tela desligado", // 222 + "Inativo", // 223 + "Não definido", // 224 + "Notícias", // 225 + "Actualidade", // 226 + "Informação", // 227 + "Desporto", // 228 + "Educação", // 229 + "Rádio – Teatro", // 230 + "Cultura", // 231 + "Ciência", // 232 + "Variado", // 233 + "Música Pop", // 234 + "Música Rock", // 235 + "Música Ligeira", // 236 + "Clássica Ligeira", // 237 + "Música Clássica", // 238 + "Outras Músicas", // 239 + "Meteorologia", // 240 + "Economia", // 241 + "Progr. Infantil", // 242 + "Acontec. Social", // 243 + "Religião", // 244 + "Phone-In", // 245 + "Viagens", // 246 + "Lazer", // 247 + "Música de Jazz", // 248 + "Música Country", // 249 + "Música Nacional", // 250 + "Música Antiga", // 251 + "Música Folk", // 252 + "Documentário", // 253 + "Teste de Alarme", // 254 + "Alarme – Alarme !", // 255 + "Inicial", // 256 + "Sempre", // 257 + "Mostrar relógio", // 258 + "Mostrar PS longo", // 259 + "Iniciar frequência", // 260 + "Parar frequência", // 261 + "Iniciar canal\nde memória", // 262 + "Parar canal de memória", // 263 + "Somente armazenar\ncom RDS", // 264 + "Iniciar memória automática", // 265 + "Memória automática", // 266 + "ID da lista de estações", // 267 + "Encontrado", // 268 + "Abortar! Sem canais\nde memória disponíveis", // 269 + "Abortar! Usuário\npressionou o botão", // 270 + "Verificação concluída\nsem erros", // 271 + "Limpar canais\nde memória", // 272 + "limpo", // 273 + "Prevenir PI duplo", // 274 + "Intervalo", // 275 + "Completo", // 276 + "Espera tempo apenas\nquando sinal", // 277 + "Pressione o\ncanto inscrito", // 278 + "Para calibração\nda tela de toque", // 279 + "Segure BW para parar", // 280 + "Selecione largura de banda", // 281 + "Seu livro de registro", // 282 + "Baixar livro de registro", // 283 + "O livro de registro está vazio", // 284 + "Ir para o final", // 285 + "Adicionado ao registro", // 286 + "Falha na atualização!", // 287 + "Limpar livro\nde registro", // 288 + "Livro limpo", // 289 + "Falha ao limpar", // 290 + "Não é possível adicionar!\nO livro está cheio!", // 291 + "Registrador automático", // 292 + "DST automático\nno horário NTP", // 293 + "Definir deslocamento\nde tempo NTP", // 294 + "O diário de bordo contém mais de 130 entradas que o espectador não consegue processar. Descarregue o ficheiro CSV para processá-lo.", // 295 + "Canadá" // 296 }, { "Srpski", // Serbian @@ -5626,103 +5608,102 @@ static const char* const myLanguage[22][298] PROGMEM = { "Veliko", // 198 "Svi", // 199 "Brzi PS", // 200 - "Podrazumevano", // 201 - "Utišaj ekran na XDRGTK", // 202 - "FMSI stereo\npoboljšanje", // 203 - "Funkcija dostupna\nsamo na TEF6687/6689!", // 204 - "Funkcija nije dostupna na koži!", // 205 - "Počnite skeniranje kanala", // 206 - "Zaustavite skeniranje kanala", // 207 - "Vreme čekanja", // 208 - "Pokrenite DX\nskeniranje", // 209 - "FM DX Opcije", // 210 - "Abort! Početni kanal preskočen", // 211 - "Automatski sortiraj AF", // 212 - "Memorijski kanali", // 213 - "Isključi", // 214 - "Samo", // 215 - "Automatski otkaži skeniranje", // 216 - "Ispravi PI", // 217 - "Signal", // 218 - "Utišaj zvuk\nu toku skeniranja", // 219 - "ZRAK", // 220 - "5 sekundi pritiska na dugme", // 221 - "Isključivanje", // 222 - "Isključi ekran", // 223 - "Onemogućeno", // 224 - "Nema", // 225 - "Vesti", // 226 - "Aktuelnosti", // 227 - "Informacije", // 228 - "Sport", // 229 - "Obrazovanje", // 230 - "Drama", // 231 - "Kultura", // 232 - "Nauka", // 233 - "Raznovrsno", // 234 - "Pop muzika", // 235 - "Rock muzika", // 236 - "Lagana muzika", // 237 - "Laka klasična", // 238 - "Seriozna klasična", // 239 - "Ostala muzika", // 240 - "Vreme", // 241 - "Finansije", // 242 - "Dečiji programi", // 243 - "Socijalna pitanja", // 244 - "Religija", // 245 - "Telefon na liniji", // 246 - "Putovanja", // 247 - "Odmor", // 248 - "Jazz muzika", // 249 - "Country muzika", // 250 - "Nacionalna muzika", // 251 - "Stari hitovi", // 252 - "Folk muzika", // 253 - "Dokumentarni", // 254 - "Test alarma", // 255 - "Alarm!!!", // 256 - "Početni", // 257 - "Uvek", // 258 - "Prikazivanje\nsata", // 259 - "Prikazivanje\ndugog PS", // 260 - "Početna frekvencija", // 261 - "Krajnja frekvencija", // 262 - "Početni memorijski\nkanal", // 263 - "Krajnji memorijski\nkanal", // 264 - "Samo sa RDS", // 265 - "Pokreni automatsko\nmemorijsko pamćenje", // 266 - "Automatsko memorisanje", // 267 - "Stationlist ID", // 268 - "Pronađeno", // 269 - "Abort! Nedostaju kanali", // 270 - "Abort! Korisnik je\npritisnuo dugme", // 271 - "Skeniranje završeno\nbez grešaka", // 272 - "Očisti memorijske\nkanale", // 273 - "obrisano", // 274 - "Prevencija duplog PI", // 275 - "Opseg", // 276 - "Puno", // 277 - "Vreme čekanja na signal", // 278 - "Pritisnite označeni\nugao", // 279 - "Za kalibraciju\nekrana", // 280 - "Drži BW da staneš", // 281 - "Izaberi širinu\nopsega", // 282 - "Tvoj dnevnik", // 283 - "Preuzmi dnevnik", // 284 - "Dnevnik je prazan", // 285 - "Idi do dna", // 286 - "Dodano u dnevnik", // 287 - "Ažuriranje nije\nuspelo!", // 288 - "Očisti dnevnik", // 289 - "Dnevnik očišćen", // 290 - "Greška pri brisanju", // 291 - "Ne može se dodati!\nDnevnik je pun!", // 292 - "Automatski logger", // 293 - "Auto DST na\nNTP vremenu", // 294 - "Postavite NTP\nvremenski offset", // 295 - "Dnevnik sadrži više od 130 unosa, što viewer ne može obraditi. Preuzmite CSV fajl za obradu.", // 296 - "Canada" // 297 + "Utišaj ekran na XDRGTK", // 201 + "FMSI stereo\npoboljšanje", // 202 + "Funkcija dostupna\nsamo na TEF6687/6689!", // 203 + "Funkcija nije dostupna na koži!", // 204 + "Počnite skeniranje kanala", // 205 + "Zaustavite skeniranje kanala", // 206 + "Vreme čekanja", // 207 + "Pokrenite DX\nskeniranje", // 208 + "FM DX Opcije", // 209 + "Abort! Početni kanal preskočen", // 210 + "Automatski sortiraj AF", // 211 + "Memorijski kanali", // 212 + "Isključi", // 213 + "Samo", // 214 + "Automatski otkaži skeniranje", // 215 + "Ispravi PI", // 216 + "Signal", // 217 + "Utišaj zvuk\nu toku skeniranja", // 218 + "ZRAK", // 219 + "5 sekundi pritiska na dugme", // 220 + "Isključivanje", // 221 + "Isključi ekran", // 222 + "Onemogućeno", // 223 + "Nema", // 224 + "Vesti", // 225 + "Aktuelnosti", // 226 + "Informacije", // 227 + "Sport", // 228 + "Obrazovanje", // 229 + "Drama", // 230 + "Kultura", // 231 + "Nauka", // 232 + "Raznovrsno", // 233 + "Pop muzika", // 234 + "Rock muzika", // 235 + "Lagana muzika", // 236 + "Laka klasična", // 237 + "Seriozna klasična", // 238 + "Ostala muzika", // 239 + "Vreme", // 240 + "Finansije", // 241 + "Dečiji programi", // 242 + "Socijalna pitanja", // 243 + "Religija", // 244 + "Telefon na liniji", // 245 + "Putovanja", // 246 + "Odmor", // 247 + "Jazz muzika", // 248 + "Country muzika", // 249 + "Nacionalna muzika", // 250 + "Stari hitovi", // 251 + "Folk muzika", // 252 + "Dokumentarni", // 253 + "Test alarma", // 254 + "Alarm!!!", // 255 + "Početni", // 256 + "Uvek", // 257 + "Prikazivanje\nsata", // 258 + "Prikazivanje\ndugog PS", // 259 + "Početna frekvencija", // 260 + "Krajnja frekvencija", // 261 + "Početni memorijski\nkanal", // 262 + "Krajnji memorijski\nkanal", // 263 + "Samo sa RDS", // 264 + "Pokreni automatsko\nmemorijsko pamćenje", // 265 + "Automatsko memorisanje", // 266 + "Stationlist ID", // 267 + "Pronađeno", // 268 + "Abort! Nedostaju kanali", // 269 + "Abort! Korisnik je\npritisnuo dugme", // 270 + "Skeniranje završeno\nbez grešaka", // 271 + "Očisti memorijske\nkanale", // 272 + "obrisano", // 273 + "Prevencija duplog PI", // 274 + "Opseg", // 275 + "Puno", // 276 + "Vreme čekanja na signal", // 277 + "Pritisnite označeni\nugao", // 278 + "Za kalibraciju\nekrana", // 279 + "Drži BW da staneš", // 280 + "Izaberi širinu\nopsega", // 281 + "Tvoj dnevnik", // 282 + "Preuzmi dnevnik", // 283 + "Dnevnik je prazan", // 284 + "Idi do dna", // 285 + "Dodano u dnevnik", // 286 + "Ažuriranje nije\nuspelo!", // 287 + "Očisti dnevnik", // 288 + "Dnevnik očišćen", // 289 + "Greška pri brisanju", // 290 + "Ne može se dodati!\nDnevnik je pun!", // 291 + "Automatski logger", // 292 + "Auto DST na\nNTP vremenu", // 293 + "Postavite NTP\nvremenski offset", // 294 + "Dnevnik sadrži više od 130 unosa, što viewer ne može obraditi. Preuzmite CSV fajl za obradu.", // 295 + "Canada" // 296 }, { "Suomi", // Finnish @@ -5926,103 +5907,102 @@ static const char* const myLanguage[22][298] PROGMEM = { "Suuri", // 198 "Kaikki", // 199 "Nopea PS", // 200 - "Oletus", // 201 - "Hiljennä näyttö\nXDRGTK-yhteyden aikana", // 202 - "FMSI stereo\nparannus", // 203 - "Toiminto saatavilla vain\nTEF6687/6689:ssä!", // 204 - "Toiminto ei saatavilla\nvalitussa pinnassa!", // 205 - "Aloita skannaus\nmuistikanavilla", // 206 - "Pysäytä skannaus\nmuistikanavilla", // 207 - "Odota-aika", // 208 - "Aloita DX-skannaus", // 209 - "FM DX Asetukset", // 210 - "Keskeytä! Aloituskanava\non merkitty ohitettavaksi.", // 211 - "Automaattinen AF lajittelu", // 212 - "Muistikanavat", // 213 - "Sulje", // 214 - "Vain", // 215 - "Automaattinen skannauksen peruutus", // 216 - "Korjaa PI", // 217 - "Signaali", // 218 - "Hiljennä ääni\nskannauksen aikana", // 219 - "ILMA", // 220 - "5 sekunnin bandinäppäimen\npainallus", // 221 - "Virta pois", // 222 - "Näyttö pois", // 223 - "Poistettu", // 224 - "Ei mitään", // 225 - "Uutiset", // 226 - "Ajankohtaiset", // 227 - "Tietoa", // 228 - "Urheilu", // 229 - "Koulutus", // 230 - "Draama", // 231 - "Kulttuuri", // 232 - "Tiede", // 233 - "Vaihteleva", // 234 - "Pop-musiikki", // 235 - "Rock-musiikki", // 236 - "Helppokuuntelu", // 237 - "Kevyt klassinen", // 238 - "Vakava klassinen", // 239 - "Muu musiikki", // 240 - "Sää", // 241 - "Talous", // 242 - "Lasten ohjelmat", // 243 - "Sosiaaliasiat", // 244 - "Uskonto", // 245 - "Puhelinlinja", // 246 - "Matkustus", // 247 - "Vapaa-aika", // 248 - "Jazz-musiikki", // 249 - "Country-musiikki", // 250 - "Kansallismusiikki", // 251 - "Oldies-musiikki", // 252 - "Folk-musiikki", // 253 - "Dokumentti", // 254 - "Hälytyksen testi", // 255 - "Hälytys!!!", // 256 - "Alkuperäinen", // 257 - "Aina", // 258 - "Näytä kello", // 259 - "Näytä pitkä PS", // 260 - "Aloita taajuus", // 261 - "Pysäytä taajuus", // 262 - "Aloita muistikanava", // 263 - "Pysäytä muistikanava", // 264 - "Tallenna vain RDS:n\nkanssa", // 265 - "Aloita\nautomaattinen muistio", // 266 - "Automaattinen muisti", // 267 - "Stationlist ID", // 268 - "Löytyi", // 269 - "Keskeytä! Muistikanavat loppu", // 270 - "Keskeytä! Käyttäjä painoi nappia", // 271 - "Skannaus valmis ilman virheitä", // 272 - "Tyhjennä\nmuistikanavat", // 273 - "tyhjennetty", // 274 - "Estä kaksois-PI", // 275 - "Alue", // 276 - "Täysi", // 277 - "Odota-aika\nvain signaalille", // 278 - "Paina korostettua kulmaa", // 279 - "Kalibroi kosketusnäyttö", // 280 - "Pidä BW-nappia painettuna\npysäyttääksesi DX-skannerin", // 281 - "Valitse\nkaistanleveys", // 282 - "Oma lokikirja", // 283 - "Lataa lokikirja", // 284 - "Lokikirja on tyhjä", // 285 - "Mene alas", // 286 - "Merkintä lisätty\nlokikirjaan", // 287 - "Virhe lisättäessä\nmerkintää lokikirjaan", // 288 - "Tyhjennä lokikirja", // 289 - "Lokikirja\ntyhjennetty", // 290 - "Tyhjennys\nepäonnistui", // 291 - "Ei voida lisätä merkintää!\nLokikirja on täynnä!", // 292 - "Autolokikirja", // 293 - "Auto DST\nNTP-ajassa", // 294 - "Aseta\nNTP-aikasiirto", // 295 - "Lokikirja sisältää yli 130 merkintää, joita katselija ei pysty käsittelemään. Lataa CSV-tiedosto sen käsittelemiseksi.", // 296 - "Kanada" // 297 + "Hiljennä näyttö\nXDRGTK-yhteyden aikana", // 201 + "FMSI stereo\nparannus", // 202 + "Toiminto saatavilla vain\nTEF6687/6689:ssä!", // 203 + "Toiminto ei saatavilla\nvalitussa pinnassa!", // 204 + "Aloita skannaus\nmuistikanavilla", // 205 + "Pysäytä skannaus\nmuistikanavilla", // 206 + "Odota-aika", // 207 + "Aloita DX-skannaus", // 208 + "FM DX Asetukset", // 209 + "Keskeytä! Aloituskanava\non merkitty ohitettavaksi.", // 210 + "Automaattinen AF lajittelu", // 211 + "Muistikanavat", // 212 + "Sulje", // 213 + "Vain", // 214 + "Automaattinen skannauksen peruutus", // 215 + "Korjaa PI", // 216 + "Signaali", // 217 + "Hiljennä ääni\nskannauksen aikana", // 218 + "ILMA", // 219 + "5 sekunnin bandinäppäimen\npainallus", // 220 + "Virta pois", // 221 + "Näyttö pois", // 222 + "Poistettu", // 223 + "Ei mitään", // 224 + "Uutiset", // 225 + "Ajankohtaiset", // 226 + "Tietoa", // 227 + "Urheilu", // 228 + "Koulutus", // 229 + "Draama", // 230 + "Kulttuuri", // 231 + "Tiede", // 232 + "Vaihteleva", // 233 + "Pop-musiikki", // 234 + "Rock-musiikki", // 235 + "Helppokuuntelu", // 236 + "Kevyt klassinen", // 237 + "Vakava klassinen", // 238 + "Muu musiikki", // 239 + "Sää", // 240 + "Talous", // 241 + "Lasten ohjelmat", // 242 + "Sosiaaliasiat", // 243 + "Uskonto", // 244 + "Puhelinlinja", // 245 + "Matkustus", // 246 + "Vapaa-aika", // 247 + "Jazz-musiikki", // 248 + "Country-musiikki", // 249 + "Kansallismusiikki", // 250 + "Oldies-musiikki", // 251 + "Folk-musiikki", // 252 + "Dokumentti", // 253 + "Hälytyksen testi", // 254 + "Hälytys!!!", // 255 + "Alkuperäinen", // 256 + "Aina", // 257 + "Näytä kello", // 258 + "Näytä pitkä PS", // 259 + "Aloita taajuus", // 260 + "Pysäytä taajuus", // 261 + "Aloita muistikanava", // 262 + "Pysäytä muistikanava", // 263 + "Tallenna vain RDS:n\nkanssa", // 264 + "Aloita\nautomaattinen muistio", // 265 + "Automaattinen muisti", // 266 + "Stationlist ID", // 267 + "Löytyi", // 268 + "Keskeytä! Muistikanavat loppu", // 269 + "Keskeytä! Käyttäjä painoi nappia", // 270 + "Skannaus valmis ilman virheitä", // 271 + "Tyhjennä\nmuistikanavat", // 272 + "tyhjennetty", // 273 + "Estä kaksois-PI", // 274 + "Alue", // 275 + "Täysi", // 276 + "Odota-aika\nvain signaalille", // 277 + "Paina korostettua kulmaa", // 278 + "Kalibroi kosketusnäyttö", // 279 + "Pidä BW-nappia painettuna\npysäyttääksesi DX-skannerin", // 280 + "Valitse\nkaistanleveys", // 281 + "Oma lokikirja", // 282 + "Lataa lokikirja", // 283 + "Lokikirja on tyhjä", // 284 + "Mene alas", // 285 + "Merkintä lisätty\nlokikirjaan", // 286 + "Virhe lisättäessä\nmerkintää lokikirjaan", // 287 + "Tyhjennä lokikirja", // 288 + "Lokikirja\ntyhjennetty", // 289 + "Tyhjennys\nepäonnistui", // 290 + "Ei voida lisätä merkintää!\nLokikirja on täynnä!", // 291 + "Autolokikirja", // 292 + "Auto DST\nNTP-ajassa", // 293 + "Aseta\nNTP-aikasiirto", // 294 + "Lokikirja sisältää yli 130 merkintää, joita katselija ei pysty käsittelemään. Lataa CSV-tiedosto sen käsittelemiseksi.", // 295 + "Kanada" // 296 }, { "Dansk", // Danish @@ -6226,103 +6206,102 @@ static const char* const myLanguage[22][298] PROGMEM = { "Stor", // 198 "Alle", // 199 "Hurtig PS", // 200 - "Standard", // 201 - "Sluk skærm ved\nXDRGTK-forbindelse", // 202 - "FMSI stereo\nforbedring", // 203 - "Funktion kun tilgængelig\npå TEF6687/6689!", // 204 - "Funktion ikke tilgængelig\npå valgt hud!", // 205 - "Begynd scanning\naf hukommelseskanaler", // 206 - "Stop scanning\naf hukommelseskanaler", // 207 - "Ventetid", // 208 - "Start DX-scanning", // 209 - "FM DX-indstillinger", // 210 - "Afbryd! Startkanal\ner sprunget over.", // 211 - "Auto-sortering AF", // 212 - "Hukommelseskanaler", // 213 - "Udeluk", // 214 - "Kun", // 215 - "Auto-annuller scan", // 216 - "Korrekt PI", // 217 - "Signal", // 218 - "Lyd dæmpet\nunder scanning", // 219 - "LUFT", // 220 - "5 sek. båndknap-tryk", // 221 - "Sluk", // 222 - "Skærm slukket", // 223 - "Deaktiveret", // 224 - "Ingen", // 225 - "Nyheder", // 226 - "Seneste nyt", // 227 - "Oplysninger", // 228 - "Sport", // 229 - "Uddannelse", // 230 - "Drama", // 231 - "Kultur", // 232 - "Videnskab", // 233 - "Variabel", // 234 - "Popmusik", // 235 - "Rockmusik", // 236 - "Nem lytning", // 237 - "Lettelse klassisk", // 238 - "Seriøs klassisk", // 239 - "Anden musik", // 240 - "Vejr", // 241 - "Finans", // 242 - "Børneprogrammer", // 243 - "Sociale anliggender", // 244 - "Religion", // 245 - "Ring ind", // 246 - "Rejse", // 247 - "Fritid", // 248 - "Jazzmusik", // 249 - "Countrymusik", // 250 - "National musik", // 251 - "Gamle hits", // 252 - "Folkemusik", // 253 - "Dokumentar", // 254 - "Alarmtest", // 255 - "Alarm!!!", // 256 - "Initial", // 257 - "Altid", // 258 - "Vis ur", // 259 - "Vis lang PS", // 260 - "Startfrekvens", // 261 - "Stopfrekvens", // 262 - "Start hukommelseskanal", // 263 - "Stop hukommelseskanal", // 264 - "Kun gem med RDS", // 265 - "Start auto-hukommelse", // 266 - "Auto-hukommelse", // 267 - "Stationsliste-ID", // 268 - "Fundet", // 269 - "Afbryd! Uden\nhukommelseskanaler", // 270 - "Afbryd! Brugeren\ntrykkede på knap", // 271 - "Scanning afsluttet uden fejl", // 272 - "Ryd\nhukommelseskanaler", // 273 - "ryddet", // 274 - "Forhindre\ndobbelt PI", // 275 - "Rækkevidde", // 276 - "Fuld", // 277 - "Ventetid på\nkun signal", // 278 - "Tryk på det markerede hjørne", // 279 - "For at kalibrere touchskærmen", // 280 - "Hold BW for at stoppe", // 281 - "Vælg båndbredde", // 282 - "Din logbog", // 283 - "Download logbog", // 284 - "Logbog er tom", // 285 - "Gå til bunden", // 286 - "Tilføjet til log", // 287 - "Opdatering\nmislykkedes!", // 288 - "Ryd logbog", // 289 - "Logbog ryddet", // 290 - "Rydning mislykkedes", // 291 - "Kan ikke tilføje!\nLogbogen er fuld!", // 292 - "Autologger", // 293 - "Auto DST på\nNTP-tid", // 294 - "Indstil NTP-tidsforskel", // 295 - "Logbogen indeholder over 130 poster, som fremviseren ikke kan behandle. Download CSV-filen for at behandle den.", // 296 - "Canada" // 297 + "Sluk skærm ved\nXDRGTK-forbindelse", // 201 + "FMSI stereo\nforbedring", // 202 + "Funktion kun tilgængelig\npå TEF6687/6689!", // 203 + "Funktion ikke tilgængelig\npå valgt hud!", // 204 + "Begynd scanning\naf hukommelseskanaler", // 205 + "Stop scanning\naf hukommelseskanaler", // 206 + "Ventetid", // 207 + "Start DX-scanning", // 208 + "FM DX-indstillinger", // 209 + "Afbryd! Startkanal\ner sprunget over.", // 210 + "Auto-sortering AF", // 211 + "Hukommelseskanaler", // 212 + "Udeluk", // 213 + "Kun", // 214 + "Auto-annuller scan", // 215 + "Korrekt PI", // 216 + "Signal", // 217 + "Lyd dæmpet\nunder scanning", // 218 + "LUFT", // 219 + "5 sek. båndknap-tryk", // 220 + "Sluk", // 221 + "Skærm slukket", // 222 + "Deaktiveret", // 223 + "Ingen", // 224 + "Nyheder", // 225 + "Seneste nyt", // 226 + "Oplysninger", // 227 + "Sport", // 228 + "Uddannelse", // 229 + "Drama", // 230 + "Kultur", // 231 + "Videnskab", // 232 + "Variabel", // 233 + "Popmusik", // 234 + "Rockmusik", // 235 + "Nem lytning", // 236 + "Lettelse klassisk", // 237 + "Seriøs klassisk", // 238 + "Anden musik", // 239 + "Vejr", // 240 + "Finans", // 241 + "Børneprogrammer", // 242 + "Sociale anliggender", // 243 + "Religion", // 244 + "Ring ind", // 245 + "Rejse", // 246 + "Fritid", // 247 + "Jazzmusik", // 248 + "Countrymusik", // 249 + "National musik", // 250 + "Gamle hits", // 251 + "Folkemusik", // 252 + "Dokumentar", // 253 + "Alarmtest", // 254 + "Alarm!!!", // 255 + "Initial", // 256 + "Altid", // 257 + "Vis ur", // 258 + "Vis lang PS", // 259 + "Startfrekvens", // 260 + "Stopfrekvens", // 261 + "Start hukommelseskanal", // 262 + "Stop hukommelseskanal", // 263 + "Kun gem med RDS", // 264 + "Start auto-hukommelse", // 265 + "Auto-hukommelse", // 266 + "Stationsliste-ID", // 267 + "Fundet", // 268 + "Afbryd! Uden\nhukommelseskanaler", // 269 + "Afbryd! Brugeren\ntrykkede på knap", // 270 + "Scanning afsluttet uden fejl", // 271 + "Ryd\nhukommelseskanaler", // 272 + "ryddet", // 273 + "Forhindre\ndobbelt PI", // 274 + "Rækkevidde", // 275 + "Fuld", // 276 + "Ventetid på\nkun signal", // 277 + "Tryk på det markerede hjørne", // 278 + "For at kalibrere touchskærmen", // 279 + "Hold BW for at stoppe", // 280 + "Vælg båndbredde", // 281 + "Din logbog", // 282 + "Download logbog", // 283 + "Logbog er tom", // 284 + "Gå til bunden", // 285 + "Tilføjet til log", // 286 + "Opdatering\nmislykkedes!", // 287 + "Ryd logbog", // 288 + "Logbog ryddet", // 289 + "Rydning mislykkedes", // 290 + "Kan ikke tilføje!\nLogbogen er fuld!", // 291 + "Autologger", // 292 + "Auto DST på\nNTP-tid", // 293 + "Indstil NTP-tidsforskel", // 294 + "Logbogen indeholder over 130 poster, som fremviseren ikke kan behandle. Download CSV-filen for at behandle den.", // 295 + "Canada" // 296 }, { "Svenska", // Swedish @@ -6526,102 +6505,101 @@ static const char* const myLanguage[22][298] PROGMEM = { "Stora", // 198 "Allt", // 199 "Snabb PS", // 200 - "Standard", // 201 - "Släck skärm vid\nXDRGTK-anslutning", // 202 - "FMSI stereo\nförbättring", // 203 - "Funktion endast tillgäng-\nlig på TEF6687/6689!", // 204 - "Funktion ej tillgänglig\npå valt skinn!", // 205 - "Första minnesplats", // 206 - "Sista minnesplats", // 207 - "Väntetid", // 208 - "Starta DX-skanning", // 209 - "FM DX-alternativ", // 210 - "Avbruten! Startkanalen är\nmärkt som överhoppad.", // 211 - "Auto-sortera AF", // 212 - "Minnesplatser", // 213 - "Exkludera", // 214 - "Endast", // 215 - "Auto-avbryt skanning", // 216 - "Korrekt PI", // 217 - "Signal", // 218 - "Tyst under\nskanning", // 219 - "AIR", // 220 - "5 sek. BAND-knapptryck", // 221 - "Stäng av", // 222 - "Stäng av skärm", // 223 - "Inaktiverat", // 224 - "Ingen", // 225 - "Nyheter", // 226 - "Aktualiteter", // 227 - "Information", // 228 - "Sport", // 229 - "Utbildning", // 230 - "Drama", // 231 - "Kultur", // 232 - "Vetenskap", // 233 - "Underhållning", // 234 - "Popmusik", // 235 - "Rockmusik", // 236 - "Lätt musik", // 237 - "Lätt klassisk", // 238 - "Klassisk musik", // 239 - "Annan musik", // 240 - "Väder", // 241 - "Ekonomi", // 242 - "Barnprogram", // 243 - "Sociala frågor", // 244 - "Religion", // 245 - "Ring in", // 246 - "Resor", // 247 - "Fritid", // 248 - "Jazz", // 249 - "Countrymusik", // 250 - "Nationell musik", // 251 - "Oldies musik", // 252 - "Folkmusik", // 253 - "Dokumentär", // 254 - "Alarmtest", // 255 - "Alarm!!!", // 256 - "Inledande", // 257 - "Alltid", // 258 - "Visa klocka", // 259 - "Visa lång PS", // 260 - "Startfrekvens", // 261 - "Stoppfrekvens", // 262 - "Första minnesplats", // 263 - "Sista minnesplats", // 264 - "Spara endast med RDS", // 265 - "Starta auto-minne", // 266 - "Auto-kanalminne", // 267 - "Stationlist-ID", // 268 - "Hittade", // 269 - "Avbruten! Inga minnesplatser", // 270 - "Avbruten! Användare tryckte knapp", // 271 - "Skanning slutförd utan fel", // 272 - "Töm minnesplatser", // 273 - "raderad", // 274 - "Förhindra dubbla PI", // 275 - "Range", // 276 - "Fullt", // 277 - "Väntetid bara\nvid signal", // 278 - "Tryck på markerat hörn", // 279 - "för att kalibrera touchskärm", // 280 - "Håll BW-knappen för att\nstoppa DX-skanning", // 281 - "Välj bandbredd", // 282 - "Din loggbok", // 283 - "Ladda ner loggbok", // 284 - "Loggbok är tom", // 285 - "Gå till botten", // 286 - "Post tillagd\ni loggbok", // 287 - "Fel vid sparande\ni loggbok", // 288 - "Töm loggbok", // 289 - "Loggbok tömd", // 290 - "Tömning misslyckades", // 291 - "Kan inte spara!\nLoggboken är full!", // 292 - "Autologgning", // 293 - "Auto NTP sommartid", // 294 - "Ange NTP tidszon", // 295 - "Loggboken har mer än 130 poster, vilket visaren inte kan hantera. Ladda ner CSV för behandling.", // 296 - "Kanada" // 297 + "Släck skärm vid\nXDRGTK-anslutning", // 201 + "FMSI stereo\nförbättring", // 202 + "Funktion endast tillgäng-\nlig på TEF6687/6689!", // 203 + "Funktion ej tillgänglig\npå valt skinn!", // 204 + "Första minnesplats", // 205 + "Sista minnesplats", // 206 + "Väntetid", // 207 + "Starta DX-skanning", // 208 + "FM DX-alternativ", // 209 + "Avbruten! Startkanalen är\nmärkt som överhoppad.", // 210 + "Auto-sortera AF", // 211 + "Minnesplatser", // 212 + "Exkludera", // 213 + "Endast", // 214 + "Auto-avbryt skanning", // 215 + "Korrekt PI", // 216 + "Signal", // 217 + "Tyst under\nskanning", // 218 + "AIR", // 219 + "5 sek. BAND-knapptryck", // 220 + "Stäng av", // 221 + "Stäng av skärm", // 222 + "Inaktiverat", // 223 + "Ingen", // 224 + "Nyheter", // 225 + "Aktualiteter", // 226 + "Information", // 227 + "Sport", // 228 + "Utbildning", // 229 + "Drama", // 230 + "Kultur", // 231 + "Vetenskap", // 232 + "Underhållning", // 233 + "Popmusik", // 234 + "Rockmusik", // 235 + "Lätt musik", // 236 + "Lätt klassisk", // 237 + "Klassisk musik", // 238 + "Annan musik", // 239 + "Väder", // 240 + "Ekonomi", // 241 + "Barnprogram", // 242 + "Sociala frågor", // 243 + "Religion", // 244 + "Ring in", // 245 + "Resor", // 246 + "Fritid", // 247 + "Jazz", // 248 + "Countrymusik", // 249 + "Nationell musik", // 250 + "Oldies musik", // 251 + "Folkmusik", // 252 + "Dokumentär", // 253 + "Alarmtest", // 254 + "Alarm!!!", // 255 + "Inledande", // 256 + "Alltid", // 257 + "Visa klocka", // 258 + "Visa lång PS", // 259 + "Startfrekvens", // 260 + "Stoppfrekvens", // 261 + "Första minnesplats", // 262 + "Sista minnesplats", // 263 + "Spara endast med RDS", // 264 + "Starta auto-minne", // 265 + "Auto-kanalminne", // 266 + "Stationlist-ID", // 267 + "Hittade", // 268 + "Avbruten! Inga minnesplatser", // 269 + "Avbruten! Användare tryckte knapp", // 270 + "Skanning slutförd utan fel", // 271 + "Töm minnesplatser", // 272 + "raderad", // 273 + "Förhindra dubbla PI", // 274 + "Range", // 275 + "Fullt", // 276 + "Väntetid bara\nvid signal", // 277 + "Tryck på markerat hörn", // 278 + "för att kalibrera touchskärm", // 279 + "Håll BW-knappen för att\nstoppa DX-skanning", // 280 + "Välj bandbredd", // 281 + "Din loggbok", // 282 + "Ladda ner loggbok", // 283 + "Loggbok är tom", // 284 + "Gå till botten", // 285 + "Post tillagd\ni loggbok", // 286 + "Fel vid sparande\ni loggbok", // 287 + "Töm loggbok", // 288 + "Loggbok tömd", // 289 + "Tömning misslyckades", // 290 + "Kan inte spara!\nLoggboken är full!", // 291 + "Autologgning", // 292 + "Auto NTP sommartid", // 293 + "Ange NTP tidszon", // 294 + "Loggboken har mer än 130 poster, vilket visaren inte kan hantera. Ladda ner CSV för behandling.", // 295 + "Kanada" // 296 } }; \ No newline at end of file diff --git a/include/system_console.h b/include/system_console.h index 1e168b7..67a96a2 100644 --- a/include/system_console.h +++ b/include/system_console.h @@ -9,9 +9,9 @@ public: tft->setTextColor(TFT_WHITE, background); tft->setTextDatum(TL_DATUM); auto data = "[" + String(millis() / 1000.0f) + "] " + text; - tft->fillRect(0, y, tft->textWidth(data), tft->fontHeight(0), background); - tft->drawString(data, 0, y, 0); - y += tft->fontHeight(0); + tft->fillRect(0, y, tft->textWidth(data), tft->fontHeight(2), background); + tft->drawString(data, 0, y, 2); + y += tft->fontHeight(2); } void reset() { y = 0; diff --git a/lib/TFT_eSPI/TFT_eSPI.cpp b/lib/TFT_eSPI/TFT_eSPI.cpp index b48b60b..e24a6c1 100644 --- a/lib/TFT_eSPI/TFT_eSPI.cpp +++ b/lib/TFT_eSPI/TFT_eSPI.cpp @@ -31,7 +31,6 @@ uint16_t transfer16(uint16_t val) { } void TFT_eSPI::pushBlock(uint16_t color, uint32_t len) { - volatile uint32_t* spi_w = _spi_w; uint32_t color32 = (color<<8 | color >>8)<<16 | (color<<8 | color >>8); uint32_t i = 0; @@ -116,15 +115,15 @@ void TFT_eSPI::pushSwapBytePixels(const void* data_in, uint32_t len) { SPI_BUSY_CHECK; WRITE_PERI_REG(SPI_MOSI_DLEN_REG(VSPI), (len << 4) - 1); for (uint32_t i=0; i <= (len<<1); i+=4) { - WRITE_PERI_REG(SPI_W0_REG(VSPI)+i, DAT8TO32(data)); data += 4; + WRITE_PERI_REG(SPI_W0_REG(VSPI)+i, DAT8TO32(data)); + data += 4; } SET_PERI_REG_MASK(SPI_CMD_REG(VSPI), SPI_USR); } SPI_BUSY_CHECK; } -void TFT_eSPI::pushPixels(const void* data_in, uint32_t len){ - +void TFT_eSPI::pushPixels(const void* data_in, uint32_t len) { if(_swapBytes) { pushSwapBytePixels(data_in, len); return; @@ -275,28 +274,6 @@ void TFT_eSPI::resetViewport() { _vpH = _yHeight = height(); } -bool TFT_eSPI::clipWindow(int32_t *xs, int32_t *ys, int32_t *xe, int32_t *ye) -{ - if (_vpOoB) return false; // Area is outside of viewport - - *xs+= _xDatum; - *ys+= _yDatum; - *xe+= _xDatum; - *ye+= _yDatum; - - if ((*xs >= _vpW) || (*ys >= _vpH)) return false; // Area is outside of viewport - if ((*xe < _vpX) || (*ye < _vpY)) return false; // Area is outside of viewport - - // Crop drawing area bounds - if (*xs < _vpX) *xs = _vpX; - if (*ys < _vpY) *ys = _vpY; - - if (*xe > _vpW) *xe = _vpW - 1; - if (*ye > _vpH) *ye = _vpH - 1; - - return true; // Area is wholly or partially inside viewport -} - TFT_eSPI::TFT_eSPI(int16_t w, int16_t h) { _init_width = _width = w; _init_height = _height = h; @@ -427,13 +404,6 @@ void TFT_eSPI::setRotation(uint8_t m) { resetViewport(); } - -void TFT_eSPI::spiwrite(uint8_t c) { - begin_tft_write(); - tft_Write_8(c); - end_tft_write(); -} - void TFT_eSPI::writecommand(uint8_t c) { begin_tft_write(); @@ -729,8 +699,7 @@ void TFT_eSPI::pushImage(int32_t x, int32_t y, int32_t w, int32_t h, const uint8 end_tft_write(); } -void TFT_eSPI::pushImage(int32_t x, int32_t y, int32_t w, int32_t h, uint8_t *data, bool bpp8, uint16_t *cmap) -{ +void TFT_eSPI::pushImage(int32_t x, int32_t y, int32_t w, int32_t h, uint8_t *data, bool bpp8, uint16_t *cmap) { PI_CLIP; begin_tft_write(); @@ -842,8 +811,7 @@ void TFT_eSPI::pushImage(int32_t x, int32_t y, int32_t w, int32_t h, uint8_t *da end_tft_write(); } -void TFT_eSPI::pushImage(int32_t x, int32_t y, int32_t w, int32_t h, uint8_t *data, uint8_t transp, bool bpp8, uint16_t *cmap) -{ +void TFT_eSPI::pushImage(int32_t x, int32_t y, int32_t w, int32_t h, uint8_t *data, uint8_t transp, bool bpp8, uint16_t *cmap) { PI_CLIP; begin_tft_write(); @@ -914,12 +882,8 @@ void TFT_eSPI::pushImage(int32_t x, int32_t y, int32_t w, int32_t h, uint8_t *da w = (w+1) & 0xFFFE; // here we try to recreate iwidth from dwidth. bool splitFirst = ((dx & 0x01) != 0); - if (splitFirst) { - data += ((dx - 1 + dy * w) >> 1); - } - else { - data += ((dx + dy * w) >> 1); - } + if (splitFirst) data += ((dx - 1 + dy * w) >> 1); + else data += ((dx + dy * w) >> 1); while (dh--) { uint32_t len = dw; @@ -970,7 +934,7 @@ void TFT_eSPI::pushImage(int32_t x, int32_t y, int32_t w, int32_t h, uint8_t *da if (index != transp) { if (move) { move = false; sx = px; - } + } lineBuf[np] = cmap[index]; np++; } else { @@ -1000,12 +964,10 @@ void TFT_eSPI::pushImage(int32_t x, int32_t y, int32_t w, int32_t h, uint8_t *da uint32_t ww = (w+7)>>3; // Width of source image line in bytes uint16_t np = 0; - for (int32_t yp = dy; yp < dy + dh; yp++) - { + for (int32_t yp = dy; yp < dy + dh; yp++) { int32_t px = x, sx = x; bool move = true; - for (int32_t xp = dx; xp < dx + dw; xp++) - { + for (int32_t xp = dx; xp < dx + dw; xp++) { if (data[(xp>>3)] & (0x80 >> (xp & 0x7))) { if (move) { move = false; @@ -1123,7 +1085,6 @@ void TFT_eSPI::fillCircle(int32_t x0, int32_t y0, int32_t r, uint32_t color) { drawFastHLine(x0 - r, y0 + x, dy+1, color); drawFastHLine(x0 - r, y0 - x, dy+1, color); - } end_tft_write(); // Does nothing if Sprite class uses this function @@ -1155,84 +1116,6 @@ void TFT_eSPI::fillCircleHelper(int32_t x0, int32_t y0, int32_t r, uint8_t corne } } -void TFT_eSPI::drawEllipse(int16_t x0, int16_t y0, int32_t rx, int32_t ry, uint16_t color) { - if (rx<2) return; - if (ry<2) return; - int32_t x, y; - int32_t rx2 = rx * rx; - int32_t ry2 = ry * ry; - int32_t fx2 = 4 * rx2; - int32_t fy2 = 4 * ry2; - int32_t s; - - for (x = 0, y = ry, s = 2*ry2+rx2*(1-2*ry); ry2*x <= rx2*y; x++) { - // These are ordered to minimise coordinate changes in x or y - // drawPixel can then send fewer bounding box commands - drawPixel(x0 + x, y0 + y, color); - drawPixel(x0 - x, y0 + y, color); - drawPixel(x0 - x, y0 - y, color); - drawPixel(x0 + x, y0 - y, color); - if (s >= 0) { - s += fx2 * (1 - y); - y--; - } - s += ry2 * ((4 * x) + 6); - } - - for (x = rx, y = 0, s = 2*rx2+ry2*(1-2*rx); rx2*y <= ry2*x; y++) { - // These are ordered to minimise coordinate changes in x or y - // drawPixel can then send fewer bounding box commands - drawPixel(x0 + x, y0 + y, color); - drawPixel(x0 - x, y0 + y, color); - drawPixel(x0 - x, y0 - y, color); - drawPixel(x0 + x, y0 - y, color); - if (s >= 0) { - s += fy2 * (1 - x); - x--; - } - s += rx2 * ((4 * y) + 6); - } - - end_tft_write(); // Does nothing if Sprite class uses this function -} - -void TFT_eSPI::fillEllipse(int16_t x0, int16_t y0, int32_t rx, int32_t ry, uint16_t color) -{ - if (rx<2) return; - if (ry<2) return; - int32_t x, y; - int32_t rx2 = rx * rx; - int32_t ry2 = ry * ry; - int32_t fx2 = 4 * rx2; - int32_t fy2 = 4 * ry2; - int32_t s; - - for (x = 0, y = ry, s = 2*ry2+rx2*(1-2*ry); ry2*x <= rx2*y; x++) { - drawFastHLine(x0 - x, y0 - y, x + x + 1, color); - drawFastHLine(x0 - x, y0 + y, x + x + 1, color); - - if (s >= 0) { - s += fx2 * (1 - y); - y--; - } - s += ry2 * ((4 * x) + 6); - } - - for (x = rx, y = 0, s = 2*rx2+ry2*(1-2*rx); rx2*y <= ry2*x; y++) { - drawFastHLine(x0 - x, y0 - y, x + x + 1, color); - drawFastHLine(x0 - x, y0 + y, x + x + 1, color); - - if (s >= 0) { - s += fy2 * (1 - x); - x--; - } - s += rx2 * ((4 * y) + 6); - } - - end_tft_write(); // Does nothing if Sprite class uses this function -} - - void TFT_eSPI::fillScreen(uint32_t color) { fillRect(0, 0, _width, _height, color); } @@ -1273,9 +1156,7 @@ void TFT_eSPI::fillRoundRect(int32_t x, int32_t y, int32_t w, int32_t h, int32_t end_tft_write(); // Does nothing if Sprite class uses this function } - -void TFT_eSPI::fillTriangle ( int32_t x0, int32_t y0, int32_t x1, int32_t y1, int32_t x2, int32_t y2, uint32_t color) -{ +void TFT_eSPI::fillTriangle(int32_t x0, int32_t y0, int32_t x1, int32_t y1, int32_t x2, int32_t y2, uint32_t color) { int32_t a, b, y, last; // Sort coordinates by Y order (y2 >= y1 >= y0) @@ -1316,7 +1197,7 @@ void TFT_eSPI::fillTriangle ( int32_t x0, int32_t y0, int32_t x1, int32_t y1, in // in the second loop...which also avoids a /0 error here if y0=y1 // (flat-topped triangle). if (y1 == y2) last = y1; // Include y1 scanline - else last = y1 - 1; // Skip it + else last = y1 - 1; // Skip it for (y = y0; y <= last; y++) { a = x0 + sa / dy01; @@ -1362,8 +1243,7 @@ void TFT_eSPI::drawBitmap(int16_t x, int16_t y, const uint8_t *bitmap, int16_t w for (j = 0; j < h; j++) { for (i = 0; i < w; i++ ) { - if (pgm_read_byte(bitmap + j * byteWidth + i / 8) & (128 >> (i & 7))) - drawPixel(x + i, y + j, fgcolor); + if (pgm_read_byte(bitmap + j * byteWidth + i / 8) & (128 >> (i & 7))) drawPixel(x + i, y + j, fgcolor); else drawPixel(x + i, y + j, bgcolor); } } @@ -1382,50 +1262,26 @@ void TFT_eSPI::setCursor(int16_t x, int16_t y, uint8_t font) { cursor_y = y; } -void TFT_eSPI::setTextSize(uint8_t s) -{ - if (s>7) s = 7; // Limit the maximum size multiplier so byte variables can be used for rendering - textsize = (s > 0) ? s : 1; // Don't allow font size 0 -} - -void TFT_eSPI::setTextColor(uint16_t c) -{ +void TFT_eSPI::setTextColor(uint16_t c) { textcolor = textbgcolor = c; } -void TFT_eSPI::setTextColor(uint16_t c, uint16_t b, bool bgfill) -{ +void TFT_eSPI::setTextColor(uint16_t c, uint16_t b, bool bgfill) { textcolor = c; textbgcolor = b; _fillbg = bgfill; } -void TFT_eSPI::setPivot(int16_t x, int16_t y) -{ +void TFT_eSPI::setPivot(int16_t x, int16_t y) { _xPivot = x; _yPivot = y; } -void TFT_eSPI::setBitmapColor(uint16_t c, uint16_t b) -{ - if (c == b) b = ~c; - bitmap_fg = c; - bitmap_bg = b; -} - -void TFT_eSPI::setTextWrap(bool wrapX, bool wrapY) -{ - textwrapX = wrapX; - textwrapY = wrapY; -} - -void TFT_eSPI::setTextDatum(uint8_t d) -{ +void TFT_eSPI::setTextDatum(uint8_t d) { textdatum = d; } -void TFT_eSPI::setTextPadding(uint16_t x_width) -{ +void TFT_eSPI::setTextPadding(uint16_t x_width) { padX = x_width; } @@ -1439,16 +1295,14 @@ int16_t TFT_eSPI::height() { return _height; } -int16_t TFT_eSPI::textWidth(const String& string) -{ +int16_t TFT_eSPI::textWidth(const String& string) { int16_t len = string.length() + 2; char buffer[len]; string.toCharArray(buffer, len); return textWidth(buffer, textfont); } -int16_t TFT_eSPI::textWidth(const String& string, uint8_t font) -{ +int16_t TFT_eSPI::textWidth(const String& string, uint8_t font) { int16_t len = string.length() + 2; char buffer[len]; string.toCharArray(buffer, len); @@ -1489,31 +1343,17 @@ int16_t TFT_eSPI::fontHeight(uint8_t font) { return gFonts[font].yAdvance; } -int16_t TFT_eSPI::fontHeight() -{ +int16_t TFT_eSPI::fontHeight() { return fontHeight(textfont); } - -/*************************************************************************************** -** Function name: setAddrWindow -** Description: define an area to receive a stream of pixels -***************************************************************************************/ // Chip select is high at the end of this function -void TFT_eSPI::setAddrWindow(int32_t x0, int32_t y0, int32_t w, int32_t h) -{ +void TFT_eSPI::setAddrWindow(int32_t x0, int32_t y0, int32_t w, int32_t h) { begin_tft_write(); - setWindow(x0, y0, x0 + w - 1, y0 + h - 1); - end_tft_write(); } - -/*************************************************************************************** -** Function name: setWindow -** Description: define an area to receive a stream of pixels -***************************************************************************************/ // Chip select stays low, call begin_tft_write first. Use setAddrWindow() from sketches void TFT_eSPI::setWindow(int32_t x0, int32_t y0, int32_t x1, int32_t y1) { @@ -1601,14 +1441,11 @@ void TFT_eSPI::drawPixel(int32_t x, int32_t y, uint32_t color) { void TFT_eSPI::pushColor(uint16_t color) { begin_tft_write(); - SPI_BUSY_CHECK; tft_Write_16N(color); - end_tft_write(); } - void TFT_eSPI::pushColor(uint16_t color, uint32_t len) { begin_tft_write(); @@ -1621,17 +1458,6 @@ void TFT_eSPI::writeColor(uint16_t color, uint32_t len) { pushBlock(color, len); } -void TFT_eSPI::pushColors(uint16_t *data, uint32_t len, bool swap) -{ - begin_tft_write(); - if (swap) {swap = _swapBytes; _swapBytes = true; } - - pushPixels(data, len); - - _swapBytes = swap; // Restore old value - end_tft_write(); -} - void TFT_eSPI::drawLine(int32_t x0, int32_t y0, int32_t x1, int32_t y1, uint32_t color) { if (_vpOoB) return; @@ -1686,457 +1512,13 @@ void TFT_eSPI::drawLine(int32_t x0, int32_t y0, int32_t x1, int32_t y1, uint32_t end_tft_write(); } -constexpr float PixelAlphaGain = 255.0; -constexpr float LoAlphaTheshold = 1.0/32.0; -constexpr float HiAlphaTheshold = 1.0 - LoAlphaTheshold; -constexpr float deg2rad = 3.14159265359/180.0; - -uint16_t TFT_eSPI::drawPixel(int32_t x, int32_t y, uint32_t color, uint8_t alpha, uint32_t bg_color) -{ +uint16_t TFT_eSPI::drawPixel(int32_t x, int32_t y, uint32_t color, uint8_t alpha, uint32_t bg_color) { if (bg_color == 0x00FFFFFF) bg_color = readPixel(x, y); color = fastBlend(alpha, color, bg_color); drawPixel(x, y, color); return color; } -inline uint8_t TFT_eSPI::sqrt_fraction(uint32_t num) { - if (num > (0x40000000)) return 0; - uint32_t bsh = 0x00004000; - uint32_t fpr = 0; - uint32_t osh = 0; - - // Auto adjust from U8:8 up to U15:16 - while (num>bsh) {bsh <<= 2; osh++;} - - do { - uint32_t bod = bsh + fpr; - if(num >= bod) - { - num -= bod; - fpr = bsh + bod; - } - num <<= 1; - } while(bsh >>= 1); - - return fpr>>osh; -} - -void TFT_eSPI::drawArc(int32_t x, int32_t y, int32_t r, int32_t ir, uint32_t startAngle, uint32_t endAngle, uint32_t fg_color, uint32_t bg_color, bool smooth) { - if (endAngle > 360) endAngle = 360; - if (startAngle > 360) startAngle = 360; - if (_vpOoB || startAngle == endAngle) return; - if (r < ir) transpose(r, ir); // Required that r > ir - if (r <= 0 || ir < 0) return; // Invalid r, ir can be zero (circle sector) - - if (endAngle < startAngle) { - // Arc sweeps through 6 o'clock so draw in two parts - if (startAngle < 360) drawArc(x, y, r, ir, startAngle, 360, fg_color, bg_color, smooth); - if (endAngle == 0) return; - startAngle = 0; - } - - int32_t xs = 0; // x start position for quadrant scan - uint8_t alpha = 0; // alpha value for blending pixels - - uint32_t r2 = r * r; // Outer arc radius^2 - if (smooth) r++; // Outer AA zone radius - uint32_t r1 = r * r; // Outer AA radius^2 - int16_t w = r - ir; // Width of arc (r - ir + 1) - uint32_t r3 = ir * ir; // Inner arc radius^2 - if (smooth) ir--; // Inner AA zone radius - uint32_t r4 = ir * ir; // Inner AA radius^2 - - // 1 | 2 - // ---¦--- Arc quadrant index - // 0 | 3 - // Fixed point U16.16 slope table for arc start/end in each quadrant - uint32_t startSlope[4] = {0, 0, 0xFFFFFFFF, 0}; - uint32_t endSlope[4] = {0, 0xFFFFFFFF, 0, 0}; - - // Ensure maximum U16.16 slope of arc ends is ~ 0x8000 0000 - constexpr float minDivisor = 1.0f/0x8000; - - // Fill in start slope table and empty quadrants - float fabscos = fabsf(cosf(startAngle * deg2rad)); - float fabssin = fabsf(sinf(startAngle * deg2rad)); - - // U16.16 slope of arc start - uint32_t slope = (fabscos/(fabssin + minDivisor)) * (float)(1UL<<16); - - // Update slope table, add slope for arc start - if (startAngle <= 90) { - startSlope[0] = slope; - } else if (startAngle <= 180) { - startSlope[1] = slope; - } else if (startAngle <= 270) { - startSlope[1] = 0xFFFFFFFF; - startSlope[2] = slope; - } else { - startSlope[1] = 0xFFFFFFFF; - startSlope[2] = 0; - startSlope[3] = slope; - } - - // Fill in end slope table and empty quadrants - fabscos = fabsf(cosf(endAngle * deg2rad)); - fabssin = fabsf(sinf(endAngle * deg2rad)); - - // U16.16 slope of arc end - slope = (uint32_t)((fabscos/(fabssin + minDivisor)) * (float)(1UL<<16)); - - // Work out which quadrants will need to be drawn and add slope for arc end - if (endAngle <= 90) { - endSlope[0] = slope; - endSlope[1] = 0; - startSlope[2] = 0; - } else if (endAngle <= 180) { - endSlope[1] = slope; - startSlope[2] = 0; - } else if (endAngle <= 270) endSlope[2] = slope; - else endSlope[3] = slope; - - // Scan quadrant - for (int32_t cy = r - 1; cy > 0; cy--) - { - uint32_t len[4] = { 0, 0, 0, 0}; // Pixel run length - int32_t xst[4] = {-1, -1, -1, -1}; // Pixel run x start - uint32_t dy2 = (r - cy) * (r - cy); - - // Find and track arc zone start point - while ((r - xs) * (r - xs) + dy2 >= r1) xs++; - - for (int32_t cx = xs; cx < r; cx++) - { - // Calculate radius^2 - uint32_t hyp = (r - cx) * (r - cx) + dy2; - - // If in outer zone calculate alpha - if (hyp > r2) { - alpha = ~sqrt_fraction(hyp); // Outer AA zone - } - // If within arc fill zone, get line start and lengths for each quadrant - else if (hyp >= r3) { - // Calculate U16.16 slope - slope = ((r - cy) << 16)/(r - cx); - if (slope <= startSlope[0] && slope >= endSlope[0]) { // slope hi -> lo - xst[0] = cx; // Bottom left line end - len[0]++; - } - if (slope >= startSlope[1] && slope <= endSlope[1]) { // slope lo -> hi - xst[1] = cx; // Top left line end - len[1]++; - } - if (slope <= startSlope[2] && slope >= endSlope[2]) { // slope hi -> lo - xst[2] = cx; // Bottom right line start - len[2]++; - } - if (slope <= endSlope[3] && slope >= startSlope[3]) { // slope lo -> hi - xst[3] = cx; // Top right line start - len[3]++; - } - continue; // Next x - } - else { - if (hyp <= r4) break; // Skip inner pixels - alpha = sqrt_fraction(hyp); // Inner AA zone - } - - if (alpha < 16) continue; // Skip low alpha pixels - - // If background is read it must be done in each quadrant - uint16_t pcol = fastBlend(alpha, fg_color, bg_color); - // Check if an AA pixels need to be drawn - slope = ((r - cy)<<16)/(r - cx); - if (slope <= startSlope[0] && slope >= endSlope[0]) // BL - drawPixel(x + cx - r, y - cy + r, pcol); - if (slope >= startSlope[1] && slope <= endSlope[1]) // TL - drawPixel(x + cx - r, y + cy - r, pcol); - if (slope <= startSlope[2] && slope >= endSlope[2]) // TR - drawPixel(x - cx + r, y + cy - r, pcol); - if (slope <= endSlope[3] && slope >= startSlope[3]) // BR - drawPixel(x - cx + r, y - cy + r, pcol); - } - // Add line in inner zone - if (len[0]) drawFastHLine(x + xst[0] - len[0] + 1 - r, y - cy + r, len[0], fg_color); // BL - if (len[1]) drawFastHLine(x + xst[1] - len[1] + 1 - r, y + cy - r, len[1], fg_color); // TL - if (len[2]) drawFastHLine(x - xst[2] + r, y + cy - r, len[2], fg_color); // TR - if (len[3]) drawFastHLine(x - xst[3] + r, y - cy + r, len[3], fg_color); // BR - } - - // Fill in centre lines - if (startAngle == 0 || endAngle == 360) drawFastVLine(x, y + r - w, w, fg_color); // Bottom - if (startAngle <= 90 && endAngle >= 90) drawFastHLine(x - r + 1, y, w, fg_color); // Left - if (startAngle <= 180 && endAngle >= 180) drawFastVLine(x, y - r + 1, w, fg_color); // Top - if (startAngle <= 270 && endAngle >= 270) drawFastHLine(x + r - w, y, w, fg_color); // Right - - end_tft_write(); -} - -void TFT_eSPI::drawSmoothCircle(int32_t x, int32_t y, int32_t r, uint32_t fg_color, uint32_t bg_color) { - drawSmoothRoundRect(x-r, y-r, r, r-1, 0, 0, fg_color, bg_color); -} - -void TFT_eSPI::fillSmoothCircle(int32_t x, int32_t y, int32_t r, uint32_t color, uint32_t bg_color) { - if (r <= 0) return; - - drawFastHLine(x - r, y, 2 * r + 1, color); - int32_t xs = 1; - int32_t cx = 0; - - int32_t r1 = r * r; - r++; - int32_t r2 = r * r; - - for (int32_t cy = r - 1; cy > 0; cy--) - { - int32_t dy2 = (r - cy) * (r - cy); - for (cx = xs; cx < r; cx++) - { - int32_t hyp2 = (r - cx) * (r - cx) + dy2; - if (hyp2 <= r1) break; - if (hyp2 >= r2) continue; - - uint8_t alpha = ~sqrt_fraction(hyp2); - if (alpha > 246) break; - xs = cx; - if (alpha < 9) continue; - - if (bg_color == 0x00FFFFFF) { - drawPixel(x + cx - r, y + cy - r, color, alpha, bg_color); - drawPixel(x - cx + r, y + cy - r, color, alpha, bg_color); - drawPixel(x - cx + r, y - cy + r, color, alpha, bg_color); - drawPixel(x + cx - r, y - cy + r, color, alpha, bg_color); - } - else { - uint16_t pcol = drawPixel(x + cx - r, y + cy - r, color, alpha, bg_color); - drawPixel(x - cx + r, y + cy - r, pcol); - drawPixel(x - cx + r, y - cy + r, pcol); - drawPixel(x + cx - r, y - cy + r, pcol); - } - } - drawFastHLine(x + cx - r, y + cy - r, 2 * (r - cx) + 1, color); - drawFastHLine(x + cx - r, y - cy + r, 2 * (r - cx) + 1, color); - } - end_tft_write(); -} - -void TFT_eSPI::drawSmoothRoundRect(int32_t x, int32_t y, int32_t r, int32_t ir, int32_t w, int32_t h, uint32_t fg_color, uint32_t bg_color, uint8_t quadrants) -{ - if (_vpOoB) return; - if (r < ir) transpose(r, ir); // Required that r > ir - if (r <= 0 || ir < 0) return; // Invalid - - w -= 2*r; - h -= 2*r; - - if (w < 0) w = 0; - if (h < 0) h = 0; - - x += r; - y += r; - - uint16_t t = r - ir + 1; - int32_t xs = 0; - int32_t cx = 0; - - int32_t r2 = r * r; // Outer arc radius^2 - r++; - int32_t r1 = r * r; // Outer AA zone radius^2 - - int32_t r3 = ir * ir; // Inner arc radius^2 - ir--; - int32_t r4 = ir * ir; // Inner AA zone radius^2 - - uint8_t alpha = 0; - - // Scan top left quadrant x y r ir fg_color bg_color - for (int32_t cy = r - 1; cy > 0; cy--) - { - int32_t len = 0; // Pixel run length - int32_t lxst = 0; // Left side run x start - int32_t rxst = 0; // Right side run x start - int32_t dy2 = (r - cy) * (r - cy); - - // Find and track arc zone start point - while ((r - xs) * (r - xs) + dy2 >= r1) xs++; - - for (cx = xs; cx < r; cx++) - { - // Calculate radius^2 - int32_t hyp = (r - cx) * (r - cx) + dy2; - - // If in outer zone calculate alpha - if (hyp > r2) { - alpha = ~sqrt_fraction(hyp); // Outer AA zone - } - // If within arc fill zone, get line lengths for each quadrant - else if (hyp >= r3) { - rxst = cx; // Right side start - len++; // Line segment length - continue; // Next x - } - else { - if (hyp <= r4) break; // Skip inner pixels - alpha = sqrt_fraction(hyp); // Inner AA zone - } - - if (alpha < 16) continue; // Skip low alpha pixels - - // If background is read it must be done in each quadrant - TODO - uint16_t pcol = fastBlend(alpha, fg_color, bg_color); - if (quadrants & 0x8) drawPixel(x + cx - r, y - cy + r + h, pcol); // BL - if (quadrants & 0x1) drawPixel(x + cx - r, y + cy - r, pcol); // TL - if (quadrants & 0x2) drawPixel(x - cx + r + w, y + cy - r, pcol); // TR - if (quadrants & 0x4) drawPixel(x - cx + r + w, y - cy + r + h, pcol); // BR - } - // Fill arc inner zone in each quadrant - lxst = rxst - len + 1; // Calculate line segment start for left side - if (quadrants & 0x8) drawFastHLine(x + lxst - r, y - cy + r + h, len, fg_color); // BL - if (quadrants & 0x1) drawFastHLine(x + lxst - r, y + cy - r, len, fg_color); // TL - if (quadrants & 0x2) drawFastHLine(x - rxst + r + w, y + cy - r, len, fg_color); // TR - if (quadrants & 0x4) drawFastHLine(x - rxst + r + w, y - cy + r + h, len, fg_color); // BR - } - - // Draw sides - if ((quadrants & 0xC) == 0xC) fillRect(x, y + r - t + h, w + 1, t, fg_color); // Bottom - if ((quadrants & 0x9) == 0x9) fillRect(x - r + 1, y, t, h + 1, fg_color); // Left - if ((quadrants & 0x3) == 0x3) fillRect(x, y - r + 1, w + 1, t, fg_color); // Top - if ((quadrants & 0x6) == 0x6) fillRect(x + r - t + w, y, t, h + 1, fg_color); // Right - - end_tft_write(); -} - -void TFT_eSPI::fillSmoothRoundRect(int32_t x, int32_t y, int32_t w, int32_t h, int32_t r, uint32_t color, uint32_t bg_color) { - int32_t xs = 0; - int32_t cx = 0; - - // Limit radius to half width or height - if (r < 0) r = 0; - if (r > w/2) r = w/2; - if (r > h/2) r = h/2; - - y += r; - h -= 2*r; - fillRect(x, y, w, h, color); - - h--; - x += r; - w -= 2*r+1; - - int32_t r1 = r * r; - r++; - int32_t r2 = r * r; - - for (int32_t cy = r - 1; cy > 0; cy--) { - int32_t dy2 = (r - cy) * (r - cy); - for (cx = xs; cx < r; cx++) { - int32_t hyp2 = (r - cx) * (r - cx) + dy2; - if (hyp2 <= r1) break; - if (hyp2 >= r2) continue; - - uint8_t alpha = ~sqrt_fraction(hyp2); - if (alpha > 246) break; - xs = cx; - if (alpha < 9) continue; - - drawPixel(x + cx - r, y + cy - r, color, alpha, bg_color); - drawPixel(x - cx + r + w, y + cy - r, color, alpha, bg_color); - drawPixel(x - cx + r + w, y - cy + r + h, color, alpha, bg_color); - drawPixel(x + cx - r, y - cy + r + h, color, alpha, bg_color); - } - drawFastHLine(x + cx - r, y + cy - r, 2 * (r - cx) + 1 + w, color); - drawFastHLine(x + cx - r, y - cy + r + h, 2 * (r - cx) + 1 + w, color); - } - end_tft_write(); -} - -void TFT_eSPI::drawWedgeLine(float ax, float ay, float bx, float by, float ar, float br, uint32_t fg_color, uint32_t bg_color) { - if ( (ar < 0.0) || (br < 0.0) )return; - if ( (fabsf(ax - bx) < 0.01f) && (fabsf(ay - by) < 0.01f) ) bx += 0.01f; // Avoid divide by zero - - // Find line bounding box - int32_t x0 = (int32_t)floorf(fminf(ax-ar, bx-br)); - int32_t x1 = (int32_t) ceilf(fmaxf(ax+ar, bx+br)); - int32_t y0 = (int32_t)floorf(fminf(ay-ar, by-br)); - int32_t y1 = (int32_t) ceilf(fmaxf(ay+ar, by+br)); - - if (!clipWindow(&x0, &y0, &x1, &y1)) return; - - // Establish x start and y start - int32_t ys = ay; - if ((ax-ar)>(bx-br)) ys = by; - - float rdt = ar - br; // Radius delta - float alpha = 1.0f; - ar += 0.5; - - float xpax, ypay, bax = bx - ax, bay = by - ay; - - begin_nin_write(); - - int32_t xs = x0; - // Scan bounding box from ys down, calculate pixel intensity from distance to line - for (int32_t yp = ys; yp <= y1; yp++) { - bool swin = true; // Flag to start new window area - bool endX = false; // Flag to skip pixels - ypay = yp - ay; - for (int32_t xp = xs; xp <= x1; xp++) { - if (endX) if (alpha <= LoAlphaTheshold) break; // Skip right side - xpax = xp - ax; - alpha = ar - wedgeLineDistance(xpax, ypay, bax, bay, rdt); - if (alpha <= LoAlphaTheshold ) continue; - // Track edge to minimise calculations - if (!endX) { endX = true; xs = xp; } - if (alpha > HiAlphaTheshold) { - if (swin) { setWindow(xp, yp, x1, yp); swin = false; } - pushColor(fg_color); - continue; - } - //Blend color with background and plot - if (bg_color == 0x00FFFFFF) { - bg_color = readPixel(xp, yp); swin = true; - } - if (swin) { setWindow(xp, yp, x1, yp); swin = false; } - pushColor(fastBlend((uint8_t)(alpha * PixelAlphaGain), fg_color, bg_color)); - } - } - - // Reset x start to left side of box - xs = x0; - // Scan bounding box from ys-1 up, calculate pixel intensity from distance to line - for (int32_t yp = ys-1; yp >= y0; yp--) { - bool swin = true; // Flag to start new window area - bool endX = false; // Flag to skip pixels - ypay = yp - ay; - for (int32_t xp = xs; xp <= x1; xp++) { - if (endX) if (alpha <= LoAlphaTheshold) break; // Skip right side of drawn line - xpax = xp - ax; - alpha = ar - wedgeLineDistance(xpax, ypay, bax, bay, rdt); - if (alpha <= LoAlphaTheshold ) continue; - // Track line boundary - if (!endX) { endX = true; xs = xp; } - if (alpha > HiAlphaTheshold) { - if (swin) { setWindow(xp, yp, x1, yp); swin = false; } - pushColor(fg_color); - continue; - } - if (bg_color == 0x00FFFFFF) { - bg_color = readPixel(xp, yp); swin = true; - } - if (swin) { setWindow(xp, yp, x1, yp); swin = false; } - pushColor(fastBlend((uint8_t)(alpha * PixelAlphaGain), fg_color, bg_color)); - } - } - - end_nin_write(); -} - -inline float TFT_eSPI::wedgeLineDistance(float xpax, float ypay, float bax, float bay, float dr) { - float h = fmaxf(fminf((xpax * bax + ypay * bay) / (bax * bax + bay * bay), 1.0f), 0.0f); - float dx = xpax - bax * h, dy = ypay - bay * h; - return sqrtf(dx * dx + dy * dy) + h * dr; -} - void TFT_eSPI::drawFastVLine(int32_t x, int32_t y, int32_t h, uint32_t color) { if (_vpOoB) return; @@ -2218,8 +1600,8 @@ uint16_t TFT_eSPI::color565(uint8_t r, uint8_t g, uint8_t b) { void TFT_eSPI::invertDisplay(bool i) { begin_tft_write(); - writecommand(i ? TFT_INVON : TFT_INVOFF); - writecommand(i ? TFT_INVON : TFT_INVOFF); + writecommand(TFT_INVOFF | i); + writecommand(TFT_INVOFF | i); end_tft_write(); } @@ -2640,14 +2022,12 @@ bool TFT_eSPI::getUnicodeIndex(uint16_t unicode, uint16_t *index, uint16_t font) } void TFT_eSPI::drawGlyph(uint16_t code, uint16_t font) { - // Check if cursor has moved if (last_cursor_x != cursor_x) { bg_cursor_x = cursor_x; last_cursor_x = cursor_x; } - if (code < 0x21) - { + if (code < 0x21) { if (code == 0x20) { if (_fillbg) fillRect(bg_cursor_x, cursor_y, (cursor_x + gFonts[font].spaceWidth) - bg_cursor_x, gFonts[font].yAdvance, textbgcolor); cursor_x += gFonts[font].spaceWidth; @@ -2670,8 +2050,7 @@ void TFT_eSPI::drawGlyph(uint16_t code, uint16_t font) { bool found = getUnicodeIndex(code, &gNum, font); if (found) { - if (textwrapX && (cursor_x + gWidth[font][gNum] + gdX[font][gNum] > width())) - { + if (textwrapX && (cursor_x + gWidth[font][gNum] + gdX[font][gNum] > width())) { cursor_y += gFonts[font].yAdvance; cursor_x = 0; bg_cursor_x = 0; @@ -2684,19 +2063,16 @@ void TFT_eSPI::drawGlyph(uint16_t code, uint16_t font) { int16_t cy = cursor_y + gFonts[font].maxAscent - gdY[font][gNum]; int16_t cx = cursor_x + gdX[font][gNum]; - // if (cx > width() && bg_cursor_x > width()) return; - // if (cursor_y > height()) return; - - int16_t fxs = cx; + int16_t fxs = cx; uint32_t fl = 0; - int16_t bxs = cx; + int16_t bxs = cx; uint32_t bl = 0; - int16_t bx = 0; + int16_t bx = 0; uint8_t pixel; begin_tft_write(); - int16_t fillwidth = 0; + int16_t fillwidth = 0; int16_t fillheight = 0; // Fill area above glyph @@ -2714,9 +2090,7 @@ void TFT_eSPI::drawGlyph(uint16_t code, uint16_t font) { // Set x position in glyph area where background starts if (bg_cursor_x > cx) bx = bg_cursor_x - cx; // Fill any area to right of glyph - if (cx + gWidth[gNum] < cursor_x + gxAdvance[gNum]) { - fillRect(cx + gWidth[font][gNum], cy, (cursor_x + gxAdvance[gNum]) - (cx + gWidth[gNum]), gHeight[font][gNum], textbgcolor); - } + if (cx + gWidth[gNum] < cursor_x + gxAdvance[gNum]) fillRect(cx + gWidth[font][gNum], cy, (cursor_x + gxAdvance[gNum]) - (cx + gWidth[gNum]), gHeight[font][gNum], textbgcolor); } for (int32_t y = 0; y < gHeight[font][gNum]; y++) { @@ -2724,8 +2098,7 @@ void TFT_eSPI::drawGlyph(uint16_t code, uint16_t font) { pixel = pgm_read_byte(gPtr + gBitmap[font][gNum] + x + gWidth[font][gNum] * y); if (pixel) { if (bl) { drawFastHLine( bxs, y + cy, bl, textbgcolor); bl = 0; } - if (pixel != 0xFF) - { + if (pixel != 0xFF) { if (fl) { if (fl==1) drawPixel(fxs, y + cy, textcolor); else drawFastHLine( fxs, y + cy, fl, textcolor); @@ -3044,13 +2417,13 @@ void TFT_eSPI::setTouch(uint16_t *parameters){ TFT_eSprite::TFT_eSprite(TFT_eSPI *tft) { _tft = tft; // Pointer to tft class so we can call member functions - _iwidth = 0; // Initialise width and height to 0 (it does not exist yet) - _iheight = 0; + _iwidth = 0; // Initialise width and height to 0 (it does not exist yet) + _iheight = 0; _bpp = 16; _swapBytes = true; _created = false; - _vpOoB = true; + _vpOoB = true; _xs = 0; // window bounds for pushColor _ys = 0; @@ -3064,7 +2437,6 @@ TFT_eSprite::TFT_eSprite(TFT_eSPI *tft) { } void* TFT_eSprite::createSprite(int16_t w, int16_t h, uint8_t frames) { - if ( _created ) return _img8_1; if ( w < 1 || h < 1 ) return nullptr; @@ -3084,8 +2456,8 @@ void* TFT_eSprite::createSprite(int16_t w, int16_t h, uint8_t frames) { _img8 = (uint8_t*) callocSprite(w, h, frames); _img8_1 = _img8; _img8_2 = _img8; - _img = (uint16_t*) _img8; - _img4 = _img8; + _img = (uint16_t*) _img8; + _img4 = _img8; if ( (_bpp == 16) && (frames > 1) ) _img8_2 = _img8 + (w * h * 2 + 1); @@ -3111,8 +2483,7 @@ void* TFT_eSprite::createSprite(int16_t w, int16_t h, uint8_t frames) { return nullptr; } -void* TFT_eSprite::getPointer() -{ +void* TFT_eSprite::getPointer() { if (!_created) return nullptr; return _img8_1; } @@ -3126,8 +2497,7 @@ TFT_eSprite::~TFT_eSprite() { for(int i = 0; i < 7; i++) unloadFont(i); } -void* TFT_eSprite::callocSprite(int16_t w, int16_t h, uint8_t frames) -{ +void* TFT_eSprite::callocSprite(int16_t w, int16_t h, uint8_t frames) { // Add one extra "off screen" pixel to point out-of-bounds setWindow() coordinates // this means push/writeColor functions do not need additional bounds checks and // hence will run faster in normal circumstances. @@ -3157,13 +2527,7 @@ void* TFT_eSprite::callocSprite(int16_t w, int16_t h, uint8_t frames) return ptr8; } - -/*************************************************************************************** -** Function name: createPalette (from RAM array) -** Description: Set a palette for a 4-bit per pixel sprite -***************************************************************************************/ -void TFT_eSprite::createPalette(uint16_t colorMap[], uint8_t colors) -{ +void TFT_eSprite::createPalette(uint16_t colorMap[], uint8_t colors) { if (!_created) return; if (colorMap == nullptr) @@ -3179,26 +2543,13 @@ void TFT_eSprite::createPalette(uint16_t colorMap[], uint8_t colors) if (colors > 16) colors = 16; // Copy map colors - for (uint8_t i = 0; i < colors; i++) - { - _colorMap[i] = colorMap[i]; - } + for (uint8_t i = 0; i < colors; i++) _colorMap[i] = colorMap[i]; } - -/*************************************************************************************** -** Function name: createPalette (from FLASH array) -** Description: Set a palette for a 4-bit per pixel sprite -***************************************************************************************/ -void TFT_eSprite::createPalette(const uint16_t colorMap[], uint8_t colors) -{ +void TFT_eSprite::createPalette(const uint16_t colorMap[], uint8_t colors) { if (!_created) return; - if (colorMap == nullptr) - { - // Create a color map using the default FLASH map - colorMap = default_4bit_palette; - } + if (colorMap == nullptr) colorMap = default_4bit_palette; // Allocate and clear memory for 16 color map if (_colorMap == nullptr) _colorMap = (uint16_t *)calloc(16, sizeof(uint16_t)); @@ -3206,10 +2557,7 @@ void TFT_eSprite::createPalette(const uint16_t colorMap[], uint8_t colors) if (colors > 16) colors = 16; // Copy map colors - for (uint8_t i = 0; i < colors; i++) - { - _colorMap[i] = pgm_read_word(colorMap++); - } + for (uint8_t i = 0; i < colors; i++) _colorMap[i] = pgm_read_word(colorMap++); } void* TFT_eSprite::setColorDepth(int8_t b) @@ -3237,27 +2585,18 @@ int8_t TFT_eSprite::getColorDepth() { else return 0; } - -void TFT_eSprite::setBitmapColor(uint16_t c, uint16_t b) { - if (c == b) b = ~c; - _tft->bitmap_fg = c; - _tft->bitmap_bg = b; -} - void TFT_eSprite::setPaletteColor(uint8_t index, uint16_t color) { if (_colorMap == nullptr || index > 15) return; // out of bounds _colorMap[index] = color; } - uint16_t TFT_eSprite::getPaletteColor(uint8_t index) { if (_colorMap == nullptr || index > 15) return 0; // out of bounds return _colorMap[index]; } - void TFT_eSprite::deleteSprite() { if (_colorMap != nullptr) { free(_colorMap); @@ -3280,13 +2619,11 @@ void TFT_eSprite::pushSprite(int32_t x, int32_t y) { _tft->setSwapBytes(false); _tft->pushImage(x, y, _dwidth, _dheight, _img ); _tft->setSwapBytes(oldSwapBytes); - } else if (_bpp == 4) { - _tft->pushImage(x, y, _dwidth, _dheight, _img4, false, _colorMap); - } else _tft->pushImage(x, y, _dwidth, _dheight, _img8, (bool)(_bpp == 8)); + } else if(_bpp == 4) _tft->pushImage(x, y, _dwidth, _dheight, _img4, false, _colorMap); + else _tft->pushImage(x, y, _dwidth, _dheight, _img8, _bpp == 8); } -void TFT_eSprite::pushSprite(int32_t x, int32_t y, uint16_t transp) -{ +void TFT_eSprite::pushSprite(int32_t x, int32_t y, uint16_t transp) { if (!_created) return; if (_bpp == 16) { @@ -3308,10 +2645,10 @@ bool TFT_eSprite::pushToSprite(TFT_eSprite *dspr, int32_t x, int32_t y) // Check destination sprite compatibility int8_t ds_bpp = dspr->getColorDepth(); - if (_bpp == 16 && ds_bpp != 16 && ds_bpp != 8) return false; - if (_bpp == 8 && ds_bpp != 8) return false; - if (_bpp == 4 && ds_bpp != 4) return false; - if (_bpp == 1 && ds_bpp != 1) return false; + if (_bpp == 16 && ds_bpp != 16 && ds_bpp != 8) return false; + if (_bpp == 8 && ds_bpp != 8) return false; + if (_bpp == 4 && ds_bpp != 4) return false; + if (_bpp == 1 && ds_bpp != 1) return false; bool oldSwapBytes = dspr->getSwapBytes(); dspr->setSwapBytes(false); @@ -3321,7 +2658,6 @@ bool TFT_eSprite::pushToSprite(TFT_eSprite *dspr, int32_t x, int32_t y) return true; } - /*************************************************************************************** ** Function name: pushToSprite ** Description: Push the sprite to another sprite at x, y with transparent colour @@ -3333,8 +2669,7 @@ bool TFT_eSprite::pushToSprite(TFT_eSprite *dspr, int32_t x, int32_t y) // 8bpp -> 8bpp // 1bpp -> 1bpp -bool TFT_eSprite::pushToSprite(TFT_eSprite *dspr, int32_t x, int32_t y, uint16_t transp) -{ +bool TFT_eSprite::pushToSprite(TFT_eSprite *dspr, int32_t x, int32_t y, uint16_t transp) { if ( !_created || !dspr->_created) return false; // Check Sprites exist // Check destination sprite compatibility @@ -3358,7 +2693,6 @@ bool TFT_eSprite::pushToSprite(TFT_eSprite *dspr, int32_t x, int32_t y, uint16_t uint16_t rp = 0; if (_bpp == 16) rp = _img[xs + ys * width()]; else { rp = readPixel(xs, ys); rp = rp>>8 | rp<<8; } - //dspr->drawPixel(xs, ys, rp); if (transp == rp) { if (pixel_count) { @@ -3368,9 +2702,7 @@ bool TFT_eSprite::pushToSprite(TFT_eSprite *dspr, int32_t x, int32_t y, uint16_t } ox++; } - else { - sline_buffer[pixel_count++] = rp; - } + else sline_buffer[pixel_count++] = rp; } if (pixel_count) dspr->pushImage(ox, y, pixel_count, 1, sline_buffer); y++; @@ -3379,59 +2711,38 @@ bool TFT_eSprite::pushToSprite(TFT_eSprite *dspr, int32_t x, int32_t y, uint16_t return true; } - -/*************************************************************************************** -** Function name: pushSprite -** Description: Push a cropped sprite to the TFT at tx, ty -***************************************************************************************/ -bool TFT_eSprite::pushSprite(int32_t tx, int32_t ty, int32_t sx, int32_t sy, int32_t sw, int32_t sh) -{ +bool TFT_eSprite::pushSprite(int32_t tx, int32_t ty, int32_t sx, int32_t sy, int32_t sw, int32_t sh) { if (!_created) return false; // Perform window boundary checks and crop if needed setWindow(sx, sy, sx + sw - 1, sy + sh - 1); - /* These global variables are now populated for the sprite - _xs = x start coordinate - _ys = y start coordinate - _xe = x end coordinate (inclusive) - _ye = y end coordinate (inclusive) - */ - // Calculate new sprite window bounding box width and height sw = _xe - _xs + 1; sh = _ye - _ys + 1; if (_ys >= _iheight) return false; - if (_bpp == 16) - { + if (_bpp == 16) { bool oldSwapBytes = _tft->getSwapBytes(); _tft->setSwapBytes(false); // Check if a faster block copy to screen is possible - if ( sx == 0 && sw == _dwidth) - _tft->pushImage(tx, ty, sw, sh, _img + _iwidth * _ys ); - else // Render line by line - while (sh--) - _tft->pushImage(tx, ty++, sw, 1, _img + _xs + _iwidth * _ys++ ); + if ( sx == 0 && sw == _dwidth) _tft->pushImage(tx, ty, sw, sh, _img + _iwidth * _ys ); + else { + while (sh--) _tft->pushImage(tx, ty++, sw, 1, _img + _xs + _iwidth * _ys++ ); + } _tft->setSwapBytes(oldSwapBytes); - } - else if (_bpp == 8) - { + } else if (_bpp == 8) { // Check if a faster block copy to screen is possible - if ( sx == 0 && sw == _dwidth) - _tft->pushImage(tx, ty, sw, sh, _img8 + _iwidth * _ys, (bool)true ); - else // Render line by line - while (sh--) - _tft->pushImage(tx, ty++, sw, 1, _img8 + _xs + _iwidth * _ys++, (bool)true ); - } - else if (_bpp == 4) - { + if ( sx == 0 && sw == _dwidth) _tft->pushImage(tx, ty, sw, sh, _img8 + _iwidth * _ys, true); + else { + while (sh--) _tft->pushImage(tx, ty++, sw, 1, _img8 + _xs + _iwidth * _ys++, true); + } + } else if (_bpp == 4) { // Check if a faster block copy to screen is possible - if ( sx == 0 && sw == _dwidth) - _tft->pushImage(tx, ty, sw, sh, _img4 + (_iwidth>>1) * _ys, false, _colorMap ); + if(sx == 0 && sw == _dwidth) _tft->pushImage(tx, ty, sw, sh, _img4 + (_iwidth>>1) * _ys, false, _colorMap); else // Render line by line { int32_t ds = _xs&1; // Odd x start pixel @@ -3536,8 +2847,7 @@ uint16_t TFT_eSprite::readPixelValue(int32_t x, int32_t y) return 0; } -uint16_t TFT_eSprite::readPixel(int32_t x, int32_t y) -{ +uint16_t TFT_eSprite::readPixel(int32_t x, int32_t y) { if (_vpOoB || !_created) return 0xFFFF; x+= _xDatum; @@ -3546,51 +2856,40 @@ uint16_t TFT_eSprite::readPixel(int32_t x, int32_t y) // Range checking if ((x < _vpX) || (y < _vpY) ||(x >= _vpW) || (y >= _vpH)) return 0xFFFF; - if (_bpp == 16) - { + if (_bpp == 16) { uint16_t color = _img[x + y * _iwidth]; return (color >> 8) | (color << 8); } - if (_bpp == 8) - { + if (_bpp == 8) { uint16_t color = _img8[x + y * _iwidth]; - if (color != 0) - { - uint8_t blue[] = {0, 11, 21, 31}; - color = (color & 0xE0)<<8 | (color & 0xC0)<<5 + if (color != 0) { + uint8_t blue[] = {0, 11, 21, 31}; + color = (color & 0xE0)<<8 | (color & 0xC0)<<5 | (color & 0x1C)<<6 | (color & 0x1C)<<3 | blue[color & 0x03]; } return color; } - if (_bpp == 4) - { + if (_bpp == 4) { if (x >= _dwidth) return 0xFFFF; uint16_t color; - if ((x & 0x01) == 0) - color = _colorMap[_img4[((x+y*_iwidth)>>1)] >> 4]; // even index = bits 7 .. 4 - else - color = _colorMap[_img4[((x+y*_iwidth)>>1)] & 0x0F]; // odd index = bits 3 .. 0. + if ((x & 0x01) == 0) color = _colorMap[_img4[((x+y*_iwidth)>>1)] >> 4]; // even index = bits 7 .. 4 + else color = _colorMap[_img4[((x+y*_iwidth)>>1)] & 0x0F]; // odd index = bits 3 .. 0. return color; } // Note: Must be 1bpp // _dwidth and _dheight bounds not checked (rounded up -iwidth and _iheight used) - if (rotation == 1) - { + if (rotation == 1) { uint16_t tx = x; x = _dheight - y - 1; y = tx; - } - else if (rotation == 2) - { + } else if (rotation == 2) { x = _dwidth - x - 1; y = _dheight - y - 1; - } - else if (rotation == 3) - { + } else if (rotation == 3) { uint16_t tx = x; x = y; y = _dwidth - tx - 1; @@ -3599,7 +2898,7 @@ uint16_t TFT_eSprite::readPixel(int32_t x, int32_t y) uint16_t color = (_img8[(x + y * _bitwidth)>>3] << (x & 0x7)) & 0x80; if (color) return _tft->bitmap_fg; - else return _tft->bitmap_bg; + else return _tft->bitmap_bg; } void TFT_eSprite::pushImage(int32_t x, int32_t y, int32_t w, int32_t h, uint16_t *data, uint8_t sbpp) { @@ -3614,25 +2913,17 @@ void TFT_eSprite::pushImage(int32_t x, int32_t y, int32_t w, int32_t h, uint16_t // Pointer within sprite image uint8_t *ptrs = (uint8_t *)_img + ((x + y * _iwidth) << 1); - if(_swapBytes) - { - while (dh--) - { + if(_swapBytes) { + while (dh--) { // Fast copy with a 1 byte shift memcpy(ptrs+1, ptro, (dw<<1) - 1); // Now correct just the even numbered bytes - for (int32_t xp = 0; xp < (dw<<1); xp+=2) - { - ptrs[xp] = ptro[xp+1];; - } + for (int32_t xp = 0; xp < (dw<<1); xp+=2) ptrs[xp] = ptro[xp+1]; ptro += w<<1; ptrs += _iwidth<<1; } - } - else - { - while (dh--) - { + } else { + while (dh--) { memcpy(ptrs, ptro, dw<<1); ptro += w << 1; ptrs += _iwidth << 1; @@ -3646,23 +2937,19 @@ void TFT_eSprite::pushImage(int32_t x, int32_t y, int32_t w, int32_t h, uint16_t // Pointer within sprite image uint8_t *ptrs = (uint8_t *)_img + (x + y * _iwidth); - while (dh--) - { + while (dh--) { memcpy(ptrs, ptro, dw); ptro += w; ptrs += _iwidth; } - } - else if (_bpp == 8) // Plot a 16 bpp image into a 8 bpp Sprite + } else if (_bpp == 8) // Plot a 16 bpp image into a 8 bpp Sprite { uint16_t lastColor = 0; - uint8_t color8 = 0; - for (int32_t yp = dy; yp < dy + dh; yp++) - { + uint8_t color8 = 0; + for (int32_t yp = dy; yp < dy + dh; yp++) { int32_t xyw = x + y * _iwidth; int32_t dxypw = dx + yp * w; - for (int32_t xp = dx; xp < dx + dw; xp++) - { + for (int32_t xp = dx; xp < dx + dw; xp++) { uint16_t color = data[dxypw++]; if (color != lastColor) { // When data source is a sprite, the bytes are already swapped @@ -3674,9 +2961,7 @@ void TFT_eSprite::pushImage(int32_t x, int32_t y, int32_t w, int32_t h, uint16_t } y++; } - } - else if (_bpp == 4) - { + } else if (_bpp == 4) { // The image is assumed to be 4-bit, where each byte corresponds to two pixels. // much faster when aligned to a byte boundary, because the alternative is slower, requiring // tedious bit operations. @@ -3684,30 +2969,23 @@ void TFT_eSprite::pushImage(int32_t x, int32_t y, int32_t w, int32_t h, uint16_t int sWidth = (_iwidth >> 1); uint8_t *ptr = (uint8_t *)data; - if ((x & 0x01) == 0 && (dx & 0x01) == 0 && (dw & 0x01) == 0) - { + if ((x & 0x01) == 0 && (dx & 0x01) == 0 && (dw & 0x01) == 0) { x = (x >> 1) + y * sWidth; dw = (dw >> 1); dx = (dx >> 1) + dy * (w>>1); - while (dh--) - { + while (dh--) { memcpy(_img4 + x, ptr + dx, dw); dx += (w >> 1); x += sWidth; } - } - else // not optimized + } else // not optimized { - for (int32_t yp = dy; yp < dy + dh; yp++) - { + for (int32_t yp = dy; yp < dy + dh; yp++) { int32_t ox = x; - for (int32_t xp = dx; xp < dx + dw; xp++) - { + for (int32_t xp = dx; xp < dx + dw; xp++) { uint32_t color; - if ((xp & 0x01) == 0) - color = (ptr[((xp+yp*w)>>1)] & 0xF0) >> 4; // even index = bits 7 .. 4 - else - color = ptr[((xp-1+yp*w)>>1)] & 0x0F; // odd index = bits 3 .. 0. + if ((xp & 0x01) == 0) color = (ptr[((xp+yp*w)>>1)] & 0xF0) >> 4; // even index = bits 7 .. 4 + else color = ptr[((xp-1+yp*w)>>1)] & 0x0F; // odd index = bits 3 .. 0. drawPixel(ox, y, color); ox++; } @@ -3718,8 +2996,7 @@ void TFT_eSprite::pushImage(int32_t x, int32_t y, int32_t w, int32_t h, uint16_t // Plot a 1bpp image into a 1bpp Sprite uint32_t ww = (w+7)>>3; // Width of source image line in bytes uint8_t *ptr = (uint8_t *)data; - for (int32_t yp = dy; yp < dy + dh; yp++) - { + for (int32_t yp = dy; yp < dy + dh; yp++) { uint32_t yw = yp * ww; // Byte starting the line containing source pixel int32_t ox = x; for (int32_t xp = dx; xp < dx + dw; xp++) { @@ -3742,15 +3019,12 @@ void TFT_eSprite::setWindow(int32_t x0, int32_t y0, int32_t x1, int32_t y1) { int32_t w = width(); int32_t h = height(); - if ((x0 >= w) || (x1 < 0) || (y0 >= h) || (y1 < 0)) - { // Point to that extra "off screen" pixel + if ((x0 >= w) || (x1 < 0) || (y0 >= h) || (y1 < 0)) { // Point to that extra "off screen" pixel _xs = 0; _ys = _dheight; _xe = 0; _ye = _dheight; - } - else - { + } else { if (x0 < 0) x0 = 0; if (x1 >= w) x1 = w - 1; if (y0 < 0) y0 = 0; @@ -3766,29 +3040,17 @@ void TFT_eSprite::setWindow(int32_t x0, int32_t y0, int32_t x1, int32_t y1) { _yptr = _ys; } -void TFT_eSprite::pushColor(uint16_t color) -{ +void TFT_eSprite::pushColor(uint16_t color) { if (!_created ) return; // Write the colour to RAM in set window - if (_bpp == 16) - _img [_xptr + _yptr * _iwidth] = (uint16_t) (color >> 8) | (color << 8); - - else if (_bpp == 8) - _img8[_xptr + _yptr * _iwidth] = (uint8_t )((color & 0xE000)>>8 | (color & 0x0700)>>6 | (color & 0x0018)>>3); - - else if (_bpp == 4) - { - uint8_t c = (uint8_t)color & 0x0F; - if ((_xptr & 0x01) == 0) { - _img4[(_xptr + _yptr * _iwidth)>>1] = (c << 4) | (_img4[(_xptr + _yptr * _iwidth)>>1] & 0x0F); // new color is in bits 7 .. 4 - } - else { - _img4[(_xptr + _yptr * _iwidth)>>1] = (_img4[(_xptr + _yptr * _iwidth)>>1] & 0xF0) | c; // new color is the low bits - } - } - - else drawPixel(_xptr, _yptr, color); + if (_bpp == 16) _img [_xptr + _yptr * _iwidth] = (uint16_t) (color >> 8) | (color << 8); + else if (_bpp == 8) _img8[_xptr + _yptr * _iwidth] = (uint8_t )((color & 0xE000)>>8 | (color & 0x0700)>>6 | (color & 0x0018)>>3); + else if (_bpp == 4) { + uint8_t c = color & 0xF; + if ((_xptr & 0x01) == 0) _img4[(_xptr + _yptr * _iwidth)>>1] = (c << 4) | (_img4[(_xptr + _yptr * _iwidth)>>1] & 0x0F); // new color is in bits 7 .. 4 + else _img4[(_xptr + _yptr * _iwidth)>>1] = (_img4[(_xptr + _yptr * _iwidth)>>1] & 0xF0) | c; // new color is the low bits + } else drawPixel(_xptr, _yptr, color); _xptr++; @@ -3828,17 +3090,14 @@ void TFT_eSprite::writeColor(uint16_t color) _xptr++; - // Wrap on x and y to start, increment y if needed - if (_xptr > _xe) - { + if (_xptr > _xe) { _xptr = _xs; _yptr++; if (_yptr > _ye) _yptr = _ys; } } -void TFT_eSprite::fillSprite(uint32_t color) -{ +void TFT_eSprite::fillSprite(uint32_t color) { if (!_created || _vpOoB) return; if(_xDatum == 0 && _yDatum == 0 && _xWidth == width()) @@ -3993,11 +3252,8 @@ void TFT_eSprite::drawFastVLine(int32_t x, int32_t y, int32_t h, uint32_t color) // Clipping if ((x < _vpX) || (x >= _vpW) || (y >= _vpH)) return; - if (y < _vpY) { h += y - _vpY; y = _vpY; } - if ((y + h) > _vpH) h = _vpH - y; - if (h < 1) return; if (_bpp == 16) { @@ -4036,11 +3292,8 @@ void TFT_eSprite::drawFastHLine(int32_t x, int32_t y, int32_t w, uint32_t color) // Clipping if ((y < _vpY) || (x >= _vpW) || (y >= _vpH)) return; - if (x < _vpX) { w += x - _vpX; x = _vpX; } - if ((x + w) > _vpW) w = _vpW - x; - if (w < 1) return; if (_bpp == 16) { @@ -4052,8 +3305,7 @@ void TFT_eSprite::drawFastHLine(int32_t x, int32_t y, int32_t w, uint32_t color) } else if (_bpp == 4) { uint8_t c = (uint8_t)color & 0x0F; uint8_t c2 = (c | ((c << 4) & 0xF0)); - if ((x & 0x01) == 1) - { + if ((x & 0x01) == 1) { drawPixel(x - _xDatum, y - _yDatum, color); x++; w--; if (w < 1) return; diff --git a/lib/TFT_eSPI/TFT_eSPI.h b/lib/TFT_eSPI/TFT_eSPI.h index 1107709..690d4a2 100644 --- a/lib/TFT_eSPI/TFT_eSPI.h +++ b/lib/TFT_eSPI/TFT_eSPI.h @@ -241,7 +241,6 @@ static const uint16_t default_4bit_palette[] PROGMEM = { typedef uint16_t (*getColorCallback)(uint16_t x, uint16_t y); class TFT_eSPI { friend class TFT_eSprite; - public: void setSPISpeed(uint8_t speed_Mhz); TFT_eSPI(int16_t _W = TFT_WIDTH, int16_t _H = TFT_HEIGHT); @@ -266,9 +265,7 @@ class TFT_eSPI { friend class TFT_eSprite; void setAddrWindow(int32_t xs, int32_t ys, int32_t w, int32_t h); void setViewport(int32_t x, int32_t y, int32_t w, int32_t h, bool vpDatum = true); void resetViewport(); - bool clipWindow(int32_t* xs, int32_t* ys, int32_t* xe, int32_t* ye); void pushColor(uint16_t color, uint32_t len); - void pushColors(uint16_t *data, uint32_t len, bool swap = true); void pushBlock(uint16_t color, uint32_t len); void pushPixels(const void * data_in, uint32_t len); void fillScreen(uint32_t color), @@ -278,29 +275,20 @@ class TFT_eSPI { friend class TFT_eSprite; void drawCircleHelper(int32_t x, int32_t y, int32_t r, uint8_t cornername, uint32_t color), fillCircle(int32_t x, int32_t y, int32_t r, uint32_t color), fillCircleHelper(int32_t x, int32_t y, int32_t r, uint8_t cornername, int32_t delta, uint32_t color), - drawEllipse(int16_t x, int16_t y, int32_t rx, int32_t ry, uint16_t color), - fillEllipse(int16_t x, int16_t y, int32_t rx, int32_t ry, uint16_t color), fillTriangle(int32_t x1,int32_t y1, int32_t x2,int32_t y2, int32_t x3,int32_t y3, uint32_t color); uint16_t drawPixel(int32_t x, int32_t y, uint32_t color, uint8_t alpha, uint32_t bg_color = 0x00FFFFFF); - void drawArc(int32_t x, int32_t y, int32_t r, int32_t ir, uint32_t startAngle, uint32_t endAngle, uint32_t fg_color, uint32_t bg_color, bool smoothArc = true); - void drawSmoothCircle(int32_t x, int32_t y, int32_t r, uint32_t fg_color, uint32_t bg_color); - void fillSmoothCircle(int32_t x, int32_t y, int32_t r, uint32_t color, uint32_t bg_color = 0x00FFFFFF); - void drawSmoothRoundRect(int32_t x, int32_t y, int32_t r, int32_t ir, int32_t w, int32_t h, uint32_t fg_color, uint32_t bg_color = 0x00FFFFFF, uint8_t quadrants = 0xF); - void fillSmoothRoundRect(int32_t x, int32_t y, int32_t w, int32_t h, int32_t radius, uint32_t color, uint32_t bg_color = 0x00FFFFFF); - void drawWedgeLine(float ax, float ay, float bx, float by, float aw, float bw, uint32_t fg_color, uint32_t bg_color = 0x00FFFFFF); - void setSwapBytes(bool swap); - bool getSwapBytes(); - void drawBitmap( int16_t x, int16_t y, const uint8_t *bitmap, int16_t w, int16_t h, uint16_t fgcolor), - drawBitmap( int16_t x, int16_t y, const uint8_t *bitmap, int16_t w, int16_t h, uint16_t fgcolor, uint16_t bgcolor), - setBitmapColor(uint16_t fgcolor, uint16_t bgcolor); - void setPivot(int16_t x, int16_t y); - void pushImage(int32_t x, int32_t y, int32_t w, int32_t h, uint16_t *data); - void pushImage(int32_t x, int32_t y, int32_t w, int32_t h, uint16_t *data, uint16_t transparent); - void pushImage(int32_t x, int32_t y, int32_t w, int32_t h, const uint16_t *data, uint16_t transparent); - void pushImage(int32_t x, int32_t y, int32_t w, int32_t h, const uint16_t *data); - void pushImage(int32_t x, int32_t y, int32_t w, int32_t h, uint8_t *data, bool bpp8 = true, uint16_t *cmap = nullptr); - void pushImage(int32_t x, int32_t y, int32_t w, int32_t h, uint8_t *data, uint8_t transparent, bool bpp8 = true, uint16_t *cmap = nullptr); - void pushImage(int32_t x, int32_t y, int32_t w, int32_t h, const uint8_t *data, bool bpp8, uint16_t *cmap = nullptr); + void setSwapBytes(bool swap); + bool getSwapBytes(); + void drawBitmap( int16_t x, int16_t y, const uint8_t *bitmap, int16_t w, int16_t h, uint16_t fgcolor), + drawBitmap( int16_t x, int16_t y, const uint8_t *bitmap, int16_t w, int16_t h, uint16_t fgcolor, uint16_t bgcolor); + void setPivot(int16_t x, int16_t y); + void pushImage(int32_t x, int32_t y, int32_t w, int32_t h, uint16_t *data); + void pushImage(int32_t x, int32_t y, int32_t w, int32_t h, uint16_t *data, uint16_t transparent); + void pushImage(int32_t x, int32_t y, int32_t w, int32_t h, const uint16_t *data, uint16_t transparent); + void pushImage(int32_t x, int32_t y, int32_t w, int32_t h, const uint16_t *data); + void pushImage(int32_t x, int32_t y, int32_t w, int32_t h, uint8_t *data, bool bpp8 = true, uint16_t *cmap = nullptr); + void pushImage(int32_t x, int32_t y, int32_t w, int32_t h, uint8_t *data, uint8_t transparent, bool bpp8 = true, uint16_t *cmap = nullptr); + void pushImage(int32_t x, int32_t y, int32_t w, int32_t h, const uint8_t *data, bool bpp8, uint16_t *cmap = nullptr); // Text rendering - value returned is the pixel width of the rendered text int16_t drawNumber(long intNumber, int32_t x, int32_t y, uint8_t font), // Draw integer using specified font number @@ -319,18 +307,14 @@ class TFT_eSPI { friend class TFT_eSprite; drawString(const String& string, int32_t x, int32_t y); // Draw string using current font // Text rendering and font handling support functions - void setCursor(int16_t x, int16_t y), + void setCursor(int16_t x, int16_t y), setCursor(int16_t x, int16_t y, uint8_t font); - void setTextColor(uint16_t color), // Set character (glyph) color only (background not over-written) - setTextColor(uint16_t fgcolor, uint16_t bgcolor, bool bgfill = false), // Set character (glyph) foreground and background colour, optional background fill for smooth fonts - setTextSize(uint8_t size); // Set character size multiplier (this increases pixel size) + void setTextColor(uint16_t color), // Set character (glyph) color only (background not over-written) + setTextColor(uint16_t fgcolor, uint16_t bgcolor, bool bgfill = false); // Set character (glyph) foreground and background colour, optional background fill for smooth fonts + void setTextDatum(uint8_t datum); // Set text datum position (default is top left), see Section 5 above - void setTextWrap(bool wrapX, bool wrapY = false); // Turn on/off wrapping of text in TFT width and/or height - - void setTextDatum(uint8_t datum); // Set text datum position (default is top left), see Section 5 above - - void setTextPadding(uint16_t x_width); // Set text padding (background blanking) width in pixels + void setTextPadding(uint16_t x_width); // Set text padding (background blanking) width in pixels void setTextFont(uint8_t font); // Set the font number to use in future int16_t textWidth(const char *string, uint8_t font), // Returns pixel width of string in specified font @@ -344,9 +328,8 @@ class TFT_eSPI { friend class TFT_eSprite; uint16_t decodeUTF8(uint8_t *buf, uint16_t *index, uint16_t remaining), decodeUTF8(uint8_t c); - void spiwrite(uint8_t); // legacy support only - void writecommand(uint8_t c); // Send an 8-bit command, function resets DC/RS high ready for data - void writedata(uint8_t d); // Send data with DC/RS set high + void writecommand(uint8_t c); // Send an 8-bit command, function resets DC/RS high ready for data + void writedata(uint8_t d); // Send data with DC/RS set high // Colour conversion // Convert 8-bit red, green and blue to 16 bits @@ -360,9 +343,7 @@ class TFT_eSPI { friend class TFT_eSprite; // 16-bit colour alphaBlend with alpha dither (dither reduces colour banding) uint16_t alphaBlend(uint8_t alpha, uint16_t fgc, uint16_t bgc, uint8_t dither); - uint8_t spiBusyCheck = 0; // Number of ESP32 transfer buffers to check - - void writeColor(uint16_t color, uint32_t len); // Deprecated, use pushBlock() + void writeColor(uint16_t color, uint32_t len); // Deprecated, use pushBlock() // Global variables uint32_t textcolor, textbgcolor; // Text foreground and background colours @@ -377,13 +358,13 @@ class TFT_eSPI { friend class TFT_eSprite; uint8_t decoderState = 0; // UTF8 decoder state - not for user access uint16_t decoderBuffer; // Unicode code-point buffer - not for user access - void loadFont(const uint8_t array[], uint8_t font); - void unloadFont(uint8_t font); - bool getUnicodeIndex(uint16_t unicode, uint16_t *index, uint16_t font); + void loadFont(const uint8_t array[], uint8_t font); + void unloadFont(uint8_t font); + bool getUnicodeIndex(uint16_t unicode, uint16_t *index, uint16_t font); virtual void drawGlyph(uint16_t code, uint16_t font); - bool booted; + bool booted; typedef struct { @@ -434,19 +415,9 @@ class TFT_eSPI { friend class TFT_eSprite; void readAddrWindow(int32_t xs, int32_t ys, int32_t w, int32_t h); - uint8_t readByte(); - - void busDir(uint32_t mask, uint8_t mode); - - void gpioMode(uint8_t gpio, uint8_t mode); - - uint8_t sqrt_fraction(uint32_t num); - - float wedgeLineDistance(float pax, float pay, float bax, float bay, float dr); - getColorCallback getColor = nullptr; // Smooth font callback function pointer - void loadMetrics(uint8_t font); // Function of Fear, which is Unhandled Exception, writing to 0x000000000 + void loadMetrics(uint8_t font); // FoF uint32_t readInt32(); uint8_t* fontPtr = nullptr; @@ -454,36 +425,34 @@ class TFT_eSPI { friend class TFT_eSprite; //-------------------------------------- protected ----------------------------------// protected: -uint8_t spi_write_speed; - //int32_t win_xe, win_ye; // Window end coords - not needed + uint8_t spi_write_speed; + int32_t _init_width, _init_height; // Display w/h as input, used by setRotation() + int32_t _width, _height; // Display w/h as modified by current rotation + int32_t addr_row, addr_col; // Window position - used to minimise window commands - int32_t _init_width, _init_height; // Display w/h as input, used by setRotation() - int32_t _width, _height; // Display w/h as modified by current rotation - int32_t addr_row, addr_col; // Window position - used to minimise window commands - - int16_t _xPivot; // TFT x pivot point coordinate for rotated Sprites - int16_t _yPivot; // TFT x pivot point coordinate for rotated Sprites + int16_t _xPivot; // TFT x pivot point coordinate for rotated Sprites + int16_t _yPivot; // TFT x pivot point coordinate for rotated Sprites // Viewport variables - int32_t _vpX, _vpY, _vpW, _vpH; // Note: x start, y start, x end + 1, y end + 1 - int32_t _xDatum; - int32_t _yDatum; - int32_t _xWidth; - int32_t _yHeight; - bool _vpDatum; - bool _vpOoB; + int32_t _vpX, _vpY, _vpW, _vpH; // Note: x start, y start, x end + 1, y end + 1 + int32_t _xDatum; + int32_t _yDatum; + int32_t _xWidth; + int32_t _yHeight; + bool _vpDatum; + bool _vpOoB; - int32_t cursor_x, cursor_y, padX; - int32_t bg_cursor_x; - int32_t last_cursor_x; + int32_t cursor_x, cursor_y, padX; + int32_t bg_cursor_x; + int32_t last_cursor_x; - bool isDigits; - bool textwrapX, textwrapY; - bool _swapBytes; + bool isDigits; + bool textwrapX, textwrapY; + bool _swapBytes; uint32_t _lastColor; - bool _fillbg; + bool _fillbg; private: inline void begin_touch_read_write() __attribute__((always_inline)); @@ -511,9 +480,8 @@ class TFT_eSprite : public TFT_eSPI { void createPalette(const uint16_t *palette = nullptr, uint8_t colors = 16); void setPaletteColor(uint8_t index, uint16_t color); uint16_t getPaletteColor(uint8_t index); - void setBitmapColor(uint16_t fg, uint16_t bg); void drawPixel(int32_t x, int32_t y, uint32_t color); - void fillSprite(uint32_t color), + void fillSprite(uint32_t color), setWindow(int32_t x0, int32_t y0, int32_t x1, int32_t y1), pushColor(uint16_t color), pushColor(uint16_t color, uint32_t len), @@ -524,16 +492,16 @@ class TFT_eSprite : public TFT_eSPI { fillRect(int32_t x, int32_t y, int32_t w, int32_t h, uint32_t color); uint16_t readPixel(int32_t x0, int32_t y0); uint16_t readPixelValue(int32_t x, int32_t y); - void pushImage(int32_t x0, int32_t y0, int32_t w, int32_t h, uint16_t *data, uint8_t sbpp = 0); - void pushImage(int32_t x0, int32_t y0, int32_t w, int32_t h, const uint16_t *data); - void pushSprite(int32_t x, int32_t y); - void pushSprite(int32_t x, int32_t y, uint16_t transparent); - bool pushSprite(int32_t tx, int32_t ty, int32_t sx, int32_t sy, int32_t sw, int32_t sh); - bool pushToSprite(TFT_eSprite *dspr, int32_t x, int32_t y); - bool pushToSprite(TFT_eSprite *dspr, int32_t x, int32_t y, uint16_t transparent); + void pushImage(int32_t x0, int32_t y0, int32_t w, int32_t h, uint16_t *data, uint8_t sbpp = 0); + void pushImage(int32_t x0, int32_t y0, int32_t w, int32_t h, const uint16_t *data); + void pushSprite(int32_t x, int32_t y); + void pushSprite(int32_t x, int32_t y, uint16_t transparent); + bool pushSprite(int32_t tx, int32_t ty, int32_t sx, int32_t sy, int32_t sw, int32_t sh); + bool pushToSprite(TFT_eSprite *dspr, int32_t x, int32_t y); + bool pushToSprite(TFT_eSprite *dspr, int32_t x, int32_t y, uint16_t transparent); int16_t width(), height(); - void drawGlyph(uint16_t code, uint16_t font); + void drawGlyph(uint16_t code, uint16_t font); void copyFontFromTFT(uint8_t source, uint8_t destination); void copyAllFontsFromTFT(); @@ -541,7 +509,7 @@ class TFT_eSprite : public TFT_eSPI { TFT_eSPI *_tft; - void* callocSprite(int16_t width, int16_t height, uint8_t frames = 1); + void* callocSprite(int16_t width, int16_t height, uint8_t frames = 1); protected: @@ -570,8 +538,7 @@ class TFT_eSprite : public TFT_eSPI { }; template static inline void transpose(T& a, T& b) { T t = a; a = b; b = t; } -template static inline uint16_t fastBlend(A alpha, F fgc, B bgc) -{ +template static inline uint16_t fastBlend(A alpha, F fgc, B bgc) { // Split out and blend 5-bit red and blue channels uint32_t rxb = bgc & 0xF81F; rxb += ((fgc & 0xF81F) - rxb) * (alpha >> 2) >> 6; diff --git a/src/RdsPiBuffer.cpp b/src/RdsPiBuffer.cpp index ae4322e..9fc6cea 100644 --- a/src/RdsPiBuffer.cpp +++ b/src/RdsPiBuffer.cpp @@ -19,7 +19,7 @@ RdsPiBuffer::State RdsPiBuffer::add(uint16_t value, bool error) { return this->getState(value); } -void RdsPiBuffer::clear(){ +void RdsPiBuffer::clear() { this->fill = 0; this->pos = (uint8_t)-1; } diff --git a/src/gui.cpp b/src/gui.cpp index c47c68b..233d582 100644 --- a/src/gui.cpp +++ b/src/gui.cpp @@ -727,13 +727,13 @@ void ShowOneLine(byte position, byte item, bool selected) { case DXMODE: FullLineSprite.setTextDatum(TL_DATUM); FullLineSprite.setTextColor(ActiveColor, ActiveColorSmooth, false); - FullLineSprite.drawString(removeNewline(textUI(209)), 6, 2); + FullLineSprite.drawString(removeNewline(textUI(208)), 6, 2); break; case AUTOMEM: FullLineSprite.setTextDatum(TL_DATUM); FullLineSprite.setTextColor(ActiveColor, ActiveColorSmooth, false); - FullLineSprite.drawString(removeNewline(textUI(266)), 6, 2); + FullLineSprite.drawString(removeNewline(textUI(265)), 6, 2); break; } break; @@ -773,7 +773,7 @@ void ShowOneLine(byte position, byte item, bool selected) { FullLineSprite.setTextDatum(TR_DATUM); FullLineSprite.setTextColor(PrimaryColor, PrimaryColorSmooth, false); - FullLineSprite.drawString(String(ContrastSet, DEC), 258, 2); + FullLineSprite.drawString(String(ContrastSet), 258, 2); FullLineSprite.setTextColor(ActiveColor, ActiveColorSmooth, false); FullLineSprite.drawString("%", 298, 2); break; @@ -789,7 +789,7 @@ void ShowOneLine(byte position, byte item, bool selected) { case 0: FullLineSprite.drawString(textUI(44), 298, 2); break; case 1: FullLineSprite.drawString(String(textUI(45)) + " DB", 298, 2); break; case 2: FullLineSprite.drawString(textUI(45), 298, 2); break; - case 3: FullLineSprite.drawString(textUI(297), 298, 2); break; + case 3: FullLineSprite.drawString(textUI(296), 298, 2); break; } break; @@ -830,7 +830,7 @@ void ShowOneLine(byte position, byte item, bool selected) { case DXMODE: FullLineSprite.setTextDatum(TL_DATUM); FullLineSprite.setTextColor(ActiveColor, ActiveColorSmooth, false); - FullLineSprite.drawString(removeNewline(textUI(206)), 6, 2); + FullLineSprite.drawString(removeNewline(textUI(205)), 6, 2); FullLineSprite.setTextDatum(TR_DATUM); FullLineSprite.setTextColor(PrimaryColor, PrimaryColorSmooth, false); @@ -840,7 +840,7 @@ void ShowOneLine(byte position, byte item, bool selected) { case AUTOMEM: FullLineSprite.setTextDatum(TL_DATUM); FullLineSprite.setTextColor(ActiveColor, ActiveColorSmooth, false); - FullLineSprite.drawString(removeNewline(textUI(261)), 6, 2); + FullLineSprite.drawString(removeNewline(textUI(260)), 6, 2); FullLineSprite.setTextDatum(TR_DATUM); FullLineSprite.setTextColor(ActiveColor, ActiveColorSmooth, false); @@ -942,7 +942,7 @@ void ShowOneLine(byte position, byte item, bool selected) { case DXMODE: FullLineSprite.setTextDatum(TL_DATUM); FullLineSprite.setTextColor(ActiveColor, ActiveColorSmooth, false); - FullLineSprite.drawString(removeNewline(textUI(207)), 6, 2); + FullLineSprite.drawString(removeNewline(textUI(206)), 6, 2); FullLineSprite.setTextDatum(TR_DATUM); FullLineSprite.setTextColor(PrimaryColor, PrimaryColorSmooth, false); @@ -952,7 +952,7 @@ void ShowOneLine(byte position, byte item, bool selected) { case AUTOMEM: FullLineSprite.setTextDatum(TL_DATUM); FullLineSprite.setTextColor(ActiveColor, ActiveColorSmooth, false); - FullLineSprite.drawString(removeNewline(textUI(262)), 6, 2); + FullLineSprite.drawString(removeNewline(textUI(261)), 6, 2); FullLineSprite.setTextDatum(TR_DATUM); FullLineSprite.setTextColor(ActiveColor, ActiveColorSmooth, false); @@ -1050,7 +1050,7 @@ void ShowOneLine(byte position, byte item, bool selected) { case DXMODE: FullLineSprite.setTextDatum(TL_DATUM); FullLineSprite.setTextColor(ActiveColor, ActiveColorSmooth, false); - FullLineSprite.drawString(removeNewline(textUI(208)), 6, 2); + FullLineSprite.drawString(removeNewline(textUI(207)), 6, 2); FullLineSprite.setTextDatum(TR_DATUM); FullLineSprite.setTextColor(ActiveColor, ActiveColorSmooth, false); @@ -1062,7 +1062,7 @@ void ShowOneLine(byte position, byte item, bool selected) { case AUTOMEM: FullLineSprite.setTextDatum(TL_DATUM); FullLineSprite.setTextColor(ActiveColor, ActiveColorSmooth, false); - FullLineSprite.drawString(removeNewline(textUI(263)), 6, 2); + FullLineSprite.drawString(removeNewline(textUI(262)), 6, 2); FullLineSprite.setTextDatum(TR_DATUM); FullLineSprite.setTextColor(PrimaryColor, PrimaryColorSmooth, false); @@ -1156,7 +1156,7 @@ void ShowOneLine(byte position, byte item, bool selected) { case CONNECTIVITY: FullLineSprite.setTextDatum(TL_DATUM); FullLineSprite.setTextColor(ActiveColor, ActiveColorSmooth, false); - FullLineSprite.drawString(removeNewline(textUI(268)), 6, 2); + FullLineSprite.drawString(removeNewline(textUI(267)), 6, 2); FullLineSprite.setTextDatum(TR_DATUM); FullLineSprite.setTextColor(PrimaryColor, PrimaryColorSmooth, false); @@ -1166,17 +1166,17 @@ void ShowOneLine(byte position, byte item, bool selected) { case DXMODE: FullLineSprite.setTextDatum(TL_DATUM); FullLineSprite.setTextColor(ActiveColor, ActiveColorSmooth, false); - FullLineSprite.drawString(removeNewline(textUI(213)), 6, 2); + FullLineSprite.drawString(removeNewline(textUI(212)), 6, 2); FullLineSprite.setTextDatum(TR_DATUM); FullLineSprite.setTextColor(PrimaryColor, PrimaryColorSmooth, false); - FullLineSprite.drawString((scanmem ? textUI(215) : textUI(214)), 298, 2); + FullLineSprite.drawString((scanmem ? textUI(214) : textUI(213)), 298, 2); break; case AUTOMEM: FullLineSprite.setTextDatum(TL_DATUM); FullLineSprite.setTextColor(ActiveColor, ActiveColorSmooth, false); - FullLineSprite.drawString(removeNewline(textUI(264)), 6, 2); + FullLineSprite.drawString(removeNewline(textUI(263)), 6, 2); FullLineSprite.setTextDatum(TR_DATUM); FullLineSprite.setTextColor(PrimaryColor, PrimaryColorSmooth, false); @@ -1270,7 +1270,7 @@ void ShowOneLine(byte position, byte item, bool selected) { case CONNECTIVITY: FullLineSprite.setTextDatum(TL_DATUM); FullLineSprite.setTextColor(ActiveColor, ActiveColorSmooth, false); - FullLineSprite.drawString(removeNewline(textUI(202)), 6, 2); + FullLineSprite.drawString(removeNewline(textUI(201)), 6, 2); FullLineSprite.setTextDatum(TR_DATUM); FullLineSprite.setTextColor(PrimaryColor, PrimaryColorSmooth, false); @@ -1280,21 +1280,21 @@ void ShowOneLine(byte position, byte item, bool selected) { case DXMODE: FullLineSprite.setTextDatum(TL_DATUM); FullLineSprite.setTextColor(ActiveColor, ActiveColorSmooth, false); - FullLineSprite.drawString(removeNewline(textUI(216)), 6, 2); + FullLineSprite.drawString(removeNewline(textUI(215)), 6, 2); FullLineSprite.setTextDatum(TR_DATUM); FullLineSprite.setTextColor(PrimaryColor, PrimaryColorSmooth, false); switch (scancancel) { case SCAN_CANCEL: FullLineSprite.drawString(textUI(27), 298, 2); break; - case CORRECTPI: FullLineSprite.drawString(textUI(217), 298, 2); break; - case SIGNAL: FullLineSprite.drawString(textUI(218), 298, 2); break; + case CORRECTPI: FullLineSprite.drawString(textUI(216), 298, 2); break; + case SIGNAL: FullLineSprite.drawString(textUI(217), 298, 2); break; } break; case AUTOMEM: FullLineSprite.setTextDatum(TL_DATUM); FullLineSprite.setTextColor(ActiveColor, ActiveColorSmooth, false); - FullLineSprite.drawString(removeNewline(textUI(265)), 6, 2); + FullLineSprite.drawString(removeNewline(textUI(264)), 6, 2); FullLineSprite.setTextDatum(TR_DATUM); FullLineSprite.setTextColor(PrimaryColor, PrimaryColorSmooth, false); @@ -1386,7 +1386,7 @@ void ShowOneLine(byte position, byte item, bool selected) { case CONNECTIVITY: FullLineSprite.setTextDatum(TL_DATUM); FullLineSprite.setTextColor(ActiveColor, ActiveColorSmooth, false); - FullLineSprite.drawString(removeNewline(textUI(295)), 6, 2); + FullLineSprite.drawString(removeNewline(textUI(294)), 6, 2); FullLineSprite.setTextDatum(TR_DATUM); FullLineSprite.setTextColor(PrimaryColor, PrimaryColorSmooth, false); @@ -1398,7 +1398,7 @@ void ShowOneLine(byte position, byte item, bool selected) { case DXMODE: FullLineSprite.setTextDatum(TL_DATUM); FullLineSprite.setTextColor(ActiveColor, ActiveColorSmooth, false); - FullLineSprite.drawString(removeNewline(textUI(219)), 6, 2); + FullLineSprite.drawString(removeNewline(textUI(218)), 6, 2); FullLineSprite.setTextDatum(TR_DATUM); FullLineSprite.setTextColor(PrimaryColor, PrimaryColorSmooth, false); @@ -1408,15 +1408,15 @@ void ShowOneLine(byte position, byte item, bool selected) { case AUTOMEM: FullLineSprite.setTextDatum(TL_DATUM); FullLineSprite.setTextColor(ActiveColor, ActiveColorSmooth, false); - FullLineSprite.drawString(removeNewline(textUI(275)), 6, 2); + FullLineSprite.drawString(removeNewline(textUI(274)), 6, 2); FullLineSprite.setTextDatum(TR_DATUM); FullLineSprite.setTextColor(PrimaryColor, PrimaryColorSmooth, false); switch (memdoublepi) { case MEMPI_OFF: FullLineSprite.drawString(textUI(27), 298, 2); break; - case MEMPI_RANGE: FullLineSprite.drawString(textUI(276), 298, 2); break; - default: FullLineSprite.drawString(textUI(277), 298, 2); break; + case MEMPI_RANGE: FullLineSprite.drawString(textUI(275), 298, 2); break; + default: FullLineSprite.drawString(textUI(276), 298, 2); break; } break; } @@ -1427,7 +1427,7 @@ void ShowOneLine(byte position, byte item, bool selected) { case INDEX: FullLineSprite.setTextDatum(TC_DATUM); FullLineSprite.setTextColor(ActiveColor, ActiveColorSmooth, false); - FullLineSprite.drawString(removeNewline(textUI(210)), 152, 2); + FullLineSprite.drawString(removeNewline(textUI(209)), 152, 2); break; case MAINSETTINGS: @@ -1451,7 +1451,7 @@ void ShowOneLine(byte position, byte item, bool selected) { case DISPLAYSETTINGS: FullLineSprite.setTextDatum(TL_DATUM); FullLineSprite.setTextColor(ActiveColor, ActiveColorSmooth, false); - FullLineSprite.drawString(removeNewline(textUI(259)), 6, 2); + FullLineSprite.drawString(removeNewline(textUI(258)), 6, 2); FullLineSprite.setTextDatum(TR_DATUM); FullLineSprite.setTextColor(PrimaryColor, PrimaryColorSmooth, false); @@ -1461,7 +1461,7 @@ void ShowOneLine(byte position, byte item, bool selected) { case RDSSETTINGS: FullLineSprite.setTextDatum(TL_DATUM); FullLineSprite.setTextColor(ActiveColor, ActiveColorSmooth, false); - FullLineSprite.drawString(removeNewline(textUI(212)), 6, 2); + FullLineSprite.drawString(removeNewline(textUI(211)), 6, 2); FullLineSprite.setTextDatum(TR_DATUM); FullLineSprite.setTextColor(PrimaryColor, PrimaryColorSmooth, false); FullLineSprite.drawString((radio.rds.sortaf ? textUI(28) : textUI(27)), 298, 2); @@ -1499,7 +1499,7 @@ void ShowOneLine(byte position, byte item, bool selected) { case CONNECTIVITY: FullLineSprite.setTextDatum(TL_DATUM); FullLineSprite.setTextColor(ActiveColor, ActiveColorSmooth, false); - FullLineSprite.drawString(removeNewline(textUI(294)), 6, 2); + FullLineSprite.drawString(removeNewline(textUI(293)), 6, 2); FullLineSprite.setTextDatum(TR_DATUM); FullLineSprite.setTextColor(PrimaryColor, PrimaryColorSmooth, false); @@ -1509,7 +1509,7 @@ void ShowOneLine(byte position, byte item, bool selected) { case DXMODE: FullLineSprite.setTextDatum(TL_DATUM); FullLineSprite.setTextColor(ActiveColor, ActiveColorSmooth, false); - FullLineSprite.drawString(removeNewline(textUI(293)), 6, 2); + FullLineSprite.drawString(removeNewline(textUI(292)), 6, 2); FullLineSprite.setTextDatum(TR_DATUM); FullLineSprite.setTextColor(PrimaryColor, PrimaryColorSmooth, false); @@ -1533,20 +1533,20 @@ void ShowOneLine(byte position, byte item, bool selected) { case INDEX: FullLineSprite.setTextDatum(TC_DATUM); FullLineSprite.setTextColor(ActiveColor, ActiveColorSmooth, false); - FullLineSprite.drawString(removeNewline(textUI(267)), 152, 2); + FullLineSprite.drawString(removeNewline(textUI(266)), 152, 2); break; case MAINSETTINGS: FullLineSprite.setTextDatum(TL_DATUM); FullLineSprite.setTextColor(ActiveColor, ActiveColorSmooth, false); - FullLineSprite.drawString(removeNewline(textUI(221)), 6, 2); + FullLineSprite.drawString(removeNewline(textUI(220)), 6, 2); FullLineSprite.setTextDatum(TR_DATUM); FullLineSprite.setTextColor(PrimaryColor, PrimaryColorSmooth, false); switch (longbandpress) { - case STANDBY: FullLineSprite.drawString(textUI(222), 298, 2); break; - case SCREENOFF: FullLineSprite.drawString(textUI(223), 298, 2); break; - default: FullLineSprite.drawString(textUI(224), 298, 2); break; + case STANDBY: FullLineSprite.drawString(textUI(221), 298, 2); break; + case SCREENOFF: FullLineSprite.drawString(textUI(222), 298, 2); break; + default: FullLineSprite.drawString(textUI(223), 298, 2); break; } break; @@ -1569,15 +1569,15 @@ void ShowOneLine(byte position, byte item, bool selected) { switch (radio.rds.fastps) { case 0: FullLineSprite.drawString(textUI(27), 298, 2); break; - case 1: FullLineSprite.drawString(textUI(257), 298, 2); break; - case 2: FullLineSprite.drawString(textUI(258), 298, 2); break; + case 1: FullLineSprite.drawString(textUI(256), 298, 2); break; + case 2: FullLineSprite.drawString(textUI(257), 298, 2); break; } break; case FMSETTINGS: FullLineSprite.setTextDatum(TL_DATUM); FullLineSprite.setTextColor(ActiveColor, ActiveColorSmooth, false); - FullLineSprite.drawString(removeNewline(textUI(203)), 6, 2); + FullLineSprite.drawString(removeNewline(textUI(202)), 6, 2); FullLineSprite.setTextDatum(TR_DATUM); FullLineSprite.setTextColor(PrimaryColor, PrimaryColorSmooth, false); FullLineSprite.drawString((fmsi ? textUI(28) : textUI(27)), 298, 2); @@ -1606,7 +1606,7 @@ void ShowOneLine(byte position, byte item, bool selected) { case DXMODE: FullLineSprite.setTextDatum(TL_DATUM); FullLineSprite.setTextColor(ActiveColor, ActiveColorSmooth, false); - FullLineSprite.drawString(removeNewline(textUI(278)), 6, 2); + FullLineSprite.drawString(removeNewline(textUI(277)), 6, 2); FullLineSprite.setTextDatum(TR_DATUM); FullLineSprite.setTextColor(PrimaryColor, PrimaryColorSmooth, false); FullLineSprite.drawString((scanholdonsignal ? textUI(28) : textUI(27)), 298, 2); @@ -1615,7 +1615,7 @@ void ShowOneLine(byte position, byte item, bool selected) { case AUTOMEM: FullLineSprite.setTextDatum(TL_DATUM); FullLineSprite.setTextColor(ActiveColor, ActiveColorSmooth, false); - FullLineSprite.drawString(removeNewline(textUI(273)), 6, 2); + FullLineSprite.drawString(removeNewline(textUI(272)), 6, 2); break; } break; @@ -1659,7 +1659,7 @@ void ShowOneLine(byte position, byte item, bool selected) { case RDSSETTINGS: FullLineSprite.setTextDatum(TL_DATUM); FullLineSprite.setTextColor(ActiveColor, ActiveColorSmooth, false); - FullLineSprite.drawString(removeNewline(textUI(260)), 6, 2); + FullLineSprite.drawString(removeNewline(textUI(259)), 6, 2); FullLineSprite.setTextDatum(TR_DATUM); FullLineSprite.setTextColor(PrimaryColor, PrimaryColorSmooth, false); FullLineSprite.drawString((showlongps ? textUI(28) : textUI(27)), 298, 2); @@ -1693,7 +1693,7 @@ void ShowOneLine(byte position, byte item, bool selected) { case DXMODE: FullLineSprite.setTextDatum(TL_DATUM); FullLineSprite.setTextColor(ActiveColor, ActiveColorSmooth, false); - FullLineSprite.drawString(removeNewline(textUI(289)), 6, 2); + FullLineSprite.drawString(removeNewline(textUI(288)), 6, 2); break; } break; @@ -1800,13 +1800,13 @@ void ShowOneButton(byte position, byte item, bool selected) { case DXMODE: PSSprite.setTextDatum(TC_DATUM); PSSprite.setTextColor(ActiveColor, ActiveColorSmooth, false); - PSSprite.drawString(shortLine(removeNewline(textUI(209))), 75, 8); + PSSprite.drawString(shortLine(removeNewline(textUI(208))), 75, 8); break; case AUTOMEM: PSSprite.setTextDatum(TC_DATUM); PSSprite.setTextColor(ActiveColor, ActiveColorSmooth, false); - PSSprite.drawString(shortLine(removeNewline(textUI(266))), 75, 8); + PSSprite.drawString(shortLine(removeNewline(textUI(265))), 75, 8); break; } break; @@ -1843,7 +1843,7 @@ void ShowOneButton(byte position, byte item, bool selected) { PSSprite.setTextDatum(TR_DATUM); PSSprite.setTextColor(PrimaryColor, PrimaryColorSmooth, false); - PSSprite.drawString(String(ContrastSet, DEC), 73, 15); + PSSprite.drawString(String(ContrastSet), 73, 15); PSSprite.setTextColor(ActiveColor, ActiveColorSmooth, false); PSSprite.setTextDatum(TL_DATUM); PSSprite.drawString("%", 77, 15); @@ -1859,7 +1859,7 @@ void ShowOneButton(byte position, byte item, bool selected) { case 0: PSSprite.drawString(textUI(44), 75, 15); break; case 1: PSSprite.drawString(String(textUI(45)) + " DB", 75, 15); break; case 2: PSSprite.drawString(textUI(45), 75, 15); break; - case 3: PSSprite.drawString(textUI(297), 75, 15); break; + case 3: PSSprite.drawString(textUI(296), 75, 15); break; } break; @@ -1906,7 +1906,7 @@ void ShowOneButton(byte position, byte item, bool selected) { case DXMODE: PSSprite.setTextDatum(TC_DATUM); PSSprite.setTextColor(ActiveColor, ActiveColorSmooth, false); - PSSprite.drawString(shortLine(removeNewline(textUI(206))), 75, 1); + PSSprite.drawString(shortLine(removeNewline(textUI(205))), 75, 1); PSSprite.setTextColor(PrimaryColor, PrimaryColorSmooth, false); PSSprite.drawString(String(scanstart + 1, DEC), 75, 15); @@ -1915,7 +1915,7 @@ void ShowOneButton(byte position, byte item, bool selected) { case AUTOMEM: PSSprite.setTextDatum(TC_DATUM); PSSprite.setTextColor(ActiveColor, ActiveColorSmooth, false); - PSSprite.drawString(shortLine(removeNewline(textUI(261))), 75, 1); + PSSprite.drawString(shortLine(removeNewline(textUI(260))), 75, 1); PSSprite.setTextDatum(TL_DATUM); PSSprite.setTextColor(ActiveColor, ActiveColorSmooth, false); @@ -2019,7 +2019,7 @@ void ShowOneButton(byte position, byte item, bool selected) { case DXMODE: PSSprite.setTextDatum(TC_DATUM); PSSprite.setTextColor(ActiveColor, ActiveColorSmooth, false); - PSSprite.drawString(shortLine(removeNewline(textUI(207))), 75, 1); + PSSprite.drawString(shortLine(removeNewline(textUI(206))), 75, 1); PSSprite.setTextColor(PrimaryColor, PrimaryColorSmooth, false); PSSprite.drawString(String(scanstop + 1, DEC), 75, 15); @@ -2028,7 +2028,7 @@ void ShowOneButton(byte position, byte item, bool selected) { case AUTOMEM: PSSprite.setTextDatum(TC_DATUM); PSSprite.setTextColor(ActiveColor, ActiveColorSmooth, false); - PSSprite.drawString(shortLine(removeNewline(textUI(262))), 75, 1); + PSSprite.drawString(shortLine(removeNewline(textUI(261))), 75, 1); PSSprite.setTextDatum(TL_DATUM); PSSprite.setTextColor(ActiveColor, ActiveColorSmooth, false); @@ -2134,7 +2134,7 @@ void ShowOneButton(byte position, byte item, bool selected) { case DXMODE: PSSprite.setTextDatum(TC_DATUM); PSSprite.setTextColor(ActiveColor, ActiveColorSmooth, false); - PSSprite.drawString(shortLine(removeNewline(textUI(208))), 75, 1); + PSSprite.drawString(shortLine(removeNewline(textUI(207))), 75, 1); PSSprite.setTextDatum(TL_DATUM); PSSprite.setTextColor(ActiveColor, ActiveColorSmooth, false); @@ -2147,7 +2147,7 @@ void ShowOneButton(byte position, byte item, bool selected) { case AUTOMEM: PSSprite.setTextDatum(TC_DATUM); PSSprite.setTextColor(ActiveColor, ActiveColorSmooth, false); - PSSprite.drawString(shortLine(removeNewline(textUI(263))), 75, 1); + PSSprite.drawString(shortLine(removeNewline(textUI(262))), 75, 1); PSSprite.setTextColor(PrimaryColor, PrimaryColorSmooth, false); PSSprite.drawString(String(memstartpos + 1, DEC), 75, 15); @@ -2246,7 +2246,7 @@ void ShowOneButton(byte position, byte item, bool selected) { case CONNECTIVITY: PSSprite.setTextDatum(TC_DATUM); PSSprite.setTextColor(ActiveColor, ActiveColorSmooth, false); - PSSprite.drawString(shortLine(removeNewline(textUI(268))), 75, 1); + PSSprite.drawString(shortLine(removeNewline(textUI(267))), 75, 1); PSSprite.setTextColor(PrimaryColor, PrimaryColorSmooth, false); PSSprite.drawString(String(stationlistid, DEC), 75, 15); @@ -2255,16 +2255,16 @@ void ShowOneButton(byte position, byte item, bool selected) { case DXMODE: PSSprite.setTextDatum(TC_DATUM); PSSprite.setTextColor(ActiveColor, ActiveColorSmooth, false); - PSSprite.drawString(shortLine(removeNewline(textUI(213))), 75, 1); + PSSprite.drawString(shortLine(removeNewline(textUI(212))), 75, 1); PSSprite.setTextColor(PrimaryColor, PrimaryColorSmooth, false); - PSSprite.drawString((scanmem ? textUI(215) : textUI(214)), 75, 15); + PSSprite.drawString((scanmem ? textUI(214) : textUI(213)), 75, 15); break; case AUTOMEM: PSSprite.setTextDatum(TC_DATUM); PSSprite.setTextColor(ActiveColor, ActiveColorSmooth, false); - PSSprite.drawString(shortLine(removeNewline(textUI(264))), 75, 1); + PSSprite.drawString(shortLine(removeNewline(textUI(263))), 75, 1); PSSprite.setTextColor(PrimaryColor, PrimaryColorSmooth, false); PSSprite.drawString(String(memstoppos + 1, DEC), 75, 15); @@ -2359,7 +2359,7 @@ void ShowOneButton(byte position, byte item, bool selected) { case CONNECTIVITY: PSSprite.setTextDatum(TC_DATUM); PSSprite.setTextColor(ActiveColor, ActiveColorSmooth, false); - PSSprite.drawString(shortLine(removeNewline(textUI(202))), 75, 1); + PSSprite.drawString(shortLine(removeNewline(textUI(201))), 75, 1); PSSprite.setTextColor(PrimaryColor, PrimaryColorSmooth, false); PSSprite.drawString((XDRGTKMuteScreen ? textUI(28) : textUI(27)), 75, 15); @@ -2368,20 +2368,20 @@ void ShowOneButton(byte position, byte item, bool selected) { case DXMODE: PSSprite.setTextDatum(TC_DATUM); PSSprite.setTextColor(ActiveColor, ActiveColorSmooth, false); - PSSprite.drawString(shortLine(removeNewline(textUI(216))), 75, 1); + PSSprite.drawString(shortLine(removeNewline(textUI(215))), 75, 1); PSSprite.setTextColor(PrimaryColor, PrimaryColorSmooth, false); switch (scancancel) { case 0: PSSprite.drawString(textUI(27), 75, 15); break; - case CORRECTPI: PSSprite.drawString(textUI(217), 75, 15); break; - case SIGNAL: PSSprite.drawString(textUI(218), 75, 15); break; + case CORRECTPI: PSSprite.drawString(textUI(216), 75, 15); break; + case SIGNAL: PSSprite.drawString(textUI(217), 75, 15); break; } break; case AUTOMEM: PSSprite.setTextDatum(TC_DATUM); PSSprite.setTextColor(ActiveColor, ActiveColorSmooth, false); - PSSprite.drawString(shortLine(removeNewline(textUI(265))), 75, 1); + PSSprite.drawString(shortLine(removeNewline(textUI(264))), 75, 1); PSSprite.setTextColor(PrimaryColor, PrimaryColorSmooth, false); PSSprite.drawString((mempionly ? textUI(28) : textUI(27)), 75, 15); @@ -2484,7 +2484,7 @@ void ShowOneButton(byte position, byte item, bool selected) { case CONNECTIVITY: PSSprite.setTextDatum(TC_DATUM); PSSprite.setTextColor(ActiveColor, ActiveColorSmooth, false); - PSSprite.drawString(shortLine(removeNewline(textUI(295))), 75, 1); + PSSprite.drawString(shortLine(removeNewline(textUI(294))), 75, 1); PSSprite.setTextDatum(TL_DATUM); PSSprite.setTextColor(PrimaryColor, PrimaryColorSmooth, false); @@ -2497,7 +2497,7 @@ void ShowOneButton(byte position, byte item, bool selected) { case DXMODE: PSSprite.setTextDatum(TC_DATUM); PSSprite.setTextColor(ActiveColor, ActiveColorSmooth, false); - PSSprite.drawString(shortLine(removeNewline(textUI(219))), 75, 1); + PSSprite.drawString(shortLine(removeNewline(textUI(218))), 75, 1); PSSprite.setTextColor(PrimaryColor, PrimaryColorSmooth, false); PSSprite.drawString((scanmute ? textUI(28) : textUI(27)), 75, 15); @@ -2506,14 +2506,14 @@ void ShowOneButton(byte position, byte item, bool selected) { case AUTOMEM: PSSprite.setTextDatum(TC_DATUM); PSSprite.setTextColor(ActiveColor, ActiveColorSmooth, false); - PSSprite.drawString(shortLine(removeNewline(textUI(275))), 75, 1); + PSSprite.drawString(shortLine(removeNewline(textUI(274))), 75, 1); PSSprite.setTextColor(PrimaryColor, PrimaryColorSmooth, false); switch (memdoublepi) { case MEMPI_OFF: PSSprite.drawString(textUI(27), 75, 15); break; - case MEMPI_RANGE: PSSprite.drawString(textUI(276), 75, 15); break; - default: PSSprite.drawString(textUI(277), 75, 15); break; + case MEMPI_RANGE: PSSprite.drawString(textUI(275), 75, 15); break; + default: PSSprite.drawString(textUI(276), 75, 15); break; } break; } @@ -2524,7 +2524,7 @@ void ShowOneButton(byte position, byte item, bool selected) { case INDEX: PSSprite.setTextDatum(TC_DATUM); PSSprite.setTextColor(ActiveColor, ActiveColorSmooth, false); - PSSprite.drawString(shortLine(removeNewline(textUI(210))), 75, 8); + PSSprite.drawString(shortLine(removeNewline(textUI(209))), 75, 8); break; case MAINSETTINGS: @@ -2547,7 +2547,7 @@ void ShowOneButton(byte position, byte item, bool selected) { case DISPLAYSETTINGS: PSSprite.setTextDatum(TC_DATUM); PSSprite.setTextColor(ActiveColor, ActiveColorSmooth, false); - PSSprite.drawString(shortLine(removeNewline(textUI(259))), 75, 1); + PSSprite.drawString(shortLine(removeNewline(textUI(258))), 75, 1); PSSprite.setTextColor(PrimaryColor, PrimaryColorSmooth, false); PSSprite.drawString((showclock ? textUI(28) : textUI(27)), 75, 15); @@ -2556,7 +2556,7 @@ void ShowOneButton(byte position, byte item, bool selected) { case RDSSETTINGS: PSSprite.setTextDatum(TC_DATUM); PSSprite.setTextColor(ActiveColor, ActiveColorSmooth, false); - PSSprite.drawString(shortLine(removeNewline(textUI(212))), 75, 1); + PSSprite.drawString(shortLine(removeNewline(textUI(211))), 75, 1); PSSprite.setTextColor(PrimaryColor, PrimaryColorSmooth, false); PSSprite.drawString((radio.rds.sortaf ? textUI(28) : textUI(27)), 75, 15); @@ -2596,7 +2596,7 @@ void ShowOneButton(byte position, byte item, bool selected) { case CONNECTIVITY: PSSprite.setTextDatum(TC_DATUM); PSSprite.setTextColor(ActiveColor, ActiveColorSmooth, false); - PSSprite.drawString(shortLine(removeNewline(textUI(294))), 75, 1); + PSSprite.drawString(shortLine(removeNewline(textUI(293))), 75, 1); PSSprite.setTextColor(PrimaryColor, PrimaryColorSmooth, false); PSSprite.drawString((autoDST ? textUI(28) : textUI(27)), 75, 15); @@ -2605,7 +2605,7 @@ void ShowOneButton(byte position, byte item, bool selected) { case DXMODE: PSSprite.setTextDatum(TC_DATUM); PSSprite.setTextColor(ActiveColor, ActiveColorSmooth, false); - PSSprite.drawString(shortLine(removeNewline(textUI(293))), 75, 1); + PSSprite.drawString(shortLine(removeNewline(textUI(292))), 75, 1); PSSprite.setTextColor(PrimaryColor, PrimaryColorSmooth, false); PSSprite.drawString((autolog ? textUI(28) : textUI(27)), 75, 15); @@ -2627,19 +2627,19 @@ void ShowOneButton(byte position, byte item, bool selected) { case INDEX: PSSprite.setTextDatum(TC_DATUM); PSSprite.setTextColor(ActiveColor, ActiveColorSmooth, false); - PSSprite.drawString(shortLine(removeNewline(textUI(267))), 75, 8); + PSSprite.drawString(shortLine(removeNewline(textUI(266))), 75, 8); break; case MAINSETTINGS: PSSprite.setTextDatum(TC_DATUM); PSSprite.setTextColor(ActiveColor, ActiveColorSmooth, false); - PSSprite.drawString(shortLine(removeNewline(textUI(221))), 75, 1); + PSSprite.drawString(shortLine(removeNewline(textUI(220))), 75, 1); PSSprite.setTextColor(PrimaryColor, PrimaryColorSmooth, false); switch (longbandpress) { - case STANDBY: PSSprite.drawString(textUI(222), 75, 15); break; - case SCREENOFF: PSSprite.drawString(textUI(223), 75, 15); break; - default: PSSprite.drawString(textUI(224), 75, 15); break; + case STANDBY: PSSprite.drawString(textUI(221), 75, 15); break; + case SCREENOFF: PSSprite.drawString(textUI(222), 75, 15); break; + default: PSSprite.drawString(textUI(223), 75, 15); break; } break; @@ -2661,15 +2661,15 @@ void ShowOneButton(byte position, byte item, bool selected) { switch (radio.rds.fastps) { case 0: PSSprite.drawString(textUI(27), 75, 15); break; - case 1: PSSprite.drawString(textUI(257), 75, 15); break; - case 2: PSSprite.drawString(textUI(258), 75, 15); break; + case 1: PSSprite.drawString(textUI(256), 75, 15); break; + case 2: PSSprite.drawString(textUI(257), 75, 15); break; } break; case FMSETTINGS: PSSprite.setTextDatum(TC_DATUM); PSSprite.setTextColor(ActiveColor, ActiveColorSmooth, false); - PSSprite.drawString(shortLine(removeNewline(textUI(203))), 75, 1); + PSSprite.drawString(shortLine(removeNewline(textUI(202))), 75, 1); PSSprite.setTextColor(PrimaryColor, PrimaryColorSmooth, false); PSSprite.drawString((fmsi ? textUI(28) : textUI(27)), 75, 15); @@ -2696,7 +2696,7 @@ void ShowOneButton(byte position, byte item, bool selected) { case DXMODE: PSSprite.setTextDatum(TC_DATUM); PSSprite.setTextColor(ActiveColor, ActiveColorSmooth, false); - PSSprite.drawString(shortLine(removeNewline(textUI(278))), 75, 1); + PSSprite.drawString(shortLine(removeNewline(textUI(277))), 75, 1); PSSprite.setTextColor(PrimaryColor, PrimaryColorSmooth, false); PSSprite.drawString((scanholdonsignal ? textUI(28) : textUI(27)), 75, 15); @@ -2705,7 +2705,7 @@ void ShowOneButton(byte position, byte item, bool selected) { case AUTOMEM: PSSprite.setTextDatum(TC_DATUM); PSSprite.setTextColor(ActiveColor, ActiveColorSmooth, false); - PSSprite.drawString(shortLine(removeNewline(textUI(273))), 75, 8); + PSSprite.drawString(shortLine(removeNewline(textUI(272))), 75, 8); break; } break; @@ -2748,7 +2748,7 @@ void ShowOneButton(byte position, byte item, bool selected) { case RDSSETTINGS: PSSprite.setTextDatum(TC_DATUM); PSSprite.setTextColor(ActiveColor, ActiveColorSmooth, false); - PSSprite.drawString(shortLine(removeNewline(textUI(260))), 75, 1); + PSSprite.drawString(shortLine(removeNewline(textUI(259))), 75, 1); PSSprite.setTextColor(PrimaryColor, PrimaryColorSmooth, false); PSSprite.drawString((showlongps ? textUI(28) : textUI(27)), 75, 15); @@ -2789,27 +2789,25 @@ void ShowOneButton(byte position, byte item, bool selected) { case DXMODE: PSSprite.setTextDatum(TC_DATUM); PSSprite.setTextColor(ActiveColor, ActiveColorSmooth, false); - PSSprite.drawString(shortLine(removeNewline(textUI(289))), 75, 8); + PSSprite.drawString(shortLine(removeNewline(textUI(288))), 75, 8); break; } break; } PSSprite.pushSprite((position > ITEM5 ? 163 : 8), (position * 2) - 22 - (position > ITEM5 ? 200 : 0)); if (selected) { - tft.drawRect((position > ITEM5 ? 163 : 8), - (position * 2) - 22 - (position > ITEM5 ? 200 : 0), 150, 32, PrimaryColor); - tft.drawRect((position > ITEM5 ? 164 : 9), - (position * 2) - 21 - (position > ITEM5 ? 200 : 0), 148, 30, PrimaryColor); + tft.drawRoundRect((position > ITEM5 ? 163 : 8), (position * 2) - 22 - (position > ITEM5 ? 200 : 0), 150, 32, 4, PrimaryColor); + tft.drawRoundRect((position > ITEM5 ? 164 : 9), (position * 2) - 21 - (position > ITEM5 ? 200 : 0), 148, 30, 4, PrimaryColor); } } void BuildBWSelector() { BWsettemp = BWset; switch (CurrentTheme) { - case 7: tft.pushImage (0, 0, 320, 240, configurationbackground_wo); break; - default: tft.pushImage (0, 0, 320, 240, configurationbackground); break; + case 7: tft.pushImage(0, 0, 320, 240, configurationbackground_wo); break; + default: tft.pushImage(0, 0, 320, 240, configurationbackground); break; } - tftPrint(ACENTER, textUI(282), 160, 6, PrimaryColor, PrimaryColorSmooth, 16); + tftPrint(ACENTER, textUI(281), 160, 6, PrimaryColor, PrimaryColorSmooth, 16); showBWSelector(); } @@ -3341,9 +3339,9 @@ void MenuUpDown(bool dir) { } switch (longbandpress) { - case STANDBY: OneBigLineSprite.drawString(textUI(222), 135, 0); break; - case SCREENOFF: OneBigLineSprite.drawString(textUI(223), 135, 0); break; - default: OneBigLineSprite.drawString(textUI(224), 135, 0); break; + case STANDBY: OneBigLineSprite.drawString(textUI(221), 135, 0); break; + case SCREENOFF: OneBigLineSprite.drawString(textUI(222), 135, 0); break; + default: OneBigLineSprite.drawString(textUI(223), 135, 0); break; } OneBigLineSprite.pushSprite(24, 118); break; @@ -3496,20 +3494,15 @@ void MenuUpDown(bool dir) { break; case ITEM7: - if (dir) { - fmdeemphasis = (RADIO_FM_DEEMPHASIS)(fmdeemphasis+1); - if (fmdeemphasis > DEEMPHASIS_COUNT - 1) fmdeemphasis = DEEMPHASIS_NONE; - } else { - fmdeemphasis = (RADIO_FM_DEEMPHASIS)(fmdeemphasis-1); - if (fmdeemphasis > DEEMPHASIS_COUNT - 1) fmdeemphasis = (RADIO_FM_DEEMPHASIS)(DEEMPHASIS_COUNT - 1); - } + if (dir) fmdeemphasis = (RADIO_FM_DEEMPHASIS)((fmdeemphasis + 1) % DEEMPHASIS_COUNT); + else fmdeemphasis = (RADIO_FM_DEEMPHASIS)((fmdeemphasis + DEEMPHASIS_COUNT - 1) % DEEMPHASIS_COUNT); OneBigLineSprite.setTextDatum(TL_DATUM); OneBigLineSprite.setTextColor(ActiveColor, ActiveColorSmooth, false); if (fmdeemphasis != DEEMPHASIS_NONE) OneBigLineSprite.drawString("μs", 155, 0); if (fmdeemphasis != DEEMPHASIS_NONE) OneBigLineSprite.setTextDatum(TR_DATUM); else OneBigLineSprite.setTextDatum(TC_DATUM); OneBigLineSprite.setTextColor(PrimaryColor, PrimaryColorSmooth, false); - OneBigLineSprite.drawString((fmdeemphasis != DEEMPHASIS_NONE ? (fmdeemphasis == DEEMPHASIS_50 ? String(50, DEC) : String(75, DEC)) : textUI(27)), 135, 0); + OneBigLineSprite.drawString((fmdeemphasis != DEEMPHASIS_NONE ? (fmdeemphasis == DEEMPHASIS_50 ? "50" : "75") : textUI(27)), 135, 0); OneBigLineSprite.pushSprite(24, 118); radio.setDeemphasis(fmdeemphasis); break; @@ -3534,11 +3527,11 @@ void MenuUpDown(bool dir) { case ITEM2: if (dir) { - ContrastSet ++; - if (ContrastSet > 100) ContrastSet = 1; + ContrastSet++; + if (ContrastSet > 100) ContrastSet = 0; } else { - ContrastSet --; - if (ContrastSet < 1) ContrastSet = 100; + ContrastSet--; + if (ContrastSet > 100) ContrastSet = 100; } OneBigLineSprite.setTextDatum(TL_DATUM); @@ -3546,9 +3539,9 @@ void MenuUpDown(bool dir) { OneBigLineSprite.drawString("%", 155, 0); OneBigLineSprite.setTextDatum(TR_DATUM); OneBigLineSprite.setTextColor(PrimaryColor, PrimaryColorSmooth, false); - OneBigLineSprite.drawString(String(ContrastSet, DEC), 135, 0); + OneBigLineSprite.drawString(String(ContrastSet), 135, 0); OneBigLineSprite.pushSprite(24, 118); - analogWrite(CONTRASTPIN, map(ContrastSet, 0, 100, 15, 255)); + analogWrite(CONTRASTPIN, map(ContrastSet, 0, 100, 0, 255)); break; case ITEM3: @@ -3711,7 +3704,7 @@ void MenuUpDown(bool dir) { case 0: OneBigLineSprite.drawString(textUI(44), 135, 0); break; case 1: OneBigLineSprite.drawString(String(textUI(45)) + " DB", 135, 0); break; case 2: OneBigLineSprite.drawString(textUI(45), 135, 0); break; - case 3: OneBigLineSprite.drawString(textUI(297), 135, 0); break; + case 3: OneBigLineSprite.drawString(textUI(296), 135, 0); break; } OneBigLineSprite.pushSprite(24, 118); break; @@ -3790,8 +3783,8 @@ void MenuUpDown(bool dir) { switch (radio.rds.fastps) { case 0: OneBigLineSprite.drawString(textUI(27), 135, 0); break; - case 1: OneBigLineSprite.drawString(textUI(257), 135, 0); break; - case 2: OneBigLineSprite.drawString(textUI(258), 135, 0); break; + case 1: OneBigLineSprite.drawString(textUI(256), 135, 0); break; + case 2: OneBigLineSprite.drawString(textUI(257), 135, 0); break; } OneBigLineSprite.pushSprite(24, 118); @@ -4281,7 +4274,7 @@ void MenuUpDown(bool dir) { case ITEM5: scanmem = !scanmem; - OneBigLineSprite.drawString((scanmem ? textUI(215) : textUI(214)), 135, 0); + OneBigLineSprite.drawString((scanmem ? textUI(214) : textUI(213)), 135, 0); OneBigLineSprite.pushSprite(24, 118); break; @@ -4296,8 +4289,8 @@ void MenuUpDown(bool dir) { switch (scancancel) { case SCAN_CANCEL: OneBigLineSprite.drawString(textUI(27), 135, 0); break; - case CORRECTPI: OneBigLineSprite.drawString(textUI(217), 135, 0); break; - case SIGNAL: OneBigLineSprite.drawString(textUI(218), 135, 0); break; + case CORRECTPI: OneBigLineSprite.drawString(textUI(216), 135, 0); break; + case SIGNAL: OneBigLineSprite.drawString(textUI(217), 135, 0); break; } OneBigLineSprite.pushSprite(24, 118); break; @@ -4407,8 +4400,8 @@ void MenuUpDown(bool dir) { switch (memdoublepi) { case MEMPI_OFF: OneBigLineSprite.drawString(textUI(27), 135, 0); break; - case MEMPI_RANGE: OneBigLineSprite.drawString(textUI(276), 135, 0); break; - default: OneBigLineSprite.drawString(textUI(277), 135, 0); break; + case MEMPI_RANGE: OneBigLineSprite.drawString(textUI(275), 135, 0); break; + default: OneBigLineSprite.drawString(textUI(276), 135, 0); break; } OneBigLineSprite.pushSprite(24, 118); break; @@ -4687,12 +4680,12 @@ void DoMenu() { break; case ITEM9: - Infoboxprint(textUI(221)); + Infoboxprint(textUI(220)); switch (longbandpress) { - case STANDBY: OneBigLineSprite.drawString(textUI(222), 135, 0); break; - case SCREENOFF: OneBigLineSprite.drawString(textUI(223), 135, 0); break; - default: OneBigLineSprite.drawString(textUI(224), 135, 0); break; + case STANDBY: OneBigLineSprite.drawString(textUI(221), 135, 0); break; + case SCREENOFF: OneBigLineSprite.drawString(textUI(222), 135, 0); break; + default: OneBigLineSprite.drawString(textUI(223), 135, 0); break; } OneBigLineSprite.pushSprite(24, 118); break; @@ -4869,7 +4862,7 @@ void DoMenu() { break; case ITEM8: - Infoboxprint(textUI(259)); + Infoboxprint(textUI(258)); OneBigLineSprite.drawString((showclock ? textUI(28) : textUI(27)), 135, 0); OneBigLineSprite.pushSprite(24, 118); @@ -4911,7 +4904,7 @@ void DoMenu() { case 0: OneBigLineSprite.drawString(textUI(44), 135, 0); break; case 1: OneBigLineSprite.drawString(String(textUI(45)) + " DB", 135, 0); break; case 2: OneBigLineSprite.drawString(textUI(45), 135, 0); break; - case 3: OneBigLineSprite.drawString(textUI(297), 135, 0); break; + case 3: OneBigLineSprite.drawString(textUI(296), 135, 0); break; } OneBigLineSprite.pushSprite(24, 118); break; @@ -4961,7 +4954,7 @@ void DoMenu() { break; case ITEM8: - Infoboxprint(textUI(212)); + Infoboxprint(textUI(211)); OneBigLineSprite.drawString((radio.rds.sortaf ? textUI(28) : textUI(27)), 135, 0); OneBigLineSprite.pushSprite(24, 118); @@ -4972,15 +4965,15 @@ void DoMenu() { switch (radio.rds.fastps) { case 0: OneBigLineSprite.drawString(textUI(27), 135, 0); break; - case 1: OneBigLineSprite.drawString(textUI(257), 135, 0); break; - case 2: OneBigLineSprite.drawString(textUI(258), 135, 0); break; + case 1: OneBigLineSprite.drawString(textUI(256), 135, 0); break; + case 2: OneBigLineSprite.drawString(textUI(257), 135, 0); break; } OneBigLineSprite.pushSprite(24, 118); break; case ITEM10: - Infoboxprint(textUI(260)); + Infoboxprint(textUI(259)); OneBigLineSprite.drawString((showlongps ? textUI(28) : textUI(27)), 135, 0); OneBigLineSprite.pushSprite(24, 118); @@ -5088,9 +5081,9 @@ void DoMenu() { case ITEM9: if(chipmodel == 1 || chipmodel == 3) { - Infoboxprint(textUI(203)); + Infoboxprint(textUI(202)); OneBigLineSprite.drawString((fmsi ? textUI(28) : textUI(27)), 135, 0); - } else Infoboxprint(textUI(204)); + } else Infoboxprint(textUI(203)); OneBigLineSprite.pushSprite(24, 118); break; @@ -5253,21 +5246,21 @@ void DoMenu() { break; case ITEM5: - Infoboxprint(textUI(268)); + Infoboxprint(textUI(267)); OneBigLineSprite.drawString(String(stationlistid, DEC), 135, 0); OneBigLineSprite.pushSprite(24, 118); break; case ITEM6: - Infoboxprint(textUI(202)); + Infoboxprint(textUI(201)); OneBigLineSprite.drawString((XDRGTKMuteScreen ? textUI(28) : textUI(27)), 135, 0); OneBigLineSprite.pushSprite(24, 118); break; case ITEM7: - Infoboxprint(textUI(295)); + Infoboxprint(textUI(294)); OneBigLineSprite.setTextDatum(TR_DATUM); OneBigLineSprite.setTextColor(ActiveColor, ActiveColorSmooth, false); @@ -5279,7 +5272,7 @@ void DoMenu() { break; case ITEM8: - Infoboxprint(textUI(294)); + Infoboxprint(textUI(293)); OneBigLineSprite.drawString((autoDST ? textUI(28) : textUI(27)), 135, 0); OneBigLineSprite.pushSprite(24, 118); @@ -5317,7 +5310,7 @@ void DoMenu() { switch (menuoption) { case ITEM1: if (presets[scanstart].band == BAND_FM && presets[scanstart].frequency == EE_PRESETS_FREQUENCY && scanmem) { - Infoboxprint(textUI(211)); + Infoboxprint(textUI(210)); OneBigLineSprite.pushSprite(24, 118); } else { startFMDXScan(); @@ -5325,21 +5318,21 @@ void DoMenu() { break; case ITEM2: - Infoboxprint(textUI(206)); + Infoboxprint(textUI(205)); OneBigLineSprite.drawString(String(scanstart + 1), 135, 0); OneBigLineSprite.pushSprite(24, 118); break; case ITEM3: - Infoboxprint(textUI(207)); + Infoboxprint(textUI(206)); OneBigLineSprite.drawString(String(scanstop + 1), 135, 0); OneBigLineSprite.pushSprite(24, 118); break; case ITEM4: - Infoboxprint(textUI(208)); + Infoboxprint(textUI(207)); OneBigLineSprite.setTextDatum(TL_DATUM); OneBigLineSprite.setTextColor(ActiveColor, ActiveColorSmooth, false); @@ -5351,47 +5344,47 @@ void DoMenu() { break; case ITEM5: - Infoboxprint(textUI(213)); + Infoboxprint(textUI(212)); - OneBigLineSprite.drawString((scanmem ? textUI(215) : textUI(214)), 135, 0); + OneBigLineSprite.drawString((scanmem ? textUI(214) : textUI(213)), 135, 0); OneBigLineSprite.pushSprite(24, 118); break; case ITEM6: - Infoboxprint(textUI(216)); + Infoboxprint(textUI(215)); switch (scancancel) { case SCAN_CANCEL: OneBigLineSprite.drawString(textUI(27), 135, 0); break; - case CORRECTPI: OneBigLineSprite.drawString(textUI(217), 135, 0); break; - case SIGNAL: OneBigLineSprite.drawString(textUI(218), 135, 0); break; + case CORRECTPI: OneBigLineSprite.drawString(textUI(216), 135, 0); break; + case SIGNAL: OneBigLineSprite.drawString(textUI(217), 135, 0); break; } OneBigLineSprite.pushSprite(24, 118); break; case ITEM7: - Infoboxprint(textUI(219)); + Infoboxprint(textUI(218)); OneBigLineSprite.drawString((scanmute ? textUI(28) : textUI(27)), 135, 0); OneBigLineSprite.pushSprite(24, 118); break; case ITEM8: - Infoboxprint(textUI(293)); + Infoboxprint(textUI(292)); OneBigLineSprite.drawString((autolog ? textUI(28) : textUI(27)), 135, 0); OneBigLineSprite.pushSprite(24, 118); break; case ITEM9: - Infoboxprint(textUI(278)); + Infoboxprint(textUI(277)); OneBigLineSprite.drawString((scanholdonsignal ? textUI(28) : textUI(27)), 135, 0); OneBigLineSprite.pushSprite(24, 118); break; case ITEM10: - Infoboxprint(textUI(289)); - if (handleCreateNewLogbook()) OneBigLineSprite.drawString(textUI(290), 135, 0); else OneBigLineSprite.drawString(textUI(291), 135, 0); + Infoboxprint(textUI(288)); + if (handleCreateNewLogbook()) OneBigLineSprite.drawString(textUI(289), 135, 0); else OneBigLineSprite.drawString(textUI(290), 135, 0); OneBigLineSprite.pushSprite(24, 118); if (hardwaremodel == PORTABLE_TOUCH_ILI9341) { @@ -5406,18 +5399,18 @@ void DoMenu() { case AUTOMEM: switch (menuoption) { case ITEM1: - Infoboxprint(textUI(267)); + Infoboxprint(textUI(266)); switch (doAutoMemory(memstartfreq, memstopfreq, memstartpos, memstoppos, mempionly, memdoublepi)) { case 0: - tftPrint(ACENTER, textUI(272), 160, 175, ActiveColor, ActiveColorSmooth, 16); + tftPrint(ACENTER, textUI(271), 160, 175, ActiveColor, ActiveColorSmooth, 16); break; case 1: - tftPrint(ACENTER, textUI(270), 160, 175, ActiveColor, ActiveColorSmooth, 16); + tftPrint(ACENTER, textUI(269), 160, 175, ActiveColor, ActiveColorSmooth, 16); break; case 2: - tftPrint(ACENTER, textUI(271), 160, 175, ActiveColor, ActiveColorSmooth, 16); + tftPrint(ACENTER, textUI(270), 160, 175, ActiveColor, ActiveColorSmooth, 16); break; } if (hardwaremodel == PORTABLE_TOUCH_ILI9341) { @@ -5428,7 +5421,7 @@ void DoMenu() { break; case ITEM2: - Infoboxprint(textUI(261)); + Infoboxprint(textUI(260)); OneBigLineSprite.setTextDatum(TL_DATUM); OneBigLineSprite.setTextColor(ActiveColor, ActiveColorSmooth, false); @@ -5440,7 +5433,7 @@ void DoMenu() { break; case ITEM3: - Infoboxprint(textUI(262)); + Infoboxprint(textUI(261)); OneBigLineSprite.setTextDatum(TL_DATUM); OneBigLineSprite.setTextColor(ActiveColor, ActiveColorSmooth, false); @@ -5452,33 +5445,33 @@ void DoMenu() { break; case ITEM4: - Infoboxprint(textUI(263)); + Infoboxprint(textUI(262)); OneBigLineSprite.drawString(String(memstartpos + 1), 135, 0); OneBigLineSprite.pushSprite(24, 118); break; case ITEM5: - Infoboxprint(textUI(264)); + Infoboxprint(textUI(263)); OneBigLineSprite.drawString(String(memstoppos + 1), 135, 0); OneBigLineSprite.pushSprite(24, 118); break; case ITEM6: - Infoboxprint(textUI(265)); + Infoboxprint(textUI(264)); OneBigLineSprite.drawString((mempionly ? textUI(28) : textUI(27)), 135, 0); OneBigLineSprite.pushSprite(24, 118); break; case ITEM7: - Infoboxprint(textUI(275)); + Infoboxprint(textUI(274)); switch (memdoublepi) { case MEMPI_OFF: OneBigLineSprite.drawString(textUI(27), 135, 0); break; - case MEMPI_RANGE: OneBigLineSprite.drawString(textUI(276), 135, 0); break; - default: OneBigLineSprite.drawString(textUI(277), 135, 0); break; + case MEMPI_RANGE: OneBigLineSprite.drawString(textUI(275), 135, 0); break; + default: OneBigLineSprite.drawString(textUI(276), 135, 0); break; } OneBigLineSprite.pushSprite(24, 118); break; @@ -5491,17 +5484,17 @@ void DoMenu() { break; case ITEM9: - Infoboxprint(textUI(273)); + Infoboxprint(textUI(272)); ClearMemoryRange(memstartpos, memstoppos); - OneBigLineSprite.drawString(textUI(213), 135, 0); + OneBigLineSprite.drawString(textUI(212), 135, 0); OneBigLineSprite.pushSprite(24, 118); switch (CurrentTheme) { case 7: OneBigLineSprite.pushImage(-11, -118, 292, 170, popupbackground_wo); break; default: OneBigLineSprite.pushImage(-11, -118, 292, 170, popupbackground); break; } - OneBigLineSprite.drawString(String(memstartpos + 1) + " - " + String(memstoppos + 1) + " " + String(textUI(274)), 135, 0); + OneBigLineSprite.drawString(String(memstartpos + 1) + " - " + String(memstoppos + 1) + " " + String(textUI(273)), 135, 0); OneBigLineSprite.pushSprite(24, 148); if (hardwaremodel == PORTABLE_TOUCH_ILI9341) { tft.fillRoundRect(240, 36, 60, 40, 6, FrameColor); @@ -5585,20 +5578,17 @@ void drawButton(const char* text, byte button_number, bool active, bool selected int x = startX + col * (buttonWidth + spacingX); int y = startY + row * (buttonHeight + spacingY); - // Draw the selection outline if (selected) { - tft.drawRect(x - 2, y - 2, buttonWidth + 4, buttonHeight + 4, PrimaryColor); - tft.drawRect(x - 1, y - 1, buttonWidth + 2, buttonHeight + 2, PrimaryColor); + tft.drawRoundRect(x - 2, y - 2, buttonWidth + 4, buttonHeight + 4, 4, PrimaryColor); + tft.drawRoundRect(x - 1, y - 1, buttonWidth + 2, buttonHeight + 2, 4, PrimaryColor); } else { - tft.drawRect(x - 2, y - 2, buttonWidth + 4, buttonHeight + 4, BackgroundColor); - tft.drawRect(x - 1, y - 1, buttonWidth + 2, buttonHeight + 2, BackgroundColor); + tft.drawRoundRect(x - 2, y - 2, buttonWidth + 4, buttonHeight + 4, 4, BackgroundColor); + tft.drawRoundRect(x - 1, y - 1, buttonWidth + 2, buttonHeight + 2, 4, BackgroundColor); } - // Draw the button fill tft.pushImage(x, y, 70, 30, (CurrentTheme == 7 ? bwselector_wo : bwselector)); - // Draw the small line at the bottom (narrower, centered, and 3px up) int lineHeight = 4; // Height of the bottom line int lineWidth = (buttonWidth / 2) - 6; // Half the button width, minus 6px diff --git a/src/logbook.cpp b/src/logbook.cpp index ecc1231..e5530f4 100644 --- a/src/logbook.cpp +++ b/src/logbook.cpp @@ -41,9 +41,9 @@ void handleRoot() { html += "\"FMDX"; html += ""; - html += "

" + String(textUI(283)) + "

"; - html += ""; - html += ""; + html += "

" + String(textUI(282)) + "

"; + html += ""; + html += ""; // Sorting function with icons html += "