System messages fuer GPS-Fix und Drone connected/disconnected, Batterie-Schwellwerte auf Pro-Zelle umgestellt

- detectSystemMessages() erkennt jetzt auch den Uebergang zu einem GPS-Fix
  (flankengetriggert wie Battery/Failsafe), Meldung "GPS fix acquired (N
  satellites)".
- Die automatisch erkannten Verbindungsmeldungen heissen jetzt "Drone
  connected"/"Drone disconnected" statt "Connected"/"Connection lost" -
  praeziser an die tatsaechliche Bedeutung angelehnt (Eintreffen/Ausbleiben
  echter Telemetrie-Frames, nicht nur des rohen Socket-Zustands).
- DroneProfile: feste Pack-Alarmspannung (batteryVoltageGreenMinV/RedMinV)
  ersetzt durch batteryCellCount + Pro-Zelle-Schwellwerte
  (batteryVoltageGreenMinPerCellV/RedMinPerCellV, LiPo-Standardwerte 3.4/3.2
  V als Default). Die alten Feldnamen bleiben als berechnete Getter
  (Zellenzahl * Pro-Zelle-Wert) erhalten, damit
  telemetry_field_status.dart unveraendert bleibt. T1-Ranger-Standardprofil
  auf 4S gesetzt.
- DB-Schema v8 -> v9 (additiv, alte Pack-Spannungs-Spalten bleiben als tote
  Spalten stehen), Repository und Share-Codec-Im-/Export entsprechend
  angepasst; alte Exportdateien ohne die neuen Felder fallen auf die
  DroneProfile-Defaults zurueck statt eine unbekannte Zellenzahl zu raten.
- DroneProfileEditor: "Battery voltage alarm"-Gruppe um ein Zellenzahl-Feld
  erweitert und auf V/Zelle umbenannt.
- Tests ergaenzt/angepasst: GPS-Fix-Erkennung (Unit + Provider-Integration),
  neuer v8->v9-Migrationstest analog zum bestehenden v7->v8-Test,
  Connected/Disconnected-Umbenennung in Provider- und Widget-Tests,
  Cell-Count-Roundtrip in Repository- und Share-Codec-Tests.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
This commit is contained in:
Constantin Leue
2026-08-06 13:06:49 +02:00
co-authored by Claude Sonnet 5
parent b68c16d8e6
commit e902197462
15 changed files with 632 additions and 58 deletions
+40 -10
View File
@@ -23,8 +23,9 @@ class DroneProfile {
this.hdopRedMax = defaultHdopRedMax,
this.currentGreenMaxA = defaultCurrentGreenMaxA,
this.currentRedMaxA = defaultCurrentRedMaxA,
this.batteryVoltageGreenMinV = defaultBatteryVoltageGreenMinV,
this.batteryVoltageRedMinV = defaultBatteryVoltageRedMinV,
this.batteryCellCount = defaultBatteryCellCount,
this.batteryVoltageGreenMinPerCellV = defaultBatteryVoltageGreenMinPerCellV,
this.batteryVoltageRedMinPerCellV = defaultBatteryVoltageRedMinPerCellV,
this.rxQualityGreenMin = defaultRxQualityGreenMin,
this.rxQualityRedMin = defaultRxQualityRedMin,
this.rxSnrGreenMinDb = defaultRxSnrGreenMinDb,
@@ -62,8 +63,23 @@ class DroneProfile {
final double hdopRedMax;
final double currentGreenMaxA;
final double currentRedMaxA;
final double batteryVoltageGreenMinV;
final double batteryVoltageRedMinV;
/// Zellenzahl des LiPo-Akkus (z.B. 4 fuer "4S") - bestimmt zusammen mit
/// den beiden *PerCellV-Schwellwerten die tatsaechliche Alarmspannung des
/// Packs (siehe [batteryVoltageGreenMinV]/[batteryVoltageRedMinV]). Vorher
/// war die Alarmspannung als feste Pack-Gesamtspannung hinterlegt - bei
/// einem Wechsel der Zellenzahl (z.B. 4S statt 6S) waeren die alten
/// Schwellwerte dann fuer den neuen Pack sinnlos gewesen, ohne dass beim
/// Bearbeiten des Profils ein Hinweis darauf bestanden haette.
final int batteryCellCount;
/// Alarm-Schwellwerte PRO ZELLE (LiPo-Standardwerte als Default: 3.4V
/// gruen/"noch sicher", 3.2V rot/"jetzt landen") - siehe
/// [batteryVoltageGreenMinV]/[batteryVoltageRedMinV] fuer die daraus
/// abgeleitete tatsaechliche Pack-Alarmspannung.
final double batteryVoltageGreenMinPerCellV;
final double batteryVoltageRedMinPerCellV;
final double rxQualityGreenMin;
final double rxQualityRedMin;
final double rxSnrGreenMinDb;
@@ -75,13 +91,22 @@ class DroneProfile {
static const defaultHdopRedMax = 5.0;
static const defaultCurrentGreenMaxA = 20.0;
static const defaultCurrentRedMaxA = 30.0;
static const defaultBatteryVoltageGreenMinV = 20.4;
static const defaultBatteryVoltageRedMinV = 19.2;
static const defaultBatteryCellCount = 4;
static const defaultBatteryVoltageGreenMinPerCellV = 3.4;
static const defaultBatteryVoltageRedMinPerCellV = 3.2;
static const defaultRxQualityGreenMin = 70.0;
static const defaultRxQualityRedMin = 50.0;
static const defaultRxSnrGreenMinDb = 0.0;
static const defaultRxSnrRedMinDb = -10.0;
/// Tatsaechliche Pack-Alarmspannung, aus Zellenzahl x Pro-Zelle-Schwelle
/// berechnet - [telemetry_field_status.dart] vergleicht damit die vom FC
/// gemeldete Gesamtspannung, kennt selbst aber keine Zellenzahl.
double get batteryVoltageGreenMinV =>
batteryCellCount * batteryVoltageGreenMinPerCellV;
double get batteryVoltageRedMinV =>
batteryCellCount * batteryVoltageRedMinPerCellV;
/// T1 Ranger (Heewing) - Standardprofil (Doku 3.5), analog DEFAULT_DRONE
/// im HTML-Demonstrator.
static const _t1RangerName = 'T1 Ranger';
@@ -99,6 +124,7 @@ class DroneProfile {
maxRangeM: 15000,
maxEnduranceMin: 45,
maxAltitudeM: 2000,
batteryCellCount: 4,
);
/// Einzeilige Zusammenfassung fuer die Profilliste (Doku 3.5), analog
@@ -130,8 +156,9 @@ class DroneProfile {
double? hdopRedMax,
double? currentGreenMaxA,
double? currentRedMaxA,
double? batteryVoltageGreenMinV,
double? batteryVoltageRedMinV,
int? batteryCellCount,
double? batteryVoltageGreenMinPerCellV,
double? batteryVoltageRedMinPerCellV,
double? rxQualityGreenMin,
double? rxQualityRedMin,
double? rxSnrGreenMinDb,
@@ -157,8 +184,11 @@ class DroneProfile {
hdopRedMax: hdopRedMax ?? this.hdopRedMax,
currentGreenMaxA: currentGreenMaxA ?? this.currentGreenMaxA,
currentRedMaxA: currentRedMaxA ?? this.currentRedMaxA,
batteryVoltageGreenMinV: batteryVoltageGreenMinV ?? this.batteryVoltageGreenMinV,
batteryVoltageRedMinV: batteryVoltageRedMinV ?? this.batteryVoltageRedMinV,
batteryCellCount: batteryCellCount ?? this.batteryCellCount,
batteryVoltageGreenMinPerCellV:
batteryVoltageGreenMinPerCellV ?? this.batteryVoltageGreenMinPerCellV,
batteryVoltageRedMinPerCellV:
batteryVoltageRedMinPerCellV ?? this.batteryVoltageRedMinPerCellV,
rxQualityGreenMin: rxQualityGreenMin ?? this.rxQualityGreenMin,
rxQualityRedMin: rxQualityRedMin ?? this.rxQualityRedMin,
rxSnrGreenMinDb: rxSnrGreenMinDb ?? this.rxSnrGreenMinDb,
+11 -3
View File
@@ -3,9 +3,9 @@ import '../../transport/flight_controller_link.dart';
/// Schweregrad eines Eintrags im System-Messages-Log (Doku: "log von
/// kritischen ereignissen mit time stamp ... connection lost, battery
/// low/critical, fail safe mode activated", erweitert um allgemeine
/// Systemmeldungen wie Verbindungsauf-/-abbau, Verbindungsart-Wechsel und
/// Missionsuebertragung). [info] ist fuer Meldungen ohne Alarmcharakter -
/// reine Statusinformation, kein Warn-/Fehlerzustand.
/// Systemmeldungen wie Verbindungsauf-/-abbau, GPS-Fix, Verbindungsart-
/// Wechsel und Missionsuebertragung). [info] ist fuer Meldungen ohne
/// Alarmcharakter - reine Statusinformation, kein Warn-/Fehlerzustand.
enum SystemMessageSeverity { info, warning, critical }
/// Ein einzelner Log-Eintrag mit Zeitstempel (Doku: "System Messages Tab
@@ -72,5 +72,13 @@ List<SystemMessage> detectSystemMessages({
));
}
if (previous != null && !previous.hasFix && current.hasFix) {
events.add(SystemMessage(
timestamp: now,
message: 'GPS fix acquired (${current.numSat} satellites)',
severity: SystemMessageSeverity.info,
));
}
return events;
}