1
0
Fork 0
A320-family/Nasal/Effects/icing.nas
2022-01-10 21:17:41 -05:00

161 lines
3.9 KiB
Text

# A3XX Icing System
# Jonathan Redpath (legoboyvdlp)
# Copyright (c) 2022 Josh Davidson (Octal450)
### Ice sensitive components definition.
var Iceable = {
new: func(node) {
var m = { parents: [Iceable] };
m.ice_inches = node.getNode("ice-inches", 1);
m.sensitivity = node.getNode("sensitivity", 1);
var deice_prop = node.getValue("salvage-control");
m.deice = deice_prop ? props.globals.getNode(deice_prop, 1) : nil;
var output_prop = node.getValue("output-property");
m.output = output_prop ? props.globals.getNode(output_prop, 1): nil;
return m;
},
update: func(factor, melt) {
var icing = me.ice_inches.getValue();
if(me.deice != nil and me.deice.getBoolValue()) {
icing += melt;
} else {
icing += factor * me.sensitivity.getValue();
}
if(icing < 0) icing = 0;
me.ice_inches.setValue(icing);
if(me.output != nil) me.output.setValue(icing);
},
};
### Icing parameters computation.
# Environmental parameters of the icing model.
var environment = {
dewpoint: props.globals.getNode("/environment/dewpoint-degc"),
temperature: props.globals.getNode("/environment/temperature-degc"),
visibility: props.globals.getNode("/environment/effective-visibility-m"),
visibLclWx: props.globals.getNode("/environment/visibility-m"),
};
var effects = {
frost_inch: props.globals.getNode("/environment/aircraft-effects/frost-inch", 1),
frost_norm: props.globals.getNode("/environment/aircraft-effects/frost-level"),
};
# Icing factor computation.
var severity_factor_table = [
-0.00000166,
0.00000277,
0.00000277,
0.00000554,
0.00001108,
0.00002216,
];
var melt_factor = -0.00005;
var temperature = 0;
var spread = 0;
var icingCond = 0;
var severity = 0;
var icing_factor = func() {
temperature = environment.temperature.getValue();
# Do we create ice?
spread = temperature - environment.dewpoint.getValue();
# freezing fog or low temp and below dp or in advanced wx cloud
icingCond = ((spread < 0.1 or environment.visibility.getValue() < 1000 or environment.visibLclWx.getValue() < 5000)
and temperature < 0);
severity = 0;
if (icingCond) {
if (temperature >= -2) {
severity = 1;
} else if (temperature >= -12) {
severity = 3;
} else if (temperature >= -30) {
severity = 5;
} else if (temperature >= -40) {
severity = 3;
} else if (temperature >= -99) {
severity = 1;
}
}
return severity_factor_table[severity];
}
var speed = 0;
var windowprobe = 0;
var wingBtn = 0;
var wingFault = 0;
var PSI = 0;
var wowl = 0;
var wowr = 0;
var PitotIcing = 0;
var PitotFailed = 0;
var lengBtn = 0;
var lengFault = 0;
var rengBtn = 0;
var rengFault = 0;
var WingHasBeenTurnedOff = 0;
var GroundModeFinished = 0;
var windowprb = 0;
var stateL = 0;
var stateR = 0;
var iceables = [];
var PitotIcing = [props.globals.getNode("/systems/pitot[0]/icing"),props.globals.getNode("/systems/pitot[1]/icing"),props.globals.getNode("/systems/pitot[2]/icing")];
var PitotServicable = [props.globals.getNode("/systems/pitot[0]/serviceable", 1),props.globals.getNode("/systems/pitot[1]/serviceable", 1),props.globals.getNode("/systems/pitot[2]/serviceable"), 1];
var icingInit = func {
iceables = props.globals.getNode("/sim/model/icing", 1).getChildren("iceable");
forindex(var i; iceables) {
iceables[i] = Iceable.new(iceables[i]);
}
icing_timer.start();
}
var icingModel = func {
var factor = icing_factor();
foreach(iceable; iceables) {
iceable.update(factor, melt_factor);
}
effects.frost_norm.setDoubleValue(effects.frost_inch.getValue() * 50);
for (var i = 0; i <= 2; i = i + 1) {
if (PitotIcing[i].getValue() > 0.03) {
if (PitotServicable[i].getBoolValue()) {
PitotServicable[i].setBoolValue(0);
}
} else {
if (!PitotServicable[i].getBoolValue()) {
PitotServicable[i].setBoolValue(1);
}
}
}
}
###################
# Update Function #
###################
var update_Icing = func {
icingModel();
}
var icing_timer = maketimer(0.2, update_Icing);
icing_timer.simulatedTime = 1;