diff --git a/A320-200-IAE.xml b/A320-200-IAE.xml
index 872f5b88..1569aff2 100644
--- a/A320-200-IAE.xml
+++ b/A320-200-IAE.xml
@@ -7,172 +7,199 @@
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:noNamespaceSchemaLocation="http://jsbsim.sourceforge.net/JSBSim.xsd">
-
- Joshua Davidson (Octal450)
- Pre V1.0
- A32X FDE
-
-
-
-
-
-
-
-
-
- 14.3962788
- -5.755
- -1.04768
-
-
- 0.0
- 2.2
- 1
-
- 5
-
-
- 14.3962788
- -5.755
- -1.04768
-
-
- 0.0
- 2.2
- 1
-
-
-
-
-
-
- 14.3962788
- 5.755
- -1.04768
-
-
- 0.0
- 2.2
- -1
-
- 6
-
-
- 14.3962788
- 5.755
- -1.04768
-
-
- 0.0
- 2.2
- -1
-
-
-
-
-
-
- 18.9231
- -5.1104
- -0.61182
-
- 1523.00
- 1523.00
- 4.0
- 1
- 6.71
- 50
-
-
-
- 18.9231
- -5.1104
- -0.61182
-
- 12272.90
- 6000.00
- 28.0
- 1
- 6.71
- 50
-
-
-
- 18.9731
- 0
- -0.61182
-
- 14623.00
- 42
- 23.20
- 1
- 6.71
- 50
-
-
-
- 18.9231
- 5.1104
- -0.61182
-
- 12272.90
- 6000.00
- 28.0
- 1
- 6.71
- 50
-
-
-
- 18.9231
- 5.1104
- -0.61182
-
- 1523.00
- 1523.00
- 4.0
- 1
- 6.71
- 50
-
-
-
- 18.8231
- 0
- 0.19249
-
- 10
- 0
- 1
- 6.71
-
-
-
- 18.8231
- 0
- 0.19249
-
- 10
- 0
- 1
- 6.71
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
+
+ Joshua Davidson (Octal450)
+ Pre V1.0
+ A32X FDE
+
+
+
+
+
+
+
+
+
+ 14.3962788
+ -5.755
+ -1.04768
+
+
+ 0.0
+ 2.2
+ 1
+
+ 5
+
+
+ 14.3962788
+ -5.755
+ -1.04768
+
+
+ 0.0
+ 2.2
+ 1
+
+
+
+
+
+
+ 14.3962788
+ 5.755
+ -1.04768
+
+
+ 0.0
+ 2.2
+ -1
+
+ 6
+
+
+ 14.3962788
+ 5.755
+ -1.04768
+
+
+ 0.0
+ 2.2
+ -1
+
+
+
+
+
+
+ 38.9
+ 0
+ 0.95
+
+
+ 0.0
+ 0.0
+ 0.0
+
+ 6
+
+
+ 38.9
+ 0
+ 0.95
+
+
+ 0.0
+ 0.0
+ 0.0
+
+
+
+
+
+
+ 18.9231
+ -5.1104
+ -0.61182
+
+ 1523.00
+ 1523.00
+ 4.0
+ 1
+ 6.71
+ 50
+
+
+
+ 18.9231
+ -5.1104
+ -0.61182
+
+ 12272.90
+ 6000.00
+ 28.0
+ 1
+ 6.71
+ 50
+
+
+
+ 18.9731
+ 0
+ -0.61182
+
+ 14623.00
+ 42
+ 23.20
+ 1
+ 6.71
+ 50
+
+
+
+ 18.9231
+ 5.1104
+ -0.61182
+
+ 12272.90
+ 6000.00
+ 28.0
+ 1
+ 6.71
+ 50
+
+
+
+ 18.9231
+ 5.1104
+ -0.61182
+
+ 1523.00
+ 1523.00
+ 4.0
+ 1
+ 6.71
+ 50
+
+
+
+ 18.8231
+ 0
+ 0.19249
+
+ 10
+ 0
+ 1
+ 6.71
+
+
+
+ 18.8231
+ 0
+ 0.19249
+
+ 10
+ 0
+ 1
+ 6.71
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/A320-main.xml b/A320-main.xml
index 349962d0..090f23c4 100644
--- a/A320-main.xml
+++ b/A320-main.xml
@@ -553,11 +553,6 @@
350
-
-
- 0
- 0
-
0
@@ -614,14 +609,15 @@
0
0
-
+
+ 0
0
0
0
0
0
0
-
+
0
0
@@ -679,6 +675,12 @@
0
0
+
+ true
+ 0
+ 0
+ 0
+
@@ -867,12 +869,6 @@
-
- 0
- 0
- 0
- true
-
0
1
@@ -893,6 +889,13 @@
0
0
+
+ 0
+ 0
+ 0
+ 0
+ 1
+
@@ -939,9 +942,13 @@
2000
0
-
- 0
- false
+
+
+ 5.4
+
+ 0
+ 0
+ 0
@@ -3878,6 +3885,7 @@
Aircraft/A320-family/AircraftConfig/acconfig.nas
+ Aircraft/A320-family/Nasal/Systems/APU.nas
Aircraft/A320-family/Nasal/Effects/effects.nas
Aircraft/A320-family/Nasal/Systems/electrical.nas
Aircraft/A320-family/Nasal/Systems/pneumatics.nas
diff --git a/AircraftConfig/acconfig.nas b/AircraftConfig/acconfig.nas
index 047f70e0..93d94ca5 100644
--- a/AircraftConfig/acconfig.nas
+++ b/AircraftConfig/acconfig.nas
@@ -305,8 +305,8 @@ var colddark = func {
}
var colddark_b = func {
# Continues the Cold and Dark script, after engines fully shutdown.
- setprop("controls/APU/master", 0);
- setprop("controls/APU/start", 0);
+ setprop("controls/apu/master", 0);
+ setprop("controls/apu/start", 0);
settimer(func {
setprop("controls/gear/brake-left", 0);
setprop("controls/gear/brake-right", 0);
@@ -342,14 +342,14 @@ var beforestart = func {
setprop("controls/flight/elevator-trim", 0);
libraries.systemsInit();
failResetOld();
- setprop("controls/APU/master", 0);
- setprop("controls/APU/start", 0);
+ setprop("controls/apu/master", 0);
+ setprop("controls/apu/start", 0);
# Now the Startup!
props.globals.getNode("controls/electrical/switches/bat-1").setValue(1);
props.globals.getNode("controls/electrical/switches/bat-2").setValue(1);
- setprop("controls/APU/master", 1);
- setprop("controls/APU/start", 1);
+ setprop("controls/apu/master", 1);
+ setprop("controls/apu/start", 1);
var apu_rpm_chk = setlistener("/systems/apu/rpm", func {
if (getprop("systems/apu/rpm") >= 98) {
removelistener(apu_rpm_chk);
@@ -433,14 +433,14 @@ var taxi = func {
setprop("controls/flight/elevator-trim", 0);
libraries.systemsInit();
failResetOld();
- setprop("controls/APU/master", 0);
- setprop("controls/APU/start", 0);
+ setprop("controls/apu/master", 0);
+ setprop("controls/apu/start", 0);
# Now the Startup!
props.globals.getNode("controls/electrical/switches/bat-1").setValue(1);
props.globals.getNode("controls/electrical/switches/bat-2").setValue(1);
- setprop("controls/APU/master", 1);
- setprop("controls/APU/start", 1);
+ setprop("controls/apu/master", 1);
+ setprop("controls/apu/start", 1);
var apu_rpm_chk = setlistener("/systems/apu/rpm", func {
if (getprop("systems/apu/rpm") >= 98) {
removelistener(apu_rpm_chk);
@@ -510,8 +510,8 @@ var taxi_c = func {
var taxi_d = func {
# After Start items.
setprop("controls/engines/engine-start-switch", 1);
- setprop("controls/APU/master", 0);
- setprop("controls/APU/start", 0);
+ setprop("controls/apu/master", 0);
+ setprop("controls/apu/start", 0);
setprop("controls/pneumatic/switches/bleedapu", 0);
setprop("controls/gear/brake-left", 0);
setprop("controls/gear/brake-right", 0);
diff --git a/Engines/APS3200.xml b/Engines/APS3200.xml
new file mode 100644
index 00000000..8bf3d74f
--- /dev/null
+++ b/Engines/APS3200.xml
@@ -0,0 +1,80 @@
+
+
+
+
+
+ 2.6
+ 0.000
+ 0.820
+ 0.96
+
+
+ 5.0
+ 26
+ 3.0
+ 8.666
+ 1.8222
+ 1.8222
+ 99.9
+ 99.9
+
+ 100.0
+ 100.0
+ 0
+ 0
+
+
+
+ velocities/mach
+ atmosphere/density-altitude
+
+ -10000 0 10000 20000 30000 40000 50000 90000
+ 0.0 0.0430 0.0488 0.0528 0.0694 0.0899 0.1183 0.1467 0
+ 0.2 0.0500 0.0501 0.0335 0.0544 0.0797 0.1049 0.1342 0
+ 0.4 0.0040 0.0047 0.0020 0.0272 0.0595 0.0891 0.1203 0
+ 0.6 -0.0804 -0.0804 -0.0560 -0.0237 0.0276 0.0718 0.1073 0
+ 0.8 -0.2129 -0.2129 -0.1498 -0.1025 0.0474 0.0868 0.0900 0
+ 1.0 -0.2839 -0.2839 -0.1104 -0.0469 -0.0270 0.0552 0.0800 0
+
+
+
+
+
+
+ velocities/mach
+ atmosphere/density-altitude
+
+ -10000 0 10000 20000 30000 40000 50000 60000 90000
+ 0.0 1.2600 1.0000 0.7400 0.5340 0.3720 0.2410 0.1490 0.0580 0
+ 0.2 1.1692 0.9326 0.6959 0.5052 0.3545 0.2306 0.1428 0.0399 0
+ 0.4 1.1465 0.9182 0.6899 0.5044 0.3559 0.2323 0.1446 0.0429 0
+ 0.6 1.1755 0.9466 0.7177 0.5295 0.3763 0.2469 0.1533 0.0468 0
+ 0.8 1.2503 1.0137 0.7772 0.5784 0.4144 0.2733 0.1690 0.0527 0
+ 1.0 1.3585 1.1114 0.8643 0.6460 0.4713 0.3126 0.1935 0.0625 0
+ 1.2 1.4713 1.2186 0.9660 0.7371 0.5400 0.3606 0.2229 0.0733 0
+ 1.4 1.5769 1.3256 1.0743 0.8359 0.6212 0.4194 0.2602 0.0890 0
+
+
+
+
+
diff --git a/Models/Instruments/Lower-ECAM/Lower-ECAM.nas b/Models/Instruments/Lower-ECAM/Lower-ECAM.nas
index a4cfed8f..bbc98dcb 100644
--- a/Models/Instruments/Lower-ECAM/Lower-ECAM.nas
+++ b/Models/Instruments/Lower-ECAM/Lower-ECAM.nas
@@ -52,9 +52,9 @@ var lighting_du4 = props.globals.getNode("controls/lighting/DU/du4", 1);
var ecam_page = props.globals.getNode("ECAM/Lower/page", 1);
var hour = props.globals.getNode("sim/time/utc/hour", 1);
var minute = props.globals.getNode("sim/time/utc/minute", 1);
-var apu_flap = props.globals.getNode("systems/apu/flap", 1);
-var apu_rpm = props.globals.getNode("systems/apu/rpm", 1);
-var apu_egt = props.globals.getNode("systems/apu/egt", 1);
+var apu_flap = props.globals.getNode("controls/apu/inlet-flap/position-norm", 1);
+var apu_rpm = props.globals.getNode("engines/engine[2]/n1", 1);
+var apu_egt = props.globals.getNode("systems/apu/egt-degC", 1);
var door_left = props.globals.getNode("ECAM/Lower/door-left", 1);
var door_right = props.globals.getNode("ECAM/Lower/door-right", 1);
var door_nose_left = props.globals.getNode("ECAM/Lower/door-nose-left", 1);
@@ -77,7 +77,7 @@ var final_deg = props.globals.getNode("fdm/jsbsim/hydraulics/rudder/final-deg",
var temperature_degc = props.globals.getNode("environment/temperature-degc", 1);
var gw = props.globals.getNode("FMGC/internal/gw", 1);
var tank3_content_lbs = props.globals.getNode("fdm/jsbsim/propulsion/tank[2]/contents-lbs", 1);
-var apu_master = props.globals.getNode("controls/APU/master", 1);
+var apu_master = props.globals.getNode("controls/apu/master", 1);
var ir2_knob = props.globals.getNode("controls/adirs/ir[1]/knob", 1);
var switch_bleedapu = props.globals.getNode("controls/pneumatic/switches/bleedapu", 1);
var pneumatic_xbleed_state = props.globals.getNode("systems/pneumatic/xbleed-state", 1);
diff --git a/Models/Instruments/OHpanel.new/OHpanel.xml b/Models/Instruments/OHpanel.new/OHpanel.xml
index af64ae10..0e1b871e 100644
--- a/Models/Instruments/OHpanel.new/OHpanel.xml
+++ b/Models/Instruments/OHpanel.new/OHpanel.xml
@@ -344,7 +344,7 @@
false
property-toggle
- controls/APU/fire-switch
+ controls/apu/fire-switch
nasal
@@ -360,7 +360,7 @@
0.9
0.7
0.7
- controls/APU/fire-switch
+ controls/apu/fire-switch
@@ -1515,7 +1515,7 @@
false
property-toggle
- controls/APU/master-switch
+ controls/apu/master-switch
nasal
@@ -1541,7 +1541,7 @@
APU master switch on
textranslate
APUMasterBtn2
- controls/APU/master-switch
+ controls/apu/master-switch
0.5
1
@@ -1559,7 +1559,7 @@
false
property-toggle
- controls/APU/starter
+ controls/apu/starter
nasal
@@ -1571,7 +1571,7 @@
APU starter on
textranslate
APUStartBtn2
- controls/APU/starter
+ controls/apu/starter
0.5
1
diff --git a/Models/Instruments/OHpanel/OHpanel.xml b/Models/Instruments/OHpanel/OHpanel.xml
index 2e3ed547..9d55e4b5 100644
--- a/Models/Instruments/OHpanel/OHpanel.xml
+++ b/Models/Instruments/OHpanel/OHpanel.xml
@@ -23,16 +23,8 @@
ADR2Btn2O
ADR3Btn1F
ADR3Btn2O
- APUBleedBtn1F
- APUBleedBtn2O
APUFireAgtBtn1S
APUFireAgtBtn2D
- APUGenBtn1F
- APUGenBtn2O
- APUMasterBtn1F
- APUMasterBtn2O
- APUStartBtn1A
- APUStartBtn2O
BatteryBtn11F
BatteryBtn21F
BusTieBtn2O
@@ -43,10 +35,6 @@
ExtPwrBtn2O
FAC1Btn1F
FAC1Btn2O
- Gen1Btn1F
- Gen1Btn2O
- Gen2Btn1F
- Gen2Btn2O
IR1Btn1F
IR1Btn2A
IR2Btn1F
@@ -72,6 +60,34 @@
+
+
+ select
+ APUBleedBtn1F
+ APUBleedBtn2O
+ APUGenBtn1F
+ APUGenBtn2O
+ APUMasterBtn1F
+ APUMasterBtn2O
+ APUStartBtn1A
+ APUStartBtn2O
+ Gen1Btn1F
+ Gen1Btn2O
+ Gen2Btn1F
+ Gen2Btn2O
+
+
+
+ systems/electrical/bus/ac-si-bus
+ 5
+
+
+ systems/electrical/bus/ac-ess
+ 5
+
+
+
+
select
@@ -3251,7 +3267,7 @@
systems/electrical/bus/dc-bat
25
-
+
property-toggle
controls/electrical/switches/apu
@@ -5577,7 +5593,7 @@
property-toggle
- controls/APU/master
+ controls/apu/master
nasal
@@ -5606,7 +5622,7 @@
- controls/APU/master
+ controls/apu/master
1
@@ -5634,16 +5650,12 @@
systems/electrical/bus/dc-bat
25
-
- systems/electrical/bus/dc-ess
- 25
-
nasal
@@ -5659,10 +5671,10 @@
APUStartBtn1A
-
- systems/apu/rpm
- 94.9
-
+
+ systems/apu/available
+ 1
+
controls/switches/annun-test
1
@@ -5676,16 +5688,10 @@
APUStartBtn2O
-
-
- controls/APU/start
- 1
-
-
- systems/apu/rpm
- 94.9
-
-
+
+ systems/apu/start
+ 1
+
controls/switches/annun-test
1
@@ -6740,13 +6746,13 @@
nasal
@@ -6763,13 +6769,13 @@
nasal
@@ -6779,7 +6785,7 @@
rotate
APUFireCover
- controls/APU/fire-btn-cover
+ controls/apu/fire-btn-cover
-110
-0.00583
@@ -6794,7 +6800,7 @@
translate
APUFireBtn
- controls/APU/fire-btn
+ controls/apu/fire-btn
0.025
1
@@ -6829,7 +6835,7 @@
false
property-assign
- controls/APU/agent-btn
+ controls/apu/agent-btn
1
@@ -6857,7 +6863,7 @@
- controls/APU/fire-btn
+ controls/apu/fire-btn
1
diff --git a/Nasal/ECAM/ECAM-logic.nas b/Nasal/ECAM/ECAM-logic.nas
index 2621095f..5a7537a1 100644
--- a/Nasal/ECAM/ECAM-logic.nas
+++ b/Nasal/ECAM/ECAM-logic.nas
@@ -16,7 +16,7 @@ var state2Node = props.globals.getNode("engines/engine[1]/state", 1);
var wowNode = props.globals.getNode("fdm/jsbsim/position/wow", 1);
var apu_rpm = props.globals.getNode("systems/apu/rpm", 1);
var wing_pb = props.globals.getNode("controls/switches/wing", 1);
-var apumaster = props.globals.getNode("controls/APU/master", 1);
+var apumaster = props.globals.getNode("controls/apu/master", 1);
var apu_bleedSw = props.globals.getNode("controls/pneumatic/switches/bleedapu", 1);
var gear = props.globals.getNode("gear/gear-pos-norm", 1);
var cutoff1 = props.globals.getNode("controls/engines/engine[0]/cutoff-switch", 1);
@@ -424,7 +424,7 @@ var messages_priority_3 = func {
ECAM_controller.warningReset(eng1FireGnevacSw);
}
- if (eng1FireGnevacApu.clearFlag == 0 and getprop("controls/APU/master") and getprop("systems/apu/rpm") > 99) {
+ if (eng1FireGnevacApu.clearFlag == 0 and getprop("controls/apu/master") and getprop("systems/apu/rpm") > 99) {
eng1FireGnevacApu.active = 1;
} else {
ECAM_controller.warningReset(eng1FireGnevacApu);
@@ -607,7 +607,7 @@ var messages_priority_3 = func {
ECAM_controller.warningReset(eng2FireGnevacSw);
}
- if (eng2FireGnevacApu.clearFlag == 0 and getprop("controls/APU/master") and getprop("systems/apu/rpm") > 99) {
+ if (eng2FireGnevacApu.clearFlag == 0 and getprop("controls/apu/master") and getprop("systems/apu/rpm") > 99) {
eng2FireGnevacApu.active = 1;
} else {
ECAM_controller.warningReset(eng2FireGnevacApu);
@@ -660,7 +660,7 @@ var messages_priority_3 = func {
# APU Fire
if (apuFire.active == 1) {
- if (apuFirePB.clearFlag == 0 and !getprop("controls/APU/fire-btn")) {
+ if (apuFirePB.clearFlag == 0 and !getprop("controls/apu/fire-btn")) {
apuFirePB.active = 1;
} else {
ECAM_controller.warningReset(apuFirePB);
@@ -670,19 +670,19 @@ var messages_priority_3 = func {
apuFireAgentTimer.msg = " -AGENT AFT " ~ getprop("systems/fire/apu/agent-timer") ~ " S...DISCH";
}
- if (apuFireAgent.clearFlag == 0 and getprop("controls/APU/fire-btn") and !getprop("systems/fire/apu/disch") and getprop("systems/fire/apu/agent-timer") != 0) {
+ if (apuFireAgent.clearFlag == 0 and getprop("controls/apu/fire-btn") and !getprop("systems/fire/apu/disch") and getprop("systems/fire/apu/agent-timer") != 0) {
apuFireAgentTimer.active = 1;
} else {
ECAM_controller.warningReset(apuFireAgentTimer);
}
- if (apuFireAgent.clearFlag == 0 and getprop("controls/APU/fire-btn") and !getprop("systems/fire/apu/disch") and getprop("systems/fire/apu/agent-timer") == 0) {
+ if (apuFireAgent.clearFlag == 0 and getprop("controls/apu/fire-btn") and !getprop("systems/fire/apu/disch") and getprop("systems/fire/apu/agent-timer") == 0) {
apuFireAgent.active = 1;
} else {
ECAM_controller.warningReset(apuFireAgent);
}
- if (apuFireMaster.clearFlag == 0 and getprop("controls/APU/master")) {
+ if (apuFireMaster.clearFlag == 0 and getprop("controls/apu/master")) {
apuFireMaster.active = 1;
} else {
ECAM_controller.warningReset(apuFireMaster);
@@ -1204,7 +1204,7 @@ var messages_priority_2 = func {
apuEmerShutdown.isMainMsg = 1;
}
- if (apuEmerShutdownMast.clearFlag == 0 and getprop("controls/APU/master") and apuEmerShutdown.active == 1) {
+ if (apuEmerShutdownMast.clearFlag == 0 and getprop("controls/apu/master") and apuEmerShutdown.active == 1) {
apuEmerShutdownMast.active = 1;
} else {
ECAM_controller.warningReset(apuEmerShutdownMast);
diff --git a/Nasal/Sim/buttons.nas b/Nasal/Sim/buttons.nas
index 4a29c247..4bdce18c 100644
--- a/Nasal/Sim/buttons.nas
+++ b/Nasal/Sim/buttons.nas
@@ -164,8 +164,8 @@ var CVR_test = func {
}
}
-setlistener("/controls/APU/master", func() {
- if (!getprop("controls/APU/master") and systems.apuEmerShutdown.getBoolValue()) {
+setlistener("/controls/apu/master", func() {
+ if (!getprop("controls/apu/master") and systems.apuEmerShutdown.getBoolValue()) {
systems.apuEmerShutdown.setBoolValue(0);
}
}, 0, 0);
\ No newline at end of file
diff --git a/Nasal/Sim/libraries.nas b/Nasal/Sim/libraries.nas
index 23efdbfb..900eae8f 100644
--- a/Nasal/Sim/libraries.nas
+++ b/Nasal/Sim/libraries.nas
@@ -203,6 +203,7 @@ var systemsInit = func {
systems.ADIRS.init();
systems.ADIRSnew.init();
systems.eng_init();
+ systems.APUController.init();
systems.fire_init();
systems.autobrake_init();
fmgc.flightPlanController.reset();
diff --git a/Nasal/Sim/property-tree-setup.nas b/Nasal/Sim/property-tree-setup.nas
index ad907609..257dc2d0 100644
--- a/Nasal/Sim/property-tree-setup.nas
+++ b/Nasal/Sim/property-tree-setup.nas
@@ -6,8 +6,8 @@
# Usage Example: pts.Class.SubClass.node.getValue()
var APU = {
- masterSw: props.globals.getNode("controls/APU/master"),
- rpm: props.globals.getNode("systems/apu/rpm"),
+ masterSw: props.globals.getNode("controls/apu/master"),
+ rpm: props.globals.getNode("engines/engine[2]/n1"),
};
var Consumables = {
diff --git a/Nasal/Systems/APU.nas b/Nasal/Systems/APU.nas
index 9033032f..a8847a67 100644
--- a/Nasal/Systems/APU.nas
+++ b/Nasal/Systems/APU.nas
@@ -3,52 +3,218 @@
# Copyright (c) 2019 Jonathan Redpath (legoboyvdlp)
+var APUNodes = {
+ Controls: {
+ master: props.globals.getNode("controls/apu/master"),
+ bleed: props.globals.getNode("controls/pneumatic/switches/bleedapu"),
+ },
+ Oil: {
+ level: props.globals.getNode("systems/apu/oil/level-l"),
+ },
+ masterElecThreeMin: props.globals.getNode("systems/apu/dc-bat-three-minutes"),
+};
+
var APU = {
- state: 0, # power up, watch, starting, run, cooldown, shutdown
- nRpm: 0,
- fuelValve: aircraft.door.new("/controls/apu/fuel-valve", 1),
- inletFlap: aircraft.door.new("/controls/apu/inlet-flap", 12),
+ state: 0, # off, power up, watch, starting preparation, starting, run, cooldown, shutdown
+ fuelValve: aircraft.door.new("controls/apu/fuel-valve", 1),
+ inletFlap: aircraft.door.new("controls/apu/inlet-flap", 12),
+ fuelValvePos: props.globals.getNode("controls/apu/fuel-valve/position-norm"),
+ inletFlapPos: props.globals.getNode("controls/apu/inlet-flap/position-norm"),
+ oilLevel: props.globals.getNode("systems/apu/oil/level-l"),
listenSignals: 0,
- start: 0,
- cancelCheckFlap: 0,
- new: func() {
- var a = { parents:[APU] };
- return a;
+ listenStopSignal: 0,
+ bleedTime: 0,
+ cooldownEndTime: 0,
+ warnings: {
+ lowOilLevel: 0,
+ },
+ GenericControls: {
+ starter: props.globals.getNode("controls/engines/engine[2]/starter"),
+ cutoff: props.globals.getNode("controls/engines/engine[2]/cutoff"),
+ throttle: props.globals.getNode("controls/engines/engine[2]/throttle"),
+ },
+ signals: {
+ startInProgress: props.globals.getNode("systems/apu/start"),
+ oilTestComplete: 0,
+ available: props.globals.getNode("systems/apu/available"),
+ bleedWasUsed: 0,
+ fault: 0,
+ autoshutdown: 0,
},
setState: func(num) {
me.state = num;
},
+ resetStuff: func() {
+ me.setState(0);
+ me.warnings.lowOilLevel = 0;
+ me.listenSignals = 0;
+ me.listenStopSignal = 0;
+ me.bleedTime = 0;
+ me.cooldownEndTime = 0;
+ me.signals.oilTestComplete = 0;
+ me.signals.bleedWasUsed = 0;
+ me.signals.fault = 0;
+ me.signals.autoshutdown = 0;
+ },
+ new: func() {
+ var a = { parents:[APU] };
+ return a;
+ me.GenericControls.throttle.setValue(1);
+ },
+ # Tests
+ checkOil: func() {
+ if (me.oilLevel.getValue() < 3.69) {
+ me.warnings.lowOilLevel = 1;
+ } else {
+ me.warnings.lowOilLevel = 0;
+ }
+ me.signals.oilTestComplete = 1;
+ },
+
+ # Routines to do with state
powerOn: func() {
# apu able to receive emergency stop or start signals
+ me.setState(1);
me.fuelValve.open();
me.inletFlap.open();
+ me.checkOil();
me.listenSignals = 1;
- settimer(me.setState(1), 3);
+ settimer(func() { me.setState(2)}, 3);
+ settimer(func() { me.checkOil }, 8);
},
- getStartSignal: func() {
- if (me.listenSignals and me.state < 2 and me.nRpm < 7) {
- me.start = 1;
- me.startCheckFlap();
- } elsif (me.listenSignals) {
- settimer(me.getStartSignal(), 0);
+ startCommand: func() {
+ if (me.listenSignals and (me.state == 1 or me.state == 2)) {
+ me.signals.startInProgress.setValue(1);
+ me.setState(3);
+ checkApuStartTimer.start();
}
},
- startCheckFlap: func() {
- if (me.inletFlap.getpos() != 1 and me.cancelCheckFlap == 0 and me.state == 1) {
- settimer(me.startCheckFlap(), 0);
- } elsif (me.cancelCheckFlap) {
- me.cancelCheckFlap = 0;
- } else {
- me.setState(2);
+ checkApuStart: func() {
+ if (pts.APU.rpm.getValue() < 7 and me.fuelValvePos.getValue() and me.inletFlapPos.getValue() == 1 and me.signals.oilTestComplete and !me.warnings.lowOilLevel) {
+ me.setState(4);
+ me.listenStopSignal = 1;
+ checkApuStartTimer.stop();
+ me.startSequence();
}
},
- getStopSignal: func() {
- if (me.listenSignals) {
- me.cancelCheckFlap = 1;
+ startSequence: func() {
+ me.GenericControls.starter.setValue(1);
+ apuStartTimer.start();
+ },
+ waitStart: func() {
+ if (pts.APU.rpm.getValue() >= 4.9) {
+ me.GenericControls.cutoff.setValue(0);
+ apuStartTimer.stop();
+ apuStartTimer2.start();
+ }
+ },
+ waitStart2: func() {
+ if (pts.APU.rpm.getValue() >= 99.9) {
+ me.GenericControls.starter.setValue(0);
+ me.signals.startInProgress.setValue(0);
+ me.signals.available.setValue(1);
+ me.setState(5);
+ apuStartTimer2.stop();
+ }
+ },
+ cooldown: func() {
+ if (APUNodes.Controls.master.getValue()) {
+ cooldownTimer.stop();
+ me.setState(5);
+ return;
+ }
+ if (pts.Sim.Time.elapsedSec.getValue() >= me.cooldownEndTime) {
+ cooldownTimer.stop();
+ me.stopAPU();
+ me.setState(7);
+ shutdownTimer.start();
+ }
+ },
+ shutdown: func() {
+ if (!me.signals.autoshutdown and APUNodes.Controls.master.getValue()) {
+ me.powerOn();
+ return;
+ }
+
+ me.GenericControls.cutoff.setValue(1);
+ me.GenericControls.starter.setValue(0);
+
+ if (!me.signals.autoshutdown and pts.APU.rpm.getValue() < 95 and me.signals.available.getValue()) {
+ me.signals.available.setValue(0);
+ }
+ if (me.signals.autoshutdown and (me.signals.available.getValue() or !me.signals.fault)) {
+ me.signals.available.setValue(0);
+ me.signals.fault = 1;
+ }
+
+ if (pts.APU.rpm.getValue() < 7) {
me.inletFlap.close();
- # wait for flap close --> power down relay output
+ me.fuelValve.close();
+ if (!APUNodes.Controls.master.getValue()) {
+ me.setState(0);
+ me.resetStuff();
+ shutdownTimer.stop();
+ }
}
},
+
+ # Signal generators / receivers
+ stop: func() {
+ if (me.listenStopSignal and me.state == 4) {
+ me.signals.startInProgress.setValue(0);
+ me.stopAPU();
+ me.setState(7);
+ shutdownTimer.start();
+ } else {
+ if (me.signals.bleedWasUsed) {
+ if (120 - (pts.Sim.Time.elapsedSec.getValue() - me.bleedTime) > 0) {
+ me.cooldownEndTime = me.bleedTime + 120;
+ me.setState(6);
+ cooldownTimer.start();
+ } else {
+ me.stopAPU();
+ me.setState(7);
+ shutdownTimer.start();
+ }
+ } else {
+ me.stopAPU();
+ me.setState(7);
+ shutdownTimer.start();
+ }
+ }
+ },
+ autoStop: func() {
+ if (me.state >= 4) {
+ checkApuStartTimer.stop();
+ apuStartTimer.stop();
+ apuStartTimer2.stop();
+ apuStartTimer3.stop();
+ cooldownTimer.stop();
+ me.stopAPU();
+ me.setState(7);
+ shutdownTimer.start();
+ }
+ },
+ emergencyStop: func() {
+ if (me.listenSignals and (me.state < 4)) {
+ checkApuStartTimer.stop();
+ me.inletFlap.close();
+ me.fuelValve.close();
+ me.signals.fault = 1;
+ me.setState(0);
+ } elsif (me.state >= 4) {
+ me.autoStop();
+ }
+ },
+
+ # Functions
+ stopAPU: func() {
+ me.GenericControls.cutoff.setValue(1);
+ },
+ shutBleed: func() {
+ APUNodes.Controls.bleed.setValue(0);
+ me.bleedTime.setValue(pts.Sim.Time.elapsedSec.getValue());
+ },
};
var APUController = {
@@ -59,9 +225,48 @@ var APUController = {
me.APU = APU.new();
}
},
- loop: func() {
- if (me.APU != nil) {
- APU.update();
- }
- },
-};
\ No newline at end of file
+};
+
+var _masterTime = 0;
+setlistener("controls/apu/master", func() {
+ if (APUNodes.Controls.master.getValue() and APUController.APU.state == 0) {
+ APUNodes.masterElecThreeMin.setValue(1);
+ checkMasterThreeMinTimer.start();
+ _masterTime = pts.Sim.Time.elapsedSec.getValue();
+ APUController.APU.powerOn();
+ } elsif (!APUNodes.Controls.master.getValue()) {
+ APUController.APU.stop();
+ }
+}, 0, 0);
+
+setlistener("controls/pneumatic/switches/bleedapu", func() {
+ APUController.APU.signals.bleedWasUsed = 1;
+}, 0, 0);
+
+var checkMasterThreeMinTimer = maketimer(0.1, func() {
+ if (!APUNodes.Controls.master.getValue()) {
+ APUNodes.masterElecThreeMin.setValue(0);
+ checkMasterThreeMinTimer.stop();
+ return;
+ }
+
+ if (pts.Sim.Time.elapsedSec.getValue() >= _masterTime + 180) {
+ APUNodes.masterElecThreeMin.setValue(0);
+ checkMasterThreeMinTimer.stop();
+ }
+});
+var checkApuStartTimer = maketimer(0.1, func() {
+ APUController.APU.checkApuStart();
+});
+var apuStartTimer = maketimer(0.1, func() {
+ APUController.APU.waitStart();
+});
+var apuStartTimer2 = maketimer(0.1, func() {
+ APUController.APU.waitStart2();
+});
+var cooldownTimer = maketimer(0.1, func() {
+ APUController.APU.cooldown();
+});
+var shutdownTimer = maketimer(0.1, func() {
+ APUController.APU.shutdown();
+});
\ No newline at end of file
diff --git a/Nasal/Systems/FADEC/engines-common.nas b/Nasal/Systems/FADEC/engines-common.nas
index 5bdf8b4b..7d3416b4 100644
--- a/Nasal/Systems/FADEC/engines-common.nas
+++ b/Nasal/Systems/FADEC/engines-common.nas
@@ -24,8 +24,8 @@ var eng_common_init = func {
}
# Start APU
-setlistener("/controls/APU/start", func {
- if (getprop("controls/APU/master") == 1 and getprop("controls/APU/start") == 1) {
+setlistener("/controls/apu/start", func {
+ if (getprop("controls/apu/master") == 1 and getprop("controls/apu/start") == 1) {
apuBleedChk.stop();
setprop("systems/apu/bleed-counting", 0);
if (getprop("systems/acconfig/autoconfig-running") == 0) {
@@ -35,7 +35,7 @@ setlistener("/controls/APU/start", func {
interpolate("/systems/apu/rpm", apu_max, 5);
interpolate("/systems/apu/egt", apu_egt_min, 5);
}
- } else if (getprop("controls/APU/master") == 0) {
+ } else if (getprop("controls/apu/master") == 0) {
apu_egt_check.stop();
apu_stop();
}
@@ -57,13 +57,13 @@ var apu_egt2_check = maketimer(0.5, func {
});
# Stop APU
-setlistener("/controls/APU/master", func {
- if (getprop("controls/APU/master") == 0) {
- setprop("controls/APU/start", 0);
+setlistener("/controls/apu/master", func {
+ if (getprop("controls/apu/master") == 0) {
+ setprop("controls/apu/start", 0);
apu_egt_check.stop();
apu_egt2_check.stop();
apu_stop();
- } else if (getprop("controls/APU/master") == 1) {
+ } else if (getprop("controls/apu/master") == 1) {
apuBleedChk.stop();
setprop("systems/apu/bleed-counting", 0);
setprop("systems/apu/bleed-used", 0);
diff --git a/Nasal/Systems/fire.nas b/Nasal/Systems/fire.nas
index 799418ba..cb45ea85 100644
--- a/Nasal/Systems/fire.nas
+++ b/Nasal/Systems/fire.nas
@@ -37,7 +37,7 @@ var wow = props.globals.getNode("fdm/jsbsim/position/wow", 1);
var dcbatNode = props.globals.getNode("systems/electrical/bus/dc-bat", 1);
var dcessNode = props.globals.getNode("systems/electrical/bus/dc-ess", 1);
var apuBleedNode = props.globals.getNode("systems/apu/bleed-used", 1);
-var apuMaster = props.globals.getNode("controls/APU/master", 1);
+var apuMaster = props.globals.getNode("controls/apu/master", 1);
var fire_init = func {
setprop("controls/OH/protectors/fwddisch", 0);
@@ -645,8 +645,8 @@ eng2Agent2TimerMakeTimerFunc = func() {
}
}
-setlistener("/controls/APU/fire-btn", func() {
- if (getprop("controls/APU/fire-btn") == 1) {
+setlistener("/controls/apu/fire-btn", func() {
+ if (getprop("controls/apu/fire-btn") == 1) {
ecam.shutUpYou();
apuAgentTimerMakeTimer.stop();
apuAgentTimer.setValue(10);
@@ -790,7 +790,7 @@ createFireBottleListener("/controls/engines/engine[0]/agent1-btn", "/controls/en
createFireBottleListener("/controls/engines/engine[0]/agent2-btn", "/controls/engines/engine[0]/fire-btn", 1);
createFireBottleListener("/controls/engines/engine[1]/agent1-btn", "/controls/engines/engine[1]/fire-btn", 2);
createFireBottleListener("/controls/engines/engine[1]/agent2-btn", "/controls/engines/engine[1]/fire-btn", 3);
-createFireBottleListener("/controls/APU/agent-btn", "/controls/APU/fire-btn", 4);
+createFireBottleListener("/controls/apu/agent-btn", "/controls/apu/fire-btn", 4);
createCargoFireBottleListener("/controls/fire/cargo/aftdisch", 0);
createCargoFireBottleListener("/controls/fire/cargo/fwddisch", 1);
diff --git a/Nasal/Systems/pneumatics.nas b/Nasal/Systems/pneumatics.nas
index 86362c83..b40807d8 100644
--- a/Nasal/Systems/pneumatics.nas
+++ b/Nasal/Systems/pneumatics.nas
@@ -178,7 +178,7 @@ var PNEU = {
eng2_starter = getprop("systems/pneumatic/eng2-starter");
groundair = getprop("systems/pneumatic/groundair");
groundair_supp = getprop("controls/pneumatic/switches/groundair");
- rpmapu = getprop("systems/apu/rpm");
+ rpmapu = getprop("engines/engine[2]/n1");
stateL = getprop("engines/engine[0]/state");
stateR = getprop("engines/engine[1]/state");
bleedapu_fail = getprop("systems/failures/bleed-apu");
@@ -196,7 +196,7 @@ var PNEU = {
# Air Sources/PSI
if (rpmapu >= 94.9 and bleedapu_sw and !bleedapu_fail) {
setprop("systems/pneumatic/bleedapu", 34);
- if (getprop("controls/APU/master") == 1) {
+ if (getprop("controls/apu/master") == 1) {
setprop("systems/apu/bleed-used", 1);
}
} else {
diff --git a/Sounds/A320-common-sound.xml b/Sounds/A320-common-sound.xml
index 35dac06a..970366d6 100644
--- a/Sounds/A320-common-sound.xml
+++ b/Sounds/A320-common-sound.xml
@@ -10,12 +10,12 @@
/sim/current-view/internal
- /systems/apu/rpm
+ /engines/engine[2]/n1
0.005
0.25
- /systems/apu/rpm
+ /engines/engine[2]/n1
0.05
-2
@@ -29,11 +29,11 @@
/sim/current-view/internal
- /systems/apu/rpm
+ /engines/engine[2]/n1
0.005
- /systems/apu/rpm
+ /engines/engine[2]/n1
0.01
60
diff --git a/Systems/a320-apu.xml b/Systems/a320-apu.xml
new file mode 100644
index 00000000..5d98f6d0
--- /dev/null
+++ b/Systems/a320-apu.xml
@@ -0,0 +1,52 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ /engines/engine[2]/n1
+
+ 5.0 20.0
+ 8.0 45.0
+ 10.0 120.0
+ 12.0 225.0
+ 18.0 430.0
+ 25.0 500.0
+ 27.0 560.0
+ 30.0 720.0
+ 35.0 785.0
+ 40.0 800.0
+ 45.0 795.0
+ 50.0 785.0
+ 60.0 755.0
+ 75.0 645.0
+ 90.0 520.0
+ 100.0 415.0
+
+
+
+
+
+
+
diff --git a/Systems/a320-electrical.xml b/Systems/a320-electrical.xml
index 98fdd68c..8a41a756 100644
--- a/Systems/a320-electrical.xml
+++ b/Systems/a320-electrical.xml
@@ -232,14 +232,14 @@
- /systems/apu/rpm
- 240
+ /engines/engine[2]/n1
+ 240.34
- /controls/APU/fire-btn eq 1
+ /controls/apu/fire-btn eq 1
@@ -525,7 +525,7 @@
- /controls/APU/master eq 1
+ /controls/apu/master eq 1
/controls/electrical/switches/apu eq 1
/systems/electrical/sources/apu/output-volt ge 110
/systems/electrical/sources/apu/output-volt lt 130
@@ -1205,13 +1205,22 @@
/systems/electrical/relay/dc-bus-tie-dc-2/contact-pos eq 1
/systems/electrical/bus/dc-2-src ne 2
-
- /instrumentation/airspeed-indicator/indicated-speed-kt lt 50
-
- /controls/electrical/switches/bat-1 eq 1
- /controls/electrical/switches/bat-2 eq 1
+
+
+ /instrumentation/airspeed-indicator/indicated-speed-kt lt 50
+
+ /controls/electrical/switches/bat-1 eq 1
+ /controls/electrical/switches/bat-2 eq 1
+
+ /systems/electrical/some-electric-thingie/emer-elec-config eq 1
+
+
+
+ /controls/electrical/switches/bat-1 eq 1
+ /controls/electrical/switches/bat-2 eq 1
+
+ /systems/apu/dc-bat-three-minutes eq 1
- /systems/electrical/some-electric-thingie/emer-elec-config eq 1
@@ -1228,19 +1237,35 @@
/systems/electrical/relay/dc-bus-tie-dc-2/contact-pos eq 1
/systems/electrical/bus/dc-2-src ne 2
-
- /instrumentation/airspeed-indicator/indicated-speed-kt lt 50
- /controls/electrical/switches/bat-1 eq 1
- /systems/electrical/bus/dc-bat-src eq 3
- /systems/electrical/sources/bat-1/volt ge 25
- /systems/electrical/some-electric-thingie/emer-elec-config eq 1
+
+
+ /instrumentation/airspeed-indicator/indicated-speed-kt lt 50
+ /controls/electrical/switches/bat-1 eq 1
+ /systems/electrical/bus/dc-bat-src eq 3
+ /systems/electrical/sources/bat-1/volt ge 25
+ /systems/electrical/some-electric-thingie/emer-elec-config eq 1
+
+
+ /systems/apu/dc-bat-three-minutes eq 1
+ /controls/electrical/switches/bat-1 eq 1
+ /systems/electrical/bus/dc-bat-src eq 3
+ /systems/electrical/sources/bat-1/volt ge 25
+
-
- /instrumentation/airspeed-indicator/indicated-speed-kt lt 50
- /controls/electrical/switches/bat-2 eq 1
- /systems/electrical/bus/dc-bat-src eq 3
- /systems/electrical/sources/bat-2/volt ge 25
- /systems/electrical/some-electric-thingie/emer-elec-config eq 1
+
+
+ /instrumentation/airspeed-indicator/indicated-speed-kt lt 50
+ /controls/electrical/switches/bat-2 eq 1
+ /systems/electrical/bus/dc-bat-src eq 3
+ /systems/electrical/sources/bat-2/volt ge 25
+ /systems/electrical/some-electric-thingie/emer-elec-config eq 1
+
+
+ /systems/apu/dc-bat-three-minutes eq 1
+ /controls/electrical/switches/bat-2 eq 1
+ /systems/electrical/bus/dc-bat-src eq 3
+ /systems/electrical/sources/bat-2/volt ge 25
+
diff --git a/Systems/a320-fuel.xml b/Systems/a320-fuel.xml
index 25e125ed..1532fd86 100644
--- a/Systems/a320-fuel.xml
+++ b/Systems/a320-fuel.xml
@@ -312,8 +312,8 @@
- /controls/APU/master eq 1
- /controls/APU/fire-btn eq 0
+ /controls/apu/master eq 1
+ /controls/apu/fire-btn eq 0
diff --git a/Systems/lower-ecam.xml b/Systems/lower-ecam.xml
index 47a27bdd..76fa0d0b 100644
--- a/Systems/lower-ecam.xml
+++ b/Systems/lower-ecam.xml
@@ -11,7 +11,7 @@