From 08791cac0cd07c9f3922c7c34683a96e266c7f0a Mon Sep 17 00:00:00 2001 From: Constantin Leue <77660791+Consti3D@users.noreply.github.com> Date: Thu, 6 Aug 2026 15:09:06 +0200 Subject: [PATCH] MSP-Referenz dokumentiert: Sensor-Status/Arming-/Box-Mode-Flags im Code, ungenutzte iNAV-Befehle in der Architektur-Doku Auf Nutzeranfrage die Bedeutung mehrerer MSP2_INAV_*-Codes gegen den tatsaechlichen iNAV-9.1.0-Quellcode geprueft (fc_msp.c, fc_msp_box.c, runtime_config.h, settings.yaml): - msp_commands.dart: Doc-Kommentar zu MSP2_INAV_STATUS (0x2000, bereits genutzt) um das vollstaendige Bit-Layout von sensorStatus, armingFlags und boxModeFlags ergaenzt. boxModeFlags ist kein festes Bit-pro-Modus- Mapping, sondern muss ueber MSP_BOXIDS (ID 119) korreliert werden - Fixed-Wing-relevante permanentIds mit aufgefuehrt. MspArmingFlags um die komplette armingFlag_e-Referenz (alle ARMING_DISABLED_*-Gruende) erweitert, als Dokumentation - nicht als neue Konstanten, da bisher nur das ARMED-Bit tatsaechlich gebraucht wird. - DMC_Architektur_und_Design.md (Abschnitt 6): fuenf bisher ungenutzte MSP2_INAV_*-Befehle als offene Punkte aufgenommen (GEOZONE/SAFEHOME/ BATTERY_CONFIG/AIR_SPEED/TEMPERATURES) mit Payload-Details und Einschaetzung zur Relevanz - GEOZONE (Geofencing) am interessantesten fuer die bestehende Flugpfad-Machbarkeitspruefung. Co-Authored-By: Claude Sonnet 5 --- DMC_Architektur_und_Design.md | 7 ++++ app/lib/transport/msp/msp_commands.dart | 47 +++++++++++++++++++++++-- 2 files changed, 52 insertions(+), 2 deletions(-) diff --git a/DMC_Architektur_und_Design.md b/DMC_Architektur_und_Design.md index 7552530..706b515 100644 --- a/DMC_Architektur_und_Design.md +++ b/DMC_Architektur_und_Design.md @@ -191,6 +191,13 @@ Enthält u. a.: - **Klettersteigungsprüfung gegen tatsächliche Bogenlänge statt Geradenverbindung berechnen** — aktuell bewusste Vereinfachung, könnte bei engen Kombinationen aus Höhenänderung und scharfer Kurve leicht zu optimistisch sein. - **iNAV-10-Änderungen an Mission-/Wegpunktsystem** — zum Recherchezeitpunkt keine bestätigten grundlegenden Änderungen gegenüber v9 gefunden; Release-Termin (evtl. Ende 2026) und Feature-Freeze noch offen, vor App-Release erneut prüfen. - **Experimenteller iNAV-Community-Branch für Wegpunkt-Upload im Flug (bei nicht aktivem NAV-WP-Modus)** — Status unklar, ob in einen stabilen Release gewandert; vor Release gegen aktuelle 9.x-Firmware verifizieren, nicht darauf verlassen. +- **`MSP2_INAV_WIND` (0x2231) für geschätzte Windstärke/-richtung im Drone Status** — vom iNAV-Windschätzer (`flight/wind_estimator.c`, GPS-basiert, kein Pitot nötig) berechnet, aber bis 9.1.0 nur ins OSD gerendert, nicht per MSP abrufbar. Command wurde erst kürzlich auf dem Branch `release/9.1` hinzugefügt (Commit "feat(msp): add MSP2_INAV_WIND (0x2231) to expose wind estimator", Bugfix in PR iNavFlight/inav#11762, gemerged 2026-08-03) — bislang in **keinem** getaggten Release (weder 9.1.0 noch `master`) enthalten, T1 Ranger müsste also erst auf eine Firmware ab diesem Commit geflasht werden. Response-Payload laut `fc_msp.c`: `u16 windSpeed` (cm/s, horizontal), `u16 windAngle` (Grad, 0–359, Earth-Frame), `u8 windFlags` (1 = Schätzung gültig). Vor Umsetzung erneut prüfen, ob der Command in einem stabilen Release gelandet ist. +- **`MSP2_INAV_GEOZONE`/`_SET_GEOZONE` + `_GEOZONE_VERTEX`/`_SET_GEOZONE_VERTEX`** (`0x2210`–`0x2213`) für Geofencing — bisher ungenutzt, aber vermutlich das interessanteste noch nicht angebundene MSP-Feature für DMC. Indexbasiert abgefragt (`mspFcGeozoneOutCommand`/`mspFcGeozoneVerteciesOutCommand` in `fc_msp.c`): pro Zone (Request-Byte = Zonenindex) `u8 type` (Inclusion/Exclusion), `u8 shape` (Kreis/Polygon), `u32 minAltitude`, `u32 maxAltitude`, `u8 isSealevelRef`, `u8 fenceAction` (`NONE`/`AVOID`/`POS_HOLD`/`RTH`, siehe `settings.yaml` Table `fence_action`), `u8 vertexCount`; Vertices einzeln per `(zoneId, vertexId)` nachladbar (`u32 lat`, `u32 lon`, bei Kreisform zusätzlich ein Radius-Vertex). Könnte analog zur bestehenden Flugpfad-Machbarkeitsprüfung (`domain/mission/mission_warnings.dart`) als Warnung genutzt werden, wenn eine geplante Route eine auf der Drohne konfigurierte No-Fly-Zone kreuzt. +- **`MSP2_INAV_SAFEHOME`/`_SET_SAFEHOME`** (`0x2038`/`0x2039`) für alternative RTH-Landepunkte — bisher ungenutzt. Indexbasiert (ein Request pro Slot, bis `MAX_SAFE_HOMES`): `u8 enabled`, `u32 lat`, `u32 lon`. Könnte eine "Backup-Landepunkte verwalten"-Ansicht ermöglichen, eigener UI-Scope (Liste/Editor), nicht MVP-kritisch. +- **`MSP2_INAV_BATTERY_CONFIG`** (`0x2005`, alternativ als Teilmenge von `MSPV2_INAV_MISC`/`0x2003`) für die auf dem FC hinterlegte Batteriekonfiguration — bisher ungenutzt. Liefert `u8 cells` sowie `u16 cellDetect`/`cellMin`/`cellMax`/`cellWarning` (je 0.01V/Zelle, `fc_msp.c` `case MSP2_INAV_BATTERY_CONFIG`, Felder verifiziert gegen `settings.yaml`: `vbat_cell_detect_voltage`/`vbat_max_cell_voltage`/`vbat_min_cell_voltage`/`vbat_warning_cell_voltage`). Könnte künftig `DroneProfile.batteryCellCount`/die Pro-Zelle-Schwellwerte mit der tatsächlichen FC-Konfiguration abgleichen oder daraus vorbefüllen, statt sie nur manuell im Profil-Editor zu pflegen. +- **`MSPV2_INAV_AIR_SPEED`** (`0x2009`) für echte Fahrt durch die Luft (Pitot) — liefert `u32 getAirspeedEstimate()`, ohne `USE_PITOT`-Sensor konstant `0`. Für den T1 Ranger aktuell nicht relevant (kein Pitot-Rohr vorgesehen); bei künftigem Pitot-Ausbau erneut prüfen. +- **`MSP2_INAV_TEMPERATURES`** (`0x201E`) für Temperatursensor-Werte — Array von bis zu `MAX_TEMP_SENSORS` `i16`-Werten (`-1000` = ungültig), braucht konfigurierte Temp-Sensoren (`USE_TEMPERATURE_SENSOR`). Im aktuellen T1-Ranger-Aufbau keine physischen Temp-Sensoren vorgesehen, daher niedrige Priorität. +- **Bit-Layout von `sensorStatus`/`armingFlags`/`boxModeFlags`** (Teil der bereits genutzten `MSP2_INAV_STATUS`, `0x2000`) — vollständig dokumentiert direkt im Code, siehe Doc-Kommentare zu `MspCommands.inavStatus` und `MspArmingFlags` in [msp_commands.dart](app/lib/transport/msp/msp_commands.dart), um Drift zwischen Architektur-Doku und Code zu vermeiden. Insbesondere `boxModeFlags` ist dort ausführlich erklärt: die Bit-Position ist NICHT fest, sondern muss einmalig über `MSP_BOXIDS` (ID 119) mit der jeweiligen Firmware-Konfiguration korreliert werden. - **`dart_mavlink`-Paket vs. eigener Generator aus MAVLink-XML-Dialektdateien** — Entscheidung für die MAVLink-Anbindung (nicht MVP-kritisch, aber für spätere ArduPilot-Unterstützung relevant) noch offen. - **XR1-Empfänger-Kompatibilität mit mLRS** — XR4 ist vom mLRS-Team offiziell validiert, XR1 nur wahrscheinlich kompatibel (über generisches Firmware-Target), nicht bestätigt. - **iOS-Hintergrundverbindung** — Konzept (Background Modes / "voip"/"location"-Capability) benannt, aber nicht MVP-relevant (MVP ist Android-only) und nicht im Detail ausgearbeitet. diff --git a/app/lib/transport/msp/msp_commands.dart b/app/lib/transport/msp/msp_commands.dart index 83e4812..1185de2 100644 --- a/app/lib/transport/msp/msp_commands.dart +++ b/app/lib/transport/msp/msp_commands.dart @@ -43,6 +43,34 @@ abstract final class MspCommands { /// u32 armingFlags, 8 byte boxModeFlags, u8 mixerProfile. /// (`fc_msp.c`, `case MSP2_INAV_STATUS`; ID aus /// `msp_protocol_v2_inav.h`: `#define MSP2_INAV_STATUS 0x2000`) + /// + /// Bit-Layout `sensorStatus` (`packSensorStatus()` in `fc_msp_box.c`): + /// Bit 0 ACC, 1 BARO, 2 MAG, 3 GPS, 4 RANGEFINDER, 5 OPFLOW, 6 PITOT, + /// 7 TEMP (je 1 = Sensor vorhanden/aktiviert); Bits 8-14 unbenutzt; + /// Bit 15 = Hardware-Defekt (`!isHardwareHealthy()`). + /// + /// Bit-Layout `armingFlags` (`armingFlag_e` in `fc/runtime_config.h`) - + /// siehe [MspArmingFlags]. + /// + /// `boxModeFlags` (8 Byte = 64 Bit) ist KEIN fest verdrahtetes Bit-pro- + /// Modus-Mapping (`packBoxModeFlags()` in `fc_msp_box.c`): Bit `i` sagt + /// nur "ist der i-te Eintrag der aktuell aktiven Box-Liste gerade aktiv" + /// - welcher Modus das ist, hängt vom konkreten Firmware-Build/-Setup ab + /// (nur kompilierte/aktivierte Boxen landen in der Liste, + /// `initActiveBoxIds()`). Um ein Bit einem Modus zuzuordnen, muss der + /// Client `MSP_BOXIDS` (ID 119, `case MSP_BOXIDS: serializeBoxReply()`) + /// EINMAL beim Verbindungsaufbau abfragen: die Antwort ist ein + /// Array von `u8 permanentId` in exakt der gleichen Reihenfolge wie die + /// Bits in `boxModeFlags` - erst über diese `permanentId` lässt sich der + /// Modusname aus der festen `boxes[]`-Tabelle in `fc_msp_box.c` ablesen + /// (`permanentId` ist stabil über Firmware-Versionen, die Bit-Position + /// nicht). Für Fixed-Wing/iNAV-Missionsbetrieb relevante `permanentId`s: + /// 0 ARM, 1 ANGLE, 2 HORIZON, 10 NAV RTH, 11 NAV POSHOLD, 12 MANUAL, + /// 27 FAILSAFE, 28 NAV WP, 30 HOME RESET, 34 FLAPERON, 35 TURN ASSIST, + /// 36 NAV LAUNCH, 37 SERVO AUTOTRIM, 45 NAV COURSE HOLD, 51 PREARM, + /// 53 NAV CRUISE, 55 WP PLANNER, 56 SOARING, 59 MISSION CHANGE, 64 + /// ANGLE HOLD (vollständige Tabelle: `boxes[]` in `fc_msp_box.c`, iNAV + /// 9.1.0 - noch nicht in `MspCommands` aufgenommen, da bisher ungenutzt). static const int inavStatus = 0x2000; /// Response (24 Byte): u8 flags, u16 batteryVoltage(0.01V), @@ -62,8 +90,23 @@ abstract final class MspCommands { static const int inavLinkStats = 0x2103; } -/// Bits von `armingFlags` (Doku: `fc/runtime_config.h`, `armingFlags_e`). -/// Nur das fuer die Telemetrie benoetigte ARMED-Bit ist hier abgebildet. +/// Bits von `armingFlags` (`armingFlag_e` in `fc/runtime_config.h`, iNAV +/// 9.1.0). Nur das fuer die Telemetrie benoetigte ARMED-Bit ist hier als +/// Konstante abgebildet - der Rest der Aufzaehlung ist unten als Referenz +/// dokumentiert, falls spaeter z.B. eine "warum laesst sich nicht armen"- +/// Anzeige gebraucht wird (aktuell ungenutzt, deshalb keine eigenen +/// Konstanten dafuer): +/// +/// Bit 2 `ARMED`, Bit 3 `WAS_EVER_ARMED`, Bit 4/5 Simulator-Modus +/// (HITL/SITL), danach ausschliesslich Arm-Sperrgruende +/// (`ARMING_DISABLED_*`, jeweils "warum kann/darf gerade nicht armiert +/// werden"): Bit 6 GEOZONE, 7 FAILSAFE_SYSTEM, 8 NOT_LEVEL, 9 +/// SENSORS_CALIBRATING, 10 SYSTEM_OVERLOADED, 11 NAVIGATION_UNSAFE, 12 +/// COMPASS_NOT_CALIBRATED, 13 ACCELEROMETER_NOT_CALIBRATED, 14 ARM_SWITCH, +/// 15 HARDWARE_FAILURE, 16 BOXFAILSAFE, 18 RC_LINK, 19 THROTTLE, 20 CLI, +/// 21 CMS_MENU, 22 OSD_MENU, 23 ROLLPITCH_NOT_CENTERED, 24 SERVO_AUTOTRIM, +/// 25 OOM, 26 INVALID_SETTING, 27 PWM_OUTPUT_ERROR, 28 NO_PREARM, 29 +/// DSHOT_BEEPER, 30 LANDING_DETECTED (Bit 17 unbenutzt). abstract final class MspArmingFlags { static const int armed = 1 << 2; }