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
@@ -30,8 +30,9 @@ String buildDroneExportJson(DroneProfile profile) {
'hdopRedMax': profile.hdopRedMax,
'currentGreenMaxA': profile.currentGreenMaxA,
'currentRedMaxA': profile.currentRedMaxA,
'batteryVoltageGreenMinV': profile.batteryVoltageGreenMinV,
'batteryVoltageRedMinV': profile.batteryVoltageRedMinV,
'batteryCellCount': profile.batteryCellCount,
'batteryVoltageGreenMinPerCellV': profile.batteryVoltageGreenMinPerCellV,
'batteryVoltageRedMinPerCellV': profile.batteryVoltageRedMinPerCellV,
'rxQualityGreenMin': profile.rxQualityGreenMin,
'rxQualityRedMin': profile.rxQualityRedMin,
'rxSnrGreenMinDb': profile.rxSnrGreenMinDb,
@@ -109,6 +110,11 @@ ParsedDroneImport parseDroneImportJson(String jsonText) {
return v is num ? v.toDouble() : fallback;
}
int intOrDefault(String field, int fallback) {
final v = droneData[field];
return v is num ? v.round() : fallback;
}
final profile = DroneProfile(
name: name,
minSpeed: (droneData['minSpeed'] as num).toDouble(),
@@ -128,13 +134,22 @@ ParsedDroneImport parseDroneImportJson(String jsonText) {
hdopRedMax: numOrDefault('hdopRedMax', DroneProfile.defaultHdopRedMax),
currentGreenMaxA: numOrDefault('currentGreenMaxA', DroneProfile.defaultCurrentGreenMaxA),
currentRedMaxA: numOrDefault('currentRedMaxA', DroneProfile.defaultCurrentRedMaxA),
batteryVoltageGreenMinV: numOrDefault(
'batteryVoltageGreenMinV',
DroneProfile.defaultBatteryVoltageGreenMinV,
// batteryCellCount/*PerCellV sind Schema-v9-Felder (Doku: "zellen anzahl
// ... hinzufuegen") - Dateien, die vor deren Einfuehrung exportiert
// wurden, haben stattdessen ggf. noch die alten absoluten
// batteryVoltage*MinV-Felder (feste Pack-Spannung). Die werden hier
// bewusst NICHT mehr gelesen (koennten ohne bekannte Zellenzahl der
// Quelldrohne nicht sinnvoll in Pro-Zelle-Werte umgerechnet werden) -
// stattdessen gelten wie bei allen anderen Schwellwerten die
// DroneProfile.default*-Werte.
batteryCellCount: intOrDefault('batteryCellCount', DroneProfile.defaultBatteryCellCount),
batteryVoltageGreenMinPerCellV: numOrDefault(
'batteryVoltageGreenMinPerCellV',
DroneProfile.defaultBatteryVoltageGreenMinPerCellV,
),
batteryVoltageRedMinV: numOrDefault(
'batteryVoltageRedMinV',
DroneProfile.defaultBatteryVoltageRedMinV,
batteryVoltageRedMinPerCellV: numOrDefault(
'batteryVoltageRedMinPerCellV',
DroneProfile.defaultBatteryVoltageRedMinPerCellV,
),
rxQualityGreenMin: numOrDefault('rxQualityGreenMin', DroneProfile.defaultRxQualityGreenMin),
rxQualityRedMin: numOrDefault('rxQualityRedMin', DroneProfile.defaultRxQualityRedMin),