v3.3.0: Welcome screen, factory reset, calibration/touch fixes, flash partition fix

## New
- "Welcome" screen shown on first-time setup (before touch
  calibration), with the splash screen's animated radar graphic and a
  Start button.
- The "Setup complete" screen now counts down 7 seconds with a button
  matching the Welcome screen's style, then automatically continues
  into the app (previously required a tap).
- System menu "Backup & Reset" page (Backup, Restore, and a new
  "Reset settings" option that wipes the on-device data and re-runs
  first-time setup - useful for testing or handing the device to
  someone else).
- Touch calibration targets are now green mini radar reticles instead
  of red crosshairs.

## Improved
- The SD card's data folder is now only created after tapping Start
  on the Welcome screen, instead of on every boot regardless.
- Flash partition layout changed to free up roughly 850 KB of
  firmware space (no OTA update slot needed, since firmware is always
  flashed via cable/USB) - lowers flash usage from ~95% to ~59%.

## Fixed
- The Start button and the WiFi scanning screen now show a loading
  indicator instead of appearing frozen during SD-card/WiFi
  operations.
- A touch-input bug during first-time setup that could corrupt touch
  calibration and cause taps to land on the wrong on-screen element
  afterward (most noticeable in the WiFi network selection list).

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
This commit is contained in:
Eiswolf-BG
2026-08-12 06:57:48 +02:00
parent ba1c062ef1
commit a7f14b3125
10 changed files with 394 additions and 84 deletions

View File

@@ -15,11 +15,19 @@ namespace {
int16_t avgY() const { return n ? (int16_t)(sumY / n) : 0; }
};
// Mini radar target: same look as the radar graphic on the splash/
// welcome screen (concentric rings + crosshair in green), but without
// aircraft - instead a green filled center point as the point to aim
// at, replacing the previous red filled circle with white center dot.
// Radii deliberately kept small so the targets in the screen corners
// (edge margin M=24, see run()) don't extend past the screen edge.
void drawTarget(TFT_eSPI& tft, int16_t x, int16_t y) {
tft.fillCircle(x, y, 10, TFT_RED);
tft.drawFastHLine(x - 16, y, 32, TFT_RED);
tft.drawFastVLine(x, y - 16, 32, TFT_RED);
tft.fillCircle(x, y, 3, TFT_WHITE);
uint16_t dim = 0x0320;
tft.drawCircle(x, y, 16, dim);
tft.drawCircle(x, y, 10, dim);
tft.drawFastHLine((int16_t)(x - 18), y, 36, TFT_GREEN);
tft.drawFastVLine(x, (int16_t)(y - 18), 36, TFT_GREEN);
tft.fillCircle(x, y, 3, TFT_GREEN);
}
RawAvg waitForTap(TFT_eSPI& tft) {