From bce7ec4d9bb1df63d4e3fac8047e19bad55c7cfc Mon Sep 17 00:00:00 2001 From: Michael Corcoran Date: Sun, 25 Jan 2026 01:53:50 +1300 Subject: [PATCH 1/5] fix(a32nx/fwc): implement memo logic in fwc --- fbw-a32nx/docs/a320-simvars.md | 10 +-- .../src/MCDU/legacy/A32NX_Core/A32NX_FWC.ts | 90 ------------------- .../systems-host/systems/FWC/PseudoFWC.ts | 90 +++++++++++++------ 3 files changed, 63 insertions(+), 127 deletions(-) diff --git a/fbw-a32nx/docs/a320-simvars.md b/fbw-a32nx/docs/a320-simvars.md index c6b7c0cf356..9100c566872 100644 --- a/fbw-a32nx/docs/a320-simvars.md +++ b/fbw-a32nx/docs/a320-simvars.md @@ -25,7 +25,7 @@ - [Flight Augmentation Computer (FAC)](#flight-augmentation-computer-fac) - [Flaps / Slats (ATA 27)](#flaps--slats-ata-27) - [Flight Controls (ATA 27)](#flight-controls-ata-27) - - [Fuel (ATA 28)](#fuel-ata-28) + - [Fuel ATA 28](#fuel-ata-28) - [Indication and Recording Systems (ATA 31)](#indication-and-recording-systems-ata-31) - [DMC](#dmc) - [ARINC429 Output Bus](#arinc429-output-bus) @@ -292,14 +292,6 @@ - Bool - Set to true in a non-cold and dark flight phase to skip the initial memorization step -- A32NX_FWC_TOMEMO - - Bool - - True when the FWC decides that the takeoff memo should be shown - -- A32NX_FWC_LDGMEMO - - Bool - - True when the FWC decides that the landing memo should be shown - - A32NX_FWC_INHIBOVRD - Bool - True when the FWC decides that flight phase inhibits should be overridden (and ignored) diff --git a/fbw-a32nx/src/systems/instruments/src/MCDU/legacy/A32NX_Core/A32NX_FWC.ts b/fbw-a32nx/src/systems/instruments/src/MCDU/legacy/A32NX_Core/A32NX_FWC.ts index f2ed314d822..a147c54078c 100644 --- a/fbw-a32nx/src/systems/instruments/src/MCDU/legacy/A32NX_Core/A32NX_FWC.ts +++ b/fbw-a32nx/src/systems/instruments/src/MCDU/legacy/A32NX_Core/A32NX_FWC.ts @@ -1,6 +1,5 @@ // @ts-strict-ignore import { - Arinc429Register, Arinc429Word, NXLogicConfirmNode, NXLogicMemoryNode, @@ -9,13 +8,8 @@ import { // FIXME move to PseudoFWC export class A32NX_FWC { - // momentary - private toConfigTest = false; // WTOCT - // persistent private flightPhase = null; - private ldgMemo = null; - private toMemo = null; // ESDL 1. 0. 60 private gndMemo = new NXLogicConfirmNode(1); // outptuts ZGND @@ -46,34 +40,8 @@ export class A32NX_FWC { private phase5Memo = new NXLogicTriggeredMonostableNode(120); // MTRIG 01 private phase67Memo = new NXLogicTriggeredMonostableNode(180); // MTRIG 02 - // ESDL 1. 0.180 - private memoTo_conf01 = new NXLogicConfirmNode(120, true); // CONF 01 - private memoTo_memo = new NXLogicMemoryNode(false); - - // ESDL 1. 0.190 - private memoLdgMemo_conf01 = new NXLogicConfirmNode(1, true); // CONF 01 - private memoLdgMemo_inhibit = new NXLogicMemoryNode(false); - private memoLdgMemo_conf02 = new NXLogicConfirmNode(10, true); // CONF 01 - private memoLdgMemo_below2000ft = new NXLogicMemoryNode(true); - - // ESDL 1. 0.310 - private memoToInhibit_conf01 = new NXLogicConfirmNode(3, true); // CONF 01 - - // ESDL 1. 0.320 - private memoLdgInhibit_conf01 = new NXLogicConfirmNode(3, true); // CONF 01 - - private readonly ecpWarningButtonStatus = Arinc429Register.empty(); - update(_deltaTime, _core) { this._updateFlightPhase(_deltaTime); - this._updateButtons(_deltaTime); - this._updateTakeoffMemo(_deltaTime); - this._updateLandingMemo(_deltaTime); - } - - _updateButtons(_deltaTime) { - this.ecpWarningButtonStatus.setFromSimVar('L:A32NX_ECP_WARNING_SWITCH_WORD'); - this.toConfigTest = this.ecpWarningButtonStatus.bitValue(18); } _updateFlightPhase(_deltaTime) { @@ -226,62 +194,4 @@ export class A32NX_FWC { this.flightPhase = flightPhase; SimVar.SetSimVarValue('L:A32NX_FWC_FLIGHT_PHASE', 'Enum', this.flightPhase || 0); } - - _updateTakeoffMemo(_deltaTime) { - /// FWC ESLD 1.0.180 - const setFlightPhaseMemo = this.flightPhase === 2 && this.toConfigTest; - const resetFlightPhaseMemo = - this.flightPhase === 10 || this.flightPhase === 3 || this.flightPhase === 1 || this.flightPhase === 6; - const flightPhaseMemo = this.memoTo_memo.write(setFlightPhaseMemo, resetFlightPhaseMemo); - - const eng1NotRunning = SimVar.GetSimVarValue('ENG N1 RPM:1', 'Percent') < 15; - const eng2NotRunning = SimVar.GetSimVarValue('ENG N1 RPM:2', 'Percent') < 15; - const toTimerElapsed = this.memoTo_conf01.write(!eng1NotRunning && !eng2NotRunning, _deltaTime); - - this.toMemo = flightPhaseMemo || (this.flightPhase === 2 && toTimerElapsed); - SimVar.SetSimVarValue('L:A32NX_FWC_TOMEMO', 'Bool', this.toMemo); - } - - _updateLandingMemo(_deltaTime) { - const radioHeight1 = Arinc429Word.fromSimVarValue('L:A32NX_RA_1_RADIO_ALTITUDE'); - const radioHeight2 = Arinc429Word.fromSimVarValue('L:A32NX_RA_2_RADIO_ALTITUDE'); - const radioHeight1Invalid = radioHeight1.isFailureWarning() || radioHeight1.isNoComputedData(); - const radioHeight2Invalid = radioHeight2.isFailureWarning() || radioHeight2.isNoComputedData(); - const gearDownlocked = SimVar.GetSimVarValue('GEAR TOTAL PCT EXTENDED', 'percent') > 0.95; - - // FWC ESLD 1.0.190 - const setBelow2000ft = - (radioHeight1.value < 2000 && !radioHeight1Invalid) || (radioHeight2.value < 2000 && !radioHeight2Invalid); - const resetBelow2000ft = - (radioHeight1.value > 2200 || radioHeight1Invalid) && (radioHeight2.value > 2200 || radioHeight2Invalid); - const memo2 = this.memoLdgMemo_below2000ft.write(setBelow2000ft, resetBelow2000ft); - - const setInhibitMemo = this.memoLdgMemo_conf01.write( - resetBelow2000ft && !radioHeight1Invalid && !radioHeight2Invalid, - _deltaTime, - ); - const resetInhibitMemo = !(this.flightPhase === 7 || this.flightPhase === 8 || this.flightPhase === 6); - const memo1 = this.memoLdgMemo_inhibit.write(setInhibitMemo, resetInhibitMemo); - - const showInApproach = memo1 && memo2 && this.flightPhase === 6; - - const invalidRadioMemo = this.memoLdgMemo_conf02.write( - radioHeight1Invalid && radioHeight2Invalid && gearDownlocked && this.flightPhase === 6, - _deltaTime, - ); - - this.ldgMemo = showInApproach || invalidRadioMemo || this.flightPhase === 8 || this.flightPhase === 7; - SimVar.SetSimVarValue('L:A32NX_FWC_LDGMEMO', 'Bool', this.ldgMemo); - } - - hasAltitudeConstraint() { - // FIXME SUSSY code reading an LVar that's never written - if ( - Simplane.getAutoPilotAltitudeManaged() && - SimVar.GetSimVarValue('L:AP_CURRENT_TARGET_ALTITUDE_IS_CONSTRAINT', 'number') != 0 - ) { - return false; - } - return true; - } } diff --git a/fbw-a32nx/src/systems/systems-host/systems/FWC/PseudoFWC.ts b/fbw-a32nx/src/systems/systems-host/systems/FWC/PseudoFWC.ts index ddf375964e8..3c2fdf9b609 100644 --- a/fbw-a32nx/src/systems/systems-host/systems/FWC/PseudoFWC.ts +++ b/fbw-a32nx/src/systems/systems-host/systems/FWC/PseudoFWC.ts @@ -1157,9 +1157,15 @@ export class PseudoFWC { private readonly fac1Failed = Subject.create(0); - private readonly toMemo = Subject.create(0); + private readonly toMemo = Subject.create(false); + private readonly toMemoFlipFlop = new NXLogicMemoryNode(false); + private readonly toMemoConf = new NXLogicConfirmNode(120, true); - private readonly ldgMemo = Subject.create(0); + private readonly ldgMemo = Subject.create(false); + private readonly ldgMemoConf1 = new NXLogicConfirmNode(1, true); + private readonly ldgMemoConf2 = new NXLogicConfirmNode(10, true); + private readonly ldgMemoFlipFlop1 = new NXLogicMemoryNode(false); + private readonly ldgMemoFlipFlop2 = new NXLogicMemoryNode(true); private readonly autoBrake = Subject.create(0); @@ -1686,12 +1692,8 @@ export class PseudoFWC { this.fac1Failed.set(SimVar.GetSimVarValue('L:A32NX_FBW_FAC_FAILED:1', 'boost psi')); - this.toMemo.set(SimVar.GetSimVarValue('L:A32NX_FWC_TOMEMO', 'bool')); - this.autoBrake.set(SimVar.GetSimVarValue('L:A32NX_AUTOBRAKES_ARMED_MODE', 'enum')); - this.ldgMemo.set(SimVar.GetSimVarValue('L:A32NX_FWC_LDGMEMO', 'bool')); - this.fuel.set(SimVar.GetSimVarValue('A:INTERACTIVE POINT OPEN:9', 'percent')); this.usrStartRefueling.set(SimVar.GetSimVarValue('L:A32NX_REFUEL_STARTED_BY_USR', 'bool')); this.engSelectorPosition.set(SimVar.GetSimVarValue('L:XMLVAR_ENG_MODE_SEL', 'Enum')); @@ -1759,6 +1761,7 @@ export class PseudoFWC { const adr3MaxCas = Arinc429Word.fromSimVarValue('L:A32NX_ADIRS_ADR_3_MAX_AIRSPEED'); const adr1Discrete1 = Arinc429Word.fromSimVarValue('L:A32NX_ADIRS_ADR_1_DISCRETE_WORD_1'); const adr2Discrete1 = Arinc429Word.fromSimVarValue('L:A32NX_ADIRS_ADR_2_DISCRETE_WORD_1'); + const adr3Discrete1 = Arinc429Word.fromSimVarValue('L:A32NX_ADIRS_ADR_3_DISCRETE_WORD_1'); /* LANDING GEAR AND LIGHTS acquisition */ @@ -1803,6 +1806,13 @@ export class PseudoFWC { mainGearDownlocked && (this.lgciu1DiscreteWord1.bitValueOr(25, false) || this.lgciu2DiscreteWord1.bitValueOr(25, false)); + // ra validity + const eitherRaInvalid = this.radioHeight1.isFailureWarning() || this.radioHeight2.isFailureWarning(); + const bothRaInvalid = this.radioHeight1.isFailureWarning() && this.radioHeight2.isFailureWarning(); + const bothRaInvalidOrNcd = + (this.radioHeight1.isNoComputedData || this.radioHeight1.isFailureWarning()) && + (this.radioHeight2.isNoComputedData() || this.radioHeight2.isFailureWarning()); + // on ground logic const lgciu1Disagree = xor(leftCompressedHardwireLgciu1, this.lgciu1DiscreteWord2.bitValue(13)); this.lgciu1OnGroundDisagreeConf.write(lgciu1Disagree, deltaTime); @@ -1827,7 +1837,6 @@ export class PseudoFWC { leftCompressedHardwireLgciu2 && this.lgciu2DiscreteWord2.bitValue(13); - // TODO some renaming this.ignoreRaOnGroundTrigger.write( this.radioHeight1.isNoComputedData() && this.radioHeight2.isNoComputedData() && !lgciuOnGroundDisagree, deltaTime, @@ -1852,11 +1861,10 @@ export class PseudoFWC { ra1OnGround, ra2OnGround, ); - const raInvalid = this.radioHeight1.isFailureWarning() || this.radioHeight2.isFailureWarning(); this.onGroundImmediate = (onGroundA && this.ignoreRaOnGroundTrigger.read()) || - (onGroundCount > 2 && !raInvalid) || - (onGroundCount > 1 && raInvalid); + (onGroundCount > 2 && !eitherRaInvalid) || + (onGroundCount > 1 && eitherRaInvalid); this.aircraftOnGround.set(this.onGroundConf.write(this.onGroundImmediate, deltaTime)); // AP OFF Voluntary @@ -2122,6 +2130,38 @@ export class PseudoFWC { ); this.engine1Or2Running = this.engine1CoreAtOrAboveMinIdle.get() || this.engine2CoreAtOrAboveMinIdle.get(); + // Memo + this.toMemoFlipFlop.write( + (flightPhase === 2 || flightPhase === 9) && toConfigTest, + flightPhase === 1 || flightPhase === 3 || flightPhase === 6 || flightPhase === 10, + ); + this.toMemoConf.write(this.engine1Or2Running, deltaTime); + this.toMemo.set(this.toMemoFlipFlop.read() || (this.toMemoConf.read() && flightPhase === 2)); + + const bothRaAbove2200OrInvalid = this.radioHeight1.valueOr(2500) > 2200 && this.radioHeight2.valueOr(2500) > 2200; + this.ldgMemoConf1.write(!bothRaInvalidOrNcd && bothRaAbove2200OrInvalid, deltaTime); + this.ldgMemoConf2.write( + this.radioHeight1.isInvalid() && + this.radioHeight2.isInvalid() && + this.isAllGearDownlocked && + !(adr1Discrete1.bitValue(12) || adr2Discrete1.bitValue(12) || adr3Discrete1.bitValue(12)) && + flightPhase === 6, + deltaTime, + ); + this.ldgMemoFlipFlop1.write(this.ldgMemoConf1.read(), !this.flightPhase678.get()); + this.ldgMemoFlipFlop2.write( + this.radioHeight1.valueOr(2500) < 2000 || this.radioHeight2.valueOr(2500) < 2000, + bothRaAbove2200OrInvalid, + ); + this.ldgMemo.set( + (this.ldgMemoFlipFlop1.read() && this.ldgMemoFlipFlop2.read() && flightPhase === 6) || + this.ldgMemoConf2.read() || + flightPhase === 7 || + flightPhase === 8, + ); + + const configMemoComputed = this.toMemo.get() || this.ldgMemo.get(); + // DMC/IR general logic const dmcLeftIr1DiscreteWord = this.dmcLeftIr1DiscreteWord.get(); this.ir1InAttAlign.set( @@ -2162,7 +2202,6 @@ export class PseudoFWC { dmcLeftSelectedIrDiscreteWord.bitValue(29) && !dmcLeftSelectedIrDiscreteWord.isNoComputedData(); const rightInAlignSubmode = dmcRightSelectedIrDiscreteWord.bitValue(29) && !dmcRightSelectedIrDiscreteWord.isNoComputedData(); - const configMemoComputed = this.toMemo.get() || this.ldgMemo.get(); this.irsInAlignMemo1.set( (this.oneIrsInAlign || leftInAlignSubmode || rightInAlignSubmode) && (flightPhase === 1 || flightPhase === 2) && @@ -2197,7 +2236,6 @@ export class PseudoFWC { !(adr1Discrete1.isNormalOperation() || adr1Discrete1.isFunctionalTest()) || !(adr2Discrete1.isNormalOperation() || adr2Discrete1.isFunctionalTest()) ) { - const adr3Discrete1 = Arinc429Word.fromSimVarValue('L:A32NX_ADIRS_ADR_3_DISCRETE_WORD_1'); overspeedWarning ||= adr3Discrete1.bitValueOr(9, false); } overspeedWarning ||= adr1Discrete1.bitValueOr(9, false) || adr2Discrete1.bitValueOr(9, false); @@ -2895,10 +2933,6 @@ export class PseudoFWC { !this.eng1Or2TakeoffPower.get() && below750Ra && gearNotDownlocked; - const bothRaInvalid = this.radioHeight1.isFailureWarning() && this.radioHeight2.isFailureWarning(); - const bothRaInvalidOrNcd = - (this.radioHeight1.isNoComputedData || this.radioHeight1.isFailureWarning()) && - (this.radioHeight2.isNoComputedData() || this.radioHeight2.isFailureWarning()); const flapsApprCondition = ((this.flapsSuperiorToPositionD.get() && !this.flapsSuperiorToPositionF.get() && bothRaInvalid) || (this.flapsSuperiorToPositionF.get() && bothRaInvalidOrNcd)) && @@ -5332,8 +5366,8 @@ export class PseudoFWC { ewdMessageMemos: EWDMessageDict = { '0000010': { // T.O MEMO - flightPhaseInhib: [1, 3, 6, 10], - simVarIsActive: this.toMemo.map((t) => !!t), + flightPhaseInhib: [], + simVarIsActive: this.toMemo, whichCodeToReturn: () => [ this.autoBrake.get() === 3 ? 1 : 0, SimVar.GetSimVarValue('L:A32NX_NO_SMOKING_MEMO', 'bool') === 1 && @@ -5366,8 +5400,8 @@ export class PseudoFWC { }, '0000020': { // LANDING MEMO - flightPhaseInhib: [1, 2, 3, 4, 5, 9, 10], - simVarIsActive: this.ldgMemo.map((t) => !!t), + flightPhaseInhib: [], + simVarIsActive: this.ldgMemo, whichCodeToReturn: () => [ this.isAllGearDownlocked ? 1 : 0, SimVar.GetSimVarValue('L:XMLVAR_SWITCH_OVHD_INTLT_NOSMOKING_Position', 'enum') !== 2 && @@ -5423,7 +5457,7 @@ export class PseudoFWC { whichCodeToReturn: () => [0], codesToReturn: ['000005001'], - memoInhibit: () => this.toMemo.get() === 1 || this.ldgMemo.get() === 1, + memoInhibit: () => this.toMemo.get() || this.ldgMemo.get(), failure: 0, sysPage: -1, side: 'LEFT', @@ -5557,7 +5591,7 @@ export class PseudoFWC { simVarIsActive: this.spoilersArmed, whichCodeToReturn: () => [0], codesToReturn: ['000005501'], - memoInhibit: () => this.toMemo.get() === 1 || this.ldgMemo.get() === 1, + memoInhibit: () => this.toMemo.get() || this.ldgMemo.get(), failure: 0, sysPage: -1, side: 'LEFT', @@ -5568,7 +5602,7 @@ export class PseudoFWC { simVarIsActive: this.seatBelt.map((v) => !!v), whichCodeToReturn: () => [0], codesToReturn: ['000008001'], - memoInhibit: () => this.toMemo.get() === 1 || this.ldgMemo.get() === 1, + memoInhibit: () => this.toMemo.get() || this.ldgMemo.get(), failure: 0, sysPage: -1, side: 'LEFT', @@ -5583,7 +5617,7 @@ export class PseudoFWC { ), whichCodeToReturn: () => [0], codesToReturn: ['000009001'], - memoInhibit: () => this.toMemo.get() === 1 || this.ldgMemo.get() === 1, + memoInhibit: () => this.toMemo.get() || this.ldgMemo.get(), failure: 0, sysPage: -1, side: 'LEFT', @@ -5598,7 +5632,7 @@ export class PseudoFWC { ), whichCodeToReturn: () => [0], codesToReturn: ['000009501'], - memoInhibit: () => this.toMemo.get() === 1 || this.ldgMemo.get() === 1, + memoInhibit: () => this.toMemo.get() || this.ldgMemo.get(), failure: 0, sysPage: -1, side: 'LEFT', @@ -5613,7 +5647,7 @@ export class PseudoFWC { ), whichCodeToReturn: () => [0], codesToReturn: ['000010001'], - memoInhibit: () => this.toMemo.get() === 1 || this.ldgMemo.get() === 1, + memoInhibit: () => this.toMemo.get() || this.ldgMemo.get(), failure: 0, sysPage: -1, side: 'LEFT', @@ -5628,7 +5662,7 @@ export class PseudoFWC { ), whichCodeToReturn: () => [0], codesToReturn: ['000010501'], // config memo - memoInhibit: () => this.toMemo.get() === 1 || this.ldgMemo.get() === 1, + memoInhibit: () => this.toMemo.get() || this.ldgMemo.get(), failure: 0, sysPage: -1, side: 'LEFT', @@ -5639,7 +5673,7 @@ export class PseudoFWC { simVarIsActive: this.gpwsFlapMode.map((v) => !!v), whichCodeToReturn: () => [0], codesToReturn: ['000030501'], // Not inhibited - memoInhibit: () => this.toMemo.get() === 1 || this.ldgMemo.get() === 1, + memoInhibit: () => this.toMemo.get() || this.ldgMemo.get(), failure: 0, sysPage: -1, side: 'LEFT', From a0465f3ba664863355f9337c0eae3ad7f8bf0be4 Mon Sep 17 00:00:00 2001 From: Michael Corcoran Date: Sun, 25 Jan 2026 02:06:16 +1300 Subject: [PATCH 2/5] fix(a32nx/fwc): fix missing memo inhibits --- fbw-a32nx/src/systems/systems-host/systems/FWC/PseudoFWC.ts | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/fbw-a32nx/src/systems/systems-host/systems/FWC/PseudoFWC.ts b/fbw-a32nx/src/systems/systems-host/systems/FWC/PseudoFWC.ts index 3c2fdf9b609..dbc9a14a918 100644 --- a/fbw-a32nx/src/systems/systems-host/systems/FWC/PseudoFWC.ts +++ b/fbw-a32nx/src/systems/systems-host/systems/FWC/PseudoFWC.ts @@ -5501,7 +5501,7 @@ export class PseudoFWC { } }, codesToReturn: [], - memoInhibit: () => false, + memoInhibit: () => this.toMemo.get() || this.ldgMemo.get(), failure: 0, sysPage: -1, side: 'LEFT', @@ -5547,7 +5547,7 @@ export class PseudoFWC { } }, codesToReturn: [], - memoInhibit: () => false, + memoInhibit: () => this.toMemo.get() || this.ldgMemo.get(), failure: 0, sysPage: -1, side: 'LEFT', @@ -5580,7 +5580,7 @@ export class PseudoFWC { } }, codesToReturn: [], - memoInhibit: () => false, + memoInhibit: () => this.toMemo.get() || this.ldgMemo.get(), failure: 0, sysPage: -1, side: 'LEFT', From 5aff1f8a46c252366f5dcfe10dc502fb75fbd330 Mon Sep 17 00:00:00 2001 From: Michael Corcoran Date: Sun, 25 Jan 2026 02:48:35 +1300 Subject: [PATCH 3/5] docs: changelog --- .github/CHANGELOG.md | 1 + 1 file changed, 1 insertion(+) diff --git a/.github/CHANGELOG.md b/.github/CHANGELOG.md index f2b23f997ff..e7c6970caf8 100644 --- a/.github/CHANGELOG.md +++ b/.github/CHANGELOG.md @@ -68,6 +68,7 @@ 1. [A32NX/GPWS] Implement simulated GPWC in rust systems - @lukecologne (luke) 1. [A32NX/FWC] Improve CAB PR LO DIFF PR warning logic to avoid spurious warnings - @tracernz (Mike) 1. [A32NX/FWS] Fixed stall warning not working - @tracernz (Mike) +1. [A32NX/FWS] Fixed takeoff memo not working in flight phase 9 (after landing) - @tracernz (Mike) ## 0.14.0 From 44c0028d52a00ecde83ed3a78e98370de21845fd Mon Sep 17 00:00:00 2001 From: Michael Corcoran Date: Sun, 25 Jan 2026 12:02:05 +1300 Subject: [PATCH 4/5] fix: method call Co-authored-by: BravoMike99 <119708186+BravoMike99@users.noreply.github.com> --- fbw-a32nx/src/systems/systems-host/systems/FWC/PseudoFWC.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/fbw-a32nx/src/systems/systems-host/systems/FWC/PseudoFWC.ts b/fbw-a32nx/src/systems/systems-host/systems/FWC/PseudoFWC.ts index dbc9a14a918..b7efa35ac8f 100644 --- a/fbw-a32nx/src/systems/systems-host/systems/FWC/PseudoFWC.ts +++ b/fbw-a32nx/src/systems/systems-host/systems/FWC/PseudoFWC.ts @@ -1810,7 +1810,7 @@ export class PseudoFWC { const eitherRaInvalid = this.radioHeight1.isFailureWarning() || this.radioHeight2.isFailureWarning(); const bothRaInvalid = this.radioHeight1.isFailureWarning() && this.radioHeight2.isFailureWarning(); const bothRaInvalidOrNcd = - (this.radioHeight1.isNoComputedData || this.radioHeight1.isFailureWarning()) && + (this.radioHeight1.isNoComputedData() || this.radioHeight1.isFailureWarning()) && (this.radioHeight2.isNoComputedData() || this.radioHeight2.isFailureWarning()); // on ground logic From 87611a9953a24aa39144799cc12b119d5bc9139c Mon Sep 17 00:00:00 2001 From: Michael Corcoran Date: Sun, 25 Jan 2026 14:38:48 +1300 Subject: [PATCH 5/5] docs: fix fuel section title and missing linefeed --- fbw-a32nx/docs/a320-simvars.md | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/fbw-a32nx/docs/a320-simvars.md b/fbw-a32nx/docs/a320-simvars.md index 9100c566872..3ffa609c1e9 100644 --- a/fbw-a32nx/docs/a320-simvars.md +++ b/fbw-a32nx/docs/a320-simvars.md @@ -25,7 +25,7 @@ - [Flight Augmentation Computer (FAC)](#flight-augmentation-computer-fac) - [Flaps / Slats (ATA 27)](#flaps--slats-ata-27) - [Flight Controls (ATA 27)](#flight-controls-ata-27) - - [Fuel ATA 28](#fuel-ata-28) + - [Fuel (ATA 28)](#fuel-ata-28) - [Indication and Recording Systems (ATA 31)](#indication-and-recording-systems-ata-31) - [DMC](#dmc) - [ARINC429 Output Bus](#arinc429-output-bus) @@ -3926,7 +3926,8 @@ In the variables below, {number} should be replaced with one item in the set: { - Percent - Trim wheel position in percent -## Fuel ATA 28 +## Fuel (ATA 28) + - A32NX_TOTAL_FUEL_QUANTITY - Number in kilogramm - The total physical quantity of fuel in the tanks