Zum Inhalt

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, Verdrahtung
  • A320_FMGC/Kernel/KernelActor.vb — Tick-Zyklus, Register-Cache, Computation-Dispatch
  • A320_FMGC/Kernel/KernelMessages.vb — Kernel Message Contracts
  • A320_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