From 1e8811a10dbb52cfad4393538a8cc5d5554ebbc7 Mon Sep 17 00:00:00 2001 From: Benjamin Dupont <4503241+Benjozork@users.noreply.github.com> Date: Sat, 9 Nov 2024 17:26:37 -0500 Subject: [PATCH 01/27] feat: initial commit --- .../src/systems/fmgc/src/efis/EfisSymbols.ts | 4 +- .../fmgc/src/flightplanning/plans/FixInfo.ts | 12 +- .../src/flightplanning/plans/FlightPlan.ts | 9 +- .../plans/ObservableFlightPlan.ts | 93 +++++++++ .../plans/ReadonlyFlightPlan.ts | 11 +- .../instruments/src/MFD/MfdPageDirectory.tsx | 3 + .../src/MFD/pages/FMS/F-PLN/MfdFmsFpln.tsx | 2 +- .../pages/FMS/F-PLN/MfdFmsFplnFixInfo.scss | 109 +++++++++++ .../MFD/pages/FMS/F-PLN/MfdFmsFplnFixInfo.tsx | 180 ++++++++++++++++++ .../src/MFD/pages/common/Button.tsx | 15 +- .../src/MFD/pages/common/DataEntryFormats.tsx | 110 ++++++++++- .../src/MFD/pages/common/FmsPage.tsx | 2 +- .../src/MFD/pages/common/InputField.tsx | 68 ++++--- .../src/MFD/pages/common/TopTabNavigator.tsx | 23 ++- .../src/MFD/pages/common/style.scss | 4 + .../systems/navdata/shared/types/BaseFix.ts | 2 + 16 files changed, 593 insertions(+), 54 deletions(-) create mode 100644 fbw-a32nx/src/systems/fmgc/src/flightplanning/plans/ObservableFlightPlan.ts create mode 100644 fbw-a380x/src/systems/instruments/src/MFD/pages/FMS/F-PLN/MfdFmsFplnFixInfo.scss create mode 100644 fbw-a380x/src/systems/instruments/src/MFD/pages/FMS/F-PLN/MfdFmsFplnFixInfo.tsx diff --git a/fbw-a32nx/src/systems/fmgc/src/efis/EfisSymbols.ts b/fbw-a32nx/src/systems/fmgc/src/efis/EfisSymbols.ts index ad2bb74ef2d..5a1cf2e1898 100644 --- a/fbw-a32nx/src/systems/fmgc/src/efis/EfisSymbols.ts +++ b/fbw-a32nx/src/systems/fmgc/src/efis/EfisSymbols.ts @@ -813,8 +813,8 @@ export class EfisSymbols { ident: fixInfo.fix.ident, location: fixInfo.fix.location, type: NdSymbolTypeFlags.FixInfo, - radials: fixInfo.radials.map((it) => it.trueBearing), - radii: fixInfo.radii.map((it) => it.radius), + radials: fixInfo?.radials.map((it) => it.trueBearing), + radii: fixInfo?.radii.map((it) => it.radius), }); } } diff --git a/fbw-a32nx/src/systems/fmgc/src/flightplanning/plans/FixInfo.ts b/fbw-a32nx/src/systems/fmgc/src/flightplanning/plans/FixInfo.ts index cc55adb044d..fc8bca22244 100644 --- a/fbw-a32nx/src/systems/fmgc/src/flightplanning/plans/FixInfo.ts +++ b/fbw-a32nx/src/systems/fmgc/src/flightplanning/plans/FixInfo.ts @@ -3,7 +3,7 @@ // // SPDX-License-Identifier: GPL-3.0 -import { NdbNavaid, VhfNavaid, Waypoint } from '@flybywiresim/fbw-sdk'; +import { AnyFix } from '@flybywiresim/fbw-sdk'; export interface FixInfoRadial { trueBearing: DegreesTrue; @@ -25,15 +25,15 @@ export interface FixInfoRadius { */ export class FixInfoEntry implements FixInfoData { /** The fix concerned by the fix info */ - public readonly fix: Waypoint | VhfNavaid | NdbNavaid; + public fix: AnyFix; /** The radii contained in the fix info */ - public readonly radii?: FixInfoRadius[]; + public radii?: FixInfoRadius[]; /** The radials contained in the fix ino */ - public readonly radials?: FixInfoRadial[]; + public radials?: FixInfoRadial[]; - constructor(fix: Waypoint | VhfNavaid | NdbNavaid, radii?: FixInfoRadius[], radials?: FixInfoRadial[]) { + constructor(fix: AnyFix, radii?: FixInfoRadius[], radials?: FixInfoRadial[]) { this.fix = fix; this.radii = radii; this.radials = radials; @@ -50,7 +50,7 @@ export class FixInfoEntry implements FixInfoData { export interface FixInfoData { /** The fix concerned by the fix info */ - fix: Waypoint | VhfNavaid | NdbNavaid; + fix: AnyFix; /** The radii contained in the fix info */ radii?: FixInfoRadius[]; diff --git a/fbw-a32nx/src/systems/fmgc/src/flightplanning/plans/FlightPlan.ts b/fbw-a32nx/src/systems/fmgc/src/flightplanning/plans/FlightPlan.ts index a4bd7ac8cc1..700a75626de 100644 --- a/fbw-a32nx/src/systems/fmgc/src/flightplanning/plans/FlightPlan.ts +++ b/fbw-a32nx/src/systems/fmgc/src/flightplanning/plans/FlightPlan.ts @@ -311,7 +311,7 @@ export class FlightPlan

(); + + constructor( + private readonly bus: EventBus, + private readonly flightPlanInterface: FlightPlanInterface, + private readonly index: number, + ) { + const plan = flightPlanInterface.get(index); + + this.initializeFromPlan(plan); + } + + public destroy(): void { + for (const subscription of this.subscriptions) { + subscription.destroy(); + } + } + + private initializeFromPlan(plan: BaseFlightPlan): void { + if (plan instanceof FlightPlan) { + for (let i = 0; i < plan.fixInfos.length; i++) { + const fix = plan.fixInfos[i]; + + this._fixInfos[i + 1].set(fix); + } + } + + this.subscriptions.push( + this.flightPlanEventsSubscriber.on('flightPlan.setFixInfoEntry').handle((event) => { + if (event.planIndex !== plan.index) { + return; + } + + const subject = this._fixInfos[event.index]; + + subject.set(event.fixInfo); + }), + ); + } + + private readonly _fixInfos: Record<1 | 2 | 3 | 4, Subject> = { + 1: this.createFixInfoSubject(), + 2: this.createFixInfoSubject(), + 3: this.createFixInfoSubject(), + 4: this.createFixInfoSubject(), + } as const; + public readonly fixInfos: Record<1 | 2 | 3 | 4, Subscribable> = this._fixInfos; + + private createFixInfoSubject(): Subject { + const equalityFunc = (a: FixInfoData | null, b: FixInfoData | null): boolean => { + if ((a === null) !== (b === null)) { + return false; + } + + if (a.fix.databaseId !== b.fix.databaseId) { + return false; + } + + for (let i = 0; i < a.radials.length; i++) { + const aRadial = a.radials[i]; + const bRadial = b.radials[i]; + + if (aRadial !== bRadial) { + return false; + } + } + + for (let i = 0; i < a.radii.length; i++) { + const aRadius = a.radii[i]; + const bRadius = b.radii[i]; + + if (aRadius !== bRadius) { + return false; + } + } + + return true; + }; + + return Subject.create(null, equalityFunc); + } +} diff --git a/fbw-a32nx/src/systems/fmgc/src/flightplanning/plans/ReadonlyFlightPlan.ts b/fbw-a32nx/src/systems/fmgc/src/flightplanning/plans/ReadonlyFlightPlan.ts index ad76795122b..6296f7867a2 100644 --- a/fbw-a32nx/src/systems/fmgc/src/flightplanning/plans/ReadonlyFlightPlan.ts +++ b/fbw-a32nx/src/systems/fmgc/src/flightplanning/plans/ReadonlyFlightPlan.ts @@ -28,11 +28,11 @@ export interface ReadonlyFlightPlan { get version(): number; - get originLeg(): ReadonlyFlightPlanElement; + get originLeg(): ReadonlyFlightPlanElement | undefined; get originLegIndex(): number; - get destinationLeg(): ReadonlyFlightPlanElement; + get destinationLeg(): ReadonlyFlightPlanElement | undefined; get destinationLegIndex(): number; @@ -58,11 +58,14 @@ export interface ReadonlyFlightPlan { get arrivalEnrouteTransition(): ProcedureTransition | undefined; - get arrival(): Arrival | undefined; + /** + * The arrival procedure. If it's `undefined`, it means that no arrival is set. If it's `null`, it means that the "NO STAR" is explicitly selected. + */ + get arrival(): Arrival | undefined | null; get arrivalRunwayTransition(): ProcedureTransition | undefined; - get approachVia(): ProcedureTransition | undefined; + get approachVia(): ProcedureTransition | undefined | null; get approach(): Approach | undefined; diff --git a/fbw-a380x/src/systems/instruments/src/MFD/MfdPageDirectory.tsx b/fbw-a380x/src/systems/instruments/src/MFD/MfdPageDirectory.tsx index 418b4f52c39..ea57d0e7aa3 100644 --- a/fbw-a380x/src/systems/instruments/src/MFD/MfdPageDirectory.tsx +++ b/fbw-a380x/src/systems/instruments/src/MFD/MfdPageDirectory.tsx @@ -27,6 +27,7 @@ import { MfdDisplayInterface } from 'instruments/src/MFD/MFD'; import { MfdUiService } from 'instruments/src/MFD/pages/common/MfdUiService'; import { MfdFmsDataDebug } from 'instruments/src/MFD/pages/FMS/DATA/MfdFmsDataDebug'; import { MfdSurvControls } from 'instruments/src/MFD/pages/SURV/MfdSurvControls'; +import { MfdFmsFplnFixInfo } from './pages/FMS/F-PLN/MfdFmsFplnFixInfo'; export function pageForUrl( url: string, @@ -82,6 +83,8 @@ export function pageForUrl( case 'fms/sec2/f-pln-hold': case 'fms/sec3/f-pln-hold': return ; + case 'fms/active/f-pln-fix-info': + return ; case 'fms/position/irs': return ; case 'fms/position/navaids': diff --git a/fbw-a380x/src/systems/instruments/src/MFD/pages/FMS/F-PLN/MfdFmsFpln.tsx b/fbw-a380x/src/systems/instruments/src/MFD/pages/FMS/F-PLN/MfdFmsFpln.tsx index 10ff1c73c42..9bc6ab8f881 100644 --- a/fbw-a380x/src/systems/instruments/src/MFD/pages/FMS/F-PLN/MfdFmsFpln.tsx +++ b/fbw-a380x/src/systems/instruments/src/MFD/pages/FMS/F-PLN/MfdFmsFpln.tsx @@ -937,7 +937,7 @@ export class MfdFmsFpln extends FmsPage { componentIfFalse={<>} />