From 107ba3ed4fad0128d33c97971eab998a82ee9ac6 Mon Sep 17 00:00:00 2001 From: legoboyvdlp R Date: Tue, 14 Apr 2020 18:07:01 +0100 Subject: [PATCH] JSBSim apu --- A320-200-IAE.xml | 361 ++++++++++--------- A320-main.xml | 40 +- AircraftConfig/acconfig.nas | 24 +- Engines/APS3200.xml | 80 ++++ Models/Instruments/Lower-ECAM/Lower-ECAM.nas | 8 +- Models/Instruments/OHpanel.new/OHpanel.xml | 12 +- Models/Instruments/OHpanel/OHpanel.xml | 108 +++--- Nasal/ECAM/ECAM-logic.nas | 16 +- Nasal/Sim/buttons.nas | 4 +- Nasal/Sim/libraries.nas | 1 + Nasal/Sim/property-tree-setup.nas | 4 +- Nasal/Systems/APU.nas | 271 ++++++++++++-- Nasal/Systems/FADEC/engines-common.nas | 14 +- Nasal/Systems/fire.nas | 8 +- Nasal/Systems/pneumatics.nas | 4 +- Sounds/A320-common-sound.xml | 8 +- Systems/a320-apu.xml | 52 +++ Systems/a320-electrical.xml | 69 ++-- Systems/a320-fuel.xml | 4 +- Systems/lower-ecam.xml | 4 +- 20 files changed, 748 insertions(+), 344 deletions(-) create mode 100644 Engines/APS3200.xml create mode 100644 Systems/a320-apu.xml 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 @@ - /systems/apu/rpm + /engines/engine[2]/n1 0-127100 53110 70 @@ -28,7 +28,7 @@
- /systems/apu/egt + /systems/apu/egt-degC 0-115 275-115 300-108