v2.3: Twinkling star animation extended to all menus and splash screen, WiFi submenu removed
This commit is contained in:
@@ -1,6 +1,7 @@
|
|||||||
#include "airline_filter_screen.h"
|
#include "airline_filter_screen.h"
|
||||||
#include "airline_filter.h"
|
#include "airline_filter.h"
|
||||||
#include "touch_input.h"
|
#include "touch_input.h"
|
||||||
|
#include "menu_stars.h"
|
||||||
#include "config.h"
|
#include "config.h"
|
||||||
#include "i18n.h"
|
#include "i18n.h"
|
||||||
|
|
||||||
@@ -25,6 +26,7 @@ namespace {
|
|||||||
}
|
}
|
||||||
|
|
||||||
String runLetterKeypad(TFT_eSPI& tft) {
|
String runLetterKeypad(TFT_eSPI& tft) {
|
||||||
|
MenuStars::reset();
|
||||||
constexpr const char* ROW1 = "QWERTYUIOP";
|
constexpr const char* ROW1 = "QWERTYUIOP";
|
||||||
constexpr const char* ROW2 = "ASDFGHJKL";
|
constexpr const char* ROW2 = "ASDFGHJKL";
|
||||||
constexpr const char* ROW3 = "ZXCVBNM";
|
constexpr const char* ROW3 = "ZXCVBNM";
|
||||||
@@ -85,7 +87,7 @@ namespace {
|
|||||||
|
|
||||||
while (!done) {
|
while (!done) {
|
||||||
TouchInput::Point tap;
|
TouchInput::Point tap;
|
||||||
if (!TouchInput::wasTapped(tap)) { delay(20); continue; }
|
if (!TouchInput::wasTapped(tap)) { MenuStars::update(tft); delay(20); continue; }
|
||||||
|
|
||||||
bool handled = false;
|
bool handled = false;
|
||||||
for (uint8_t i = 0; i < 10 && !handled; i++) {
|
for (uint8_t i = 0; i < 10 && !handled; i++) {
|
||||||
@@ -125,6 +127,7 @@ void run(TFT_eSPI& tft) {
|
|||||||
constexpr int16_t REMOVE_BTN_W = 60;
|
constexpr int16_t REMOVE_BTN_W = 60;
|
||||||
|
|
||||||
bool done = false;
|
bool done = false;
|
||||||
|
MenuStars::reset();
|
||||||
while (!done) {
|
while (!done) {
|
||||||
tft.fillScreen(TFT_BLACK);
|
tft.fillScreen(TFT_BLACK);
|
||||||
tft.setTextColor(TFT_GREEN, TFT_BLACK);
|
tft.setTextColor(TFT_GREEN, TFT_BLACK);
|
||||||
@@ -172,6 +175,7 @@ void run(TFT_eSPI& tft) {
|
|||||||
TouchInput::Point tap;
|
TouchInput::Point tap;
|
||||||
while (true) {
|
while (true) {
|
||||||
if (TouchInput::wasTapped(tap)) break;
|
if (TouchInput::wasTapped(tap)) break;
|
||||||
|
MenuStars::update(tft);
|
||||||
delay(20);
|
delay(20);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -1,5 +1,6 @@
|
|||||||
#include "calibration_screen.h"
|
#include "calibration_screen.h"
|
||||||
#include "touch_input.h"
|
#include "touch_input.h"
|
||||||
|
#include "menu_stars.h"
|
||||||
#include "config.h"
|
#include "config.h"
|
||||||
#include "i18n.h"
|
#include "i18n.h"
|
||||||
|
|
||||||
@@ -21,10 +22,11 @@ namespace {
|
|||||||
tft.fillCircle(x, y, 3, TFT_WHITE);
|
tft.fillCircle(x, y, 3, TFT_WHITE);
|
||||||
}
|
}
|
||||||
|
|
||||||
RawAvg waitForTap() {
|
RawAvg waitForTap(TFT_eSPI& tft) {
|
||||||
RawAvg avg;
|
RawAvg avg;
|
||||||
|
|
||||||
while (!TouchInput::rawPoint().touched) {
|
while (!TouchInput::rawPoint().touched) {
|
||||||
|
MenuStars::update(tft);
|
||||||
delay(10);
|
delay(10);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -73,7 +75,8 @@ void run(TFT_eSPI& tft) {
|
|||||||
tft.setTextDatum(TL_DATUM);
|
tft.setTextDatum(TL_DATUM);
|
||||||
|
|
||||||
drawTarget(tft, targets[i].x, targets[i].y);
|
drawTarget(tft, targets[i].x, targets[i].y);
|
||||||
samples[i] = waitForTap();
|
MenuStars::reset();
|
||||||
|
samples[i] = waitForTap(tft);
|
||||||
}
|
}
|
||||||
|
|
||||||
int16_t xmin = (samples[0].avgX() + samples[3].avgX()) / 2;
|
int16_t xmin = (samples[0].avgX() + samples[3].avgX()) / 2;
|
||||||
|
|||||||
@@ -1,6 +1,7 @@
|
|||||||
#include "first_run_language_screen.h"
|
#include "first_run_language_screen.h"
|
||||||
#include "settings_store.h"
|
#include "settings_store.h"
|
||||||
#include "touch_input.h"
|
#include "touch_input.h"
|
||||||
|
#include "menu_stars.h"
|
||||||
#include "i18n.h"
|
#include "i18n.h"
|
||||||
#include "config.h"
|
#include "config.h"
|
||||||
|
|
||||||
@@ -45,9 +46,10 @@ void run(TFT_eSPI& tft) {
|
|||||||
drawButton(tft, langRects[i], I18n::languageName(i));
|
drawButton(tft, langRects[i], I18n::languageName(i));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
MenuStars::reset();
|
||||||
while (true) {
|
while (true) {
|
||||||
TouchInput::Point tap;
|
TouchInput::Point tap;
|
||||||
if (!TouchInput::wasTapped(tap)) { delay(20); continue; }
|
if (!TouchInput::wasTapped(tap)) { MenuStars::update(tft); delay(20); continue; }
|
||||||
|
|
||||||
for (uint8_t i = 0; i < I18n::LANG_COUNT; i++) {
|
for (uint8_t i = 0; i < I18n::LANG_COUNT; i++) {
|
||||||
if (langRects[i].contains(tap.x, tap.y)) {
|
if (langRects[i].contains(tap.x, tap.y)) {
|
||||||
|
|||||||
@@ -1,6 +1,7 @@
|
|||||||
#include "language_screen.h"
|
#include "language_screen.h"
|
||||||
#include "settings_store.h"
|
#include "settings_store.h"
|
||||||
#include "touch_input.h"
|
#include "touch_input.h"
|
||||||
|
#include "menu_stars.h"
|
||||||
#include "i18n.h"
|
#include "i18n.h"
|
||||||
#include "config.h"
|
#include "config.h"
|
||||||
|
|
||||||
@@ -37,6 +38,7 @@ namespace {
|
|||||||
|
|
||||||
void run(TFT_eSPI& tft) {
|
void run(TFT_eSPI& tft) {
|
||||||
bool done = false;
|
bool done = false;
|
||||||
|
MenuStars::reset();
|
||||||
while (!done) {
|
while (!done) {
|
||||||
tft.fillScreen(TFT_BLACK);
|
tft.fillScreen(TFT_BLACK);
|
||||||
tft.setTextColor(TFT_GREEN, TFT_BLACK);
|
tft.setTextColor(TFT_GREEN, TFT_BLACK);
|
||||||
@@ -57,6 +59,7 @@ void run(TFT_eSPI& tft) {
|
|||||||
TouchInput::Point tap;
|
TouchInput::Point tap;
|
||||||
while (true) {
|
while (true) {
|
||||||
if (TouchInput::wasTapped(tap)) break;
|
if (TouchInput::wasTapped(tap)) break;
|
||||||
|
MenuStars::update(tft);
|
||||||
delay(20);
|
delay(20);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -1,6 +1,7 @@
|
|||||||
#include "location_presets_screen.h"
|
#include "location_presets_screen.h"
|
||||||
#include "location_presets.h"
|
#include "location_presets.h"
|
||||||
#include "touch_input.h"
|
#include "touch_input.h"
|
||||||
|
#include "menu_stars.h"
|
||||||
#include "config.h"
|
#include "config.h"
|
||||||
#include "i18n.h"
|
#include "i18n.h"
|
||||||
|
|
||||||
@@ -28,6 +29,7 @@ namespace {
|
|||||||
}
|
}
|
||||||
|
|
||||||
String runNumericKeypad(TFT_eSPI& tft, const String& title) {
|
String runNumericKeypad(TFT_eSPI& tft, const String& title) {
|
||||||
|
MenuStars::reset();
|
||||||
char buf[16] = {0};
|
char buf[16] = {0};
|
||||||
uint8_t len = 0;
|
uint8_t len = 0;
|
||||||
|
|
||||||
@@ -79,7 +81,7 @@ namespace {
|
|||||||
|
|
||||||
while (!done) {
|
while (!done) {
|
||||||
TouchInput::Point tap;
|
TouchInput::Point tap;
|
||||||
if (!TouchInput::wasTapped(tap)) { delay(20); continue; }
|
if (!TouchInput::wasTapped(tap)) { MenuStars::update(tft); delay(20); continue; }
|
||||||
|
|
||||||
bool handled = false;
|
bool handled = false;
|
||||||
for (uint8_t i = 0; i < 12 && !handled; i++) {
|
for (uint8_t i = 0; i < 12 && !handled; i++) {
|
||||||
@@ -131,6 +133,7 @@ void run(TFT_eSPI& tft) {
|
|||||||
constexpr int16_t REMOVE_BTN_W = 60;
|
constexpr int16_t REMOVE_BTN_W = 60;
|
||||||
|
|
||||||
bool done = false;
|
bool done = false;
|
||||||
|
MenuStars::reset();
|
||||||
while (!done) {
|
while (!done) {
|
||||||
tft.fillScreen(TFT_BLACK);
|
tft.fillScreen(TFT_BLACK);
|
||||||
tft.setTextColor(TFT_GREEN, TFT_BLACK);
|
tft.setTextColor(TFT_GREEN, TFT_BLACK);
|
||||||
@@ -188,6 +191,7 @@ void run(TFT_eSPI& tft) {
|
|||||||
TouchInput::Point tap;
|
TouchInput::Point tap;
|
||||||
while (true) {
|
while (true) {
|
||||||
if (TouchInput::wasTapped(tap)) break;
|
if (TouchInput::wasTapped(tap)) break;
|
||||||
|
MenuStars::update(tft);
|
||||||
delay(20);
|
delay(20);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -1,6 +1,7 @@
|
|||||||
#include "logbook_files_screen.h"
|
#include "logbook_files_screen.h"
|
||||||
#include "flight_logbook.h"
|
#include "flight_logbook.h"
|
||||||
#include "touch_input.h"
|
#include "touch_input.h"
|
||||||
|
#include "menu_stars.h"
|
||||||
#include "config.h"
|
#include "config.h"
|
||||||
#include "i18n.h"
|
#include "i18n.h"
|
||||||
|
|
||||||
@@ -74,6 +75,7 @@ void run(TFT_eSPI& tft) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
drawButton(tft, backBtn, I18n::t(StringId::BACK));
|
drawButton(tft, backBtn, I18n::t(StringId::BACK));
|
||||||
|
MenuStars::reset();
|
||||||
|
|
||||||
bool done = false;
|
bool done = false;
|
||||||
while (!done) {
|
while (!done) {
|
||||||
@@ -81,6 +83,7 @@ void run(TFT_eSPI& tft) {
|
|||||||
if (TouchInput::wasTapped(tap) && backBtn.contains(tap.x, tap.y)) {
|
if (TouchInput::wasTapped(tap) && backBtn.contains(tap.x, tap.y)) {
|
||||||
done = true;
|
done = true;
|
||||||
}
|
}
|
||||||
|
MenuStars::update(tft);
|
||||||
delay(20);
|
delay(20);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -29,6 +29,7 @@
|
|||||||
#include "screenshot.h"
|
#include "screenshot.h"
|
||||||
#include "i18n.h"
|
#include "i18n.h"
|
||||||
#include "first_run_language_screen.h"
|
#include "first_run_language_screen.h"
|
||||||
|
#include "menu_stars.h"
|
||||||
#include "ui_font.h"
|
#include "ui_font.h"
|
||||||
|
|
||||||
TFT_eSPI tft = TFT_eSPI();
|
TFT_eSPI tft = TFT_eSPI();
|
||||||
@@ -256,6 +257,7 @@ void setup() {
|
|||||||
uint32_t waitStart = millis();
|
uint32_t waitStart = millis();
|
||||||
while (WifiMgr::getState() == WifiMgr::State::Connecting && millis() - waitStart < 16000) {
|
while (WifiMgr::getState() == WifiMgr::State::Connecting && millis() - waitStart < 16000) {
|
||||||
WifiMgr::update();
|
WifiMgr::update();
|
||||||
|
MenuStars::update(tft);
|
||||||
delay(100);
|
delay(100);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -280,6 +282,7 @@ void setup() {
|
|||||||
while (LocationManager::currentSource() == LocationManager::Source::None &&
|
while (LocationManager::currentSource() == LocationManager::Source::None &&
|
||||||
millis() - locStart < 8000) {
|
millis() - locStart < 8000) {
|
||||||
LocationManager::requestIpLookupIfNeeded();
|
LocationManager::requestIpLookupIfNeeded();
|
||||||
|
MenuStars::update(tft);
|
||||||
delay(200);
|
delay(200);
|
||||||
}
|
}
|
||||||
SplashScreen::setStatusLine(tft, 2, I18n::t(StringId::SPLASH_READY));
|
SplashScreen::setStatusLine(tft, 2, I18n::t(StringId::SPLASH_READY));
|
||||||
@@ -294,7 +297,7 @@ void setup() {
|
|||||||
|
|
||||||
NetTask::begin();
|
NetTask::begin();
|
||||||
|
|
||||||
SplashScreen::waitRemaining();
|
SplashScreen::waitRemaining(tft);
|
||||||
|
|
||||||
drawHeader();
|
drawHeader();
|
||||||
updateStatusLine();
|
updateStatusLine();
|
||||||
|
|||||||
@@ -10,6 +10,7 @@
|
|||||||
#include "units_screen.h"
|
#include "units_screen.h"
|
||||||
#include "settings_backup.h"
|
#include "settings_backup.h"
|
||||||
#include "settings_store.h"
|
#include "settings_store.h"
|
||||||
|
#include "menu_stars.h"
|
||||||
#include "i18n.h"
|
#include "i18n.h"
|
||||||
#include "config.h"
|
#include "config.h"
|
||||||
|
|
||||||
@@ -77,6 +78,7 @@ namespace {
|
|||||||
void run(TFT_eSPI& tft) {
|
void run(TFT_eSPI& tft) {
|
||||||
Page page = Page::Main;
|
Page page = Page::Main;
|
||||||
bool done = false;
|
bool done = false;
|
||||||
|
MenuStars::reset();
|
||||||
|
|
||||||
while (!done) {
|
while (!done) {
|
||||||
tft.fillScreen(TFT_BLACK);
|
tft.fillScreen(TFT_BLACK);
|
||||||
@@ -101,6 +103,7 @@ void run(TFT_eSPI& tft) {
|
|||||||
TouchInput::Point tap;
|
TouchInput::Point tap;
|
||||||
while (true) {
|
while (true) {
|
||||||
if (TouchInput::wasTapped(tap)) break;
|
if (TouchInput::wasTapped(tap)) break;
|
||||||
|
MenuStars::update(tft);
|
||||||
delay(20);
|
delay(20);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -132,6 +135,7 @@ void run(TFT_eSPI& tft) {
|
|||||||
TouchInput::Point tap;
|
TouchInput::Point tap;
|
||||||
while (true) {
|
while (true) {
|
||||||
if (TouchInput::wasTapped(tap)) break;
|
if (TouchInput::wasTapped(tap)) break;
|
||||||
|
MenuStars::update(tft);
|
||||||
delay(20);
|
delay(20);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -170,6 +174,7 @@ void run(TFT_eSPI& tft) {
|
|||||||
TouchInput::Point tap;
|
TouchInput::Point tap;
|
||||||
while (true) {
|
while (true) {
|
||||||
if (TouchInput::wasTapped(tap)) break;
|
if (TouchInput::wasTapped(tap)) break;
|
||||||
|
MenuStars::update(tft);
|
||||||
delay(20);
|
delay(20);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -227,6 +232,7 @@ void run(TFT_eSPI& tft) {
|
|||||||
TouchInput::Point tap;
|
TouchInput::Point tap;
|
||||||
while (true) {
|
while (true) {
|
||||||
if (TouchInput::wasTapped(tap)) break;
|
if (TouchInput::wasTapped(tap)) break;
|
||||||
|
MenuStars::update(tft);
|
||||||
delay(20);
|
delay(20);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
52
src/menu_stars.cpp
Normal file
52
src/menu_stars.cpp
Normal file
@@ -0,0 +1,52 @@
|
|||||||
|
#include "menu_stars.h"
|
||||||
|
#include "config.h"
|
||||||
|
|
||||||
|
namespace MenuStars {
|
||||||
|
|
||||||
|
namespace {
|
||||||
|
constexpr uint8_t STAR_COUNT = 34;
|
||||||
|
struct Star {
|
||||||
|
int16_t x, y;
|
||||||
|
uint8_t phase;
|
||||||
|
uint8_t speed;
|
||||||
|
};
|
||||||
|
Star stars[STAR_COUNT];
|
||||||
|
bool initialized = false;
|
||||||
|
|
||||||
|
uint32_t lastUpdateMs = 0;
|
||||||
|
constexpr uint32_t UPDATE_INTERVAL_MS = 60;
|
||||||
|
|
||||||
|
void initStars() {
|
||||||
|
randomSeed((uint32_t)esp_random());
|
||||||
|
for (uint8_t i = 0; i < STAR_COUNT; i++) {
|
||||||
|
stars[i].x = (int16_t)random(4, Config::SCREEN_WIDTH - 4);
|
||||||
|
stars[i].y = (int16_t)random(4, Config::SCREEN_HEIGHT - 4);
|
||||||
|
stars[i].phase = (uint8_t)random(0, 256);
|
||||||
|
stars[i].speed = (uint8_t)(1 + random(0, 3));
|
||||||
|
}
|
||||||
|
initialized = true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void reset() {
|
||||||
|
initialized = false;
|
||||||
|
}
|
||||||
|
|
||||||
|
void update(TFT_eSPI& tft) {
|
||||||
|
if (!initialized) initStars();
|
||||||
|
|
||||||
|
uint32_t now = millis();
|
||||||
|
if (now - lastUpdateMs < UPDATE_INTERVAL_MS) return;
|
||||||
|
lastUpdateMs = now;
|
||||||
|
|
||||||
|
for (uint8_t i = 0; i < STAR_COUNT; i++) {
|
||||||
|
stars[i].phase += stars[i].speed;
|
||||||
|
uint8_t bright = (stars[i].phase < 128)
|
||||||
|
? (uint8_t)(stars[i].phase * 2)
|
||||||
|
: (uint8_t)((255 - stars[i].phase) * 2);
|
||||||
|
uint16_t color = tft.color565(0, bright, 0);
|
||||||
|
tft.drawPixel(stars[i].x, stars[i].y, color);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
17
src/menu_stars.h
Normal file
17
src/menu_stars.h
Normal file
@@ -0,0 +1,17 @@
|
|||||||
|
#pragma once
|
||||||
|
#include <TFT_eSPI.h>
|
||||||
|
|
||||||
|
// Gemeinsames Sterne-Twinkle-Modul fuer ALLE Menue-/Untermenue-Bildschirme
|
||||||
|
// (schwarzer Hintergrund) sowie den Splash-Screen - dieselbe Optik wie im
|
||||||
|
// Flugzeug-Detail-Panel des Radars.
|
||||||
|
namespace MenuStars {
|
||||||
|
// Verteilt die Sterne neu ueber den ganzen Bildschirm - einmal beim
|
||||||
|
// Betreten eines neuen Screens aufrufen (NICHT bei jedem Redraw
|
||||||
|
// innerhalb desselben Screens, sonst "springt" die Animation staendig).
|
||||||
|
void reset();
|
||||||
|
|
||||||
|
// In der Warte-/Idle-Schleife eines Screens aufrufen (bei jedem
|
||||||
|
// Schleifendurchlauf ist ok - die Funktion drosselt sich intern selbst
|
||||||
|
// auf ca. alle 60ms, um das Display nicht unnoetig oft anzusprechen).
|
||||||
|
void update(TFT_eSPI& tft);
|
||||||
|
}
|
||||||
@@ -1,4 +1,5 @@
|
|||||||
#include "splash_screen.h"
|
#include "splash_screen.h"
|
||||||
|
#include "menu_stars.h"
|
||||||
|
|
||||||
namespace SplashScreen {
|
namespace SplashScreen {
|
||||||
|
|
||||||
@@ -10,7 +11,6 @@ namespace {
|
|||||||
constexpr int16_t STATUS_START_Y = 260;
|
constexpr int16_t STATUS_START_Y = 260;
|
||||||
constexpr uint8_t MAX_STATUS_LINES = 3;
|
constexpr uint8_t MAX_STATUS_LINES = 3;
|
||||||
|
|
||||||
// Dezente konzentrische Ringe + Fadenkreuz als "Zielfernrohr"-Hintergrund
|
|
||||||
void drawRadarReticle(TFT_eSPI& tft, int16_t cx, int16_t cy) {
|
void drawRadarReticle(TFT_eSPI& tft, int16_t cx, int16_t cy) {
|
||||||
uint16_t dim = 0x0320;
|
uint16_t dim = 0x0320;
|
||||||
tft.drawCircle(cx, cy, 80, dim);
|
tft.drawCircle(cx, cy, 80, dim);
|
||||||
@@ -20,14 +20,12 @@ namespace {
|
|||||||
tft.drawFastVLine(cx, cy - 80, 160, dim);
|
tft.drawFastVLine(cx, cy - 80, 160, dim);
|
||||||
}
|
}
|
||||||
|
|
||||||
// Echte kleine Jet-Silhouette für den Hintergrund
|
|
||||||
void drawMiniJet(TFT_eSPI& tft, int16_t x, int16_t y, uint16_t color) {
|
void drawMiniJet(TFT_eSPI& tft, int16_t x, int16_t y, uint16_t color) {
|
||||||
tft.drawLine(x, y - 10, x, y + 12, color);
|
tft.drawLine(x, y - 10, x, y + 12, color);
|
||||||
tft.drawLine(x - 12, y + 2, x + 12, y + 2, color);
|
tft.drawLine(x - 12, y + 2, x + 12, y + 2, color);
|
||||||
tft.drawLine(x - 5, y + 10, x + 5, y + 10, color);
|
tft.drawLine(x - 5, y + 10, x + 5, y + 10, color);
|
||||||
}
|
}
|
||||||
|
|
||||||
// Echte kleine Helikopter-Silhouette für den Hintergrund
|
|
||||||
void drawMiniHeli(TFT_eSPI& tft, int16_t x, int16_t y, uint16_t color) {
|
void drawMiniHeli(TFT_eSPI& tft, int16_t x, int16_t y, uint16_t color) {
|
||||||
tft.drawLine(x - 8, y - 6, x + 8, y - 6, color);
|
tft.drawLine(x - 8, y - 6, x + 8, y - 6, color);
|
||||||
tft.drawLine(x, y - 6, x, y + 4, color);
|
tft.drawLine(x, y - 6, x, y + 4, color);
|
||||||
@@ -35,41 +33,33 @@ namespace {
|
|||||||
tft.drawLine(x - 4, y + 7, x + 4, y + 7, color);
|
tft.drawLine(x - 4, y + 7, x + 4, y + 7, color);
|
||||||
}
|
}
|
||||||
|
|
||||||
// Haupt-Flugzeug in der Mitte (Unverändert)
|
|
||||||
void drawAirplane(TFT_eSPI& tft, int16_t cx) {
|
void drawAirplane(TFT_eSPI& tft, int16_t cx) {
|
||||||
uint16_t color = TFT_GREEN;
|
uint16_t color = TFT_GREEN;
|
||||||
|
|
||||||
// Rumpf (nur Umriss)
|
|
||||||
tft.drawTriangle(cx + 15, 142, cx - 15, 200, cx - 10, 202, color);
|
tft.drawTriangle(cx + 15, 142, cx - 15, 200, cx - 10, 202, color);
|
||||||
|
|
||||||
// Deltafluegel (nur Umriss)
|
|
||||||
tft.drawTriangle(cx + 5, 164, cx - 47, 175, cx - 3, 179, color);
|
tft.drawTriangle(cx + 5, 164, cx - 47, 175, cx - 3, 179, color);
|
||||||
tft.drawTriangle(cx + 5, 164, cx + 30, 211, cx - 3, 179, color);
|
tft.drawTriangle(cx + 5, 164, cx + 30, 211, cx - 3, 179, color);
|
||||||
|
|
||||||
// Leitwerk (nur Umriss)
|
|
||||||
tft.drawTriangle(cx - 11, 198, cx - 23, 201, cx - 6, 210, color);
|
tft.drawTriangle(cx - 11, 198, cx - 23, 201, cx - 6, 210, color);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void begin(TFT_eSPI& tft) {
|
void begin(TFT_eSPI& tft) {
|
||||||
startMs = millis();
|
startMs = millis();
|
||||||
|
MenuStars::reset();
|
||||||
|
|
||||||
int16_t cx = tft.width() / 2;
|
int16_t cx = tft.width() / 2;
|
||||||
|
|
||||||
tft.fillScreen(TFT_BLACK);
|
tft.fillScreen(TFT_BLACK);
|
||||||
drawRadarReticle(tft, cx, 174);
|
drawRadarReticle(tft, cx, 174);
|
||||||
|
|
||||||
// Hintergrund-Flugzeuge & Helikopter dezent im Hintergrund - gleicher
|
|
||||||
// gedaempfter Gruenton wie die Radar-Ringe (0x0320), NICHT das volle
|
|
||||||
// TFT_GREEN (das war vorher gleich hell wie das zentrale Flugzeug und
|
|
||||||
// wirkte dadurch nicht wie ein dezenter Hintergrund).
|
|
||||||
uint16_t dimGreen = 0x0320;
|
uint16_t dimGreen = 0x0320;
|
||||||
drawMiniJet(tft, cx - 45, 135, dimGreen);
|
drawMiniJet(tft, cx - 45, 135, dimGreen);
|
||||||
drawMiniJet(tft, cx + 50, 160, dimGreen);
|
drawMiniJet(tft, cx + 50, 160, dimGreen);
|
||||||
drawMiniHeli(tft, cx - 35, 215, dimGreen);
|
drawMiniHeli(tft, cx - 35, 215, dimGreen);
|
||||||
drawMiniHeli(tft, cx + 45, 115, dimGreen);
|
drawMiniHeli(tft, cx + 45, 115, dimGreen);
|
||||||
|
|
||||||
// Zentrales Flugzeug (unverändert im Vordergrund)
|
|
||||||
drawAirplane(tft, cx);
|
drawAirplane(tft, cx);
|
||||||
|
|
||||||
tft.setTextDatum(MC_DATUM);
|
tft.setTextDatum(MC_DATUM);
|
||||||
@@ -97,10 +87,12 @@ void setStatusLine(TFT_eSPI& tft, uint8_t slot, const String& text, uint16_t col
|
|||||||
tft.setTextDatum(TL_DATUM);
|
tft.setTextDatum(TL_DATUM);
|
||||||
}
|
}
|
||||||
|
|
||||||
void waitRemaining() {
|
void waitRemaining(TFT_eSPI& tft) {
|
||||||
uint32_t elapsed = millis() - startMs;
|
uint32_t elapsed = millis() - startMs;
|
||||||
if (elapsed < MIN_DISPLAY_MS) {
|
while (elapsed < MIN_DISPLAY_MS) {
|
||||||
delay(MIN_DISPLAY_MS - elapsed);
|
MenuStars::update(tft);
|
||||||
|
delay(20);
|
||||||
|
elapsed = millis() - startMs;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -4,6 +4,11 @@
|
|||||||
|
|
||||||
namespace SplashScreen {
|
namespace SplashScreen {
|
||||||
void begin(TFT_eSPI& tft);
|
void begin(TFT_eSPI& tft);
|
||||||
|
|
||||||
void setStatusLine(TFT_eSPI& tft, uint8_t slot, const String& text, uint16_t color = TFT_WHITE);
|
void setStatusLine(TFT_eSPI& tft, uint8_t slot, const String& text, uint16_t color = TFT_WHITE);
|
||||||
void waitRemaining();
|
|
||||||
|
// Blockiert, bis seit begin() mindestens MIN_DISPLAY_MS vergangen sind.
|
||||||
|
// Direkt vor dem Verlassen des Splash-Screens aufrufen. Zeichnet waehrend
|
||||||
|
// des Wartens dieselbe Sterne-Animation wie die Menues.
|
||||||
|
void waitRemaining(TFT_eSPI& tft);
|
||||||
}
|
}
|
||||||
@@ -1,6 +1,7 @@
|
|||||||
#include "stats_screen.h"
|
#include "stats_screen.h"
|
||||||
#include "flight_logbook.h"
|
#include "flight_logbook.h"
|
||||||
#include "touch_input.h"
|
#include "touch_input.h"
|
||||||
|
#include "menu_stars.h"
|
||||||
#include "config.h"
|
#include "config.h"
|
||||||
#include "i18n.h"
|
#include "i18n.h"
|
||||||
|
|
||||||
@@ -24,12 +25,6 @@ namespace {
|
|||||||
tft.setTextDatum(TL_DATUM);
|
tft.setTextDatum(TL_DATUM);
|
||||||
}
|
}
|
||||||
|
|
||||||
// Label (gedaempftes Gruen) direkt ueber dem Wert (helles Gruen) - BEIDE
|
|
||||||
// in derselben Schriftgroesse (Size 1). Bewusst KEINE gemischten
|
|
||||||
// Groessen mehr in einer Zeile: das Zusammenspiel aus Grundlinien-
|
|
||||||
// Verankerung + Size-2-Skalierung unseres Fonts fuehrte trotz
|
|
||||||
// rechnerisch korrektem Abstand zu sichtbaren Ueberschneidungen. Mit
|
|
||||||
// einheitlicher Groesse ist der noetige Abstand simpel und zuverlaessig.
|
|
||||||
void drawStatRow(TFT_eSPI& tft, int16_t labelY, const String& label, const String& value) {
|
void drawStatRow(TFT_eSPI& tft, int16_t labelY, const String& label, const String& value) {
|
||||||
tft.setTextColor(TFT_DARKGREEN, TFT_BLACK);
|
tft.setTextColor(TFT_DARKGREEN, TFT_BLACK);
|
||||||
tft.setCursor(10, labelY);
|
tft.setCursor(10, labelY);
|
||||||
@@ -108,6 +103,7 @@ void run(TFT_eSPI& tft) {
|
|||||||
};
|
};
|
||||||
|
|
||||||
redraw();
|
redraw();
|
||||||
|
MenuStars::reset();
|
||||||
|
|
||||||
bool done = false;
|
bool done = false;
|
||||||
while (!done) {
|
while (!done) {
|
||||||
@@ -136,6 +132,7 @@ void run(TFT_eSPI& tft) {
|
|||||||
done = true;
|
done = true;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
MenuStars::update(tft);
|
||||||
delay(20);
|
delay(20);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,6 +1,7 @@
|
|||||||
#include "units_screen.h"
|
#include "units_screen.h"
|
||||||
#include "settings_store.h"
|
#include "settings_store.h"
|
||||||
#include "touch_input.h"
|
#include "touch_input.h"
|
||||||
|
#include "menu_stars.h"
|
||||||
#include "i18n.h"
|
#include "i18n.h"
|
||||||
#include "config.h"
|
#include "config.h"
|
||||||
|
|
||||||
@@ -40,6 +41,7 @@ void run(TFT_eSPI& tft) {
|
|||||||
StringId labels[MODE_COUNT] = {StringId::UNITS_AUTO, StringId::UNITS_METRIC, StringId::UNITS_IMPERIAL};
|
StringId labels[MODE_COUNT] = {StringId::UNITS_AUTO, StringId::UNITS_METRIC, StringId::UNITS_IMPERIAL};
|
||||||
|
|
||||||
bool done = false;
|
bool done = false;
|
||||||
|
MenuStars::reset();
|
||||||
while (!done) {
|
while (!done) {
|
||||||
tft.fillScreen(TFT_BLACK);
|
tft.fillScreen(TFT_BLACK);
|
||||||
tft.setTextColor(TFT_GREEN, TFT_BLACK);
|
tft.setTextColor(TFT_GREEN, TFT_BLACK);
|
||||||
@@ -60,6 +62,7 @@ void run(TFT_eSPI& tft) {
|
|||||||
TouchInput::Point tap;
|
TouchInput::Point tap;
|
||||||
while (true) {
|
while (true) {
|
||||||
if (TouchInput::wasTapped(tap)) break;
|
if (TouchInput::wasTapped(tap)) break;
|
||||||
|
MenuStars::update(tft);
|
||||||
delay(20);
|
delay(20);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -2,6 +2,7 @@
|
|||||||
#include "wifi_manager.h"
|
#include "wifi_manager.h"
|
||||||
#include "wifi_setup_screen.h"
|
#include "wifi_setup_screen.h"
|
||||||
#include "touch_input.h"
|
#include "touch_input.h"
|
||||||
|
#include "menu_stars.h"
|
||||||
#include "config.h"
|
#include "config.h"
|
||||||
#include "i18n.h"
|
#include "i18n.h"
|
||||||
|
|
||||||
@@ -32,6 +33,7 @@ void run(TFT_eSPI& tft) {
|
|||||||
constexpr int16_t REMOVE_BTN_W = 60;
|
constexpr int16_t REMOVE_BTN_W = 60;
|
||||||
|
|
||||||
bool done = false;
|
bool done = false;
|
||||||
|
MenuStars::reset();
|
||||||
while (!done) {
|
while (!done) {
|
||||||
tft.fillScreen(TFT_BLACK);
|
tft.fillScreen(TFT_BLACK);
|
||||||
tft.setTextColor(TFT_GREEN, TFT_BLACK);
|
tft.setTextColor(TFT_GREEN, TFT_BLACK);
|
||||||
@@ -77,6 +79,7 @@ void run(TFT_eSPI& tft) {
|
|||||||
TouchInput::Point tap;
|
TouchInput::Point tap;
|
||||||
while (true) {
|
while (true) {
|
||||||
if (TouchInput::wasTapped(tap)) break;
|
if (TouchInput::wasTapped(tap)) break;
|
||||||
|
MenuStars::update(tft);
|
||||||
delay(20);
|
delay(20);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -1,6 +1,7 @@
|
|||||||
#include "wifi_setup_screen.h"
|
#include "wifi_setup_screen.h"
|
||||||
#include "touch_input.h"
|
#include "touch_input.h"
|
||||||
#include "wifi_manager.h"
|
#include "wifi_manager.h"
|
||||||
|
#include "menu_stars.h"
|
||||||
#include "config.h"
|
#include "config.h"
|
||||||
#include "i18n.h"
|
#include "i18n.h"
|
||||||
|
|
||||||
@@ -187,6 +188,7 @@ namespace {
|
|||||||
}
|
}
|
||||||
|
|
||||||
bool run(TFT_eSPI& tft) {
|
bool run(TFT_eSPI& tft) {
|
||||||
|
MenuStars::reset();
|
||||||
stage = Stage::Scanning;
|
stage = Stage::Scanning;
|
||||||
skipped = false;
|
skipped = false;
|
||||||
connectSucceeded = false;
|
connectSucceeded = false;
|
||||||
@@ -332,6 +334,7 @@ bool run(TFT_eSPI& tft) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
if (!needsRedraw) {
|
if (!needsRedraw) {
|
||||||
|
MenuStars::update(tft);
|
||||||
delay(20);
|
delay(20);
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user