From f5cc65e173c197387ea0e0e6b4bdd053901d5c73 Mon Sep 17 00:00:00 2001 From: juliansebline Date: Tue, 14 Jan 2025 12:35:55 +0100 Subject: [PATCH 01/64] Changelog --- .github/CHANGELOG.md | 1 + 1 file changed, 1 insertion(+) diff --git a/.github/CHANGELOG.md b/.github/CHANGELOG.md index 995180f2a33..b5dad9622ff 100644 --- a/.github/CHANGELOG.md +++ b/.github/CHANGELOG.md @@ -122,6 +122,7 @@ 1. [A380X/MFD] Add ATCCOM D-ATIS page layout - @heclak (Heclak) 1. [A380X/FMS] Enable FMC reset through overhead reset panel push buttons - @flogross89 (floridude) 1. [A380X/FCU] Add TRUE indication on FCU when TRUE North reference is selected on AFS CP - @heclak (Heclak) +1. [A32NX/COMMS] Enabled all components of communications panels with Rust - @Julian [Z+2 fr en esp]#8476 (Julian Sebline) ## 0.12.0 From b88993fe8eed8e9aacb089b01ccf3a85462b52ed Mon Sep 17 00:00:00 2001 From: juliansebline Date: Tue, 14 Jan 2025 12:42:17 +0100 Subject: [PATCH 02/64] simvars --- fbw-a32nx/docs/a320-simvars.md | 191 +++++++++++++++++++++++++++------ 1 file changed, 161 insertions(+), 30 deletions(-) diff --git a/fbw-a32nx/docs/a320-simvars.md b/fbw-a32nx/docs/a320-simvars.md index 82b14691494..ee861bc5f1a 100644 --- a/fbw-a32nx/docs/a320-simvars.md +++ b/fbw-a32nx/docs/a320-simvars.md @@ -389,65 +389,68 @@ - Bool - Indicates if the APU fire button is RELEASED -- A32NX_RMP_L_TOGGLE_SWITCH +- A32NX_RMP_{L,R}_TOGGLE_SWITCH - Boolean - - Whether the left radio management panel toggle switch is on or off. + - Whether the left/right radio management panel toggle switch is on or off. -- A32NX_RMP_R_TOGGLE_SWITCH - - Boolean - - Whether the right radio management panel toggle switch is on or off. - -- A32NX_RMP_L_SELECTED_MODE - - Number - - The current mode of the left radio management panel. - -- A32NX_RMP_R_SELECTED_MODE - - Number - - The current mode of the right radio management panel. +- A32NX_RMP_{L,R}_SELECTED_MODE + - Enum + - The current mode of the left/right radio management panel. + Meaning | Value + --- | --- + VHF1 | 1 + VHF2 | 2 + VHF3 | 3 + HF1 | 4 + HF2 | 5 + VOR | 6 + ILS | 7 + GLS | 8 + ADF | 9 -- A32NX_RMP_{L,R}_NAV_BUTTON_SELECTED +- A32NX_RMP_{L,R}_NAV_BACKUP_MODE - Bool - - Whether the NAV push button on the corresponding RMP is pushed or not. + - Whether the left/right RMP is in nav backup mode or not -- A32NX_RMP_L_VHF2_STANDBY - - Hz - - The VHF 2 standby frequency for the left RMP. +- A32NX_RMP_NAV_BACKUP_MODE + - Bool + - Whether the system in nav backup mode or not -- A32NX_RMP_L_VHF3_STANDBY +- A32NX_RMP_{L,R}_VHF{1,2,3}_STANDBY - Hz - - The VHF 3 standby frequency for the left RMP. + - The VHF 1/2/3 standby frequency for the left/right RMP. -- A32NX_RMP_R_VHF1_STANDBY +- A32NX_RMP_HF{1,2}_ACTIVE_FREQUENCY - Hz - - The VHF 1 standby frequency for the right RMP. + - The HF 1/2 active frequency that is set. -- A32NX_RMP_R_VHF3_STANDBY +- A32NX_RMP_{L,R}_HF{1,2}_STANDBY_FREQUENCY - Hz - - The VHF 3 standby frequency for the right RMP. + - The HF 1/2 standby frequency for the left/right RMP. - A32NX_RMP_{L,R}_SAVED_ACTIVE_FREQUENCY_VOR - Hz - - The VOR active frequency that is saved for display for the left/right RMP. + - The VOR active frequency that is saved for the left/right RMP. - A32NX_RMP_{L,R}_SAVED_ACTIVE_FREQUENCY_ILS - Hz - - The ILS active frequency that is saved for display for the left/right RMP. + - The ILS active frequency that is saved for the left/right RMP. - A32NX_RMP_{L,R}_SAVED_ACTIVE_FREQUENCY_ADF - Hz - - The ADF active frequency that is saved for display for the left/right RMP. + - The ADF active frequency that is saved for the left/right RMP. - A32NX_RMP_{L,R}_SAVED_STANDBY_FREQUENCY_VOR - Hz - - The VOR standby frequency that is saved for display for the left/right RMP. + - The VOR standby frequency that is saved for the left/right RMP. - A32NX_RMP_{L,R}_SAVED_STANDBY_FREQUENCY_ILS - Hz - - The ILS standby frequency that is saved for display for the left/right RMP. + - The ILS standby frequency that is saved for the left/right RMP. - A32NX_RMP_{L,R}_SAVED_STANDBY_FREQUENCY_ADF - Hz - - The ADF standby frequency that is saved for display for the left/right RMP. + - The ADF standby frequency that is saved for the left/right RMP. - A32NX_RMP_{L,R}_SAVED_COURSE_VOR - Number @@ -457,6 +460,134 @@ - Number - The ILS course tuned via the left/right RMP +- A32NX_RMP_SEL_LIGHT_ON + - Bool + - If the SEL light is on + +- A32NX_ACP{1,2,3}_VHF{1,2}_TRANSMIT + - Bool + - Indicates which VHF is selected for transmission on which ACP + Value | Meaning + --- | --- + 0 | Not selected + 1 | Selected + +- A32NX_ACP{1,2,3}_VHF{1,2,3}_VOLUME + - Number + - Volume of VHF 1/2/3 on the left/right/overhead ACP + +- A32NX_ACP{1,2,3}_HF{1,2}_VOLUME + - Number + - Volume of HF 1/2 on the left/right/overhead ACP + +- A32NX_ACP{1,2,3}_MECH_VOLUME + - Number + - Volume of MECH on the left/right/overhead ACP + +- A32NX_ACP{1,2,3}_ATT_VOLUME + - Number + - Volume of CABIN on the left/right/overhead ACP + +- A32NX_ACP{1,2,3}_PA_VOLUME + - Number + - Volume of PA on the left/right/overhead ACP + +- A32NX_HF{1,2}_VOLUME + - Number + - The HF1/2 volume equal to one of the ACPs depending on the controlling mode + +- A32NX_ACP_MECH_VOLUME + - Number + - The MECH volume equal to one of the ACPs depending on the controlling mode + +- A32NX_ACP_ATT_VOLUME + - Number + - The CABIN volume equal to one of the ACPs depending on the controlling mode + +- A32NX_ACP_PA_VOLUME + - Number + - The PA volume equal to one of the ACPs depending on the controlling mode + +- A32NX_NAV_VOLUME:{1,2,3} + - Number + - The Morse volume for the corresponding nav transceiver equal to one of the ACPs depending on the controlling mode + +- A32NX_ADF_VOLUME:{1,2} + - Number + - The Morse volume for the corresponding adf transceiver equal to one of the ACPs depending on the controlling mode + +- A32NX_ACP{1,2,3}_VHF{1,2,3}_KNOB_VOLUME_DOWN + - Bool + - If the VHF 1/2/3 volume knob is activated on the left/right/overhead ACP + +- A32NX_ACP{1,2,3}_HF{1,2}_KNOB_VOLUME_DOWN + - Bool + - If the HF 1/2 volume knob is activated on the left/right/overhead ACP + +- A32NX_ACP{1,2,3}_MECH_KNOB_VOLUME_DOWN + - Bool + - If the MECH volume knob is activated on the left/right/overhead + +- A32NX_ACP{1,2,3}_ATT_KNOB_VOLUME_DOWN + - Bool + - If the CABIN volume knob is activated on the left/right/overhead ACP + +- A32NX_ACP{1,2,3}_PA_KNOB_VOLUME_DOWN + - Bool + - If the PA volume knob is activated on the left/right/overhead ACP + +- A32NX_ACP{1,2,3}_VOR{1,2}_KNOB_VOLUME_DOWN + - Bool + - If the VOR 1/2 volume knob is activated on the left/right/overhead ACP + +- A32NX_ACP{1,2,3}_ILS_KNOB_VOLUME_DOWN + - Bool + - If the ILS volume knob is activated on the left/right/overhead ACP + +- A32NX_ACP{1,2,3}_MLS_KNOB_VOLUME_DOWN + - Bool + - If the MLS volume knob is activated on the left/right/overhead ACP + +- A32NX_ACP{1,2,3}_MKR_KNOB_VOLUME_DOWN + - Bool + - If the ILS Markers volume knob is activated on the left/right/overhead ACP + +- A32NX_ACP{1,2,3}_ADF{1,2}_KNOB_VOLUME_DOWN + - Bool + - If the ADF 1/2 volume knob is activated on the left/right/overhead ACP + +- A32NX_ACP{1,2,3}_VOR{1,2}_VOLUME + - Number + - Volume of VOR 1/2 on the left/right/overhead ACP + +- A32NX_ACP{1,2,3}_ILS_VOLUME + - Number + - Volume of ILS on the left/right/overhead ACP + +- A32NX_ACP{1,2,3}_MLS_VOLUME + - Number + - Volume of MLS on the left/right/overhead ACP + +- A32NX_ACP{1,2,3}_MKR_VOLUME + - Number + - Volume of the ILS Markers on the left/right/overhead ACP + +- A32NX_ACP{1,2,3}_ADF{1,2}_VOLUME + - Number + - Volume of ADF 1/2 on the left/right/overhead ACP + +- A32NX_ACP{1,2,3}_SWITCH_INT + - Number + - Set to 0 whenever on RAD position. 100 whenever neutral position. 200 whenever in INT position + +- A32NX_SIDE_CONTROLLING + - Enum + - Indicates which side controls the airplane + Value | Meaning + --- | --- + 0 | Captain + 1 | FO + - A32NX_TO_CONFIG_FLAPS - Enum - The pilot-entered FLAPS value in the PERF TAKE OFF page. 0 is a valid entry, -1 if not entered From 8acd84813537759661e1cacf8f0165a73c856973 Mon Sep 17 00:00:00 2001 From: juliansebline Date: Tue, 14 Jan 2025 13:05:06 +0100 Subject: [PATCH 03/64] Airbus.xml --- .../ModelBehaviorDefs/A32NX/Airbus.xml | 124 ++++++++---------- 1 file changed, 54 insertions(+), 70 deletions(-) diff --git a/fbw-a32nx/src/base/flybywire-aircraft-a320-neo/ModelBehaviorDefs/A32NX/Airbus.xml b/fbw-a32nx/src/base/flybywire-aircraft-a320-neo/ModelBehaviorDefs/A32NX/Airbus.xml index 2ee3c4a5e47..2b4ba40d24f 100644 --- a/fbw-a32nx/src/base/flybywire-aircraft-a320-neo/ModelBehaviorDefs/A32NX/Airbus.xml +++ b/fbw-a32nx/src/base/flybywire-aircraft-a320-neo/ModelBehaviorDefs/A32NX/Airbus.xml @@ -43,6 +43,57 @@ + + + + - - - From 2a2d1e4336b04cb5cc3f42852e94a01536946716 Mon Sep 17 00:00:00 2001 From: juliansebline Date: Tue, 14 Jan 2025 13:06:49 +0100 Subject: [PATCH 04/64] Interior A320 includes --- .../ModelBehaviorDefs/A32NX/Interior/A32NX_Interior_Includes.xml | 1 + 1 file changed, 1 insertion(+) diff --git a/fbw-a32nx/src/base/flybywire-aircraft-a320-neo/ModelBehaviorDefs/A32NX/Interior/A32NX_Interior_Includes.xml b/fbw-a32nx/src/base/flybywire-aircraft-a320-neo/ModelBehaviorDefs/A32NX/Interior/A32NX_Interior_Includes.xml index ff166af711b..3d521132779 100644 --- a/fbw-a32nx/src/base/flybywire-aircraft-a320-neo/ModelBehaviorDefs/A32NX/Interior/A32NX_Interior_Includes.xml +++ b/fbw-a32nx/src/base/flybywire-aircraft-a320-neo/ModelBehaviorDefs/A32NX/Interior/A32NX_Interior_Includes.xml @@ -18,6 +18,7 @@ + From ac82dc9675500d295dae7dcbf36b609cb29f3160 Mon Sep 17 00:00:00 2001 From: juliansebline Date: Tue, 14 Jan 2025 13:22:56 +0100 Subject: [PATCH 05/64] AirlinerCommon.xml --- .../A32NX/AirlinerCommon.xml | 655 +----------------- 1 file changed, 1 insertion(+), 654 deletions(-) diff --git a/fbw-a32nx/src/base/flybywire-aircraft-a320-neo/ModelBehaviorDefs/A32NX/AirlinerCommon.xml b/fbw-a32nx/src/base/flybywire-aircraft-a320-neo/ModelBehaviorDefs/A32NX/AirlinerCommon.xml index ba00ef49d0b..b15e6726e0e 100644 --- a/fbw-a32nx/src/base/flybywire-aircraft-a320-neo/ModelBehaviorDefs/A32NX/AirlinerCommon.xml +++ b/fbw-a32nx/src/base/flybywire-aircraft-a320-neo/ModelBehaviorDefs/A32NX/AirlinerCommon.xml @@ -39,13 +39,10 @@ - - - - - - - - - - From 072b8924f57e166895965b9e1693eac8473ce892 Mon Sep 17 00:00:00 2001 From: juliansebline Date: Tue, 14 Jan 2025 13:24:45 +0100 Subject: [PATCH 06/64] Climb.flt --- .../SimObjects/AirPlanes/FlyByWire_A320_NEO/Climb.flt | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/fbw-a32nx/src/base/flybywire-aircraft-a320-neo/SimObjects/AirPlanes/FlyByWire_A320_NEO/Climb.flt b/fbw-a32nx/src/base/flybywire-aircraft-a320-neo/SimObjects/AirPlanes/FlyByWire_A320_NEO/Climb.flt index d355eabc499..b23e43f5b3e 100644 --- a/fbw-a32nx/src/base/flybywire-aircraft-a320-neo/SimObjects/AirPlanes/FlyByWire_A320_NEO/Climb.flt +++ b/fbw-a32nx/src/base/flybywire-aircraft-a320-neo/SimObjects/AirPlanes/FlyByWire_A320_NEO/Climb.flt @@ -28,11 +28,11 @@ DMESelected=1 ComTransmit=1 ComReceiveBoth=False Com1Receive=True -Com2Receive=False -Com3Receive=False +Com2Receive=True +Com3Receive=True AudioNav1Listen=False AudioNav2Listen=False -AudioMarkerListen=True +AudioMarkerListen=False AudioDmeListen=False AudioAdfListen=False AudioAdf2Listen=False From 86b2987f53a626271bddf088d9501c5286d17cbf Mon Sep 17 00:00:00 2001 From: juliansebline Date: Tue, 14 Jan 2025 13:26:43 +0100 Subject: [PATCH 07/64] approach.flt --- .../AirPlanes/FlyByWire_A320_NEO/approach.FLT | 69 ++++++++++++++++--- 1 file changed, 58 insertions(+), 11 deletions(-) diff --git a/fbw-a32nx/src/base/flybywire-aircraft-a320-neo/SimObjects/AirPlanes/FlyByWire_A320_NEO/approach.FLT b/fbw-a32nx/src/base/flybywire-aircraft-a320-neo/SimObjects/AirPlanes/FlyByWire_A320_NEO/approach.FLT index 1e6595f0ae9..7671b5cd1d2 100644 --- a/fbw-a32nx/src/base/flybywire-aircraft-a320-neo/SimObjects/AirPlanes/FlyByWire_A320_NEO/approach.FLT +++ b/fbw-a32nx/src/base/flybywire-aircraft-a320-neo/SimObjects/AirPlanes/FlyByWire_A320_NEO/approach.FLT @@ -28,11 +28,11 @@ DMESelected=1 ComTransmit=1 ComReceiveBoth=False Com1Receive=True -Com2Receive=False -Com3Receive=False +Com2Receive=True +Com3Receive=True AudioNav1Listen=False AudioNav2Listen=False -AudioMarkerListen=True +AudioMarkerListen=False AudioDmeListen=False AudioAdfListen=False AudioAdf2Listen=False @@ -120,14 +120,6 @@ FoldingWingsState=0, 0 [LocalVars.0] A32NX_IS_READY=0 A32NX_START_STATE=7 -A32NX_RMP_L_TOGGLE_SWITCH=1 -A32NX_RMP_R_TOGGLE_SWITCH=1 -A32NX_RMP_L_SELECTED_MODE=1 -A32NX_RMP_R_SELECTED_MODE=2 -A32NX_RMP_L_VHF2_STANDBY_FREQUENCY=124275000 -A32NX_RMP_L_VHF3_STANDBY_FREQUENCY=135475000 -A32NX_RMP_R_VHF1_STANDBY_FREQUENCY=129675000 -A32NX_RMP_R_VHF3_STANDBY_FREQUENCY=136975000 XMLVAR_Baro1_Mode=1 A32NX_AVIONICS_STARTUP_SOUNDS_INHIBIT=1 A32NX_OVHD_ADIRS_IR_1_MODE_SELECTOR_KNOB=1 @@ -274,6 +266,61 @@ A32NX_SWITCH_ATC_ALT = 1 A32NX_GEAR_LEVER_POSITION_REQUEST = 0 A32NX_GPWS_GROUND_STATE=0 A32NX_GPWS_APPROACH_STATE=1 +A32NX_RMP_L_TOGGLE_SWITCH = 1 +A32NX_RMP_R_TOGGLE_SWITCH = 1 +A32NX_RMP_L_SELECTED_MODE = 1 +A32NX_RMP_R_SELECTED_MODE = 2 +A32NX_RMP_L_VHF2_STANDBY_FREQUENCY = 124275000 +A32NX_RMP_L_VHF3_STANDBY_FREQUENCY = 135475000 +A32NX_RMP_R_VHF1_STANDBY_FREQUENCY = 129675000 +A32NX_RMP_R_VHF3_STANDBY_FREQUENCY = 136975000 +A32NX_RMP_HF1_ACTIVE_FREQUENCY = 11345000 +A32NX_RMP_HF2_ACTIVE_FREQUENCY = 8930000 +A32NX_RMP_L_HF1_STANDBY_FREQUENCY = 17916000 +A32NX_RMP_L_HF2_STANDBY_FREQUENCY = 5541000 +A32NX_RMP_R_HF1_STANDBY_FREQUENCY = 13342000 +A32NX_RMP_R_HF2_STANDBY_FREQUENCY = 3494000 +A32NX_RMP_LS_COURSE=-1 +A32NX_RMP_VOR1_COURSE=-1 +A32NX_RMP_VOR2_COURSE=-1 +A32NX_RMP_L_SAVED_COURSE_VOR = 22 +A32NX_RMP_L_SAVED_COURSE_ILS = 202 +A32NX_RMP_R_SAVED_COURSE_VOR = 87 +A32NX_RMP_R_SAVED_COURSE_ILS = 271 +A32NX_RMP_L_SAVED_ACTIVE_FREQUENCY_VOR = 113000000 +A32NX_RMP_L_SAVED_STANDBY_FREQUENCY_VOR = 117800000 +A32NX_RMP_R_SAVED_ACTIVE_FREQUENCY_VOR = 113700000 +A32NX_RMP_R_SAVED_STANDBY_FREQUENCY_VOR = 115500000 +A32NX_RMP_L_SAVED_ACTIVE_FREQUENCY_ILS = 108900000 +A32NX_RMP_L_SAVED_STANDBY_FREQUENCY_ILS = 108900000 +A32NX_RMP_R_SAVED_ACTIVE_FREQUENCY_ILS = 110100000 +A32NX_RMP_R_SAVED_STANDBY_FREQUENCY_ILS = 111100000 +A32NX_RMP_L_SAVED_ACTIVE_FREQUENCY_ADF = 433000 +A32NX_RMP_L_SAVED_STANDBY_FREQUENCY_ADF = 433000 +A32NX_RMP_R_SAVED_ACTIVE_FREQUENCY_ADF = 420000 +A32NX_RMP_R_SAVED_STANDBY_FREQUENCY_ADF = 420000 +A32NX_AUDIOSWITCHING_KNOB = 1 +A32NX_ACP1_TRANSMIT_CHANNEL = 0 +A32NX_ACP2_TRANSMIT_CHANNEL = 0 +A32NX_ACP3_TRANSMIT_CHANNEL = 0 +A32NX_ACP1_VHF1_VOLUME = 80 +A32NX_ACP1_VHF2_VOLUME = 40 +A32NX_ACP2_VHF1_VOLUME = 80 +A32NX_ACP2_VHF2_VOLUME = 40 +A32NX_ACP3_VHF1_VOLUME = 80 +A32NX_ACP3_VHF2_VOLUME = 40 +A32NX_ACP1_VHF1_KNOB_VOLUME_DOWN = 1 +A32NX_ACP1_VHF2_KNOB_VOLUME_DOWN = 1 +A32NX_ACP2_VHF1_KNOB_VOLUME_DOWN = 1 +A32NX_ACP2_VHF2_KNOB_VOLUME_DOWN = 1 +A32NX_ACP3_VHF1_KNOB_VOLUME_DOWN = 1 +A32NX_ACP3_VHF2_KNOB_VOLUME_DOWN = 1 +A32NX_ACP1_SWITCH_INT = 100 +A32NX_ACP2_SWITCH_INT = 100 +A32NX_ACP3_SWITCH_INT = 100 +A32NX_ACP1_TRANSMIT_PUSHED = 1 +A32NX_ACP2_TRANSMIT_PUSHED = 1 +A32NX_ACP3_TRANSMIT_PUSHED = 1 [Gauges.0] KollsmanSetting=29.921342849731445313 From 6a9df32aafd208db31d03b5f97705835f79acc31 Mon Sep 17 00:00:00 2001 From: juliansebline Date: Tue, 14 Jan 2025 13:27:32 +0100 Subject: [PATCH 08/64] apron.flt --- .../AirPlanes/FlyByWire_A320_NEO/apron.FLT | 70 ++++++++++++++++--- 1 file changed, 59 insertions(+), 11 deletions(-) diff --git a/fbw-a32nx/src/base/flybywire-aircraft-a320-neo/SimObjects/AirPlanes/FlyByWire_A320_NEO/apron.FLT b/fbw-a32nx/src/base/flybywire-aircraft-a320-neo/SimObjects/AirPlanes/FlyByWire_A320_NEO/apron.FLT index eff93387130..cd9a4810bbc 100644 --- a/fbw-a32nx/src/base/flybywire-aircraft-a320-neo/SimObjects/AirPlanes/FlyByWire_A320_NEO/apron.FLT +++ b/fbw-a32nx/src/base/flybywire-aircraft-a320-neo/SimObjects/AirPlanes/FlyByWire_A320_NEO/apron.FLT @@ -33,11 +33,11 @@ DMESelected=1 ComTransmit=1 ComReceiveBoth=False Com1Receive=True -Com2Receive=False -Com3Receive=False +Com2Receive=True +Com3Receive=True AudioNav1Listen=False AudioNav2Listen=False -AudioMarkerListen=True +AudioMarkerListen=False AudioDmeListen=False AudioAdfListen=False AudioAdf2Listen=False @@ -127,14 +127,6 @@ ExternalPowerSwitch=False [LocalVars.0] A32NX_IS_READY=0 A32NX_START_STATE=2 -A32NX_RMP_L_TOGGLE_SWITCH=1 -A32NX_RMP_R_TOGGLE_SWITCH=1 -A32NX_RMP_L_SELECTED_MODE=1 -A32NX_RMP_R_SELECTED_MODE=2 -A32NX_RMP_L_VHF2_STANDBY_FREQUENCY=124275000 -A32NX_RMP_L_VHF3_STANDBY_FREQUENCY=135475000 -A32NX_RMP_R_VHF1_STANDBY_FREQUENCY=129675000 -A32NX_RMP_R_VHF3_STANDBY_FREQUENCY=136975000 XMLVAR_ENG_MODE_SEL=1 LANDING_1_Retracted=1 LANDING_2_Retracted=1 @@ -285,6 +277,62 @@ A32NX_GEAR_RIGHT_POSITION = 100 A32NX_GEAR_LEVER_POSITION_REQUEST = 1 A32NX_GPWS_GROUND_STATE=1 A32NX_GPWS_APPROACH_STATE=0 +A32NX_ECAM_SD_CURRENT_PAGE_INDEX = -1 +A32NX_RMP_L_TOGGLE_SWITCH = 1 +A32NX_RMP_R_TOGGLE_SWITCH = 1 +A32NX_RMP_L_SELECTED_MODE = 1 +A32NX_RMP_R_SELECTED_MODE = 2 +A32NX_RMP_L_VHF2_STANDBY_FREQUENCY = 124275000 +A32NX_RMP_L_VHF3_STANDBY_FREQUENCY = 135475000 +A32NX_RMP_R_VHF1_STANDBY_FREQUENCY = 129675000 +A32NX_RMP_R_VHF3_STANDBY_FREQUENCY = 136975000 +A32NX_RMP_HF1_ACTIVE_FREQUENCY = 11345000 +A32NX_RMP_HF2_ACTIVE_FREQUENCY = 8930000 +A32NX_RMP_L_HF1_STANDBY_FREQUENCY = 17916000 +A32NX_RMP_L_HF2_STANDBY_FREQUENCY = 5541000 +A32NX_RMP_R_HF1_STANDBY_FREQUENCY = 13342000 +A32NX_RMP_R_HF2_STANDBY_FREQUENCY = 3494000 +A32NX_RMP_LS_COURSE=-1 +A32NX_RMP_VOR1_COURSE=-1 +A32NX_RMP_VOR2_COURSE=-1 +A32NX_RMP_L_SAVED_COURSE_VOR = 22 +A32NX_RMP_L_SAVED_COURSE_ILS = 202 +A32NX_RMP_R_SAVED_COURSE_VOR = 87 +A32NX_RMP_R_SAVED_COURSE_ILS = 271 +A32NX_RMP_L_SAVED_ACTIVE_FREQUENCY_VOR = 113000000 +A32NX_RMP_L_SAVED_STANDBY_FREQUENCY_VOR = 117800000 +A32NX_RMP_R_SAVED_ACTIVE_FREQUENCY_VOR = 113700000 +A32NX_RMP_R_SAVED_STANDBY_FREQUENCY_VOR = 115500000 +A32NX_RMP_L_SAVED_ACTIVE_FREQUENCY_ILS = 108900000 +A32NX_RMP_L_SAVED_STANDBY_FREQUENCY_ILS = 108900000 +A32NX_RMP_R_SAVED_ACTIVE_FREQUENCY_ILS = 110100000 +A32NX_RMP_R_SAVED_STANDBY_FREQUENCY_ILS = 111100000 +A32NX_RMP_L_SAVED_ACTIVE_FREQUENCY_ADF = 433000 +A32NX_RMP_L_SAVED_STANDBY_FREQUENCY_ADF = 433000 +A32NX_RMP_R_SAVED_ACTIVE_FREQUENCY_ADF = 433000 +A32NX_RMP_R_SAVED_STANDBY_FREQUENCY_ADF = 433000 +A32NX_AUDIOSWITCHING_KNOB = 1 +A32NX_ACP1_TRANSMIT_CHANNEL = 0 +A32NX_ACP2_TRANSMIT_CHANNEL = 0 +A32NX_ACP3_TRANSMIT_CHANNEL = 0 +A32NX_ACP1_VHF1_VOLUME = 80 +A32NX_ACP1_VHF2_VOLUME = 40 +A32NX_ACP2_VHF1_VOLUME = 80 +A32NX_ACP2_VHF2_VOLUME = 40 +A32NX_ACP3_VHF1_VOLUME = 80 +A32NX_ACP3_VHF2_VOLUME = 40 +A32NX_ACP1_VHF1_KNOB_VOLUME_DOWN = 1 +A32NX_ACP1_VHF2_KNOB_VOLUME_DOWN = 1 +A32NX_ACP2_VHF1_KNOB_VOLUME_DOWN = 1 +A32NX_ACP2_VHF2_KNOB_VOLUME_DOWN = 1 +A32NX_ACP3_VHF1_KNOB_VOLUME_DOWN = 1 +A32NX_ACP3_VHF2_KNOB_VOLUME_DOWN = 1 +A32NX_ACP1_SWITCH_INT = 100 +A32NX_ACP2_SWITCH_INT = 100 +A32NX_ACP3_SWITCH_INT = 100 +A32NX_ACP1_TRANSMIT_PUSHED = 1 +A32NX_ACP2_TRANSMIT_PUSHED = 1 +A32NX_ACP3_TRANSMIT_PUSHED = 1 [Gauges.0] KollsmanSetting=29.921342849731445313 From 54620df969e1540cd681ef5b9ff516257ee72f7a Mon Sep 17 00:00:00 2001 From: juliansebline Date: Tue, 14 Jan 2025 13:28:49 +0100 Subject: [PATCH 09/64] cruise.flt --- .../AirPlanes/FlyByWire_A320_NEO/cruise.FLT | 70 ++++++++++++++++--- 1 file changed, 59 insertions(+), 11 deletions(-) diff --git a/fbw-a32nx/src/base/flybywire-aircraft-a320-neo/SimObjects/AirPlanes/FlyByWire_A320_NEO/cruise.FLT b/fbw-a32nx/src/base/flybywire-aircraft-a320-neo/SimObjects/AirPlanes/FlyByWire_A320_NEO/cruise.FLT index 04045efef29..0ec0bb7f0cf 100644 --- a/fbw-a32nx/src/base/flybywire-aircraft-a320-neo/SimObjects/AirPlanes/FlyByWire_A320_NEO/cruise.FLT +++ b/fbw-a32nx/src/base/flybywire-aircraft-a320-neo/SimObjects/AirPlanes/FlyByWire_A320_NEO/cruise.FLT @@ -28,11 +28,11 @@ DMESelected=1 ComTransmit=1 ComReceiveBoth=False Com1Receive=True -Com2Receive=False -Com3Receive=False +Com2Receive=True +Com3Receive=True AudioNav1Listen=False AudioNav2Listen=False -AudioMarkerListen=True +AudioMarkerListen=False AudioDmeListen=False AudioAdfListen=False AudioAdf2Listen=False @@ -120,14 +120,6 @@ FoldingWingsState=0, 0 [LocalVars.0] A32NX_IS_READY=0 A32NX_START_STATE=6 -A32NX_RMP_L_TOGGLE_SWITCH=1 -A32NX_RMP_R_TOGGLE_SWITCH=1 -A32NX_RMP_L_SELECTED_MODE=1 -A32NX_RMP_R_SELECTED_MODE=2 -A32NX_RMP_L_VHF2_STANDBY_FREQUENCY=124275000 -A32NX_RMP_L_VHF3_STANDBY_FREQUENCY=135475000 -A32NX_RMP_R_VHF1_STANDBY_FREQUENCY=129675000 -A32NX_RMP_R_VHF3_STANDBY_FREQUENCY=136975000 XMLVAR_Baro1_Mode=1 A32NX_AVIONICS_STARTUP_SOUNDS_INHIBIT=1 A32NX_OVHD_ADIRS_IR_1_MODE_SELECTOR_KNOB=1 @@ -279,6 +271,62 @@ LANDING_2_Retracted = 1 LANDING_3_Retracted = 1 A32NX_GPWS_GROUND_STATE=0 A32NX_GPWS_APPROACH_STATE=1 +A32NX_ECAM_SD_CURRENT_PAGE_INDEX = -1 +A32NX_RMP_L_TOGGLE_SWITCH = 1 +A32NX_RMP_R_TOGGLE_SWITCH = 1 +A32NX_RMP_L_SELECTED_MODE = 1 +A32NX_RMP_R_SELECTED_MODE = 2 +A32NX_RMP_L_VHF2_STANDBY_FREQUENCY = 124275000 +A32NX_RMP_L_VHF3_STANDBY_FREQUENCY = 135475000 +A32NX_RMP_R_VHF1_STANDBY_FREQUENCY = 129675000 +A32NX_RMP_R_VHF3_STANDBY_FREQUENCY = 136975000 +A32NX_RMP_HF1_ACTIVE_FREQUENCY = 11345000 +A32NX_RMP_HF2_ACTIVE_FREQUENCY = 8930000 +A32NX_RMP_L_HF1_STANDBY_FREQUENCY = 17916000 +A32NX_RMP_L_HF2_STANDBY_FREQUENCY = 5541000 +A32NX_RMP_R_HF1_STANDBY_FREQUENCY = 13342000 +A32NX_RMP_R_HF2_STANDBY_FREQUENCY = 3494000 +A32NX_RMP_LS_COURSE=-1 +A32NX_RMP_VOR1_COURSE=-1 +A32NX_RMP_VOR2_COURSE=-1 +A32NX_RMP_L_SAVED_COURSE_VOR = 22 +A32NX_RMP_L_SAVED_COURSE_ILS = 202 +A32NX_RMP_R_SAVED_COURSE_VOR = 87 +A32NX_RMP_R_SAVED_COURSE_ILS = 271 +A32NX_RMP_L_SAVED_ACTIVE_FREQUENCY_VOR = 113000000 +A32NX_RMP_L_SAVED_STANDBY_FREQUENCY_VOR = 117800000 +A32NX_RMP_R_SAVED_ACTIVE_FREQUENCY_VOR = 113700000 +A32NX_RMP_R_SAVED_STANDBY_FREQUENCY_VOR = 115500000 +A32NX_RMP_L_SAVED_ACTIVE_FREQUENCY_ILS = 108900000 +A32NX_RMP_L_SAVED_STANDBY_FREQUENCY_ILS = 108900000 +A32NX_RMP_R_SAVED_ACTIVE_FREQUENCY_ILS = 110100000 +A32NX_RMP_R_SAVED_STANDBY_FREQUENCY_ILS = 111100000 +A32NX_RMP_L_SAVED_ACTIVE_FREQUENCY_ADF = 433000 +A32NX_RMP_L_SAVED_STANDBY_FREQUENCY_ADF = 433000 +A32NX_RMP_R_SAVED_ACTIVE_FREQUENCY_ADF = 420000 +A32NX_RMP_R_SAVED_STANDBY_FREQUENCY_ADF = 420000 +A32NX_AUDIOSWITCHING_KNOB = 1 +A32NX_ACP1_TRANSMIT_CHANNEL = 0 +A32NX_ACP2_TRANSMIT_CHANNEL = 0 +A32NX_ACP3_TRANSMIT_CHANNEL = 0 +A32NX_ACP1_VHF1_VOLUME = 80 +A32NX_ACP1_VHF2_VOLUME = 40 +A32NX_ACP2_VHF1_VOLUME = 80 +A32NX_ACP2_VHF2_VOLUME = 40 +A32NX_ACP3_VHF1_VOLUME = 80 +A32NX_ACP3_VHF2_VOLUME = 40 +A32NX_ACP1_VHF1_KNOB_VOLUME_DOWN = 1 +A32NX_ACP1_VHF2_KNOB_VOLUME_DOWN = 1 +A32NX_ACP2_VHF1_KNOB_VOLUME_DOWN = 1 +A32NX_ACP2_VHF2_KNOB_VOLUME_DOWN = 1 +A32NX_ACP3_VHF1_KNOB_VOLUME_DOWN = 1 +A32NX_ACP3_VHF2_KNOB_VOLUME_DOWN = 1 +A32NX_ACP1_SWITCH_INT = 100 +A32NX_ACP2_SWITCH_INT = 100 +A32NX_ACP3_SWITCH_INT = 100 +A32NX_ACP1_TRANSMIT_PUSHED = 1 +A32NX_ACP2_TRANSMIT_PUSHED = 1 +A32NX_ACP3_TRANSMIT_PUSHED = 1 [Gauges.0] KollsmanSetting=29.921342849731445313 From 46836f34359c4a1ddd5add89e71397b9d5c83123 Mon Sep 17 00:00:00 2001 From: juliansebline Date: Tue, 14 Jan 2025 13:29:49 +0100 Subject: [PATCH 10/64] final.flt --- .../AirPlanes/FlyByWire_A320_NEO/final.FLT | 68 ++++++++++++++++--- 1 file changed, 58 insertions(+), 10 deletions(-) diff --git a/fbw-a32nx/src/base/flybywire-aircraft-a320-neo/SimObjects/AirPlanes/FlyByWire_A320_NEO/final.FLT b/fbw-a32nx/src/base/flybywire-aircraft-a320-neo/SimObjects/AirPlanes/FlyByWire_A320_NEO/final.FLT index e1769c43dd6..01aaeec78f9 100644 --- a/fbw-a32nx/src/base/flybywire-aircraft-a320-neo/SimObjects/AirPlanes/FlyByWire_A320_NEO/final.FLT +++ b/fbw-a32nx/src/base/flybywire-aircraft-a320-neo/SimObjects/AirPlanes/FlyByWire_A320_NEO/final.FLT @@ -28,8 +28,8 @@ DMESelected=1 ComTransmit=1 ComReceiveBoth=False Com1Receive=True -Com2Receive=False -Com3Receive=False +Com2Receive=True +Com3Receive=True AudioNav1Listen=False AudioNav2Listen=False AudioMarkerListen=True @@ -116,14 +116,7 @@ SeatBeltsSwitch = True [LocalVars.0] A32NX_IS_READY=0 A32NX_START_STATE=8 -A32NX_RMP_L_TOGGLE_SWITCH=1 -A32NX_RMP_R_TOGGLE_SWITCH=1 -A32NX_RMP_L_SELECTED_MODE=1 -A32NX_RMP_R_SELECTED_MODE=2 -A32NX_RMP_L_VHF2_STANDBY_FREQUENCY=124275000 -A32NX_RMP_L_VHF3_STANDBY_FREQUENCY=135475000 -A32NX_RMP_R_VHF1_STANDBY_FREQUENCY=129675000 -A32NX_RMP_R_VHF3_STANDBY_FREQUENCY=136975000 + XMLVAR_Baro1_Mode=1 A320_NEO_CDU_START_PAGE=35 A32NX_AVIONICS_STARTUP_SOUNDS_INHIBIT=1 @@ -275,6 +268,61 @@ A32NX_GEAR_CENTER_POSITION = 100 A32NX_GEAR_LEFT_POSITION = 100 A32NX_GEAR_RIGHT_POSITION = 100 A32NX_GEAR_LEVER_POSITION_REQUEST = 1 +A32NX_RMP_L_TOGGLE_SWITCH = 1 +A32NX_RMP_R_TOGGLE_SWITCH = 1 +A32NX_RMP_L_SELECTED_MODE = 1 +A32NX_RMP_R_SELECTED_MODE = 2 +A32NX_RMP_L_VHF2_STANDBY_FREQUENCY = 124275000 +A32NX_RMP_L_VHF3_STANDBY_FREQUENCY = 135475000 +A32NX_RMP_R_VHF1_STANDBY_FREQUENCY = 129675000 +A32NX_RMP_R_VHF3_STANDBY_FREQUENCY = 136975000 +A32NX_RMP_HF1_ACTIVE_FREQUENCY = 11345000 +A32NX_RMP_HF2_ACTIVE_FREQUENCY = 8930000 +A32NX_RMP_L_HF1_STANDBY_FREQUENCY = 17916000 +A32NX_RMP_L_HF2_STANDBY_FREQUENCY = 5541000 +A32NX_RMP_R_HF1_STANDBY_FREQUENCY = 13342000 +A32NX_RMP_R_HF2_STANDBY_FREQUENCY = 3494000 +A32NX_RMP_LS_COURSE=-1 +A32NX_RMP_VOR1_COURSE=-1 +A32NX_RMP_VOR2_COURSE=-1 +A32NX_RMP_L_SAVED_COURSE_VOR = 22 +A32NX_RMP_L_SAVED_COURSE_ILS = 202 +A32NX_RMP_R_SAVED_COURSE_VOR = 87 +A32NX_RMP_R_SAVED_COURSE_ILS = 271 +A32NX_RMP_L_SAVED_ACTIVE_FREQUENCY_VOR = 113000000 +A32NX_RMP_L_SAVED_STANDBY_FREQUENCY_VOR = 117800000 +A32NX_RMP_R_SAVED_ACTIVE_FREQUENCY_VOR = 113700000 +A32NX_RMP_R_SAVED_STANDBY_FREQUENCY_VOR = 115500000 +A32NX_RMP_L_SAVED_ACTIVE_FREQUENCY_ILS = 108900000 +A32NX_RMP_L_SAVED_STANDBY_FREQUENCY_ILS = 108900000 +A32NX_RMP_R_SAVED_ACTIVE_FREQUENCY_ILS = 110100000 +A32NX_RMP_R_SAVED_STANDBY_FREQUENCY_ILS = 111100000 +A32NX_RMP_L_SAVED_ACTIVE_FREQUENCY_ADF = 433000 +A32NX_RMP_L_SAVED_STANDBY_FREQUENCY_ADF = 433000 +A32NX_RMP_R_SAVED_ACTIVE_FREQUENCY_ADF = 420000 +A32NX_RMP_R_SAVED_STANDBY_FREQUENCY_ADF = 420000 +A32NX_AUDIOSWITCHING_KNOB = 1 +A32NX_ACP1_TRANSMIT_CHANNEL = 0 +A32NX_ACP2_TRANSMIT_CHANNEL = 0 +A32NX_ACP3_TRANSMIT_CHANNEL = 0 +A32NX_ACP1_VHF1_VOLUME = 80 +A32NX_ACP1_VHF2_VOLUME = 40 +A32NX_ACP2_VHF1_VOLUME = 80 +A32NX_ACP2_VHF2_VOLUME = 40 +A32NX_ACP3_VHF1_VOLUME = 80 +A32NX_ACP3_VHF2_VOLUME = 40 +A32NX_ACP1_VHF1_KNOB_VOLUME_DOWN = 1 +A32NX_ACP1_VHF2_KNOB_VOLUME_DOWN = 1 +A32NX_ACP2_VHF1_KNOB_VOLUME_DOWN = 1 +A32NX_ACP2_VHF2_KNOB_VOLUME_DOWN = 1 +A32NX_ACP3_VHF1_KNOB_VOLUME_DOWN = 1 +A32NX_ACP3_VHF2_KNOB_VOLUME_DOWN = 1 +A32NX_ACP1_SWITCH_INT = 100 +A32NX_ACP2_SWITCH_INT = 100 +A32NX_ACP3_SWITCH_INT = 100 +A32NX_ACP1_TRANSMIT_PUSHED = 1 +A32NX_ACP2_TRANSMIT_PUSHED = 1 +A32NX_ACP3_TRANSMIT_PUSHED = 1 [Gauges.0] KollsmanSetting=29.921342849731445313 From 840643cb3950674f064fd96060195ca6c4d51a8e Mon Sep 17 00:00:00 2001 From: juliansebline Date: Tue, 14 Jan 2025 13:30:43 +0100 Subject: [PATCH 11/64] hangar.flt --- .../AirPlanes/FlyByWire_A320_NEO/hangar.flt | 69 ++++++++++++++++--- 1 file changed, 58 insertions(+), 11 deletions(-) diff --git a/fbw-a32nx/src/base/flybywire-aircraft-a320-neo/SimObjects/AirPlanes/FlyByWire_A320_NEO/hangar.flt b/fbw-a32nx/src/base/flybywire-aircraft-a320-neo/SimObjects/AirPlanes/FlyByWire_A320_NEO/hangar.flt index b61b37d7804..8531a97c0ea 100644 --- a/fbw-a32nx/src/base/flybywire-aircraft-a320-neo/SimObjects/AirPlanes/FlyByWire_A320_NEO/hangar.flt +++ b/fbw-a32nx/src/base/flybywire-aircraft-a320-neo/SimObjects/AirPlanes/FlyByWire_A320_NEO/hangar.flt @@ -33,11 +33,11 @@ DMESelected=1 ComTransmit=1 ComReceiveBoth=False Com1Receive=True -Com2Receive=False -Com3Receive=False +Com2Receive=True +Com3Receive=True AudioNav1Listen=False AudioNav2Listen=False -AudioMarkerListen=True +AudioMarkerListen=False AudioDmeListen=False AudioAdfListen=False AudioAdf2Listen=False @@ -124,14 +124,6 @@ ExternalPowerSwitch=False [LocalVars.0] A32NX_IS_READY=0 A32NX_START_STATE=1 -A32NX_RMP_L_TOGGLE_SWITCH=1 -A32NX_RMP_R_TOGGLE_SWITCH=1 -A32NX_RMP_L_SELECTED_MODE=1 -A32NX_RMP_R_SELECTED_MODE=2 -A32NX_RMP_L_VHF2_STANDBY_FREQUENCY=124275000 -A32NX_RMP_L_VHF3_STANDBY_FREQUENCY=135475000 -A32NX_RMP_R_VHF1_STANDBY_FREQUENCY=129675000 -A32NX_RMP_R_VHF3_STANDBY_FREQUENCY=136975000 XMLVAR_ENG_MODE_SEL=1 LANDING_1_Retracted=1 LANDING_2_Retracted=1 @@ -256,6 +248,61 @@ A32NX_GEAR_RIGHT_POSITION = 100 A32NX_GEAR_LEVER_POSITION_REQUEST = 1 A32NX_GPWS_GROUND_STATE=1 A32NX_GPWS_APPROACH_STATE=0 +A32NX_RMP_L_TOGGLE_SWITCH = 1 +A32NX_RMP_R_TOGGLE_SWITCH = 1 +A32NX_RMP_L_SELECTED_MODE = 1 +A32NX_RMP_R_SELECTED_MODE = 2 +A32NX_RMP_L_VHF2_STANDBY_FREQUENCY = 124275000 +A32NX_RMP_L_VHF3_STANDBY_FREQUENCY = 135475000 +A32NX_RMP_R_VHF1_STANDBY_FREQUENCY = 129675000 +A32NX_RMP_R_VHF3_STANDBY_FREQUENCY = 136975000 +A32NX_RMP_HF1_ACTIVE_FREQUENCY = 11345000 +A32NX_RMP_HF2_ACTIVE_FREQUENCY = 8930000 +A32NX_RMP_L_HF1_STANDBY_FREQUENCY = 17916000 +A32NX_RMP_L_HF2_STANDBY_FREQUENCY = 5541000 +A32NX_RMP_R_HF1_STANDBY_FREQUENCY = 13342000 +A32NX_RMP_R_HF2_STANDBY_FREQUENCY = 3494000 +A32NX_RMP_LS_COURSE=-1 +A32NX_RMP_VOR1_COURSE=-1 +A32NX_RMP_VOR2_COURSE=-1 +A32NX_RMP_L_SAVED_COURSE_VOR = 22 +A32NX_RMP_L_SAVED_COURSE_ILS = 202 +A32NX_RMP_R_SAVED_COURSE_VOR = 87 +A32NX_RMP_R_SAVED_COURSE_ILS = 271 +A32NX_RMP_L_SAVED_ACTIVE_FREQUENCY_VOR = 113000000 +A32NX_RMP_L_SAVED_STANDBY_FREQUENCY_VOR = 117800000 +A32NX_RMP_R_SAVED_ACTIVE_FREQUENCY_VOR = 113700000 +A32NX_RMP_R_SAVED_STANDBY_FREQUENCY_VOR = 115500000 +A32NX_RMP_L_SAVED_ACTIVE_FREQUENCY_ILS = 108900000 +A32NX_RMP_L_SAVED_STANDBY_FREQUENCY_ILS = 108900000 +A32NX_RMP_R_SAVED_ACTIVE_FREQUENCY_ILS = 110100000 +A32NX_RMP_R_SAVED_STANDBY_FREQUENCY_ILS = 111100000 +A32NX_RMP_L_SAVED_ACTIVE_FREQUENCY_ADF = 433000 +A32NX_RMP_L_SAVED_STANDBY_FREQUENCY_ADF = 433000 +A32NX_RMP_R_SAVED_ACTIVE_FREQUENCY_ADF = 420000 +A32NX_RMP_R_SAVED_STANDBY_FREQUENCY_ADF = 420000 +A32NX_AUDIOSWITCHING_KNOB = 1 +A32NX_ACP1_TRANSMIT_CHANNEL = 0 +A32NX_ACP2_TRANSMIT_CHANNEL = 0 +A32NX_ACP3_TRANSMIT_CHANNEL = 0 +A32NX_ACP1_VHF1_VOLUME = 80 +A32NX_ACP1_VHF2_VOLUME = 40 +A32NX_ACP2_VHF1_VOLUME = 80 +A32NX_ACP2_VHF2_VOLUME = 40 +A32NX_ACP3_VHF1_VOLUME = 80 +A32NX_ACP3_VHF2_VOLUME = 40 +A32NX_ACP1_VHF1_KNOB_VOLUME_DOWN = 1 +A32NX_ACP1_VHF2_KNOB_VOLUME_DOWN = 1 +A32NX_ACP2_VHF1_KNOB_VOLUME_DOWN = 1 +A32NX_ACP2_VHF2_KNOB_VOLUME_DOWN = 1 +A32NX_ACP3_VHF1_KNOB_VOLUME_DOWN = 1 +A32NX_ACP3_VHF2_KNOB_VOLUME_DOWN = 1 +A32NX_ACP1_SWITCH_INT = 100 +A32NX_ACP2_SWITCH_INT = 100 +A32NX_ACP3_SWITCH_INT = 100 +A32NX_ACP1_TRANSMIT_PUSHED = 1 +A32NX_ACP2_TRANSMIT_PUSHED = 1 +A32NX_ACP3_TRANSMIT_PUSHED = 1 [Gauges.0] KollsmanSetting=29.921342849731445313 From 233f59af7f269f65163f5e464cf60c78a0202552 Mon Sep 17 00:00:00 2001 From: juliansebline Date: Tue, 14 Jan 2025 13:39:53 +0100 Subject: [PATCH 12/64] A320 Interior.xml --- .../model/A320_NEO_INTERIOR.xml | 754 ++++++------------ 1 file changed, 245 insertions(+), 509 deletions(-) diff --git a/fbw-a32nx/src/base/flybywire-aircraft-a320-neo/SimObjects/AirPlanes/FlyByWire_A320_NEO/model/A320_NEO_INTERIOR.xml b/fbw-a32nx/src/base/flybywire-aircraft-a320-neo/SimObjects/AirPlanes/FlyByWire_A320_NEO/model/A320_NEO_INTERIOR.xml index 31839d0d653..a8fb2563999 100644 --- a/fbw-a32nx/src/base/flybywire-aircraft-a320-neo/SimObjects/AirPlanes/FlyByWire_A320_NEO/model/A320_NEO_INTERIOR.xml +++ b/fbw-a32nx/src/base/flybywire-aircraft-a320-neo/SimObjects/AirPlanes/FlyByWire_A320_NEO/model/A320_NEO_INTERIOR.xml @@ -2475,6 +2475,7 @@ 3 (L:A32NX_ELEC_AC_1_BUS_IS_POWERED, Bool) + @@ -2761,8 +2762,8 @@ KNOB - ASOBO_GT_Switch_Dummy - KNOB_OVHD_AUDIOSWITCH + FBW_Airbus_AudioSwitching_Knob + KNOB_OVHD_AUDIOSWITCH KNOB_OVHD_AUDIOSWITCH KNOB_OVHD_AUDIOSWITCH 3 @@ -3046,161 +3047,6 @@ - - - - 1 - (L:A32NX_OVHD_INTLT_ANN) 0 == (L:A32NX_ELEC_DC_2_BUS_IS_POWERED, Bool) and (L:A32NX_ELEC_AC_1_BUS_IS_POWERED, Bool) and - 86 - 1 - False - False - - - - - PUSH_OVHD_RADIO_VOR1_EMIS - (L:A32NX_ELEC_DC_1_BUS_IS_POWERED, Bool) - - - - PUSH_OVHD_RADIO_VOR2_EMIS - (L:A32NX_ELEC_DC_1_BUS_IS_POWERED, Bool) - - - - PUSH_OVHD_RADIO_MKR_EMIS - (L:A32NX_ELEC_DC_1_BUS_IS_POWERED, Bool) - - - - PUSH_OVHD_RADIO_ILS_EMIS - (L:A32NX_ELEC_DC_1_BUS_IS_POWERED, Bool) - - - - PUSH_OVHD_RADIO_MLS_EMIS - (L:A32NX_ELEC_DC_1_BUS_IS_POWERED, Bool) - - - - PUSH_OVHD_RADIO_ADF1_EMIS - (L:A32NX_ELEC_DC_1_BUS_IS_POWERED, Bool) - - - - PUSH_OVHD_RADIO_ADF2_EMIS - (L:A32NX_ELEC_DC_1_BUS_IS_POWERED, Bool) - - - - PUSH_OVHD_RADIO_INT_EMIS - (L:A32NX_ELEC_DC_1_BUS_IS_POWERED, Bool) - - - - SWITCH_OVHD_RADIO_INT - - - - - - PUSH_OVHD_RADIO_VOICE - (L:A32NX_ELEC_DC_1_BUS_IS_POWERED, Bool) - (L:A32NX_ELEC_AC_1_BUS_IS_POWERED, Bool) - - - - PUSH_OVHD_RADIO_RESET - (L:A32NX_ELEC_AC_1_BUS_IS_POWERED, Bool) - - - - - PUSH_OVHD_RADIO_PA1_EMIS - (L:A32NX_ELEC_DC_1_BUS_IS_POWERED, Bool) - - - - PUSH_OVHD_RADIO_PA - (L:A32NX_ELEC_DC_1_BUS_IS_POWERED, Bool) - - - - - PUSH_OVHD_RADIO_VHF1_EMIS - (L:A32NX_ELEC_DC_1_BUS_IS_POWERED, Bool) - - - - PUSH_OVHD_RADIO_VHF2_EMIS - (L:A32NX_ELEC_DC_1_BUS_IS_POWERED, Bool) - - - - PUSH_OVHD_RADIO_VHF3_EMIS - (L:A32NX_ELEC_DC_1_BUS_IS_POWERED, Bool) - - - - PUSH_OVHD_RADIO_HF1_EMIS - (L:A32NX_ELEC_DC_1_BUS_IS_POWERED, Bool) - - - - PUSH_OVHD_RADIO_HF2_EMIS - (L:A32NX_ELEC_DC_1_BUS_IS_POWERED, Bool) - - - - PUSH_OVHD_RADIO_CAB_EMIS - (L:A32NX_ELEC_DC_1_BUS_IS_POWERED, Bool) - - - - PUSH_OVHD_RADIO_ATT - (L:A32NX_ELEC_DC_1_BUS_IS_POWERED, Bool) - (L:A32NX_ELEC_AC_1_BUS_IS_POWERED, Bool) - - - - PUSH_OVHD_RADIO_MECH - (L:A32NX_ELEC_DC_1_BUS_IS_POWERED, Bool) - (L:A32NX_ELEC_AC_1_BUS_IS_POWERED, Bool) - - - - PUSH_OVHD_RADIO_CALL5 - (L:A32NX_ELEC_DC_1_BUS_IS_POWERED, Bool) - (L:A32NX_ELEC_AC_1_BUS_IS_POWERED, Bool) - - - - PUSH_OVHD_RADIO_CALL4 - (L:A32NX_ELEC_DC_1_BUS_IS_POWERED, Bool) - (L:A32NX_ELEC_AC_1_BUS_IS_POWERED, Bool) - - - - PUSH_OVHD_RADIO_CALL3 - (L:A32NX_ELEC_DC_1_BUS_IS_POWERED, Bool) - (L:A32NX_ELEC_AC_1_BUS_IS_POWERED, Bool) - - - - PUSH_OVHD_RADIO_CALL2 - (L:A32NX_ELEC_DC_1_BUS_IS_POWERED, Bool) - (L:A32NX_ELEC_AC_1_BUS_IS_POWERED, Bool) - - - - PUSH_OVHD_RADIO_CALL1 - (L:A32NX_ELEC_DC_1_BUS_IS_POWERED, Bool) - (L:A32NX_ELEC_AC_1_BUS_IS_POWERED, Bool) - - - - @@ -4448,11 +4294,10 @@ AIRBUS @StopLockHighlight + (L:A32NX_ELEC_AC_1_BUS_IS_POWERED, Bool) + (L:A32NX_OVHD_INTLT_ANN, number) 2 == (L:A32NX_ELEC_DC_2_BUS_IS_POWERED) and if{ 0.1 } els{ 1 } + (L:A32NX_OVHD_INTLT_ANN, number) 0 == (L:A32NX_ELEC_DC_2_BUS_IS_POWERED, bool) and - - - - @@ -4461,37 +4306,16 @@ 1 L - (L:A32NX_ELEC_DC_ESS_BUS_IS_POWERED, Bool) - (L:A32NX_ELEC_DC_ESS_BUS_IS_POWERED, Bool) + (L:A32NX_ELEC_AC_ESS_BUS_IS_POWERED, Bool) (L:A32NX_ELEC_AC_STAT_INV_BUS_IS_POWERED, Bool) or + (L:A32NX_ELEC_DC_ESS_BUS_IS_POWERED, Bool) (L:A32NX_RMP_L_TOGGLE_SWITCH, bool) and - - - 0 (>L:XMLVAR_COM_PANEL1_Transmit_Channel) - 4 (>L:XMLVAR_COM_PANEL2_Transmit_Channel) - - 0 (>K:PILOT_TRANSMITTER_SET) - 4 (>K:COPILOT_TRANSMITTER_SET) - - 1 (>L:XMLVAR_COM_1_VHF_L_Switch_Down) - 1 (>L:XMLVAR_COM_1_VHF_C_Switch_Down) - 1 (>L:XMLVAR_COM_2_VHF_L_Switch_Down) - 1 (>L:XMLVAR_COM_2_VHF_C_Switch_Down) - - 1 (>K:COM1_RECEIVE_SELECT) - 1 (>K:COM2_RECEIVE_SELECT) - 1 (>K:COM3_RECEIVE_SELECT) - - 0.8 (>L:XMLVAR_COM_1_Volume_VHF_L) - 0.4 (>L:XMLVAR_COM_1_Volume_VHF_C) - 0.8 (>L:XMLVAR_COM_2_Volume_VHF_L) - 0.4 (>L:XMLVAR_COM_2_Volume_VHF_C) - 1 L + (L:A32NX_ELEC_AC_ESS_BUS_IS_POWERED, Bool) (L:A32NX_ELEC_AC_STAT_INV_BUS_IS_POWERED, Bool) or + (L:A32NX_ELEC_DC_ESS_BUS_IS_POWERED, Bool) KNOB_AUDIOL_VHF1 PUSH_AUDIOL_VHF1_EMIS KNOB_AUDIOL_VHF1 @@ -4500,6 +4324,7 @@ PUSH_AUDIOL_CALL1 PUSH_AUDIOL_CALL1_SEQ1 PUSH_AUDIOL_CALL1_SEQ2 + KNOB_AUDIOL_VHF2 PUSH_AUDIOL_VHF2_EMIS KNOB_AUDIOL_VHF2 @@ -4508,18 +4333,69 @@ PUSH_AUDIOL_CALL2 PUSH_AUDIOL_CALL2_SEQ1 PUSH_AUDIOL_CALL2_SEQ2 + KNOB_AUDIOL_VHF3 PUSH_AUDIOL_VHF3_EMIS KNOB_AUDIOL_VHF3 PUSH_AUDIOL_VHF3 PUSH_AUDIOL_CALL3 PUSH_AUDIOL_CALL3 + PUSH_AUDIOL_CALL3_SEQ1 + PUSH_AUDIOL_CALL3_SEQ2 + + KNOB_AUDIOL_HF1 + PUSH_AUDIOL_HF1_EMIS + KNOB_AUDIOL_HF1 + PUSH_AUDIOL_HF1 + PUSH_AUDIOL_CALL4 + PUSH_AUDIOL_CALL4 + PUSH_AUDIOL_CALL4_SEQ1 + PUSH_AUDIOL_CALL4_SEQ2 + + KNOB_AUDIOL_HF2 + PUSH_AUDIOL_HF2_EMIS + KNOB_AUDIOL_HF2 + PUSH_AUDIOL_HF2 + PUSH_AUDIOL_CALL5 + PUSH_AUDIOL_CALL5 + PUSH_AUDIOL_CALL5_SEQ1 + PUSH_AUDIOL_CALL5_SEQ2 + + KNOB_AUDIOL_INT + PUSH_AUDIOL_INT_EMIS + KNOB_AUDIOL_INT + PUSH_AUDIOL_INT + PUSH_AUDIOL_MECH + PUSH_AUDIOL_MECH + PUSH_AUDIOL_MECH_SEQ1 + PUSH_AUDIOL_MECH_SEQ2 + + KNOB_AUDIOL_CAB + PUSH_AUDIOL_CAB_EMIS + KNOB_AUDIOL_CAB + PUSH_AUDIOL_CAB + PUSH_AUDIOL_ATT + PUSH_AUDIOL_ATT + PUSH_AUDIOL_ATT_SEQ1 + PUSH_AUDIOL_ATT_SEQ2 + + KNOB_AUDIOL_PA + PUSH_AUDIOL_PA1_EMIS + KNOB_AUDIOL_PA + PUSH_AUDIOL_PA1 + PUSH_AUDIOL_PA + PUSH_AUDIOL_PA + PUSH_AUDIOL_PA_SEQ1 PUSH_AUDIOL_VOICE PUSH_AUDIOL_VOICE PUSH_AUDIOL_VOICE_SEQ1 PUSH_AUDIOL_VOICE_SEQ2 + PUSH_AUDIOR_RESET + PUSH_AUDIOR_RESET + PUSH_AUDIOR_RESET_SEQ2 + KNOB_AUDIOL_MKR PUSH_AUDIOL_MKR_EMIS KNOB_AUDIOL_MKR @@ -4540,7 +4416,7 @@ KNOB_AUDIOL_ILS PUSH_AUDIOL_ILS - + KNOB_AUDIOL_MLS PUSH_AUDIOL_MLS_EMIS KNOB_AUDIOL_MLS @@ -4556,71 +4432,8 @@ KNOB_AUDIOL_ADF2 PUSH_AUDIOL_ADF2 - PUSH_AUDIOL_CALL3_SEQ1 - PUSH_AUDIOL_CALL3_SEQ2 - - - - 1 - 85 - (L:A32NX_OVHD_INTLT_ANN) 0 == (L:A32NX_ELEC_DC_2_BUS_IS_POWERED, Bool) and (L:A32NX_ELEC_AC_1_BUS_IS_POWERED, Bool) and - 1 - False - False - - - PUSH_AUDIOL_RESET - 0 - 0 - - - PUSH_AUDIOL_PA - 0 - 0 - - - PUSH_AUDIOL_ATT - 0 - 0 - - - PUSH_AUDIOL_MECH - 0 - 0 + SWITCH_AUDIOL_INT - - PUSH_AUDIOL_CALL4 - 0 - 0 - - - PUSH_AUDIOL_CALL5 - 0 - 0 - - - - - PUSH_AUDIOL_HF1_EMIS - 0 - - - PUSH_AUDIOL_HF2_EMIS - 0 - - - PUSH_AUDIOL_INT_EMIS - 0 - - - PUSH_AUDIOL_CAB_EMIS - 0 - - - PUSH_AUDIOL_PA1_EMIS - 0 - - @@ -4631,25 +4444,16 @@ 2 R - (L:A32NX_ELEC_DC_2_BUS_IS_POWERED, Bool) - (L:A32NX_ELEC_DC_2_BUS_IS_POWERED, Bool) + (L:A32NX_ELEC_AC_2_BUS_IS_POWERED, Bool) + (L:A32NX_ELEC_DC_2_BUS_IS_POWERED, Bool) (L:A32NX_RMP_R_TOGGLE_SWITCH, bool) and - - 0 (>L:XMLVAR_COM_PANEL2_Transmit_Channel) - 0 (>K:COPILOT_TRANSMITTER_SET) - - 1 (>L:XMLVAR_COM_2_VHF_L_Switch_Down) - 1 (>L:XMLVAR_COM_2_VHF_C_Switch_Down) - - 0.8 (>L:XMLVAR_COM_2_Volume_VHF_L) - 0.4 (>L:XMLVAR_COM_2_Volume_VHF_C) - 0 (>L:XMLVAR_COM_2_Volume_VHF_R) - 2 R + (L:A32NX_ELEC_AC_ESS_BUS_IS_POWERED, Bool) + (L:A32NX_ELEC_DC_ESS_BUS_IS_POWERED, Bool) KNOB_AUDIOR_VHF1 PUSH_AUDIOR_VHF1_EMIS KNOB_AUDIOR_VHF1 @@ -4658,6 +4462,7 @@ PUSH_AUDIOR_CALL1 PUSH_AUDIOR_CALL1_SEQ1 PUSH_AUDIOR_CALL1_SEQ2 + KNOB_AUDIOR_VHF2 PUSH_AUDIOR_VHF2_EMIS KNOB_AUDIOR_VHF2 @@ -4666,6 +4471,7 @@ PUSH_AUDIOR_CALL2 PUSH_AUDIOR_CALL2_SEQ1 PUSH_AUDIOR_CALL2_SEQ2 + KNOB_AUDIOR_VHF3 PUSH_AUDIOR_VHF3_EMIS KNOB_AUDIOR_VHF3 @@ -4675,11 +4481,59 @@ PUSH_AUDIOR_CALL3_SEQ1 PUSH_AUDIOR_CALL3_SEQ2 + KNOB_AUDIOR_HF1 + PUSH_AUDIOR_HF1_EMIS + KNOB_AUDIOR_HF1 + PUSH_AUDIOR_HF1 + PUSH_AUDIOR_CALL4 + PUSH_AUDIOR_CALL4 + PUSH_AUDIOR_CALL4_SEQ1 + PUSH_AUDIOR_CALL4_SEQ2 + + KNOB_AUDIOR_HF2 + PUSH_AUDIOR_HF2_EMIS + KNOB_AUDIOR_HF2 + PUSH_AUDIOR_HF2 + PUSH_AUDIOR_CALL5 + PUSH_AUDIOR_CALL5 + PUSH_AUDIOR_CALL5_SEQ1 + PUSH_AUDIOR_CALL5_SEQ2 + + KNOB_AUDIOR_INT + PUSH_AUDIOR_INT_EMIS + KNOB_AUDIOR_INT + PUSH_AUDIOR_INT + PUSH_AUDIOR_MECH + PUSH_AUDIOR_MECH + PUSH_AUDIOR_MECH_SEQ1 + PUSH_AUDIOR_MECH_SEQ2 + + KNOB_AUDIOR_CAB + PUSH_AUDIOR_CAB_EMIS + KNOB_AUDIOR_CAB + PUSH_AUDIOR_CAB + PUSH_AUDIOR_ATT + PUSH_AUDIOR_ATT + PUSH_AUDIOR_ATT_SEQ1 + PUSH_AUDIOR_ATT_SEQ2 + + KNOB_AUDIOR_PA + PUSH_AUDIOR_PA1_EMIS + KNOB_AUDIOR_PA + PUSH_AUDIOR_PA1 + PUSH_AUDIOR_PA + PUSH_AUDIOR_PA + PUSH_AUDIOR_PA_SEQ1 + PUSH_AUDIOR_VOICE PUSH_AUDIOR_VOICE PUSH_AUDIOR_VOICE_SEQ1 PUSH_AUDIOR_VOICE_SEQ2 + PUSH_AUDIOL_RESET + PUSH_AUDIOL_RESET + PUSH_AUDIOL_RESET_SEQ2 + KNOB_AUDIOR_MKR PUSH_AUDIOR_MKR_EMIS KNOB_AUDIOR_MKR @@ -4715,105 +4569,134 @@ PUSH_AUDIOR_ADF2_EMIS KNOB_AUDIOR_ADF2 PUSH_AUDIOR_ADF2 - - - - 1 - 85 - (L:A32NX_OVHD_INTLT_ANN) 0 == (L:A32NX_ELEC_DC_2_BUS_IS_POWERED, Bool) and (L:A32NX_ELEC_AC_1_BUS_IS_POWERED, Bool) and - 1 - False - False - - - PUSH_AUDIOR_RESET - 0 - 0 - - - PUSH_AUDIOR_PA - 0 - 0 - - - PUSH_AUDIOR_ATT - 0 - 0 - - - PUSH_AUDIOR_MECH - 0 - 0 - - - PUSH_AUDIOR_CALL4 - 0 - 0 - - - PUSH_AUDIOR_CALL5 - 0 - 0 - - - - - PUSH_AUDIOR_HF1_EMIS - 0 - - - PUSH_AUDIOR_HF2_EMIS - 0 - - - PUSH_AUDIOR_INT_EMIS - 0 - - - PUSH_AUDIOR_CAB_EMIS - 0 - - - PUSH_AUDIOR_PA1_EMIS - 0 + + SWITCH_AUDIOR_INT + + + 3 + OVHD + (L:A32NX_ELEC_AC_1_BUS_IS_POWERED, Bool) + (L:A32NX_ELEC_AC_1_BUS_IS_POWERED, Bool) + KNOB_OVHD_RADIO_VHF1 + PUSH_OVHD_RADIO_VHF1_EMIS + KNOB_OVHD_RADIO_VHF1 + PUSH_OVHD_RADIO_VHF1 + PUSH_OVHD_RADIO_CALL1 + PUSH_OVHD_RADIO_CALL1 + PUSH_OVHD_RADIO_CALL1_SEQ1 + PUSH_OVHD_RADIO_CALL1_SEQ2 + + KNOB_OVHD_RADIO_VHF2 + PUSH_OVHD_RADIO_VHF2_EMIS + KNOB_OVHD_RADIO_VHF2 + PUSH_OVHD_RADIO_VHF2 + PUSH_OVHD_RADIO_CALL2 + PUSH_OVHD_RADIO_CALL2 + PUSH_OVHD_RADIO_CALL2_SEQ1 + PUSH_OVHD_RADIO_CALL2_SEQ2 + + KNOB_OVHD_RADIO_VHF3 + PUSH_OVHD_RADIO_VHF3_EMIS + KNOB_OVHD_RADIO_VHF3 + PUSH_OVHD_RADIO_VHF3 + PUSH_OVHD_RADIO_CALL3 + PUSH_OVHD_RADIO_CALL3 + PUSH_OVHD_RADIO_CALL3_SEQ1 + PUSH_OVHD_RADIO_CALL3_SEQ2 + + KNOB_OVHD_RADIO_HF1 + PUSH_OVHD_RADIO_HF1_EMIS + KNOB_OVHD_RADIO_HF1 + PUSH_OVHD_RADIO_HF1 + PUSH_OVHD_RADIO_CALL4 + PUSH_OVHD_RADIO_CALL4 + PUSH_OVHD_RADIO_CALL4_SEQ1 + PUSH_OVHD_RADIO_CALL4_SEQ2 + + KNOB_OVHD_RADIO_HF2 + PUSH_OVHD_RADIO_HF2_EMIS + KNOB_OVHD_RADIO_HF2 + PUSH_OVHD_RADIO_HF2 + PUSH_OVHD_RADIO_CALL5 + PUSH_OVHD_RADIO_CALL5 + PUSH_OVHD_RADIO_CALL5_SEQ1 + PUSH_OVHD_RADIO_CALL5_SEQ2 + + KNOB_OVHD_RADIO_INT + PUSH_OVHD_RADIO_INT_EMIS + KNOB_OVHD_RADIO_INT + PUSH_OVHD_RADIO_INT + PUSH_OVHD_RADIO_MECH + PUSH_OVHD_RADIO_MECH + PUSH_OVHD_RADIO_MECH_SEQ1 + PUSH_OVHD_RADIO_MECH_SEQ2 + + KNOB_OVHD_RADIO_CAB + PUSH_OVHD_RADIO_CAB_EMIS + KNOB_OVHD_RADIO_CAB + PUSH_OVHD_RADIO_CAB + PUSH_OVHD_RADIO_ATT + PUSH_OVHD_RADIO_ATT + PUSH_OVHD_RADIO_ATT_SEQ1 + PUSH_OVHD_RADIO_ATT_SEQ2 + + KNOB_OVHD_RADIO_PA + PUSH_OVHD_RADIO_PA1_EMIS + KNOB_OVHD_RADIO_PA + PUSH_OVHD_RADIO_PA1 + PUSH_OVHD_RADIO_PA + PUSH_OVHD_RADIO_PA + PUSH_OVHD_RADIO_PA_SEQ1 + + PUSH_OVHD_RADIO_VOICE + PUSH_OVHD_RADIO_VOICE + PUSH_OVHD_RADIO_VOICE_SEQ1 + PUSH_OVHD_RADIO_VOICE_SEQ2 + + PUSH_OVHD_RADIO_RESET + PUSH_OVHD_RADIO_RESET + PUSH_OVHD_RADIO_RESET_SEQ2 + + KNOB_OVHD_RADIO_MKR + PUSH_OVHD_RADIO_MKR_EMIS + KNOB_OVHD_RADIO_MKR + PUSH_OVHD_RADIO_MKR + + KNOB_OVHD_RADIO_VOR1 + PUSH_OVHD_RADIO_VOR1_EMIS + KNOB_OVHD_RADIO_VOR1 + PUSH_OVHD_RADIO_VOR1 + + KNOB_OVHD_RADIO_VOR2 + PUSH_OVHD_RADIO_VOR2_EMIS + KNOB_OVHD_RADIO_VOR2 + PUSH_OVHD_RADIO_VOR2 + + KNOB_OVHD_RADIO_ILS + PUSH_OVHD_RADIO_ILS_EMIS + KNOB_OVHD_RADIO_ILS + PUSH_OVHD_RADIO_ILS + + KNOB_OVHD_RADIO_MLS + PUSH_OVHD_RADIO_MLS_EMIS + KNOB_OVHD_RADIO_MLS + PUSH_OVHD_RADIO_MLS + + KNOB_OVHD_RADIO_ADF1 + PUSH_OVHD_RADIO_ADF1_EMIS + KNOB_OVHD_RADIO_ADF1 + PUSH_OVHD_RADIO_ADF1 + + KNOB_OVHD_RADIO_ADF2 + PUSH_OVHD_RADIO_ADF2_EMIS + KNOB_OVHD_RADIO_ADF2 + PUSH_OVHD_RADIO_ADF2 + + SWITCH_OVHD_RADIO_INT + - - - - (A:MARKER SOUND, Bool) 1 == { - (>K:MARKER_SOUND_TOGGLE) - } - - 0 (>K:NAV1_VOLUME_SET) - 0 (>K:NAV2_VOLUME_SET) - 0 (>K:NAV3_VOLUME_SET) - 0 (>K:NAV4_VOLUME_SET) - - 0 (>K:ADF_VOLUME_SET) - 0 (>K:ADF2_VOLUME_SET) - - 113000000 (>L:A32NX_RMP_L_SAVED_ACTIVE_FREQUENCY_VOR) - 113000000 (>L:A32NX_RMP_L_SAVED_STANDBY_FREQUENCY_VOR) - 113000000 (>L:A32NX_RMP_R_SAVED_ACTIVE_FREQUENCY_VOR) - 113000000 (>L:A32NX_RMP_R_SAVED_STANDBY_FREQUENCY_VOR) - - 108900000 (>L:A32NX_RMP_L_SAVED_ACTIVE_FREQUENCY_ILS) - 108900000 (>L:A32NX_RMP_L_SAVED_STANDBY_FREQUENCY_ILS) - 108900000 (>L:A32NX_RMP_R_SAVED_ACTIVE_FREQUENCY_ILS) - 108900000 (>L:A32NX_RMP_R_SAVED_STANDBY_FREQUENCY_ILS) - - 433000 (>L:A32NX_RMP_L_SAVED_ACTIVE_FREQUENCY_ADF) - 433000 (>L:A32NX_RMP_L_SAVED_STANDBY_FREQUENCY_ADF) - 433000 (>L:A32NX_RMP_R_SAVED_ACTIVE_FREQUENCY_ADF) - 433000 (>L:A32NX_RMP_R_SAVED_STANDBY_FREQUENCY_ADF) - - 22 (>L:A32NX_RMP_L_SAVED_COURSE_VOR) - 202 (>L:A32NX_RMP_L_SAVED_COURSE_ILS) - 22 (>L:A32NX_RMP_R_SAVED_COURSE_VOR) - 202 (>L:A32NX_RMP_R_SAVED_COURSE_ILS) - @@ -5243,14 +5126,14 @@ FBW_Airbus_ATC_MSG_Button PUSH_AUTOPILOT_LL (L:A32NX_ELEC_AC_2_BUS_IS_POWERED, Bool) - --> + KORRY_HELD FBW_Airbus_ATC_MSG_Button PUSH_AUTOPILOT_RR (L:A32NX_ELEC_AC_2_BUS_IS_POWERED, Bool) - --> + SWITCH_RIGHT @@ -5271,78 +5154,6 @@ KNOB_EFIS_FO_LOUDSPKR - - PUSH_AUDIOL_RESET - - - PUSH_AUDIOL_PA - - - KNOB_AUDIOL_PA - - - PUSH_AUDIOL_ATT - - - KNOB_AUDIOL_CAB - - - PUSH_AUDIOL_MECH - - - KNOB_AUDIOL_INT - - - PUSH_AUDIOL_CALL4 - - - KNOB_AUDIOL_HF1 - - - PUSH_AUDIOL_CALL5 - - - KNOB_AUDIOL_HF2 - - - PUSH_AUDIOR_RESET - - - PUSH_AUDIOR_PA - - - KNOB_AUDIOR_PA - - - PUSH_AUDIOR_ATT - - - KNOB_AUDIOR_CAB - - - PUSH_AUDIOR_MECH - - - KNOB_AUDIOR_INT - - - PUSH_AUDIOR_CALL4 - - - KNOB_AUDIOR_HF1 - - - PUSH_AUDIOR_CALL5 - - - KNOB_AUDIOR_HF2 - - - SWITCH_AUDIOL_INT - - - SWITCH_AUDIOR_INT - KNOB_RADAR_GAIN @@ -5370,81 +5181,6 @@ PUSH_OVHD_CARGOVENT_AFTISOL - - PUSH_OVHD_RADIO_VOR1 - - - PUSH_OVHD_RADIO_VOR2 - - - PUSH_OVHD_RADIO_MKR - - - PUSH_OVHD_RADIO_ILS - - - PUSH_OVHD_RADIO_MLS - - - PUSH_OVHD_RADIO_ADF1 - - - PUSH_OVHD_RADIO_ADF2 - - - SWITCH_OVHD_RADIO_INT - - - PUSH_OVHD_RADIO_VOICE - - - PUSH_OVHD_RADIO_RESET - - - PUSH_OVHD_RADIO_PA1 - - - PUSH_OVHD_RADIO_PA - - - PUSH_OVHD_RADIO_VHF1 - - - PUSH_OVHD_RADIO_VHF2 - - - PUSH_OVHD_RADIO_VHF3 - - - PUSH_OVHD_RADIO_HF1 - - - PUSH_OVHD_RADIO_HF2 - - - PUSH_OVHD_RADIO_CAB - - - PUSH_OVHD_RADIO_ATT - - - PUSH_OVHD_RADIO_MECH - - - PUSH_OVHD_RADIO_CALL5 - - - PUSH_OVHD_RADIO_CALL4 - - - PUSH_OVHD_RADIO_CALL3 - - - PUSH_OVHD_RADIO_CALL2 - - - PUSH_OVHD_RADIO_CALL1 - From af4f9bb0294c481cf48979cb3e6c95ca5858f3bd Mon Sep 17 00:00:00 2001 From: juliansebline Date: Tue, 14 Jan 2025 13:40:46 +0100 Subject: [PATCH 13/64] runway.flt --- .../AirPlanes/FlyByWire_A320_NEO/runway.FLT | 69 ++++++++++++++++--- 1 file changed, 58 insertions(+), 11 deletions(-) diff --git a/fbw-a32nx/src/base/flybywire-aircraft-a320-neo/SimObjects/AirPlanes/FlyByWire_A320_NEO/runway.FLT b/fbw-a32nx/src/base/flybywire-aircraft-a320-neo/SimObjects/AirPlanes/FlyByWire_A320_NEO/runway.FLT index 1762b763bc4..3b028dc0770 100644 --- a/fbw-a32nx/src/base/flybywire-aircraft-a320-neo/SimObjects/AirPlanes/FlyByWire_A320_NEO/runway.FLT +++ b/fbw-a32nx/src/base/flybywire-aircraft-a320-neo/SimObjects/AirPlanes/FlyByWire_A320_NEO/runway.FLT @@ -33,11 +33,11 @@ DMESelected=1 ComTransmit=1 ComReceiveBoth=False Com1Receive=True -Com2Receive=False -Com3Receive=False +Com2Receive=True +Com3Receive=True AudioNav1Listen=False AudioNav2Listen=False -AudioMarkerListen=True +AudioMarkerListen=False AudioDmeListen=False AudioAdfListen=False AudioAdf2Listen=False @@ -123,14 +123,6 @@ SeatBeltsSwitch = True [LocalVars.0] A32NX_IS_READY=0 A32NX_START_STATE=4 -A32NX_RMP_L_TOGGLE_SWITCH=1 -A32NX_RMP_R_TOGGLE_SWITCH=1 -A32NX_RMP_L_SELECTED_MODE=1 -A32NX_RMP_R_SELECTED_MODE=2 -A32NX_RMP_L_VHF2_STANDBY_FREQUENCY=124275000 -A32NX_RMP_L_VHF3_STANDBY_FREQUENCY=135475000 -A32NX_RMP_R_VHF1_STANDBY_FREQUENCY=129675000 -A32NX_RMP_R_VHF3_STANDBY_FREQUENCY=136975000 XMLVAR_Baro1_Mode=1 A32NX_AVIONICS_STARTUP_SOUNDS_INHIBIT=1 A32NX_OVHD_ADIRS_IR_1_MODE_SELECTOR_KNOB=1 @@ -284,6 +276,61 @@ A32NX_GEAR_RIGHT_POSITION = 100 A32NX_GEAR_LEVER_POSITION_REQUEST = 1 A32NX_GPWS_GROUND_STATE=1 A32NX_GPWS_APPROACH_STATE=0 +A32NX_RMP_L_TOGGLE_SWITCH = 1 +A32NX_RMP_R_TOGGLE_SWITCH = 1 +A32NX_RMP_L_SELECTED_MODE = 1 +A32NX_RMP_R_SELECTED_MODE = 2 +A32NX_RMP_L_VHF2_STANDBY_FREQUENCY = 124275000 +A32NX_RMP_L_VHF3_STANDBY_FREQUENCY = 135475000 +A32NX_RMP_R_VHF1_STANDBY_FREQUENCY = 129675000 +A32NX_RMP_R_VHF3_STANDBY_FREQUENCY = 136975000 +A32NX_RMP_HF1_ACTIVE_FREQUENCY = 11345000 +A32NX_RMP_HF2_ACTIVE_FREQUENCY = 8930000 +A32NX_RMP_L_HF1_STANDBY_FREQUENCY = 17916000 +A32NX_RMP_L_HF2_STANDBY_FREQUENCY = 5541000 +A32NX_RMP_R_HF1_STANDBY_FREQUENCY = 13342000 +A32NX_RMP_R_HF2_STANDBY_FREQUENCY = 3494000 +A32NX_RMP_LS_COURSE=-1 +A32NX_RMP_VOR1_COURSE=-1 +A32NX_RMP_VOR2_COURSE=-1 +A32NX_RMP_L_SAVED_COURSE_VOR = 22 +A32NX_RMP_L_SAVED_COURSE_ILS = 202 +A32NX_RMP_R_SAVED_COURSE_VOR = 87 +A32NX_RMP_R_SAVED_COURSE_ILS = 271 +A32NX_RMP_L_SAVED_ACTIVE_FREQUENCY_VOR = 113000000 +A32NX_RMP_L_SAVED_STANDBY_FREQUENCY_VOR = 117800000 +A32NX_RMP_R_SAVED_ACTIVE_FREQUENCY_VOR = 113700000 +A32NX_RMP_R_SAVED_STANDBY_FREQUENCY_VOR = 115500000 +A32NX_RMP_L_SAVED_ACTIVE_FREQUENCY_ILS = 108900000 +A32NX_RMP_L_SAVED_STANDBY_FREQUENCY_ILS = 108900000 +A32NX_RMP_R_SAVED_ACTIVE_FREQUENCY_ILS = 110100000 +A32NX_RMP_R_SAVED_STANDBY_FREQUENCY_ILS = 111100000 +A32NX_RMP_L_SAVED_ACTIVE_FREQUENCY_ADF = 433000 +A32NX_RMP_L_SAVED_STANDBY_FREQUENCY_ADF = 433000 +A32NX_RMP_R_SAVED_ACTIVE_FREQUENCY_ADF = 420000 +A32NX_RMP_R_SAVED_STANDBY_FREQUENCY_ADF = 420000 +A32NX_AUDIOSWITCHING_KNOB = 1 +A32NX_ACP1_TRANSMIT_CHANNEL = 0 +A32NX_ACP2_TRANSMIT_CHANNEL = 0 +A32NX_ACP3_TRANSMIT_CHANNEL = 0 +A32NX_ACP1_VHF1_VOLUME = 80 +A32NX_ACP1_VHF2_VOLUME = 40 +A32NX_ACP2_VHF1_VOLUME = 80 +A32NX_ACP2_VHF2_VOLUME = 40 +A32NX_ACP3_VHF1_VOLUME = 80 +A32NX_ACP3_VHF2_VOLUME = 40 +A32NX_ACP1_VHF1_KNOB_VOLUME_DOWN = 1 +A32NX_ACP1_VHF2_KNOB_VOLUME_DOWN = 1 +A32NX_ACP2_VHF1_KNOB_VOLUME_DOWN = 1 +A32NX_ACP2_VHF2_KNOB_VOLUME_DOWN = 1 +A32NX_ACP3_VHF1_KNOB_VOLUME_DOWN = 1 +A32NX_ACP3_VHF2_KNOB_VOLUME_DOWN = 1 +A32NX_ACP1_SWITCH_INT = 100 +A32NX_ACP2_SWITCH_INT = 100 +A32NX_ACP3_SWITCH_INT = 100 +A32NX_ACP1_TRANSMIT_PUSHED = 1 +A32NX_ACP2_TRANSMIT_PUSHED = 1 +A32NX_ACP3_TRANSMIT_PUSHED = 1 [Gauges.0] KollsmanSetting=29.921342849731445313 From af661aec6799763732b712d770b3c60f963d9c20 Mon Sep 17 00:00:00 2001 From: juliansebline Date: Tue, 14 Jan 2025 13:43:33 +0100 Subject: [PATCH 14/64] sound.xml --- .../SimObjects/AirPlanes/FlyByWire_A320_NEO/sound/sound.xml | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/fbw-a32nx/src/base/flybywire-aircraft-a320-neo/SimObjects/AirPlanes/FlyByWire_A320_NEO/sound/sound.xml b/fbw-a32nx/src/base/flybywire-aircraft-a320-neo/SimObjects/AirPlanes/FlyByWire_A320_NEO/sound/sound.xml index cd1656bc82e..b4030258112 100644 --- a/fbw-a32nx/src/base/flybywire-aircraft-a320-neo/SimObjects/AirPlanes/FlyByWire_A320_NEO/sound/sound.xml +++ b/fbw-a32nx/src/base/flybywire-aircraft-a320-neo/SimObjects/AirPlanes/FlyByWire_A320_NEO/sound/sound.xml @@ -2094,7 +2094,7 @@ - + @@ -2104,7 +2104,7 @@ - + @@ -2114,7 +2114,7 @@ - + From 0a680d3142b54d4a8ae8cf396ebe1d30500b8f44 Mon Sep 17 00:00:00 2001 From: juliansebline Date: Tue, 14 Jan 2025 13:48:02 +0100 Subject: [PATCH 15/64] taxi.flt --- .../AirPlanes/FlyByWire_A320_NEO/taxi.flt | 66 +++++++++++++++---- 1 file changed, 55 insertions(+), 11 deletions(-) diff --git a/fbw-a32nx/src/base/flybywire-aircraft-a320-neo/SimObjects/AirPlanes/FlyByWire_A320_NEO/taxi.flt b/fbw-a32nx/src/base/flybywire-aircraft-a320-neo/SimObjects/AirPlanes/FlyByWire_A320_NEO/taxi.flt index 45b28fba4f7..a5c9ef01b1b 100644 --- a/fbw-a32nx/src/base/flybywire-aircraft-a320-neo/SimObjects/AirPlanes/FlyByWire_A320_NEO/taxi.flt +++ b/fbw-a32nx/src/base/flybywire-aircraft-a320-neo/SimObjects/AirPlanes/FlyByWire_A320_NEO/taxi.flt @@ -33,11 +33,11 @@ DMESelected=1 ComTransmit=1 ComReceiveBoth=False Com1Receive=True -Com2Receive=False -Com3Receive=False +Com2Receive=True +Com3Receive=True AudioNav1Listen=False AudioNav2Listen=False -AudioMarkerListen=True +AudioMarkerListen=False AudioDmeListen=False AudioAdfListen=False AudioAdf2Listen=False @@ -134,14 +134,6 @@ Potentiometer.97=0 [LocalVars.0] A32NX_START_STATE=3 -A32NX_RMP_L_TOGGLE_SWITCH=1 -A32NX_RMP_R_TOGGLE_SWITCH=1 -A32NX_RMP_L_SELECTED_MODE=1 -A32NX_RMP_R_SELECTED_MODE=2 -A32NX_RMP_L_VHF2_STANDBY_FREQUENCY=124275000 -A32NX_RMP_L_VHF3_STANDBY_FREQUENCY=135475000 -A32NX_RMP_R_VHF1_STANDBY_FREQUENCY=129675000 -A32NX_RMP_R_VHF3_STANDBY_FREQUENCY=136975000 XMLVAR_Baro1_Mode=1 A32NX_AVIONICS_STARTUP_SOUNDS_INHIBIT=0 A32NX_OVHD_ADIRS_IR_1_MODE_SELECTOR_KNOB=1 @@ -268,6 +260,58 @@ A32NX_GEAR_RIGHT_POSITION = 100 A32NX_GEAR_LEVER_POSITION_REQUEST = 1 A32NX_GPWS_GROUND_STATE=1 A32NX_GPWS_APPROACH_STATE=0 +A32NX_RMP_L_TOGGLE_SWITCH = 1 +A32NX_RMP_R_TOGGLE_SWITCH = 1 +A32NX_RMP_L_SELECTED_MODE = 1 +A32NX_RMP_R_SELECTED_MODE = 2 +A32NX_RMP_L_VHF2_STANDBY_FREQUENCY = 124275000 +A32NX_RMP_L_VHF3_STANDBY_FREQUENCY = 135475000 +A32NX_RMP_R_VHF1_STANDBY_FREQUENCY = 129675000 +A32NX_RMP_R_VHF3_STANDBY_FREQUENCY = 136975000 +A32NX_RMP_HF1_ACTIVE_FREQUENCY = 11345000 +A32NX_RMP_HF2_ACTIVE_FREQUENCY = 8930000 +A32NX_RMP_L_HF1_STANDBY_FREQUENCY = 17916000 +A32NX_RMP_L_HF2_STANDBY_FREQUENCY = 5541000 +A32NX_RMP_R_HF1_STANDBY_FREQUENCY = 13342000 +A32NX_RMP_R_HF2_STANDBY_FREQUENCY = 3494000 +A32NX_RMP_L_SAVED_COURSE_VOR = 22 +A32NX_RMP_L_SAVED_COURSE_ILS = 202 +A32NX_RMP_R_SAVED_COURSE_VOR = 87 +A32NX_RMP_R_SAVED_COURSE_ILS = 271 +A32NX_RMP_L_SAVED_ACTIVE_FREQUENCY_VOR = 113000000 +A32NX_RMP_L_SAVED_STANDBY_FREQUENCY_VOR = 117800000 +A32NX_RMP_R_SAVED_ACTIVE_FREQUENCY_VOR = 113700000 +A32NX_RMP_R_SAVED_STANDBY_FREQUENCY_VOR = 115500000 +A32NX_RMP_L_SAVED_ACTIVE_FREQUENCY_ILS = 108900000 +A32NX_RMP_L_SAVED_STANDBY_FREQUENCY_ILS = 108900000 +A32NX_RMP_R_SAVED_ACTIVE_FREQUENCY_ILS = 110100000 +A32NX_RMP_R_SAVED_STANDBY_FREQUENCY_ILS = 111100000 +A32NX_RMP_L_SAVED_ACTIVE_FREQUENCY_ADF = 433000 +A32NX_RMP_L_SAVED_STANDBY_FREQUENCY_ADF = 433000 +A32NX_RMP_R_SAVED_ACTIVE_FREQUENCY_ADF = 420000 +A32NX_RMP_R_SAVED_STANDBY_FREQUENCY_ADF = 420000 +A32NX_AUDIOSWITCHING_KNOB = 1 +A32NX_ACP1_TRANSMIT_CHANNEL = 0 +A32NX_ACP2_TRANSMIT_CHANNEL = 0 +A32NX_ACP3_TRANSMIT_CHANNEL = 0 +A32NX_ACP1_VHF1_VOLUME = 80 +A32NX_ACP1_VHF2_VOLUME = 40 +A32NX_ACP2_VHF1_VOLUME = 80 +A32NX_ACP2_VHF2_VOLUME = 40 +A32NX_ACP3_VHF1_VOLUME = 80 +A32NX_ACP3_VHF2_VOLUME = 40 +A32NX_ACP1_VHF1_KNOB_VOLUME_DOWN = 1 +A32NX_ACP1_VHF2_KNOB_VOLUME_DOWN = 1 +A32NX_ACP2_VHF1_KNOB_VOLUME_DOWN = 1 +A32NX_ACP2_VHF2_KNOB_VOLUME_DOWN = 1 +A32NX_ACP3_VHF1_KNOB_VOLUME_DOWN = 1 +A32NX_ACP3_VHF2_KNOB_VOLUME_DOWN = 1 +A32NX_ACP1_SWITCH_INT = 100 +A32NX_ACP2_SWITCH_INT = 100 +A32NX_ACP3_SWITCH_INT = 100 +A32NX_ACP1_TRANSMIT_PUSHED = 1 +A32NX_ACP2_TRANSMIT_PUSHED = 1 +A32NX_ACP3_TRANSMIT_PUSHED = 1 [Gauges.0] KollsmanSetting=29.921342849731445313 From 94968bfbb9d2575d1844130239c5df95f32ce34a Mon Sep 17 00:00:00 2001 From: juliansebline Date: Tue, 14 Jan 2025 13:48:18 +0100 Subject: [PATCH 16/64] FMCMainDisplay.js --- .../FMC/A32NX_FMCMainDisplay.js | 16 +++++++++------- 1 file changed, 9 insertions(+), 7 deletions(-) diff --git a/fbw-a32nx/src/base/flybywire-aircraft-a320-neo/html_ui/Pages/VCockpit/Instruments/Airliners/FlyByWire_A320_Neo/FMC/A32NX_FMCMainDisplay.js b/fbw-a32nx/src/base/flybywire-aircraft-a320-neo/html_ui/Pages/VCockpit/Instruments/Airliners/FlyByWire_A320_Neo/FMC/A32NX_FMCMainDisplay.js index 53476dddb0f..461136192a2 100644 --- a/fbw-a32nx/src/base/flybywire-aircraft-a320-neo/html_ui/Pages/VCockpit/Instruments/Airliners/FlyByWire_A320_Neo/FMC/A32NX_FMCMainDisplay.js +++ b/fbw-a32nx/src/base/flybywire-aircraft-a320-neo/html_ui/Pages/VCockpit/Instruments/Airliners/FlyByWire_A320_Neo/FMC/A32NX_FMCMainDisplay.js @@ -2237,14 +2237,16 @@ class FMCMainDisplay extends BaseAirliners { // TODO:FPM REWRITE: Start of functions to refactor //----------------------------------------------------------------------------------- - // FIXME remove A32NX_FM_LS_COURSE + // FIXME remove A32NX_FM_LS_COURSE and A32NX_RMP_LS_COURSE async updateIlsCourse() { - let course = -1; - const mmr = this.navigation.getNavaidTuner().getMmrRadioTuningStatus(1); - if (mmr.course !== null) { - course = mmr.course; - } else if (mmr.frequency !== null && SimVar.GetSimVarValue('L:A32NX_RADIO_RECEIVER_LOC_IS_VALID', 'number') === 1) { - course = SimVar.GetSimVarValue('NAV LOCALIZER:3', 'degrees'); + let course = SimVar.GetSimVarValue('L:A32NX_RMP_LS_COURSE', 'number'); + if (course == -1) { + const mmr = this.navigation.getNavaidTuner().getMmrRadioTuningStatus(1); + if (mmr.course !== null) { + course = mmr.course; + } else if (mmr.frequency !== null && SimVar.GetSimVarValue('L:A32NX_RADIO_RECEIVER_LOC_IS_VALID', 'number') === 1) { + course = SimVar.GetSimVarValue('NAV LOCALIZER:3', 'degrees'); + } } return SimVar.SetSimVarValue('L:A32NX_FM_LS_COURSE', 'number', course); From 763c7deb652b07ec6c1c01d42c5d56766d46d91a Mon Sep 17 00:00:00 2001 From: juliansebline Date: Tue, 14 Jan 2025 13:49:10 +0100 Subject: [PATCH 17/64] A32NX_Interior_ACP.xml --- .../src/behavior/src/A32NX_Interior_ACP.xml | 480 ++++++++++++++++++ 1 file changed, 480 insertions(+) create mode 100644 fbw-a32nx/src/behavior/src/A32NX_Interior_ACP.xml diff --git a/fbw-a32nx/src/behavior/src/A32NX_Interior_ACP.xml b/fbw-a32nx/src/behavior/src/A32NX_Interior_ACP.xml new file mode 100644 index 00000000000..c5d1d4c33e2 --- /dev/null +++ b/fbw-a32nx/src/behavior/src/A32NX_Interior_ACP.xml @@ -0,0 +1,480 @@ + + + + + + + + + + + + From 69d71ec4b48ddc1345693b4fa1f585cd6c3b2337 Mon Sep 17 00:00:00 2001 From: juliansebline Date: Tue, 14 Jan 2025 14:01:07 +0100 Subject: [PATCH 18/64] A32NX_Interior_RMP.xml --- .../src/behavior/src/A32NX_Interior_RMP.xml | 117 +++++------------- 1 file changed, 34 insertions(+), 83 deletions(-) diff --git a/fbw-a32nx/src/behavior/src/A32NX_Interior_RMP.xml b/fbw-a32nx/src/behavior/src/A32NX_Interior_RMP.xml index 816957c434e..04908700cb9 100644 --- a/fbw-a32nx/src/behavior/src/A32NX_Interior_RMP.xml +++ b/fbw-a32nx/src/behavior/src/A32NX_Interior_RMP.xml @@ -66,9 +66,17 @@ + 0 (>K:COM3_RADIO_SET_HZ) + 0 (>K:ADF_VOLUME_SET) + 0 (>K:ADF2_VOLUME_SET) + 0 (>K:NAV1_VOLUME_SET_EX1) + 0 (>K:NAV2_VOLUME_SET_EX1) + 0 (>K:NAV3_VOLUME_SET_EX1) + 0 (>K:NAV4_VOLUME_SET_EX1) BUTTON @@ -121,80 +129,39 @@ LOAD - + BUTTON FBW_RMP_MODE_BUTTON_AND_LED - 1 HF1 4 - + BUTTON FBW_RMP_MODE_BUTTON_AND_LED - 1 HF2 5 - + BUTTON FBW_RMP_MODE_BUTTON_AND_LED - 1 AM - 11 + 12 - - - - 7 - - let indicatorsPowered = #INDICATORS_POWERED, bool#; - let id = #ID, number#; - alias toggleSwitch = (L:A32NX_RMP_#SIDE#_TOGGLE_SWITCH, bool); - alias selectedModeLeft = (L:A32NX_RMP_L_SELECTED_MODE, number); - alias selectedModeRight = (L:A32NX_RMP_R_SELECTED_MODE, number); - alias annunciatorLight = (L:A32NX_OVHD_INTLT_ANN, number); - alias dc2Powered = (L:A32NX_ELEC_DC_2_BUS_IS_POWERED, bool); - let emissiveDim = if annunciatorLight == 2 { 0.05 } else { 1 }; - // @todo abnormal defined differently with NAV modes available. - - let rmpLeftAbnormal = id == 1 and (selectedModeLeft == 2 or selectedModeLeft == 3 or selectedModeRight == 1); - let rmpRightAbnormal = id == 2 and (selectedModeRight == 1 or selectedModeRight == 3 or selectedModeLeft == 2); - - (if (toggleSwitch and (rmpLeftAbnormal or rmpRightAbnormal) or ((annunciatorLight == 0) and dc2Powered)) and indicatorsPowered { - 1 * emissiveDim - } else { - 0 - }) - - - - 7 let indicatorsPowered = #INDICATORS_POWERED, bool#; - let id = #ID, number#; - alias toggleSwitch = (L:A32NX_RMP_#SIDE#_TOGGLE_SWITCH, bool); - alias selectedModeLeft = (L:A32NX_RMP_L_SELECTED_MODE, number); - alias selectedModeRight = (L:A32NX_RMP_R_SELECTED_MODE, number); - alias annunciatorLight = (L:A32NX_OVHD_INTLT_ANN, number); - alias dc2Powered = (L:A32NX_ELEC_DC_2_BUS_IS_POWERED, bool); - let emissiveDim = if annunciatorLight == 2 { 0.05 } else { 1 }; - // @todo abnormal defined differently with NAV modes available. - - let rmpLeftAbnormal = id == 1 and (selectedModeLeft == 2 or selectedModeLeft == 3 or selectedModeRight == 1); - let rmpRightAbnormal = id == 2 and (selectedModeRight == 1 or selectedModeRight == 3 or selectedModeLeft == 2); - - (if (toggleSwitch and (rmpLeftAbnormal or rmpRightAbnormal) or ((annunciatorLight == 0) and dc2Powered)) and indicatorsPowered { - 1 * emissiveDim + let sel = (L:A32NX_RMP_SEL_LIGHT_ON, bool); + (if #RMP_POWERED, bool# and indicatorsPowered and (sel or #EMISSIVE_TEST, bool#) { + #EMISSIVE_DIM, number# } else { 0 }) @@ -204,7 +171,6 @@ - 7 SEL @@ -215,8 +181,8 @@ LOCK_RADIO#SIDE#_NAV 100 - (L:XMLVAR_RMP_#SIDE#_NavLockOff) 100 * - (L:XMLVAR_RMP_#SIDE#_NavLockOff) ! (>L:XMLVAR_RMP_#SIDE#_NavLockOff) + (L:A32NX_RMP_#SIDE#_NavLockOff) 100 * + (L:A32NX_RMP_#SIDE#_NavLockOff) ! (>L:A32NX_RMP_#SIDE#_NavLockOff) 0.1 @@ -231,14 +197,14 @@ BUTTON FBW_RMP_MODE_BUTTON_AND_LED NAV - 12 + 6 BUTTON FBW_RMP_MODE_BUTTON_AND_LED - 6 + 7 VOR @@ -247,7 +213,7 @@ BUTTON FBW_RMP_MODE_BUTTON_AND_LED ILS - 7 + 8 @@ -255,7 +221,7 @@ BUTTON FBW_RMP_MODE_BUTTON_AND_LED GLS - 8 + 9 @@ -263,7 +229,7 @@ BUTTON FBW_RMP_MODE_BUTTON_AND_LED MLS - 9 + 10 @@ -271,7 +237,7 @@ BUTTON FBW_RMP_MODE_BUTTON_AND_LED ADF - 10 + 11 @@ -292,7 +258,11 @@ #ANIM_NAME_BUTTON# - (>H:A32NX_RMP_#SIDE#_#BASE_NAME#_BUTTON_PRESSED) + + #RMP_POWERED# if{ + (>H:A32NX_RMP_#SIDE#_#BASE_NAME#_BUTTON_PRESSED) + } + @@ -305,24 +275,18 @@ @@ -394,7 +345,7 @@ - (A:LIGHT POTENTIOMETER:#POTENTIOMETER#, Percent over 100) #BACKLIGHTS_POWERED# (L:A32NX_RMP_#SIDE#_TOGGLE_SWITCH) * * + (A:LIGHT POTENTIOMETER:#POTENTIOMETER#, Percent over 100) #BACKLIGHTS_POWERED# * From e76cf37e0dcca6551852c3286c6a85d6121ca534 Mon Sep 17 00:00:00 2001 From: juliansebline Date: Tue, 14 Jan 2025 14:03:58 +0100 Subject: [PATCH 19/64] NavaidTuner.ts --- .../src/systems/fmgc/src/navigation/NavaidTuner.ts | 10 +++++++--- 1 file changed, 7 insertions(+), 3 deletions(-) diff --git a/fbw-a32nx/src/systems/fmgc/src/navigation/NavaidTuner.ts b/fbw-a32nx/src/systems/fmgc/src/navigation/NavaidTuner.ts index 6ca8a348655..122f25a2f87 100644 --- a/fbw-a32nx/src/systems/fmgc/src/navigation/NavaidTuner.ts +++ b/fbw-a32nx/src/systems/fmgc/src/navigation/NavaidTuner.ts @@ -314,9 +314,7 @@ export class NavaidTuner { } // FIXME RMPs should provide a discrete output for this - const rmpTuningActive = - SimVar.GetSimVarValue('L:A32NX_RMP_L_NAV_BUTTON_SELECTED', 'bool') || - SimVar.GetSimVarValue('L:A32NX_RMP_R_NAV_BUTTON_SELECTED', 'bool'); + const rmpTuningActive = SimVar.GetSimVarValue('L:A32NX_RMP_NAV_BACKUP_MODE', 'bool'); const rmpTuningDeActivated = !rmpTuningActive && this.rmpTuningActive; this.rmpTuningActive = rmpTuningActive; @@ -482,6 +480,9 @@ export class NavaidTuner { */ private async tuneVorFrequency(index: 1 | 2, frequency: number | null): Promise { // FIXME tune through RMP (or direct for off-side) + // VOR course and frequencies are set in BaseRadioPanels.ts when in nav backup mode + // It doesn't overlap with this piece of code because it's disabled when in nav backup mode + // See rmpTuningActive variable in this file if (!NavRadioUtils.vhfFrequenciesAreEqual(this.lastVorFrequencies[index - 1], frequency)) { this.lastVorFrequencies[index - 1] = frequency; this.navaidVersion++; @@ -498,6 +499,9 @@ export class NavaidTuner { */ private async tuneVorCourse(index: 1 | 2, course: number | null): Promise { // FIXME tune through RMP (or direct for off-side) + // VOR course and frequencies are set in BaseRadioPanels.ts when in nav backup mode + // It doesn't overlap with this piece of code because it's disabled when in nav backup mode + // See rmpTuningActive variable in this file if (Math.round(this.lastVorCourses[index - 1]) !== Math.round(course)) { this.lastVorCourses[index - 1] = course; return Coherent.call('TRIGGER_KEY_EVENT', `VOR${index}_SET`, true, course ?? 0, 0, 0); From d9c2ebe529df01b0f63fbab3e97872dacc6dddb3 Mon Sep 17 00:00:00 2001 From: juliansebline Date: Tue, 14 Jan 2025 14:05:15 +0100 Subject: [PATCH 20/64] PseudoFWC.ts --- .../systems/systems-host/systems/FWC/PseudoFWC.ts | 15 +++++++++++++++ 1 file changed, 15 insertions(+) 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 4266ca34ee1..78032e8d6bc 100644 --- a/fbw-a32nx/src/systems/systems-host/systems/FWC/PseudoFWC.ts +++ b/fbw-a32nx/src/systems/systems-host/systems/FWC/PseudoFWC.ts @@ -1037,6 +1037,8 @@ export class PseudoFWC { private readonly voiceVhf3 = Subject.create(0); + private readonly audioSwitchingKnob = Subject.create(0); + /* SETTINGS */ private readonly configPortableDevices = Subject.create(false); @@ -2014,6 +2016,8 @@ export class PseudoFWC { this.tcasSensitivity.set(SimVar.GetSimVarValue('L:A32NX_TCAS_SENSITIVITY', 'Enum')); this.wingAntiIce.set(SimVar.GetSimVarValue('L:A32NX_PNEU_WING_ANTI_ICE_SYSTEM_SELECTED', 'bool')); this.voiceVhf3.set(SimVar.GetSimVarValue('A:COM ACTIVE FREQUENCY:3', 'number')); + this.audioSwitchingKnob.set(SimVar.GetSimVarValue('L:A32NX_AUDIOSWITCHING_KNOB', 'number')); + /* FUEL */ const fuelGallonsToKg = SimVar.GetSimVarValue('FUEL WEIGHT PER GALLON', 'kilogram'); @@ -4720,6 +4724,17 @@ export class PseudoFWC { sysPage: -1, side: 'RIGHT', }, + // AUDIO 3 XFRD + '0000280': { + flightPhaseInhib: [], + simVarIsActive: this.audioSwitchingKnob.map((v) => v !== 1), + whichCodeToReturn: () => [0], + codesToReturn: ['000028001'], + memoInhibit: () => false, + failure: 0, + sysPage: -1, + side: 'RIGHT', + }, '0000350': { // LAND ASAP RED flightPhaseInhib: [], From 9c42b01516d6e58093349ae4b9dacffba30ab453 Mon Sep 17 00:00:00 2001 From: juliansebline Date: Tue, 14 Jan 2025 14:21:28 +0100 Subject: [PATCH 21/64] Radio panels components files --- .../src/RMP/Components/BaseRadioPanels.tsx | 86 ++++++++++------- .../src/RMP/Components/HfRadioPanel.tsx | 39 ++++++++ .../src/RMP/Components/NavRadioPanel.tsx | 93 ++++++++++++------- .../src/RMP/Components/RadioPanelDisplay.tsx | 17 +++- .../src/RMP/Components/StandbyCourse.tsx | 6 +- .../src/RMP/Components/StandbyFrequency.tsx | 19 ++-- .../src/systems/instruments/src/RMP/index.tsx | 4 +- 7 files changed, 183 insertions(+), 81 deletions(-) create mode 100644 fbw-a32nx/src/systems/instruments/src/RMP/Components/HfRadioPanel.tsx diff --git a/fbw-a32nx/src/systems/instruments/src/RMP/Components/BaseRadioPanels.tsx b/fbw-a32nx/src/systems/instruments/src/RMP/Components/BaseRadioPanels.tsx index de03f4546de..9aef82abf53 100644 --- a/fbw-a32nx/src/systems/instruments/src/RMP/Components/BaseRadioPanels.tsx +++ b/fbw-a32nx/src/systems/instruments/src/RMP/Components/BaseRadioPanels.tsx @@ -6,6 +6,7 @@ import React, { useState } from 'react'; import { useSimVar, useInteractionSimVar, useInteractionEvent } from '@flybywiresim/fbw-sdk'; import { TransceiverType } from './StandbyFrequency'; import { VhfRadioPanel } from './VhfRadioPanel'; +import { HfRadioPanel } from './HfRadioPanel'; import { NavRadioPanel } from './NavRadioPanel'; import { RadioPanelDisplay } from './RadioPanelDisplay'; @@ -14,6 +15,8 @@ interface Props { * The RMP side (e.g. 'L' or 'R'). */ side: string; + + receiver: number; } /** @@ -33,7 +36,7 @@ export const RootRadioPanel = (props: Props) => { const powered = powerAvailable && panelSwitch; if (!powered) return ; - return ; + return ; }; /** @@ -53,86 +56,105 @@ const UnpoweredRadioPanel = () => ( * Renders appropriate mode sub-component (e.g. VhfRadioPanel). */ const PoweredRadioPanel = (props: Props) => { - const [navTransceiverType, setNavTransceiverType] = useState(TransceiverType.RADIO_VHF); + const [navReceiverType, setNavReceiverType] = useState(TransceiverType.ILS); // Used to turn on the associated led const [panelMode, setPanelMode] = useSimVar(`L:A32NX_RMP_${props.side}_SELECTED_MODE`, 'Number', 250); // Used to determine (in the FGMC for instance) if the system is in NAV backup mode. L and R simvars have to be checked - const [navButtonPressed, setNavButton] = useSimVar(`L:A32NX_RMP_${props.side}_NAV_BUTTON_SELECTED`, 'boolean', 250); + const [navButtonPressed, setNavButton] = useSimVar(`L:A32NX_RMP_${props.side}_NAV_BACKUP_MODE`, 'boolean', 250); // Used to return to the selected VHF once NAV is pushed again const [previousPanelMode, setPreviousPanelMode] = useState(panelMode); + const [indexTransceiver, setIndexTransceiver] = useState(props.side === 'L' ? 1 : 2); + // FIXME: A32NX_RMP_LS_COURSE and A32NX_RMP_VOR_** once MMR has them + const [, setCourse] = useSimVar( + navReceiverType === TransceiverType.VOR ? `K:VOR${props.side === 'L' ? 1 : 2}_SET` : 'L:A32NX_RMP_LS_COURSE', + 'number' + ); // Hook radio management panel mode buttons to set panelMode SimVar. useInteractionEvent(`A32NX_RMP_${props.side}_VHF1_BUTTON_PRESSED`, () => { setPanelMode(1); setPreviousPanelMode(1); - setNavTransceiverType(TransceiverType.RADIO_VHF); + setIndexTransceiver(1); }); useInteractionEvent(`A32NX_RMP_${props.side}_VHF2_BUTTON_PRESSED`, () => { setPanelMode(2); setPreviousPanelMode(2); - setNavTransceiverType(TransceiverType.RADIO_VHF); + setIndexTransceiver(2); }); useInteractionEvent(`A32NX_RMP_${props.side}_VHF3_BUTTON_PRESSED`, () => { setPanelMode(3); setPreviousPanelMode(3); - setNavTransceiverType(TransceiverType.RADIO_VHF); + setIndexTransceiver(3); + }); + + useInteractionEvent(`A32NX_RMP_${props.side}_HF1_BUTTON_PRESSED`, () => { + setPanelMode(4); + setPreviousPanelMode(4); + setIndexTransceiver(1); + }); + + useInteractionEvent(`A32NX_RMP_${props.side}_HF2_BUTTON_PRESSED`, () => { + setPanelMode(5); + setPreviousPanelMode(5); + setIndexTransceiver(2); }); useInteractionEvent(`A32NX_RMP_${props.side}_NAV_BUTTON_PRESSED`, () => { if (navButtonPressed) { + setCourse(-1); setPanelMode(previousPanelMode); - setNavTransceiverType(TransceiverType.RADIO_VHF); } setNavButton(!navButtonPressed); }); useInteractionEvent(`A32NX_RMP_${props.side}_VOR_BUTTON_PRESSED`, () => { - if (navButtonPressed) { - setPanelMode(6); - setNavTransceiverType(TransceiverType.VOR); - } - }); - - useInteractionEvent(`A32NX_RMP_${props.side}_ILS_BUTTON_PRESSED`, () => { if (navButtonPressed) { setPanelMode(7); - setNavTransceiverType(TransceiverType.ILS); + setNavReceiverType(TransceiverType.VOR); } }); - useInteractionEvent(`A32NX_RMP_${props.side}_GLS_BUTTON_PRESSED`, () => { + useInteractionEvent(`A32NX_RMP_${props.side}_ILS_BUTTON_PRESSED`, () => { if (navButtonPressed) { setPanelMode(8); - setNavTransceiverType(TransceiverType.GLS); + setNavReceiverType(TransceiverType.ILS); } }); - useInteractionEvent(`A32NX_RMP_${props.side}_MLS_BUTTON_PRESSED`, () => { - if (navButtonPressed) { - setPanelMode(9); - setNavTransceiverType(TransceiverType.MLS); - } - }); + /** + * MLS IMPLEMENTED IN THE XML BEHAVIOURS + * BUT DISABLED HERE SINCE THERE IS NOT ENOUGH REFERENCES + */ + // useInteractionEvent(`A32NX_RMP_${props.side}_MLS_BUTTON_PRESSED`, () => { + // if (navButtonPressed) { + // setPanelMode(8); + // } + // }); useInteractionEvent(`A32NX_RMP_${props.side}_ADF_BUTTON_PRESSED`, () => { if (navButtonPressed) { - setPanelMode(10); - setNavTransceiverType(TransceiverType.ADF); + setPanelMode(11); + setNavReceiverType(TransceiverType.ADF); } }); // This means we're in a VHF communications mode. - switch (navTransceiverType) { - case TransceiverType.RADIO_VHF: - return ; - case TransceiverType.VOR: - case TransceiverType.ILS: - case TransceiverType.ADF: - return ; + switch (panelMode) { + case 1: + case 2: + case 3: + return ; + case 4: + case 5: + return ; + case 7: + case 8: + case 11: + return ; default: // If we reach this block, something's gone wrong. We'll just render a broken panel. return ( diff --git a/fbw-a32nx/src/systems/instruments/src/RMP/Components/HfRadioPanel.tsx b/fbw-a32nx/src/systems/instruments/src/RMP/Components/HfRadioPanel.tsx new file mode 100644 index 00000000000..1ada688114b --- /dev/null +++ b/fbw-a32nx/src/systems/instruments/src/RMP/Components/HfRadioPanel.tsx @@ -0,0 +1,39 @@ +import React from 'react'; +import { useSimVar, useInteractionEvent } from '@flybywiresim/fbw-sdk'; +import { StandbyFrequency, TransceiverType } from './StandbyFrequency'; +import { RadioPanelDisplay } from './RadioPanelDisplay'; + +interface Props { + /** + * The RMP side (e.g. 'L' or 'R'). + */ + side: string; + + /** + * The HF transceiver mode (HF 1 or 2). + */ + hf: number; +} + +export const HfRadioPanel = (props: Props) => { + const [active, setActive] = useSimVar(`L:A32NX_RMP_HF${props.hf}_ACTIVE_FREQUENCY`, 'Hz'); + const [standby, setStandby] = useSimVar(`L:A32NX_RMP_${props.side}_HF${props.hf}_STANDBY_FREQUENCY`, 'Hz'); + + // Handle Transfer Button Pressed. + useInteractionEvent(`A32NX_RMP_${props.side}_TRANSFER_BUTTON_PRESSED`, () => { + setActive(standby); + setStandby(active); + }); + + return ( + + + + + ); +}; diff --git a/fbw-a32nx/src/systems/instruments/src/RMP/Components/NavRadioPanel.tsx b/fbw-a32nx/src/systems/instruments/src/RMP/Components/NavRadioPanel.tsx index 690ebab352d..bff5f91bda5 100644 --- a/fbw-a32nx/src/systems/instruments/src/RMP/Components/NavRadioPanel.tsx +++ b/fbw-a32nx/src/systems/instruments/src/RMP/Components/NavRadioPanel.tsx @@ -16,9 +16,9 @@ interface Props { side: string; /** - * The NAV transceiver (VOR, ILS, ADF). + * The NAV receiver (VOR, ILS, ADF). */ - transceiver: number; + receiver: number; } enum Mode { @@ -33,12 +33,12 @@ enum Mode { /** * - * @param transceiver The transceiver type (VOR, ADF or ILS) - * @param side Side on which the transceiver is (L or R) + * @param receiver The receiver type (VOR, ADF or ILS) + * @param side Side on which the receiver is (L or R) * @returns a tuble simvar */ -const useActiveFrequency = (transceiver: number, side: string) => { - switch (transceiver) { +const useActiveFrequency = (receiver: number, side: string) => { + switch (receiver) { case TransceiverType.VOR: return useSimVar(`L:A32NX_RMP_${side}_SAVED_ACTIVE_FREQUENCY_VOR`, 'number'); case TransceiverType.ADF: @@ -50,12 +50,12 @@ const useActiveFrequency = (transceiver: number, side: string) => { /** * - * @param transceiver The transceiver type (VOR, ADF or ILS) - * @param side Side on which the transceiver is (L or R) + * @param receiver The receiver type (VOR, ADF or ILS) + * @param side Side on which the receiver is (L or R) * @returns a tuble simvar */ -const useStandbyFrequency = (transceiver: number, side: string) => { - switch (transceiver) { +const useStandbyFrequency = (receiver: number, side: string) => { + switch (receiver) { case TransceiverType.VOR: return useSimVar(`L:A32NX_RMP_${side}_SAVED_STANDBY_FREQUENCY_VOR`, 'number'); case TransceiverType.ADF: @@ -67,12 +67,12 @@ const useStandbyFrequency = (transceiver: number, side: string) => { /** * - * @param transceiver The transceiver type (VOR, ADF or ILS) - * @param side Side on which the transceiver is (L or R) + * @param receiver The receiver type (VOR, ADF or ILS) + * @param side Side on which the receiver is (L or R) * @returns a tuble simvar */ -const useCourse = (transceiver: number, side: string) => { - switch (transceiver) { +const useCourse = (receiver: number, side: string) => { + switch (receiver) { case TransceiverType.VOR: return useSimVar(`L:A32NX_RMP_${side}_SAVED_COURSE_VOR`, 'number'); default: @@ -80,16 +80,16 @@ const useCourse = (transceiver: number, side: string) => { } }; -const setActiveFrequencySimVar = (transceiver: number, index: number, frequency: number) => { - if (transceiver === TransceiverType.ADF) { +const setActiveFrequencySimVar = (receiver: number, index: number, frequency: number) => { + if (receiver === TransceiverType.ADF) { SimVar.SetSimVarValue( `K:ADF${index === 1 ? '' : index}_ACTIVE_SET`, 'Frequency ADF BCD32', Avionics.Utils.make_adf_bcd32(frequency), ); + } else { + SimVar.SetSimVarValue(`K:NAV${index}_RADIO_SET_HZ`, 'Hz', frequency); } - - SimVar.SetSimVarValue(`K:NAV${index}_RADIO_SET_HZ`, 'Hz', frequency); }; /** @@ -101,42 +101,42 @@ export const NavRadioPanel = (props: Props) => { let standbyWindow: JSX.Element; let index = props.side === 'L' ? 1 : 2; - if (props.transceiver === TransceiverType.ILS) { + if (props.receiver === TransceiverType.ILS) { index = 3; // Both RMPs manage the same ILS } const [mode, setMode] = useState(Mode.FREQUENCY); - const [activeFrequency, setActiveFrequencySaved] = useActiveFrequency(props.transceiver, props.side); - const [standbyFrequency, setStandbyFrequencySaved] = useStandbyFrequency(props.transceiver, props.side); - const [course, setCourseSaved] = useCourse(props.transceiver, props.side); - - const [, setCourse] = useSimVar( - props.transceiver === TransceiverType.VOR ? `K:VOR${index}_SET` : 'L:A32NX_FM_LS_COURSE', - 'number', - 100, - ); + const [activeFrequency, setActiveFrequencySaved] = useActiveFrequency(props.receiver, props.side); + const [standbyFrequency, setStandbyFrequencySaved] = useStandbyFrequency(props.receiver, props.side); + const [course, setCourseSaved] = useCourse(props.receiver, props.side); const [APPR] = useSimVar('L:A32NX_FCU_APPR_MODE_ACTIVE', 'bool'); const [AP] = useSimVar('L:A32NX_AUTOPILOT_ACTIVE', 'bool'); const [RA1] = useSimVar('L:A32NX_RA_1_RADIO_ALTITUDE', 'number'); const [RA2] = useSimVar('L:A32NX_RA_2_RADIO_ALTITUDE', 'number'); + // FIXME: Remove A32NX_RMP_LS_COURSE and K:VOR${index}_SET once MMR implements them + const [, setCourse] = useSimVar( + props.receiver === TransceiverType.VOR ? `K:VOR${index}_SET` : 'L:A32NX_RMP_LS_COURSE', + 'number', + 100, + ); useInteractionEvent(`A32NX_RMP_${props.side}_TRANSFER_BUTTON_PRESSED`, () => { + // FIXME: Remove this logic once MMR is implemented // Inhibit RMP tuning if below 700 RA, APPR engaged, at least one AP/FD engaged (FCOM compliant) if ((RA1 >= 700 && RA2 >= 700) || !APPR || !AP) { if (mode === Mode.FREQUENCY) { - if (props.transceiver !== TransceiverType.ADF) { + if (props.receiver !== TransceiverType.ADF) { setMode(Mode.COURSE); } - // FCOM compliant: Both RMPs must be in nav backup mode in order to tune the ILS + // FCOM compliant: If ILS, the frequency can be tuned via the RMP only if both RMPs are in nav backup mode. if ( - props.transceiver !== TransceiverType.ILS || - (SimVar.GetSimVarValue('L:A32NX_RMP_L_NAV_BUTTON_SELECTED', 'Bool') && - SimVar.GetSimVarValue('L:A32NX_RMP_R_NAV_BUTTON_SELECTED', 'Bool')) + props.receiver !== TransceiverType.ILS || + (SimVar.GetSimVarValue('L:A32NX_RMP_NAV_BACKUP_MODE', 'Bool') === true) ) { - setActiveFrequencySimVar(props.transceiver, index, standbyFrequency); + setActiveFrequencySimVar(props.receiver, index, standbyFrequency); } setActiveFrequencySaved(standbyFrequency); } else { @@ -144,6 +144,29 @@ export const NavRadioPanel = (props: Props) => { setMode(Mode.FREQUENCY); } } + + // This effect to display frequency mode instead of course mode when switching between receivers. + // After few debug sessions, it was noticed standbyFrequency was the first valuable sign of switch. + // I could have listened props.receiver but this caused flickering (very fast display of previous frequency) due to sequential render + useEffect(() => { + // Performance purpose. Could set Frequency everytime but setMode fires a render + if (mode === Mode.COURSE) { + setMode(Mode.FREQUENCY); + } + }, [standbyFrequency]); + + if (mode === Mode.FREQUENCY) { + standbyWindow = ( + + ); + } else { + standbyWindow = ; + } }); // This effect to display frequency mode instead of course mode when switching between receivers. @@ -162,7 +185,7 @@ export const NavRadioPanel = (props: Props) => { side={props.side} value={standbyFrequency} setValue={setStandbyFrequencySaved} - transceiver={props.transceiver} + transceiver={props.receiver} /> ); } else { diff --git a/fbw-a32nx/src/systems/instruments/src/RMP/Components/RadioPanelDisplay.tsx b/fbw-a32nx/src/systems/instruments/src/RMP/Components/RadioPanelDisplay.tsx index 620d7e6c9ca..29c06c36d6d 100644 --- a/fbw-a32nx/src/systems/instruments/src/RMP/Components/RadioPanelDisplay.tsx +++ b/fbw-a32nx/src/systems/instruments/src/RMP/Components/RadioPanelDisplay.tsx @@ -13,6 +13,7 @@ interface Props { } const TEXT_DATA_MODE_VHF3 = 'DATA'; +const TEXT_DATA_MODE_VHF3_UNPOWERED = '------'; /** * Format the given frequency to be displayed. @@ -20,12 +21,15 @@ const TEXT_DATA_MODE_VHF3 = 'DATA'; * @returns The formated frequency string in 123.456 */ const formatFrequency = (frequency: number): string => { - // VHF COM, VOR, ILS + // VHF, VOR, ILS if (frequency >= 108000000) { return (frequency / 1000000).toFixed(3).padEnd(7, '0'); } - // HF HERE + // HF + if (frequency >= 2000000) { + return (frequency / 1000000).toFixed(3).padEnd(5, '0'); + } // ADF return (frequency / 1000).toFixed(1); @@ -39,6 +43,7 @@ const formatFrequency = (frequency: number): string => { export function RadioPanelDisplay(props: Props) { const [lightsTest] = useSimVar('L:A32NX_OVHD_INTLT_ANN', 'Boolean', 1000); const [dc2IsPowered] = useSimVar('L:A32NX_ELEC_DC_2_BUS_IS_POWERED', 'Bool', 1000); + const [DCBus1] = useSimVar('L:A32NX_ELEC_DC_1_BUS_IS_POWERED', 'boolean'); let content: JSX.Element; @@ -60,12 +65,18 @@ export function RadioPanelDisplay(props: Props) { {formatFrequency(props.value)} ); - } else { + } else if (DCBus1) { content = ( {TEXT_DATA_MODE_VHF3} ); + } else { + content = ( + + {TEXT_DATA_MODE_VHF3_UNPOWERED} + + ); } return {content}; diff --git a/fbw-a32nx/src/systems/instruments/src/RMP/Components/StandbyCourse.tsx b/fbw-a32nx/src/systems/instruments/src/RMP/Components/StandbyCourse.tsx index c92220e94b1..91bf211e43b 100644 --- a/fbw-a32nx/src/systems/instruments/src/RMP/Components/StandbyCourse.tsx +++ b/fbw-a32nx/src/systems/instruments/src/RMP/Components/StandbyCourse.tsx @@ -32,8 +32,8 @@ export const StandbyCourse = (props: Props) => { // Handle inner knob turned. const innerKnobUpdateCallback: UpdateValueCallback = useCallback( (offset) => { - const integer = Math.floor((props.value + offset) / 360); - props.setValue(props.value - integer * 360 + offset); + // +360 to take into account values below 0 + props.setValue((((props.value + offset) % 360) + 360) % 360); }, [props.value], ); @@ -46,5 +46,5 @@ export const StandbyCourse = (props: Props) => { useInteractionEvent(`A32NX_RMP_${props.side}_INNER_KNOB_TURNED_CLOCKWISE`, () => innerKnob.current.increase()); useInteractionEvent(`A32NX_RMP_${props.side}_INNER_KNOB_TURNED_ANTICLOCKWISE`, () => innerKnob.current.decrease()); - return ; + return ; }; diff --git a/fbw-a32nx/src/systems/instruments/src/RMP/Components/StandbyFrequency.tsx b/fbw-a32nx/src/systems/instruments/src/RMP/Components/StandbyFrequency.tsx index a7f1dcc3052..af7f5c4c50f 100644 --- a/fbw-a32nx/src/systems/instruments/src/RMP/Components/StandbyFrequency.tsx +++ b/fbw-a32nx/src/systems/instruments/src/RMP/Components/StandbyFrequency.tsx @@ -15,10 +15,9 @@ declare const Utils; // this can also be replaced once /typings are available export enum TransceiverType { RADIO_VHF, + RADIO_HF, VOR, ILS, - GLS, - MLS, ADF, } @@ -156,6 +155,9 @@ export const StandbyFrequency = (props: Props) => { let newInteger = 0; if (props.transceiver === TransceiverType.RADIO_VHF) { newInteger = Utils.Clamp(integer, 118, 136); + } + if (props.transceiver === TransceiverType.RADIO_HF) { + newInteger = Utils.Clamp(integer, 2, 23); } else if (props.transceiver === TransceiverType.ILS) { newInteger = Utils.Clamp(integer, 108, 111); } else if (props.transceiver === TransceiverType.VOR) { @@ -188,11 +190,16 @@ export const StandbyFrequency = (props: Props) => { const integer = Math.floor(frequency / 1000); let decimal = 0; - if (props.transceiver !== TransceiverType.ADF) { - decimal = offsetFrequencyChannel(spacing, frequency % 1000, offset); - } else { - // offsetFrequencyChannel does not fit ADF needs + // offsetFrequencyChannel does not fit ADF needs nor HF + if (props.transceiver === TransceiverType.ADF) { decimal = frequency % 1000 === 0 ? 500 : 0; + } else if (props.transceiver === TransceiverType.RADIO_HF) { + decimal = (frequency % 1000) + offset; + if (decimal < 0) { + decimal = 1000 - Math.abs(decimal); + } + } else { + decimal = offsetFrequencyChannel(spacing, frequency % 1000, offset); } props.setValue((integer * 1000 + (decimal % 1000)) * toMhz); } else { diff --git a/fbw-a32nx/src/systems/instruments/src/RMP/index.tsx b/fbw-a32nx/src/systems/instruments/src/RMP/index.tsx index 9bd0a311566..758c76e7e67 100644 --- a/fbw-a32nx/src/systems/instruments/src/RMP/index.tsx +++ b/fbw-a32nx/src/systems/instruments/src/RMP/index.tsx @@ -9,7 +9,7 @@ import { RootRadioPanel } from './Components/BaseRadioPanels'; render(
- - + +
, ); From 7b536bab3e52783c033a4545b162d59b73128ad5 Mon Sep 17 00:00:00 2001 From: juliansebline Date: Tue, 14 Jan 2025 15:20:54 +0100 Subject: [PATCH 22/64] lib.rs systems rust --- fbw-a32nx/src/wasm/systems/a320_systems/src/lib.rs | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/fbw-a32nx/src/wasm/systems/a320_systems/src/lib.rs b/fbw-a32nx/src/wasm/systems/a320_systems/src/lib.rs index 1acd66fc449..800f36a321d 100644 --- a/fbw-a32nx/src/wasm/systems/a320_systems/src/lib.rs +++ b/fbw-a32nx/src/wasm/systems/a320_systems/src/lib.rs @@ -35,6 +35,7 @@ use systems::{ AuxiliaryPowerUnitFactory, AuxiliaryPowerUnitFireOverheadPanel, AuxiliaryPowerUnitOverheadPanel, }, + communications::Communications, electrical::{Electricity, ElectricitySource, ExternalPowerSource}, engine::{leap_engine::LeapEngine, reverser_thrust::ReverserForce, EngineFireOverheadPanel}, hydraulic::brake_circuit::AutobrakePanel, @@ -76,6 +77,7 @@ pub struct A320 { radio_altimeters: A320RadioAltimeters, egpwc: EnhancedGroundProximityWarningComputer, reverse_thrust: ReverserForce, + communications: Communications, } impl A320 { pub fn new(context: &mut InitContext) -> A320 { @@ -131,6 +133,7 @@ impl A320 { 0, ), reverse_thrust: ReverserForce::new(context), + communications: Communications::new(context), } } } @@ -256,6 +259,8 @@ impl Aircraft for A320 { ); self.egpwc.update(&self.adirs, self.lgcius.lgciu1()); + + self.communications.update(context); } } impl SimulationElement for A320 { @@ -289,6 +294,7 @@ impl SimulationElement for A320 { self.pneumatic.accept(visitor); self.egpwc.accept(visitor); self.reverse_thrust.accept(visitor); + self.communications.accept(visitor); visitor.visit(self); } From 4893e8e46b24d0e5eeb379319a35c496bf65d36c Mon Sep 17 00:00:00 2001 From: juliansebline Date: Tue, 14 Jan 2025 15:23:28 +0100 Subject: [PATCH 23/64] communications.rs --- .../a320_systems_wasm/src/communications.rs | 115 ++++++++++++++++++ .../wasm/systems/a320_systems_wasm/src/lib.rs | 4 + 2 files changed, 119 insertions(+) create mode 100644 fbw-a32nx/src/wasm/systems/a320_systems_wasm/src/communications.rs diff --git a/fbw-a32nx/src/wasm/systems/a320_systems_wasm/src/communications.rs b/fbw-a32nx/src/wasm/systems/a320_systems_wasm/src/communications.rs new file mode 100644 index 00000000000..675db45d51d --- /dev/null +++ b/fbw-a32nx/src/wasm/systems/a320_systems_wasm/src/communications.rs @@ -0,0 +1,115 @@ +use std::error::Error; +use systems_wasm::aspects::{MsfsAspectBuilder, VariableToEventMapping, VariableToEventWriteOn}; +use systems_wasm::Variable; + +pub(super) fn communications(builder: &mut MsfsAspectBuilder) -> Result<(), Box> { + builder.init_variable(Variable::aspect("VHF1_VOLUME"), 80.0); + builder.init_variable(Variable::aspect("VHF2_VOLUME"), 40.0); + + builder.variable_to_event( + Variable::aspect("PILOT_TRANSMIT_CHANNEL"), + VariableToEventMapping::EventDataRaw, + VariableToEventWriteOn::Change, + "PILOT_TRANSMITTER_SET", + )?; + // EveryTick due to a bug within the SDK + // Whenever the pilot version is set, the copilot version is too + // Therefore as workaround, we need to constantly update the copilot version + builder.variable_to_event( + Variable::aspect("COPILOT_TRANSMIT_CHANNEL"), + VariableToEventMapping::EventDataRaw, + VariableToEventWriteOn::EveryTick, + "COPILOT_TRANSMITTER_SET", + )?; + builder.variable_to_event( + Variable::aspect("COM1_RECEIVE"), + VariableToEventMapping::EventDataRaw, + VariableToEventWriteOn::Change, + "COM1_RECEIVE_SELECT", + )?; + builder.variable_to_event( + Variable::aspect("COM2_RECEIVE"), + VariableToEventMapping::EventDataRaw, + VariableToEventWriteOn::Change, + "COM2_RECEIVE_SELECT", + )?; + // EveryTick due to an issue with volume initialisation + // Somestimes, the SDK doesn't seem to take into account our default value + // therefore the volume remains at 100% until it's changed on the ACP + // Waiting for an field in .flt files + builder.variable_to_event( + Variable::aspect("VHF1_VOLUME"), + VariableToEventMapping::EventDataRaw, + VariableToEventWriteOn::EveryTick, + "COM1_VOLUME_SET", + )?; + builder.variable_to_event( + Variable::aspect("VHF2_VOLUME"), + VariableToEventMapping::EventDataRaw, + VariableToEventWriteOn::EveryTick, + "COM2_VOLUME_SET", + )?; + builder.variable_to_event( + Variable::aspect("VHF3_VOLUME"), + VariableToEventMapping::EventDataRaw, + VariableToEventWriteOn::Change, + "COM3_VOLUME_SET", + )?; + builder.variable_to_event( + Variable::aspect("MARKER_IDENT"), + VariableToEventMapping::EventDataRaw, + VariableToEventWriteOn::Change, + "MARKER_SOUND_TOGGLE", + )?; + builder.variable_to_event( + Variable::aspect("ADF1_IDENT"), + VariableToEventMapping::EventDataRaw, + VariableToEventWriteOn::Change, + "RADIO_ADF_IDENT_SET", + )?; + builder.variable_to_event( + Variable::aspect("ADF2_IDENT"), + VariableToEventMapping::EventDataRaw, + VariableToEventWriteOn::Change, + "RADIO_ADF2_IDENT_SET", + )?; + builder.variable_to_event( + Variable::aspect("VOR1_IDENT"), + VariableToEventMapping::EventDataRaw, + VariableToEventWriteOn::Change, + "RADIO_VOR1_IDENT_SET", + )?; + builder.variable_to_event( + Variable::aspect("VOR1_IDENT"), + VariableToEventMapping::EventDataRaw, + VariableToEventWriteOn::Change, + "RADIO_DME1_IDENT_SET", + )?; + builder.variable_to_event( + Variable::aspect("VOR2_IDENT"), + VariableToEventMapping::EventDataRaw, + VariableToEventWriteOn::Change, + "RADIO_VOR2_IDENT_SET", + )?; + builder.variable_to_event( + Variable::aspect("VOR2_IDENT"), + VariableToEventMapping::EventDataRaw, + VariableToEventWriteOn::Change, + "RADIO_DME2_IDENT_SET", + )?; + // The next two get data from ILS_IDENT since both MMRs are ILS only (so far) + builder.variable_to_event( + Variable::aspect("ILS_IDENT"), + VariableToEventMapping::EventDataRaw, + VariableToEventWriteOn::Change, + "RADIO_VOR3_IDENT_SET", + )?; + builder.variable_to_event( + Variable::aspect("ILS_IDENT"), + VariableToEventMapping::EventDataRaw, + VariableToEventWriteOn::Change, + "RADIO_VOR4_IDENT_SET", + )?; + + Ok(()) +} diff --git a/fbw-a32nx/src/wasm/systems/a320_systems_wasm/src/lib.rs b/fbw-a32nx/src/wasm/systems/a320_systems_wasm/src/lib.rs index 6dc95e07487..e312e2533fa 100644 --- a/fbw-a32nx/src/wasm/systems/a320_systems_wasm/src/lib.rs +++ b/fbw-a32nx/src/wasm/systems/a320_systems_wasm/src/lib.rs @@ -1,6 +1,7 @@ mod ailerons; mod autobrakes; mod brakes; +mod communications; mod elevators; mod flaps; mod gear; @@ -15,6 +16,7 @@ use a320_systems::A320; use ailerons::ailerons; use autobrakes::autobrakes; use brakes::brakes; +use communications::communications; use elevators::elevators; use flaps::flaps; use gear::gear; @@ -408,6 +410,7 @@ async fn systems(mut gauge: msfs::Gauge) -> Result<(), Box> { "radian per second squared", 0, )? + .provides_aircraft_variable("MARKER SOUND", "Bool", 0)? .with_aspect(|builder| { builder.copy( Variable::aircraft("APU GENERATOR SWITCH", "Bool", 0), @@ -448,6 +451,7 @@ async fn systems(mut gauge: msfs::Gauge) -> Result<(), Box> { .with_aspect(gear)? .with_aspect(payload)? .with_aspect(trimmable_horizontal_stabilizer)? + .with_aspect(communications)? .build(A320::new)?; while let Some(event) = gauge.next_event().await { From 19db289faea6f1951b9301028feb122899335642 Mon Sep 17 00:00:00 2001 From: juliansebline Date: Tue, 14 Jan 2025 15:29:27 +0100 Subject: [PATCH 24/64] audio_control_panel.rs --- .../src/communications/audio_control_panel.rs | 502 ++++++++++++++++++ 1 file changed, 502 insertions(+) create mode 100644 fbw-common/src/wasm/systems/systems/src/communications/audio_control_panel.rs diff --git a/fbw-common/src/wasm/systems/systems/src/communications/audio_control_panel.rs b/fbw-common/src/wasm/systems/systems/src/communications/audio_control_panel.rs new file mode 100644 index 00000000000..d84b04ac69c --- /dev/null +++ b/fbw-common/src/wasm/systems/systems/src/communications/audio_control_panel.rs @@ -0,0 +1,502 @@ +use super::audio_management_unit::{ + IdentificationWordAMUACP, LabelWordAMUACP, WordAMUACPInfo, TIMEOUT, +}; +use crate::{ + shared::{ + arinc429::{Arinc429Word, SignStatus}, + ElectricalBusType, ElectricalBuses, + }, + simulation::{ + InitContext, Read, SimulationElement, SimulationElementVisitor, SimulatorReader, + SimulatorWriter, UpdateContext, VariableIdentifier, Write, + }, +}; +use num_traits::FromPrimitive; +use std::time::Duration; + +#[derive(PartialEq, Copy, Clone, Eq)] +pub enum TransmitID { + None = 0, + Vhf1, + VHf2, + Vhf3, + Hf1, + Hf2, + Mech, + Cab, + Pa, +} +impl From for TransmitID { + fn from(value: u32) -> Self { + match value { + 0 => TransmitID::None, + 1 => TransmitID::Vhf1, + 2 => TransmitID::VHf2, + 3 => TransmitID::Vhf3, + 4 => TransmitID::Hf1, + 5 => TransmitID::Hf2, + 6 => TransmitID::Mech, + 7 => TransmitID::Cab, + 8 => TransmitID::Pa, + i => { + println!("Unknow Transmit ID {}", i); + panic!(); + } + } + } +} + +pub struct AudioControlPanel { + id_acp: u32, + + transmit_channel_id: VariableIdentifier, + transmit_pushed_id: VariableIdentifier, + voice_button_id: VariableIdentifier, + reset_button_id: VariableIdentifier, + + voice_button: bool, + reset_button: bool, + + transmit_channel: TransmitID, + transmit_pushed: TransmitID, + + vhfs: [TransceiverACPFacade; 3], + comms: [TransceiverACPFacade; 5], // TransceiverACPFacades not simulated due to SDK capabilities. Just to make the knobs rotatable/pushable + adfs: [TransceiverACPFacade; 2], + vors: [TransceiverACPFacade; 2], + ils: TransceiverACPFacade, + gls: TransceiverACPFacade, + markers: TransceiverACPFacade, + + power_supply: ElectricalBusType, + is_power_supply_powered: bool, + + list_arinc_words: Vec, + last_complete_cycle_sent: Duration, +} +impl AudioControlPanel { + pub fn new(context: &mut InitContext, id_acp: u32, power_supply: ElectricalBusType) -> Self { + Self { + id_acp, + + transmit_channel_id: context.get_identifier(format!("ACP{}_TRANSMIT_CHANNEL", id_acp)), + transmit_pushed_id: context.get_identifier(format!("ACP{}_TRANSMIT_PUSHED", id_acp)), + voice_button_id: context.get_identifier(format!("ACP{}_VOICE_BUTTON_DOWN", id_acp)), + reset_button_id: context.get_identifier(format!("ACP{}_RESET_BUTTON_DOWN", id_acp)), + + voice_button: false, + reset_button: false, + + transmit_channel: TransmitID::Vhf1, + transmit_pushed: TransmitID::Vhf1, + + vhfs: [ + TransceiverACPFacade::new(context, id_acp, "VHF1"), + TransceiverACPFacade::new(context, id_acp, "VHF2"), + TransceiverACPFacade::new(context, id_acp, "VHF3"), + ], + comms: [ + TransceiverACPFacade::new(context, id_acp, "HF1"), + TransceiverACPFacade::new(context, id_acp, "HF2"), + TransceiverACPFacade::new(context, id_acp, "MECH"), + TransceiverACPFacade::new(context, id_acp, "ATT"), + TransceiverACPFacade::new(context, id_acp, "PA"), + ], + adfs: [ + TransceiverACPFacade::new(context, id_acp, "ADF1"), + TransceiverACPFacade::new(context, id_acp, "ADF2"), + ], + vors: [ + TransceiverACPFacade::new(context, id_acp, "VOR1"), + TransceiverACPFacade::new(context, id_acp, "VOR2"), + ], + ils: TransceiverACPFacade::new(context, id_acp, "ILS"), + gls: TransceiverACPFacade::new(context, id_acp, "MLS"), + markers: TransceiverACPFacade::new(context, id_acp, "MKR"), + + power_supply, + is_power_supply_powered: false, + + list_arinc_words: Vec::from([ + WordAMUACPInfo::new( + IdentificationWordAMUACP::Word0, + 0, + LabelWordAMUACP::Label300Request, + ), + WordAMUACPInfo::new( + IdentificationWordAMUACP::Wordamu, + 0, + LabelWordAMUACP::Label301AMU, + ), + WordAMUACPInfo::new( + IdentificationWordAMUACP::Word01, + 1, + LabelWordAMUACP::Label210VolumeControlVHF, + ), + WordAMUACPInfo::new( + IdentificationWordAMUACP::Word02, + 2, + LabelWordAMUACP::Label210VolumeControlVHF, + ), + WordAMUACPInfo::new( + IdentificationWordAMUACP::Word03, + 3, + LabelWordAMUACP::Label210VolumeControlVHF, + ), + WordAMUACPInfo::new( + IdentificationWordAMUACP::Word04, + 1, + LabelWordAMUACP::Label211VolumeControlHF, + ), + WordAMUACPInfo::new( + IdentificationWordAMUACP::Word05, + 2, + LabelWordAMUACP::Label211VolumeControlHF, + ), + WordAMUACPInfo::new( + IdentificationWordAMUACP::Word06, + 1, + LabelWordAMUACP::Label215VolumeControlINTCAB, + ), + WordAMUACPInfo::new( + IdentificationWordAMUACP::Word07, + 2, + LabelWordAMUACP::Label215VolumeControlINTCAB, + ), + WordAMUACPInfo::new( + IdentificationWordAMUACP::Word08, + 3, + LabelWordAMUACP::Label212VolumeControlADFPA, + ), + WordAMUACPInfo::new( + IdentificationWordAMUACP::Word09, + 1, + LabelWordAMUACP::Label213VolumeControlVORMKR, + ), + WordAMUACPInfo::new( + IdentificationWordAMUACP::Word10, + 2, + LabelWordAMUACP::Label213VolumeControlVORMKR, + ), + WordAMUACPInfo::new( + IdentificationWordAMUACP::Word11, + 3, + LabelWordAMUACP::Label213VolumeControlVORMKR, + ), + WordAMUACPInfo::new( + IdentificationWordAMUACP::Word12, + 0, + LabelWordAMUACP::Label217VolumeControlILS, + ), + WordAMUACPInfo::new( + IdentificationWordAMUACP::Word15, + 1, + LabelWordAMUACP::Label212VolumeControlADFPA, + ), + WordAMUACPInfo::new( + IdentificationWordAMUACP::Word16, + 2, + LabelWordAMUACP::Label212VolumeControlADFPA, + ), + ]), + last_complete_cycle_sent: Duration::from_millis(0), + } + } + + fn send_word_0(&self, bus_acp: &mut Vec>) { + let mut word_arinc: Arinc429Word = Arinc429Word::new(0, SignStatus::NormalOperation); + + word_arinc.set_bits(1, LabelWordAMUACP::Label300Request as u32); + word_arinc.set_bits(29, self.id_acp); + + bus_acp.push(word_arinc); + } + + fn send_volume_control(&self, bus_acp: &mut Vec>, index: usize) { + let mut word_arinc: Arinc429Word = Arinc429Word::new(0, SignStatus::NormalOperation); + word_arinc.set_bits(1, self.list_arinc_words[index].get_label() as u32); + word_arinc.set_bits(9, self.list_arinc_words[index].get_sdi()); + + word_arinc.set_bits(11, self.transmit_pushed as u32); + + // Not used so far + // word_arinc.set_bit(15, self.int_rad_switch <= Self::DEFAULT_INT_RAD_SWITCH); + // word_arinc.set_bit(16, self.int_rad_switch == Self::TRANSMIT_ID_INT); + + match self.list_arinc_words[index].get_identification() { + IdentificationWordAMUACP::Word01 => { + word_arinc.set_bits(17, self.vhfs[0].volume); + word_arinc.set_bit(25, self.vhfs[0].knob); + } + IdentificationWordAMUACP::Word02 => { + word_arinc.set_bits(17, self.vhfs[1].volume); + word_arinc.set_bit(25, self.vhfs[1].knob); + } + IdentificationWordAMUACP::Word03 => { + word_arinc.set_bits(17, self.vhfs[2].volume); + word_arinc.set_bit(25, self.vhfs[2].knob); + } + IdentificationWordAMUACP::Word04 => { + word_arinc.set_bits(17, self.comms[0].volume); + word_arinc.set_bit(25, self.comms[0].knob); + } + IdentificationWordAMUACP::Word05 => { + word_arinc.set_bits(17, self.comms[1].volume); + word_arinc.set_bit(25, self.comms[1].knob); + } + IdentificationWordAMUACP::Word06 => { + word_arinc.set_bits(17, self.comms[2].volume); + word_arinc.set_bit(25, self.comms[2].knob); + } + IdentificationWordAMUACP::Word07 => { + word_arinc.set_bits(17, self.comms[3].volume); + word_arinc.set_bit(25, self.comms[3].knob); + } + IdentificationWordAMUACP::Word08 => { + word_arinc.set_bits(17, self.comms[4].volume); + word_arinc.set_bit(25, self.comms[4].knob); + } + IdentificationWordAMUACP::Word09 => { + word_arinc.set_bits(17, self.vors[0].volume); + word_arinc.set_bit(25, self.vors[0].knob); + } + IdentificationWordAMUACP::Word10 => { + word_arinc.set_bits(17, self.vors[1].volume); + word_arinc.set_bit(25, self.vors[1].knob); + } + IdentificationWordAMUACP::Word11 => { + word_arinc.set_bits(17, self.markers.volume); + word_arinc.set_bit(25, self.markers.knob); + } + IdentificationWordAMUACP::Word12 => { + word_arinc.set_bits(17, self.ils.volume); + word_arinc.set_bit(25, self.ils.knob); + } + IdentificationWordAMUACP::Word15 => { + word_arinc.set_bits(17, self.adfs[0].volume); + word_arinc.set_bit(25, self.adfs[0].knob); + } + IdentificationWordAMUACP::Word16 => { + word_arinc.set_bits(17, self.adfs[1].volume); + word_arinc.set_bit(25, self.adfs[1].knob); + } + i => { + println!("Cant find word acp with id {}", i as u32); + panic!(); + } + } + + word_arinc.set_bit(26, self.voice_button); + word_arinc.set_bit(27, self.reset_button); + + bus_acp.push(word_arinc); + } + + pub fn decode_amu_word( + bus: &mut Vec>, + transmission_table: &mut TransmitID, + call_mech: &mut bool, + call_att: &mut bool, + calls: &mut u32, + ) -> bool { + let mut ret: bool = false; + let label_option: Option = FromPrimitive::from_u32(bus[0].get_bits(8, 1)); + + if let Some(label) = label_option { + if label == LabelWordAMUACP::Label301AMU { + let word = bus.remove(0); + *transmission_table = TransmitID::from(word.get_bits(4, 11)); + *call_mech = word.get_bit(15); + *call_att = word.get_bit(16); + *calls = word.get_bits(5, 25); + ret = true; + } + } + + ret + } + + pub fn update(&mut self, context: &UpdateContext, bus_acp: &mut Vec>) { + self.last_complete_cycle_sent += context.delta(); + + if self.is_power_supply_powered { + if !bus_acp.is_empty() { + // These will be used later on + // Especially "calls" when SELCAL will be + // translated into Rust + let mut call_mech: bool = false; + let mut call_att: bool = false; + let mut calls: u32 = 0; + + if AudioControlPanel::decode_amu_word( + bus_acp, + &mut self.transmit_channel, + &mut call_mech, + &mut call_att, + &mut calls, + ) { + // Volume control word should be sent every 10ms + // but due to sim capabilities, refresh rate turns out to be not high enough + // which leads to actions on the ACP ending up very slow. + // Therefore I took the decision to send all the words at the same time to avoid that. + for index in 2..(self.list_arinc_words.len()) { + self.send_volume_control(bus_acp, index); + } + } + } + + if self.last_complete_cycle_sent.as_millis() > TIMEOUT { + self.send_word_0(bus_acp); + self.last_complete_cycle_sent = Duration::from_millis(0); + } + + let transmission_pb_pushed: bool = self.transmit_channel != self.transmit_pushed; + + if self.vhfs[0].has_changed() + || transmission_pb_pushed && self.transmit_pushed == TransmitID::Vhf1 + { + self.send_volume_control(bus_acp, 2); + } + if self.vhfs[1].has_changed() + || transmission_pb_pushed && self.transmit_pushed == TransmitID::VHf2 + { + self.send_volume_control(bus_acp, 3); + } + if self.vhfs[2].has_changed() + || transmission_pb_pushed && self.transmit_pushed == TransmitID::Vhf3 + { + self.send_volume_control(bus_acp, 4); + } + + if self.comms[0].has_changed() + || transmission_pb_pushed && self.transmit_pushed == TransmitID::Hf1 + { + self.send_volume_control(bus_acp, 5); + } + if self.comms[1].has_changed() + || transmission_pb_pushed && self.transmit_pushed == TransmitID::Hf2 + { + self.send_volume_control(bus_acp, 6); + } + if self.comms[2].has_changed() + || transmission_pb_pushed && self.transmit_pushed == TransmitID::Mech + { + self.send_volume_control(bus_acp, 7); + } + if self.comms[3].has_changed() + || transmission_pb_pushed && self.transmit_pushed == TransmitID::Cab + { + self.send_volume_control(bus_acp, 8); + } + if self.comms[4].has_changed() + || transmission_pb_pushed && self.transmit_pushed == TransmitID::Pa + { + self.send_volume_control(bus_acp, 9); + } + + if self.vors[0].has_changed() { + self.send_volume_control(bus_acp, 10); + } + if self.vors[1].has_changed() { + self.send_volume_control(bus_acp, 11); + } + + if self.markers.has_changed() { + self.send_volume_control(bus_acp, 12); + } + + if self.ils.has_changed() { + self.send_volume_control(bus_acp, 13); + } + + if self.adfs[0].has_changed() { + self.send_volume_control(bus_acp, 14); + } + if self.adfs[1].has_changed() { + self.send_volume_control(bus_acp, 15); + } + } + } +} + +impl SimulationElement for AudioControlPanel { + fn accept(&mut self, visitor: &mut T) { + for vhf in self.vhfs.iter_mut() { + vhf.accept(visitor); + } + for comm in self.comms.iter_mut() { + comm.accept(visitor); + } + for adf in self.adfs.iter_mut() { + adf.accept(visitor); + } + for vor in self.vors.iter_mut() { + vor.accept(visitor); + } + + self.ils.accept(visitor); + self.gls.accept(visitor); + self.markers.accept(visitor); + + visitor.visit(self); + } + + fn read(&mut self, reader: &mut SimulatorReader) { + if self.is_power_supply_powered { + self.voice_button = reader.read(&self.voice_button_id); + self.reset_button = reader.read(&self.reset_button_id); + + let tmp: u32 = reader.read(&self.transmit_pushed_id); + self.transmit_pushed = TransmitID::from(tmp); + } + } + + fn write(&self, writer: &mut SimulatorWriter) { + if self.is_power_supply_powered { + writer.write(&self.transmit_channel_id, self.transmit_channel as u32); + } + + writer.write(&self.reset_button_id, 0); + } + + fn receive_power(&mut self, buses: &impl ElectricalBuses) { + self.is_power_supply_powered = buses.is_powered(self.power_supply); + } +} + +#[derive(Default)] +struct TransceiverACPFacade { + volume_id: VariableIdentifier, + knob_id: VariableIdentifier, + changed: bool, + knob: bool, + volume: u32, +} +impl TransceiverACPFacade { + pub fn new(context: &mut InitContext, id_acp: u32, name: &str) -> Self { + Self { + volume_id: context.get_identifier(format!("ACP{}_{}_VOLUME", id_acp, name)), + knob_id: context.get_identifier(format!("ACP{}_{}_KNOB_VOLUME_DOWN", id_acp, name)), + ..Default::default() + } + } + + pub fn has_changed(&self) -> bool { + self.changed + } +} +impl SimulationElement for TransceiverACPFacade { + fn accept(&mut self, visitor: &mut T) { + visitor.visit(self); + } + + fn read(&mut self, reader: &mut SimulatorReader) { + let volume: u32 = reader.read(&self.volume_id); + let knob: bool = reader.read(&self.knob_id); + + self.changed = volume != self.volume || knob != self.knob; + + self.volume = volume; + self.knob = knob; + } +} From 9f6529c78201fa9912f782526dd5042b5eecdf7b Mon Sep 17 00:00:00 2001 From: juliansebline Date: Tue, 14 Jan 2025 15:30:05 +0100 Subject: [PATCH 25/64] audio_management_unit.rs --- .../communications/audio_management_unit.rs | 813 ++++++++++++++++++ 1 file changed, 813 insertions(+) create mode 100644 fbw-common/src/wasm/systems/systems/src/communications/audio_management_unit.rs diff --git a/fbw-common/src/wasm/systems/systems/src/communications/audio_management_unit.rs b/fbw-common/src/wasm/systems/systems/src/communications/audio_management_unit.rs new file mode 100644 index 00000000000..068b5967984 --- /dev/null +++ b/fbw-common/src/wasm/systems/systems/src/communications/audio_management_unit.rs @@ -0,0 +1,813 @@ +use crate::{ + //communications::receivers::*, + shared::{ + arinc429::{Arinc429Word, SignStatus}, + ElectricalBusType, ElectricalBuses, + }, + simulation::{ + InitContext, Read, SideControlling, SimulationElement, SimulationElementVisitor, + SimulatorReader, SimulatorWriter, UpdateContext, VariableIdentifier, Write, + }, +}; +use std::time::Duration; + +use num_derive::FromPrimitive; +use num_traits::FromPrimitive; + +use super::audio_control_panel::AudioControlPanel; +use super::receivers::{CommTransceiver, NavReceiver}; + +// Restart full cycle every 160ms as stated in AMM +pub const TIMEOUT: u128 = 160; + +enum TypeCard { + Selcal(Selcal), + Bite(Bite), +} + +pub struct WordAMUACPInfo { + identification: IdentificationWordAMUACP, + sdi: u32, + label: LabelWordAMUACP, +} +impl WordAMUACPInfo { + pub fn new(identification: IdentificationWordAMUACP, sdi: u32, label: LabelWordAMUACP) -> Self { + Self { + identification, + sdi, + label, + } + } + + pub fn get_identification(&self) -> IdentificationWordAMUACP { + self.identification + } + + pub fn get_sdi(&self) -> u32 { + self.sdi + } + + pub fn get_label(&self) -> LabelWordAMUACP { + self.label + } +} + +#[derive(Eq, PartialEq, PartialOrd, Copy, Clone)] +pub enum IdentificationWordAMUACP { + Word0, + Wordamu, + Word01, + Word02, + Word03, + Word04, + Word05, + Word06, + Word07, + Word08, + Word09, + Word10, + Word11, + Word12, + // Satcom but not used for now + // Word13(LabelArinc429Comms, i32 ), + // Word14(LabelArinc429Comms, i32 ), + Word15, + Word16, +} + +#[repr(u32)] +#[derive(FromPrimitive, Eq, PartialOrd, PartialEq, Copy, Clone)] +pub enum LabelWordAMUACP { + Label300Request = 3, + Label301AMU = 0x83, + Label210VolumeControlVHF = 0x11, + Label211VolumeControlHF = 0x91, + Label212VolumeControlADFPA = 0x51, + Label213VolumeControlVORMKR = 0xD1, + Label215VolumeControlINTCAB = 0xB1, + Label217VolumeControlILS = 0xF1, +} +#[derive(Copy, Clone)] +pub struct MixedAudio { + receive_com1: bool, + receive_com2: bool, + receive_adf1: bool, + receive_adf2: bool, + receive_vor1: bool, + receive_vor2: bool, + receive_ils: bool, + enable_beep: bool, + receive_markers: bool, + sound_markers: bool, + + // FOR FUTURE USE: Not needed for the time being as there's no K event for all this + // receive_gls: bool, + // receive_hf1: bool, + // receive_hf2: bool, + // receive_mech: bool, + // receive_att: bool, + // receive_pa: bool, + // + volume_com1: u32, + volume_com2: u32, + volume_com3: u32, + volume_adf1: u32, + volume_adf2: u32, + volume_vor1: u32, + volume_vor2: u32, + volume_ils: u32, + // FOR FUTURE USE: Not needed for the time being as there's no K event for all this + // volume_markers: u32, + // volume_hf1: u32, + // volume_hf2: u32, + // volume_att: u32, + // volume_mech: u32, + // volume_pa: u32, + // +} +impl MixedAudio {} +impl Default for MixedAudio { + fn default() -> MixedAudio { + MixedAudio { + receive_com1: false, + receive_com2: false, + receive_adf1: false, + receive_adf2: false, + receive_vor1: false, + receive_vor2: false, + receive_ils: false, + enable_beep: false, + receive_markers: true, + sound_markers: false, + // FOR FUTURE USE: Not needed for the time being as there's no K event for all this + // receive_gls: false, + // receive_hf1: false, + // receive_hf2: false, + // receive_mech: false, + // receive_att: false, + // receive_pa: false, + // + volume_com1: 0, + volume_com2: 0, + volume_com3: 0, + volume_adf1: 0, + volume_adf2: 0, + volume_vor1: 0, + volume_vor2: 0, + volume_ils: 0, + // FOR FUTURE USE: Not needed for the time being as there's no K event for all this + // volume_markers: 0, + // volume_hf1: 0, + // volume_hf2: 0, + // volume_att: 0, + // volume_mech: 0, + // volume_pa: 0, + // + } + } +} + +#[derive(Default, PartialEq, Eq)] +pub enum AudioSwitchingKnobPosition { + Captain, + #[default] + Norm, + Fo, +} + +pub struct AudioManagementUnit { + adaptation_board: AdaptationBoard, +} +impl AudioManagementUnit { + pub fn new(context: &mut InitContext) -> Self { + Self { + adaptation_board: AdaptationBoard::new(context), + } + } + + pub fn update(&mut self, context: &UpdateContext) { + self.adaptation_board.update(context); + } +} + +impl SimulationElement for AudioManagementUnit { + fn accept(&mut self, visitor: &mut T) { + self.adaptation_board.accept(visitor); + + visitor.visit(self); + } +} + +pub struct AdaptationBoard { + acp_ovhd: AudioControlPanel, + bus_acp_3rd: Vec>, + bus_acp_avncs: Vec>, + bus_arinc_3rd: Vec>, + bus_arinc_bay: Vec>, + + computer_a: Computer, + computer_b: Computer, + + mixed_audio: MixedAudio, + + // FOR FUTURE USE: Not needed for the time being as there's no K event for all this + // receive_com3_id: VariableIdentifier, deactivated since vPilot needs com3 to be always on + // receive_hf1_id: VariableIdentifier, + // receive_hf2_id: VariableIdentifier, + // receive_mech_id: VariableIdentifier, + // receive_att_id: VariableIdentifier, + // receive_pa_id: VariableIdentifier, + // + receive_markers_id: VariableIdentifier, + //receive_gls_id: VariableIdentifier, + // + volume_com1_id: VariableIdentifier, + volume_com2_id: VariableIdentifier, + volume_com3_id: VariableIdentifier, + + volume_adf1_id: VariableIdentifier, + volume_adf2_id: VariableIdentifier, + volume_vor1_id: VariableIdentifier, + volume_vor2_id: VariableIdentifier, + volume_ils_id: VariableIdentifier, + sound_markers_id: VariableIdentifier, + + // FOR FUTURE USE: Not needed for the time being as there's no K event for all this + //volume_markers_id: VariableIdentifier, + //volume_gls_id: VariableIdentifier, + // volume_hf1_id: VariableIdentifier, + // volume_hf2_id: VariableIdentifier, + // volume_mech_id: VariableIdentifier, + // volume_att_id: VariableIdentifier, + // volume_pa_id: VariableIdentifier, + // voice_button_id: VariableIdentifier, + // + ls_fcu1_pressed_id: VariableIdentifier, + ls_fcu2_pressed_id: VariableIdentifier, + + pilot_transmit_id: VariableIdentifier, + copilot_transmit_id: VariableIdentifier, + + vhfs: [CommTransceiver; 2], + adfs: [NavReceiver; 2], + vors: [NavReceiver; 2], + ils: NavReceiver, + + is_flt_int_powered: bool, + is_calls_card_powered: bool, + + audio_switching_knob_id: VariableIdentifier, + audio_switching_knob: AudioSwitchingKnobPosition, + + ls_fcu1_pressed: bool, + ls_fcu2_pressed: bool, + + pilot_transmit_channel: u32, + + need_update: bool, +} + +impl AdaptationBoard { + pub fn new(context: &mut InitContext) -> Self { + Self { + acp_ovhd: AudioControlPanel::new(context, 3, ElectricalBusType::DirectCurrent(1)), + bus_acp_3rd: Vec::new(), + bus_acp_avncs: Vec::new(), + bus_arinc_3rd: Vec::new(), + bus_arinc_bay: Vec::new(), + + computer_a: Computer::new_cpt_and_avncs(context), + computer_b: Computer::new_fo_and_ovhd(context), + + mixed_audio: Default::default(), + + // Needed to update the K events + receive_markers_id: context.get_identifier("MARKER_IDENT".to_owned()), + sound_markers_id: context.get_identifier("MARKER SOUND".to_owned()), + + // FOR FUTURE USE: Not needed for the time being as there's no K event for all this + //receive_gls_id: context.get_identifier("GLS_IDENT".to_owned()), + // + volume_com1_id: context.get_identifier("VHF1_VOLUME".to_owned()), + volume_com2_id: context.get_identifier("VHF2_VOLUME".to_owned()), + volume_com3_id: context.get_identifier("VHF3_VOLUME".to_owned()), + + // Have to use custom Nav volume due to impossibility to overwrite native morse code playing + volume_adf1_id: context.get_identifier("ADF_VOLUME:1".to_owned()), + volume_adf2_id: context.get_identifier("ADF_VOLUME:2".to_owned()), + volume_vor1_id: context.get_identifier("NAV_VOLUME:1".to_owned()), + volume_vor2_id: context.get_identifier("NAV_VOLUME:2".to_owned()), + volume_ils_id: context.get_identifier("NAV_VOLUME:3".to_owned()), + + // FOR FUTURE USE: Not needed for the time being as there's no K event for all this + // volume_markers_id: context.get_identifier("MKR_VOLUME".to_owned()), + // volume_gls_id: context.get_identifier("NAV_VOLUME:4".to_owned()), + // receive_com3_id: VariableIdentifier, deactivated since vPilot needs com3 to be always on + // receive_hf1_id: context.get_identifier("HF1_RECEIVE".to_owned()), + // receive_hf2_id: context.get_identifier("HF2_RECEIVE".to_owned()), + // receive_att_id: context.get_identifier("ATT_RECEIVE".to_owned()), + // receive_mech_id: context.get_identifier("MECH_RECEIVE".to_owned()), + // receive_pa_id: context.get_identifier("PA_RECEIVE".to_owned()), + // voice_button_id: context.get_identifier("VOICE_BUTTON_DOWN".to_owned()), + // volume_hf1_id: context.get_identifier("HF1_VOLUME".to_owned()), + // volume_hf2_id: context.get_identifier("HF2_VOLUME".to_owned()), + // volume_att_id: context.get_identifier("ATT_VOLUME".to_owned()), + // volume_mech_id: context.get_identifier("MECH_VOLUME".to_owned()), + // volume_pa_id: context.get_identifier("PA_VOLUME".to_owned()), + ls_fcu1_pressed_id: context.get_identifier("BTN_LS_1_FILTER_ACTIVE".to_owned()), + ls_fcu2_pressed_id: context.get_identifier("BTN_LS_2_FILTER_ACTIVE".to_owned()), + + audio_switching_knob_id: context.get_identifier("AUDIOSWITCHING_KNOB".to_owned()), + + pilot_transmit_id: context.get_identifier("PILOT_TRANSMIT_CHANNEL".to_owned()), + copilot_transmit_id: context.get_identifier("COPILOT_TRANSMIT_CHANNEL".to_owned()), + + vhfs: [ + CommTransceiver::new(context, 1, ElectricalBusType::DirectCurrentEssential), + CommTransceiver::new(context, 2, ElectricalBusType::DirectCurrent(2)), + ], + adfs: [ + NavReceiver::new( + context, + "ADF1", + ElectricalBusType::AlternatingCurrentEssentialShed, + ), + NavReceiver::new(context, "ADF2", ElectricalBusType::AlternatingCurrent(2)), + ], + vors: [ + NavReceiver::new( + context, + "VOR1", + ElectricalBusType::AlternatingCurrentEssential, + ), + NavReceiver::new(context, "VOR2", ElectricalBusType::AlternatingCurrent(2)), + ], + ils: NavReceiver::new( + context, + "ILS", + ElectricalBusType::AlternatingCurrentEssential, + ), + + pilot_transmit_channel: 1, + + is_flt_int_powered: false, + is_calls_card_powered: false, + + audio_switching_knob: AudioSwitchingKnobPosition::default(), + + ls_fcu1_pressed: false, + ls_fcu2_pressed: false, + + need_update: false, + } + } + + pub fn send_amu_word(bus_acp: &mut Vec>, transmission_table: &u32) { + let mut word_arinc: Arinc429Word = Arinc429Word::new(0, SignStatus::NormalOperation); + + word_arinc.set_bits(1, LabelWordAMUACP::Label301AMU as u32); + word_arinc.set_bits(11, *transmission_table); + + // Will have to be used when SELCAL will be written in Rust + // word_arinc.set_bits(25, (calls > 4) & 1); + // word_arinc.set_bits(26, (calls > 3) & 1); + // word_arinc.set_bits(27, (calls > 2) & 1); + // word_arinc.set_bits(28, (calls > 1) & 1); + // word_arinc.set_bits(29, calls & 1); + + bus_acp.push(word_arinc); + } + + pub fn update(&mut self, context: &UpdateContext) { + let mut acp_to_take_into_account: u32 = 1; + + if self.audio_switching_knob != AudioSwitchingKnobPosition::Fo + && context.side_controlling() == SideControlling::FO + { + acp_to_take_into_account = 2; + } else if self.audio_switching_knob == AudioSwitchingKnobPosition::Fo + && context.side_controlling() == SideControlling::FO + || self.audio_switching_knob == AudioSwitchingKnobPosition::Captain + && context.side_controlling() == SideControlling::CAPTAIN + { + acp_to_take_into_account = 3; + } + + self.computer_a.update(context, &mut self.bus_arinc_bay); + self.computer_b.update(context, &mut self.bus_arinc_3rd); + + // 3rd ACP is connected to Board B by default + // hence if audio switching knob is NOT on FO, data can be wired to default board + + // Appends pretty useless in this case but in real life this is what happens + if self.audio_switching_knob != AudioSwitchingKnobPosition::Fo { + self.bus_acp_3rd.append(&mut self.bus_arinc_3rd); + self.acp_ovhd.update(context, &mut self.bus_acp_3rd); + self.bus_arinc_3rd.append(&mut self.bus_acp_3rd); + } else { + self.bus_acp_avncs.append(&mut self.bus_arinc_bay); + self.acp_ovhd.update(context, &mut self.bus_acp_avncs); + self.bus_arinc_bay.append(&mut self.bus_acp_avncs); + } + + if acp_to_take_into_account == 1 { + self.mixed_audio = self.computer_a.get_mixed_audio_acp(); + + self.pilot_transmit_channel = self.computer_a.get_transmission_table_acp(); + } else if acp_to_take_into_account == 2 { + self.mixed_audio = self.computer_b.get_mixed_audio_acp(); + self.pilot_transmit_channel = self.computer_b.get_transmission_table_acp(); + } else if context.side_controlling() == SideControlling::CAPTAIN { + self.mixed_audio = self.computer_b.get_mixed_audio_acp3(); + self.pilot_transmit_channel = self.computer_b.get_transmission_table_acp3(); + } else { + self.mixed_audio = self.computer_a.get_mixed_audio_acp3(); + self.pilot_transmit_channel = self.computer_a.get_transmission_table_acp3(); + } + + // We only take into account VHF1/2 as Vatsim and IVAO use them only + // 4 stands for NONE as per SDK but stand for HF1 for us therefore we need to filter + self.pilot_transmit_channel = if self.pilot_transmit_channel == 0 + || self.pilot_transmit_channel > 2 + || self.pilot_transmit_channel == 1 && !self.vhfs[0].is_powered() + || self.pilot_transmit_channel == 2 && !self.vhfs[1].is_powered() + { + 4 + } else { + self.pilot_transmit_channel - 1 + }; + + self.vhfs[0].update(self.mixed_audio.receive_com1); + self.vhfs[1].update(self.mixed_audio.receive_com2); + + self.adfs[0].update( + context, + !self.mixed_audio.enable_beep && self.mixed_audio.receive_adf1, + ); + self.adfs[1].update( + context, + !self.mixed_audio.enable_beep && self.mixed_audio.receive_adf2, + ); + + self.vors[0].update( + context, + !self.mixed_audio.enable_beep && self.mixed_audio.receive_vor1, + ); + self.vors[1].update( + context, + !self.mixed_audio.enable_beep && self.mixed_audio.receive_vor2, + ); + + self.ils.update( + context, + if context.side_controlling() == SideControlling::CAPTAIN { + self.ls_fcu1_pressed && self.mixed_audio.receive_ils + } else { + self.ls_fcu2_pressed && self.mixed_audio.receive_ils + }, + ); + } +} + +impl SimulationElement for AdaptationBoard { + fn accept(&mut self, visitor: &mut T) { + for vhf in self.vhfs.iter_mut() { + vhf.accept(visitor); + } + + for adf in self.adfs.iter_mut() { + adf.accept(visitor); + } + + for vor in self.vors.iter_mut() { + vor.accept(visitor); + } + + self.ils.accept(visitor); + + self.acp_ovhd.accept(visitor); + self.computer_a.accept(visitor); + self.computer_b.accept(visitor); + + visitor.visit(self); + } + + fn receive_power(&mut self, buses: &impl ElectricalBuses) { + self.is_flt_int_powered = buses.is_powered(ElectricalBusType::DirectCurrentEssential); + self.is_calls_card_powered = buses.is_powered(ElectricalBusType::DirectCurrent(1)); + } + + fn read(&mut self, reader: &mut SimulatorReader) { + self.mixed_audio.sound_markers = reader.read(&self.sound_markers_id); + let ls_fcu1_pressed = reader.read(&self.ls_fcu1_pressed_id); + let ls_fcu2_pressed = reader.read(&self.ls_fcu2_pressed_id); + + let audio_switching_knob = match reader.read(&self.audio_switching_knob_id) { + 0 => AudioSwitchingKnobPosition::Captain, + 2 => AudioSwitchingKnobPosition::Fo, + _ => AudioSwitchingKnobPosition::Norm, + }; + + self.need_update = self.audio_switching_knob != audio_switching_knob + || self.ls_fcu1_pressed != ls_fcu1_pressed + || self.ls_fcu2_pressed != ls_fcu2_pressed; + + self.audio_switching_knob = audio_switching_knob; + self.ls_fcu1_pressed = ls_fcu1_pressed; + self.ls_fcu2_pressed = ls_fcu2_pressed; + } + + fn write(&self, writer: &mut SimulatorWriter) { + writer.write(&self.pilot_transmit_id, self.pilot_transmit_channel); + // Forcing copilot to NONE as the pilot version sets copilot too and it's an undesired behaviour + writer.write(&self.copilot_transmit_id, 4); + + // FOR FUTURE USE: Not needed for the time being as there's no K event for all this + // writer.write(&self.receive_gls_id, self.mixed_audio.receive_gls); + // writer.write(&self.receive_hf1_id, self.receive_hf1); + // writer.write(&self.receive_hf2_id, self.receive_hf2); + // writer.write(&self.receive_mech_id, self.receive_mech); + // writer.write(&self.receive_att_id, self.receive_att); + // writer.write(&self.receive_pa_id, self.receive_pa); + + // Special case for markers as there's no XXXX_SET function. Only Toggle. + if self.mixed_audio.receive_markers && !self.mixed_audio.sound_markers + || !self.mixed_audio.receive_markers && self.mixed_audio.sound_markers + { + writer.write(&self.receive_markers_id, !self.mixed_audio.sound_markers); + } + + writer.write(&self.volume_com1_id, self.mixed_audio.volume_com1); + writer.write(&self.volume_com2_id, self.mixed_audio.volume_com2); + writer.write(&self.volume_com3_id, self.mixed_audio.volume_com3); + writer.write(&self.volume_adf1_id, self.mixed_audio.volume_adf1); + writer.write(&self.volume_adf2_id, self.mixed_audio.volume_adf2); + writer.write(&self.volume_vor1_id, self.mixed_audio.volume_vor1); + writer.write(&self.volume_vor2_id, self.mixed_audio.volume_vor2); + writer.write(&self.volume_ils_id, self.mixed_audio.volume_ils); + + // FOR FUTURE USE: Not needed for the time being as there's no K event for all this + // writer.write(&self.volume_markers_id, self.mixed_audio.volume_markers); + // writer.write(&self.volume_gls_id, self.mixed_audio.volume_gls); + // writer.write(&self.volume_hf1_id, self.volume_hf1); + // writer.write(&self.volume_hf2_id, self.volume_hf2); + // writer.write(&self.volume_att_id, self.volume_att); + // writer.write(&self.volume_mech_id, self.volume_mech); + // writer.write(&self.volume_pa_id, self.volume_pa); + } +} + +pub struct Computer { + audio_card: AudioCard, + _second_card: TypeCard, + + is_power_supply_powered: bool, +} + +impl Computer { + pub fn new_cpt_and_avncs(context: &mut InitContext) -> Self { + Self { + audio_card: AudioCard::new(context, 1), + // Not used for now + _second_card: TypeCard::Selcal(Selcal::new()), + is_power_supply_powered: false, + } + } + + pub fn new_fo_and_ovhd(context: &mut InitContext) -> Self { + Self { + audio_card: AudioCard::new(context, 2), + // Not used for now + _second_card: TypeCard::Bite(Bite::new()), + is_power_supply_powered: false, + } + } + + pub fn update(&mut self, context: &UpdateContext, bus: &mut Vec>) { + self.audio_card + .update(context, bus, self.is_power_supply_powered); + } + + pub fn get_mixed_audio_acp(&self) -> MixedAudio { + self.audio_card.get_mixed_audio_acp() + } + + pub fn get_mixed_audio_acp3(&self) -> MixedAudio { + self.audio_card.get_mixed_audio_acp3() + } + + pub fn get_transmission_table_acp(&self) -> u32 { + self.audio_card.get_transmission_table_acp() + } + + pub fn get_transmission_table_acp3(&self) -> u32 { + self.audio_card.get_transmission_table_acp3() + } +} + +impl SimulationElement for Computer { + fn accept(&mut self, visitor: &mut T) { + self.audio_card.accept(visitor); + + visitor.visit(self); + } + + fn receive_power(&mut self, buses: &impl ElectricalBuses) { + self.is_power_supply_powered = buses.is_powered(ElectricalBusType::DirectCurrentEssential); + } +} + +pub struct AudioCard { + bus_acp: Vec>, + acp: AudioControlPanel, + mixed_audio_acp: MixedAudio, + mixed_audio_acp3: MixedAudio, + transmission_table_acp: u32, + transmission_table_acp3: u32, + last_time_data_received_from_acp: Duration, + last_time_data_received_from_acp3: Duration, +} + +impl AudioCard { + pub fn new(context: &mut InitContext, id_acp: u32) -> Self { + Self { + bus_acp: Vec::new(), + acp: AudioControlPanel::new(context, id_acp, ElectricalBusType::DirectCurrentEssential), + mixed_audio_acp: Default::default(), + mixed_audio_acp3: Default::default(), + transmission_table_acp: 0, + transmission_table_acp3: 0, + last_time_data_received_from_acp: Duration::from_millis(0), + last_time_data_received_from_acp3: Duration::from_millis(0), + } + } + + pub fn update( + &mut self, + context: &UpdateContext, + bus_from_adaptation_card: &mut Vec>, + is_powered: bool, + ) { + self.last_time_data_received_from_acp += context.delta(); + self.last_time_data_received_from_acp3 += context.delta(); + + if is_powered { + self.acp.update(context, &mut self.bus_acp); + + if !self.bus_acp.is_empty() { + self.last_time_data_received_from_acp = Duration::from_millis(0); + } + + AudioCard::decode_arinc_words_from_acp( + &mut self.bus_acp, + &mut self.mixed_audio_acp, + &mut self.transmission_table_acp, + ); + + if !bus_from_adaptation_card.is_empty() { + self.last_time_data_received_from_acp3 = Duration::from_millis(0); + } + + AudioCard::decode_arinc_words_from_acp( + bus_from_adaptation_card, + &mut self.mixed_audio_acp3, + &mut self.transmission_table_acp3, + ); + + // If data were not received within timeframe, we consider the ACP as U/S + if self.last_time_data_received_from_acp.as_millis() > TIMEOUT { + self.mixed_audio_acp = Default::default(); + } + + if self.last_time_data_received_from_acp3.as_millis() > TIMEOUT { + self.mixed_audio_acp3 = Default::default(); + } + } else { + self.mixed_audio_acp = Default::default(); + self.mixed_audio_acp3 = Default::default(); + + self.bus_acp.clear(); + bus_from_adaptation_card.clear(); + } + } + + pub fn decode_arinc_words_from_acp( + bus: &mut Vec>, + mixed_audio: &mut MixedAudio, + transmission_table_acp: &mut u32, + ) { + let mut can_send_amu_word = false; + + while let Some(word) = bus.pop() { + let label_option: Option = + FromPrimitive::from_u32(word.get_bits(8, 1)); + + if let Some(label) = label_option { + if label == LabelWordAMUACP::Label300Request { + // Here the ACP id is available in the word + // but we don't need it for now. Maybe in the future with more information... + can_send_amu_word = true; + } else { + let sdi = word.get_bits(2, 9) as u8; + let transmission_table = word.get_bits(4, 11); + let volume = word.get_bits(8, 17); + let reception = word.get_bits(1, 25); + mixed_audio.enable_beep = word.get_bits(1, 26) != 0; + + // No not used so far + // let _int = word.get_bits(1, 15) != 0; + // let _rad = word.get_bits(1, 16) != 0; + // let _reset = word.get_bits(1, 27) != 0; + + *transmission_table_acp = transmission_table; + + // Perform this only if the data currently analyzed is from the chosen acp + match label { + LabelWordAMUACP::Label210VolumeControlVHF => { + if sdi == 1 { + mixed_audio.volume_com1 = volume; + mixed_audio.receive_com1 = reception != 0; + } else if sdi == 2 { + mixed_audio.volume_com2 = volume; + mixed_audio.receive_com2 = reception != 0; + } else if sdi == 3 { + mixed_audio.volume_com3 = volume; + // Comment due to vPilot that needs com3 to be received all the time + //mixed_audio.receive_com3 = reception != 0; + } + } + LabelWordAMUACP::Label213VolumeControlVORMKR => { + if sdi == 1 { + mixed_audio.volume_vor1 = volume; + mixed_audio.receive_vor1 = reception != 0; + } else if sdi == 2 { + mixed_audio.volume_vor2 = volume; + mixed_audio.receive_vor2 = reception != 0; + } else if sdi == 3 { + mixed_audio.receive_markers = reception != 0; + } + } + LabelWordAMUACP::Label212VolumeControlADFPA => { + // PA should be here but not simulated + if sdi == 1 { + mixed_audio.volume_adf1 = volume; + mixed_audio.receive_adf1 = reception != 0; + } else if sdi == 2 { + mixed_audio.volume_adf2 = volume; + mixed_audio.receive_adf2 = reception != 0; + } + } + LabelWordAMUACP::Label217VolumeControlILS => { + mixed_audio.volume_ils = volume; + // TODO: Use data from future DMC. There's a wire between comms and DMC + // FCOM compliant: ILS can be listened to only if LS is pressed + mixed_audio.receive_ils = reception != 0; + } + _ => {} + } + } + } + } + + if can_send_amu_word { + AdaptationBoard::send_amu_word(bus, transmission_table_acp); + } + } + + pub fn get_mixed_audio_acp(&self) -> MixedAudio { + self.mixed_audio_acp + } + + pub fn get_mixed_audio_acp3(&self) -> MixedAudio { + self.mixed_audio_acp3 + } + + pub fn get_transmission_table_acp(&self) -> u32 { + self.transmission_table_acp + } + + pub fn get_transmission_table_acp3(&self) -> u32 { + self.transmission_table_acp3 + } +} + +impl SimulationElement for AudioCard { + fn accept(&mut self, visitor: &mut T) { + self.acp.accept(visitor); + + visitor.visit(self); + } +} + +pub struct Selcal {} +impl Selcal { + pub fn new() -> Self { + Self {} + } +} +pub struct Bite {} +impl Bite { + pub fn new() -> Self { + Self {} + } +} From 5edbce0311f8cb830fabbc9c602c3fb884bc05ba Mon Sep 17 00:00:00 2001 From: juliansebline Date: Tue, 14 Jan 2025 15:32:41 +0100 Subject: [PATCH 26/64] mod.rs communications --- .../systems/systems/src/communications/mod.rs | 77 +++++++++++++++++++ .../src/wasm/systems/systems/src/lib.rs | 1 + 2 files changed, 78 insertions(+) create mode 100644 fbw-common/src/wasm/systems/systems/src/communications/mod.rs diff --git a/fbw-common/src/wasm/systems/systems/src/communications/mod.rs b/fbw-common/src/wasm/systems/systems/src/communications/mod.rs new file mode 100644 index 00000000000..f7470f95259 --- /dev/null +++ b/fbw-common/src/wasm/systems/systems/src/communications/mod.rs @@ -0,0 +1,77 @@ +mod audio_control_panel; +mod audio_management_unit; +mod radio_management_panel; +mod receivers; + +use crate::simulation::{ + InitContext, SideControlling, SimulationElement, SimulationElementVisitor, SimulatorWriter, + UpdateContext, VariableIdentifier, Write, +}; + +use self::audio_management_unit::AudioManagementUnit; +use self::radio_management_panel::RadioManagementPanel; + +pub struct Communications { + amu: AudioManagementUnit, + + rmp_cpt: Option, + rmp_fo: Option, + + sel_light_id: VariableIdentifier, + nav_backup_mode_id: VariableIdentifier, + + previous_side_controlling: SideControlling, + + sel_light: bool, + nav_backup_mode: bool, +} + +impl Communications { + pub fn new(context: &mut InitContext) -> Self { + Self { + amu: AudioManagementUnit::new(context), + rmp_cpt: Some(RadioManagementPanel::new_cpt(context)), + rmp_fo: Some(RadioManagementPanel::new_fo(context)), + + sel_light_id: context.get_identifier("RMP_SEL_LIGHT_ON".to_owned()), + nav_backup_mode_id: context.get_identifier("RMP_NAV_BACKUP_MODE".to_owned()), + + previous_side_controlling: SideControlling::CAPTAIN, + + sel_light: false, + nav_backup_mode: false, + } + } + + pub fn update(&mut self, context: &UpdateContext) { + self.amu.update(context); + + if self.rmp_cpt.as_ref().unwrap().is_powered() && self.rmp_fo.as_ref().unwrap().is_powered() + { + self.sel_light = (self.rmp_cpt.as_ref().unwrap().is_abnormal_mode() + || self.rmp_fo.as_ref().unwrap().is_abnormal_mode()); + + self.nav_backup_mode = self.rmp_cpt.as_ref().unwrap().is_nav_backup_mode() + && self.rmp_fo.as_ref().unwrap().is_nav_backup_mode() + } else { + self.sel_light = false; + self.nav_backup_mode = false; + } + } +} + +impl SimulationElement for Communications { + fn accept(&mut self, visitor: &mut T) { + self.rmp_cpt.as_mut().unwrap().accept(visitor); + self.rmp_fo.as_mut().unwrap().accept(visitor); + + self.amu.accept(visitor); + + visitor.visit(self); + } + + fn write(&self, writer: &mut SimulatorWriter) { + writer.write(&self.sel_light_id, self.sel_light); + writer.write(&self.nav_backup_mode_id, self.nav_backup_mode); + } +} diff --git a/fbw-common/src/wasm/systems/systems/src/lib.rs b/fbw-common/src/wasm/systems/systems/src/lib.rs index 6c469a418c8..27a7b1707f6 100644 --- a/fbw-common/src/wasm/systems/systems/src/lib.rs +++ b/fbw-common/src/wasm/systems/systems/src/lib.rs @@ -11,6 +11,7 @@ pub mod air_conditioning; pub mod air_starter_unit; pub mod airframe; pub mod apu; +pub mod communications; pub mod electrical; pub mod engine; pub mod enhanced_gpwc; From 25818809b21188478a1a302c08a68e0f033fffa7 Mon Sep 17 00:00:00 2001 From: juliansebline Date: Tue, 14 Jan 2025 15:32:52 +0100 Subject: [PATCH 27/64] radio_management_panel.rs --- .../communications/radio_management_panel.rs | 122 ++++++++++++++++++ 1 file changed, 122 insertions(+) create mode 100644 fbw-common/src/wasm/systems/systems/src/communications/radio_management_panel.rs diff --git a/fbw-common/src/wasm/systems/systems/src/communications/radio_management_panel.rs b/fbw-common/src/wasm/systems/systems/src/communications/radio_management_panel.rs new file mode 100644 index 00000000000..832c7d9273f --- /dev/null +++ b/fbw-common/src/wasm/systems/systems/src/communications/radio_management_panel.rs @@ -0,0 +1,122 @@ +use crate::shared::{ElectricalBusType, ElectricalBuses}; +use crate::simulation::{ + InitContext, Read, Reader, SimulationElement, SimulationElementVisitor, SimulatorReader, + VariableIdentifier, +}; + +#[derive(Clone, Copy, Debug, PartialEq, Eq, PartialOrd)] +enum SelectedMode { + Vhf1 = 1, + Vhf2, + Vhf3, + Hf1, + Hf2, + Nav, + Vor, + Ils, + Mls, + Adf, + Bfo, + Am, +} + +impl From for SelectedMode { + fn from(value: f64) -> Self { + match value as u8 { + 2 => Self::Vhf2, + 3 => Self::Vhf3, + 4 => Self::Hf1, + 5 => Self::Hf2, + 6 => Self::Nav, + 7 => Self::Vor, + 8 => Self::Ils, + 9 => Self::Mls, + 10 => Self::Adf, + 11 => Self::Bfo, + 12 => Self::Am, + _ => Self::Vhf1, + } + } +} + +#[derive(Clone)] +pub struct RadioManagementPanel { + id_rmp: usize, + selected_mode: SelectedMode, + + toggle_switch: bool, + is_power_supply_powered: bool, + + power_supply: ElectricalBusType, + + toggle_switch_id: VariableIdentifier, + selected_mode_id: VariableIdentifier, +} +impl RadioManagementPanel { + pub fn new_cpt(context: &mut InitContext) -> Self { + Self { + id_rmp: 1, + + selected_mode: SelectedMode::Vhf1, + + toggle_switch: false, + is_power_supply_powered: false, + + power_supply: ElectricalBusType::DirectCurrentEssential, + + toggle_switch_id: context.get_identifier("RMP_L_TOGGLE_SWITCH".to_string()), + selected_mode_id: context.get_identifier("RMP_L_SELECTED_MODE".to_string()), + } + } + + pub fn new_fo(context: &mut InitContext) -> Self { + Self { + id_rmp: 2, + + selected_mode: SelectedMode::Vhf2, + + power_supply: ElectricalBusType::DirectCurrent(2), + + toggle_switch: false, + is_power_supply_powered: false, + + toggle_switch_id: context.get_identifier("RMP_R_TOGGLE_SWITCH".to_string()), + selected_mode_id: context.get_identifier("RMP_R_SELECTED_MODE".to_string()), + } + } + + //No RMP3 for the time being + + pub fn is_abnormal_mode(&self) -> bool { + self.is_powered() + && ((self.selected_mode == SelectedMode::Vhf3 + || self.selected_mode == SelectedMode::Hf1 + || self.selected_mode == SelectedMode::Hf2) + && (self.id_rmp == 1 || self.id_rmp == 2)) + || (self.selected_mode == SelectedMode::Vhf1 && (self.id_rmp == 2 || self.id_rmp == 3)) + || (self.selected_mode == SelectedMode::Vhf2 && (self.id_rmp == 1 || self.id_rmp == 3)) + } + + pub fn is_nav_backup_mode(&self) -> bool { + self.selected_mode > SelectedMode::Hf2 + } + + pub fn is_powered(&self) -> bool { + self.toggle_switch && self.is_power_supply_powered + } +} + +impl SimulationElement for RadioManagementPanel { + fn accept(&mut self, visitor: &mut T) { + visitor.visit(self); + } + + fn read(&mut self, reader: &mut SimulatorReader) { + self.selected_mode = SelectedMode::from(reader.read_f64(&self.selected_mode_id)); + self.toggle_switch = reader.read(&self.toggle_switch_id); + } + + fn receive_power(&mut self, buses: &impl ElectricalBuses) { + self.is_power_supply_powered = buses.is_powered(self.power_supply); + } +} From bdcaee786983d8ba588f9c573c49e343a1e82a0d Mon Sep 17 00:00:00 2001 From: juliansebline Date: Tue, 14 Jan 2025 15:33:02 +0100 Subject: [PATCH 28/64] receivers.rs --- .../systems/src/communications/receivers.rs | 260 ++++++++++++++++++ 1 file changed, 260 insertions(+) create mode 100644 fbw-common/src/wasm/systems/systems/src/communications/receivers.rs diff --git a/fbw-common/src/wasm/systems/systems/src/communications/receivers.rs b/fbw-common/src/wasm/systems/systems/src/communications/receivers.rs new file mode 100644 index 00000000000..39f9434183a --- /dev/null +++ b/fbw-common/src/wasm/systems/systems/src/communications/receivers.rs @@ -0,0 +1,260 @@ +use crate::{ + shared::{ElectricalBusType, ElectricalBuses}, + simulation::{ + InitContext, Read, SimulationElement, SimulationElementVisitor, SimulatorReader, + SimulatorWriter, UpdateContext, VariableIdentifier, Write, + }, +}; + +use std::time::Duration; +use uom::num::pow; + +pub struct CommTransceiver { + receive_com_id: VariableIdentifier, + + is_power_supply_powered: bool, + receive: bool, + + powered_by: ElectricalBusType, +} +impl CommTransceiver { + pub fn new(context: &mut InitContext, id: usize, powered_by: ElectricalBusType) -> Self { + Self { + receive_com_id: context.get_identifier(format!("COM{}_RECEIVE", id)), + is_power_supply_powered: false, + receive: false, + powered_by, + } + } + + pub fn update(&mut self, receive: bool) { + self.receive = receive && self.is_power_supply_powered; + } + + pub fn is_powered(&self) -> bool { + self.is_power_supply_powered + } +} + +impl SimulationElement for CommTransceiver { + fn receive_power(&mut self, buses: &impl ElectricalBuses) { + self.is_power_supply_powered = buses.is_powered(self.powered_by); + } + + fn write(&self, writer: &mut SimulatorWriter) { + writer.write(&self.receive_com_id, self.receive); + } +} + +pub struct NavReceiver { + receive_nav_id: VariableIdentifier, + beep_id: VariableIdentifier, + + is_power_supply_powered: bool, + powered_by: ElectricalBusType, + + morse: Morse, + + ok_to_beep: bool, +} +impl NavReceiver { + pub fn new(context: &mut InitContext, name: &str, powered_by: ElectricalBusType) -> Self { + Self { + receive_nav_id: context.get_identifier(format!("{}_IDENT", name)), + beep_id: context.get_identifier(format!("ACP_BEEP_IDENT_{}", name)), + is_power_supply_powered: false, + powered_by, + morse: Morse::new(context, name), + ok_to_beep: false, + } + } + + pub fn update(&mut self, context: &UpdateContext, ok_to_beep: bool) { + self.ok_to_beep = self.is_power_supply_powered && ok_to_beep; + // We keep updating the morse even though the receiver is not powered + // because in real life, the signal is external (obviously) + self.morse.update(context); + } +} + +impl SimulationElement for NavReceiver { + fn write(&self, writer: &mut SimulatorWriter) { + writer.write( + &self.beep_id, + if self.ok_to_beep { + self.morse.get_state() + } else { + false + }, + ); + + writer.write(&self.receive_nav_id, self.ok_to_beep); + } + + fn receive_power(&mut self, buses: &impl ElectricalBuses) { + self.is_power_supply_powered = buses.is_powered(self.powered_by); + } + + fn accept(&mut self, visitor: &mut T) { + self.morse.accept(visitor); + visitor.visit(self); + } +} + +struct Morse { + ident_id: VariableIdentifier, + ident_new: usize, + ident_current: usize, + morse: String, + beep: bool, + duration_short_beep: usize, + duration_long_beep: usize, + duration_end_of_ident: usize, + duration_current: Duration, + duration_to_wait: usize, +} + +impl Morse { + pub fn new(context: &mut InitContext, name: &str) -> Self { + // In milliseconds. For 7 words a minute. + // Use the formula here: https://k7mem.com/Keyer_Speed.html + let time_base = 171; + + Self { + ident_id: context.get_identifier(format!("{}_IDENT_PACKED", name)), + ident_new: 0, + ident_current: 0, + morse: "".to_owned(), + beep: false, + duration_short_beep: time_base, + duration_long_beep: time_base * 3, + duration_end_of_ident: time_base * 7, + duration_current: Duration::from_millis(0), + duration_to_wait: 0, + } + } + + // From unpack function in file simvar.ts + fn unpack(&self, value: usize) -> String { + let mut unpacked: String = "".to_owned(); + + let mut i: usize = 0; + while i < 8 { + // pow to returns 0 in the game if big number + let power = pow(2, (i % 8) * 6); + if power > 0 { + let code: usize = (value / power) & 0x3f; + if code > 0 { + unpacked.push(char::from_u32((code + 31) as u32).unwrap()); + } + } + + i += 1; + } + + unpacked + } + + fn convert_ident_to_morse(&mut self) -> String { + let mut copy = "".to_owned(); + + for c in self.unpack(self.ident_new).chars() { + // elements counts for number of characters + space between them + let code: &str = match c.to_ascii_uppercase() { + 'A' => "._", + 'B' => "_...", + 'C' => "_._.", + 'D' => "_..", + 'E' => ".", + 'F' => ".._.", + 'G' => "__.", + 'H' => "....", + 'I' => "..", + 'J' => ".___", + 'K' => "_._", + 'L' => "._..", + 'M' => "__", + 'N' => "_.", + 'O' => "___", + 'P' => ".__.", + 'Q' => "__._", + 'R' => "._.", + 'S' => "...", + 'T' => "_", + 'U' => ".._", + 'V' => "..._", + 'W' => ".__", + 'X' => "_.._", + 'Y' => "_.__", + 'Z' => "__..", + _ => "", + }; + + copy.push_str(code); + copy.push(' '); + } + + copy.chars().rev().collect::() + } + + pub fn update(&mut self, context: &UpdateContext) { + self.duration_current += context.delta(); + + // Manage new ident + if self.ident_new != self.ident_current { + self.ident_current = self.ident_new; + self.morse.clear(); + } + + // Manage case whenever the morse ident has to restart at the beginning + if self.ident_current > 0 && self.morse.is_empty() { + self.morse = self.convert_ident_to_morse(); + self.duration_to_wait = self.duration_end_of_ident; + self.duration_current = Duration::from_millis(0); + } + + if !self.morse.is_empty() { + // If timedout + if self.duration_current.as_millis() > self.duration_to_wait as u128 { + // After a beep, we have to wait an amount of time equal to a short beep + if (self.duration_to_wait == self.duration_short_beep + || self.duration_to_wait == self.duration_long_beep) + && self.beep + { + self.duration_to_wait += self.duration_short_beep; + self.beep = false; + } else { + self.duration_current = Duration::from_millis(0); + + match self.morse.pop().unwrap() { + '.' => { + self.duration_to_wait = self.duration_short_beep; + self.beep = true; + } + '_' => { + self.duration_to_wait = self.duration_long_beep; + self.beep = true; + } + _ => { + // space + self.duration_to_wait = self.duration_long_beep; + self.beep = false; + } + }; + } + } + } else { + self.beep = false; + } + } + + pub fn get_state(&self) -> bool { + self.beep + } +} + +impl SimulationElement for Morse { + fn read(&mut self, reader: &mut SimulatorReader) { + self.ident_new = reader.read(&self.ident_id); + } +} From caaa06ea53761c6ef8e95daff6cab4122e248a3a Mon Sep 17 00:00:00 2001 From: juliansebline Date: Tue, 14 Jan 2025 15:45:48 +0100 Subject: [PATCH 29/64] update_context and mod.rs of update context --- .../systems/systems/src/simulation/mod.rs | 17 +++++++++++++++ .../systems/src/simulation/update_context.rs | 21 ++++++++++++++++++- 2 files changed, 37 insertions(+), 1 deletion(-) diff --git a/fbw-common/src/wasm/systems/systems/src/simulation/mod.rs b/fbw-common/src/wasm/systems/systems/src/simulation/mod.rs index cd3b1bf80cf..e42a15febfd 100644 --- a/fbw-common/src/wasm/systems/systems/src/simulation/mod.rs +++ b/fbw-common/src/wasm/systems/systems/src/simulation/mod.rs @@ -23,6 +23,23 @@ pub use update_context::*; pub mod test; +#[derive(Clone, Copy, Debug, PartialEq, Eq)] +pub enum SideControlling { + CAPTAIN, + FO, +} + +read_write_enum!(SideControlling); + +impl From for SideControlling { + fn from(value: f64) -> Self { + match value as u8 { + 0 => SideControlling::CAPTAIN, + _ => SideControlling::FO, + } + } +} + /// Trait for a type which can read and write simulator data. /// Using this trait implementors can abstract away the way the code /// interacts with the simulator. This separation of concerns is very important diff --git a/fbw-common/src/wasm/systems/systems/src/simulation/update_context.rs b/fbw-common/src/wasm/systems/systems/src/simulation/update_context.rs index fb663042de6..79754d1dab5 100644 --- a/fbw-common/src/wasm/systems/systems/src/simulation/update_context.rs +++ b/fbw-common/src/wasm/systems/systems/src/simulation/update_context.rs @@ -15,7 +15,7 @@ use uom::si::{ use super::{Read, SimulatorReader}; use crate::{ shared::{low_pass_filter::LowPassFilter, MachNumber}, - simulation::{InitContext, VariableIdentifier}, + simulation::{InitContext, SideControlling, VariableIdentifier}, }; use nalgebra::{Rotation3, Vector3}; @@ -238,6 +238,7 @@ pub struct UpdateContext { rotation_vel_y_id: VariableIdentifier, rotation_vel_z_id: VariableIdentifier, aircraft_preset_quick_mode_id: VariableIdentifier, + side_controlling_id: VariableIdentifier, delta: Delta, simulation_time: f64, @@ -280,6 +281,8 @@ pub struct UpdateContext { rotation_accel: Vector3, rotation_vel: Vector3, + side_controlling: SideControlling, + /// This is set by the Aircraft Presets to facilitate quick startup or shutdown of the aircraft. /// In the context of the apu this means quick startup or shutdown of the apu, and no cooldown /// after using Bleed Air. @@ -328,6 +331,7 @@ impl UpdateContext { pub(crate) const ROTATION_VEL_Y_KEY: &'static str = "ROTATION VELOCITY BODY Y"; pub(crate) const ROTATION_VEL_Z_KEY: &'static str = "ROTATION VELOCITY BODY Z"; pub(crate) const AIRCRAFT_PRESET_QUICK_MODE_KEY: &'static str = "AIRCRAFT_PRESET_QUICK_MODE"; + pub(crate) const SIDE_CONTROLLING: &'static str = "FBW_PILOT_SEAT"; // Plane accelerations can become crazy with msfs collision handling. // Having such filtering limits high frequencies transients in accelerations used for physics @@ -357,6 +361,7 @@ impl UpdateContext { bank: Angle, mach_number: MachNumber, latitude: Angle, + side_controlling: SideControlling, ) -> UpdateContext { UpdateContext { is_ready_id: context.get_identifier(Self::IS_READY_KEY.to_owned()), @@ -404,6 +409,8 @@ impl UpdateContext { rotation_vel_y_id: context.get_identifier(Self::ROTATION_VEL_Y_KEY.to_owned()), rotation_vel_z_id: context.get_identifier(Self::ROTATION_VEL_Z_KEY.to_owned()), + side_controlling_id: context.get_identifier(Self::SIDE_CONTROLLING.to_owned()), + aircraft_preset_quick_mode_id: context .get_identifier(Self::AIRCRAFT_PRESET_QUICK_MODE_KEY.to_owned()), @@ -464,6 +471,8 @@ impl UpdateContext { rotation_vel: Vector3::default(), aircraft_preset_quick_mode: false, + + side_controlling, } } @@ -513,6 +522,8 @@ impl UpdateContext { aircraft_preset_quick_mode_id: context .get_identifier(Self::AIRCRAFT_PRESET_QUICK_MODE_KEY.to_owned()), + side_controlling_id: context.get_identifier("SIDE_CONTROLLING".to_owned()), + delta: Default::default(), simulation_time: Default::default(), is_ready: Default::default(), @@ -566,6 +577,8 @@ impl UpdateContext { rotation_vel: Vector3::default(), aircraft_preset_quick_mode: false, + + side_controlling: SideControlling::CAPTAIN, } } @@ -661,6 +674,8 @@ impl UpdateContext { self.update_relative_wind(); self.update_local_acceleration_plane_reference(delta); + + self.side_controlling = reader.read(&self.side_controlling_id); } // Computes local acceleration including world gravity and plane acceleration @@ -847,6 +862,10 @@ impl UpdateContext { self.mach_number } + pub fn side_controlling(&self) -> SideControlling { + self.side_controlling + } + pub fn with_delta(&self, delta: Duration) -> Self { let mut copy: UpdateContext = *self; copy.delta = Delta(delta); From caa2c830f8194b76fde8f91aa92b3752105e61cc Mon Sep 17 00:00:00 2001 From: juliansebline Date: Tue, 14 Jan 2025 15:46:51 +0100 Subject: [PATCH 30/64] arinc429.ts --- .../src/wasm/systems/systems/src/shared/arinc429.rs | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/fbw-common/src/wasm/systems/systems/src/shared/arinc429.rs b/fbw-common/src/wasm/systems/systems/src/shared/arinc429.rs index 1dcbd93a072..695882bfe58 100644 --- a/fbw-common/src/wasm/systems/systems/src/shared/arinc429.rs +++ b/fbw-common/src/wasm/systems/systems/src/shared/arinc429.rs @@ -47,10 +47,18 @@ impl Arinc429Word { self.value = ((self.value) & !(1 << (bit - 1))) | ((value as u32) << (bit - 1)); } + pub fn set_bits(&mut self, first_bit: u32, value: u32) { + self.value = ((self.value) & !(1 << (first_bit - 1))) | (value << (first_bit - 1)); + } + pub fn get_bit(&self, bit: u8) -> bool { debug_assert!((11..=29).contains(&bit)); ((self.value >> (bit - 1)) & 1) != 0 } + + pub fn get_bits(&self, nb_bits: u8, from_bit: u8) -> u32 { + (self.value >> (from_bit - 1)) & ((1 << nb_bits) - 1) + } } impl From for Arinc429Word { fn from(simvar: f64) -> Arinc429Word { From 9db867542f2b2d5c14a220bddcc29c312358d163 Mon Sep 17 00:00:00 2001 From: juliansebline Date: Tue, 14 Jan 2025 15:47:51 +0100 Subject: [PATCH 31/64] valve.rs --- fbw-common/src/wasm/systems/systems/src/pneumatic/valve.rs | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/fbw-common/src/wasm/systems/systems/src/pneumatic/valve.rs b/fbw-common/src/wasm/systems/systems/src/pneumatic/valve.rs index d63bb1d2e88..8da2e77d7d0 100644 --- a/fbw-common/src/wasm/systems/systems/src/pneumatic/valve.rs +++ b/fbw-common/src/wasm/systems/systems/src/pneumatic/valve.rs @@ -3,7 +3,7 @@ use std::f64::consts::PI; use crate::{ pneumatic::{Solenoid, SolenoidSignal}, shared::{interpolation, ControllerSignal, ElectricalBusType, ElectricalBuses, PneumaticValve}, - simulation::{SimulationElement, SimulationElementVisitor, UpdateContext}, + simulation::{SideControlling, SimulationElement, SimulationElementVisitor, UpdateContext}, }; use uom::si::{ @@ -686,6 +686,7 @@ mod tests { Angle::new::(0.), MachNumber(0.), Angle::new::(0.), + SideControlling::CAPTAIN, ) } From cc44b74edab5a62b5da1b6a5f01d18debd80f1de Mon Sep 17 00:00:00 2001 From: juliansebline Date: Tue, 14 Jan 2025 15:48:22 +0100 Subject: [PATCH 32/64] mod.rs of valve.rs --- fbw-common/src/wasm/systems/systems/src/pneumatic/mod.rs | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/fbw-common/src/wasm/systems/systems/src/pneumatic/mod.rs b/fbw-common/src/wasm/systems/systems/src/pneumatic/mod.rs index 69f80cadbb5..b537b23ff5b 100644 --- a/fbw-common/src/wasm/systems/systems/src/pneumatic/mod.rs +++ b/fbw-common/src/wasm/systems/systems/src/pneumatic/mod.rs @@ -6,8 +6,8 @@ use crate::{ HydraulicColor, PneumaticValve, }, simulation::{ - InitContext, Read, Reader, SimulationElement, SimulationElementVisitor, SimulatorReader, - SimulatorWriter, UpdateContext, VariableIdentifier, Write, Writer, + InitContext, Read, Reader, SideControlling, SimulationElement, SimulationElementVisitor, + SimulatorReader, SimulatorWriter, UpdateContext, VariableIdentifier, Write, Writer, }, }; @@ -1053,6 +1053,7 @@ mod tests { Angle::new::(0.), MachNumber(0.), Angle::new::(0.), + SideControlling::CAPTAIN, ) } From fbc4b47a5ec147a9115ca123e97ac0e4a4162ad9 Mon Sep 17 00:00:00 2001 From: juliansebline Date: Tue, 14 Jan 2025 16:31:38 +0100 Subject: [PATCH 33/64] Pilot seat option enabled on A320 --- fbw-a32nx/src/systems/instruments/src/EFB/index.tsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/fbw-a32nx/src/systems/instruments/src/EFB/index.tsx b/fbw-a32nx/src/systems/instruments/src/EFB/index.tsx index 3c73ee13f29..72eae620ea6 100644 --- a/fbw-a32nx/src/systems/instruments/src/EFB/index.tsx +++ b/fbw-a32nx/src/systems/instruments/src/EFB/index.tsx @@ -56,7 +56,7 @@ render( sim: { cones: true, msfsFplnSync: true, - pilotSeat: false, + pilotSeat: true, registrationDecal: true, wheelChocks: true, cabinLighting: false, From 60d011fd5722ef0522804b036c2d937370e6d6cc Mon Sep 17 00:00:00 2001 From: juliansebline Date: Tue, 14 Jan 2025 17:24:54 +0100 Subject: [PATCH 34/64] Removal of need_update --- .../systems/src/communications/audio_management_unit.rs | 8 -------- 1 file changed, 8 deletions(-) diff --git a/fbw-common/src/wasm/systems/systems/src/communications/audio_management_unit.rs b/fbw-common/src/wasm/systems/systems/src/communications/audio_management_unit.rs index 068b5967984..1f6e03104c7 100644 --- a/fbw-common/src/wasm/systems/systems/src/communications/audio_management_unit.rs +++ b/fbw-common/src/wasm/systems/systems/src/communications/audio_management_unit.rs @@ -263,8 +263,6 @@ pub struct AdaptationBoard { ls_fcu2_pressed: bool, pilot_transmit_channel: u32, - - need_update: bool, } impl AdaptationBoard { @@ -357,8 +355,6 @@ impl AdaptationBoard { ls_fcu1_pressed: false, ls_fcu2_pressed: false, - - need_update: false, } } @@ -508,10 +504,6 @@ impl SimulationElement for AdaptationBoard { _ => AudioSwitchingKnobPosition::Norm, }; - self.need_update = self.audio_switching_knob != audio_switching_knob - || self.ls_fcu1_pressed != ls_fcu1_pressed - || self.ls_fcu2_pressed != ls_fcu2_pressed; - self.audio_switching_knob = audio_switching_knob; self.ls_fcu1_pressed = ls_fcu1_pressed; self.ls_fcu2_pressed = ls_fcu2_pressed; From aaaaac51332572cfba15dd16a34e5378024ca059 Mon Sep 17 00:00:00 2001 From: juliansebline Date: Tue, 14 Jan 2025 17:33:10 +0100 Subject: [PATCH 35/64] Comments --- .../ModelBehaviorDefs/A32NX/Airbus.xml | 2 ++ .../FlyByWire_A380_842/model/behaviour/legacy/Airbus.xml | 2 ++ .../systems/src/communications/audio_management_unit.rs | 3 +++ 3 files changed, 7 insertions(+) diff --git a/fbw-a32nx/src/base/flybywire-aircraft-a320-neo/ModelBehaviorDefs/A32NX/Airbus.xml b/fbw-a32nx/src/base/flybywire-aircraft-a320-neo/ModelBehaviorDefs/A32NX/Airbus.xml index 2b4ba40d24f..36084119800 100644 --- a/fbw-a32nx/src/base/flybywire-aircraft-a320-neo/ModelBehaviorDefs/A32NX/Airbus.xml +++ b/fbw-a32nx/src/base/flybywire-aircraft-a320-neo/ModelBehaviorDefs/A32NX/Airbus.xml @@ -979,6 +979,8 @@ + +