- Disable Kotlin incremental compilation (kotlin.incremental=false): the project lives on D: while Gradle's Kotlin daemon caches default to C:, which crashes with "this and base files have different roots" when closing incremental caches. - Drop flutter_map_tile_caching for now: it pins objectbox_flutter_libs ^4.1.0, which fails checkReleaseAarMetadata against newer AndroidX transitive deps (needs compileSdk 34+, itself built against android-31). Not used in code yet, so deferred rather than forcing an unverified dependency_override. - Add web/ platform for fast local UI iteration without an emulator. - Ignore .claude/ (Claude Code session state, not project content). Verified: flutter analyze, flutter test, and a real release build running on a newly created Pixel_10a-profile Android emulator (API 36). Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
5.7 KiB
Drone Mission Control (DMC)
Mobile App zur Missionsplanung und Flugsteuerung für einen Fixed-Wing-Drohnen-Aufbau (Heewing T1 Ranger, iNAV-Firmware). Wegpunkt-Missionen, Live-Fly-Modus, Point-and-Fly (PnF)-Einzelziel-Anflug.
Vollständige Architektur- und Design-Entscheidungen: DMC_Architektur_und_Design.md — vor jeder größeren Änderung lesen, insbesondere Abschnitt 4 (Entscheidungen inkl. Begründung), Abschnitt 5 (verworfene Alternativen) und Abschnitt 6 (offene Fragen).
Sprachregelung
Konversation und Dokumentation auf Deutsch, Code und UI-Texte auf Englisch.
Projektstruktur
Drone Mission Control.html— lauffähiger Vanilla-JS/Leaflet-Demonstrator, dient als Referenz für UI-Verhalten und bereits gelöste Probleme (Wind-Interpolation, Terrain-Sampling, Fillet-Geometrie, swipe-adjustierbare Wegpunkt-Chips, ...). Bei Unklarheiten über gewünschtes Verhalten zuerst hier nachsehen, bevor neu entschieden wird.design/— Logo-Assets (SVG-Varianten) und Icon-Sketches. Aktuell verwendetes App-Icon:design/Y2_pink_dark.svg.app/— Flutter-Zielarchitektur (Einzelpaket, kein Melos-Monorepo). Siehe unten.test/— Altlast/Sandbox, nicht Teil der aktiven Entwicklung.
Flutter-App (app/)
Fünf-Schichten-Architektur (Doku Abschnitt 2):
lib/
ui/ Screens (plan, fly, settings, library) + geteilte Widgets
app_mode/ App-Mode State Machine (Plan → Connect → Upload → Fly)
domain/ Mission-Domain-Layer (Strategy Pattern: TrackMission, ...)
+ protokollneutrale FlatWaypointList
services/ MissionSyncService, TelemetryService, Drift-Datenbank
transport/ FlightControllerLink-Abstraktion (msp/, mavlink/, mock/)
MVP-Scope (Doku 4.1): nur Android, nur iNAV via MSP, nur WiFi/TCP. MAVLink, USB-Seriell und iOS sind bewusst zurückgestellt.
Kernprinzip: Die Domain-Schicht kennt nur FlatWaypointList, protokollneutral.
Divergenz zu MSP/MAVLink findet ausschließlich im Encoder statt. FlightControllerLink
ist die zentrale Abstraktion; MockFlightControllerLink erlaubt UI-Arbeit ohne
Hardware. MspFlightControllerLink ist aktuell nur ein Gerüst (UnimplementedError)
— die eigentliche MSP-Protokoll-Implementierung (Framing, MSP_SET_WP,
MSP_NAV_STATUS) ist noch offen.
Ready-to-Fly-Gate (Doku 2.2/4.5): Upload + verifiziert + disarmed. Wird in
AppModeCubit.toFly() technisch erzwungen (wirft StateError), nicht nur als
UI-Konvention behandelt.
Persistenz: Drift (SQLite), nicht Hive — siehe Begründung 4.15. Schema in
lib/services/database/app_database.dart. Nach Schema-Änderungen:
dart run build_runner build
(im app/-Verzeichnis; --delete-conflicting-outputs wird von der installierten
build_runner-Version ignoriert und ist nicht nötig).
Entschiedene Pakete (siehe Doku Abschnitt 8): flutter_map (nicht google_maps_flutter),
drift, flutter_bloc + flutter_riverpod (kombiniert: Bloc für die App-Mode State
Machine, Riverpod für reaktive Einzelwerte wie Telemetrie), go_router.
flutter_map_tile_caching (FMTC, Doku 4.18) ist aktuell NICHT in der pubspec —
FMTC 10.1.1 pinnt objectbox_flutter_libs: ^4.1.0 fest, und diese Version hat einen
AAR-Metadata-Konflikt mit neueren AndroidX-Transitiv-Dependencies (androidx.fragment,
androidx.window, androidx.activity verlangen compileSdk ≥34, objectbox_flutter_libs
selbst ist gegen android-31 kompiliert) → Build schlägt fehl
(checkReleaseAarMetadata). Da FMTC im Code noch nirgends verwendet wird, wurde es
vorerst entfernt statt mit ungetesteten dependency_overrides zu forcieren. Vor
erneutem Hinzufügen: prüfen, ob FMTC eine neuere Version mit objectbox_flutter_libs ^5.x
freigegeben hat.
Noch nicht umgesetzt / bewusst zurückgestellt:
- Eigener MSP-Encoder/Decoder in Dart (4.19) — kein fertiges Paket verfügbar.
- Telemetrie-Verarbeitung in eigenem Isolate (4.21) — erst sinnvoll mit echtem Protokoll-Adapter zu verifizieren.
SurveyAreaMission/SearchAreaMission(Strategy-Pattern vorgesehen, Details offen).- Foreground Service (Android) für Hintergrund-Telemetrie (4.20).
- Offline-Kartenkachel-Caching (FMTC, siehe oben) — Paket-Versionskonflikt zu lösen.
flutter_launcher_iconsist konfiguriert für Android; iOS ist aus MVP-Gründen deaktiviert (ios: falsein derflutter_launcher_icons-Sektion derpubspec.yaml).web/-Plattform ist nur für schnelle lokale UI-Vorschau hinzugefügt (kein Android- Emulator/Gerät nötig), nicht Teil des Release-Scopes.
Bekannte Windows-Stolpersteine beim Android-Build
- Projekt liegt auf D:, Gradle-/Kotlin-Nutzerverzeichnis auf C: → Kotlins
inkrementeller Compiler crasht beim Schließen der Caches
(
Could not close incremental caches ... this and base files have different roots). Fix bereits gesetzt:kotlin.incremental=falseinandroid/gradle.properties. flutter run -d <emulator-id> --releaseist der zuverlässigste Weg, einen Android-Emulator/Gerät aus diesem (nicht-interaktiven) Environment heraus zu bespielen — Debug-Modus mit Hot-Reload funktioniert nur in einer echten interaktiven Session (VS Code, Terminal).adb shell/adb pullmit absoluten Unix-Pfaden (/sdcard/...) in Git Bash: MSYS wandelt den führenden Slash-Pfad fälschlich in einen Windows-Pfad um. Fix: Pfad mit doppeltem Slash schreiben (//sdcard/datei.png).
Verifikation nach Änderungen
Im app/-Verzeichnis:
flutter analyze
flutter test
Für einen echten Lauf auf Android (z. B. Emulator Pixel_10a, angelegt mit dem
pixel_10-Geräteprofil als Näherung, da kein exaktes "Pixel 10a"-Profil im SDK
existiert):
flutter emulators --launch Pixel_10a
flutter run -d emulator-5554 --release