Migration
Diese Seite wurde aus der AirSimTech MediaWiki migriert.
FMGC Architektur-Übersicht
Übersicht
Das A320 FMGC ist eine multithreaded .NET 8 Windows Forms Anwendung, aufgebaut auf dem Akka.NET Actor Model. Das System betreibt 13 Actors unter einem einzigen Top-Level Supervisor (FmgcSupervisor), wobei jeder Actor Nachrichten in seinem eigenen dedizierten Thread über ein Akka.NET Mailbox verarbeitet. Diese Architektur eliminiert die 1-2 Sekunden UI-Freezes des originalen VB6 Single-Threaded Designs: MCDU-Seiten antworten in unter 100 ms, unabhängig davon, was der Trajectory-Computation-Actor gerade macht.
Alle Actors werden unter einer OneForOneStrategy überwacht: Wenn ein einzelner Actor abstürzt, wird nur dieser Actor neu gestartet. Geschwister-Actors laufen ohne Unterbrechung weiter.
Actor-Hierarchie
graph TD
FS[FmgcSupervisor] --> KA[KernelActor]
FS --> TA[TrajectoryActor]
FS --> MC[McduCaptainActor]
FS --> MF[McduFoActor]
FS --> GA[GuidanceActor]
FS --> IA[INetActor]
FS --> NA[NavDbActor]
FS --> PF[PrimaryFlightPlanActor]
FS --> SF[SecondaryFlightPlanActor]
FS --> AA[AcarsActor]
FS --> UA[UserdataActor]
FS --> SA[SimBriefActor]
FS --> TM[TmpyActor]
Actor-Pfade
| Actor | Akka-Pfad | Namespace | Hauptaufgabe |
|---|---|---|---|
| FmgcSupervisor | /user/FmgcSupervisor |
A320_FMGC.Kernel | Erstellt und überwacht alle 13 Child-Actors; OneForOneStrategy Restart |
| KernelActor | /user/FmgcSupervisor/KernelActor |
A320_FMGC.Kernel | 1-Sekunden periodischer Tick; assembliert AircraftState aus INET-Register-Cache; triggert Trajectory- und Guidance-Berechnung |
| TrajectoryActor | /user/FmgcSupervisor/TrajectoryActor |
A320_FMGC.Trajectory | 4D Climb/Cruise/Descent Trajectory-Berechnung; Queue-Latest-Only Pattern |
| McduCaptainActor | /user/FmgcSupervisor/McduCaptainActor |
A320_FMGC.Mcdu | Captain MCDU Seiten-Rendering, LSK/Hardkey Eingabe-Dispatch |
| McduFoActor | /user/FmgcSupervisor/McduFoActor |
A320_FMGC.Mcdu | First Officer MCDU Seiten-Rendering, unabhängiger Page State vom Captain |
| GuidanceActor | /user/FmgcSupervisor/GuidanceActor |
A320_FMGC.Guidance | Cross-Track Error, laterale/vertikale Abweichung, Speed Guidance, Radio Nav Autotune |
| INetActor | /user/FmgcSupervisor/INetActor |
A320_FMGC.Inet | Brücke zwischen Akka Actor-Threads und WinForms UI-Thread; sendet/empfängt INET-Register via BroadcastRcv1/INetClient1 |
| NavDbActor | /user/FmgcSupervisor/NavDbActor |
A320_FMGC.NavDb | Serialisiert alle OleDb-Zugriffe auf ASTNAV.mdb über einen einzelnen Thread; antwortet auf Ask-Queries |
| PrimaryFlightPlanActor | /user/FmgcSupervisor/PrimaryFlightPlanActor |
A320_FMGC.FlightPlan | Primärer Flugplan Immutable State; Mutationen über typisierte Nachrichten |
| SecondaryFlightPlanActor | /user/FmgcSupervisor/SecondaryFlightPlanActor |
A320_FMGC.FlightPlan | Sekundärer (Alternate) Flugplan State; unabhängig vom primären |
| AcarsActor | /user/FmgcSupervisor/AcarsActor |
A320_FMGC.Acars | ACARS Nachrichtenverarbeitung; besitzt eigene ACARS.mdb OleDb-Verbindung |
| UserdataActor | /user/FmgcSupervisor/UserdataActor |
A320_FMGC.Userdata | Flight Situation Save/Load und Company Routes via Userdata.mdb |
| SimBriefActor | /user/FmgcSupervisor/SimBriefActor |
A320_FMGC.SimBrief | Lädt SimBrief OFP XML; parst und sendet Routen-/Performance-Daten an KernelActor und FlightPlanActor |
| TmpyActor | /user/FmgcSupervisor/TmpyActor |
A320_FMGC.Mcdu | Verwaltet den temporären Flugplan (TMPY) Lifecycle: Create, Mutate (Insert/Delete/Overfly), Undo, Accept, Erase. Von beiden McduActors über EventStream geteilt. |
Namespace-Zuordnung
| Namespace | Ordner | Wichtige Dateien |
|---|---|---|
| A320_FMGC.Kernel | A320_FMGC/Kernel/ |
FmgcSupervisor.vb, KernelActor.vb, KernelMessages.vb |
| A320_FMGC.Inet | A320_FMGC/Inet/ |
INetActor.vb, INetMessages.vb, Arinc429ScreenBuffer.vb, Arinc429UdpSender.vb, Arinc429Constants.vb |
| A320_FMGC.Mcdu | A320_FMGC/Mcdu/ |
McduActor.vb, McduCommandParser.vb, McduContext.vb, IPage.vb, TmpyActor.vb, TmpyMessages.vb, WaypointInputParser.vb, pages/ |
| A320_FMGC.FlightPlan | A320_FMGC/FlightPlan/ |
FlightPlanActor.vb, FlightPlanModels.vb, FlightPlanMessages.vb, ComputedFlightPlanModels.vb, ComputedFlightPlanBuilder.vb, ComputedFlightPlanMessages.vb |
| A320_FMGC.Trajectory | A320_FMGC/Trajectory/ |
TrajectoryActor.vb, LegGeometry.vb, TrajectoryModels.vb, PerfDataStore.vb, SpeedCalculations.vb, EngineDataStore.vb, EngineCalculations.vb |
| A320_FMGC.Guidance | A320_FMGC/Guidance/ |
GuidanceActor.vb, GuidanceModels.vb, RadioNavModule.vb |
| A320_FMGC.NavDb | A320_FMGC/NavDb/ |
NavDbActor.vb, AirportQueryHandler.vb, NavaidQueryHandler.vb, ProcedureQueryHandler.vb |
| A320_FMGC.Acars | A320_FMGC/Acars/ |
AcarsActor.vb |
| A320_FMGC.Userdata | A320_FMGC/Userdata/ |
UserdataActor.vb |
| A320_FMGC.SimBrief | A320_FMGC/SimBrief/ |
SimBriefActor.vb, SimBriefXmlParser.vb |
| A320_FMGC.Forms | A320_FMGC/Forms/ |
frmSideView.vb, frmMapView.vb, frmComputedFlightPlan.vb, frmComputedFpln.vb, frmTrajectoryLog.vb, frmBITE.vb, frmPointInfo.vb, TrajectorySubscriberActor.vb, BiteSubscriberActor.vb |
| A320_FMGC.Common | A320_FMGC/Common/ |
IniConfiguration.vb |
Threading-Modell
Jeder Akka.NET Actor hat seine eigene Mailbox und verarbeitet Nachrichten einzeln und sequenziell. Es gibt keinen geteilten veränderlichen Zustand zwischen Actors — alle Inter-Actor-Kommunikation verwendet immutable Nachrichten. Wichtige Threading-Eigenschaften:
KernelActor — 1-Sekunden periodischer Tick
: Verwendet IWithTimers.StartPeriodicTimer("kernel-tick", New KernelTick(), TimeSpan.Zero, TimeSpan.FromSeconds(1)). Der Timer wird automatisch abgebrochen, wenn der Actor stoppt. Bei jedem Tick assembliert KernelActor AircraftState aus dem INET-Register-Cache und dispatcht ComputeTrajectory- und GuidanceInput-Nachrichten.
TrajectoryActor — Queue-Latest-Only Pattern
: Verwaltet ein _isComputing-Flag und einen _pendingRequest-Slot. Wenn ein neuer ComputeTrajectory-Request eintrifft, während eine Berechnung läuft, ersetzt er den ausstehenden Request, sodass nur der neueste Zustand berechnet wird. Dies verhindert Trajectory-Queue-Aufbau bei langsamer Berechnung.
McduCaptainActor und McduFoActor — unabhängiger Page State
: Jeder MCDU Actor hält seinen eigenen Page Stack und Context. Der Display State des Captain MCDU ist vollständig vom First Officer isoliert. Beide Actors empfangen identische KernelStateSnapshot-Nachrichten vom EventStream bei jedem Tick.
NavDbActor — serialisierter OleDb-Zugriff
: Alle ASTNAV.mdb Abfragen werden über einen einzelnen Actor-Thread serialisiert. Aufrufer verwenden das Akka.NET Ask+PipeTo Pattern: navDbActor.Ask(Of T)(query).PipeTo(Self). Dies verhindert OleDb-Connection-Contention über Threads hinweg.
INetActor — WinForms UI-Thread-Brücke
: WinForms Controls (BroadcastRcv1, INetClient1) müssen auf dem UI-Thread zugegriffen werden. INetActor verwendet frmMain.BeginInvoke um Aufrufe zurück zum UI-Thread zu marshallen.
Kommunikationsmuster
Drei Message-Passing Patterns werden im gesamten Actor-System verwendet:
Direct Tell (actor.Tell(message))
: Fire-and-Forget von einem Actor zum anderen. Verwendet für alle State-Mutationen und Computation-Trigger. Beispiele: KernelActor teilt TrajectoryActor mit zu berechnen; FmgcSupervisor verdrahtet Actor-Referenzen über SetTrajectoryActorRef, SetFlightPlanActorRefs, etc.
Ask + PipeTo (actor.Ask(Of T)(msg).PipeTo(Self))
: Request-Response ohne die Mailbox des aufrufenden Actors zu blockieren. Die Antwort wird als normale Nachricht zurückgepipet. Verwendet für NavDb-Queries und für KernelActor beim Abrufen von FlightPlanSnapshot von FlightPlanActor bei jedem Tick.
EventStream Publish/Subscribe (Context.System.EventStream.Publish/Subscribe)
: Fan-Out-Broadcast an mehrere Subscriber. Verwendet für: TrajectoryResult, ComputedFlightPlanResult, KernelStateSnapshot, RegisterReceived, und KernelTick. Subscriber registrieren sich in PreStart über die nicht-generische Form: Context.System.EventStream.Subscribe(Self, GetType(T)).
Quelldateien
A320_FMGC/Kernel/FmgcSupervisor.vb— Supervisor, Actor-Erstellung, VerdrahtungA320_FMGC/Kernel/KernelActor.vb— Tick-Zyklus, Register-Cache, Computation-DispatchA320_FMGC/Kernel/KernelMessages.vb— Kernel Message ContractsA320_FMGC/frmMain.vb— Application Entry, Actor System Bootstrap
Dokumentationsseiten
| Nr. | Seite | Thema |
|---|---|---|
| 1 | Architektur-Übersicht | Actor-Hierarchie, Supervision, Threading-Modell, Kommunikationsmuster |
| 2 | Startup und Actor-Initialisierung | Boot-Sequenz, Actor-Erstellungsreihenfolge, PreStart-Verdrahtung |
| 3 | MCDU Tastendruck bis Screen-Update | Input-Routing, Page-Rendering, ARINC 429 Screen Buffer |
| 4 | Flugplan-Lifecycle | Waypoint-Sequenzierung, lateraler/vertikaler Pfad, Constraints |
| 5 | Trajectory Computation Chain | 4D Profile, Wind-Integration, Fuel-Predictions |
| 6 | Guidance und Speed Management | VNAV, Managed Speeds, Altitude Constraints, Radio Nav Autotune |
| 7 | INET Register-Protokoll | Register-Zuordnungen, Kommunikationsfluss, Modul-ID 55 |
| 8 | ARINC 429 Screen Buffer Pipeline | Differentielle Kodierung, XOR-Diff Optimierung |
| 9 | Navigationsdatenbank-Zugriff | OleDb-Zugriff, Airport/Navaid/Procedure Lookups |
| 10 | Externe Integrationen | SimBrief OFP Import, ACARS, Wind-Daten, Cost Index |
| 11 | Trajectory Visualisierung und Diagnostik | frmSideView, frmMapView, frmBITE |
| 12 | Human Verification Tests | Ausstehende Live-MCDU-Tests über alle Audit-Phasen |
| 17b | PERF1 Performance Engine | Tri-lineare Interpolation, verschlüsselte FMGCPERF1.MDB |
| 25 | Trajectory-Berechnung | Zwei-Schicht-Modell (Display + Path), Phase-Boundary Arc Split |
| 26 | Trajectory Modul — Funktionsreferenz | Detaillierte Funktionsdokumentation für TrajectoryActor, LegGeometry, GeoCalculations, SpeedCalculations |
| 27 | Vollständige Funktionsreferenz | Alle Funktionen/Subs im Projekt mit Parametern, Rückgabewerten, Zweck |