From 810666e9267de00e954b0895daa2b931add2f29e Mon Sep 17 00:00:00 2001 From: Florian Gross <63071941+flogross89@users.noreply.github.com> Date: Wed, 24 Apr 2024 04:53:26 +0200 Subject: [PATCH] display arrow, if airport outside range --- .../systems/instruments/src/ND/tsconfig.json | 4 +++- .../src/systems/instruments/src/OANC/Oanc.tsx | 18 ++++++++++++++-- .../src/OANC/OancArcModeCompass.tsx | 21 ++++++++++++++++++- .../src/OANC/OancMovingModeOverlay.tsx | 12 +++++++++++ 4 files changed, 51 insertions(+), 4 deletions(-) diff --git a/fbw-a32nx/src/systems/instruments/src/ND/tsconfig.json b/fbw-a32nx/src/systems/instruments/src/ND/tsconfig.json index a66548247a2..2874005b62d 100644 --- a/fbw-a32nx/src/systems/instruments/src/ND/tsconfig.json +++ b/fbw-a32nx/src/systems/instruments/src/ND/tsconfig.json @@ -28,7 +28,9 @@ "@tcas/*": ["./tcas/src/*"], "@typings/*": ["../../../fbw-common/src/typings/*"], "@flybywiresim/fbw-sdk": ["../../../fbw-common/src/systems/index-no-react.ts"], - "@flybywiresim/navigation-display": ["../../../fbw-common/src/systems/instruments/src/ND/index.ts"] + "@flybywiresim/navigation-display": ["../../../fbw-common/src/systems/instruments/src/ND/index.ts"], + "@flybywiresim/oanc": ["../../../fbw-common/src/systems/instruments/src/OANC/index.ts"], + "@flybywiresim/msfs-avionics-common": ["../../../fbw-common/src/systems/instruments/src/MsfsAvionicsCommon/index.ts"] } } } diff --git a/fbw-common/src/systems/instruments/src/OANC/Oanc.tsx b/fbw-common/src/systems/instruments/src/OANC/Oanc.tsx index faa2e71b2f8..8f28f40dcb5 100644 --- a/fbw-common/src/systems/instruments/src/OANC/Oanc.tsx +++ b/fbw-common/src/systems/instruments/src/OANC/Oanc.tsx @@ -15,7 +15,7 @@ import { BBox, bbox, bboxPolygon, booleanPointInPolygon, centroid, Feature, featureCollection, FeatureCollection, Geometry, LineString, Point, Polygon, Position, } from '@turf/turf'; -import { clampAngle, Coordinates, placeBearingDistance } from 'msfs-geo'; +import { bearingTo, clampAngle, Coordinates, distanceTo, placeBearingDistance } from 'msfs-geo'; import { OansControlEvents } from 'instruments/src/OANC/OansControlEventPublisher'; import { reciprocal } from '@fmgc/guidance/lnav/CommonGeometry'; @@ -245,6 +245,10 @@ export class Oanc extends DisplayComponent> { public readonly aircraftWithinAirport = Subject.create(false); + private readonly airportWithinRange = Subject.create(false); + + private readonly airportBearing = Subject.create(0); + public readonly projectedPpos: Position = [0, 0]; private readonly aircraftOnGround = Subject.create(true); @@ -478,7 +482,6 @@ export class Oanc extends DisplayComponent> { this.dataAirportIata.set(wgs84ReferencePoint.properties.iata); // Figure out the boundaries of the map data - const dataBbox = bbox(airportMap); this.updatePosition(); @@ -788,6 +791,11 @@ export class Oanc extends DisplayComponent> { this.aircraftOnGround.set(![5, 6, 7].includes(SimVar.GetSimVarValue('L:A32NX_FWC_FLIGHT_PHASE', SimVarValueType.Number))); + if (this.arpCoordinates) { + this.airportWithinRange.set(distanceTo(this.ppos, this.arpCoordinates) < (this.props.zoomValues[this.zoomLevelIndex.get()] + 1)); // Add 1nm for airport dimension + this.airportBearing.set(bearingTo(this.ppos, this.arpCoordinates)); + } + if (this.usingPposAsReference.get() || !this.arpCoordinates) { this.referencePos.lat = this.ppos.lat; this.referencePos.long = this.ppos.long; @@ -1207,6 +1215,9 @@ export class Oanc extends DisplayComponent> { ndMode={this.overlayNDModeSub} rotation={this.interpolatedMapHeading} isMapPanned={this.isMapPanned} + airportWithinRange={this.airportWithinRange} + airportBearing={this.airportBearing} + airportIcao={this.dataAirportIcao} /> @@ -1229,6 +1240,9 @@ export class Oanc extends DisplayComponent> { ndMode={this.overlayNDModeSub} rotation={this.interpolatedMapHeading} isMapPanned={this.isMapPanned} + airportWithinRange={this.airportWithinRange} + airportBearing={this.airportBearing} + airportIcao={this.dataAirportIcao} /> ); diff --git a/fbw-common/src/systems/instruments/src/OANC/OancArcModeCompass.tsx b/fbw-common/src/systems/instruments/src/OANC/OancArcModeCompass.tsx index 5c481442575..360fa1639b7 100644 --- a/fbw-common/src/systems/instruments/src/OANC/OancArcModeCompass.tsx +++ b/fbw-common/src/systems/instruments/src/OANC/OancArcModeCompass.tsx @@ -3,7 +3,7 @@ // SPDX-License-Identifier: GPL-3.0 import { Arinc429WordData, MathUtils } from '@flybywiresim/fbw-sdk'; -import { DisplayComponent, EventBus, FSComponent, Subscribable, VNode } from '@microsoft/msfs-sdk'; +import { DisplayComponent, EventBus, FSComponent, MappedSubject, Subscribable, VNode } from '@microsoft/msfs-sdk'; import { Layer } from '../MsfsAvionicsCommon/Layer'; export interface ArcModeOverlayProps { @@ -13,11 +13,16 @@ export interface ArcModeOverlayProps { oansRange: Subscribable, doClip: boolean, yOffset: number, + airportWithinRange: Subscribable, + airportBearing: Subscribable, + airportIcao: Subscribable, } export class ArcModeUnderlay extends DisplayComponent { private readonly rotationValid = this.props.rotation.map((it) => it.isNormalOperation()); + private readonly rotationToAirport = MappedSubject.create(([bearing, rot]) => MathUtils.diffAngle(rot.value, bearing).toFixed(2), this.props.airportBearing, this.props.rotation) + render(): VNode | null { return ( @@ -53,6 +58,20 @@ export class ArcModeUnderlay extends DisplayComponent { clip-path="url(#arc-mode-overlay-clip-2)" /> + + `translate(369 250) rotate(-90) rotate(${it} -370 0)`)} + class="White" + fill="none" + stroke-width={3} + stroke-linecap="round" + visibility={this.props.airportWithinRange.map((it) => (it ? 'hidden' : 'inherit'))} + > + + `translate(60 60) rotate(${-it + 90})`)}> + {this.props.airportIcao} + + ); } diff --git a/fbw-common/src/systems/instruments/src/OANC/OancMovingModeOverlay.tsx b/fbw-common/src/systems/instruments/src/OANC/OancMovingModeOverlay.tsx index 84d4c039af3..6ffa1003b27 100644 --- a/fbw-common/src/systems/instruments/src/OANC/OancMovingModeOverlay.tsx +++ b/fbw-common/src/systems/instruments/src/OANC/OancMovingModeOverlay.tsx @@ -20,6 +20,12 @@ export interface OancMapOverlayProps { ndMode: Subscribable, isMapPanned: Subscribable, + + airportWithinRange: Subscribable, + + airportBearing: Subscribable, + + airportIcao: Subscribable, } export class OancMovingModeOverlay extends DisplayComponent { @@ -63,6 +69,9 @@ export class OancMovingModeOverlay extends DisplayComponent oansRange={this.props.oansRange} doClip={false} yOffset={620 - 384} + airportWithinRange={this.props.airportWithinRange} + airportBearing={this.props.airportBearing} + airportIcao={this.props.airportIcao} /> ); @@ -110,6 +119,9 @@ export class OancStaticModeOverlay extends DisplayComponent oansRange={this.props.oansRange} doClip yOffset={0} + airportWithinRange={this.props.airportWithinRange} + airportBearing={this.props.airportBearing} + airportIcao={this.props.airportIcao} />