@@ -48,16 +48,7 @@ class AirspeedIndicatorBase extends DisplayComponent<AirspeedIndicatorProps> {
4848
4949 private readonly vFeNextValue = Arinc429LocalVarConsumerSubject . create ( this . sub . on ( 'prim_v_fe_next' ) ) ;
5050
51- private flightPhase = - 1 ;
52- private declutterMode = 0 ;
53- private crosswindMode = false ;
54- private bitMask = 0 ;
55- private athMode = 0 ;
56- private sDecelVis = Subject . create < String > ( 'none' ) ;
57- private sCrosswindModeOn = Subject . create < String > ( '' ) ;
58- private sCrosswindModeOff = Subject . create < String > ( '' ) ;
5951 private groundSpeedRef = FSComponent . createRef < SVGGElement > ( ) ;
60- private lgRightCompressed = true ;
6152
6253 private spdTape = '' ;
6354 private xWindSpdTape = '' ;
@@ -131,27 +122,6 @@ class AirspeedIndicatorBase extends DisplayComponent<AirspeedIndicatorProps> {
131122 this . xWindSpdTapeRef . instance . style . display = `${ this . xWindSpdTape } ` ;
132123 } ) ;
133124
134- sub
135- . on ( 'decMode' )
136- . whenChanged ( )
137- . handle ( ( value ) => {
138- this . declutterMode = value ;
139- this . setOutline ( ) ;
140- } ) ;
141- sub
142- . on ( 'cWndMode' )
143- . whenChanged ( )
144- . handle ( ( value ) => {
145- this . crosswindMode = value ;
146- this . cwOffsetRef . instance . style . transform = `translate3d(0px, ${ XWIND_TO_AIR_REF_OFFSET } px, 0px)` ;
147- } ) ;
148-
149- sub
150- . on ( 'autoBrakeDecel' )
151- . whenChanged ( )
152- . handle ( ( value ) => {
153- value ? this . sDecelVis . set ( 'block' ) : this . sDecelVis . set ( 'none' ) ;
154- } ) ;
155125 sub ;
156126 this . vFeNextValue . sub ( ( vfe ) => {
157127 if ( vfe . isNormalOperation ( ) ) {
@@ -204,13 +174,6 @@ class AirspeedIndicatorBase extends DisplayComponent<AirspeedIndicatorProps> {
204174 }
205175 this . setOutline ( ) ;
206176 } ) ;
207-
208- sub
209- . on ( 'realTime' )
210- . atFrequency ( 2 )
211- . handle ( ( ) => {
212- //this.crosswindMode ? (DisplayRange = 20) : (DisplayRange = 42);
213- } ) ;
214177 }
215178
216179 render ( ) : VNode {
@@ -231,8 +194,7 @@ class AirspeedIndicatorBase extends DisplayComponent<AirspeedIndicatorProps> {
231194 { /* <path id="SpeedTapeOutlineRight" class="NormalStroke Green" d={this.pathSub} />
232195 <path id="SpeedTapeBelowForty" class="NormalStroke Green" d="m19.031 81 v43" /> */ }
233196
234- { /* <g id="CrosswindVerticalTape" transform="translate(0 -311)" */ }
235- < g id = "CrosswindVerticalTape" ref = { this . cwOffsetRef } >
197+ < g id = "CrosswindVerticalTape" ref = { this . cwOffsetRef } transform = "translate(0 -192)" >
236198 < VerticalTape
237199 tapeValue = { this . speedSub }
238200 lowerLimit = { 30 }
@@ -639,156 +601,95 @@ const getSpeedTapeOffsetAlwaysVisible = (currentSpeed: number, bugSpeed: number)
639601} ;
640602
641603export class AirspeedIndicatorOfftape extends DisplayComponent < { bus : ArincEventBus } > {
642- private readonly sub = this . props . bus . getSubscriber < PrimFeBusBaseEvents > ( ) ;
643-
644- private spdTape = '' ;
645- private xWindSpdTape = '' ;
646- private xWindSpdTapeRef = FSComponent . createRef < SVGGElement > ( ) ;
647- private spdTapeRef = FSComponent . createRef < SVGGElement > ( ) ;
648-
649- private flightPhase = - 1 ;
650- private declutterMode = 0 ;
651- private crosswindMode = false ;
652- private bitMask = 0 ;
653- private athMode = 0 ;
654- private onPower = false ;
655- private finalGnd = false ;
656- private sCrosswindModeOn = Subject . create < String > ( '' ) ;
657- private sCrosswindModeOff = Subject . create < String > ( '' ) ;
658- private decelRef = FSComponent . createRef < SVGTextElement > ( ) ;
659- private decelXwndRef = FSComponent . createRef < SVGTextElement > ( ) ;
660- private spdLimFlagRef = FSComponent . createRef < SVGTextElement > ( ) ;
661- private spdLimFlagXwndRef = FSComponent . createRef < SVGTextElement > ( ) ;
662- private lowerRef = FSComponent . createRef < SVGGElement > ( ) ;
663-
664- private offTapeRef = FSComponent . createRef < SVGGElement > ( ) ;
665- private offTapeRefCw = FSComponent . createRef < SVGGElement > ( ) ;
666-
667- private offTapeFailedRef = FSComponent . createRef < SVGGElement > ( ) ;
668-
669- private onGround = true ;
670-
671- private leftMainGearCompressed = true ;
672-
673- private rightMainGearCompressed = true ;
674-
675- private cwSpdLinesRef = FSComponent . createRef < SVGGElement > ( ) ;
604+ private readonly sub = this . props . bus . getSubscriber < PrimFeBusBaseEvents & HudElems & HUDSimvars & Arinc429Values > ( ) ;
676605
677606 private readonly vMax = Arinc429LocalVarConsumerSubject . create ( this . sub . on ( 'prim_v_max' ) ) ;
607+ private readonly spdTape = ConsumerSubject . create ( this . sub . on ( 'spdTape' ) , '' ) ;
608+ private readonly xWindSpdTape = ConsumerSubject . create ( this . sub . on ( 'xWindSpdTape' ) , '' ) ;
609+ private readonly autoBrakeDecel = ConsumerSubject . create ( this . sub . on ( 'autoBrakeDecel' ) , false ) ;
610+ private readonly leftMainGearCompressed = ConsumerSubject . create ( this . sub . on ( 'leftMainGearCompressed' ) , false ) ;
611+ private readonly rightMainGearCompressed = ConsumerSubject . create ( this . sub . on ( 'rightMainGearCompressed' ) , false ) ;
612+ private readonly speed = Arinc429ConsumerSubject . create ( this . sub . on ( 'speedAr' ) ) ;
678613
679614 private readonly spdLimFlagVisibility = this . vMax . map ( ( vMax ) => ( vMax . isFailureWarning ( ) ? 'block' : 'none' ) ) ;
615+ private readonly spdTapeVis = this . spdTape . map ( ( s ) => ( s == 'block' ? 'block' : 'none' ) ) ;
616+ private readonly xWindSpdTapeVis = this . xWindSpdTape . map ( ( s ) => ( s == 'block' ? 'block' : 'none' ) ) ;
680617
681- onAfterRender ( node : VNode ) : void {
682- super . onAfterRender ( node ) ;
683-
684- const sub = this . props . bus . getSubscriber < HUDSimvars & Arinc429Values & HudElems > ( ) ;
685-
686- sub
687- . on ( 'spdTape' )
688- . whenChanged ( )
689- . handle ( ( v ) => {
690- this . spdTape = v ;
691- this . spdTapeRef . instance . style . display = `${ this . spdTape } ` ;
692- } ) ;
693- sub
694- . on ( 'xWindSpdTape' )
695- . whenChanged ( )
696- . handle ( ( v ) => {
697- this . xWindSpdTape = v ;
698- this . xWindSpdTapeRef . instance . style . display = `${ this . xWindSpdTape } ` ;
699- } ) ;
618+ private readonly onGround = MappedSubject . create (
619+ ( [ lmgc , rmgc ] ) => {
620+ return lmgc || rmgc ;
621+ } ,
622+ this . leftMainGearCompressed ,
623+ this . rightMainGearCompressed ,
624+ ) ;
700625
701- sub
702- . on ( 'decMode' )
703- . whenChanged ( )
704- . handle ( ( value ) => {
705- this . declutterMode = value ;
706- } ) ;
707- sub
708- . on ( 'cWndMode' )
709- . whenChanged ( )
710- . handle ( ( value ) => {
711- this . crosswindMode = value ;
712- this . cwSpdLinesRef . instance . style . transform = `translate3d(0px, ${ - XWIND_FULL_OFFSET + XWIND_TO_AIR_REF_OFFSET } px, 0px)` ;
713- } ) ;
714- sub
715- . on ( 'leftMainGearCompressed' )
716- . whenChanged ( )
717- . handle ( ( g ) => {
718- this . leftMainGearCompressed = g ;
719- this . onGround = this . rightMainGearCompressed || g ;
720- } ) ;
626+ private readonly decelVis = MappedSubject . create ( ( [ autoBrakeDecel ] ) => {
627+ return autoBrakeDecel ? 'block' : 'none' ;
628+ } , this . autoBrakeDecel ) ;
721629
722- sub
723- . on ( 'rightMainGearCompressed' )
724- . whenChanged ( )
725- . handle ( ( g ) => {
726- this . rightMainGearCompressed = g ;
727- this . onGround = this . leftMainGearCompressed || g ;
728- } ) ;
729-
730- sub . on ( 'speedAr' ) . handle ( ( speed ) => {
630+ private readonly isFailed = MappedSubject . create (
631+ ( [ onGround , speed ] ) => {
731632 let airspeedValue : number ;
732- if ( speed . isFailureWarning ( ) || ( speed . isNoComputedData ( ) && ! this . onGround ) ) {
633+ if ( speed . isFailureWarning ( ) || ( speed . isNoComputedData ( ) && ! onGround ) ) {
733634 airspeedValue = NaN ;
734635 } else if ( speed . isNoComputedData ( ) ) {
735636 airspeedValue = 30 ;
736637 } else {
737638 airspeedValue = speed . value ;
738639 }
739640 if ( Number . isNaN ( airspeedValue ) ) {
740- this . offTapeRefCw . instance . classList . add ( 'HiddenElement' ) ;
741- this . offTapeRef . instance . classList . add ( 'HiddenElement' ) ;
742- this . offTapeFailedRef . instance . classList . remove ( 'HiddenElement' ) ;
641+ return true ;
743642 } else {
744- this . offTapeRefCw . instance . classList . remove ( 'HiddenElement' ) ;
745- this . offTapeRef . instance . classList . remove ( 'HiddenElement' ) ;
746- this . offTapeFailedRef . instance . classList . add ( 'HiddenElement' ) ;
747-
748- const clampedSpeed = Math . max ( Math . min ( airspeedValue , 660 ) , 30 ) ;
749- const showLower = clampedSpeed > 72 ;
750-
751- if ( showLower ) {
752- this . lowerRef . instance . setAttribute ( 'visibility' , 'visible' ) ;
753- } else {
754- this . lowerRef . instance . setAttribute ( 'visibility' , 'hidden' ) ;
755- }
643+ return false ;
756644 }
757- } ) ;
645+ } ,
646+ this . onGround ,
647+ this . speed ,
648+ ) ;
758649
759- sub
760- . on ( 'autoBrakeDecel' )
761- . whenChanged ( )
762- . handle ( ( a ) => {
763- if ( a ) {
764- this . decelRef . instance . style . visibility = 'visible' ;
765- } else {
766- this . decelRef . instance . style . visibility = 'hidden' ;
767- }
768- } ) ;
769- }
650+ private readonly showLower = MappedSubject . create ( ( [ speed ] ) => {
651+ const clampedSpeed = Math . max ( Math . min ( speed . value , 660 ) , 30 ) ;
652+ return clampedSpeed > 72 ? 'block' : 'none' ;
653+ } , this . speed ) ;
770654
771655 render ( ) : VNode {
772656 return (
773657 < >
774658 < g id = "offTapeSpeedGroup" >
775- < g id = "crosswind" class = "cwTest" ref = { this . xWindSpdTapeRef } >
776- < g id = "SpeedOfftapeGroup" transform = " translate(95 159)" ref = { this . offTapeRefCw } >
777- < g ref = { this . cwSpdLinesRef } >
778- < path id = "SpeedTapeOutlineRight" class = "NormalStroke Green" d = "m87 -40 v 182" > </ path >
779- < path id = "SpeedTapeOutlineUpper" class = "NormalStroke Green" d = "m16 -40 h 98" > </ path >
780- < path id = "SpeedTapeOutlineLower" class = "NormalStroke Green" d = "m16 142 h 98" > </ path >
781- < path class = "Fill Green SmallOutline" d = "m 62 49 v 4 h 28 l 15.614 5.745 v -15.119 l -15.614 5.745z" />
659+ < g id = "crosswind" class = "cwTest" display = { this . xWindSpdTapeVis } >
660+ < g
661+ id = "SpeedOfftapeGroup"
662+ transform = " translate(95 159)"
663+ display = { this . isFailed . map ( ( v ) => {
664+ ! v ? 'block' : 'none' ;
665+ } ) }
666+ >
667+ < g id = "cwOfftapeFailedGroup" >
668+ < path id = "SpeedTapeOutlineRight" class = "NormalStroke Green" d = "m87 79 v 182" > </ path >
669+ < path id = "SpeedTapeOutlineUpper" class = "NormalStroke Green" d = "m16 79 h 98" > </ path >
670+ < path id = "SpeedTapeOutlineLower" class = "NormalStroke Green" d = "m16 261 h 98" > </ path >
671+ < path class = "Fill Green SmallOutline" d = "m 62 168 v 4 h 28 l 15.614 5.745 v -15.119 l -15.614 5.745z" />
782672 </ g >
783673
784674 < SpeedTarget bus = { this . props . bus } mode = { WindMode . CrossWind } />
785675
786676 < CrosswindDigitalSpeedReadout bus = { this . props . bus } />
787677 </ g >
788678 </ g >
789- < g id = "normal" ref = { this . spdTapeRef } >
790- < g id = "SpeedOfftapeGroup" transform = " translate(95 159)" ref = { this . offTapeRef } >
791- < g id = "OfftapeFailedGroup" ref = { this . offTapeFailedRef } >
679+ < g id = "normal" display = { this . spdTapeVis } >
680+ < g
681+ id = "SpeedOfftapeGroup"
682+ transform = " translate(95 159)"
683+ display = { this . isFailed . map ( ( v ) => {
684+ ! v ? 'block' : 'none' ;
685+ } ) }
686+ >
687+ < g
688+ id = "OfftapeFailedGroup"
689+ display = { this . isFailed . map ( ( v ) => {
690+ v ? 'block' : 'none' ;
691+ } ) }
692+ >
792693 < path id = "SpeedTapeOutlineRight" class = "NormalStroke Green" d = "m87 170 v 383" />
793694 < path id = "SpeedTapeOutlineUpper" class = "NormalStroke Green" d = "m16 170 h 98" />
794695 < path id = "SpeedTapeOutlineLower" class = "NormalStroke Green" d = "m16 553 h 98" />
@@ -797,15 +698,15 @@ export class AirspeedIndicatorOfftape extends DisplayComponent<{ bus: ArincEvent
797698 < path id = "SpeedTapeOutlineRight" class = "NormalStroke Green" d = "m87 170 v 383" />
798699 < path id = "SpeedTapeOutlineUpper" class = "NormalStroke Green" d = "m16 170 h 98" />
799700 < SpeedTarget bus = { this . props . bus } mode = { WindMode . Normal } />
800- < text id = "AutoBrkDecel" ref = { this . decelRef } class = "FontMedium EndAlign Green" x = "91.9425" y = "578.565" >
701+ < text id = "AutoBrkDecel" display = { this . decelVis } class = "FontMedium EndAlign Green" x = "91.9425" y = "578.565" >
801702 DECEL
802703 </ text >
803704 < path
804705 class = "Fill Green SmallOutline"
805706 d = "m62.763 360.863v3.254h29.367l14.006 5.153v-13.562l-14.006 5.153z"
806707 />
807708 < path class = "Fill Green SmallOutline" d = "m0.415 364.115v-3.254h9.035v3.254z" />
808- < path id = "SpeedTapeOutlineLower" ref = { this . lowerRef } class = "NormalStroke Green" d = "m16 553 h 98" />
709+ < path id = "SpeedTapeOutlineLower" display = { this . showLower } class = "NormalStroke Green" d = "m16 553 h 98" />
809710 < text
810711 id = "SpdLimFailTextUpper"
811712 x = "143.7"
@@ -1761,17 +1662,10 @@ interface GroundSpeedIndicatorData {
17611662}
17621663
17631664class GroundSpeedIndicator extends DisplayComponent < { bus : EventBus } > {
1764- private flightPhase = - 1 ;
1765- private declutterMode = 0 ;
1766- private sVisibility = Subject . create ( 'none' ) ;
17671665 private readonly groundSpeedRef = FSComponent . createRef < SVGTextElement > ( ) ;
17681666
1769- private readonly trueAirSpeedRef = FSComponent . createRef < SVGTextElement > ( ) ;
1770-
17711667 private readonly groundSpeedRegister = Arinc429RegisterSubject . createEmpty ( ) ;
17721668
1773- private readonly trueAirSpeedRegister = Arinc429RegisterSubject . createEmpty ( ) ;
1774-
17751669 private readonly sub = this . props . bus . getSubscriber < HUDSimvars & HudElems > ( ) ;
17761670
17771671 private readonly data : GroundSpeedIndicatorData = {
0 commit comments