From 802573ca39d1fa9c11d262ec449ebab4dd224bf4 Mon Sep 17 00:00:00 2001 From: Joshua Davidson <joshuadavidson2000@gmail.com> Date: Sat, 5 Aug 2017 15:58:42 -0400 Subject: [PATCH] A3XX: Optimize Icing code --- Nasal/icing.nas | 166 ++++++++++++++++++++++++++++++++---------------- 1 file changed, 112 insertions(+), 54 deletions(-) diff --git a/Nasal/icing.nas b/Nasal/icing.nas index 84373acc..173e5b40 100644 --- a/Nasal/icing.nas +++ b/Nasal/icing.nas @@ -5,31 +5,7 @@ # Copyright (c) A3XX Development Team # ####################################### -var icingInit = func { - setprop("/systems/icing/severity", "0"); # maximum severity: we will make it random - setprop("/systems/icing/factor", 0.0); # the factor is how many inches we add per second - setprop("/systems/icing/max-spread-degc", 0.0); - setprop("/systems/icing/melt-w-heat-factor", -0.00005000); - setprop("/systems/icing/icingcond", 0); - setprop("/controls/switches/windowprobeheat", 0); - setprop("/controls/switches/wing", 0); - setprop("/controls/switches/wingfault", 0); - setprop("/controls/switches/leng", 0); - setprop("/controls/switches/lengfault", 0); - setprop("/controls/switches/reng", 0); - setprop("/controls/switches/rengfault", 0); - setprop("/controls/deice/wing", 0); - setprop("/controls/deice/lengine", 0); - setprop("/controls/deice/rengine", 0); - setprop("/controls/deice/windowprobeheat", 0); - setprop("/systems/pitot/icing", 0.0); - setprop("/systems/pitot/failed", 1); - setprop("/controls/deice/WingHasBeenTurnedOff", 0); - setprop("/controls/deice/GroundModeFinished", 0); - icing_timer.start(); -} - -var icingModel = func { +setlistener("/sim/signals/fdm-initialized", func { var dewpoint = getprop("/environment/dewpoint-degc"); var temperature = getprop("/environment/temperature-degc"); var speed = getprop("/velocities/airspeed-kt"); @@ -58,6 +34,88 @@ var icingModel = func { var rengAnti = getprop("/controls/deice/rengine"); var WingHasBeenTurnedOff = getprop("/controls/deice/WingHasBeenTurnedOff"); var GroundModeFinished = getprop("/controls/deice/GroundModeFinished"); + var icing1 = getprop("/sim/model/icing/iceable[0]/ice-inches"); + var sensitive1 = getprop("/sim/model/icing/iceable[0]/sensitivity"); + var v = 0; + var a = 0; + var icing2 = getprop("/sim/model/icing/iceable[1]/ice-inches"); + var sensitive2 = getprop("/sim/model/icing/iceable[1]/sensitivity"); + var u = 0; + var b = 0; + var icing3 = getprop("/sim/model/icing/iceable[2]/ice-inches"); + var sensitive3 = getprop("/sim/model/icing/iceable[2]/sensitivity"); + var t = 0; + var c = 0; + var icing4 = getprop("/sim/model/icing/iceable[3]/ice-inches"); + var sensitive4 = getprop("/sim/model/icing/iceable[3]/sensitivity"); + var s = 0; + var d = 0; + var icing5 = getprop("/sim/model/icing/iceable[4]/ice-inches"); + var sensitive5 = getprop("/sim/model/icing/iceable[4]/sensitivity"); + var r = 0; + var icing6 = getprop("/sim/model/icing/iceable[5]/ice-inches"); + var sensitive6 = getprop("/sim/model/icing/iceable[5]/sensitivity"); + var q = 0; + var e = 0; + var spread = 0; + var windowprb = getprop("/controls/switches/windowprobeheat"); + stateL = getprop("/engines/engine[0]/state"); + stateR = getprop("/engines/engine[1]/state"); +}); + +var icingInit = func { + setprop("/systems/icing/severity", "0"); # maximum severity: we will make it random + setprop("/systems/icing/factor", 0.0); # the factor is how many inches we add per second + setprop("/systems/icing/max-spread-degc", 0.0); + setprop("/systems/icing/melt-w-heat-factor", -0.00005000); + setprop("/systems/icing/icingcond", 0); + setprop("/controls/switches/windowprobeheat", 0); + setprop("/controls/switches/wing", 0); + setprop("/controls/switches/wingfault", 0); + setprop("/controls/switches/leng", 0); + setprop("/controls/switches/lengfault", 0); + setprop("/controls/switches/reng", 0); + setprop("/controls/switches/rengfault", 0); + setprop("/controls/deice/wing", 0); + setprop("/controls/deice/lengine", 0); + setprop("/controls/deice/rengine", 0); + setprop("/controls/deice/windowprobeheat", 0); + setprop("/systems/pitot/icing", 0.0); + setprop("/systems/pitot/failed", 1); + setprop("/controls/deice/WingHasBeenTurnedOff", 0); + setprop("/controls/deice/GroundModeFinished", 0); + icing_timer.start(); +} + +var icingModel = func { + dewpoint = getprop("/environment/dewpoint-degc"); + temperature = getprop("/environment/temperature-degc"); + speed = getprop("/velocities/airspeed-kt"); + visibility = getprop("/environment/effective-visibility-m"); + visibLclWx = getprop("/environment/visibility-m"); + severity = getprop("/systems/icing/severity"); + factor = getprop("/systems/icing/factor"); + maxSpread = getprop("/systems/icing/max-spread-degc"); + icingCond = getprop("/systems/icing/icingcond"); + pause = getprop("/sim/freeze/master"); + melt = getprop("/systems/icing/melt-w-heat-factor"); + windowprobe = getprop("/controls/deice/windowprobeheat"); + wingBtn = getprop("/controls/switches/wing"); + wingFault = getprop("/controls/switches/wingfault"); + wingAnti = getprop("/controls/deice/wing"); + PSI = getprop("/systems/pneumatic/total-psi"); + wowl = getprop("/gear/gear[1]/wow"); + wowr = getprop("/gear/gear[2]/wow"); + PitotIcing = getprop("/systems/pitot/icing"); + PitotFailed = getprop("/systems/pitot/failed"); + lengBtn = getprop("/controls/switches/leng"); + lengFault = getprop("/controls/switches/lengfault"); + rengBtn = getprop("/controls/switches/reng"); + rengFault = getprop("/controls/switches/rengfault"); + lengAnti = getprop("/controls/deice/lengine"); + rengAnti = getprop("/controls/deice/rengine"); + WingHasBeenTurnedOff = getprop("/controls/deice/WingHasBeenTurnedOff"); + GroundModeFinished = getprop("/controls/deice/GroundModeFinished"); if (temperature >= 0 or !icingCond) { setprop("/systems/icing/severity", "0"); @@ -73,10 +131,10 @@ var icingModel = func { setprop("/systems/icing/severity", "1"); } - var icing1 = getprop("/sim/model/icing/iceable[0]/ice-inches"); - var sensitive1 = getprop("/sim/model/icing/iceable[0]/sensitivity"); - var v = icing1 + (factor * sensitive1); - var a = icing1 + melt; + icing1 = getprop("/sim/model/icing/iceable[0]/ice-inches"); + sensitive1 = getprop("/sim/model/icing/iceable[0]/sensitivity"); + v = icing1 + (factor * sensitive1); + a = icing1 + melt; if (icing1 < 0.0 and !pause) { setprop("/sim/model/icing/iceable[0]/ice-inches", 0.0); } else if (wingAnti) { @@ -85,10 +143,10 @@ var icingModel = func { setprop("/sim/model/icing/iceable[0]/ice-inches", v); } - var icing2 = getprop("/sim/model/icing/iceable[1]/ice-inches"); - var sensitive2 = getprop("/sim/model/icing/iceable[1]/sensitivity"); - var u = icing2 + (factor * sensitive2); - var b = icing2 + melt; + icing2 = getprop("/sim/model/icing/iceable[1]/ice-inches"); + sensitive2 = getprop("/sim/model/icing/iceable[1]/sensitivity"); + u = icing2 + (factor * sensitive2); + b = icing2 + melt; if (icing2 < 0.0 and !pause) { setprop("/sim/model/icing/iceable[1]/ice-inches", 0.0); } else if (lengAnti) { @@ -97,10 +155,10 @@ var icingModel = func { setprop("/sim/model/icing/iceable[1]/ice-inches", u); } - var icing3 = getprop("/sim/model/icing/iceable[2]/ice-inches"); - var sensitive3 = getprop("/sim/model/icing/iceable[2]/sensitivity"); - var t = icing3 + (factor * sensitive3); - var c = icing3 + melt; + icing3 = getprop("/sim/model/icing/iceable[2]/ice-inches"); + sensitive3 = getprop("/sim/model/icing/iceable[2]/sensitivity"); + t = icing3 + (factor * sensitive3); + c = icing3 + melt; if (icing3 < 0.0 and !pause) { setprop("/sim/model/icing/iceable[2]/ice-inches", 0.0); } else if (rengAnti) { @@ -109,10 +167,10 @@ var icingModel = func { setprop("/sim/model/icing/iceable[2]/ice-inches", t); } - var icing4 = getprop("/sim/model/icing/iceable[3]/ice-inches"); - var sensitive4 = getprop("/sim/model/icing/iceable[3]/sensitivity"); - var s = icing4 + (factor * sensitive4); - var d = icing4 + melt; + icing4 = getprop("/sim/model/icing/iceable[3]/ice-inches"); + sensitive4 = getprop("/sim/model/icing/iceable[3]/sensitivity"); + s = icing4 + (factor * sensitive4); + d = icing4 + melt; if (icing4 < 0.0 and !pause) { setprop("/sim/model/icing/iceable[3]/ice-inches", 0.0); } else if (windowprobe) { @@ -121,19 +179,19 @@ var icingModel = func { setprop("/sim/model/icing/iceable[3]/ice-inches", s); } - var icing5 = getprop("/sim/model/icing/iceable[4]/ice-inches"); - var sensitive5 = getprop("/sim/model/icing/iceable[4]/sensitivity"); - var r = icing5 + (factor * sensitive5); + icing5 = getprop("/sim/model/icing/iceable[4]/ice-inches"); + sensitive5 = getprop("/sim/model/icing/iceable[4]/sensitivity"); + r = icing5 + (factor * sensitive5); if (icing5 < 0.0 and !pause) { setprop("/sim/model/icing/iceable[4]/ice-inches", 0.0); } else if (!pause) { setprop("/sim/model/icing/iceable[4]/ice-inches", r); } - var icing6 = getprop("/sim/model/icing/iceable[5]/ice-inches"); - var sensitive6 = getprop("/sim/model/icing/iceable[5]/sensitivity"); - var q = icing6 + (factor * sensitive6); - var e = icing6 + melt; + icing6 = getprop("/sim/model/icing/iceable[5]/ice-inches"); + sensitive6 = getprop("/sim/model/icing/iceable[5]/sensitivity"); + q = icing6 + (factor * sensitive6); + e = icing6 + melt; if (icing6 < 0.0 and !pause) { setprop("/sim/model/icing/iceable[5]/ice-inches", 0.0); } else if (windowprobe) { @@ -143,7 +201,7 @@ var icingModel = func { } # Do we create ice? - var spread = temperature - dewpoint; + spread = temperature - dewpoint; # freezing fog or low temp and below dp or in advanced wx cloud if ((spread < maxSpread and temperature < 0) or (temperature < 0 and visibility < 1000) or (visibLclWx < 5000 and temperature < 0)) { setprop("/systems/icing/icingcond", 1); @@ -260,12 +318,12 @@ var icingModel = func { } setlistener("/controls/switches/windowprobeheat", func { - var windowprb = getprop("/controls/switches/windowprobeheat"); + windowprb = getprop("/controls/switches/windowprobeheat"); if (windowprb == 0.5) { # if in auto - var wowl = getprop("/gear/gear[1]/wow"); - var wowr = getprop("/gear/gear[2]/wow"); - var stateL = getprop("/engines/engine[0]/state"); - var stateR = getprop("/engines/engine[1]/state"); + wowl = getprop("/gear/gear[1]/wow"); + wowr = getprop("/gear/gear[2]/wow"); + stateL = getprop("/engines/engine[0]/state"); + stateR = getprop("/engines/engine[1]/state"); if (!wowl or !wowr) { setprop("/controls/deice/windowprobeheat", 1); } else if (stateL == 3 or stateR == 3) {