diff --git a/.github/CHANGELOG.md b/.github/CHANGELOG.md index c78eaf4f312..d0f325d2388 100644 --- a/.github/CHANGELOG.md +++ b/.github/CHANGELOG.md @@ -62,6 +62,7 @@ 1. [FMGC] Improve procedure loading performance - @tracernz (Mike) 1. [EFB] Added Payload Loading to EFB - @2hwk (2Cas#1022) 1. [MODEL] Remove blue highlights in lock mode - @tracernz (Mike) +1. [RMP] Fixed the behavior of the RMPs and ACPs (VHFs only) - Julian Sebline (Julian Sebline#8476 on Discord) ## 0.8.0 @@ -312,6 +313,7 @@ 1. [ATSU] Add FANS-C simulation for CPDLC - @Sven [de en] - (Sven Czarnian) 1. [ATSU] Add VDL3-simulation of datalink transport protocol - @Sven [de en] - (Sven Czarnian) 1. [FMGC] Improve robustness of ILS auto-tuning - @tracernz (Mike) +1. [OVHD] Fixed fire push button not being able to be stowed - Julian Sebline (Julian Sebline#8476 on Discord) ## 0.7.0 @@ -1094,5 +1096,4 @@ 1. [MISC] Standby Instrument stays ON if emergency power should be available, bug fixes - @2hwk (2Cas#1022 on discord) 1. [CDU] Full +/- button functionality - @lhoenig (Lukas Hoenig) 1. [DCDU] Fixed MSG- and MSG+ button labels - @tyler58546 (tyler58546) -1. [OVHD] Fixed fire push button not being able to be stowed - Julian Sebline (Julian Sebline#8476 on Discord) 1. [ISIS] Fixed issue where ISIS was allowing a bug to be set while in the OFF state - Patrick Macken (@Pat M on Discord) diff --git a/flybywire-aircraft-a320-neo/ModelBehaviorDefs/A32NX/AirlinerCommon.xml b/flybywire-aircraft-a320-neo/ModelBehaviorDefs/A32NX/AirlinerCommon.xml index 50d2598d41e..cf366cabd1c 100644 --- a/flybywire-aircraft-a320-neo/ModelBehaviorDefs/A32NX/AirlinerCommon.xml +++ b/flybywire-aircraft-a320-neo/ModelBehaviorDefs/A32NX/AirlinerCommon.xml @@ -276,7 +276,8 @@ diff --git a/flybywire-aircraft-a320-neo/SimObjects/AirPlanes/FlyByWire_A320_NEO/model/A320_NEO_INTERIOR.xml b/flybywire-aircraft-a320-neo/SimObjects/AirPlanes/FlyByWire_A320_NEO/model/A320_NEO_INTERIOR.xml index c5987bafdd4..49510a1905e 100644 --- a/flybywire-aircraft-a320-neo/SimObjects/AirPlanes/FlyByWire_A320_NEO/model/A320_NEO_INTERIOR.xml +++ b/flybywire-aircraft-a320-neo/SimObjects/AirPlanes/FlyByWire_A320_NEO/model/A320_NEO_INTERIOR.xml @@ -4105,16 +4105,39 @@ + + + + + 1 L - (L:A32NX_ELEC_AC_1_BUS_IS_POWERED, Bool) + (L:A32NX_ELEC_DC_ESS_BUS_IS_POWERED, Bool) (L:A32NX_ELEC_DC_ESS_BUS_IS_POWERED, Bool) + + + 0 (>L:XMLVAR_COM_PANEL1_Transmit_Channel) + 0 (>K:PILOT_TRANSMITTER_SET) + + 1 (>L:XMLVAR_COM_1_VHF_L_Switch_Down) + 1 (>L:XMLVAR_COM_1_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 (>L:XMLVAR_COM_1_Volume_VHF_R) + 0 (>K:COM3_VOLUME_SET) + 1 + L KNOB_AUDIOL_VHF1 PUSH_AUDIOL_VHF1_EMIS KNOB_AUDIOL_VHF1 @@ -4139,9 +4162,6 @@ PUSH_AUDIOL_CALL3 PUSH_AUDIOL_CALL3_SEQ1 PUSH_AUDIOL_CALL3_SEQ2 - (L:A32NX_ELEC_DC_ESS_BUS_IS_POWERED, Bool) - (L:A32NX_ELEC_AC_1_BUS_IS_POWERED, Bool) - (L:A32NX_ELEC_DC_ESS_BUS_IS_POWERED, Bool) @@ -4154,102 +4174,119 @@ PUSH_AUDIOL_RESET - (L:A32NX_ELEC_AC_1_BUS_IS_POWERED, Bool) - + 0 + 0 PUSH_AUDIOL_VOICE - (L:A32NX_ELEC_DC_ESS_BUS_IS_POWERED, Bool) - (L:A32NX_ELEC_AC_1_BUS_IS_POWERED, Bool) + 0 + 0 PUSH_AUDIOL_PA - (L:A32NX_ELEC_DC_ESS_BUS_IS_POWERED, Bool) - + 0 + 0 PUSH_AUDIOL_ATT - (L:A32NX_ELEC_DC_ESS_BUS_IS_POWERED, Bool) - (L:A32NX_ELEC_AC_1_BUS_IS_POWERED, Bool) + 0 + 0 PUSH_AUDIOL_MECH - (L:A32NX_ELEC_DC_ESS_BUS_IS_POWERED, Bool) - (L:A32NX_ELEC_AC_1_BUS_IS_POWERED, Bool) + 0 + 0 PUSH_AUDIOL_CALL4 - (L:A32NX_ELEC_DC_ESS_BUS_IS_POWERED, Bool) - (L:A32NX_ELEC_AC_1_BUS_IS_POWERED, Bool) + 0 + 0 PUSH_AUDIOL_CALL5 - (L:A32NX_ELEC_DC_ESS_BUS_IS_POWERED, Bool) - (L:A32NX_ELEC_AC_1_BUS_IS_POWERED, Bool) + 0 + 0 PUSH_AUDIOL_VOR1_EMIS - (L:A32NX_ELEC_DC_ESS_BUS_IS_POWERED, Bool) + 0 PUSH_AUDIOL_VOR2_EMIS - (L:A32NX_ELEC_DC_ESS_BUS_IS_POWERED, Bool) + 0 PUSH_AUDIOL_MKR_EMIS - (L:A32NX_ELEC_DC_ESS_BUS_IS_POWERED, Bool) + 0 PUSH_AUDIOL_ILS_EMIS - (L:A32NX_ELEC_DC_ESS_BUS_IS_POWERED, Bool) + 0 PUSH_AUDIOL_HF1_EMIS - (L:A32NX_ELEC_DC_ESS_BUS_IS_POWERED, Bool) + 0 PUSH_AUDIOL_MLS_EMIS - (L:A32NX_ELEC_DC_ESS_BUS_IS_POWERED, Bool) + 0 PUSH_AUDIOL_HF2_EMIS - (L:A32NX_ELEC_DC_ESS_BUS_IS_POWERED, Bool) + 0 PUSH_AUDIOL_ADF1_EMIS - (L:A32NX_ELEC_DC_ESS_BUS_IS_POWERED, Bool) + 0 PUSH_AUDIOL_INT_EMIS - (L:A32NX_ELEC_DC_ESS_BUS_IS_POWERED, Bool) + 0 PUSH_AUDIOL_ADF2_EMIS - (L:A32NX_ELEC_DC_ESS_BUS_IS_POWERED, Bool) + 0 PUSH_AUDIOL_CAB_EMIS - (L:A32NX_ELEC_DC_ESS_BUS_IS_POWERED, Bool) + 0 PUSH_AUDIOL_PA1_EMIS - (L:A32NX_ELEC_DC_ESS_BUS_IS_POWERED, Bool) + 0 + + + + + 2 R - (L:A32NX_ELEC_AC_1_BUS_IS_POWERED, Bool) + (L:A32NX_ELEC_DC_2_BUS_IS_POWERED, Bool) (L:A32NX_ELEC_DC_2_BUS_IS_POWERED, Bool) + + 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 KNOB_AUDIOR_VHF1 PUSH_AUDIOR_VHF1_EMIS KNOB_AUDIOR_VHF1 @@ -4274,9 +4311,6 @@ PUSH_AUDIOR_CALL3 PUSH_AUDIOR_CALL3_SEQ1 PUSH_AUDIOR_CALL3_SEQ2 - (L:A32NX_ELEC_DC_ESS_BUS_IS_POWERED, Bool) - (L:A32NX_ELEC_AC_1_BUS_IS_POWERED, Bool) - (L:A32NX_ELEC_DC_ESS_BUS_IS_POWERED, Bool) @@ -4289,88 +4323,88 @@ PUSH_AUDIOR_RESET - (L:A32NX_ELEC_AC_1_BUS_IS_POWERED, Bool) - + 0 + 0 PUSH_AUDIOR_VOICE - (L:A32NX_ELEC_DC_ESS_BUS_IS_POWERED, Bool) - (L:A32NX_ELEC_AC_1_BUS_IS_POWERED, Bool) + 0 + 0 PUSH_AUDIOR_PA - (L:A32NX_ELEC_DC_ESS_BUS_IS_POWERED, Bool) - + 0 + 0 PUSH_AUDIOR_ATT - (L:A32NX_ELEC_DC_ESS_BUS_IS_POWERED, Bool) - (L:A32NX_ELEC_AC_1_BUS_IS_POWERED, Bool) + 0 + 0 PUSH_AUDIOR_MECH - (L:A32NX_ELEC_DC_ESS_BUS_IS_POWERED, Bool) - (L:A32NX_ELEC_AC_1_BUS_IS_POWERED, Bool) + 0 + 0 PUSH_AUDIOR_CALL4 - (L:A32NX_ELEC_DC_ESS_BUS_IS_POWERED, Bool) - (L:A32NX_ELEC_AC_1_BUS_IS_POWERED, Bool) + 0 + 0 PUSH_AUDIOR_CALL5 - (L:A32NX_ELEC_DC_ESS_BUS_IS_POWERED, Bool) - (L:A32NX_ELEC_AC_1_BUS_IS_POWERED, Bool) + 0 + 0 PUSH_AUDIOR_VOR1_EMIS - (L:A32NX_ELEC_DC_ESS_BUS_IS_POWERED, Bool) + 0 PUSH_AUDIOR_VOR2_EMIS - (L:A32NX_ELEC_DC_ESS_BUS_IS_POWERED, Bool) + 0 PUSH_AUDIOR_MKR_EMIS - (L:A32NX_ELEC_DC_ESS_BUS_IS_POWERED, Bool) + 0 PUSH_AUDIOR_ILS_EMIS - (L:A32NX_ELEC_DC_ESS_BUS_IS_POWERED, Bool) + 0 PUSH_AUDIOR_HF1_EMIS - (L:A32NX_ELEC_DC_ESS_BUS_IS_POWERED, Bool) + 0 PUSH_AUDIOR_MLS_EMIS - (L:A32NX_ELEC_DC_ESS_BUS_IS_POWERED, Bool) + 0 PUSH_AUDIOR_HF2_EMIS - (L:A32NX_ELEC_DC_ESS_BUS_IS_POWERED, Bool) + 0 PUSH_AUDIOR_ADF1_EMIS - (L:A32NX_ELEC_DC_ESS_BUS_IS_POWERED, Bool) + 0 PUSH_AUDIOR_INT_EMIS - (L:A32NX_ELEC_DC_ESS_BUS_IS_POWERED, Bool) + 0 PUSH_AUDIOR_ADF2_EMIS - (L:A32NX_ELEC_DC_ESS_BUS_IS_POWERED, Bool) + 0 PUSH_AUDIOR_CAB_EMIS - (L:A32NX_ELEC_DC_ESS_BUS_IS_POWERED, Bool) + 0 PUSH_AUDIOR_PA1_EMIS - (L:A32NX_ELEC_DC_ESS_BUS_IS_POWERED, Bool) + 0 diff --git a/src/behavior/src/A32NX_Interior_RMP.xml b/src/behavior/src/A32NX_Interior_RMP.xml index 8d007b38943..58fc50a96bc 100644 --- a/src/behavior/src/A32NX_Interior_RMP.xml +++ b/src/behavior/src/A32NX_Interior_RMP.xml @@ -64,7 +64,11 @@ + + + 0 (>K:COM3_RADIO_SET_HZ) + BUTTON ASOBO_GT_Push_Button @@ -132,20 +136,50 @@ AM + + + + 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); + let emissiveDim = if annunciatorLight == 2 { 0.05 } else { 1 }; + // @todo abnormal defined differently with NAV modes available. + let rmpLeftAbnormal = selectedModeLeft != 1 or selectedModeRight == 1; + let rmpRightAbnormal = selectedModeRight != 2 or selectedModeLeft == 2; + let sideLeftCheck = id == 1; + let sideRightCheck = id == 2; + (if (toggleSwitch and ((rmpLeftAbnormal and sideLeftCheck) or (rmpRightAbnormal and sideRightCheck)) or (annunciatorLight == 0)) 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); let emissiveDim = if annunciatorLight == 2 { 0.05 } else { 1 }; // @todo abnormal defined differently with NAV modes available. - let rmpLeftAbnormal = selectedModeLeft != 1; - let rmpRightAbnormal = selectedModeRight != 2; - (if (toggleSwitch and (rmpLeftAbnormal or rmpRightAbnormal) or (annunciatorLight == 0)) and indicatorsPowered { + let rmpLeftAbnormal = selectedModeLeft != 1 or selectedModeRight == 1; + let rmpRightAbnormal = selectedModeRight != 2 or selectedModeLeft == 2; + let sideLeftCheck = id == 1; + let sideRightCheck = id == 2; + (if (toggleSwitch and ((rmpLeftAbnormal and sideLeftCheck) or (rmpRightAbnormal and sideRightCheck)) or (annunciatorLight == 0)) and indicatorsPowered { 1 * emissiveDim } else { 0 @@ -156,6 +190,7 @@ + 7 SEL @@ -288,7 +323,7 @@ - (A:LIGHT POTENTIOMETER:#POTENTIOMETER#, Percent over 100) #BACKLIGHTS_POWERED# * + (A:LIGHT POTENTIOMETER:#POTENTIOMETER#, Percent over 100) #BACKLIGHTS_POWERED# (L:A32NX_RMP_#SIDE#_TOGGLE_SWITCH) * * diff --git a/src/instruments/src/Common/EWDMessages.tsx b/src/instruments/src/Common/EWDMessages.tsx index 4748b8ac74c..84758378d54 100644 --- a/src/instruments/src/Common/EWDMessages.tsx +++ b/src/instruments/src/Common/EWDMessages.tsx @@ -102,6 +102,7 @@ const EWDMessages = { '000055201': '\x1b<3mCOMPANY MSG', '000056001': '\x1b<3mHI ALT SET', '000068001': '\x1b<3mADIRS SWTG', + '000056701': '\x1b<3mVHF3 VOICE', '213122101': '\x1b<2m\x1b4mCAB PR\x1bm EXCESS CAB ALT', '213122102': '\x1b<5m -CREW OXY MASKS.....USE', '213122103': '\x1b<5m -SIGNS...............ON', diff --git a/src/instruments/src/EWD/elements/PseudoFWC.tsx b/src/instruments/src/EWD/elements/PseudoFWC.tsx index 8f03d03ef1f..96632be7424 100644 --- a/src/instruments/src/EWD/elements/PseudoFWC.tsx +++ b/src/instruments/src/EWD/elements/PseudoFWC.tsx @@ -297,6 +297,8 @@ const PseudoFWC: React.FC = () => { const [pack2On] = useSimVar('L:A32NX_OVHD_COND_PACK_2_PB_IS_ON', 'bool'); const [excessPressure] = useSimVar('L:A32NX_PRESS_EXCESS_CAB_ALT', 'bool', 500); + const [voiceVHF3] = useSimVar('A:COM ACTIVE FREQUENCY:3', 'number', 500); + /* WARNINGS AND FAILURES */ const landASAPRed: boolean = !!(!aircraftOnGround && ( @@ -1390,6 +1392,17 @@ const PseudoFWC: React.FC = () => { sysPage: -1, side: 'RIGHT', }, + '0000567': // VHF3 VOICE + { + flightPhaseInhib: [], + simVarIsActive: voiceVHF3 !== 0 && [1, 2, 6, 9, 10].includes(flightPhase), + whichCodeToReturn: [0], + codesToReturn: ['000056701'], + memoInhibit: false, + failure: 0, + sysPage: -1, + side: 'RIGHT', + }, }; /* TO CONFIG */ @@ -1697,6 +1710,7 @@ const PseudoFWC: React.FC = () => { unit, usrStartRefueling, wingAntiIce, + voiceVHF3, ]); useEffect(() => { diff --git a/src/instruments/src/RMP/Components/RadioPanelDisplay.tsx b/src/instruments/src/RMP/Components/RadioPanelDisplay.tsx index c338eeae0e1..a2ada050a57 100644 --- a/src/instruments/src/RMP/Components/RadioPanelDisplay.tsx +++ b/src/instruments/src/RMP/Components/RadioPanelDisplay.tsx @@ -8,6 +8,8 @@ interface Props { value: number | string, } +const TEXT_DATA_MODE_VHF3 = 'DATA'; + /** * Format the given frequency to be displayed. * @param frequency The given frequency number in Hz. @@ -23,14 +25,39 @@ const formatFrequency = (frequency: number): string => (frequency / 1000000).toF export function RadioPanelDisplay(props: Props) { const [lightsTest] = useSimVar('L:A32NX_OVHD_INTLT_ANN', 'Boolean', 1000); - // If the passed value prop is a number, we'll use formatFrequency to get string format. - const value = typeof props.value === 'number' ? formatFrequency(props.value) : props.value; + let content: JSX.Element; - return ( - + if (lightsTest === 0) { + content = ( + + 8.8.8.8.8.8 + + ); + } else if (props.value > 0) { + let value = ''; + // If the passed value prop is a number, we'll use formatFrequency to get string format. + if (typeof props.value === 'number') { + value = formatFrequency(props.value); + } else { + value = props.value; + } + + content = ( - {lightsTest === 0 ? '8.8.8.8.8.8' : value} + {value} + + ); + } else { + content = ( + + {TEXT_DATA_MODE_VHF3} + ); + } + + return ( + + {content} ); } diff --git a/src/instruments/src/RMP/Components/StandbyFrequency.tsx b/src/instruments/src/RMP/Components/StandbyFrequency.tsx index 46f6ada5b40..6b2e46fc21e 100644 --- a/src/instruments/src/RMP/Components/StandbyFrequency.tsx +++ b/src/instruments/src/RMP/Components/StandbyFrequency.tsx @@ -103,29 +103,36 @@ export const StandbyFrequency = (props: Props) => { const spacing = usePersistentProperty('RMP_VHF_SPACING_25KHZ', '0')[0] === '0' ? 8.33 : 25; // Handle outer knob turned. const outerKnobUpdateCallback: UpdateValueCallback = useCallback((offset) => { - const frequency = Math.round(props.value / 1000); - const integer = Math.floor(frequency / 1000); - const decimal = frequency % 1000; - // @todo determine min/max depending on mode. - const maxInteger = decimal > 975 ? 135 : 136; - const newInteger = Utils.Clamp(integer + offset, 118, maxInteger); - props.setValue((newInteger * 1000 + decimal) * 1000); + if (props.value !== 0) { + const frequency = Math.round(props.value / 1000); + const integer = Math.floor(frequency / 1000); + const decimal = frequency % 1000; + // @todo determine min/max depending on mode. + const maxInteger = decimal > 975 ? 135 : 136; + const newInteger = Utils.Clamp(integer + offset, 118, maxInteger); + props.setValue((newInteger * 1000 + decimal) * 1000); + } else { + props.setValue(0); + } }, [props.value]); // Handle inner knob turned. const innerKnobUpdateCallback: UpdateValueCallback = useCallback((offset) => { const frequency = Math.round(props.value / 1000); - if (Math.sign(offset) === 1 && frequency === 136975) { - return; + if (props.value !== 0) { + const integer = Math.floor(frequency / 1000); + // @todo determine correct frequency spacing depending on mode. + const decimal = offsetFrequencyChannel(spacing, frequency % 1000, offset); + // @todo determine min/max depending on mode. + // Tested in real life: + // Integer cannot return to 118 from 136 to the right + // Decimal can return to 0 from 975 to the right + // const maxDecimal = integer === 136 ? 975 : 1000; + const newDecimal = Utils.Clamp(decimal, 0, 1000); + props.setValue((integer * 1000 + newDecimal) * 1000); + } else { + props.setValue(0); } - - const integer = Math.floor(frequency / 1000); - // @todo determine correct frequency spacing depending on mode. - const decimal = offsetFrequencyChannel(spacing, frequency % 1000, offset); - // @todo determine min/max depending on mode. - const maxDecimal = integer === 136 ? 975 : 1000; - const newDecimal = Utils.Clamp(decimal, 0, maxDecimal); - props.setValue((integer * 1000 + newDecimal) * 1000); }, [props.value]); // Used to change integer value of freq. diff --git a/src/instruments/src/RMP/Components/VhfRadioPanel.tsx b/src/instruments/src/RMP/Components/VhfRadioPanel.tsx index 9e2dcd4eeb1..8e358d309b6 100644 --- a/src/instruments/src/RMP/Components/VhfRadioPanel.tsx +++ b/src/instruments/src/RMP/Components/VhfRadioPanel.tsx @@ -58,9 +58,15 @@ const useStandbyVhfFrequency = (side: string, transceiver: number) => { export const VhfRadioPanel = (props: Props) => { const [active, setActive] = useActiveVhfFrequency(props.transceiver); const [standby, setStandby] = useStandbyVhfFrequency(props.side, props.transceiver); + const [, setValueOppositePanelStandby] = props.side === 'L' ? useStandbyVhfFrequency('R', 3) : useStandbyVhfFrequency('L', 3); // Handle Transfer Button Pressed. useInteractionEvent(`A32NX_RMP_${props.side}_TRANSFER_BUTTON_PRESSED`, () => { + // Force the standby opposite side otherwise we would lose the frequency/data format + // Otherwise it would become frequency/frequency + if (props.transceiver === 3) { + setValueOppositePanelStandby(active); + } setActive(standby); setStandby(active); });