feat(ui-lvgl): roadmap stage 3 - message history on SD, Storage screen, saved trails

- Message history archived per conversation on the SD card (HIST_ARCHIVE):
  restored on boot, Older/Newer paging in threads, kept count selectable
- Settings > System > Storage: card and flash usage, breakdown by maps,
  messages, trails and other, kept-per-chat setting, delete history;
  reads the mounted volume and warns when the FAT partition is much
  smaller than the card
- Saved trails on the card: every Save is a new file, Load opens a list
  with load (framed on the map), GPX export and delete
- Diagnostics: GPS data rows, last start reason, last crash summary
- Messages restored before the clock is set show their date instead of 0s

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
This commit is contained in:
Jakub
2026-09-26 19:17:08 +02:00
co-authored by Claude Opus 5.5
parent 4f5357031f
commit 277c0cddf1
15 changed files with 1272 additions and 37 deletions
@@ -39,6 +39,7 @@
class MicroNMEALocationProvider : public LocationProvider {
char _nmeaBuffer[100];
uint32_t _rx_chars = 0;
MicroNMEA nmea;
mesh::RTCClock* _clock;
Stream* _gps_serial;
@@ -122,6 +123,9 @@ public :
return alt;
}
long satellitesCount() override { return nmea.getNumSatellites(); }
// Bytes read from the receiver so far: still at 0 (or not moving) = no NMEA
// arriving at all, as opposed to NMEA without a fix (a UI diagnostics row).
uint32_t rxChars() const { return _rx_chars; }
long getHDOP() override { return nmea.getHDOP(); }
bool isValid() override { return nmea.isValid(); }
@@ -138,6 +142,7 @@ public :
while (_gps_serial->available()) {
char c = _gps_serial->read();
_rx_chars++;
#ifdef GPS_NMEA_DEBUG
Serial.print(c);
#endif