/// Ein Drohnen-Profil mit Flugleistungsdaten (Architektur-Doku 3.5/7.3): /// FC-Typ ist bewusst NICHT Teil dieses MVP-Profils (nur iNAV/MSP im /// Scope, siehe CLAUDE.md) - anders als im HTML-Demonstrator, der bereits /// auf MAVLink vorbereitet. class DroneProfile { const DroneProfile({ this.id, required this.name, required this.minSpeed, required this.cruiseSpeed, required this.maxSpeed, required this.minTurnRadius, required this.loiterRadius, required this.catchRadius, required this.maxClimbRate, required this.maxDescentRate, required this.maxRangeM, required this.maxEnduranceMin, required this.maxAltitudeM, }); /// Null fuer ein noch nicht gespeichertes (neu angelegtes) Profil. final int? id; final String name; final double minSpeed; final double cruiseSpeed; final double maxSpeed; final double minTurnRadius; final double loiterRadius; final double catchRadius; final double maxClimbRate; final double maxDescentRate; final double maxRangeM; final double maxEnduranceMin; final double maxAltitudeM; /// T1 Ranger (Heewing) - Standardprofil (Doku 3.5), analog DEFAULT_DRONE /// im HTML-Demonstrator. static const _t1RangerName = 'T1 Ranger'; factory DroneProfile.t1Ranger() => const DroneProfile( name: _t1RangerName, minSpeed: 13, cruiseSpeed: 15, maxSpeed: 25, minTurnRadius: 35, loiterRadius: 100, catchRadius: 60, maxClimbRate: 5, maxDescentRate: 6, maxRangeM: 15000, maxEnduranceMin: 45, maxAltitudeM: 2000, ); /// Einzeilige Zusammenfassung fuer die Profilliste (Doku 3.5), analog /// droneSummary() im HTML-Demonstrator. String get summary { final rangeKm = (maxRangeM / 100).round() / 10; return '$minSpeed–$cruiseSpeed–$maxSpeed m/s · R${minTurnRadius.round()}m · ' '↑${maxClimbRate.round()}/↓${maxDescentRate.round()} m/s · ${rangeKm}km · ' '${maxEnduranceMin.round()}min · ceil ${maxAltitudeM.round()}m'; } DroneProfile copyWith({ int? id, String? name, double? minSpeed, double? cruiseSpeed, double? maxSpeed, double? minTurnRadius, double? loiterRadius, double? catchRadius, double? maxClimbRate, double? maxDescentRate, double? maxRangeM, double? maxEnduranceMin, double? maxAltitudeM, }) { return DroneProfile( id: id ?? this.id, name: name ?? this.name, minSpeed: minSpeed ?? this.minSpeed, cruiseSpeed: cruiseSpeed ?? this.cruiseSpeed, maxSpeed: maxSpeed ?? this.maxSpeed, minTurnRadius: minTurnRadius ?? this.minTurnRadius, loiterRadius: loiterRadius ?? this.loiterRadius, catchRadius: catchRadius ?? this.catchRadius, maxClimbRate: maxClimbRate ?? this.maxClimbRate, maxDescentRate: maxDescentRate ?? this.maxDescentRate, maxRangeM: maxRangeM ?? this.maxRangeM, maxEnduranceMin: maxEnduranceMin ?? this.maxEnduranceMin, maxAltitudeM: maxAltitudeM ?? this.maxAltitudeM, ); } }