Add itilog.com coordinate tip to location presets info screen and README

Adds a new info paragraph to the Location Presets "?" screen (all 6
languages) recommending itilog.com for getting exact address
coordinates, since automatic IP-based geolocation can easily be off by
20-30 km - enough to hear a plane while the radar stays empty. Adds
the same tip to the README's Getting Started section, with a
clickable link.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
This commit is contained in:
Eiswolf-BG
2026-08-10 23:35:43 +02:00
parent 9bb95afa0b
commit 866744bb88
9 changed files with 27 additions and 1 deletions

View File

@@ -23,6 +23,10 @@ You can flash the firmware directly from your browser to your CYD display withou
2. Insert a FAT32-formatted microSD card into your display. 2. Insert a FAT32-formatted microSD card into your display.
3. On first boot: Calibrate the touchscreen and configure your Wi-Fi via the built-in on-screen keyboard. 3. On first boot: Calibrate the touchscreen and configure your Wi-Fi via the built-in on-screen keyboard.
**Tip:** for the best experience, set your exact location as a Location Preset (Menu → Flight Options → Location Presets) instead of relying on automatic IP-based geolocation. IP geolocation can easily be off by 20-30 km - you might hear a plane outside your window while the radar screen stays empty because the device thinks you're somewhere else entirely.
To get your exact coordinates for free, visit [itilog.com](https://www.itilog.com/), enter your address, and copy the resulting latitude/longitude into a new Location Preset. With your precise location set, the proximity LED blinks in sync with aircraft you can actually hear overhead.
--- ---
## Features ## Features

View File

@@ -221,6 +221,12 @@ enum class StringId : uint8_t {
WEATHER_INFO_TITLE, WEATHER_INFO_TITLE,
WEATHER_INFO_BODY, WEATHER_INFO_BODY,
// Zusaetzlicher Info-Absatz im Standort-Presets-Screen (Menue >
// Flugoptionen > Standort-Presets > "?") mit Tipp zu itilog.com fuer
// exakte Koordinaten - deutlich genauer als die automatische
// IP-Standortbestimmung (die leicht 20-30km danebenliegen kann).
LOCATION_INFO_PARA6,
COUNT COUNT
}; };

View File

@@ -203,6 +203,8 @@ static const char* const I18N_DE[] = {
"Wetter", "Wetter",
"Das Wetter-Icon zeigt die aktuelle Wetterlage für deinen aktiven Standort. Ist ein Standort-Preset ausgewählt, wird stattdessen dessen Wetter angezeigt.", "Das Wetter-Icon zeigt die aktuelle Wetterlage für deinen aktiven Standort. Ist ein Standort-Preset ausgewählt, wird stattdessen dessen Wetter angezeigt.",
"Tipp: Auf itilog.com (https://www.itilog.com/) kannst du kostenlos deine Adresse eingeben und bekommst sofort die exakten Koordinaten dafür. Das lohnt sich - die automatische IP-Standortbestimmung kann leicht 20-30 km danebenliegen, sodass du ein Flugzeug zwar hörst, der Radar aber leer bleibt. Mit den exakten Koordinaten als Preset eingetragen, blinkt die Näherungs-LED wirklich im Takt mit dem Flugzeug über dir.",
}; };
static_assert(sizeof(I18N_DE) / sizeof(I18N_DE[0]) == (size_t)StringId::COUNT, static_assert(sizeof(I18N_DE) / sizeof(I18N_DE[0]) == (size_t)StringId::COUNT,

View File

@@ -204,6 +204,8 @@ static const char* const I18N_EN[] = {
"Weather", "Weather",
"The weather icon shows the current weather for your active location. If a location preset is selected, its weather is shown instead.", "The weather icon shows the current weather for your active location. If a location preset is selected, its weather is shown instead.",
"Tip: at itilog.com (https://www.itilog.com/) you can enter your address for free and instantly get its exact coordinates. It's worth it - automatic IP-based location can easily be off by 20-30 km, so you might hear a plane overhead while the radar stays empty. With the exact coordinates entered as a preset, the proximity LED really does blink in sync with the aircraft above you.",
}; };
static_assert(sizeof(I18N_EN) / sizeof(I18N_EN[0]) == (size_t)StringId::COUNT, static_assert(sizeof(I18N_EN) / sizeof(I18N_EN[0]) == (size_t)StringId::COUNT,

View File

@@ -203,6 +203,8 @@ static const char* const I18N_ES[] = {
"Clima", "Clima",
"El icono del clima muestra el clima actual de tu ubicación activa. Si hay una ubicación guardada seleccionada, se muestra el clima de esa ubicación en su lugar.", "El icono del clima muestra el clima actual de tu ubicación activa. Si hay una ubicación guardada seleccionada, se muestra el clima de esa ubicación en su lugar.",
"Consejo: en itilog.com (https://www.itilog.com/) introduce tu dirección gratis y obtén al instante sus coordenadas exactas. Merece la pena - la geolocalización automática por IP puede fallar fácilmente por 20-30 km, así que podrías oír un avión mientras el radar permanece vacío. Con las coordenadas exactas guardadas como preset, el LED de proximidad realmente parpadea al ritmo del avión que tienes encima.",
}; };
static_assert(sizeof(I18N_ES) / sizeof(I18N_ES[0]) == (size_t)StringId::COUNT, static_assert(sizeof(I18N_ES) / sizeof(I18N_ES[0]) == (size_t)StringId::COUNT,

View File

@@ -203,6 +203,8 @@ static const char* const I18N_FR[] = {
"Météo", "Météo",
"L'icône météo indique la situation actuelle pour votre position active. Si une position enregistrée est sélectionnée, sa météo est affichée à la place.", "L'icône météo indique la situation actuelle pour votre position active. Si une position enregistrée est sélectionnée, sa météo est affichée à la place.",
"Astuce : sur itilog.com (https://www.itilog.com/), entrez gratuitement votre adresse pour obtenir ses coordonnées exactes. Cela en vaut la peine - la localisation automatique par IP peut facilement se tromper de 20 à 30 km, si bien que vous entendez un avion alors que le radar reste vide. Avec les coordonnées exactes enregistrées comme preset, la LED de proximité clignote vraiment en rythme avec l'avion au-dessus de vous.",
}; };
static_assert(sizeof(I18N_FR) / sizeof(I18N_FR[0]) == (size_t)StringId::COUNT, static_assert(sizeof(I18N_FR) / sizeof(I18N_FR[0]) == (size_t)StringId::COUNT,

View File

@@ -203,6 +203,8 @@ static const char* const I18N_IT[] = {
"Meteo", "Meteo",
"L'icona meteo mostra le condizioni meteo attuali per la tua posizione attiva. Se è selezionata una posizione salvata, viene mostrato invece il meteo di quella posizione.", "L'icona meteo mostra le condizioni meteo attuali per la tua posizione attiva. Se è selezionata una posizione salvata, viene mostrato invece il meteo di quella posizione.",
"Suggerimento: su itilog.com (https://www.itilog.com/) inserisci gratuitamente il tuo indirizzo per ottenere subito le coordinate esatte. Ne vale la pena - la geolocalizzazione IP automatica può sbagliare facilmente di 20-30 km, quindi potresti sentire un aereo mentre il radar resta vuoto. Con le coordinate esatte inserite come preset, il LED di prossimità lampeggia davvero al ritmo dell'aereo sopra di te.",
}; };
static_assert(sizeof(I18N_IT) / sizeof(I18N_IT[0]) == (size_t)StringId::COUNT, static_assert(sizeof(I18N_IT) / sizeof(I18N_IT[0]) == (size_t)StringId::COUNT,

View File

@@ -203,6 +203,8 @@ static const char* const I18N_TR[] = {
"Hava Durumu", "Hava Durumu",
"Hava durumu simgesi, aktif konumunuz için güncel hava durumunu gösterir. Bir konum ön ayarı seçiliyse, bunun yerine o ön ayarın hava durumu gösterilir.", "Hava durumu simgesi, aktif konumunuz için güncel hava durumunu gösterir. Bir konum ön ayarı seçiliyse, bunun yerine o ön ayarın hava durumu gösterilir.",
"İpucu: itilog.com (https://www.itilog.com/) adresinden adresinizi ücretsiz girerek anında tam koordinatlarınızı alabilirsiniz. Buna değer - otomatik IP tabanlı konum belirleme kolayca 20-30 km sapabilir, böylece üstünüzden geçen bir uçağı duyarken radar boş kalabilir. Tam koordinatlar bir ön ayar olarak girildiğinde, yakınlık LED'i gerçekten üstünüzdeki uçakla aynı ritimde yanıp söner.",
}; };
static_assert(sizeof(I18N_TR) / sizeof(I18N_TR[0]) == (size_t)StringId::COUNT, static_assert(sizeof(I18N_TR) / sizeof(I18N_TR[0]) == (size_t)StringId::COUNT,

View File

@@ -406,6 +406,8 @@ namespace {
totalH = layoutWrapped(tft, 10, totalH, textMaxWidth, LINE_H, I18n::t(StringId::LOCATION_INFO_PARA4), 0, 0, 0, false); totalH = layoutWrapped(tft, 10, totalH, textMaxWidth, LINE_H, I18n::t(StringId::LOCATION_INFO_PARA4), 0, 0, 0, false);
totalH += 8; totalH += 8;
totalH = layoutWrapped(tft, 10, totalH, textMaxWidth, LINE_H, I18n::t(StringId::LOCATION_INFO_PARA5), 0, 0, 0, false); totalH = layoutWrapped(tft, 10, totalH, textMaxWidth, LINE_H, I18n::t(StringId::LOCATION_INFO_PARA5), 0, 0, 0, false);
totalH += 8;
totalH = layoutWrapped(tft, 10, totalH, textMaxWidth, LINE_H, I18n::t(StringId::LOCATION_INFO_PARA6), 0, 0, 0, false);
int16_t maxScroll = totalH - VIEW_BOTTOM; int16_t maxScroll = totalH - VIEW_BOTTOM;
if (maxScroll < 0) maxScroll = 0; if (maxScroll < 0) maxScroll = 0;
@@ -435,7 +437,9 @@ namespace {
y += 8; y += 8;
y = layoutWrapped(tft, 10, y, textMaxWidth, LINE_H, I18n::t(StringId::LOCATION_INFO_PARA4), scrollY, VIEW_TOP, VIEW_BOTTOM, true); y = layoutWrapped(tft, 10, y, textMaxWidth, LINE_H, I18n::t(StringId::LOCATION_INFO_PARA4), scrollY, VIEW_TOP, VIEW_BOTTOM, true);
y += 8; y += 8;
layoutWrapped(tft, 10, y, textMaxWidth, LINE_H, I18n::t(StringId::LOCATION_INFO_PARA5), scrollY, VIEW_TOP, VIEW_BOTTOM, true); y = layoutWrapped(tft, 10, y, textMaxWidth, LINE_H, I18n::t(StringId::LOCATION_INFO_PARA5), scrollY, VIEW_TOP, VIEW_BOTTOM, true);
y += 8;
layoutWrapped(tft, 10, y, textMaxWidth, LINE_H, I18n::t(StringId::LOCATION_INFO_PARA6), scrollY, VIEW_TOP, VIEW_BOTTOM, true);
drawButton(tft, backBtn, I18n::t(StringId::BACK)); drawButton(tft, backBtn, I18n::t(StringId::BACK));
if (scrollable) { if (scrollable) {