From cf9a657195349c980e8f4a49058fd2cffa5cc0ac Mon Sep 17 00:00:00 2001 From: Jonathan Redpath <legoboyvdlp@gmail.com> Date: Sat, 30 Apr 2022 13:14:13 +0100 Subject: [PATCH] IESI - revise power so that it also uses Emesary --- A320-main.xml | 4 + Models/Instruments/IESI/IESI.nas | 305 ++++++++++++++++++------------- Models/Instruments/PFD/PFD.nas | 22 +-- Nasal/FMGC/FMGC-c.nas | 12 +- Systems/a320-misc.xml | 1 + 5 files changed, 203 insertions(+), 141 deletions(-) diff --git a/A320-main.xml b/A320-main.xml index 4248d265..983e4fd8 100644 --- a/A320-main.xml +++ b/A320-main.xml @@ -1758,7 +1758,11 @@ </groundradar> <iesi> + <att-reset type="double">false</att-reset> <att-reset-cmd type="bool">false</att-reset-cmd> + <display> + <show-mach type="bool">false</show-mach> + </display> </iesi> <marker-beacon n="0"> diff --git a/Models/Instruments/IESI/IESI.nas b/Models/Instruments/IESI/IESI.nas index 7277fe89..67ca58c6 100644 --- a/Models/Instruments/IESI/IESI.nas +++ b/Models/Instruments/IESI/IESI.nas @@ -4,7 +4,6 @@ # props.nas nodes var iesi_init = props.globals.initNode("/instrumentation/iesi/iesi-init", 0, "BOOL"); -var iesi_reset = props.globals.initNode("/instrumentation/iesi/att-reset", 0, "DOUBLE"); var pinPrograms = { metricAltitude: 1, @@ -29,6 +28,7 @@ var canvas_IESI = { }; canvas.parsesvg(obj.group, svg, {"font-mapper": obj.font_mapper} ); + foreach(var key; obj.getKeys()) { obj[key] = obj.group.getElementById(key); @@ -46,20 +46,28 @@ var canvas_IESI = { obj[key].set("clip-frame", canvas.Element.PARENT); } }; + obj.AI_horizon_trans = obj["AI_horizon"].createTransform(); obj.AI_horizon_rot = obj["AI_horizon"].createTransform(); obj._aiCenter = obj["AI_center"].getCenter(); + obj._cachedInhg = -999; + obj._cachedMetric = pinPrograms.metricAltitude; obj._cachedMode = nil; + obj._cachedShowInhg = pinPrograms.showInHg; obj._canReset = 0; obj._excessMotionInInit = 0; obj._fastInit = 0; obj._IESITime = 0; obj._isNegativeAlt = 0; obj._middleAltOffset = nil; - obj._powerResult = 0; - obj._roll = 0; + obj.iesiInAlign = 0; + + + obj["IESI"].hide(); + obj["IESI_Init"].show(); + obj["ATTflag"].hide(); obj.update_items = [ props.UpdateManager.FromHashValue("airspeed", 0.1, func(val) { @@ -78,6 +86,7 @@ var canvas_IESI = { obj.altOffset = (val / 500) - int(val / 500); obj.middleAltText = roundaboutAlt(val / 100); + if (obj.altOffset > 0.5) { obj._middleAltOffset = -(obj.altOffset - 1) * 258.5528; } else { @@ -86,6 +95,7 @@ var canvas_IESI = { obj["ALT_scale"].setTranslation(0, -obj._middleAltOffset); obj["ALT_scale"].update(); + obj["ALT_five"].setText(sprintf("%03d", abs(obj.middleAltText + 10))); obj["ALT_four"].setText(sprintf("%03d", abs(obj.middleAltText + 5))); obj["ALT_three"].setText(sprintf("%03d", abs(obj.middleAltText))); @@ -93,8 +103,8 @@ var canvas_IESI = { obj["ALT_one"].setText(sprintf("%03d", abs(obj.middleAltText - 10))); obj["ALT_meters"].setText(sprintf("%5.0f", math.round(val * 0.3048, 10))); - obj.altTens = num(right(sprintf("%02d", val), 2)); - obj["ALT_tens"].setTranslation(0, obj.altTens * 3.16); + + obj["ALT_tens"].setTranslation(0, num(right(sprintf("%02d", val), 2)) * 3.16); }), props.UpdateManager.FromHashValue("altitude_ind", 0.5, func(val) { obj["ALT_digits"].setText(sprintf("%s", math.clamp(val, -20, 500))); @@ -111,16 +121,15 @@ var canvas_IESI = { props.UpdateManager.FromHashValue("mach", 0.001, func(val) { obj["ASI_mach"].setText(sprintf("%2.0f", math.clamp(val * 100, 0, 99))); }), - props.UpdateManager.FromHashValue("pitch", 0.025, func(val) { + props.UpdateManager.FromHashValue("iesiPitch", 0.025, func(val) { obj.AI_horizon_trans.setTranslation(0, val * 16.74); }), props.UpdateManager.FromHashValue("roll", 0.025, func(val) { - obj._roll = -val * D2R; - obj.AI_horizon_rot.setRotation(obj._roll, obj._aiCenter); - obj["AI_bank"].setRotation(obj._roll); + obj.AI_horizon_rot.setRotation(-val * D2R, obj._aiCenter); + obj["AI_bank"].setRotation(-val * D2R); }), props.UpdateManager.FromHashValue("skid", 0.1, func(val) { - if (abs(val) >= 84.99) { + if (abs(val) >= 85) { obj["AI_slipskid"].hide(); } else { obj["AI_slipskid"].setTranslation(-val, 0); @@ -128,112 +137,172 @@ var canvas_IESI = { } }), ]; + + obj.update_items_init = [ + props.UpdateManager.FromHashList(["iesiAlignTime","elapsedTime"], 0.5, func(val) { + if (val.iesiAlignTime + 90 >= val.elapsedTime) { + obj.iesiInAlign = 1; + } else { + obj.iesiInAlign = 0; + } + }), + props.UpdateManager.FromHashList(["iesiInAlign","iesiFastInit","irAlignFault"], 1, func(val) { + if (val.iesiInAlign) { + if (!val.iesiFastInit and val.irAlignFault) { + obj._excessMotionInInit = 1; + } + } + }), + props.UpdateManager.FromHashList(["iesiExcessMotion","iesiFastInit","iesiInAlign"], 1, func(val) { + if (val.iesiInAlign) { + if (val.iesiFastInit) { + obj["IESI"].show(); + obj["IESI_Init"].hide(); + obj["AI_bank"].hide(); + obj["AI_bank_center"].hide(); + obj["AI_bank_scale"].hide(); + obj["AI_horizon"].hide(); + obj["AI_sky_bank"].hide(); + obj["ATTflag_text"].setText("ATT 10s"); + obj["ATTflag_text"].setColor(0,0,0); + obj["ATTflag_rect"].setScale(1.5,1); + obj["ATTflag_rect"].setTranslation(-250,0); + obj["ATTflag_rect"].setColorFill(1,1,0); + obj["ATTflag_rect"].setColor(1,1,0); + obj["ATTflag"].show(); + obj["attRst"].hide(); + obj["attRstRect"].hide(); + } else { + obj["IESI"].hide(); + obj["IESI_Init"].show(); + obj["ATTflag"].hide(); + } + } else { + if (!val.iesiExcessMotion) { + obj["IESI_Init"].hide(); + obj["IESI"].show(); + obj["AI_bank"].show(); + obj["AI_bank_center"].show(); + obj["AI_bank_scale"].show(); + obj["AI_index"].show(); + obj["AI_horizon"].show(); + obj["AI_sky_bank"].show(); + obj["ATTflag"].hide(); + } else { + obj["IESI_Init"].hide(); + obj["IESI"].show(); + obj["AI_bank"].hide(); + obj["AI_bank_center"].hide(); + obj["AI_bank_scale"].hide(); + obj["AI_horizon"].hide(); + obj["AI_sky_bank"].hide(); + obj["ATTflag_text"].setText("ATT"); + obj["ATTflag_text"].setColor(1,0,0); + obj["ATTflag_rect"].setScale(1,1); + obj["ATTflag_rect"].setTranslation(0,0); + obj["ATTflag_rect"].setColorFill(0,0,0); + obj["ATTflag_rect"].setColor(0,0,0); + obj["ATTflag"].show(); + obj["attRst"].show(); + obj["attRstRect"].show(); + } + } + }), + ]; + + obj.update_items_power = [ + props.UpdateManager.FromHashList(["iesiPowered","iesiBrt"], 0.005, func(val) { + if (val.iesiPowered and val.iesiBrt > 0.01) { + obj.group.setVisible(1); + } else { + obj.group.setVisible(0); + } + }), + props.UpdateManager.FromHashList(["iesiPowered","acconfig","iesiInit"], 1, func(val) { + if (val.iesiPowered) { + if (val.iesiInit) return; + obj.initIESI(val.acconfig); + } elsif (val.iesiInit) { + obj._canReset = 0; + obj._excessMotionInInit = 0; + obj._fastInit = 0; + iesi_init.setBoolValue(0); + } + }), + ]; return obj; - }, + }, getKeys: func() { return ["IESI","IESI_Init","attRst","attRstRect","att90s","ATTflag","ATTflag_rect","ATTflag_text","ALTwarn","SPDwarn","ASI_scale","ASI_mach","ASI_mach_decimal","AI_center","AI_index","AI_horizon","AI_sky_bank","AI_bank","AI_bank_center","AI_slipskid","ALT_scale","ALT_one","ALT_two","ALT_three","ALT_four","ALT_five","ALT_digits","ALT_tens","ALT_meters","QNH_setting","QNH_std","negText","negText2","AI_bank_scale","metricM","metricBox"]; }, - alignFault: props.globals.getNode("/systems/navigation/align-fault"), update: func(notification) { - me._powerResult = me.updatePower(notification); - if (me._powerResult == 0) { return; } + me.updatePower(notification); - if (math.abs(notification.qnh_inhg - me._cachedInhg) > 0.005 or notification.altimeter_mode != me._cachedMode) { - me._cachedInhg = notification.qnh_inhg; - me._cachedMode = notification.altimeter_mode; + foreach(var update_item; me.update_items_power) + { + update_item.update(notification); + } + + if (!me.group.getVisible()) { return; } + + notification.iesiAlignTime = me._IESITime; + notification.iesiExcessMotion = me._excessMotionInInit; + notification.iesiFastInit = me._fastInit; + notification.iesiInAlign = me.iesiInAlign; + + foreach(var update_item; me.update_items_init) + { + update_item.update(notification); + } + + if (math.abs(notification.qnh_inhg_iesi - me._cachedInhg) > 0.005 or notification.altimeter_mode_iesi != me._cachedMode or pinPrograms.showInHg != me._cachedShowInhg) { + me._cachedInhg = notification.qnh_inhg_iesi; + me._cachedMode = notification.altimeter_mode_iesi; + me._cachedShowInhg = pinPrograms.showInHg; me.updateQNH(notification); } - if (me._IESITime + 90 >= notification.elapsedTime) { - if (!me._fastInit and me.alignFault.getBoolValue()) { - me._excessMotionInInit = 1; - } - - if (me._fastInit) { - me["IESI"].show(); - me["IESI_Init"].hide(); - me["AI_bank"].hide(); - me["AI_bank_center"].hide(); - me["AI_bank_scale"].hide(); - me["AI_horizon"].hide(); - me["AI_sky_bank"].hide(); - me["ATTflag_text"].setText("ATT 10s"); - me["ATTflag_text"].setColor(0,0,0); - me["ATTflag_rect"].setScale(1.5,1); - me["ATTflag_rect"].setTranslation(-250,0); - me["ATTflag_rect"].setColorFill(1,1,0); - me["ATTflag_rect"].setColor(1,1,0); - me["ATTflag"].show(); - me["attRst"].hide(); - me["attRstRect"].hide(); - } else { - me["IESI"].hide(); - me["IESI_Init"].show(); - me["ATTflag"].hide(); - return; - } - } else { - if (pinPrograms.metricAltitude) { - me["ALT_meters"].show(); - me["metricM"].show(); - me["metricBox"].show(); - - if (me._isNegativeAlt) { - me["negText2"].show(); - } else { - me["negText2"].hide(); - } - } else { - me["ALT_meters"].hide(); - me["metricM"].hide(); - me["metricBox"].hide(); - me["negText2"].hide(); - } - - if (!me._excessMotionInInit) { - me["IESI_Init"].hide(); - me["IESI"].show(); - me["AI_bank"].show(); - me["AI_bank_center"].show(); - me["AI_bank_scale"].show(); - me["AI_index"].show(); - me["AI_horizon"].show(); - me["AI_sky_bank"].show(); - me["ATTflag"].hide(); - } else { - me["IESI_Init"].hide(); - me["IESI"].show(); - me["AI_bank"].hide(); - me["AI_bank_center"].hide(); - me["AI_bank_scale"].hide(); - me["AI_horizon"].hide(); - me["AI_sky_bank"].hide(); - me["ATTflag_text"].setText("ATT"); - me["ATTflag_text"].setColor(1,0,0); - me["ATTflag_rect"].setScale(1,1); - me["ATTflag_rect"].setTranslation(0,0); - me["ATTflag_rect"].setColorFill(0,0,0); - me["ATTflag_rect"].setColor(0,0,0); - me["ATTflag"].show(); - me["attRst"].show(); - me["attRstRect"].show(); - } - } + if (me.iesiInAlign and !me._fastInit) return; foreach(var update_item; me.update_items) { update_item.update(notification); } + + if (!me.iesiInAlign and pinPrograms.metricAltitude != me._cachedMetric) { + me._cachedMetric = pinPrograms.metricAltitude; + me.updateMetric(pinPrograms.metricAltitude); + } + + if (pinPrograms.metricAltitude) { + if (me._isNegativeAlt) { + me["negText2"].show(); + } else { + me["negText2"].hide(); + } + } + }, + updateMetric: func(val) { + if (val) { + me["ALT_meters"].show(); + me["metricM"].show(); + me["metricBox"].show(); + } else { + me["ALT_meters"].hide(); + me["metricM"].hide(); + me["metricBox"].hide(); + me["negText2"].hide(); + } }, updateQNH: func(notification) { - if (notification.altimeter_mode) { + if (notification.altimeter_mode_iesi) { me["QNH_setting"].hide(); me["QNH_std"].show(); } else { if (pinPrograms.showInHg) { - me["QNH_setting"].setText(sprintf("%4.0f", notification.qnh_hpa) ~ "/" ~ sprintf("%2.2f", notification.qnh_inhg)); + me["QNH_setting"].setText(sprintf("%4.0f", notification.qnh_hpa_iesi) ~ "/" ~ sprintf("%2.2f", notification.qnh_inhg_iesi)); } else { - me["QNH_setting"].setText(sprintf("%4.0f", notification.qnh_hpa)); + me["QNH_setting"].setText(sprintf("%4.0f", notification.qnh_hpa_iesi)); } me["QNH_std"].hide(); me["QNH_setting"].show(); @@ -248,28 +317,13 @@ var canvas_IESI = { } else if (me._IESITime + 90 < notification.elapsedTime and notification.iesiInit and !me._canReset) { me._canReset = 1; } - - if (notification.iesiPowered) { - if (notification.acconfig != 1 and notification.iesiInit != 1) { - iesi_init.setBoolValue(1); - me._IESITime = notification.elapsedTime - (me._fastInit ? 80 : 0); - } else if (notification.acconfig == 1 and notification.iesiInit != 1) { - iesi_init.setBoolValue(1); - me._IESITime = notification.elapsedTime - 87; - } - } elsif (notification.iesiInit) { - me._canReset = 0; - me._excessMotionInInit = 0; - me._fastInit = 0; - iesi_init.setBoolValue(0); - } - - if (notification.iesiPowered and notification.iesiBrt > 0.01) { - me.group.setVisible(1); - return 1; + }, + initIESI: func(acconfig) { + iesi_init.setBoolValue(1); + if (!acconfig) { + me._IESITime = pts.Sim.Time.elapsedSec.getValue() - (me._fastInit ? 80 : 0); } else { - me.group.setVisible(0); - return 0; + me._IESITime = pts.Sim.Time.elapsedSec.getValue() - 87; } }, }; @@ -302,40 +356,41 @@ var IESIRecipient = var A320IESI = IESIRecipient.new("A320 IESI"); emesary.GlobalTransmitter.Register(A320IESI); +# Emesary Frame Notifiaction Properties var input = { "acconfig": "/systems/acconfig/autoconfig-running", "airspeed": "/instrumentation/airspeed-indicator[0]/indicated-speed-kt", "altitude": "/instrumentation/altimeter[6]/indicated-altitude-ft", "altitude_ind": "/instrumentation/altimeter[6]/indicated-altitude-ft-pfd", - "altimeter_mode": "/instrumentation/altimeter[6]/std", + "altimeter_mode_iesi": "/instrumentation/altimeter[6]/std", "attReset": "/instrumentation/iesi/att-reset", "iesiBrt": "/controls/lighting/DU/iesi", "iesiInit": "/instrumentation/iesi/iesi-init", + "iesiPitch": "/instrumentation/iesi/pitch-deg", "iesiPowered": "/instrumentation/iesi/power/power-on", + "irAlignFault": "/systems/navigation/align-fault", "mach": "/instrumentation/airspeed-indicator/indicated-mach", - "pitch": "/instrumentation/iesi/pitch-deg", - "qnh_hpa": "/instrumentation/altimeter[6]/setting-hpa", - "qnh_inhg": "/instrumentation/altimeter[6]/setting-inhg", + "qnh_hpa_iesi": "/instrumentation/altimeter[6]/setting-hpa", + "qnh_inhg_iesi": "/instrumentation/altimeter[6]/setting-inhg", "roll": "/orientation/roll-deg", - "skid": "/instrumentation/iesi/slip-skid", "showMach": "/instrumentation/iesi/display/show-mach", + "skid": "/instrumentation/iesi/slip-skid", }; foreach (var name; keys(input)) { emesary.GlobalTransmitter.NotifyAll(notifications.FrameNotificationAddProperty.new("A320 IESI", name, input[name])); } +# Helper functions var showIESI = func { var dlg = canvas.Window.new([512, 512], "dialog").set("resize", 1); dlg.setCanvas(A320IESI.MainScreen.canvas); } var roundabout = func(x) { - var y = x - int(x); - return y < 0.5 ? int(x) : 1 + int(x); + return (x - int(x)) < 0.5 ? int(x) : 1 + int(x); }; var roundaboutAlt = func(x) { - var y = x * 0.2 - int(x * 0.2); - return y < 0.5 ? 5 * int(x * 0.2) : 5 + 5 * int(x * 0.2); + return (x * 0.2 - int(x * 0.2)) < 0.5 ? 5 * int(x * 0.2) : 5 + 5 * int(x * 0.2); }; \ No newline at end of file diff --git a/Models/Instruments/PFD/PFD.nas b/Models/Instruments/PFD/PFD.nas index e495db34..053d7b99 100644 --- a/Models/Instruments/PFD/PFD.nas +++ b/Models/Instruments/PFD/PFD.nas @@ -16,7 +16,6 @@ var alt_inhg = props.globals.getNode("/instrumentation/altimeter/setting-inhg", var aoa_1 = props.globals.getNode("/systems/navigation/adr/output/aoa-1", 1); var aoa_2 = props.globals.getNode("/systems/navigation/adr/output/aoa-2", 1); var aoa_3 = props.globals.getNode("/systems/navigation/adr/output/aoa-3", 1); -var elapsedtime = props.globals.getNode("/sim/time/elapsed-sec", 1); var hundredAbove = props.globals.getNode("/instrumentation/pfd/hundred-above", 1); var minimum = props.globals.getNode("/instrumentation/pfd/minimums", 1); @@ -26,6 +25,7 @@ var amberFlash = [0, 0]; var dhFlash = 0; var ilsFlash = [0,0]; var qnhFlash = [0,0]; +var elapsedtime_act = nil; var du1_test = props.globals.initNode("/instrumentation/du/du1-test", 0, "BOOL"); var du1_test_time = props.globals.initNode("/instrumentation/du/du1-test-time", 0.0, "DOUBLE"); var du1_offtime = props.globals.initNode("/instrumentation/du/du1-off-time", 0.0, "DOUBLE"); @@ -876,7 +876,7 @@ var canvas_pfd = { obj["flap_max"].hide(); } }), - props.UpdateManager.FromHashValue("Ctrgt", , 0.1, func(val) { + props.UpdateManager.FromHashValue("Ctrgt", 0.1, func(val) { obj["clean_speed"].setTranslation(0, val * -6.6); }), props.UpdateManager.FromHashValue("Ftrgt", 0.1, func(val) { @@ -1995,7 +1995,7 @@ var canvas_pfd = { me.testTimeNode = du1_test_time; } - var elapsedtime_act = elapsedtime.getValue(); + elapsedtime_act = pts.Sim.Time.elapsedSec.getValue(); if (me.powerNode.getValue() >= 110) { if (!me.on) { if (me.offTimeNode.getValue() + 3 < elapsedtime_act) { @@ -2245,20 +2245,19 @@ setlistener("/systems/electrical/bus/ac-2", func() { }, 0, 0); # Helper Functions - var roundabout = func(x) { - var y = x - int(x); - return y < 0.5 ? int(x) : 1 + int(x); + return (x - int(x)) < 0.5 ? int(x) : 1 + int(x); }; var roundaboutAlt = func(x) { - var y = x * 0.2 - int(x * 0.2); - return y < 0.5 ? 5 * int(x * 0.2) : 5 + 5 * int(x * 0.2); + return (x * 0.2 - int(x * 0.2)) < 0.5 ? 5 * int(x * 0.2) : 5 + 5 * int(x * 0.2); }; +var _fontSizeHDGTempVar = nil; + var fontSizeHDG = func(input) { - var test = input / 3; - if (test == int(test)) { + _fontSizeHDGTempVar = input / 3; + if (_fontSizeHDGTempVar == int(_fontSizeHDGTempVar)) { return 42; } else { return 32; @@ -2274,6 +2273,7 @@ var showPFD2 = func { var dlg = canvas.Window.new([512, 512], "dialog").set("resize", 1); dlg.setCanvas(A320PFD2.MainScreen.canvas); } + # Flash managers var ils_going1 = 0; var ilsTimer1 = maketimer(0.50, func { @@ -2380,4 +2380,4 @@ setlistener("/modes/pfd/fma/pitch-mode", func(pitch) { } else { autoland_pitch_land.setBoolValue(0); } -},0,0); +}, 0, 0); diff --git a/Nasal/FMGC/FMGC-c.nas b/Nasal/FMGC/FMGC-c.nas index b918532f..df839956 100644 --- a/Nasal/FMGC/FMGC-c.nas +++ b/Nasal/FMGC/FMGC-c.nas @@ -554,21 +554,23 @@ var fmaAthr = func { } } +var elapsedTimeBoxes = nil; var showAllBoxes = func { + elapsedTimeBoxes = pts.Sim.Time.elapsedSec.getValue(); if (Modes.PFD.FMA.rollMode.getValue() != " ") { - Modes.PFD.FMA.rollModeTime.setValue(pts.Sim.Time.elapsedSec.getValue()); + Modes.PFD.FMA.rollModeTime.setValue(elapsedTimeBoxes); } if (Modes.PFD.FMA.pitchMode.getValue() != " ") { - Modes.PFD.FMA.pitchModeTime.setValue(pts.Sim.Time.elapsedSec.getValue()); + Modes.PFD.FMA.pitchModeTime.setValue(elapsedTimeBoxes); } if (Modes.PFD.FMA.rollModeArmed.getValue() != " ") { - Modes.PFD.FMA.rollModeArmedTime.setValue(pts.Sim.Time.elapsedSec.getValue()); + Modes.PFD.FMA.rollModeArmedTime.setValue(elapsedTimeBoxes); } if (Modes.PFD.FMA.pitchModeArmed.getValue() != " ") { - Modes.PFD.FMA.pitchModeArmedTime.setValue(pts.Sim.Time.elapsedSec.getValue()); + Modes.PFD.FMA.pitchModeArmedTime.setValue(elapsedTimeBoxes); } if (Modes.PFD.FMA.pitchMode2Armed.getValue() != " ") { - Modes.PFD.FMA.pitchMode2ArmedTime.setValue(pts.Sim.Time.elapsedSec.getValue()); + Modes.PFD.FMA.pitchMode2ArmedTime.setValue(elapsedTimeBoxes); } } diff --git a/Systems/a320-misc.xml b/Systems/a320-misc.xml index fa8d5edd..31696c72 100644 --- a/Systems/a320-misc.xml +++ b/Systems/a320-misc.xml @@ -571,6 +571,7 @@ <product> <value>4</value> <property>/controls/lighting/DU/iesi</property> + <property>/instrumentation/iesi/power/power-on</property> </product> </sum> </function>