diff --git a/.github/CHANGELOG.md b/.github/CHANGELOG.md
index 7780ae9465d..6cc18bf7612 100644
--- a/.github/CHANGELOG.md
+++ b/.github/CHANGELOG.md
@@ -147,6 +147,7 @@
1. [A380X/FMS] Add page scroll via soft keys & individual scroll via KCCU on MFD F-PLN - @BravoMike99 (bruno_pt99)
1. [A32NX/FMS] Added nav database swap confirmation - @tracernz (Mike)
1. [A380X/FMS] Add basic FIX INFO functionality - @Benjozork (Benjamin Dupont)
+1. [A32NX/COMMS] Enabled all components of communications panels with Rust - @Julian [Z+2 fr en esp]#8476 (Julian Sebline)
## 0.12.0
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
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..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
@@ -43,6 +43,57 @@
+
+
+ #BASE_NAME#
+ #BASE_NAME#
+ #BASE_NAME#
+ lswitch
+
+
+
+
+ Horizontal
+
+ (* LEFT *)
+ 1 (>L:#STATE_VAR_NAME#)
+
+
+ (* OFF *)
+ 0 (>L:#STATE_VAR_NAME#)
+
+
+ (* RIGHT *)
+ 2 (>L:#STATE_VAR_NAME#)
+
+ (L:#STATE_VAR_NAME#) 1 ==
+ (L:#STATE_VAR_NAME#) 0 ==
+ (L:#STATE_VAR_NAME#) 2 ==
+
+
+
+
+
+
+
+ UNKNOWN
+ NAVAID_Switch
+ 0
+ 1
+ A32NX_EFIS_#SIDE#_NAVAID_#INDEX#_MODE
+ TT:COCKPIT.TOOLTIPS.EFIS_PANEL_ADFSWITCH_ADF#INDEX#
+ TT:COCKPIT.TOOLTIPS.EFIS_PANEL_ADFSWITCH_OFF#INDEX#
+ TT:COCKPIT.TOOLTIPS.EFIS_PANEL_ADFSWITCH_VOR#INDEX#
+ 0
+ .5
+ 1
+ 0.5
+
+
+
+
+
+
1
@@ -61,7 +112,7 @@
mpb1off
0.1
0.5
- %((L:BTN_TERRONND_#ID#_ACTIVE, Bool))%{if}TT:COCKPIT.TOOLTIPS.TERRAIN_ON_ND_TURN_OFF%{else}TT:COCKPIT.TOOLTIPS.TERRAIN_ON_ND_TURN_ON%{en}
+ %((L:A32NX_BTN_TERRONND_#ID#_ACTIVE, Bool))%{if}TT:COCKPIT.TOOLTIPS.TERRAIN_ON_ND_TURN_OFF%{else}TT:COCKPIT.TOOLTIPS.TERRAIN_ON_ND_TURN_ON%{en}
@@ -510,52 +561,6 @@
-
-
-
-
-
- #NODE_ID_CALL1#
- #POTENTIOMETER#
-
-
- #NODE_ID_CALL2#
- #POTENTIOMETER#
-
-
- #NODE_ID_CALL3#
- #POTENTIOMETER#
-
-
- #NODE_ID_CALL4#
- #POTENTIOMETER#
-
-
- #NODE_ID_CALL5#
- #POTENTIOMETER#
-
-
- #NODE_ID_MECH#
- #POTENTIOMETER#
-
-
- #NODE_ID_ATT#
- #POTENTIOMETER#
-
-
- #NODE_ID_VOICE#
- #POTENTIOMETER#
-
-
- #NODE_ID_RESET#
-
- #POTENTIOMETER#
-
-
- #NODE_ID_PA#
-
-
-
@@ -879,27 +884,6 @@
-
-
- 1
-
-
-
-
- #AUDIO_KNOB_POWERED# ! if{
- 0
- } els{
- (L:A32NX_OVHD_INTLT_ANN) 0 == (L:A32NX_ELEC_DC_2_BUS_IS_POWERED, Bool) and if{
- 14
- } els{
- (A:LIGHT POTENTIOMETER:#POTENTIOMETER#, Percent over 100) 0.5 *
- }
- }
-
-
-
-
-
@@ -995,6 +979,8 @@
+
AIRBUS_Push_Autopilot_#BTN_ID#_#ID#
@@ -1007,13 +993,13 @@
#BTN_ID#
COCKPIT.TOOLTIPS.EFIS_PANEL_#BTN_TOOLTIP_ID#_INFO_TURN_OFF
COCKPIT.TOOLTIPS.EFIS_PANEL_#BTN_TOOLTIP_ID#_INFO_TURN_ON
- L:BTN_#BTN_ID#_FILTER_ACTIVE
+ L:A32NX_BTN_#BTN_ID#_FILTER_ACTIVE
ASOBO_GT_Push_Button_Airliner
(>H:#PLANE_PREFIX#_MFD_BTN_#BTN_ID#) (>H:#PLANE_PREFIX#_PFD_BTN_#BTN_ID#) and
- (L:BTN_#BTN_ID#_FILTER_ACTIVE)
+ (L:A32NX_BTN_#BTN_ID#_FILTER_ACTIVE)
%((#ONOFF_VARIABLE#))%{if}TT:#ON_TOOLTIP#%{else}TT:#OFF_TOOLTIP#%{end}
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 @@
1
- 0.04
- 0.01
- 0.02
+ 4
AIRLINER
(L:A32NX_ELEC_DC_ESS_BUS_IS_POWERED, Bool)
(L:A32NX_ELEC_DC_ESS_BUS_IS_POWERED, Bool)
- (L:A32NX_ELEC_DC_ESS_BUS_IS_POWERED, Bool)
@@ -55,654 +52,4 @@
-
-
- #PREFIX#_AudioReceiver_Knob_VHF_L#SUFFIX_ID#
- #PREFIX#_AudioReceiver_Knob_VHF_L_LIGHT#SUFFIX_ID#
- #PREFIX#_AudioReceiver_Knob_VHF_L#SUFFIX_ID#
- #PREFIX#_AudioReceiver_Push_VHF_L#SUFFIX_ID#
- #PREFIX#_AudioReceiver_Knob_VHF_L_LED#SUFFIX_ID#
- #PREFIX#_AudioReceiver_Push_mic_call_01#SUFFIX_ID#
- #PREFIX#_AudioReceiver_Push_mic_call_01#SUFFIX_ID#
- #PREFIX#_AudioReceiver_Push_mic_call_01_SEQ1#SUFFIX_ID#
- #PREFIX#_AudioReceiver_Push_mic_call_01_SEQ2#SUFFIX_ID#
- #PREFIX#_AudioReceiver_Knob_VHF_C#SUFFIX_ID#
- #PREFIX#_AudioReceiver_Knob_VHF_C_LIGHT#SUFFIX_ID#
- #PREFIX#_AudioReceiver_Knob_VHF_C#SUFFIX_ID#
- #PREFIX#_AudioReceiver_Push_VHF_C#SUFFIX_ID#
- #PREFIX#_AudioReceiver_Knob_VHF_C_LED#SUFFIX_ID#
- #PREFIX#_AudioReceiver_Push_mic_call_02#SUFFIX_ID#
- #PREFIX#_AudioReceiver_Push_mic_call_02#SUFFIX_ID#
- #PREFIX#_AudioReceiver_Push_mic_call_02_SEQ1#SUFFIX_ID#
- #PREFIX#_AudioReceiver_Push_mic_call_02_SEQ2#SUFFIX_ID#
- #PREFIX#_AudioReceiver_Knob_VHF_R#SUFFIX_ID#
- #PREFIX#_AudioReceiver_Knob_VHF_R_LIGHT#SUFFIX_ID#
- #PREFIX#_AudioReceiver_Knob_VHF_R#SUFFIX_ID#
- #PREFIX#_AudioReceiver_Push_VHF_R#SUFFIX_ID#
- #PREFIX#_AudioReceiver_Knob_VHF_R_LED#SUFFIX_ID#
- #PREFIX#_AudioReceiver_Push_mic_call_03#SUFFIX_ID#
- #PREFIX#_AudioReceiver_Push_mic_call_03#SUFFIX_ID#
- #PREFIX#_AudioReceiver_Push_mic_call_03_SEQ1#SUFFIX_ID#
- #PREFIX#_AudioReceiver_Push_mic_call_03_SEQ2#SUFFIX_ID#
- #PREFIX#_AudioReceiver_Knob_MKR_LED#SUFFIX_ID#
-
- False
-
-
- #SEQ2_POWERED#
-
-
- 1
-
-
- ASOBO_GT_Knob_Finite_Switch
- ANIM_CODE_SWITCH
- False
- False
-
-
-
-
-
- BUTTON
- FBW_AIRLINER_Audio_Volume_Knob_Template
- (L:A32NX_ELEC_DC_ESS_BUS_IS_POWERED, Bool) (L:A32NX_RMP_#SIDE#_TOGGLE_SWITCH, bool) and
- #NODE_ID_RECEIVER_VHF_L#
- #NODE_ID_LIGHT_RECEIVER_VHF_L#
- #ANIM_NAME_KNOB_RECEIVER_VHF_L#
- #ANIM_NAME_PUSH_RECEIVER_VHF_L#
- #NODE_ID_LED_RECEIVER_VHF_L#
- #NODE_ID_BUTTON_VHF_L#
- #ANIM_NAME_BUTTON_VHF_L#
- #NODE_ID_BUTTON_SEQ1_VHF_L#
- #NODE_ID_BUTTON_SEQ2_VHF_L#
- VHF_L
- 0
- TT:COCKPIT.TOOLTIPS.TRANSMITTER_VHF_L_VOLUME_DEC
- TT:COCKPIT.TOOLTIPS.TRANSMITTER_VHF_L_VOLUME_INC
- TT:COCKPIT.TOOLTIPS.TRANSMITTER_VHF_L_AUDIO_TOGGLE
- TT:COCKPIT.TOOLTIPS.TRANSMITTER_SELECT_VHF_L
-
-
- BUTTON
- FBW_AIRLINER_Audio_Volume_Knob_Template
- (L:A32NX_ELEC_DC_2_BUS_IS_POWERED, Bool) (L:A32NX_RMP_#SIDE#_TOGGLE_SWITCH, bool) and
- #NODE_ID_RECEIVER_VHF_C#
- #NODE_ID_LIGHT_RECEIVER_VHF_C#
- #ANIM_NAME_KNOB_RECEIVER_VHF_C#
- #ANIM_NAME_PUSH_RECEIVER_VHF_C#
- #NODE_ID_LED_RECEIVER_VHF_C#
- #NODE_ID_BUTTON_VHF_C#
- #ANIM_NAME_BUTTON_VHF_C#
- #NODE_ID_BUTTON_SEQ1_VHF_C#
- #NODE_ID_BUTTON_SEQ2_VHF_C#
- VHF_C
- 1
- TT:COCKPIT.TOOLTIPS.TRANSMITTER_VHF_C_VOLUME_DEC
- TT:COCKPIT.TOOLTIPS.TRANSMITTER_VHF_C_VOLUME_INC
- TT:COCKPIT.TOOLTIPS.TRANSMITTER_VHF_C_AUDIO_TOGGLE
- TT:COCKPIT.TOOLTIPS.TRANSMITTER_SELECT_VHF_C
-
-
- BUTTON
- FBW_AIRLINER_Audio_Volume_Knob_Template
- (L:A32NX_ELEC_DC_1_BUS_IS_POWERED, Bool) (L:A32NX_RMP_#SIDE#_TOGGLE_SWITCH, bool) and
- #NODE_ID_RECEIVER_VHF_R#
- #NODE_ID_LIGHT_RECEIVER_VHF_R#
- #ANIM_NAME_KNOB_RECEIVER_VHF_R#
- #ANIM_NAME_PUSH_RECEIVER_VHF_R#
- #NODE_ID_LED_RECEIVER_VHF_R#
- #NODE_ID_BUTTON_VHF_R#
- #ANIM_NAME_BUTTON_VHF_R#
- #NODE_ID_BUTTON_SEQ1_VHF_R#
- #NODE_ID_BUTTON_SEQ2_VHF_R#
- VHF_R
- 2
- TT:COCKPIT.TOOLTIPS.TRANSMITTER_VHF_R_VOLUME_DEC
- TT:COCKPIT.TOOLTIPS.TRANSMITTER_VHF_R_VOLUME_INC
- TT:COCKPIT.TOOLTIPS.TRANSMITTER_VHF_R_AUDIO_TOGGLE
- TT:COCKPIT.TOOLTIPS.TRANSMITTER_SELECT_VHF_R
-
-
-
- BUTTON
- #NODE_ID_RECEIVER_VOICE#
- #ANIM_NAME_PUSH_RECEIVER_VOICE#
- #NODE_ID_BUTTON_VOICE_SEQ1#
- #NODE_ID_BUTTON_VOICE_SEQ2#
-
- (L:XMLVAR_NAV_#SIDE#_VOICE_Switch_Down) ! (>L:XMLVAR_NAV_#SIDE#_VOICE_Switch_Down)
- (L:XMLVAR_NAV_L_VOICE_Switch_Down) (L:XMLVAR_NAV_R_VOICE_Switch_Down) or (>L:XMLVAR_NAV_VOICE_Switch_Down)
-
- (L:XMLVAR_NAV_VOICE_Switch_Down) 0 == if{
- (L:XMLVAR_NAV_L_VOR1_Switch_Down) (L:XMLVAR_NAV_R_VOR1_Switch_Down) or if{
- 1 (>K:RADIO_VOR1_IDENT_ENABLE)
- 1 (>K:RADIO_DME1_IDENT_ENABLE)
- }
- (L:XMLVAR_NAV_L_VOR2_Switch_Down) (L:XMLVAR_NAV_R_VOR2_Switch_Down) or if{
- 1 (>K:RADIO_VOR2_IDENT_ENABLE)
- 1 (>K:RADIO_DME2_IDENT_ENABLE)
- }
-
- (L:XMLVAR_NAV_L_ADF1_Switch_Down) (L:XMLVAR_NAV_R_ADF1_Switch_Down) or if{
- 1 (>K:RADIO_ADF_IDENT_ENABLE)
- }
- (L:XMLVAR_NAV_L_ADF2_Switch_Down) (L:XMLVAR_NAV_R_ADF2_Switch_Down) or if{
- 1 (>K:RADIO_ADF2_IDENT_ENABLE)
- }
- }
-
- (L:XMLVAR_NAV_VOICE_Switch_Down) 1 == if{
- 1 (>K:RADIO_VOR1_IDENT_DISABLE)
- 1 (>K:RADIO_VOR2_IDENT_DISABLE)
- 1 (>K:RADIO_ADF_IDENT_DISABLE)
- 1 (>K:RADIO_ADF2_IDENT_DISABLE)
-
- 1 (>K:RADIO_DME1_IDENT_DISABLE)
- 1 (>K:RADIO_DME2_IDENT_DISABLE)
- }
-
- fcubutton
- 0.1
- fcubutton
- 0.5
- (L:XMLVAR_NAV_#SIDE#_VOICE_Switch_Down)
- %((L:XMLVAR_NAV_#SIDE#_VOICE_Switch_Down))%{if}TT:COCKPIT.TOOLTIPS.NAV_PUSHBUTTON_VOICE_OFF%{else}TT:COCKPIT.TOOLTIPS.NAV_PUSHBUTTON_VOICE_ON%{end}
-
-
-
- KNOB
- FBW_AIRLINER_Audio_NAV_Volume_Knob_Template
- #NODE_ID_RECEIVER_VOR1#
- #NODE_ID_LIGHT_RECEIVER_VOR1#
- #ANIM_NAME_KNOB_RECEIVER_VOR1#
- #ANIM_NAME_PUSH_RECEIVER_VOR1#
- VOR1
-
-
- (L:XMLVAR_NAV_VOICE_Switch_Down) 0 == if{
- (A:NAV SOUND:1, Bool) 1 == (L:XMLVAR_NAV_L_VOR1_Switch_Down) 0 == (L:XMLVAR_NAV_R_VOR1_Switch_Down) 0 == and and if{
- 1 (>K:RADIO_VOR1_IDENT_TOGGLE)
- 1 (>K:RADIO_DME1_IDENT_SET)
- }
-
- (A:NAV SOUND:1, Bool) 0 == (L:XMLVAR_NAV_L_VOR1_Switch_Down) 1 == (L:XMLVAR_NAV_R_VOR1_Switch_Down) 1 == or and if{
- 1 (>K:RADIO_VOR1_IDENT_TOGGLE)
- 1 (>K:RADIO_DME1_IDENT_SET)
- }
- }
-
-
-
- (L:XMLVAR_NAV_#SIDE#_VOR1_Volume) #VOLUME_INCREMENT_NAV# + 1 min (>L:XMLVAR_NAV_#SIDE#_VOR1_Volume)
- (L:XMLVAR_NAV_#SIDE#_VOR1_Volume) (A:NAV VOLUME:1, percent over 100) > if{
- 1 (>K:NAV1_VOLUME_INC)
- }
-
-
- (L:XMLVAR_NAV_#SIDE#_VOR1_Volume) #VOLUME_INCREMENT_NAV# - 0 max (>L:XMLVAR_NAV_#SIDE#_VOR1_Volume)
- (L:XMLVAR_NAV_L_VOR1_Volume) (L:XMLVAR_NAV_R_VOR1_Volume) max (A:NAV VOLUME:1, percent over 100) < if{
- 1 (>K:NAV1_VOLUME_DEC)
- }
-
- TT:COCKPIT.TOOLTIPS.TRANSMITTER_VOR1_VOLUME_DEC
- TT:COCKPIT.TOOLTIPS.TRANSMITTER_VOR1_VOLUME_INC
- %((L:XMLVAR_NAV_#SIDE#_VOR1_Switch_Down))%{if}TT:INPUT.KEY_RADIO_VOR1_IDENT_DISABLE_DESC%{else}TT:INPUT.KEY_RADIO_VOR1_IDENT_ENABLE_DESC%{end}
-
-
-
- KNOB
- FBW_AIRLINER_Audio_NAV_Volume_Knob_Template
- #NODE_ID_RECEIVER_VOR2#
- #NODE_ID_LIGHT_RECEIVER_VOR2#
- #ANIM_NAME_KNOB_RECEIVER_VOR2#
- #ANIM_NAME_PUSH_RECEIVER_VOR2#
- VOR2
-
-
- (L:XMLVAR_NAV_VOICE_Switch_Down) 0 == if{
- (A:NAV SOUND:2, Bool) 1 == (L:XMLVAR_NAV_L_VOR2_Switch_Down) 0 == (L:XMLVAR_NAV_R_VOR2_Switch_Down) 0 == and and if{
- 1 (>K:RADIO_VOR2_IDENT_TOGGLE)
- 1 (>K:RADIO_DME2_IDENT_SET)
- }
-
- (A:NAV SOUND:2, Bool) 0 == (L:XMLVAR_NAV_L_VOR2_Switch_Down) 1 == (L:XMLVAR_NAV_R_VOR2_Switch_Down) 1 == or and if{
- 1 (>K:RADIO_VOR2_IDENT_TOGGLE)
- 1 (>K:RADIO_DME2_IDENT_SET)
- }
- }
-
-
-
- (L:XMLVAR_NAV_#SIDE#_VOR2_Volume) #VOLUME_INCREMENT_NAV# + 1 min (>L:XMLVAR_NAV_#SIDE#_VOR2_Volume)
- (L:XMLVAR_NAV_#SIDE#_VOR2_Volume) (A:NAV VOLUME:2, percent over 100) > if{
- 1 (>K:NAV2_VOLUME_INC)
- }
-
-
- (L:XMLVAR_NAV_#SIDE#_VOR2_Volume) #VOLUME_INCREMENT_NAV# - 0 max (>L:XMLVAR_NAV_#SIDE#_VOR2_Volume)
- (L:XMLVAR_NAV_L_VOR2_Volume) (L:XMLVAR_NAV_R_VOR2_Volume) max (A:NAV VOLUME:2, percent over 100) < if{
- 1 (>K:NAV2_VOLUME_DEC)
- }
-
- TT:COCKPIT.TOOLTIPS.TRANSMITTER_VOR2_VOLUME_DEC
- TT:COCKPIT.TOOLTIPS.TRANSMITTER_VOR2_VOLUME_INC
- %((L:XMLVAR_NAV_#SIDE#_VOR2_Switch_Down))%{if}TT:INPUT.KEY_RADIO_VOR2_IDENT_DISABLE_DESC%{else}TT:INPUT.KEY_RADIO_VOR2_IDENT_ENABLE_DESC%{end}
-
-
-
- KNOB
- FBW_AIRLINER_Audio_NAV_Volume_Knob_Template
- #NODE_ID_RECEIVER_MKR#
- #NODE_ID_LIGHT_RECEIVER_MKR#
- #ANIM_NAME_KNOB_RECEIVER_MKR#
- #ANIM_NAME_PUSH_RECEIVER_MKR#
- #NODE_ID_LED_RECEIVER_MKR#
- MKR
-
- (A:MARKER SOUND, Bool) 1 == (L:XMLVAR_NAV_L_MKR_Switch_Down) 0 == (L:XMLVAR_NAV_R_MKR_Switch_Down) 0 == and and if{
- 1 (>K:MARKER_SOUND_TOGGLE)
- }
-
- (A:MARKER SOUND, Bool) 0 == (L:XMLVAR_NAV_L_MKR_Switch_Down) 1 == (L:XMLVAR_NAV_R_MKR_Switch_Down) 1 == or and if{
- 1 (>K:MARKER_SOUND_TOGGLE)
- }
-
-
- (L:XMLVAR_NAV_#SIDE#_MKR_Volume) #VOLUME_INCREMENT_NAV# + 1 min (>L:XMLVAR_NAV_#SIDE#_MKR_Volume)
- (L:XMLVAR_NAV_#SIDE#_MKR_Volume) #VOLUME_INCREMENT_NAV# - 0 max (>L:XMLVAR_NAV_#SIDE#_MKR_Volume)
- TT:COCKPIT.TOOLTIPS.NAV_KNOB_MARKERS_VOLUME_DECREASE
- TT:COCKPIT.TOOLTIPS.NAV_KNOB_MARKERS_VOLUME_INCREASE
- %((L:XMLVAR_NAV_#SIDE#_MKR_Switch_Down))%{if}TT:COCKPIT.TOOLTIPS.NAV_KNOB_MARKERS_IDENT_DISABLE%{else}TT:COCKPIT.TOOLTIPS.NAV_KNOB_MARKERS_IDENT_ENABLE%{end}
-
-
-
- KNOB
- FBW_AIRLINER_Audio_NAV_Volume_Knob_Template
- #NODE_ID_RECEIVER_ILS#
- #NODE_ID_LIGHT_RECEIVER_ILS#
- #ANIM_NAME_KNOB_RECEIVER_ILS#
- #ANIM_NAME_PUSH_RECEIVER_ILS#
- #NODE_ID_LED_RECEIVER_ILS#
- ILS
-
-
-
- (L:XMLVAR_NAV_#SIDE#_ILS_Volume) #VOLUME_INCREMENT_NAV# + 1 min (>L:XMLVAR_NAV_#SIDE#_ILS_Volume)
- (L:XMLVAR_NAV_#SIDE#_ILS_Volume) #VOLUME_INCREMENT_NAV# - 0 max (>L:XMLVAR_NAV_#SIDE#_ILS_Volume)
- TT:COCKPIT.TOOLTIPS.NAV_KNOB_ILS_VOLUME_DECREASE
- TT:COCKPIT.TOOLTIPS.NAV_KNOB_ILS_VOLUME_INCREASE
- %((L:XMLVAR_NAV_#SIDE#_ILS_Switch_Down))%{if}TT:COCKPIT.TOOLTIPS.NAV_KNOB_ILS_IDENT_DISABLE%{else}TT:COCKPIT.TOOLTIPS.NAV_KNOB_ILS_IDENT_ENABLE%{end}
-
-
-
- KNOB
- FBW_AIRLINER_Audio_NAV_Volume_Knob_Template
- #NODE_ID_RECEIVER_MLS#
- #NODE_ID_LIGHT_RECEIVER_MLS#
- #ANIM_NAME_KNOB_RECEIVER_MLS#
- #ANIM_NAME_PUSH_RECEIVER_MLS#
- #NODE_ID_LED_RECEIVER_MLS#
- MLS
-
-
-
- (L:XMLVAR_NAV_#SIDE#_MLS_Volume) #VOLUME_INCREMENT_NAV# + 1 min (>L:XMLVAR_NAV_#SIDE#_MLS_Volume)
- (L:XMLVAR_NAV_#SIDE#_MLS_Volume) #VOLUME_INCREMENT_NAV# - 0 max (>L:XMLVAR_NAV_#SIDE#_MLS_Volume)
- TT:COCKPIT.TOOLTIPS.NAV_KNOB_ILS_VOLUME_DECREASE
- TT:COCKPIT.TOOLTIPS.NAV_KNOB_ILS_VOLUME_INCREASE
- %((L:XMLVAR_NAV_#SIDE#_MLS_Switch_Down))%{if}TT:COCKPIT.TOOLTIPS.NAV_KNOB_ILS_IDENT_DISABLE%{else}TT:COCKPIT.TOOLTIPS.NAV_KNOB_ILS_IDENT_ENABLE%{end}
-
-
-
- KNOB
- FBW_AIRLINER_Audio_NAV_Volume_Knob_Template
- #NODE_ID_RECEIVER_ADF1#
- #NODE_ID_LIGHT_RECEIVER_ADF1#
- #ANIM_NAME_KNOB_RECEIVER_ADF1#
- #ANIM_NAME_PUSH_RECEIVER_ADF1#
- #NODE_ID_LED_RECEIVER_ADF1#
- ADF1
-
-
- (L:XMLVAR_NAV_VOICE_Switch_Down) 0 == if{
- (A:ADF SOUND, Bool) 1 == (L:XMLVAR_NAV_L_ADF1_Switch_Down) 0 == (L:XMLVAR_NAV_R_ADF1_Switch_Down) 0 == and and if{
- 1 (>K:RADIO_ADF_IDENT_DISABLE)
- }
-
- (A:ADF SOUND, Bool) 0 == (L:XMLVAR_NAV_L_ADF1_Switch_Down) 1 == (L:XMLVAR_NAV_R_ADF1_Switch_Down) 1 == or and if{
- 1 (>K:RADIO_ADF_IDENT_ENABLE)
- }
- }
-
-
-
- (L:XMLVAR_NAV_#SIDE#_ADF1_Volume) #VOLUME_INCREMENT_NAV# + 1 min (>L:XMLVAR_NAV_#SIDE#_ADF1_Volume)
- (L:XMLVAR_NAV_#SIDE#_ADF1_Volume) (A:ADF VOLUME:1, percent over 100) > if{
- 1 (>K:ADF_VOLUME_INC)
- }
-
-
- (L:XMLVAR_NAV_#SIDE#_ADF1_Volume) #VOLUME_INCREMENT_NAV# - 0 max (>L:XMLVAR_NAV_#SIDE#_ADF1_Volume)
- (L:XMLVAR_NAV_L_ADF1_Volume) (L:XMLVAR_NAV_R_ADF1_Volume) max (A:ADF VOLUME:1, percent over 100) < if{
- 1 (>K:ADF_VOLUME_DEC)
- }
-
- TT:COCKPIT.TOOLTIPS.TRANSMITTER_ADF1_VOLUME_DEC
- TT:COCKPIT.TOOLTIPS.TRANSMITTER_ADF1_VOLUME_INC
- %((L:XMLVAR_NAV_#SIDE#_ADF1_Switch_Down))%{if}TT:INPUT.KEY_RADIO_ADF_IDENT_DISABLE_DESC%{else}TT:INPUT.KEY_RADIO_ADF_IDENT_ENABLE_DESC%{end}
-
-
-
- KNOB
- FBW_AIRLINER_Audio_NAV_Volume_Knob_Template
- #NODE_ID_RECEIVER_ADF2#
- #NODE_ID_LIGHT_RECEIVER_ADF2#
- #ANIM_NAME_KNOB_RECEIVER_ADF2#
- #ANIM_NAME_PUSH_RECEIVER_ADF2#
- #NODE_ID_LED_RECEIVER_ADF2#
- ADF2
-
-
- (L:XMLVAR_NAV_VOICE_Switch_Down) 0 == if{
- (A:ADF SOUND:2, Bool) 1 == (L:XMLVAR_NAV_L_ADF2_Switch_Down) 0 == (L:XMLVAR_NAV_R_ADF2_Switch_Down) 0 == and and if{
- 1 (>K:RADIO_ADF2_IDENT_TOGGLE)
- }
-
- (A:ADF SOUND:2, Bool) 0 == (L:XMLVAR_NAV_L_ADF2_Switch_Down) 1 == (L:XMLVAR_NAV_R_ADF2_Switch_Down) 1 == or and if{
- 1 (>K:RADIO_ADF2_IDENT_TOGGLE)
- }
- }
-
-
- (L:XMLVAR_NAV_#SIDE#_ADF2_Volume) #VOLUME_INCREMENT_NAV# + 1 min (>L:XMLVAR_NAV_#SIDE#_ADF2_Volume)
- (L:XMLVAR_NAV_#SIDE#_ADF2_Volume) #VOLUME_INCREMENT_NAV# - 0 max (>L:XMLVAR_NAV_#SIDE#_ADF2_Volume)
- TT:COCKPIT.TOOLTIPS.TRANSMITTER_ADF2_VOLUME_DEC
- TT:COCKPIT.TOOLTIPS.TRANSMITTER_ADF2_VOLUME_INC
- %((L:XMLVAR_NAV_#SIDE#_ADF2_Switch_Down))%{if}TT:INPUT.KEY_RADIO_ADF2_IDENT_DISABLE_DESC%{else}TT:INPUT.KEY_RADIO_ADF2_IDENT_ENABLE_DESC%{end}
-
-
-
-
-
-
-
-
-
- ASOBO_GT_Knob_Finite_Switch
- ANIM_CODE_SWITCH
- 1
- (L:A32NX_OVHD_INTLT_ANN, number) 2 == if{ 0.1 } els{ 1 }
-
-
-
- #SEQ1_POWERED# ! if{
- 0
- } els{
- 1 (L:XMLVAR_COM_#ID#_#FREQ_ID#_Switch_Down) == (L:A32NX_OVHD_INTLT_ANN) 0 == (L:A32NX_ELEC_DC_2_BUS_IS_POWERED, Bool) and or if{
- 3.0 #EMISSIVE_DIM# *
- } els{
- 0.1 #EMISSIVE_DIM# *
- }
- }
-
-
-
-
-
- #TOOLTIP_PB#
- #NODE_ID_BUTTON#
- #ANIM_NAME_BUTTON#
- #NODE_ID_BUTTON_SEQ1#
- #NODE_ID_BUTTON_SEQ2#
-
-
- #SEQ1_POWERED# if{
- #TRANSMIT_ID# (L:XMLVAR_COM_PANEL#ID#_Transmit_Channel) == if{
- 4 (>L:XMLVAR_COM_PANEL#ID#_Transmit_Channel)
- } els{
- #TRANSMIT_ID# (>L:XMLVAR_COM_PANEL#ID#_Transmit_Channel)
- }
-
- #ID# 1 == if{
- (A:PILOT TRANSMITTER TYPE, Enum) #TRANSMIT_ID# == if{
- 4 (>K:PILOT_TRANSMITTER_SET)
- } els{
- #TRANSMIT_ID# (>K:PILOT_TRANSMITTER_SET)
- }
- (L:XMLVAR_COM_PANEL2_Transmit_Channel) (>K:COPILOT_TRANSMITTER_SET)
- } els{
- (A:COPILOT TRANSMITTER TYPE, Enum) #TRANSMIT_ID# == if{
- 4 (>K:COPILOT_TRANSMITTER_SET)
- } els{
- #TRANSMIT_ID# (>K:COPILOT_TRANSMITTER_SET)
- }
- }
- }
-
-
-
- #SEQ1_POWERED# if{
- #TRANSMIT_ID# (L:XMLVAR_COM_PANEL#ID#_Transmit_Channel) == (L:A32NX_OVHD_INTLT_ANN) 0 == (L:A32NX_ELEC_DC_2_BUS_IS_POWERED, Bool) and or #EMISSIVE_DIM# *
- }
-
-
-
- #SEQ1_POWERED# if{
- #TRANSMIT_ID# (L:XMLVAR_COM_PANEL#ID#_Transmit_Channel) == (L:A32NX_OVHD_INTLT_ANN) 0 == (L:A32NX_ELEC_DC_2_BUS_IS_POWERED, Bool) and or #EMISSIVE_DIM# *
- }
-
- fcubutton
- 0.1
- fcubutton
- 0.5
-
-
-
-
-
-
- #ANIM_NAME_KNOB#
- 1
- 0
- 1
- TurnLeft
- TurnRight
- Hand
- #TOOLTIP_LEFT#
- #TOOLTIP_RIGHT#
- #TOOLTIP_HAND#
- True
- False
- False
- 0.002
- (L:XMLVAR_COM_#ID#_Volume_#FREQ_ID#) 100 *
-
- 0 (L:XMLVAR_COM_#ID#_#FREQ_ID#_Switch_Down) == if{
- (L:XMLVAR_COM_#ID#_Volume_#FREQ_ID#) #VOLUME_INCREMENT_HARD# + 1 min (>L:XMLVAR_COM_#ID#_Volume_#FREQ_ID#)
- } els{
- (L:XMLVAR_COM_#ID#_Volume_#FREQ_ID#) #VOLUME_INCREMENT# + 1 min (>L:XMLVAR_COM_#ID#_Volume_#FREQ_ID#)
- }
-
-
- 0 (L:XMLVAR_COM_#ID#_#FREQ_ID#_Switch_Down) == if{
- (L:XMLVAR_COM_#ID#_Volume_#FREQ_ID#) #VOLUME_INCREMENT_HARD# - 0 max (>L:XMLVAR_COM_#ID#_Volume_#FREQ_ID#)
- } els{
- (L:XMLVAR_COM_#ID#_Volume_#FREQ_ID#) #VOLUME_INCREMENT# - 0 max (>L:XMLVAR_COM_#ID#_Volume_#FREQ_ID#)
- }
-
- (L:XMLVAR_COM_#ID#_#FREQ_ID#_Switch_Down) 100 *
- #ANIM_NAME_SWITCH#
-
- #SEQ1_POWERED# if{
- (L:XMLVAR_COM_#ID#_#FREQ_ID#_Switch_Down) ! (>L:XMLVAR_COM_#ID#_#FREQ_ID#_Switch_Down)
- 1 (>I:XMLVAR_COM_UpdateReceivers)
- }
-
-
- #SEQ1_POWERED# if{
- 1 (L:XMLVAR_COM_#ID#_#FREQ_ID#_Switch_Down) == (L:A32NX_OVHD_INTLT_ANN) 0 == (L:A32NX_ELEC_DC_2_BUS_IS_POWERED, Bool) and or #EMISSIVE_DIM# *
- }
-
-
- mcdubuttons
- 0.1
- mcdubuttons
- 0.5
- 36
-
-
-
-
-
-
-
- #TRANSMIT_EMISSIVE_CODE#
-
-
-
-
-
-
-
-
-
-
-
-
- ASOBO_GT_Knob_Finite_Switch
- #ANIM_CODE_SWITCH#
- 1
- (L:A32NX_OVHD_INTLT_ANN, number) 2 == if{ 0.1 } els{ 1 }
-
-
-
- #AUDIO_KNOB_POWERED# ! if{
- 0
- } els{
- (L:XMLVAR_NAV_#SIDE#_#INSTRUMENT#_Switch_Down) 1 == (L:A32NX_OVHD_INTLT_ANN) 0 == (L:A32NX_ELEC_DC_2_BUS_IS_POWERED, Bool) and or if{
- 3.0 #EMISSIVE_DIM# *
- } els{
- 0.1 #EMISSIVE_DIM# *
- }
- }
-
-
-
-
-
- #ANIM_NAME_KNOB#
- 1
- 0
- 1
- TurnLeft
- TurnRight
- Hand
- #TOOLTIP_LEFT#
- #TOOLTIP_RIGHT#
- #TOOLTIP_HAND#
- True
- False
- False
- 0.002
- (L:XMLVAR_NAV_#SIDE#_#INSTRUMENT#_Volume) 100 *
- #INC_VOLUME#
- #DEC_VOLUME#
- (L:XMLVAR_NAV_#SIDE#_#INSTRUMENT#_Switch_Down) 100 *
- #ANIM_NAME_SWITCH#
-
- (L:XMLVAR_NAV_#SIDE#_#INSTRUMENT#_Switch_Down) ! (>L:XMLVAR_NAV_#SIDE#_#INSTRUMENT#_Switch_Down)
-
- #ONCLICK#
-
-
- mcdubuttons
- 0.1
- mcdubuttons
- 0.5
- 36
-
-
-
-
-
- #TRANSMIT_EMISSIVE_CODE#
-
-
-
-
-
-
-
-
-
-
-
-
- 15
-
-
-
-
- (I:XMLVAR_COM_UpdateReceivers) if{
- (L:XMLVAR_COM_1_VHF_L_Switch_Down) (L:XMLVAR_COM_2_VHF_L_Switch_Down) or (>K:COM1_RECEIVE_SELECT)
- (L:XMLVAR_COM_1_VHF_C_Switch_Down) (L:XMLVAR_COM_2_VHF_C_Switch_Down) or (>K:COM2_RECEIVE_SELECT)
- (L:XMLVAR_COM_1_VHF_R_Switch_Down) (L:XMLVAR_COM_2_VHF_R_Switch_Down) or (>K:COM3_RECEIVE_SELECT)
- 0 (>I:XMLVAR_COM_UpdateReceivers)
- }
-
- (A:COM RECEIVE EX1:1, Bool) if{
- (L:XMLVAR_COM_1_VHF_L_Switch_Down) (L:XMLVAR_COM_2_VHF_L_Switch_Down) or if{
- (L:XMLVAR_COM_1_VHF_L_Switch_Down) (L:XMLVAR_COM_2_VHF_L_Switch_Down) and if{
- (L:XMLVAR_COM_1_Volume_VHF_L) (L:XMLVAR_COM_2_Volume_VHF_L) max max 100 * (>K:COM1_VOLUME_SET)
- } els{
- 1 (L:XMLVAR_COM_1_VHF_L_Switch_Down) == if{
- (L:XMLVAR_COM_1_Volume_VHF_L) 100 * (>K:COM1_VOLUME_SET)
- } els{
- (L:XMLVAR_COM_2_Volume_VHF_L) 100 * (>K:COM1_VOLUME_SET)
-
- }
- }
- }
- } els{
- 0 (>K:COM1_VOLUME_SET)
- }
-
- (A:COM RECEIVE EX1:2, Bool) if{
- (L:XMLVAR_COM_1_VHF_C_Switch_Down) (L:XMLVAR_COM_2_VHF_C_Switch_Down) or if{
- (L:XMLVAR_COM_1_VHF_C_Switch_Down) (L:XMLVAR_COM_2_VHF_C_Switch_Down) and if{
- (L:XMLVAR_COM_1_Volume_VHF_C) (L:XMLVAR_COM_2_Volume_VHF_C) max max 100 * (>K:COM2_VOLUME_SET)
- } els{
- 1 (L:XMLVAR_COM_1_VHF_C_Switch_Down) == if{
- (L:XMLVAR_COM_1_Volume_VHF_C) 100 * (>K:COM2_VOLUME_SET)
- } els{
- (L:XMLVAR_COM_2_Volume_VHF_C) 100 * (>K:COM2_VOLUME_SET)
- }
- }
- }
- } els{
- 0 (>K:COM2_VOLUME_SET)
- }
-
- (A:COM RECEIVE EX1:3, Bool) if{
- (L:XMLVAR_COM_1_VHF_R_Switch_Down) (L:XMLVAR_COM_2_VHF_R_Switch_Down) or if{
- (L:XMLVAR_COM_1_VHF_R_Switch_Down) (L:XMLVAR_COM_2_VHF_R_Switch_Down) and if{
- (L:XMLVAR_COM_1_Volume_VHF_R) (L:XMLVAR_COM_2_Volume_VHF_R) max max 100 * (>K:COM3_VOLUME_SET)
- } els{
- 1 (L:XMLVAR_COM_1_VHF_R_Switch_Down) == if{
- (L:XMLVAR_COM_1_Volume_VHF_R) 100 * (>K:COM3_VOLUME_SET)
- } els{
- (L:XMLVAR_COM_2_Volume_VHF_R) 100 * (>K:COM3_VOLUME_SET)
- }
- }
- }
- } els{
- 0 (>K:COM3_VOLUME_SET)
- }
-
-
-
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 @@
+
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
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
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
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
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
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
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
-
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
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 91d5f91b9d8..cc7229703bf 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 @@
-
+
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
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);
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 @@
+
+
+
+ turnknob
+ TT:COCKPIT.TOOLTIPS.WIPERS_SET_OFF
+ TT:COCKPIT.TOOLTIPS.WIPERS_SET_SLOW
+ TT:COCKPIT.TOOLTIPS.WIPERS_SET_FAST
+
+
+
+ 0 (>L:A32NX_AUDIOSWITCHING_KNOB)
+ 1 (>L:A32NX_AUDIOSWITCHING_KNOB)
+ 2 (>L:A32NX_AUDIOSWITCHING_KNOB)
+ (L:A32NX_AUDIOSWITCHING_KNOB) 0 ==
+ (L:A32NX_AUDIOSWITCHING_KNOB) 1 ==
+ (L:A32NX_AUDIOSWITCHING_KNOB) 2 ==
+
+
+
+
+
+
+
+
+ #NODE_ID#
+ #NODE_ID#
+ Vertical
+ clds
+ 200 (>L:A32NX_ACP#ID#_SWITCH_INT)
+ 100 (>L:A32NX_ACP#ID#_SWITCH_INT)
+ 0 (>L:A32NX_ACP#ID#_SWITCH_INT)
+ 9999999
+ 0.01
+ 1
+ (L:A32NX_ACP#ID#_SWITCH_INT)
+
+
+
+
+
+
+
+
+ False
+
+
+ #SEQ2_POWERED#
+
+
+ 1
+
+
+ ASOBO_GT_Knob_Finite_Switch
+ ANIM_CODE_SWITCH
+ False
+ False
+
+
+
+
+
+ KNOB
+ FBW_AIRLINER_Audio_Volume_Knob_Template
+ #NODE_ID_RECEIVER_VHF_L#
+ #NODE_ID_LIGHT_RECEIVER_VHF_L#
+ #ANIM_NAME_KNOB_RECEIVER_VHF_L#
+ #ANIM_NAME_PUSH_RECEIVER_VHF_L#
+ VHF1
+ TT:COCKPIT.TOOLTIPS.TRANSMITTER_VHF_L_VOLUME_DEC
+ TT:COCKPIT.TOOLTIPS.TRANSMITTER_VHF_L_VOLUME_INC
+ TT:COCKPIT.TOOLTIPS.TRANSMITTER_VHF_L_AUDIO_TOGGLE
+
+
+
+ BUTTON
+ FBW_AIRLINER_Audio_Push_Transmit_Template
+ #NODE_ID_BUTTON_VHF_L#
+ #ANIM_NAME_BUTTON_VHF_L#
+ #NODE_ID_BUTTON_SEQ1_VHF_L#
+ #NODE_ID_BUTTON_SEQ2_VHF_L#
+ 1
+ TT:COCKPIT.TOOLTIPS.TRANSMITTER_SELECT_VHF_L
+
+
+
+ KNOB
+ FBW_AIRLINER_Audio_Volume_Knob_Template
+ #NODE_ID_RECEIVER_VHF_C#
+ #NODE_ID_LIGHT_RECEIVER_VHF_C#
+ #ANIM_NAME_KNOB_RECEIVER_VHF_C#
+ #ANIM_NAME_PUSH_RECEIVER_VHF_C#
+ VHF2
+ TT:COCKPIT.TOOLTIPS.TRANSMITTER_VHF_C_VOLUME_DEC
+ TT:COCKPIT.TOOLTIPS.TRANSMITTER_VHF_C_VOLUME_INC
+ TT:COCKPIT.TOOLTIPS.TRANSMITTER_VHF_C_AUDIO_TOGGLE
+
+
+
+ BUTTON
+ FBW_AIRLINER_Audio_Push_Transmit_Template
+ #NODE_ID_BUTTON_VHF_C#
+ #ANIM_NAME_BUTTON_VHF_C#
+ #NODE_ID_BUTTON_SEQ1_VHF_C#
+ #NODE_ID_BUTTON_SEQ2_VHF_C#
+ 2
+ TT:COCKPIT.TOOLTIPS.TRANSMITTER_SELECT_VHF_C
+
+
+
+ KNOB
+ FBW_AIRLINER_Audio_Volume_Knob_Template
+ #NODE_ID_RECEIVER_VHF_R#
+ #NODE_ID_LIGHT_RECEIVER_VHF_R#
+ #ANIM_NAME_KNOB_RECEIVER_VHF_R#
+ #ANIM_NAME_PUSH_RECEIVER_VHF_R#
+ VHF3
+ TT:COCKPIT.TOOLTIPS.TRANSMITTER_VHF_R_VOLUME_DEC
+ TT:COCKPIT.TOOLTIPS.TRANSMITTER_VHF_R_VOLUME_INC
+ TT:COCKPIT.TOOLTIPS.TRANSMITTER_VHF_R_AUDIO_TOGGLE
+
+
+
+ BUTTON
+ FBW_AIRLINER_Audio_Push_Transmit_Template
+ #NODE_ID_BUTTON_VHF_R#
+ #ANIM_NAME_BUTTON_VHF_R#
+ #NODE_ID_BUTTON_SEQ1_VHF_R#
+ #NODE_ID_BUTTON_SEQ2_VHF_R#
+ 3
+ TT:COCKPIT.TOOLTIPS.TRANSMITTER_SELECT_VHF_R
+
+
+
+ KNOB
+ FBW_AIRLINER_Audio_Volume_Knob_Template
+ #NODE_ID_RECEIVER_HF1#
+ #NODE_ID_LIGHT_RECEIVER_HF1#
+ #ANIM_NAME_KNOB_RECEIVER_HF1#
+ #ANIM_NAME_PUSH_RECEIVER_HF1#
+ HF1
+ TT:COCKPIT.TOOLTIPS.TRANSMITTER_HF_L_VOLUME_DEC
+ TT:COCKPIT.TOOLTIPS.TRANSMITTER_HF_L_VOLUME_INC
+ TT:COCKPIT.TOOLTIPS.TRANSMITTER_HF_L_AUDIO_TOGGLE
+
+
+
+ BUTTON
+ FBW_AIRLINER_Audio_Push_Transmit_Template
+ #NODE_ID_BUTTON_HF1#
+ #ANIM_NAME_BUTTON_HF1#
+ #NODE_ID_BUTTON_SEQ1_HF1#
+ #NODE_ID_BUTTON_SEQ2_HF1#
+ 4
+ TT:COCKPIT.TOOLTIPS.TRANSMITTER_SELECT_HF_L
+
+
+
+ KNOB
+ FBW_AIRLINER_Audio_Volume_Knob_Template
+ #NODE_ID_RECEIVER_HF2#
+ #NODE_ID_LIGHT_RECEIVER_HF2#
+ #ANIM_NAME_KNOB_RECEIVER_HF2#
+ #ANIM_NAME_PUSH_RECEIVER_HF2#
+ HF2
+ TT:COCKPIT.TOOLTIPS.TRANSMITTER_HF_R_VOLUME_DEC
+ TT:COCKPIT.TOOLTIPS.TRANSMITTER_HF_R_VOLUME_INC
+ TT:COCKPIT.TOOLTIPS.TRANSMITTER_HF_R_AUDIO_TOGGLE
+
+
+
+ BUTTON
+ FBW_AIRLINER_Audio_Push_Transmit_Template
+ #NODE_ID_BUTTON_HF2#
+ #ANIM_NAME_BUTTON_HF2#
+ #NODE_ID_BUTTON_SEQ1_HF2#
+ #NODE_ID_BUTTON_SEQ2_HF2#
+ 5
+ TT:COCKPIT.TOOLTIPS.TRANSMITTER_SELECT_HF_R
+
+
+
+ KNOB
+ FBW_AIRLINER_Audio_Volume_Knob_Template
+ #NODE_ID_RECEIVER_MECH#
+ #NODE_ID_LIGHT_RECEIVER_MECH#
+ #ANIM_NAME_KNOB_RECEIVER_MECH#
+ #ANIM_NAME_PUSH_RECEIVER_MECH#
+ MECH
+ TT:COCKPIT.TOOLTIPS.TRANSMITTER_INT_VOLUME_DEC
+ TT:COCKPIT.TOOLTIPS.TRANSMITTER_INT_VOLUME_INC
+ TT:COCKPIT.TOOLTIPS.TRANSMITTER_INT_AUDIO_TOGGLE
+
+
+
+ BUTTON
+ FBW_AIRLINER_Audio_Push_Transmit_Template
+ #NODE_ID_BUTTON_MECH#
+ #ANIM_NAME_BUTTON_MECH#
+ #NODE_ID_BUTTON_SEQ1_MECH#
+ #NODE_ID_BUTTON_SEQ2_MECH#
+ 6
+ TT:COCKPIT.TOOLTIPS.TRANSMITTER_SELECT_INT
+
+
+
+ KNOB
+ FBW_AIRLINER_Audio_Volume_Knob_Template
+ #NODE_ID_RECEIVER_ATT#
+ #NODE_ID_LIGHT_RECEIVER_ATT#
+ #ANIM_NAME_KNOB_RECEIVER_ATT#
+ #ANIM_NAME_PUSH_RECEIVER_ATT#
+ ATT
+ TT:COCKPIT.TOOLTIPS.TRANSMITTER_CAB_VOLUME_DEC
+ TT:COCKPIT.TOOLTIPS.TRANSMITTER_CAB_VOLUME_INC
+ TT:COCKPIT.TOOLTIPS.TRANSMITTER_CAB_AUDIO_TOGGLE
+
+
+
+ BUTTON
+ FBW_AIRLINER_Audio_Push_Transmit_Template
+ #NODE_ID_BUTTON_ATT#
+ #ANIM_NAME_BUTTON_ATT#
+ #NODE_ID_BUTTON_SEQ1_ATT#
+ #NODE_ID_BUTTON_SEQ2_ATT#
+ 7
+ TT:COCKPIT.TOOLTIPS.TRANSMITTER_SELECT_CAB
+
+
+
+ KNOB
+ FBW_AIRLINER_Audio_Volume_Knob_Template
+ #NODE_ID_RECEIVER_PA#
+ #NODE_ID_LIGHT_RECEIVER_PA#
+ #ANIM_NAME_KNOB_RECEIVER_PA#
+ #ANIM_NAME_PUSH_RECEIVER_PA#
+ PA
+ TT:COCKPIT.TOOLTIPS.TRANSMITTER_PA_VOLUME_DEC
+ TT:COCKPIT.TOOLTIPS.TRANSMITTER_PA_VOLUME_INC
+ TT:COCKPIT.TOOLTIPS.TRANSMITTER_PA_AUDIO_TOGGLE
+
+
+
+ BUTTON
+ #NODE_ID_BUTTON_PA#
+ #ANIM_NAME_BUTTON_PA#
+ #NODE_ID_BUTTON_SEQ1_PA#
+ #NODE_ID_BUTTON_SEQ2_PA#
+
+ (L:A32NX_ACP#ID#_TRANSMIT_CHANNEL) (>O:A32NX_ACP#ID#_TRANSMIT_CHANNEL_SAVED)
+ 8 (>L:A32NX_ACP#ID#_TRANSMIT_PUSHED)
+
+
+ (O:A32NX_ACP#ID#_TRANSMIT_CHANNEL_SAVED) (>L:A32NX_ACP#ID#_TRANSMIT_PUSHED)
+
+
+ (L:A32NX_ACP#ID#_TRANSMIT_CHANNEL) 8 == #EMISSIVE_TEST# or
+
+ TT:COCKPIT.TOOLTIPS.TRANSMITTER_SELECT_PA
+
+
+
+ BUTTON
+ #NODE_ID_RECEIVER_VOICE#
+ #ANIM_NAME_PUSH_RECEIVER_VOICE#
+ #NODE_ID_BUTTON_VOICE_SEQ1#
+ #NODE_ID_BUTTON_VOICE_SEQ2#
+ (L:A32NX_ACP#ID#_VOICE_BUTTON_DOWN) ! (>L:A32NX_ACP#ID#_VOICE_BUTTON_DOWN)
+ fcubutton
+ 0.1
+ fcubutton
+ 0.5
+ (L:A32NX_ACP#ID#_VOICE_BUTTON_DOWN) #EMISSIVE_TEST# or #EMISSIVE_DIM# *
+ %((L:A32NX_ACP#ID#_VOICE_BUTTON_DOWN))%{if}TT:COCKPIT.TOOLTIPS.NAV_PUSHBUTTON_VOICE_OFF%{else}TT:COCKPIT.TOOLTIPS.NAV_PUSHBUTTON_VOICE_ON%{end}
+
+
+
+ BUTTON
+ #NODE_ID_RECEIVER_RESET#
+ #ANIM_NAME_PUSH_RECEIVER_RESET#
+ 1 (>L:A32NX_ACP#ID#_RESET_BUTTON_DOWN)
+ fcubutton
+ 0.1
+ fcubutton
+ 0.5
+ TT:COCKPIT.TOOLTIPS.NAV_PUSHBUTTON_RESET
+
+
+
+ KNOB
+ FBW_AIRLINER_Audio_Volume_Knob_Template
+ #NODE_ID_RECEIVER_VOR1#
+ #NODE_ID_LIGHT_RECEIVER_VOR1#
+ #ANIM_NAME_KNOB_RECEIVER_VOR1#
+ #ANIM_NAME_PUSH_RECEIVER_VOR1#
+ VOR1
+ TT:COCKPIT.TOOLTIPS.TRANSMITTER_VOR1_VOLUME_DEC
+ TT:COCKPIT.TOOLTIPS.TRANSMITTER_VOR1_VOLUME_INC
+ %((L:A32NX_ACP#ID#_VOR1_KNOB_VOLUME_DOWN))%{if}TT:INPUT.KEY_RADIO_VOR1_IDENT_DISABLE_DESC%{else}TT:INPUT.KEY_RADIO_VOR1_IDENT_ENABLE_DESC%{end}
+
+
+
+ KNOB
+ FBW_AIRLINER_Audio_Volume_Knob_Template
+ #NODE_ID_RECEIVER_VOR2#
+ #NODE_ID_LIGHT_RECEIVER_VOR2#
+ #ANIM_NAME_KNOB_RECEIVER_VOR2#
+ #ANIM_NAME_PUSH_RECEIVER_VOR2#
+ VOR2
+ TT:COCKPIT.TOOLTIPS.TRANSMITTER_VOR2_VOLUME_DEC
+ TT:COCKPIT.TOOLTIPS.TRANSMITTER_VOR2_VOLUME_INC
+ %((L:A32NX_ACP#ID#_VOR2_KNOB_VOLUME_DOWN))%{if}TT:INPUT.KEY_RADIO_VOR2_IDENT_DISABLE_DESC%{else}TT:INPUT.KEY_RADIO_VOR2_IDENT_ENABLE_DESC%{end}
+
+
+
+ KNOB
+ FBW_AIRLINER_Audio_Volume_Knob_Template
+ #NODE_ID_RECEIVER_MKR#
+ #NODE_ID_LIGHT_RECEIVER_MKR#
+ #ANIM_NAME_KNOB_RECEIVER_MKR#
+ #ANIM_NAME_PUSH_RECEIVER_MKR#
+ MKR
+ TT:COCKPIT.TOOLTIPS.NAV_KNOB_MARKERS_VOLUME_DECREASE
+ TT:COCKPIT.TOOLTIPS.NAV_KNOB_MARKERS_VOLUME_INCREASE
+ %((L:A32NX_ACP#ID#_MKR_KNOB_VOLUME_DOWN))%{if}TT:COCKPIT.TOOLTIPS.NAV_KNOB_MARKERS_IDENT_DISABLE%{else}TT:COCKPIT.TOOLTIPS.NAV_KNOB_MARKERS_IDENT_ENABLE%{end}
+
+
+
+ KNOB
+ FBW_AIRLINER_Audio_Volume_Knob_Template
+ #NODE_ID_RECEIVER_ILS#
+ #NODE_ID_LIGHT_RECEIVER_ILS#
+ #ANIM_NAME_KNOB_RECEIVER_ILS#
+ #ANIM_NAME_PUSH_RECEIVER_ILS#
+ #NODE_ID_LED_RECEIVER_ILS#
+ ILS
+ TT:COCKPIT.TOOLTIPS.NAV_KNOB_ILS_VOLUME_DECREASE
+ TT:COCKPIT.TOOLTIPS.NAV_KNOB_ILS_VOLUME_INCREASE
+ %((L:A32NX_ACP#ID#_ILS_KNOB_VOLUME_DOWN))%{if}TT:COCKPIT.TOOLTIPS.NAV_KNOB_ILS_IDENT_DISABLE%{else}TT:COCKPIT.TOOLTIPS.NAV_KNOB_ILS_IDENT_ENABLE%{end}
+
+
+
+ KNOB
+ FBW_AIRLINER_Audio_Volume_Knob_Template
+ #NODE_ID_RECEIVER_MLS#
+ #NODE_ID_LIGHT_RECEIVER_MLS#
+ #ANIM_NAME_KNOB_RECEIVER_MLS#
+ #ANIM_NAME_PUSH_RECEIVER_MLS#
+ #NODE_ID_LED_RECEIVER_MLS#
+ MLS
+ TT:COCKPIT.TOOLTIPS.NAV_KNOB_ILS_VOLUME_DECREASE
+ TT:COCKPIT.TOOLTIPS.NAV_KNOB_ILS_VOLUME_INCREASE
+ %((L:A32NX_ACP#ID#_MLS_KNOB_VOLUME_DOWN))%{if}TT:COCKPIT.TOOLTIPS.NAV_KNOB_ILS_IDENT_DISABLE%{else}TT:COCKPIT.TOOLTIPS.NAV_KNOB_ILS_IDENT_ENABLE%{end}
+
+
+
+ KNOB
+ FBW_AIRLINER_Audio_Volume_Knob_Template
+ #NODE_ID_RECEIVER_ADF1#
+ #NODE_ID_LIGHT_RECEIVER_ADF1#
+ #ANIM_NAME_KNOB_RECEIVER_ADF1#
+ #ANIM_NAME_PUSH_RECEIVER_ADF1#
+ #NODE_ID_LED_RECEIVER_ADF1#
+ ADF1
+ TT:COCKPIT.TOOLTIPS.TRANSMITTER_ADF1_VOLUME_DEC
+ TT:COCKPIT.TOOLTIPS.TRANSMITTER_ADF1_VOLUME_INC
+ %((L:A32NX_ACP#ID#_ADF1_KNOB_VOLUME_DOWN))%{if}TT:INPUT.KEY_RADIO_ADF_IDENT_DISABLE_DESC%{else}TT:INPUT.KEY_RADIO_ADF_IDENT_ENABLE_DESC%{end}
+
+
+
+ KNOB
+ FBW_AIRLINER_Audio_Volume_Knob_Template
+ #NODE_ID_RECEIVER_ADF2#
+ #NODE_ID_LIGHT_RECEIVER_ADF2#
+ #ANIM_NAME_KNOB_RECEIVER_ADF2#
+ #ANIM_NAME_PUSH_RECEIVER_ADF2#
+ #NODE_ID_LED_RECEIVER_ADF2#
+ ADF2
+ TT:COCKPIT.TOOLTIPS.TRANSMITTER_ADF2_VOLUME_DEC
+ TT:COCKPIT.TOOLTIPS.TRANSMITTER_ADF2_VOLUME_INC
+ %((L:A32NX_ACP#ID#_ADF2_KNOB_VOLUME_DOWN))%{if}TT:INPUT.KEY_RADIO_ADF2_IDENT_DISABLE_DESC%{else}TT:INPUT.KEY_RADIO_ADF2_IDENT_ENABLE_DESC%{end}
+
+
+
+ #NODE_ID_SWITCH_INT#
+ RMP_SWITCH_INT_#SIDE#
+ SWITCH
+ FBW_Switch_INT_RAD
+ 0.1
+ 0.5
+ #NODE_ID_SWITCH_INT#
+ lswitch
+ lswitch
+
+
+
+
+
+
+ #TRANSMIT_ID# (L:A32NX_ACP#ID#_TRANSMIT_PUSHED) != if{
+ #TRANSMIT_ID# (>L:A32NX_ACP#ID#_TRANSMIT_PUSHED)
+ } els{
+ 0 (>L:A32NX_ACP#ID#_TRANSMIT_PUSHED)
+ }
+
+
+
+
+ #SEQ1_POWERED# (L:A32NX_ACP#ID#_TRANSMIT_CHANNEL) #TRANSMIT_ID# == and #EMISSIVE_TEST# or #EMISSIVE_DIM# *
+
+ #SEQ1_POWERED# #EMISSIVE_TEST# and
+ fcubutton
+ 0.1
+ fcubutton
+ 0.5
+
+
+
+
+
+
+
+
+
+ ASOBO_GT_Knob_Finite_Switch
+ ANIM_CODE_SWITCH
+
+
+
+
+ #ANIM_NAME_KNOB#
+ 1
+ 0
+ 1
+ TurnLeft
+ TurnRight
+ Hand
+ #TOOLTIP_LEFT#
+ #TOOLTIP_RIGHT#
+ #TOOLTIP_HAND#
+ True
+ False
+ False
+ 0.002
+ (L:A32NX_ACP#ID#_#FREQ_ID#_VOLUME)
+
+ (L:A32NX_ACP#ID#_#FREQ_ID#_VOLUME) #VOLUME_INCREMENT# + 100 min (>L:A32NX_ACP#ID#_#FREQ_ID#_VOLUME)
+
+
+ (L:A32NX_ACP#ID#_#FREQ_ID#_VOLUME) #VOLUME_INCREMENT# - 0 max (>L:A32NX_ACP#ID#_#FREQ_ID#_VOLUME)
+
+ (L:A32NX_ACP#ID#_#FREQ_ID#_KNOB_VOLUME_DOWN) 100 *
+ #ANIM_NAME_SWITCH#
+
+ (L:A32NX_ACP#ID#_#FREQ_ID#_KNOB_VOLUME_DOWN) ! (>L:A32NX_ACP#ID#_#FREQ_ID#_KNOB_VOLUME_DOWN)
+
+
+ mcdubuttons
+ 0.1
+ mcdubuttons
+ 0.5
+ 36
+
+
+
+
+
+
+ #SEQ1_POWERED# #INDICATORS_POWERED# and if{
+ (L:A32NX_ACP#ID#_#FREQ_ID#_KNOB_VOLUME_DOWN, bool) #EMISSIVE_TEST# or #EMISSIVE_DIM# *
+ }
+
+
+
+
+
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 @@
- 0
PUSH_RADIO#SIDE#_#BASE_NAME#_SEQ2
- let inop = #INOP, boolean#;
let indicatorsPowered = #INDICATORS_POWERED, bool#;
let modeId = #MODE_ID, number#;
- alias toggleSwitch = (L:A32NX_RMP_#SIDE#_TOGGLE_SWITCH, bool);
alias selectedMode = (L:A32NX_RMP_#SIDE#_SELECTED_MODE, number);
- alias navButtonPressed = (L:A32NX_RMP_#SIDE#_NAV_BUTTON_SELECTED, bool);
- 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 };
- (if ((!inop and toggleSwitch and ((selectedMode == modeId) or (modeId == 12 and navButtonPressed))) or ((annunciatorLight == 0) and dc2Powered)) and indicatorsPowered {
- 1 * emissiveDim
+ alias navButtonPressed = (L:A32NX_RMP_#SIDE#_NAV_BACKUP_MODE, bool);
+ (if #RMP_POWERED, bool# and indicatorsPowered and (selectedMode == modeId or (modeId == 6 and navButtonPressed) or #EMISSIVE_TEST, bool#) {
+ #EMISSIVE_DIM, number#
} else {
0
})
@@ -367,21 +331,8 @@
-
- let inop = #INOP, boolean#;
- let indicatorsPowered = #INDICATORS_POWERED, bool#;
- let modeId = #MODE_ID, number#;
- alias toggleSwitch = (L:A32NX_RMP_#SIDE#_TOGGLE_SWITCH, bool);
- alias availableMode = (L:A32NX_RMP_#SIDE#_AVAILABLE_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 };
- (if (!inop and toggleSwitch and (availableMode == modeId) or ((annunciatorLight == 0) and dc2Powered)) and indicatorsPowered {
- 1 * emissiveDim
- } else {
- 0
- })
-
+
+ 0
@@ -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# *
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);
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,
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..8710887c093 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..05cc43d43e7 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 ;
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..95d9066c1e6 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(
-
-
+
+
,
);
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..4fc93bd05ed 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,7 @@ 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 +4723,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: [],
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);
}
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 {
diff --git a/fbw-a380x/src/base/flybywire-aircraft-a380-842/SimObjects/AirPlanes/FlyByWire_A380_842/model/behaviour/legacy/Airbus.xml b/fbw-a380x/src/base/flybywire-aircraft-a380-842/SimObjects/AirPlanes/FlyByWire_A380_842/model/behaviour/legacy/Airbus.xml
index 19fcd8c2151..5bc85179f3f 100644
--- a/fbw-a380x/src/base/flybywire-aircraft-a380-842/SimObjects/AirPlanes/FlyByWire_A380_842/model/behaviour/legacy/Airbus.xml
+++ b/fbw-a380x/src/base/flybywire-aircraft-a380-842/SimObjects/AirPlanes/FlyByWire_A380_842/model/behaviour/legacy/Airbus.xml
@@ -754,6 +754,8 @@
+
AIRBUS_Push_Autopilot_#BTN_ID#_#ID#
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..e75e89985e0
--- /dev/null
+++ b/fbw-common/src/wasm/systems/systems/src/communications/audio_control_panel.rs
@@ -0,0 +1,469 @@
+use super::audio_management_unit::{
+ IdentificationWordAudioManagementUnitAudioControlPanel,
+ LabelWordAudioManagementUnitAudioControlPanel, WordAudioManagementUnitAudioControlPanelInfo,
+ 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 => panic!("Unknown Transmit ID {i}"),
+ }
+ }
+}
+
+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([
+ WordAudioManagementUnitAudioControlPanelInfo::new(
+ IdentificationWordAudioManagementUnitAudioControlPanel::Word0,
+ 0,
+ LabelWordAudioManagementUnitAudioControlPanel::Label300Request,
+ ),
+ WordAudioManagementUnitAudioControlPanelInfo::new(
+ IdentificationWordAudioManagementUnitAudioControlPanel::WordAudioManagementUnit,
+ 0,
+ LabelWordAudioManagementUnitAudioControlPanel::Label301AudioManagementUnit,
+ ),
+ WordAudioManagementUnitAudioControlPanelInfo::new(
+ IdentificationWordAudioManagementUnitAudioControlPanel::Word01,
+ 1,
+ LabelWordAudioManagementUnitAudioControlPanel::Label210VolumeControlVhf,
+ ),
+ WordAudioManagementUnitAudioControlPanelInfo::new(
+ IdentificationWordAudioManagementUnitAudioControlPanel::Word02,
+ 2,
+ LabelWordAudioManagementUnitAudioControlPanel::Label210VolumeControlVhf,
+ ),
+ WordAudioManagementUnitAudioControlPanelInfo::new(
+ IdentificationWordAudioManagementUnitAudioControlPanel::Word03,
+ 3,
+ LabelWordAudioManagementUnitAudioControlPanel::Label210VolumeControlVhf,
+ ),
+ WordAudioManagementUnitAudioControlPanelInfo::new(
+ IdentificationWordAudioManagementUnitAudioControlPanel::Word04,
+ 1,
+ LabelWordAudioManagementUnitAudioControlPanel::Label211VolumeControlHf,
+ ),
+ WordAudioManagementUnitAudioControlPanelInfo::new(
+ IdentificationWordAudioManagementUnitAudioControlPanel::Word05,
+ 2,
+ LabelWordAudioManagementUnitAudioControlPanel::Label211VolumeControlHf,
+ ),
+ WordAudioManagementUnitAudioControlPanelInfo::new(
+ IdentificationWordAudioManagementUnitAudioControlPanel::Word06,
+ 1,
+ LabelWordAudioManagementUnitAudioControlPanel::Label215VolumeControlIntCab,
+ ),
+ WordAudioManagementUnitAudioControlPanelInfo::new(
+ IdentificationWordAudioManagementUnitAudioControlPanel::Word07,
+ 2,
+ LabelWordAudioManagementUnitAudioControlPanel::Label215VolumeControlIntCab,
+ ),
+ WordAudioManagementUnitAudioControlPanelInfo::new(
+ IdentificationWordAudioManagementUnitAudioControlPanel::Word08,
+ 3,
+ LabelWordAudioManagementUnitAudioControlPanel::Label212VolumeControlAdfPa,
+ ),
+ WordAudioManagementUnitAudioControlPanelInfo::new(
+ IdentificationWordAudioManagementUnitAudioControlPanel::Word09,
+ 1,
+ LabelWordAudioManagementUnitAudioControlPanel::Label213VolumeControlVorMkr,
+ ),
+ WordAudioManagementUnitAudioControlPanelInfo::new(
+ IdentificationWordAudioManagementUnitAudioControlPanel::Word10,
+ 2,
+ LabelWordAudioManagementUnitAudioControlPanel::Label213VolumeControlVorMkr,
+ ),
+ WordAudioManagementUnitAudioControlPanelInfo::new(
+ IdentificationWordAudioManagementUnitAudioControlPanel::Word11,
+ 3,
+ LabelWordAudioManagementUnitAudioControlPanel::Label213VolumeControlVorMkr,
+ ),
+ WordAudioManagementUnitAudioControlPanelInfo::new(
+ IdentificationWordAudioManagementUnitAudioControlPanel::Word12,
+ 0,
+ LabelWordAudioManagementUnitAudioControlPanel::Label217VolumeControlIls,
+ ),
+ WordAudioManagementUnitAudioControlPanelInfo::new(
+ IdentificationWordAudioManagementUnitAudioControlPanel::Word15,
+ 1,
+ LabelWordAudioManagementUnitAudioControlPanel::Label212VolumeControlAdfPa,
+ ),
+ WordAudioManagementUnitAudioControlPanelInfo::new(
+ IdentificationWordAudioManagementUnitAudioControlPanel::Word16,
+ 2,
+ LabelWordAudioManagementUnitAudioControlPanel::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,
+ LabelWordAudioManagementUnitAudioControlPanel::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);
+
+ let (volume, knob) = match self.list_arinc_words[index].get_identification() {
+ IdentificationWordAudioManagementUnitAudioControlPanel::Word01 => {
+ (self.vhfs[0].volume, self.vhfs[0].knob)
+ }
+ IdentificationWordAudioManagementUnitAudioControlPanel::Word02 => {
+ (self.vhfs[1].volume, self.vhfs[1].knob)
+ }
+ IdentificationWordAudioManagementUnitAudioControlPanel::Word03 => {
+ (self.vhfs[2].volume, self.vhfs[2].knob)
+ }
+ IdentificationWordAudioManagementUnitAudioControlPanel::Word04 => {
+ (self.comms[0].volume, self.comms[0].knob)
+ }
+ IdentificationWordAudioManagementUnitAudioControlPanel::Word05 => {
+ (self.comms[1].volume, self.comms[1].knob)
+ }
+ IdentificationWordAudioManagementUnitAudioControlPanel::Word06 => {
+ (self.comms[2].volume, self.comms[2].knob)
+ }
+ IdentificationWordAudioManagementUnitAudioControlPanel::Word07 => {
+ (self.comms[3].volume, self.comms[3].knob)
+ }
+ IdentificationWordAudioManagementUnitAudioControlPanel::Word08 => {
+ (self.comms[4].volume, self.comms[4].knob)
+ }
+ IdentificationWordAudioManagementUnitAudioControlPanel::Word09 => {
+ (self.vors[0].volume, self.vors[0].knob)
+ }
+ IdentificationWordAudioManagementUnitAudioControlPanel::Word10 => {
+ (self.vors[1].volume, self.vors[1].knob)
+ }
+ IdentificationWordAudioManagementUnitAudioControlPanel::Word11 => {
+ (self.markers.volume, self.markers.knob)
+ }
+ IdentificationWordAudioManagementUnitAudioControlPanel::Word12 => {
+ (self.ils.volume, self.ils.knob)
+ }
+ IdentificationWordAudioManagementUnitAudioControlPanel::Word15 => {
+ (self.adfs[0].volume, self.adfs[0].knob)
+ }
+ IdentificationWordAudioManagementUnitAudioControlPanel::Word16 => {
+ (self.adfs[1].volume, self.adfs[1].knob)
+ }
+ i => panic!("Cant find word acp with id {}", i as u32),
+ };
+
+ word_arinc.set_bits(17, volume);
+ word_arinc.set_bit(25, knob);
+ word_arinc.set_bit(26, self.voice_button);
+ word_arinc.set_bit(27, self.reset_button);
+
+ bus_acp.push(word_arinc);
+ }
+
+ fn decode_amu_word(bus: &mut Vec>) -> Option<(TransmitId, bool, bool, u32)> {
+ let label_option: Option =
+ FromPrimitive::from_u32(bus[0].get_bits(8, 1));
+
+ label_option.and_then(|label| {
+ if label == LabelWordAudioManagementUnitAudioControlPanel::Label301AudioManagementUnit {
+ let word = bus.remove(0);
+ Some((
+ TransmitId::from(word.get_bits(4, 11)),
+ word.get_bit(15),
+ word.get_bit(16),
+ word.get_bits(5, 25),
+ ))
+ } else {
+ None
+ }
+ })
+ }
+
+ 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
+ if let Some((transmit_channel, _call_mech, _call_att, _calls)) =
+ AudioControlPanel::decode_amu_word(bus_acp)
+ {
+ self.transmit_channel = transmit_channel;
+ // 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 very slow responsiveness of ACP
+ // 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 >= TIMEOUT {
+ self.send_word_0(bus_acp);
+ self.last_complete_cycle_sent = Duration::from_millis(0);
+ }
+
+ let transmission_pb_pushed = 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) {
+ accept_iterable!(self.vhfs, visitor);
+ accept_iterable!(self.comms, visitor);
+ accept_iterable!(self.adfs, visitor);
+ accept_iterable!(self.vors, 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 = reader.read(&self.volume_id);
+ let knob = reader.read(&self.knob_id);
+
+ self.changed = volume != self.volume || knob != self.knob;
+
+ self.volume = volume;
+ self.knob = knob;
+ }
+}
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..c9af74062c0
--- /dev/null
+++ b/fbw-common/src/wasm/systems/systems/src/communications/audio_management_unit.rs
@@ -0,0 +1,816 @@
+use crate::{
+ //communications::receivers::*,
+ shared::{
+ arinc429::{Arinc429Word, SignStatus},
+ ElectricalBusType, ElectricalBuses,
+ },
+ simulation::{
+ InitContext, Read, Reader, SideControlling, SimulationElement, SimulationElementVisitor,
+ SimulatorReader, SimulatorWriter, UpdateContext, VariableIdentifier, Write, Writer,
+ },
+};
+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: Duration = Duration::from_millis(160);
+
+enum TypeCard {
+ Selcal(Selcal),
+ Bite(Bite),
+}
+
+pub struct WordAudioManagementUnitAudioControlPanelInfo {
+ identification: IdentificationWordAudioManagementUnitAudioControlPanel,
+ sdi: u32,
+ label: LabelWordAudioManagementUnitAudioControlPanel,
+}
+impl WordAudioManagementUnitAudioControlPanelInfo {
+ pub fn new(
+ identification: IdentificationWordAudioManagementUnitAudioControlPanel,
+ // sdi is a term used in the protocol documentation to describe which subsystem/instrument
+ // of a group is being monitored. For instance, 1 for VOR1, 2 for VOR2.
+ // I don't know what it stands for though
+ sdi: u32,
+ label: LabelWordAudioManagementUnitAudioControlPanel,
+ ) -> Self {
+ Self {
+ identification,
+ sdi,
+ label,
+ }
+ }
+
+ pub fn get_identification(&self) -> IdentificationWordAudioManagementUnitAudioControlPanel {
+ self.identification
+ }
+
+ pub fn get_sdi(&self) -> u32 {
+ self.sdi
+ }
+
+ pub fn get_label(&self) -> LabelWordAudioManagementUnitAudioControlPanel {
+ self.label
+ }
+}
+
+#[derive(Eq, PartialEq, PartialOrd, Copy, Clone)]
+pub enum IdentificationWordAudioManagementUnitAudioControlPanel {
+ Word0,
+ WordAudioManagementUnit,
+ 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 LabelWordAudioManagementUnitAudioControlPanel {
+ Label300Request = 3,
+ Label301AudioManagementUnit = 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 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, Copy, PartialEq, Eq, Clone)]
+pub enum AudioSwitchingKnobPosition {
+ Captain,
+ #[default]
+ Norm,
+ Fo,
+}
+read_write_enum!(AudioSwitchingKnobPosition);
+impl From for AudioSwitchingKnobPosition {
+ fn from(value: f64) -> Self {
+ match value as u8 {
+ 0 => Self::Captain,
+ 2 => Self::Fo,
+ _ => Self::Norm,
+ }
+ }
+}
+
+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,
+}
+
+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()),
+
+ //_FILTER_ACTIVE Should be moved to C++ with an even, same as A380.
+ // beside Morse code generation
+ 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,
+ }
+ }
+
+ pub fn send_amu_word(bus_acp: &mut Vec>, transmission_table: &u32) {
+ let mut word_arinc = Arinc429Word::new(0, SignStatus::NormalOperation);
+
+ word_arinc.set_bits(
+ 1,
+ LabelWordAudioManagementUnitAudioControlPanel::Label301AudioManagementUnit 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 acp_to_take_into_account = if self.audio_switching_knob
+ != AudioSwitchingKnobPosition::Fo
+ && context.side_controlling() == SideControlling::FO
+ {
+ 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
+ {
+ 3
+ } else {
+ 1
+ };
+
+ 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) {
+ accept_iterable!(self.vhfs, visitor);
+ accept_iterable!(self.adfs, visitor);
+ accept_iterable!(self.vors, 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);
+
+ self.audio_switching_knob = reader.read(&self.audio_switching_knob_id);
+
+ 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 {
+ 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,
+ }
+ }
+
+ 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);
+ }
+}
+
+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 > TIMEOUT {
+ self.mixed_audio_acp = Default::default();
+ }
+
+ if self.last_time_data_received_from_acp3 > 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 == LabelWordAudioManagementUnitAudioControlPanel::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 {
+ LabelWordAudioManagementUnitAudioControlPanel::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;
+ }
+ }
+ LabelWordAudioManagementUnitAudioControlPanel::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;
+ }
+ }
+ LabelWordAudioManagementUnitAudioControlPanel::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;
+ }
+ }
+ LabelWordAudioManagementUnitAudioControlPanel::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 {}
+ }
+}
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..2d5d9e72a0c
--- /dev/null
+++ b/fbw-common/src/wasm/systems/systems/src/communications/mod.rs
@@ -0,0 +1,71 @@
+mod audio_control_panel;
+mod audio_management_unit;
+mod radio_management_panel;
+mod receivers;
+
+use crate::simulation::{
+ InitContext, 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: RadioManagementPanel,
+ rmp_fo: RadioManagementPanel,
+
+ sel_light_id: VariableIdentifier,
+ nav_backup_mode_id: VariableIdentifier,
+
+ sel_light: bool,
+ nav_backup_mode: bool,
+}
+
+impl Communications {
+ pub fn new(context: &mut InitContext) -> Self {
+ Self {
+ amu: AudioManagementUnit::new(context),
+ rmp_cpt: RadioManagementPanel::new_cpt(context),
+ rmp_fo: 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()),
+
+ sel_light: false,
+ nav_backup_mode: false,
+ }
+ }
+
+ pub fn update(&mut self, context: &UpdateContext) {
+ self.amu.update(context);
+
+ if self.rmp_cpt.is_powered() && self.rmp_fo.is_powered() {
+ self.sel_light = self.rmp_cpt.is_abnormal_mode() || self.rmp_fo.is_abnormal_mode();
+
+ self.nav_backup_mode =
+ self.rmp_cpt.is_nav_backup_mode() && self.rmp_fo.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.accept(visitor);
+ self.rmp_fo.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/communications/radio_management_panel.rs b/fbw-common/src/wasm/systems/systems/src/communications/radio_management_panel.rs
new file mode 100644
index 00000000000..b35cdc123d2
--- /dev/null
+++ b/fbw-common/src/wasm/systems/systems/src/communications/radio_management_panel.rs
@@ -0,0 +1,123 @@
+use crate::shared::{ElectricalBusType, ElectricalBuses};
+use crate::simulation::{
+ InitContext, Read, Reader, SimulationElement, SimulationElementVisitor, SimulatorReader,
+ VariableIdentifier, Write, Writer,
+};
+
+#[derive(Clone, Copy, Debug, PartialEq, Eq, PartialOrd)]
+enum SelectedMode {
+ Vhf1 = 1,
+ Vhf2,
+ Vhf3,
+ Hf1,
+ Hf2,
+ Nav,
+ Vor,
+ Ils,
+ Mls,
+ Adf,
+ Bfo,
+ Am,
+}
+read_write_enum!(SelectedMode);
+
+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()
+ && (matches!(
+ self.selected_mode,
+ SelectedMode::Vhf3 | SelectedMode::Hf1 | 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 = reader.read(&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);
+ }
+}
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..82137323ec1
--- /dev/null
+++ b/fbw-common/src/wasm/systems/systems/src/communications/receivers.rs
@@ -0,0 +1,243 @@
+use crate::{
+ shared::{ElectricalBusType, ElectricalBuses},
+ simulation::{
+ InitContext, Read, SimulationElement, SimulationElementVisitor, SimulatorReader,
+ SimulatorWriter, UpdateContext, VariableIdentifier, Write,
+ },
+};
+
+use std::time::Duration;
+
+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: Duration,
+ duration_long_beep: Duration,
+ duration_end_of_ident: Duration,
+ duration_current: Duration,
+ duration_to_wait: Duration,
+}
+
+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 = Duration::from_millis(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: Duration::from_millis(0),
+ }
+ }
+
+ // From unpack function in file simvar.ts
+ fn unpack(&self, value: usize) -> impl DoubleEndedIterator- {
+ (0..8).filter_map(move |i| {
+ let code = (value >> (i * 6)) & 0x3f;
+ (code > 0).then(|| char::from_u32((code + 31) as u32).unwrap_or(' '))
+ })
+ }
+
+ fn convert_ident_to_morse(&mut self) -> String {
+ self.unpack(self.ident_new)
+ .flat_map(|c| {
+ // elements counts for number of characters + space between them
+ 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' => "__.. ",
+ _ => " ",
+ }
+ .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 > self.duration_to_wait {
+ // 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);
+ }
+}
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;
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..45a1b904a3b 100644
--- a/fbw-common/src/wasm/systems/systems/src/pneumatic/mod.rs
+++ b/fbw-common/src/wasm/systems/systems/src/pneumatic/mod.rs
@@ -953,7 +953,7 @@ mod tests {
electrical::Electricity,
pneumatic::{DefaultValve, PneumaticContainer, PneumaticPipe},
shared::{ControllerSignal, InternationalStandardAtmosphere, MachNumber},
- simulation::{test::TestVariableRegistry, UpdateContext},
+ simulation::{test::TestVariableRegistry, SideControlling, UpdateContext},
};
use ntest::assert_about_eq;
use std::time::Duration;
@@ -1053,6 +1053,7 @@ mod tests {
Angle::new::(0.),
MachNumber(0.),
Angle::new::(0.),
+ SideControlling::CAPTAIN,
)
}
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..9064733f95f 100644
--- a/fbw-common/src/wasm/systems/systems/src/pneumatic/valve.rs
+++ b/fbw-common/src/wasm/systems/systems/src/pneumatic/valve.rs
@@ -612,7 +612,7 @@ mod tests {
electrical::Electricity,
pneumatic::{DefaultValve, PneumaticContainer, PneumaticPipe},
shared::{ControllerSignal, InternationalStandardAtmosphere, MachNumber},
- simulation::{test::TestVariableRegistry, InitContext},
+ simulation::{test::TestVariableRegistry, InitContext, SideControlling},
};
use std::time::Duration;
@@ -686,6 +686,7 @@ mod tests {
Angle::new::(0.),
MachNumber(0.),
Angle::new::(0.),
+ SideControlling::CAPTAIN,
)
}
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..61eecf268ea 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,20 @@ 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) {
+ debug_assert!((1..=29).contains(&first_bit));
+ 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 {
+ debug_assert!((1..=29).contains(&from_bit));
+ (self.value >> (from_bit - 1)) & ((1 << nb_bits) - 1)
+ }
}
impl From for Arinc429Word {
fn from(simvar: f64) -> Arinc429Word {
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);