Warning thresholds added in drone profile. traffic light indication in drone satus menue added. layout and content optimized

This commit is contained in:
Constantin Leue
2026-08-05 20:15:18 +02:00
parent f65dceb338
commit 4982341203
8 changed files with 1302 additions and 37 deletions
@@ -24,6 +24,18 @@ String buildDroneExportJson(DroneProfile profile) {
'maxRangeM': profile.maxRangeM,
'maxEnduranceMin': profile.maxEnduranceMin,
'maxAltitudeM': profile.maxAltitudeM,
'gpsSatGreenMin': profile.gpsSatGreenMin,
'gpsSatRedMin': profile.gpsSatRedMin,
'hdopGreenMax': profile.hdopGreenMax,
'hdopRedMax': profile.hdopRedMax,
'currentGreenMaxA': profile.currentGreenMaxA,
'currentRedMaxA': profile.currentRedMaxA,
'batteryVoltageGreenMinV': profile.batteryVoltageGreenMinV,
'batteryVoltageRedMinV': profile.batteryVoltageRedMinV,
'rxQualityGreenMin': profile.rxQualityGreenMin,
'rxQualityRedMin': profile.rxQualityRedMin,
'rxSnrGreenMinDb': profile.rxSnrGreenMinDb,
'rxSnrRedMinDb': profile.rxSnrRedMinDb,
},
};
return const JsonEncoder.withIndent(' ').convert(map);
@@ -88,6 +100,15 @@ ParsedDroneImport parseDroneImportJson(String jsonText) {
}
}
// Ampel-Schwellwerte (siehe DroneProfile-Doku) sind bewusst NICHT Teil von
// _requiredNumericFields - aeltere, vor deren Einfuehrung exportierte
// Profildateien haben diese Felder noch nicht und sollen trotzdem
// importierbar bleiben (dann gelten die DroneProfile.default*-Werte).
double numOrDefault(String field, double fallback) {
final v = droneData[field];
return v is num ? v.toDouble() : fallback;
}
final profile = DroneProfile(
name: name,
minSpeed: (droneData['minSpeed'] as num).toDouble(),
@@ -101,6 +122,24 @@ ParsedDroneImport parseDroneImportJson(String jsonText) {
maxRangeM: (droneData['maxRangeM'] as num).toDouble(),
maxEnduranceMin: (droneData['maxEnduranceMin'] as num).toDouble(),
maxAltitudeM: (droneData['maxAltitudeM'] as num).toDouble(),
gpsSatGreenMin: numOrDefault('gpsSatGreenMin', DroneProfile.defaultGpsSatGreenMin),
gpsSatRedMin: numOrDefault('gpsSatRedMin', DroneProfile.defaultGpsSatRedMin),
hdopGreenMax: numOrDefault('hdopGreenMax', DroneProfile.defaultHdopGreenMax),
hdopRedMax: numOrDefault('hdopRedMax', DroneProfile.defaultHdopRedMax),
currentGreenMaxA: numOrDefault('currentGreenMaxA', DroneProfile.defaultCurrentGreenMaxA),
currentRedMaxA: numOrDefault('currentRedMaxA', DroneProfile.defaultCurrentRedMaxA),
batteryVoltageGreenMinV: numOrDefault(
'batteryVoltageGreenMinV',
DroneProfile.defaultBatteryVoltageGreenMinV,
),
batteryVoltageRedMinV: numOrDefault(
'batteryVoltageRedMinV',
DroneProfile.defaultBatteryVoltageRedMinV,
),
rxQualityGreenMin: numOrDefault('rxQualityGreenMin', DroneProfile.defaultRxQualityGreenMin),
rxQualityRedMin: numOrDefault('rxQualityRedMin', DroneProfile.defaultRxQualityRedMin),
rxSnrGreenMinDb: numOrDefault('rxSnrGreenMinDb', DroneProfile.defaultRxSnrGreenMinDb),
rxSnrRedMinDb: numOrDefault('rxSnrRedMinDb', DroneProfile.defaultRxSnrRedMinDb),
);
final appVersion = decoded['appVersion'] as String?;