diff --git a/flybywire-aircraft-a320-neo/ModelBehaviorDefs/A32NX/Airbus.xml b/flybywire-aircraft-a320-neo/ModelBehaviorDefs/A32NX/Airbus.xml index 1a588a89957..597b7138f55 100644 --- a/flybywire-aircraft-a320-neo/ModelBehaviorDefs/A32NX/Airbus.xml +++ b/flybywire-aircraft-a320-neo/ModelBehaviorDefs/A32NX/Airbus.xml @@ -145,7 +145,8 @@ PUSH_ECAM_#BASE_NAME# PUSH_ECAM_#BASE_NAME#_SEQ2 PUSH_ECAM_#BASE_NAME#_SEQ1 - A320_Neo_EICAS_2_ECAM_CHANGE_PAGE_#BASE_NAME# + + A32NX_SD_PAGE_CHANGED A32NX_ECAM_SD_CURRENT_PAGE_INDEX mcdubuttons 0.1 @@ -160,9 +161,12 @@ #ANIM_NAME_BUTTON# - #GROUP_INDEX# -1 > if{ - (>H:#EVENT_NAME#) #GROUP_INDEX# + (L:A32NX_ECAM_SD_CURRENT_PAGE_INDEX) #GROUP_INDEX# != if{ + #GROUP_INDEX# (>L:A32NX_ECAM_SD_CURRENT_PAGE_INDEX) + } els{ + -1 (>L:A32NX_ECAM_SD_CURRENT_PAGE_INDEX) } + (>H:A32NX_SD_PAGE_CHANGED) diff --git a/flybywire-aircraft-a320-neo/SimObjects/AirPlanes/FlyByWire_A320_NEO/panel/panel.cfg b/flybywire-aircraft-a320-neo/SimObjects/AirPlanes/FlyByWire_A320_NEO/panel/panel.cfg index 27e150ef271..d3dae430c31 100644 --- a/flybywire-aircraft-a320-neo/SimObjects/AirPlanes/FlyByWire_A320_NEO/panel/panel.cfg +++ b/flybywire-aircraft-a320-neo/SimObjects/AirPlanes/FlyByWire_A320_NEO/panel/panel.cfg @@ -35,11 +35,11 @@ texture = $EWD htmlgauge00 = A32NX/EWD/template.html?Index=1, 0,0,768,768 [VCockpit04] -size_mm = 1280,1280 #TODO FIXME - Should be 768,768 -pixel_size = 1280,1280 #TODO FIXME - Should be 768,768 +size_mm = 768,768 #TODO FIXME - Should be 768,768 +pixel_size = 768,768 #TODO FIXME - Should be 768,768 texture = $EICAS2 -htmlgauge00 = Airliners/FlyByWire_A320_Neo/EICAS/A320_Neo_EICAS.html?Index=2, 0,0,1280,1280 #TODO FIXME - Should be 768,768 +htmlgauge00 = A32NX/SD/template.html, 0,0,768,768 #TODO FIXME - Should be 768,768 [VCockpit05] size_mm = 512,512 diff --git a/flybywire-aircraft-a320-neo/html_ui/Pages/VCockpit/Instruments/Airliners/FlyByWire_A320_Neo/A32NX_BaseAirliners.js b/flybywire-aircraft-a320-neo/html_ui/Pages/VCockpit/Instruments/Airliners/FlyByWire_A320_Neo/A32NX_BaseAirliners.js index 0c772e3826e..ec60ccdce40 100644 --- a/flybywire-aircraft-a320-neo/html_ui/Pages/VCockpit/Instruments/Airliners/FlyByWire_A320_Neo/A32NX_BaseAirliners.js +++ b/flybywire-aircraft-a320-neo/html_ui/Pages/VCockpit/Instruments/Airliners/FlyByWire_A320_Neo/A32NX_BaseAirliners.js @@ -69,7 +69,7 @@ var Airliners; this.SwitchToPageName(BaseEICAS.LOWER_SCREEN_GROUP_NAME, pageName); for (let i = 0; i < this.lowerScreenPages.length; i++) { if (this.lowerScreenPages[i].name == pageName) { - SimVar.SetSimVarValue("L:A32NX_ECAM_SD_CURRENT_PAGE_INDEX", "number", i); + // SimVar.SetSimVarValue("L:A32NX_ECAM_SD_CURRENT_PAGE_INDEX", "number", i); break; } } diff --git a/flybywire-aircraft-a320-neo/html_ui/Pages/VCockpit/Instruments/Airliners/FlyByWire_A320_Neo/EICAS/A320_Neo_EICAS.js b/flybywire-aircraft-a320-neo/html_ui/Pages/VCockpit/Instruments/Airliners/FlyByWire_A320_Neo/EICAS/A320_Neo_EICAS.js index f8ce30a1a76..7555c287747 100644 --- a/flybywire-aircraft-a320-neo/html_ui/Pages/VCockpit/Instruments/Airliners/FlyByWire_A320_Neo/EICAS/A320_Neo_EICAS.js +++ b/flybywire-aircraft-a320-neo/html_ui/Pages/VCockpit/Instruments/Airliners/FlyByWire_A320_Neo/EICAS/A320_Neo_EICAS.js @@ -51,7 +51,7 @@ class A320_Neo_EICAS extends Airliners.BaseEICAS { } } this.SwitchToPageName(this.LOWER_SCREEN_GROUP_NAME, pageName); - SimVar.SetSimVarValue("L:A32NX_ECAM_SD_CURRENT_PAGE_INDEX", "number", this.currentPage); + //SimVar.SetSimVarValue("L:A32NX_ECAM_SD_CURRENT_PAGE_INDEX", "number", this.currentPage); } createLowerScreenPages() { @@ -234,7 +234,7 @@ class A320_Neo_EICAS extends Airliners.BaseEICAS { // Disable user selected page when new failure detected if (this.PrevFailPage !== sFailPage) { this.currentPage = -1; - SimVar.SetSimVarValue("L:A32NX_ECAM_SD_CURRENT_PAGE_INDEX", "number", -1); + //SimVar.SetSimVarValue("L:A32NX_ECAM_SD_CURRENT_PAGE_INDEX", "number", -1); } } diff --git a/flybywire-aircraft-a320-neo/html_ui/Pages/VCockpit/Instruments/Airliners/FlyByWire_A320_Neo/EICAS/EICAS_Common.js b/flybywire-aircraft-a320-neo/html_ui/Pages/VCockpit/Instruments/Airliners/FlyByWire_A320_Neo/EICAS/EICAS_Common.js index 58456e873ab..2166484c134 100644 --- a/flybywire-aircraft-a320-neo/html_ui/Pages/VCockpit/Instruments/Airliners/FlyByWire_A320_Neo/EICAS/EICAS_Common.js +++ b/flybywire-aircraft-a320-neo/html_ui/Pages/VCockpit/Instruments/Airliners/FlyByWire_A320_Neo/EICAS/EICAS_Common.js @@ -47,9 +47,9 @@ class EICASCommonDisplay extends Airliners.EICASTemplateElement { const airDataReferenceSource = this.getStatusAirDataReferenceSource(); const inertialReferenceSource = this.getStatusInertialReferenceSource(); const sat = Arinc429Word.fromSimVarValue(`L:A32NX_ADIRS_ADR_${airDataReferenceSource}_STATIC_AIR_TEMPERATURE`); - this.refreshTAT(Arinc429Word.fromSimVarValue(`L:A32NX_ADIRS_ADR_${airDataReferenceSource}_TOTAL_AIR_TEMPERATURE`)); + /* this.refreshTAT(Arinc429Word.fromSimVarValue(`L:A32NX_ADIRS_ADR_${airDataReferenceSource}_TOTAL_AIR_TEMPERATURE`)); this.refreshSAT(sat); - this.refreshISA(Arinc429Word.fromSimVarValue(`L:A32NX_ADIRS_ADR_${airDataReferenceSource}_INTERNATIONAL_STANDARD_ATMOSPHERE_DELTA`), sat); + this.refreshISA(Arinc429Word.fromSimVarValue(`L:A32NX_ADIRS_ADR_${airDataReferenceSource}_INTERNATIONAL_STANDARD_ATMOSPHERE_DELTA`), sat); */ this.refreshClock(); this.refreshLoadFactor(_deltaTime, Arinc429Word.fromSimVarValue(`L:A32NX_ADIRS_IR_${inertialReferenceSource}_BODY_NORMAL_ACC`)); diff --git a/src/behavior/src/A32NX_Interior_Misc.xml b/src/behavior/src/A32NX_Interior_Misc.xml index a18eb4c12ed..530cf9b967e 100644 --- a/src/behavior/src/A32NX_Interior_Misc.xml +++ b/src/behavior/src/A32NX_Interior_Misc.xml @@ -512,12 +512,12 @@ #ANIM_NAME_BUTTON# - + diff --git a/src/instruments/src/Common/NXUnits.ts b/src/instruments/src/Common/NXUnits.ts new file mode 100644 index 00000000000..325bfd52a6e --- /dev/null +++ b/src/instruments/src/Common/NXUnits.ts @@ -0,0 +1,51 @@ +/** + * Unit conversion utilities + */ + +import { NXDataStore } from '@shared/persistence'; + +export class NXUnits { + private static metricWeightVal: boolean; + + static get metricWeight() { + if (NXUnits.metricWeightVal === undefined) { + NXDataStore.getAndSubscribe('CONFIG_USING_METRIC_UNIT', (key, value) => { + NXUnits.metricWeightVal = value === '1'; + }, '1'); + } + return NXUnits.metricWeightVal; + } + + static userToKg(value) { + return NXUnits.metricWeight ? value : value / 2.204625; + } + + static kgToUser(value) { + return NXUnits.metricWeight ? value : value * 2.204625; + } + + static poundsToUser(value) { + return NXUnits.metricWeight ? value / 2.204625 : value; + } + + static userWeightUnit() { + return NXUnits.metricWeight ? 'KG' : 'LBS'; // EIS uses S suffix on LB + } + + /** + * Converts meter into ft if imperial units are selected + * @param value {number} in unit Meters + * @returns {number} in metric or ft + */ + static mToUser(value) { + return NXUnits.metricWeight ? value : value * 3.28084; + } + + /** + * Returns 'M' for meters and 'FT' for feet depending on the unit system selected + * @returns {string} 'M' (meter) OR 'FT' (feet) + */ + static userDistanceUnit() { + return NXUnits.metricWeight ? 'M' : 'FT'; + } +} diff --git a/src/instruments/src/Common/defaults.ts b/src/instruments/src/Common/defaults.ts index 4d9f3629023..be65440c26c 100644 --- a/src/instruments/src/Common/defaults.ts +++ b/src/instruments/src/Common/defaults.ts @@ -1,16 +1,16 @@ // We currently assume that these two elements will be found. // Might be worth implementing checking in the future. -let reactMount = document.getElementById('MSFS_REACT_MOUNT') as HTMLElement; +const reactMount = document.getElementById('MSFS_REACT_MOUNT') as HTMLElement; -const getEcamPageRenderTarget = (pageName: string): HTMLElement => (document.getElementById(`A32NX_${pageName}_PAGE_REACT_MOUNT`) as HTMLElement); +// const getEcamPageRenderTarget = (pageName: string): HTMLElement => (document.getElementById(`A32NX_${pageName}_PAGE_REACT_MOUNT`) as HTMLElement); /** * Configures the framework to render inside the ECAM. Temporary solution for moving individual SD pages to React. */ -export const setIsEcamPage = (pageName: string) => { +/* export const setIsEcamPage = (pageName: string) => { reactMount = getEcamPageRenderTarget(pageName); -}; +}; */ /** * Returns the render target which React mounts onto diff --git a/src/instruments/src/SD/Common/definitions.scss b/src/instruments/src/SD/Common/definitions.scss index 8fd432adf9f..28fd152886c 100644 --- a/src/instruments/src/SD/Common/definitions.scss +++ b/src/instruments/src/SD/Common/definitions.scss @@ -1,4 +1,4 @@ -$font-size-small: 14px; +$font-size-small: 15px; $font-size-medium: 16px; $font-size-large: 17px; $font-size-larger: 18px; diff --git a/src/instruments/src/SD/Pages/Apu/Apu.tsx b/src/instruments/src/SD/Pages/Apu/Apu.tsx index 21b52cc3769..538456066b7 100644 --- a/src/instruments/src/SD/Pages/Apu/Apu.tsx +++ b/src/instruments/src/SD/Pages/Apu/Apu.tsx @@ -1,7 +1,6 @@ import React, { useEffect, useState } from 'react'; import { useArinc429Var } from '@instruments/common/arinc429'; import { render } from '@instruments/common/index'; -import { setIsEcamPage } from '@instruments/common/defaults'; import { useSimVar } from '@instruments/common/simVars'; import { GaugeComponent, GaugeMarkerComponent } from '@instruments/common/gauges'; import { PageTitle } from '../../Common/PageTitle'; @@ -10,8 +9,6 @@ import { SvgGroup } from '../../Common/SvgGroup'; import './Apu.scss'; -setIsEcamPage('apu_page'); - export const ApuPage = () => { const [apuAvail] = useSimVar('L:A32NX_OVHD_APU_START_PB_IS_AVAILABLE', 'Bool', 1000); diff --git a/src/instruments/src/SD/Pages/Bleed/Bleed.tsx b/src/instruments/src/SD/Pages/Bleed/Bleed.tsx index 94db340e7f7..7b82972d068 100644 --- a/src/instruments/src/SD/Pages/Bleed/Bleed.tsx +++ b/src/instruments/src/SD/Pages/Bleed/Bleed.tsx @@ -1,7 +1,6 @@ import React, { FC } from 'react'; import { render } from '@instruments/common/index'; import { useSimVar } from '@instruments/common/simVars'; -import { setIsEcamPage } from '@instruments/common/defaults'; import { PageTitle } from '../../Common/PageTitle'; import { EcamPage } from '../../Common/EcamPage'; import EngineBleed from './elements/EngineBleed'; @@ -11,8 +10,6 @@ import { Triangle } from '../../Common/Shapes'; import './Bleed.scss'; -setIsEcamPage('bleed_page'); - export const BleedPage: FC = () => { const sdacDatum = true; const [xbleedAirValveOpen] = useSimVar('L:A32NX_PNEU_XBLEED_VALVE_OPEN', 'bool', 500); diff --git a/src/instruments/src/SD/Pages/Cond/Cond.tsx b/src/instruments/src/SD/Pages/Cond/Cond.tsx index 5b898c966bb..d31c41d7fc3 100644 --- a/src/instruments/src/SD/Pages/Cond/Cond.tsx +++ b/src/instruments/src/SD/Pages/Cond/Cond.tsx @@ -1,13 +1,12 @@ import React from 'react'; import { SvgGroup } from '../../Common/SvgGroup'; import { render } from '../../../Common'; -import { setIsEcamPage } from '../../../Common/defaults'; import { useSimVar } from '../../../Common/simVars'; import Valve from './Valve'; import '../../Common/CommonStyles.scss'; -setIsEcamPage('cond_page'); +// setIsEcamPage('cond_page'); export const CondPage = () => { // Disaply trim valve position for each zone diff --git a/src/instruments/src/SD/Pages/Crz/Crz.tsx b/src/instruments/src/SD/Pages/Crz/Crz.tsx index 398ac1c7a19..0921d98ec6a 100644 --- a/src/instruments/src/SD/Pages/Crz/Crz.tsx +++ b/src/instruments/src/SD/Pages/Crz/Crz.tsx @@ -1,14 +1,13 @@ import React, { useEffect, useState } from 'react'; import { GaugeComponent, GaugeMarkerComponent, splitDecimals } from '@instruments/common/gauges'; import { render } from '../../../Common'; -import { setIsEcamPage } from '../../../Common/defaults'; import { useSimVar } from '../../../Common/simVars'; import { usePersistentProperty } from '../../../Common/persistence'; import { fuelForDisplay } from '../../Common/FuelFunctions'; import './Crz.scss'; -setIsEcamPage('crz_page'); +// setIsEcamPage('crz_page'); export const CrzPage = () => ( <> diff --git a/src/instruments/src/SD/Pages/Door/Door.tsx b/src/instruments/src/SD/Pages/Door/Door.tsx index 697b93c68a6..ed2cafdc538 100644 --- a/src/instruments/src/SD/Pages/Door/Door.tsx +++ b/src/instruments/src/SD/Pages/Door/Door.tsx @@ -1,10 +1,9 @@ import './Door.scss'; import React from 'react'; import { render } from '@instruments/common/index'; -import { setIsEcamPage } from '../../../Common/defaults'; import { useSimVar } from '../../../Common/simVars'; -setIsEcamPage('door_page'); +// setIsEcamPage('door_page'); export const DoorPage = () => { const [cabin] = useSimVar('INTERACTIVE POINT OPEN:0', 'percent', 1000); diff --git a/src/instruments/src/SD/Pages/Elec/Elec.scss b/src/instruments/src/SD/Pages/Elec/Elec.scss index b45c2512170..28056f94abb 100644 --- a/src/instruments/src/SD/Pages/Elec/Elec.scss +++ b/src/instruments/src/SD/Pages/Elec/Elec.scss @@ -29,7 +29,7 @@ text { fill: #EEEEEE; - font-family: 'Roboto Mono', monospace; + //font-family: 'Roboto Mono', monospace !important; font-size: 19px; &.ExtraLarge { diff --git a/src/instruments/src/SD/Pages/Elec/Elec.tsx b/src/instruments/src/SD/Pages/Elec/Elec.tsx index a2307f7f309..34a9fefab09 100644 --- a/src/instruments/src/SD/Pages/Elec/Elec.tsx +++ b/src/instruments/src/SD/Pages/Elec/Elec.tsx @@ -1,15 +1,13 @@ import classNames from 'classnames'; import React from 'react'; +import './Elec.scss'; import { render } from '@instruments/common/index'; import { PageTitle } from '../../Common/PageTitle'; -import { setIsEcamPage } from '../../../Common/defaults'; import { useSimVar } from '../../../Common/simVars'; import { EcamPage } from '../../Common/EcamPage'; import { SvgGroup } from '../../Common/SvgGroup'; -import './Elec.scss'; - -setIsEcamPage('elec_page'); +// setIsEcamPage('elec_page'); const maxStaleness = 300; diff --git a/src/instruments/src/SD/Pages/Eng/Eng.tsx b/src/instruments/src/SD/Pages/Eng/Eng.tsx index b1cdabb4332..d0801902346 100644 --- a/src/instruments/src/SD/Pages/Eng/Eng.tsx +++ b/src/instruments/src/SD/Pages/Eng/Eng.tsx @@ -10,7 +10,7 @@ import { SvgGroup } from '../../Common/SvgGroup'; import './Eng.scss'; -setIsEcamPage('eng_page'); +/* setIsEcamPage('eng_page'); */ export const EngPage: FC = () => { const [weightUnit] = usePersistentProperty('CONFIG_USING_METRIC_UNIT', '1'); diff --git a/src/instruments/src/SD/Pages/Fuel/Fuel.tsx b/src/instruments/src/SD/Pages/Fuel/Fuel.tsx index e796c8c6b39..bfcd1d9af28 100644 --- a/src/instruments/src/SD/Pages/Fuel/Fuel.tsx +++ b/src/instruments/src/SD/Pages/Fuel/Fuel.tsx @@ -1,7 +1,6 @@ import React, { useEffect, useState } from 'react'; import { render } from '@instruments/common/index'; import { useSimVar } from '@instruments/common/simVars'; -import { setIsEcamPage } from '@instruments/common/defaults'; import { useArinc429Var } from '@instruments/common/arinc429'; import { usePersistentProperty } from '../../../Common/persistence'; import { fuelForDisplay, fuelInTanksForDisplay } from '../../Common/FuelFunctions'; @@ -11,8 +10,6 @@ import { EcamPage } from '../../Common/EcamPage'; import './Fuel.scss'; -setIsEcamPage('fuel_page'); - export const FuelPage = () => { const [crossFeedPosition] = useSimVar('FUELSYSTEM VALVE OPEN:3', 'number', 500); diff --git a/src/instruments/src/SD/Pages/Hyd/Hyd.tsx b/src/instruments/src/SD/Pages/Hyd/Hyd.tsx index a4b94a645cc..dd6841219ac 100644 --- a/src/instruments/src/SD/Pages/Hyd/Hyd.tsx +++ b/src/instruments/src/SD/Pages/Hyd/Hyd.tsx @@ -7,7 +7,7 @@ import { Triangle } from '../../Common/Shapes'; import '../../Common/CommonStyles.scss'; -setIsEcamPage('hyd_page'); +/* setIsEcamPage('hyd_page'); */ const litersPerGallon = 3.79; diff --git a/src/instruments/src/SD/Pages/Press/Press.tsx b/src/instruments/src/SD/Pages/Press/Press.tsx index ea97da275f4..52d11f982f1 100644 --- a/src/instruments/src/SD/Pages/Press/Press.tsx +++ b/src/instruments/src/SD/Pages/Press/Press.tsx @@ -1,7 +1,6 @@ import React, { FC, useState, useEffect, memo } from 'react'; import { render } from '@instruments/common/index'; import { GaugeComponent, GaugeMarkerComponent, splitDecimals } from '@instruments/common/gauges'; -import { setIsEcamPage } from '@instruments/common/defaults'; import { Triangle } from '../../Common/Shapes'; import { PageTitle } from '../../Common/PageTitle'; import { EcamPage } from '../../Common/EcamPage'; @@ -10,8 +9,6 @@ import { SvgGroup } from '../../Common/SvgGroup'; import './Press.scss'; -setIsEcamPage('press_page'); - export const PressPage: FC = () => { const [cabinAlt] = useSimVar('L:A32NX_PRESS_CABIN_ALTITUDE', 'feet', 500); const [deltaPsi] = useSimVar('L:A32NX_PRESS_CABIN_DELTA_PRESSURE', 'psi', 500); diff --git a/src/instruments/src/SD/Pages/Status/Status.tsx b/src/instruments/src/SD/Pages/Status/Status.tsx index 9f747dce19b..f73fc3e1a00 100644 --- a/src/instruments/src/SD/Pages/Status/Status.tsx +++ b/src/instruments/src/SD/Pages/Status/Status.tsx @@ -1,6 +1,5 @@ import React, { FC } from 'react'; import { render } from '@instruments/common/index'; -import { setIsEcamPage } from '@instruments/common/defaults'; import { PageTitle } from '../../Common/PageTitle'; import { EcamPage } from '../../Common/EcamPage'; import StatusDisplay from './elements/StatusDisplay'; @@ -8,8 +7,6 @@ import DownArrow from './elements/DownArrow'; import './Status.scss'; -setIsEcamPage('status_page'); - export const StatusPage: FC = () => ( diff --git a/src/instruments/src/SD/Pages/Wheel/Wheel.tsx b/src/instruments/src/SD/Pages/Wheel/Wheel.tsx index 44222406348..59f58f8086d 100644 --- a/src/instruments/src/SD/Pages/Wheel/Wheel.tsx +++ b/src/instruments/src/SD/Pages/Wheel/Wheel.tsx @@ -1,7 +1,6 @@ import React from 'react'; import { render } from '@instruments/common/index'; import { useSimVar } from '@instruments/common/simVars'; -import { setIsEcamPage } from '@instruments/common/defaults'; import { useArinc429Var } from '@instruments/common/arinc429'; import { Arinc429Word } from '@shared/arinc429'; import { HydraulicsProvider, useHydraulics } from '../../Common/HydraulicsProvider'; @@ -12,8 +11,6 @@ import { Spoilers } from '../../Common/Spoilers'; import '../../Common/CommonStyles.scss'; -setIsEcamPage('wheel_page'); - const maxStaleness = 300; export const WheelPage = () => { diff --git a/src/instruments/src/SD/PagesContainer.jsx b/src/instruments/src/SD/PagesContainer.jsx deleted file mode 100644 index 6f99c16fa21..00000000000 --- a/src/instruments/src/SD/PagesContainer.jsx +++ /dev/null @@ -1,39 +0,0 @@ -import { useState } from 'react'; -import { getSimVar, useInteractionEvent } from '../util.js'; -import { EngPage } from './Pages/Eng/Eng.tsx'; -import { BleedPage } from './Pages/Bleed/Bleed.tsx'; -import { PressPage } from './Pages/Press/Press.tsx'; -import { ElecPage } from './Pages/Elec/Elec.tsx'; -import { HydPage } from './Pages/Hyd/Hyd.tsx'; -import { FuelPage } from './Pages/Fuel/Fuel.tsx'; -import { ApuPage } from './Pages/Apu/Apu.tsx'; -import { CondPage } from './Pages/Cond/Cond.tsx'; -import { DoorPage } from './Pages/Door/Door.tsx'; -import { WheelPage } from './Pages/Wheel/Wheel.tsx'; -import { FctlPage } from './Pages/Fctl/Fctl.tsx'; -import { StatusPage } from './Pages/Status/Status.tsx'; -import { CrzPage } from './Pages/Crz/Crz.tsx'; - -export const PagesContainer = () => { - const [currentPage, setCurrentPage] = useState(0); - - useInteractionEvent('A32NX_SD_PAGE_CHANGED', () => setCurrentPage(getSimVar('L:A32NX_ECAM_SD_CURRENT_PAGE_INDEX', 'number'))); - - const pages = { - 0: , - 1: , - 2: , - 3: , - 4: , - 5: , - 6: , - 7: , - 8: , - 9: , - 10: , - 11: , - 12: , - }; - - return pages[currentPage] || invalid page; -}; diff --git a/src/instruments/src/SD/PagesContainer.tsx b/src/instruments/src/SD/PagesContainer.tsx new file mode 100644 index 00000000000..265a0014fe2 --- /dev/null +++ b/src/instruments/src/SD/PagesContainer.tsx @@ -0,0 +1,55 @@ +import React, { useEffect, useState } from 'react'; +import { useSimVar } from '@instruments/common/simVars'; +import { getSimVar, useInteractionEvent } from '../util.js'; +import { EngPage } from './Pages/Eng/Eng'; +import { BleedPage } from './Pages/Bleed/Bleed'; +import { PressPage } from './Pages/Press/Press'; +import { ElecPage } from './Pages/Elec/Elec'; +import { HydPage } from './Pages/Hyd/Hyd'; +import { FuelPage } from './Pages/Fuel/Fuel'; +import { ApuPage } from './Pages/Apu/Apu'; +import { CondPage } from './Pages/Cond/Cond'; +import { DoorPage } from './Pages/Door/Door'; +import { WheelPage } from './Pages/Wheel/Wheel'; +import { FctlPage } from './Pages/Fctl/Fctl'; +import { StatusPage } from './Pages/Status/Status'; +import { CrzPage } from './Pages/Crz/Crz'; + +export const PagesContainer = () => { + const [currentPage, setCurrentPage] = useState(10); + + // const [page, setPage] = useSimVar('L:A32NX_ECAM_SD_CURRENT_PAGE_INDEX', 'number', 300); + + useInteractionEvent('A32NX_SD_PAGE_CHANGED', () => { + const page = SimVar.GetSimVarValue('L:A32NX_ECAM_SD_CURRENT_PAGE_INDEX', 'number'); + if (page !== -1) { + setCurrentPage(page); + } else { + // setPageWhenUnselected(12); + // setPage(12); + setCurrentPage(12); + } + }); + + /* useEffect(() => { + + }, [page]); + */ + const pages = { + 0: , + 1: , + 2: , + 3: , + 4: , + 5: , + 6: , + 7: , + 8: , + 9: , + 10: , + 11: , + 12: , + }; + + return pages[currentPage] || invalid page; +}; diff --git a/src/instruments/src/SD/StatusArea/StatusArea.jsx b/src/instruments/src/SD/StatusArea/StatusArea.jsx deleted file mode 100644 index 6444f1f9637..00000000000 --- a/src/instruments/src/SD/StatusArea/StatusArea.jsx +++ /dev/null @@ -1,102 +0,0 @@ -/** - * WARNING - * - * CODE IN THIS FILE IS OLD. THIS STATUS AREA WAS UNUSED AND THE ORIGINAL ASOBO - * STATUS AREA WAS EXTENDED FURTHER. WHEN STARTING TO USE THIS COMPONENT. PLEASE - * PORT ANY FUNCTIONALITY FOUND ON THE ORIGINAL STATUS AREA. - */ - -import './StatusArea.scss'; -import { Text } from '../Text/Text.jsx'; -import { useGlobalVar, getSimVar } from '../../util.js'; - -export const StatusArea = () => { - const gw = getSimVar('TOTAL WEIGHT', 'kg'); - const zulu = useGlobalVar('ZULU TIME', 'seconds'); - let tat = Math.round(getSimVar('TOTAL AIR TEMPERATURE', 'celsius')); - if (tat > 99 || tat < -99) { - tat = tat > 99 ? 99 : -99; - } - let sat = Math.round(getSimVar('AMBIENT TEMPERATURE', 'celsius')); - if (sat > 99 || sat < -99) { - sat = sat > 99 ? 99 : -99; - } - - // TODO FIXME improve this - // const adirsAlign = !ADIRS.mapNotAvailable(1) || !ADIRS.mapNotAvailable(2); - const adirsAlign = true; - - const satPrefix = sat > 0 ? '+' : ''; - const tatPrefix = tat > 0 ? '+' : ''; - const seconds = Math.floor(zulu); - const hours = Math.floor(seconds / 3600); - const minutes = Math.floor((seconds - (hours * 3600)) / 60); - const padMinutes = String(minutes).padStart(2, '0'); - const padHours = String(hours).padStart(2, '0'); - - return ( - <> - - - - - {/* Temperatures */} - - - TAT - - { adirsAlign - ? ( - - XX - - ) - : ( - - {tatPrefix} - {tat} - - )} - - °C - - - - SAT - - { adirsAlign - ? ( - - XX - - ) - : ( - - {satPrefix} - {sat} - - )} - - °C - - - {/* Time */} - - {padHours} - H - {padMinutes} - - {/* Gross weight */} - - - GW - - - {Math.round(gw)} - - - KG - - - ); -}; diff --git a/src/instruments/src/SD/StatusArea/StatusArea.scss b/src/instruments/src/SD/StatusArea/StatusArea.scss index eb4c81658b7..646ede1c464 100644 --- a/src/instruments/src/SD/StatusArea/StatusArea.scss +++ b/src/instruments/src/SD/StatusArea/StatusArea.scss @@ -2,3 +2,14 @@ stroke: white; stroke-width: 3; } + +#StatusArea { + display: block; + position: absolute; + bottom: 0%; + left: 0%; + width: 100%; + height: 20%; + + font-family: "Ecam", monospace !important; +} diff --git a/src/instruments/src/SD/StatusArea/StatusArea.tsx b/src/instruments/src/SD/StatusArea/StatusArea.tsx new file mode 100644 index 00000000000..32568ea7e47 --- /dev/null +++ b/src/instruments/src/SD/StatusArea/StatusArea.tsx @@ -0,0 +1,249 @@ +/** + * WARNING + * + * CODE IN THIS FILE IS OLD. THIS STATUS AREA WAS UNUSED AND THE ORIGINAL ASOBO + * STATUS AREA WAS EXTENDED FURTHER. WHEN STARTING TO USE THIS COMPONENT. PLEASE + * PORT ANY FUNCTIONALITY FOUND ON THE ORIGINAL STATUS AREA. + */ + +import './StatusArea.scss'; +import React, { useEffect, useState } from 'react'; +import { useGlobalVar, useSimVar } from '@instruments/common/simVars'; +import { getSupplier } from '@instruments/common/utils'; +import { useArinc429Var } from '@instruments/common/arinc429'; +import { NXLogicConfirmNode, NXLogicMemoryNode } from '@instruments/common/NXLogic'; +import { useUpdate } from '@instruments/common/hooks'; +import { NXUnits } from '@instruments/common/NXUnits'; +import { Text } from '../Text/Text'; + +export const StatusArea = () => { + const [gwDisplayedValue, setGwDisplayedValue] = useState('0'); + + const [gwDisplayedUnit, setGwDisplayedUnit] = useState('kg'); + + const zulu = useGlobalVar('ZULU TIME', 'seconds', 60000); + + const [airDataSwitch] = useSimVar('L:A32NX_AIR_DATA_SWITCHING_KNOB', 'enum', 200); + const [attHdgSwitch] = useSimVar('L:A32NX_ATT_HDG_SWITCHING_KNOB', 'enum', 200); + + const [eng1Running] = useSimVar('ENG COMBUSTION:1', 'bool', 1000); + const [eng2Running] = useSimVar('ENG COMBUSTION:2', 'bool', 1000); + + const [isaVisible, setIsaVisible] = useState(false); + + const [airDataReferenceSource, setAirDataSource] = useState(0); + const [inertialReferenceSource, setInertialSource] = useState(0); + const [loadFactorVisibleElement, setLoadFactorVisibleElement] = useState(false); + const [loadFactorText, setLoadFactorText] = useState(''); + + const sat = useArinc429Var(`L:A32NX_ADIRS_ADR_${airDataReferenceSource}_STATIC_AIR_TEMPERATURE`, 6000); + const tat = useArinc429Var(`L:A32NX_ADIRS_ADR_${airDataReferenceSource}_TOTAL_AIR_TEMPERATURE`, 6000); + const isa = useArinc429Var(`L:A32NX_ADIRS_ADR_${airDataReferenceSource}_INTERNATIONAL_STANDARD_ATMOSPHERE_DELTA`, 6000); + const loadFactor = useArinc429Var(`L:A32NX_ADIRS_IR_${inertialReferenceSource}_BODY_NORMAL_ACC`, 300); + + const [loadFactorSet] = useState(new NXLogicConfirmNode(2)); + const [loadFactorReset] = useState(new NXLogicConfirmNode(5)); + const [loadFactorVisible] = useState(new NXLogicMemoryNode()); + + useEffect(() => { + setAirDataSource(getSupplier(undefined, airDataSwitch)); + }, [airDataSwitch]); + + useEffect(() => { + setInertialSource(getSupplier(undefined, attHdgSwitch)); + }, [attHdgSwitch]); + + useUpdate((deltaTime) => { + const conditionsMet = loadFactor.value > 1.4 || loadFactor.value < 0.7; + const loadFactorSetValue = loadFactorSet.write(conditionsMet && loadFactor.isNormalOperation(), deltaTime); + const loadFactorResetValue = loadFactorReset.write(!conditionsMet || !loadFactor.isNormalOperation(), deltaTime); + const flightPhase = SimVar.GetSimVarValue('L:A32NX_FWC_FLIGHT_PHASE', 'Enum'); + + setLoadFactorVisibleElement( + flightPhase >= 4 + && flightPhase <= 8 + && loadFactorVisible.write(loadFactorSetValue, loadFactorResetValue), + ); + + let loadFactorText = 'XX'; + if (loadFactor.isNormalOperation()) { + const clamped = Math.min(Math.max(loadFactor.value, -3), 5); + loadFactorText = (clamped >= 0 ? '+' : '') + clamped.toFixed(1); + } + setLoadFactorText(loadFactorText); + }); + + useEffect(() => { + const isInStdMode = Simplane.getPressureSelectedMode(Aircraft.A320_NEO) === 'STD'; + // As ISA relates to SAT, we cannot present ISA when SAT is unavailable. We might want to move this into + // Rust ADIRS code itself. + const isaShouldBeVisible = isInStdMode && isa.isNormalOperation() && sat.isNormalOperation(); + setIsaVisible(isaShouldBeVisible); + // this.isaContainer.setAttribute('visibility', isaShouldBeVisible ? 'visible' : 'hidden'); + + // this.setValueOnTemperatureElement(Math.round(isa.value), this.isaText); + }, [isa, sat]); + + /* let tat = Math.round(useSimVar('TOTAL AIR TEMPERATURE', 'celsius', 6000)[0]); + if (tat > 99 || tat < -99) { + tat = tat > 99 ? 99 : -99; + } + let sat = Math.round(useSimVar('AMBIENT TEMPERATURE', 'celsius', 6000)[0]); + if (sat > 99 || sat < -99) { + sat = sat > 99 ? 99 : -99; + } */ + + const satPrefix = sat.value > 0 ? '+' : ''; + const tatPrefix = tat.value > 0 ? '+' : ''; + const seconds = Math.floor(zulu); + const hours = Math.floor(seconds / 3600); + const minutes = Math.floor((seconds - (hours * 3600)) / 60); + const padMinutes = String(minutes).padStart(2, '0'); + const padHours = String(hours).padStart(2, '0'); + + const getPayloadWeight = (unit: string, payloadCount: number) => { + let payloadWeight = 0; + for (let i = 1; i <= payloadCount; i++) { + payloadWeight += SimVar.GetSimVarValue(`PAYLOAD STATION WEIGHT:${i}`, unit); + } + return payloadWeight; + }; + + useUpdate((_deltaTime) => { + const fuelWeight = SimVar.GetSimVarValue('FUEL TOTAL QUANTITY WEIGHT', 'kg'); + const emptyWeight = SimVar.GetSimVarValue('EMPTY WEIGHT', 'kg'); + const payloadCount = SimVar.GetSimVarValue('PAYLOAD STATION COUNT', 'number'); + + const gwUnit = NXUnits.userWeightUnit(); + const payloadWeight = getPayloadWeight(gwUnit, payloadCount); + const gw = Math.round(NXUnits.kgToUser(emptyWeight + fuelWeight + payloadWeight)); + + // if ((gw != this.currentGW) || (this.isOneEngineRunning != isOneEngineRunning) || _force) { + // this.currentGW = gw; + // this.isOneEngineRunning = isOneEngineRunning; + + if (eng1Running || eng2Running && gw != null) { + // Lower EICAS displays GW in increments of 100 + setGwDisplayedValue((Math.floor(gw / 100) * 100).toString()); + /* this.gwValue.classList.add('Value'); + this.gwValue.classList.remove('Cyan'); + this.gwValue.textContent = (Math.floor(gw / 100) * 100).toString(); */ + } else { + setGwDisplayedValue('--'); + } + setGwDisplayedUnit(gwUnit); + + /* if (gwUnit != this.currentGwUnit) { + this.currentGwUnit = gwUnit; + if (this.gwUnit != null) { + this.gwUnit.textContent = gwUnit; + } + } */ + }); + + return ( +
+ + + + + + + + {/* Temperatures */} + + + TAT + + { !tat.isNormalOperation() + ? ( + + XX + + ) + : ( + + {tatPrefix} + {Math.round(tat.value)} + + )} + + °C + + + + SAT + + { !sat.isNormalOperation() + ? ( + + XX + + ) + : ( + + {satPrefix} + {Math.round(sat.value)} + + )} + + °C + + + {/* Time */} + + {padHours} + H + {padMinutes} + + {/* Gross weight */} + {(eng1Running || eng2Running) && ( + <> + + GW + + + {gwDisplayedValue} + + + {gwDisplayedUnit} + + + )} + + {!eng1Running && !eng2Running && ( + <> + + GW + + + {gwDisplayedValue} + + + {gwDisplayedUnit} + + + )} + + {/* ISA */} + {isaVisible && ( + <> + ISA + {Math.round(isa.value)} + °C + + + )} + + {loadFactorVisibleElement && ( + + G LOAD + {loadFactorText} + + )} + + + +
+ ); +}; diff --git a/src/instruments/src/SD/Text/Text.scss b/src/instruments/src/SD/Text/Text.scss index 4976a92ed7b..c0f5b2d7b93 100644 --- a/src/instruments/src/SD/Text/Text.scss +++ b/src/instruments/src/SD/Text/Text.scss @@ -1,4 +1,4 @@ -@import "../../Common/definitions"; +@import "../Common/definitions.scss"; text.text-unit { fill: $display-cyan; @@ -24,4 +24,4 @@ text.text-big-value { text.text-title { fill: $display-white; font-size: $font-size-xlarge; -} \ No newline at end of file +} diff --git a/src/instruments/src/SD/Text/Text.jsx b/src/instruments/src/SD/Text/Text.tsx similarity index 97% rename from src/instruments/src/SD/Text/Text.jsx rename to src/instruments/src/SD/Text/Text.tsx index c80575c8077..94752c9ae4f 100644 --- a/src/instruments/src/SD/Text/Text.jsx +++ b/src/instruments/src/SD/Text/Text.tsx @@ -1,3 +1,4 @@ +import React from 'react'; import './Text.scss'; export const Text = (props) => { diff --git a/src/instruments/src/SD/config.json b/src/instruments/src/SD/config.json index 899622d8f02..b6d30d46d50 100644 --- a/src/instruments/src/SD/config.json +++ b/src/instruments/src/SD/config.json @@ -1,4 +1,4 @@ { - "index": "./index.jsx", + "index": "./index.tsx", "isInteractive": false } diff --git a/src/instruments/src/SD/index.jsx b/src/instruments/src/SD/index.jsx deleted file mode 100644 index 1a44310b260..00000000000 --- a/src/instruments/src/SD/index.jsx +++ /dev/null @@ -1,85 +0,0 @@ -import ReactDOM from 'react-dom'; -import { useState } from 'react'; -import { - renderTarget, - useInteractionEvent, - useUpdate, - getSimVar, -} from '../util.js'; -import './style.scss'; -import { PagesContainer } from './PagesContainer.jsx'; -import { StatusArea } from './StatusArea/StatusArea.jsx'; - -function powerAvailable() { - return getSimVar('L:A32NX_ELEC_AC_2_BUS_IS_POWERED', 'Bool'); -} - -function SelfTest() { - return ( - - SELF TEST IN PROGRESS - (MAX 10 SECONDS) - - ); -} - -function Idle() { - const [inop, setInop] = useState(false); - - useInteractionEvent('A32NX_DCDU_BTN_INOP', () => { - if (!inop) { - setInop(true); - setTimeout(() => { - setInop(false); - }, 3000); - } - }); - - return ( - <> - - - - - - ); -} - -function SD() { - const [state, setState] = useState('DEFAULT'); - - useUpdate((_deltaTime) => { - if (state === 'OFF') { - if (powerAvailable()) { - setState('ON'); - } - } else if (!powerAvailable()) { - setState('OFF'); - } - }); - - switch (state) { - case 'DEFAULT': - if (getSimVar('L:A32NX_COLD_AND_DARK_SPAWN')) { - setState('OFF'); - } else { - setState('IDLE'); - } - return <>; - case 'OFF': - return <>; - case 'ON': - setTimeout(() => { - if (powerAvailable()) { - setState('IDLE'); - } - }, 8000); - return ; - case 'IDLE': - return ; - default: - throw new RangeError(); - } -} - -ReactDOM.render(, renderTarget); diff --git a/src/instruments/src/SD/index.tsx b/src/instruments/src/SD/index.tsx new file mode 100644 index 00000000000..f40dbca1ba7 --- /dev/null +++ b/src/instruments/src/SD/index.tsx @@ -0,0 +1,41 @@ +import { DisplayUnit } from '@instruments/common/displayUnit'; +import React, { useState } from 'react'; +import { render } from '@instruments/common/index'; +import { useInteractionEvent } from '@instruments/common/hooks'; +import './style.scss'; + +import { useSimVar } from '@instruments/common/simVars'; +import { PagesContainer } from './PagesContainer'; +import { StatusArea } from './StatusArea/StatusArea'; + +const Idle = () => { + const [inop, setInop] = useState(false); + + useInteractionEvent('A32NX_DCDU_BTN_INOP', () => { + if (!inop) { + setInop(true); + setTimeout(() => { + setInop(false); + }, 3000); + } + }); + + return ( +
+ + + + + +
+ ); +}; + +render( + + + , +); diff --git a/src/instruments/src/SD/style.scss b/src/instruments/src/SD/style.scss index 0428b9fbec7..8c4ca583f0f 100644 --- a/src/instruments/src/SD/style.scss +++ b/src/instruments/src/SD/style.scss @@ -7,21 +7,36 @@ } .sd-svg { - position: absolute; +/* position: absolute; width: 768px; - height: 768px; + height: 768px; */ - background: radial-gradient( +/* background: radial-gradient( ellipse at center, rgba(13, 20, 35, 1) 0%, rgb(13, 20, 35) 100% - ); + ); */ visibility: visible !important; font-family: "Ecam", monospace !important; } -text { +:root { + --bodyHeightScale: 1; +} + + +#Mainframe { + top: 0; + left: 0; + width: 100%; + height: 100%; + display: block; + position: relative; +} + +/* text { stroke-width: 0; } + */