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 (
+
+
+
+ );
+};
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 (
-
- );
-}
-
-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;
}
+ */