1
0
Fork 0
A320-family/Nasal/ADIRS/ADR.nas

140 lines
5 KiB
Text

# A3XX ADIRS System
# Jonathan Redpath (legoboyvdlp)
# Copyright (c) 2019 Jonathan Redpath (legoboyvdlp)
var _NUMADIRU = 3;
var ADR = {
outputDisc: 0, # 0 = disc, 1 = normal
mode: 0, # 0 = off, 1 = nav, 2 = att
energised: 0, # 0 = off, 1 = on
input: [],
new: func() {
var adr = { parents:[ADR] };
return adr;
},
updateEnergized: func(mode) {
me.energized = mode != 0 ? 1 : 0;
},
};
var IR = {
outputDisc: 0, # 0 = disc, 1 = normal
mode: 0, # 0 = off, 1 = nav, 2 = att
energised: 0, # 0 = off, 1 = on
input: [],
new: func() {
var ir = { parents:[IR] };
return ir;
},
updateEnergized: func(mode) {
me.energized = mode != 0 ? 1 : 0;
},
};
var ADIRSControlPanel = {
# local vars
_adrSwitchState: 0,
_irSwitchState: 0,
_irModeSwitchState: 0,
# ADIRS Units
ADRunits: [nil, nil, nil],
IRunits: [nil, nil, nil],
# PTS
Switches: {
adrSw: [props.globals.getNode("/controls/navigation/adirscp/switches/adr-1"), props.globals.getNode("/controls/navigation/adirscp/switches/adr-2"), props.globals.getNode("/controls/navigation/adirscp/switches/adr-3")],
irModeSw: [props.globals.getNode("/controls/navigation/adirscp/switches/ir-1-mode"), props.globals.getNode("/controls/navigation/adirscp/switches/ir-2-mode"), props.globals.getNode("/controls/navigation/adirscp/switches/ir-3-mode")],
irSw: [props.globals.getNode("/controls/navigation/adirscp/switches/ir-1"), props.globals.getNode("/controls/navigation/adirscp/switches/ir-2"), props.globals.getNode("/controls/navigation/adirscp/switches/ir-3")],
},
Lights: {
adrFault: [props.globals.getNode("/controls/navigation/adirscp/lights/adr-1-fault"), props.globals.getNode("/controls/navigation/adirscp/lights/adr-2-fault"), props.globals.getNode("/controls/navigation/adirscp/lights/adr-3-fault")],
adrOff: [props.globals.getNode("/controls/navigation/adirscp/lights/adr-1-off"), props.globals.getNode("/controls/navigation/adirscp/lights/adr-2-off"), props.globals.getNode("/controls/navigation/adirscp/lights/adr-3-off")],
irFault: [props.globals.getNode("/controls/navigation/adirscp/lights/ir-1-fault"), props.globals.getNode("/controls/navigation/adirscp/lights/ir-2-fault"), props.globals.getNode("/controls/navigation/adirscp/lights/ir-3-fault")],
irOff: [props.globals.getNode("/controls/navigation/adirscp/lights/ir-1-off"), props.globals.getNode("/controls/navigation/adirscp/lights/ir-2-off"), props.globals.getNode("/controls/navigation/adirscp/lights/ir-3-off")],
onBat: props.globals.getNode("/controls/navigation/adirscp/lights/on-bat"),
},
# Methods
adrSw: func(n) {
if (n < 0 or n > _NUMADIRU) { return; }
me._adrSwitchState = me.Switches.adrSw[n].getValue();
print("Switching adr unit " ~ n ~ " to " ~ !me._adrSwitchState);
me.Switches.adrSw[n].setValue(!me._adrSwitchState);
if (me.ADRunits[n] != nil) {
me.ADRunits[n].outputDisc = !me._adrSwitchState;
}
},
adrSw: func(n) {
if (n < 0 or n > _NUMADIRU) { return; }
me._irSwitchState = me.Switches.irSw[n].getValue();
print("Switching ir unit " ~ n ~ " to " ~ !me._irSwitchState);
me.Switches.irSw[n].setValue(!me._irSwitchState);
if (me.IRunits[n] != nil) {
me.IRunits[n].outputDisc = !me._irSwitchState;
}
},
irModeSw: func(n, mode) {
if (mode < 0 or mode > 2) { return; }
me._irModeSwitchState = me.Switches.irModeSw[n].getValue();
print("Switching adirs " ~ n ~ " to mode " ~ mode);
if (me.ADRunits[n] != nil) {
me.ADRunits[n].mode = mode;
me.ADRunits[n].updateEnergized(mode);
}
if (me.IRunits[n] != nil) {
me.IRunits[n].mode = mode;
me.IRunits[n].updateEnergized(mode);
}
}
};
var SwitchingPanel = {
Switches: {
attHdg: props.globals.getNode("/controls/navigation/switching/att-hdg"),
airData: props.globals.getNode("/controls/navigation/switching/air-data"),
},
};
var ADIRSnew = {
_flapPos: nil,
_slatPos: nil,
overspeedVFE: props.globals.initNode("/systems/navigation/adr/computation/overspeed-vfe-spd", 0, "INT"),
init: func() {
for (i = 0; i < _NUMADIRU; i = i + 1) {
print("Creating new ADR unit " ~ i);
ADIRSControlPanel.ADRunits[i] = ADR.new();
}
},
update_items: [
props.UpdateManager.FromPropertyHashList(["/fdm/jsbsim/fcs/flap-pos-deg","/fdm/jsbsim/fcs/slat-pos-deg"], 0.1, func(notification)
{
me._flapPos = pts.JSBSIM.FCS.flapDeg.getValue();
me._slatPos = pts.JSBSIM.FCS.slatDeg.getValue();
if (me._flapPos >= 23 and me._slatPos >= 25) {
ADIRSnew.overspeedVFE.setValue(181);
} elsif (me._flapPos >= 18) {
ADIRSnew.overspeedVFE.setValue(189);
} elsif (me._flapPos >= 13 or me._slatPos > 20) {
ADIRSnew.overspeedVFE.setValue(204);
} elsif (me._slatPos <= 20 and me._flapPos > 2) {
ADIRSnew.overspeedVFE.setValue(219);
} elsif (me._slatPos >= 2 and me._slatPos <= 20) {
ADIRSnew.overspeedVFE.setValue(234);
} else {
ADIRSnew.overspeedVFE.setValue(1024);
}
}
),
],
loop: func() {
notification = nil;
foreach (var update_item; me.update_items) {
update_item.update(notification);
}
},
};