diff --git a/A320-main.xml b/A320-main.xml index 67357663..20695d74 100644 --- a/A320-main.xml +++ b/A320-main.xml @@ -1229,7 +1229,7 @@ Aircraft/IDG-A32X/Nasal/pneumatics.nas Aircraft/IDG-A32X/Nasal/hydraulics.nas Aircraft/IDG-A32X/Nasal/fuel.nas - Aircraft/IDG-A32X/Nasal/engines.nas + Aircraft/IDG-A32X/Nasal/engines-common.nas Aircraft/IDG-A32X/Nasal/ADIRS.nas Aircraft/IDG-A32X/Nasal/fire.nas Aircraft/IDG-A32X/Nasal/brakes.nas diff --git a/Engines/cfm56_5b4.xml b/Engines/cfm56_5b4.xml index 31d672fa..e7a01364 100644 --- a/Engines/cfm56_5b4.xml +++ b/Engines/cfm56_5b4.xml @@ -14,7 +14,7 @@ 0.03 19.7 61.2 - 0.1 + 0.2 1.0 103.8 101.4 diff --git a/Engines/leap1a26.xml b/Engines/leap1a26.xml index 2ff235b1..ba223fa4 100644 --- a/Engines/leap1a26.xml +++ b/Engines/leap1a26.xml @@ -14,7 +14,7 @@ 0.03 19.7 61.2 - 0.1 + 0.2 1.0 103.8 101.4 diff --git a/Engines/pw1127g.xml b/Engines/pw1127g.xml index 4e7e9c01..e9818b33 100644 --- a/Engines/pw1127g.xml +++ b/Engines/pw1127g.xml @@ -14,7 +14,7 @@ 0.03 19.7 61.2 - 0.1 + 0.2 1.0 103.8 101.4 diff --git a/Engines/v2527_a5.xml b/Engines/v2527_a5.xml index 544ea67b..c75d070a 100644 --- a/Engines/v2527_a5.xml +++ b/Engines/v2527_a5.xml @@ -14,7 +14,7 @@ 0.03 22.4 60.9 - 0.1 + 0.2 1.0 103.8 101.4 diff --git a/Models/FlightDeck/res/fd_complete.ac b/Models/FlightDeck/res/fd_complete.ac index 7863effc..53d2e514 100644 --- a/Models/FlightDeck/res/fd_complete.ac +++ b/Models/FlightDeck/res/fd_complete.ac @@ -103821,6 +103821,7 @@ refs 4 kids 0 OBJECT poly name "lat.dash" +loc 0 0.0010868 0 data 13 lat.dash.mesh texture "fcu.png" @@ -103841,6 +103842,7 @@ refs 4 kids 0 OBJECT poly name "lat.fmgc" +loc 0 0.0010868 0 data 13 lat.fmgc.mesh texture "fcu.png" @@ -103912,6 +103914,7 @@ refs 4 kids 0 OBJECT poly name "spd.dash" +loc 0 0.0010868 0 data 13 spd.dash.mesh texture "fcu.png" @@ -103932,6 +103935,7 @@ refs 4 kids 0 OBJECT poly name "spd.fmgc" +loc 0 0.0010868 0 data 13 spd.fmgc.mesh texture "fcu.png" @@ -104012,6 +104016,7 @@ refs 4 kids 0 OBJECT poly name "ver.fmgc" +loc 0 0.0010868 0 data 13 ver.fmgc.mesh texture "fcu.png" @@ -104043,6 +104048,7 @@ refs 4 kids 0 OBJECT poly name "vs.dash" +loc 0 0.0010868 0 data 12 vs.dash.mesh texture "fcu.png" diff --git a/Nasal/engines-cfm.nas b/Nasal/engines-cfm.nas new file mode 100644 index 00000000..81106e6d --- /dev/null +++ b/Nasal/engines-cfm.nas @@ -0,0 +1,367 @@ +# A3XX IAE V2500 Engine +# Joshua Davidson (it0uchpods) + +############################################## +# Copyright (c) Joshua Davidson (it0uchpods) # +############################################## + +##################### +# Initializing Vars # +##################### + +var engines = props.globals.getNode("/engines").getChildren("engine"); +var egt_min = 434; +var egt_start = 587; +var egt_max = 712; +var start_time = 10; +var egt_lightup_time = 4; +var egt_lightdn_time = 10; +var shutdown_time = 20; +var egt_shutdown_time = 20; + +setprop("/controls/engines/engine[0]/reverser", 0); +setprop("/controls/engines/engine[1]/reverser", 0); +setprop("/controls/engines/engine[0]/igniter-a", 0); +setprop("/controls/engines/engine[1]/igniter-a", 0); +setprop("/controls/engines/engine[0]/igniter-b", 0); +setprop("/controls/engines/engine[1]/igniter-b", 0); +setprop("/controls/engines/engine[0]/last-igniter", "B"); +setprop("/controls/engines/engine[1]/last-igniter", "B"); + +var eng_init = func { + setprop("/controls/engines/engine[0]/man-start", 0); + setprop("/controls/engines/engine[1]/man-start", 0); +} + +# Trigger Startups and Stops +setlistener("/controls/engines/engine[0]/cutoff-switch", func { + if (getprop("/controls/engines/engine[0]/cutoff-switch") == 0) { + if (getprop("/systems/acconfig/autoconfig-running") == 1) { + fast_start_one(); + } else { + if (getprop("/controls/engines/engine[0]/man-start") == 0) { + start_one_check(); + } else if (getprop("/controls/engines/engine[0]/man-start") == 1) { + eng_one_man_start.start(); + } + } + } else if (getprop("/controls/engines/engine[0]/cutoff-switch") == 1) { + eng_one_auto_start.stop(); + eng_one_man_start.stop(); + eng_one_n2_check.stop(); + setprop("/controls/engines/engine[0]/igniter-a", 0); + setprop("/controls/engines/engine[0]/igniter-b", 0); + setprop("/controls/engines/engine[0]/man-start", 0); + setprop("/systems/pneumatic/eng1-starter", 0); + setprop("/controls/engines/engine[0]/starter", 0); + setprop("/controls/engines/engine[0]/cutoff", 1); + setprop("/engines/engine[0]/state", 0); + interpolate(engines[0].getNode("egt-actual"), 0, egt_shutdown_time); + eng_one_n2_check.stop(); + } +}); + +var fast_start_one = func { + setprop("/controls/engines/engine[0]/cutoff", 0); + setprop("/engines/engine[0]/out-of-fuel", 0); + setprop("/engines/engine[0]/run", 1); + + setprop("/engines/engine[0]/cutoff", 0); + setprop("/engines/engine[0]/starter", 0); + + setprop("/fdm/jsbsim/propulsion/set-running", 0); + + setprop("/engines/engine[0]/state", 3); + setprop("/systems/pneumatic/eng1-starter", 0); +} + +setlistener("/controls/engines/engine[0]/man-start", func { + start_one_mancheck(); +}); + +var start_one_mancheck = func { + if (getprop("/controls/engines/engine[0]/man-start") == 1) { + if (getprop("/controls/engines/engine-start-switch") == 2 and (getprop("/controls/engines/engine[0]/cutoff-switch") == 1)) { + setprop("/systems/pneumatic/eng1-starter", 1); + settimer(start_one_mancheck_b, 0.5); + } + } else { + if (getprop("/engines/engine[0]/state") == 1 or getprop("/engines/engine[0]/state") == 2) { + setprop("/systems/pneumatic/eng1-starter", 0); + setprop("/engines/engine[0]/state", 0); + setprop("/controls/engines/engine[0]/starter", 0); + } + } +} + +var start_one_mancheck_b = func { + if (getprop("/systems/pneumatic/total-psi") >= 28) { + setprop("/engines/engine[0]/state", 1); + setprop("/controls/engines/engine[0]/starter", 1); + } +} + +var start_one_check = func { + if (getprop("/controls/engines/engine-start-switch") == 2 and getprop("/controls/engines/engine[0]/cutoff-switch") == 0) { + setprop("/systems/pneumatic/eng1-starter", 1); + settimer(start_one_check_b, 0.5); + } +} + +var start_one_check_b = func { + if ((getprop("/controls/engines/engine-start-switch") == 2) and (getprop("/systems/pneumatic/total-psi") >= 28) and (getprop("/controls/engines/engine[0]/cutoff-switch") == 0)) { + auto_start_one(); + } +} + +setlistener("/controls/engines/engine[1]/cutoff-switch", func { + if (getprop("/controls/engines/engine[1]/cutoff-switch") == 0) { + if (getprop("/systems/acconfig/autoconfig-running") == 1) { + fast_start_two(); + } else { + if (getprop("/controls/engines/engine[1]/man-start") == 0) { + start_two_check(); + } else if (getprop("/controls/engines/engine[1]/man-start") == 1) { + eng_two_man_start.start(); + } + } + } else if (getprop("/controls/engines/engine[1]/cutoff-switch") == 1) { + eng_two_auto_start.stop(); + eng_two_man_start.stop(); + eng_two_n2_check.stop(); + setprop("/controls/engines/engine[1]/igniter-a", 0); + setprop("/controls/engines/engine[1]/igniter-b", 0); + setprop("/controls/engines/engine[1]/man-start", 0); + setprop("/systems/pneumatic/eng2-starter", 0); + setprop("/controls/engines/engine[1]/starter", 0); + setprop("/controls/engines/engine[1]/cutoff", 1); + setprop("/engines/engine[1]/state", 0); + interpolate(engines[1].getNode("egt-actual"), 0, egt_shutdown_time); + } +}); + +var fast_start_two = func { + setprop("/controls/engines/engine[1]/cutoff", 0); + setprop("/engines/engine[1]/out-of-fuel", 0); + setprop("/engines/engine[1]/run", 1); + + setprop("/engines/engine[1]/cutoff", 0); + setprop("/engines/engine[1]/starter", 0); + + setprop("/fdm/jsbsim/propulsion/set-running", 1); + + setprop("/engines/engine[1]/state", 3); + setprop("/systems/pneumatic/eng2-starter", 0); +} + +setlistener("/controls/engines/engine[1]/man-start", func { + start_two_mancheck(); +}); + +var start_two_mancheck = func { + if (getprop("/controls/engines/engine[1]/man-start") == 1) { + if (getprop("/controls/engines/engine-start-switch") == 2 and (getprop("/controls/engines/engine[1]/cutoff-switch") == 1)) { + setprop("/systems/pneumatic/eng2-starter", 1); + settimer(start_two_mancheck_b, 0.5); + } + } else { + if (getprop("/engines/engine[1]/state") == 1 or getprop("/engines/engine[1]/state") == 2) { + setprop("/systems/pneumatic/eng2-starter", 0); + setprop("/engines/engine[1]/state", 0); + setprop("/controls/engines/engine[1]/starter", 0); + } + } +} + +var start_two_mancheck_b = func { + if (getprop("/systems/pneumatic/total-psi") >= 28) { + setprop("/engines/engine[1]/state", 1); + setprop("/controls/engines/engine[1]/starter", 1); + } +} + +var start_two_check = func { + if (getprop("/controls/engines/engine-start-switch") == 2 and getprop("/controls/engines/engine[1]/cutoff-switch") == 0) { + setprop("/systems/pneumatic/eng2-starter", 1); + settimer(start_two_check_b, 0.5); + } +} + +var start_two_check_b = func { + if ((getprop("/controls/engines/engine-start-switch") == 2) and (getprop("/systems/pneumatic/total-psi") >= 28) and (getprop("/controls/engines/engine[1]/cutoff-switch") == 0)) { + auto_start_two(); + } +} + +# Start Engine One +var auto_start_one = func { + setprop("/engines/engine[0]/state", 1); + setprop("/controls/engines/engine[0]/starter", 1); + eng_one_auto_start.start(); +} + +var eng_one_auto_start = maketimer(0.5, func { + if (getprop("/engines/engine[0]/n2-actual") >= 22) { + eng_one_auto_start.stop(); + setprop("/engines/engine[0]/state", 2); + setprop("/controls/engines/engine[0]/cutoff", 0); + if (getprop("/controls/engines/engine[0]/last-igniter") == "B") { + setprop("/controls/engines/engine[0]/igniter-a", 1); + setprop("/controls/engines/engine[0]/igniter-b", 0); + setprop("/controls/engines/engine[0]/last-igniter", "A"); + } else if (getprop("/controls/engines/engine[0]/last-igniter") == "A") { + setprop("/controls/engines/engine[0]/igniter-a", 0); + setprop("/controls/engines/engine[0]/igniter-b", 1); + setprop("/controls/engines/engine[0]/last-igniter", "B"); + } + interpolate(engines[0].getNode("egt-actual"), egt_start, egt_lightup_time); + eng_one_egt_check.start(); + eng_one_n2_check.start(); + } +}); + +var eng_one_man_start = maketimer(0.5, func { + if (getprop("/engines/engine[0]/n2-actual") >= 16.7) { + eng_one_man_start.stop(); + setprop("/engines/engine[0]/state", 2); + setprop("/controls/engines/engine[0]/cutoff", 0); + setprop("/controls/engines/engine[0]/igniter-a", 1); + setprop("/controls/engines/engine[0]/igniter-b", 1); + interpolate(engines[0].getNode("egt-actual"), egt_start, egt_lightup_time); + eng_one_egt_check.start(); + eng_one_n2_check.start(); + } +}); + +var eng_one_egt_check = maketimer(0.5, func { + if (getprop("/engines/engine[0]/egt-actual") >= egt_start) { + eng_one_egt_check.stop(); + interpolate(engines[0].getNode("egt-actual"), egt_min, egt_lightdn_time); + } +}); + +var eng_one_n2_check = maketimer(0.5, func { + if (getprop("/engines/engine[0]/n2-actual") >= 43.0) { + if (getprop("/controls/engines/engine[0]/igniter-a") != 0) { + setprop("/controls/engines/engine[0]/igniter-a", 0); + } + if (getprop("/controls/engines/engine[0]/igniter-b") != 0) { + setprop("/controls/engines/engine[0]/igniter-b", 0); + } + } + if (getprop("/engines/engine[0]/n2-actual") >= 57.0) { + eng_one_n2_check.stop(); + setprop("/systems/pneumatic/eng1-starter", 0); + setprop("/engines/engine[0]/state", 3); + } +}); + +# Start Engine Two +var auto_start_two = func { + setprop("/engines/engine[1]/state", 1); + setprop("/controls/engines/engine[1]/starter", 1); + eng_two_auto_start.start(); +} + +var eng_two_auto_start = maketimer(0.5, func { + if (getprop("/engines/engine[1]/n2-actual") >= 22) { + eng_two_auto_start.stop(); + setprop("/engines/engine[1]/state", 2); + setprop("/controls/engines/engine[1]/cutoff", 0); + if (getprop("/controls/engines/engine[1]/last-igniter") == "B") { + setprop("/controls/engines/engine[1]/igniter-a", 1); + setprop("/controls/engines/engine[1]/igniter-b", 0); + setprop("/controls/engines/engine[1]/last-igniter", "A"); + } else if (getprop("/controls/engines/engine[1]/last-igniter") == "A") { + setprop("/controls/engines/engine[1]/igniter-a", 0); + setprop("/controls/engines/engine[1]/igniter-b", 1); + setprop("/controls/engines/engine[1]/last-igniter", "B"); + } + interpolate(engines[1].getNode("egt-actual"), egt_start, egt_lightup_time); + eng_two_egt_check.start(); + eng_two_n2_check.start(); + } +}); + +var eng_two_man_start = maketimer(0.5, func { + if (getprop("/engines/engine[1]/n2-actual") >= 16.7) { + eng_two_man_start.stop(); + setprop("/engines/engine[1]/state", 2); + setprop("/controls/engines/engine[1]/cutoff", 0); + setprop("/controls/engines/engine[1]/igniter-a", 1); + setprop("/controls/engines/engine[1]/igniter-b", 1); + interpolate(engines[1].getNode("egt-actual"), egt_start, egt_lightup_time); + eng_two_egt_check.start(); + eng_two_n2_check.start(); + } +}); + +var eng_two_egt_check = maketimer(0.5, func { + if (getprop("/engines/engine[1]/egt-actual") >= egt_start) { + eng_two_egt_check.stop(); + interpolate(engines[1].getNode("egt-actual"), egt_min, egt_lightdn_time); + } +}); + +var eng_two_n2_check = maketimer(0.5, func { + if (getprop("/engines/engine[1]/n2-actual") >= 50.0) { + if (getprop("/controls/engines/engine[1]/igniter-a") != 0) { + setprop("/controls/engines/engine[1]/igniter-a", 0); + } + if (getprop("/controls/engines/engine[1]/igniter-b") != 0) { + setprop("/controls/engines/engine[1]/igniter-b", 0); + } + } + if (getprop("/engines/engine[1]/n2-actual") >= 57.0) { + eng_two_n2_check.stop(); + setprop("/systems/pneumatic/eng2-starter", 0); + setprop("/engines/engine[1]/state", 3); + } +}); + +# Various Other Stuff +setlistener("/controls/engines/engine-start-switch", func { + if (getprop("/engines/engine[0]/state") == 0) { + start_one_check(); + start_one_mancheck(); + } + if (getprop("/engines/engine[1]/state") == 0) { + start_two_check(); + start_two_mancheck(); + } + if ((getprop("/controls/engines/engine-start-switch") == 0) or (getprop("/controls/engines/engine-start-switch") == 1)) { + if (getprop("/engines/engine[0]/state") == 1 or getprop("/engines/engine[0]/state") == 2) { + setprop("/controls/engines/engine[0]/starter", 0); + setprop("/controls/engines/engine[0]/cutoff", 1); + setprop("/systems/pneumatic/eng1-starter", 0); + setprop("/engines/engine[0]/state", 0); + interpolate(engines[0].getNode("egt-actual"), 0, egt_shutdown_time); + } + if (getprop("/engines/engine[1]/state") == 1 or getprop("/engines/engine[1]/state") == 2) { + setprop("/controls/engines/engine[1]/starter", 0); + setprop("/controls/engines/engine[1]/cutoff", 1); + setprop("/systems/pneumatic/eng2-starter", 0); + setprop("/engines/engine[1]/state", 0); + interpolate(engines[1].getNode("egt-actual"), 0, egt_shutdown_time); + } + } +}); + +setlistener("/systems/pneumatic/start-psi", func { + if (getprop("/systems/pneumatic/total-psi") < 12) { + if (getprop("/engines/engine[0]/state") == 1 or getprop("/engines/engine[0]/state") == 2) { + setprop("/controls/engines/engine[0]/starter", 0); + setprop("/controls/engines/engine[0]/cutoff", 1); + setprop("/systems/pneumatic/eng1-starter", 0); + setprop("/engines/engine[0]/state", 0); + interpolate(engines[0].getNode("egt-actual"), 0, egt_shutdown_time); + } + if (getprop("/engines/engine[1]/state") == 1 or getprop("/engines/engine[1]/state") == 2) { + setprop("/controls/engines/engine[1]/starter", 0); + setprop("/controls/engines/engine[1]/cutoff", 1); + setprop("/systems/pneumatic/eng2-starter", 0); + setprop("/engines/engine[1]/state", 0); + interpolate(engines[1].getNode("egt-actual"), 0, egt_shutdown_time); + } + } +}); diff --git a/Nasal/engines-common.nas b/Nasal/engines-common.nas new file mode 100644 index 00000000..abb0ca6b --- /dev/null +++ b/Nasal/engines-common.nas @@ -0,0 +1,154 @@ +# A3XX Engine Control +# Joshua Davidson (it0uchpods) + +############################################## +# Copyright (c) Joshua Davidson (it0uchpods) # +############################################## + +if (getprop("/options/eng") == "IAE") { + io.include("engines-iae.nas"); +} else { + io.include("engines-cfm.nas"); +} + +var spinup_time = 49; +var apu_max = 100; +var apu_egt_min = 352; +var apu_egt_max = 704; +setprop("/systems/apu/rpm", 0); +setprop("/systems/apu/egt", 42); + +# Start APU +setlistener("/controls/APU/start", func { + if ((getprop("/controls/APU/master") == 1) and (getprop("/controls/APU/start") == 1)) { + if (getprop("/systems/acconfig/autoconfig-running") == 0) { + interpolate("/systems/apu/rpm", apu_max, spinup_time); + apu_egt_check.start(); + } else if (getprop("/systems/acconfig/autoconfig-running") == 1) { + interpolate("/systems/apu/rpm", apu_max, 5); + interpolate("/systems/apu/egt", apu_egt_min, 5); + } + } else if (getprop("/controls/APU/master") == 0) { + apu_egt_check.stop(); + apu_stop(); + } +}); + +var apu_egt_check = maketimer(0.5, func { + if (getprop("/systems/apu/rpm") >= 28) { + apu_egt_check.stop(); + interpolate("/systems/apu/egt", apu_egt_max, 5); + apu_egt2_check.start(); + } +}); + +var apu_egt2_check = maketimer(0.5, func { + if (getprop("/systems/apu/egt") >= 701) { + apu_egt2_check.stop(); + interpolate("/systems/apu/egt", apu_egt_min, 30); + } +}); + +# Stop APU +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(); + } +}); + +var apu_stop = func { + interpolate("/systems/apu/rpm", 0, 30); + interpolate("/systems/apu/egt", 42, 40); +} + +# Various Other Stuff +var doIdleThrust = func { + setprop("/controls/engines/engine[0]/throttle", 0.0); + setprop("/controls/engines/engine[1]/throttle", 0.0); +} + +var doTOGAThrust = func { + setprop("/controls/engines/engine[0]/throttle", 1.0); + setprop("/controls/engines/engine[1]/throttle", 1.0); +} + +# Reverse Thrust System +var toggleFastRevThrust = func { + var state1 = getprop("/systems/thrust/state1"); + var state2 = getprop("/systems/thrust/state2"); + if (state1 == "IDLE" and state2 == "IDLE" and getprop("/controls/engines/engine[0]/reverser") == "0" and getprop("/controls/engines/engine[1]/reverser") == "0" and getprop("/gear/gear[1]/wow") == 1 and getprop("/gear/gear[2]/wow") == 1) { + interpolate("/engines/engine[0]/reverser-pos-norm", 1, 1.4); + interpolate("/engines/engine[1]/reverser-pos-norm", 1, 1.4); + setprop("/controls/engines/engine[0]/reverser", 1); + setprop("/controls/engines/engine[1]/reverser", 1); + setprop("/controls/engines/engine[0]/throttle-rev", 0.4); + setprop("/controls/engines/engine[1]/throttle-rev", 0.4); + setprop("/fdm/jsbsim/propulsion/engine[0]/reverser-angle-rad", 3.14); + setprop("/fdm/jsbsim/propulsion/engine[1]/reverser-angle-rad", 3.14); + } else if ((getprop("/controls/engines/engine[0]/reverser") == "1") or (getprop("/controls/engines/engine[1]/reverser") == "1") and (getprop("/gear/gear[1]/wow") == 1) and (getprop("/gear/gear[2]/wow") == 1)) { + setprop("/controls/engines/engine[0]/throttle-rev", 0); + setprop("/controls/engines/engine[1]/throttle-rev", 0); + interpolate("/engines/engine[0]/reverser-pos-norm", 0, 1.0); + interpolate("/engines/engine[1]/reverser-pos-norm", 0, 1.0); + setprop("/fdm/jsbsim/propulsion/engine[0]/reverser-angle-rad", 0); + setprop("/fdm/jsbsim/propulsion/engine[1]/reverser-angle-rad", 0); + setprop("/controls/engines/engine[0]/reverser", 0); + setprop("/controls/engines/engine[1]/reverser", 0); + } +} + +var doRevThrust = func { + if (getprop("/controls/engines/engine[0]/reverser") == "1" and getprop("/controls/engines/engine[1]/reverser") == "1" and getprop("/gear/gear[1]/wow") == 1 and getprop("/gear/gear[2]/wow") == 1) { + var pos1 = getprop("/controls/engines/engine[0]/throttle-rev"); + var pos2 = getprop("/controls/engines/engine[1]/throttle-rev"); + if (pos1 < 0.4) { + setprop("/controls/engines/engine[0]/throttle-rev", pos1 + 0.133333333); + } + if (pos2 < 0.4) { + setprop("/controls/engines/engine[1]/throttle-rev", pos2 + 0.133333333); + } + } + var state1 = getprop("/systems/thrust/state1"); + var state2 = getprop("/systems/thrust/state2"); + if (state1 == "IDLE" and state2 == "IDLE" and getprop("/controls/engines/engine[0]/reverser") == "0" and getprop("/controls/engines/engine[1]/reverser") == "0" and getprop("/gear/gear[1]/wow") == 1 and getprop("/gear/gear[2]/wow") == 1) { + setprop("/controls/engines/engine[0]/throttle-rev", 0); + setprop("/controls/engines/engine[1]/throttle-rev", 0); + interpolate("/engines/engine[0]/reverser-pos-norm", 1, 1.4); + interpolate("/engines/engine[1]/reverser-pos-norm", 1, 1.4); + setprop("/controls/engines/engine[0]/reverser", 1); + setprop("/controls/engines/engine[1]/reverser", 1); + setprop("/fdm/jsbsim/propulsion/engine[0]/reverser-angle-rad", 3.14); + setprop("/fdm/jsbsim/propulsion/engine[1]/reverser-angle-rad", 3.14); + } +} + +var unRevThrust = func { + if (getprop("/controls/engines/engine[0]/reverser") == "1" or getprop("/controls/engines/engine[1]/reverser") == "1") { + var pos1 = getprop("/controls/engines/engine[0]/throttle-rev"); + var pos2 = getprop("/controls/engines/engine[1]/throttle-rev"); + if (pos1 > 0.0) { + setprop("/controls/engines/engine[0]/throttle-rev", pos1 - 0.133333333); + } else { + unRevThrust_b(); + } + if (pos2 > 0.0) { + setprop("/controls/engines/engine[1]/throttle-rev", pos2 - 0.133333333); + } else { + unRevThrust_b(); + } + } +} + +var unRevThrust_b = func { + setprop("/controls/engines/engine[0]/throttle-rev", 0); + setprop("/controls/engines/engine[1]/throttle-rev", 0); + interpolate("/engines/engine[0]/reverser-pos-norm", 0, 1.0); + interpolate("/engines/engine[1]/reverser-pos-norm", 0, 1.0); + setprop("/fdm/jsbsim/propulsion/engine[0]/reverser-angle-rad", 0); + setprop("/fdm/jsbsim/propulsion/engine[1]/reverser-angle-rad", 0); + setprop("/controls/engines/engine[0]/reverser", 0); + setprop("/controls/engines/engine[1]/reverser", 0); +} diff --git a/Nasal/engines.nas b/Nasal/engines-iae.nas similarity index 58% rename from Nasal/engines.nas rename to Nasal/engines-iae.nas index 3f6c9437..41af3a12 100644 --- a/Nasal/engines.nas +++ b/Nasal/engines-iae.nas @@ -1,4 +1,4 @@ -# A3XX JSB Engine System +# A3XX IAE V2500 Engine # Joshua Davidson (it0uchpods) ############################################## @@ -10,30 +10,15 @@ ##################### var engines = props.globals.getNode("/engines").getChildren("engine"); -var n1_min = 22.4; -var n2_min = 60.7; var egt_min = 434; -var n1_spin = 5.1; -var n2_spin = 22.8; -var n1_start = 22.3; -var n2_start = 60.6; var egt_start = 587; -var n1_max = 105.8; -var n2_max = 102.1; var egt_max = 712; -var n1_wm = 0; -var n2_wm = 0; -var apu_max = 100; -var apu_egt_min = 352; -var apu_egt_max = 704; -var spinup_time = 49; var start_time = 10; -var egt_lightup_time = 2; -var egt_lightdn_time = 8; +var egt_lightup_time = 4; +var egt_lightdn_time = 10; var shutdown_time = 20; var egt_shutdown_time = 20; -setprop("/systems/apu/rpm", 0); -setprop("/systems/apu/egt", 42); + setprop("/controls/engines/engine[0]/reverser", 0); setprop("/controls/engines/engine[1]/reverser", 0); setprop("/controls/engines/engine[0]/igniter-a", 0); @@ -48,10 +33,7 @@ var eng_init = func { setprop("/controls/engines/engine[1]/man-start", 0); } -############################## -# Trigger Startups and Stops # -############################## - +# Trigger Startups and Stops setlistener("/controls/engines/engine[0]/cutoff-switch", func { if (getprop("/controls/engines/engine[0]/cutoff-switch") == 0) { if (getprop("/systems/acconfig/autoconfig-running") == 1) { @@ -60,13 +42,13 @@ setlistener("/controls/engines/engine[0]/cutoff-switch", func { if (getprop("/controls/engines/engine[0]/man-start") == 0) { start_one_check(); } else if (getprop("/controls/engines/engine[0]/man-start") == 1) { - eng_one_man_startt.start(); + eng_one_man_start.start(); } } } else if (getprop("/controls/engines/engine[0]/cutoff-switch") == 1) { - eng_one_auto_startt.stop(); - eng_one_man_startt.stop(); - eng_one_n2_checkt.stop(); + eng_one_auto_start.stop(); + eng_one_man_start.stop(); + eng_one_n2_check.stop(); setprop("/controls/engines/engine[0]/igniter-a", 0); setprop("/controls/engines/engine[0]/igniter-b", 0); setprop("/controls/engines/engine[0]/man-start", 0); @@ -75,7 +57,7 @@ setlistener("/controls/engines/engine[0]/cutoff-switch", func { setprop("/controls/engines/engine[0]/cutoff", 1); setprop("/engines/engine[0]/state", 0); interpolate(engines[0].getNode("egt-actual"), 0, egt_shutdown_time); - eng_one_n2_checkt.stop(); + eng_one_n2_check.stop(); } }); @@ -140,13 +122,13 @@ setlistener("/controls/engines/engine[1]/cutoff-switch", func { if (getprop("/controls/engines/engine[1]/man-start") == 0) { start_two_check(); } else if (getprop("/controls/engines/engine[1]/man-start") == 1) { - eng_two_man_startt.start(); + eng_two_man_start.start(); } } } else if (getprop("/controls/engines/engine[1]/cutoff-switch") == 1) { - eng_two_auto_startt.stop(); - eng_two_man_startt.stop(); - eng_two_n2_checkt.stop(); + eng_two_auto_start.stop(); + eng_two_man_start.stop(); + eng_two_n2_check.stop(); setprop("/controls/engines/engine[1]/igniter-a", 0); setprop("/controls/engines/engine[1]/igniter-b", 0); setprop("/controls/engines/engine[1]/man-start", 0); @@ -211,19 +193,16 @@ var start_two_check_b = func { } } -#################### -# Start Engine One # -#################### - +# Start Engine One var auto_start_one = func { setprop("/engines/engine[0]/state", 1); setprop("/controls/engines/engine[0]/starter", 1); - eng_one_auto_startt.start(); + eng_one_auto_start.start(); } -var eng_one_auto_start = func { - if (getprop("/engines/engine[0]/n2-actual") >= 24.1) { - eng_one_auto_startt.stop(); +var eng_one_auto_start = maketimer(0.5, func { + if (getprop("/engines/engine[0]/n1-actual") >= 5.0) { + eng_one_auto_start.stop(); setprop("/engines/engine[0]/state", 2); setprop("/controls/engines/engine[0]/cutoff", 0); if (getprop("/controls/engines/engine[0]/last-igniter") == "B") { @@ -236,48 +215,57 @@ var eng_one_auto_start = func { setprop("/controls/engines/engine[0]/last-igniter", "B"); } interpolate(engines[0].getNode("egt-actual"), egt_start, egt_lightup_time); - eng_one_n2_checkt.start(); + eng_one_egt_check.start(); + eng_one_n2_check.start(); } -} +}); -var eng_one_man_start = func { +var eng_one_man_start = maketimer(0.5, func { if (getprop("/engines/engine[0]/n2-actual") >= 16.7) { - eng_one_man_startt.stop(); + eng_one_man_start.stop(); setprop("/engines/engine[0]/state", 2); setprop("/controls/engines/engine[0]/cutoff", 0); setprop("/controls/engines/engine[0]/igniter-a", 1); setprop("/controls/engines/engine[0]/igniter-b", 1); interpolate(engines[0].getNode("egt-actual"), egt_start, egt_lightup_time); - eng_one_n2_checkt.start(); + eng_one_egt_check.start(); + eng_one_n2_check.start(); } -} +}); -var eng_one_n2_check = func { +var eng_one_egt_check = maketimer(0.5, func { if (getprop("/engines/engine[0]/egt-actual") >= egt_start) { + eng_one_egt_check.stop(); interpolate(engines[0].getNode("egt-actual"), egt_min, egt_lightdn_time); } +}); + +var eng_one_n2_check = maketimer(0.5, func { if (getprop("/engines/engine[0]/n2-actual") >= 43.0) { - eng_one_n2_checkt.stop(); - setprop("/controls/engines/engine[0]/igniter-a", 0); - setprop("/controls/engines/engine[0]/igniter-b", 0); + if (getprop("/controls/engines/engine[0]/igniter-a") != 0) { + setprop("/controls/engines/engine[0]/igniter-a", 0); + } + if (getprop("/controls/engines/engine[0]/igniter-b") != 0) { + setprop("/controls/engines/engine[0]/igniter-b", 0); + } + } + if (getprop("/engines/engine[0]/n2-actual") >= 57.0) { + eng_one_n2_check.stop(); setprop("/systems/pneumatic/eng1-starter", 0); setprop("/engines/engine[0]/state", 3); } -} - -#################### -# Start Engine Two # -#################### +}); +# Start Engine Two var auto_start_two = func { setprop("/engines/engine[1]/state", 1); setprop("/controls/engines/engine[1]/starter", 1); - eng_two_auto_startt.start(); + eng_two_auto_start.start(); } -var eng_two_auto_start = func { - if (getprop("/engines/engine[1]/n2-actual") >= 24.1) { - eng_two_auto_startt.stop(); +var eng_two_auto_start = maketimer(0.5, func { + if (getprop("/engines/engine[1]/n1-actual") >= 5.0) { + eng_two_auto_start.stop(); setprop("/engines/engine[1]/state", 2); setprop("/controls/engines/engine[1]/cutoff", 0); if (getprop("/controls/engines/engine[1]/last-igniter") == "B") { @@ -290,91 +278,48 @@ var eng_two_auto_start = func { setprop("/controls/engines/engine[1]/last-igniter", "B"); } interpolate(engines[1].getNode("egt-actual"), egt_start, egt_lightup_time); - eng_two_n2_checkt.start(); + eng_two_egt_check.start(); + eng_two_n2_check.start(); } -} +}); -var eng_two_man_start = func { +var eng_two_man_start = maketimer(0.5, func { if (getprop("/engines/engine[1]/n2-actual") >= 16.7) { - eng_two_man_startt.stop(); + eng_two_man_start.stop(); setprop("/engines/engine[1]/state", 2); setprop("/controls/engines/engine[1]/cutoff", 0); setprop("/controls/engines/engine[1]/igniter-a", 1); setprop("/controls/engines/engine[1]/igniter-b", 1); interpolate(engines[1].getNode("egt-actual"), egt_start, egt_lightup_time); - eng_two_n2_checkt.start(); + eng_two_egt_check.start(); + eng_two_n2_check.start(); } -} +}); -var eng_two_n2_check = func { +var eng_two_egt_check = maketimer(0.5, func { if (getprop("/engines/engine[1]/egt-actual") >= egt_start) { + eng_two_egt_check.stop(); interpolate(engines[1].getNode("egt-actual"), egt_min, egt_lightdn_time); } +}); + +var eng_two_n2_check = maketimer(0.5, func { if (getprop("/engines/engine[1]/n2-actual") >= 43.0) { - eng_two_n2_checkt.stop(); - setprop("/controls/engines/engine[1]/igniter-a", 0); - setprop("/controls/engines/engine[1]/igniter-b", 0); + if (getprop("/controls/engines/engine[1]/igniter-a") != 0) { + setprop("/controls/engines/engine[1]/igniter-a", 0); + } + if (getprop("/controls/engines/engine[1]/igniter-b") != 0) { + setprop("/controls/engines/engine[1]/igniter-b", 0); + } + } + if (getprop("/engines/engine[1]/n2-actual") >= 57.0) { + eng_two_n2_check.stop(); setprop("/systems/pneumatic/eng2-starter", 0); setprop("/engines/engine[1]/state", 3); } -} - -############# -# Start APU # -############# - -setlistener("/controls/APU/start", func { - if ((getprop("/controls/APU/master") == 1) and (getprop("/controls/APU/start") == 1)) { - if (getprop("/systems/acconfig/autoconfig-running") == 0) { - interpolate("/systems/apu/rpm", apu_max, spinup_time); - apu_egt_checkt.start(); - } else if (getprop("/systems/acconfig/autoconfig-running") == 1) { - interpolate("/systems/apu/rpm", apu_max, 5); - interpolate("/systems/apu/egt", apu_egt_min, 5); - } - } else if (getprop("/controls/APU/master") == 0) { - apu_egt_checkt.stop(); - apu_stop(); - } }); -var apu_egt_check = func { - if (getprop("/systems/apu/rpm") >= 28) { - apu_egt_checkt.stop(); - interpolate("/systems/apu/egt", apu_egt_max, 5); - apu_egt2_checkt.start(); - } -} - -var apu_egt2_check = func { - if (getprop("/systems/apu/egt") >= 701) { - apu_egt2_checkt.stop(); - interpolate("/systems/apu/egt", apu_egt_min, 30); - } -} - -############ -# Stop APU # -############ - -setlistener("/controls/APU/master", func { - if (getprop("/controls/APU/master") == 0) { - setprop("/controls/APU/start", 0); - apu_egt_checkt.stop(); - apu_egt2_checkt.stop(); - apu_stop(); - } -}); - -var apu_stop = func { - interpolate("/systems/apu/rpm", 0, 30); - interpolate("/systems/apu/egt", 42, 40); -} - -####################### -# Various other stuff # -####################### - +# Various Other Stuff setlistener("/controls/engines/engine-start-switch", func { if (getprop("/engines/engine[0]/state") == 0) { start_one_check(); @@ -420,104 +365,3 @@ setlistener("/systems/pneumatic/start-psi", func { } } }); - -var doIdleThrust = func { - setprop("/controls/engines/engine[0]/throttle", 0.0); - setprop("/controls/engines/engine[1]/throttle", 0.0); -} - -var doTOGAThrust = func { - setprop("/controls/engines/engine[0]/throttle", 1.0); - setprop("/controls/engines/engine[1]/throttle", 1.0); -} - -######################### -# Reverse Thrust System # -######################### - -var toggleFastRevThrust = func { - var state1 = getprop("/systems/thrust/state1"); - var state2 = getprop("/systems/thrust/state2"); - if (state1 == "IDLE" and state2 == "IDLE" and getprop("/controls/engines/engine[0]/reverser") == "0" and getprop("/controls/engines/engine[1]/reverser") == "0" and getprop("/gear/gear[1]/wow") == 1 and getprop("/gear/gear[2]/wow") == 1) { - interpolate("/engines/engine[0]/reverser-pos-norm", 1, 1.4); - interpolate("/engines/engine[1]/reverser-pos-norm", 1, 1.4); - setprop("/controls/engines/engine[0]/reverser", 1); - setprop("/controls/engines/engine[1]/reverser", 1); - setprop("/controls/engines/engine[0]/throttle-rev", 0.4); - setprop("/controls/engines/engine[1]/throttle-rev", 0.4); - setprop("/fdm/jsbsim/propulsion/engine[0]/reverser-angle-rad", 3.14); - setprop("/fdm/jsbsim/propulsion/engine[1]/reverser-angle-rad", 3.14); - } else if ((getprop("/controls/engines/engine[0]/reverser") == "1") or (getprop("/controls/engines/engine[1]/reverser") == "1") and (getprop("/gear/gear[1]/wow") == 1) and (getprop("/gear/gear[2]/wow") == 1)) { - setprop("/controls/engines/engine[0]/throttle-rev", 0); - setprop("/controls/engines/engine[1]/throttle-rev", 0); - interpolate("/engines/engine[0]/reverser-pos-norm", 0, 1.0); - interpolate("/engines/engine[1]/reverser-pos-norm", 0, 1.0); - setprop("/fdm/jsbsim/propulsion/engine[0]/reverser-angle-rad", 0); - setprop("/fdm/jsbsim/propulsion/engine[1]/reverser-angle-rad", 0); - setprop("/controls/engines/engine[0]/reverser", 0); - setprop("/controls/engines/engine[1]/reverser", 0); - } -} - -var doRevThrust = func { - if (getprop("/controls/engines/engine[0]/reverser") == "1" and getprop("/controls/engines/engine[1]/reverser") == "1" and getprop("/gear/gear[1]/wow") == 1 and getprop("/gear/gear[2]/wow") == 1) { - var pos1 = getprop("/controls/engines/engine[0]/throttle-rev"); - var pos2 = getprop("/controls/engines/engine[1]/throttle-rev"); - if (pos1 < 0.4) { - setprop("/controls/engines/engine[0]/throttle-rev", pos1 + 0.133333333); - } - if (pos2 < 0.4) { - setprop("/controls/engines/engine[1]/throttle-rev", pos2 + 0.133333333); - } - } - var state1 = getprop("/systems/thrust/state1"); - var state2 = getprop("/systems/thrust/state2"); - if (state1 == "IDLE" and state2 == "IDLE" and getprop("/controls/engines/engine[0]/reverser") == "0" and getprop("/controls/engines/engine[1]/reverser") == "0" and getprop("/gear/gear[1]/wow") == 1 and getprop("/gear/gear[2]/wow") == 1) { - setprop("/controls/engines/engine[0]/throttle-rev", 0); - setprop("/controls/engines/engine[1]/throttle-rev", 0); - interpolate("/engines/engine[0]/reverser-pos-norm", 1, 1.4); - interpolate("/engines/engine[1]/reverser-pos-norm", 1, 1.4); - setprop("/controls/engines/engine[0]/reverser", 1); - setprop("/controls/engines/engine[1]/reverser", 1); - setprop("/fdm/jsbsim/propulsion/engine[0]/reverser-angle-rad", 3.14); - setprop("/fdm/jsbsim/propulsion/engine[1]/reverser-angle-rad", 3.14); - } -} - -var unRevThrust = func { - if (getprop("/controls/engines/engine[0]/reverser") == "1" or getprop("/controls/engines/engine[1]/reverser") == "1") { - var pos1 = getprop("/controls/engines/engine[0]/throttle-rev"); - var pos2 = getprop("/controls/engines/engine[1]/throttle-rev"); - if (pos1 > 0.0) { - setprop("/controls/engines/engine[0]/throttle-rev", pos1 - 0.133333333); - } else { - unRevThrust_b(); - } - if (pos2 > 0.0) { - setprop("/controls/engines/engine[1]/throttle-rev", pos2 - 0.133333333); - } else { - unRevThrust_b(); - } - } -} - -var unRevThrust_b = func { - setprop("/controls/engines/engine[0]/throttle-rev", 0); - setprop("/controls/engines/engine[1]/throttle-rev", 0); - interpolate("/engines/engine[0]/reverser-pos-norm", 0, 1.0); - interpolate("/engines/engine[1]/reverser-pos-norm", 0, 1.0); - setprop("/fdm/jsbsim/propulsion/engine[0]/reverser-angle-rad", 0); - setprop("/fdm/jsbsim/propulsion/engine[1]/reverser-angle-rad", 0); - setprop("/controls/engines/engine[0]/reverser", 0); - setprop("/controls/engines/engine[1]/reverser", 0); -} - -# Timers -var eng_one_auto_startt = maketimer(0.5, eng_one_auto_start); -var eng_one_man_startt = maketimer(0.5, eng_one_man_start); -var eng_one_n2_checkt = maketimer(0.5, eng_one_n2_check); -var eng_two_auto_startt = maketimer(0.5, eng_two_auto_start); -var eng_two_man_startt = maketimer(0.5, eng_two_man_start); -var eng_two_n2_checkt = maketimer(0.5, eng_two_n2_check); -var apu_egt_checkt = maketimer(0.5, apu_egt_check); -var apu_egt2_checkt = maketimer(0.5, apu_egt2_check); diff --git a/Nasal/fadec-cfm.nas b/Nasal/fadec-cfm.nas index 26a2d940..09aa6604 100644 --- a/Nasal/fadec-cfm.nas +++ b/Nasal/fadec-cfm.nas @@ -58,38 +58,28 @@ var fadecLoop = maketimer(0.7, func { var powered1 = getprop("/systems/fadec/powered1"); var powered2 = getprop("/systems/fadec/powered2"); - var N21 = getprop("/engines/engine[0]/n2-actual"); - var N22 = getprop("/engines/engine[1]/n2-actual"); if (powered1) { setprop("/systems/fadec/eng1/n1", 1); setprop("/systems/fadec/eng1/egt", 1); + setprop("/systems/fadec/eng1/n2", 1); setprop("/systems/fadec/eng1/ff", 1); } else { setprop("/systems/fadec/eng1/n1", 0); setprop("/systems/fadec/eng1/egt", 0); + setprop("/systems/fadec/eng1/n2", 0); setprop("/systems/fadec/eng1/ff", 0); } if (powered2) { setprop("/systems/fadec/eng2/n1", 1); setprop("/systems/fadec/eng2/egt", 1); + setprop("/systems/fadec/eng2/n2", 1); setprop("/systems/fadec/eng2/ff", 1); } else { setprop("/systems/fadec/eng2/n1", 0); setprop("/systems/fadec/eng2/egt", 0); + setprop("/systems/fadec/eng2/n2", 0); setprop("/systems/fadec/eng2/ff", 0); } - - if (powered1 and N21 >= 3.5) { - setprop("/systems/fadec/eng1/n2", 1); - } else { - setprop("/systems/fadec/eng1/n2", 0); - } - - if (powered2 and N22 >= 3.5) { - setprop("/systems/fadec/eng2/n2", 1); - } else { - setprop("/systems/fadec/eng2/n2", 0); - } }); diff --git a/Nasal/fadec-common.nas b/Nasal/fadec-common.nas index bdbaf281..900be819 100644 --- a/Nasal/fadec-common.nas +++ b/Nasal/fadec-common.nas @@ -1,5 +1,5 @@ -# A3XX FADEC/Throttle Control System by Joshua Davidson (it0uchpods) -# V2.0.0 +# A3XX FADEC/Throttle Control System +# Joshua Davidson (it0uchpods) ############################################## # Copyright (c) Joshua Davidson (it0uchpods) # @@ -7,7 +7,6 @@ setprop("/systems/thrust/alpha-floor", 0); setprop("/systems/thrust/toga-lk", 0); - setprop("/systems/thrust/epr/toga-lim", 0.0); setprop("/systems/thrust/epr/mct-lim", 0.0); setprop("/systems/thrust/epr/flx-lim", 0.0); @@ -198,6 +197,8 @@ setlistener("/systems/thrust/state2", func { var thrust_lim = func { state1 = getprop("/systems/thrust/state1"); state2 = getprop("/systems/thrust/state2"); + engstate1 = getprop("/engines/engine[0]/state"); + engstate2 = getprop("/engines/engine[1]/state"); thr1 = getprop("/controls/engines/engine[0]/throttle-pos"); thr2 = getprop("/controls/engines/engine[1]/throttle-pos"); eprtoga = getprop("/systems/thrust/epr/toga-lim"); @@ -208,7 +209,12 @@ var thrust_lim = func { n1mct = getprop("/systems/thrust/n1/mct-lim"); n1flx = getprop("/systems/thrust/n1/flx-lim"); n1clb = getprop("/systems/thrust/n1/clb-lim"); - if (getprop("/gear/gear[1]/wow") == 0 or getprop("/gear/gear[2]/wow") == 0) { + if (getprop("/FMGC/internal/flex-set") == 1 and getprop("/systems/fadec/n1mode1") == 0 and getprop("/systems/fadec/n1mode2") == 0 and getprop("/gear/gear[1]/wow") == 1 and getprop("/gear/gear[2]/wow") == 1) { + setprop("/systems/thrust/lim-flex", 1); + } else if (getprop("/FMGC/internal/flex-set") == 0 and engstate1 != 3 and engstate2 != 3) { + setprop("/systems/thrust/lim-flex", 0); + } + if (getprop("/gear/gear[1]/wow") == 0 or getprop("/gear/gear[2]/wow") == 0 or (engstate1 != 3 and engstate2 != 3)) { if ((state1 == "TOGA" or state2 == "TOGA" or (state1 == "MAN THR" and thr1 >= 0.83) or (state2 == "MAN THR" and thr2 >= 0.83)) or getprop("/systems/thrust/alpha-floor") == 1 or getprop("/systems/thrust/toga-lk") == 1) { setprop("/controls/engines/thrust-limit", "TOGA"); setprop("/controls/engines/epr-limit", eprtoga); @@ -227,7 +233,6 @@ var thrust_lim = func { setprop("/controls/engines/n1-limit", n1clb); } } else if (getprop("/FMGC/internal/flex-set") == 1 and getprop("/systems/fadec/n1mode1") == 0 and getprop("/systems/fadec/n1mode2") == 0) { - setprop("/systems/thrust/lim-flex", 1); setprop("/controls/engines/thrust-limit", "FLX"); setprop("/controls/engines/epr-limit", eprflx); setprop("/controls/engines/n1-limit", n1flx); diff --git a/revision.txt b/revision.txt index 97a9aea0..b6e26c8b 100644 --- a/revision.txt +++ b/revision.txt @@ -1 +1 @@ -4029 \ No newline at end of file +4030 \ No newline at end of file