|
From: Martin S. <ma...@fl...> - 2007-06-29 16:51:03
|
Update of /var/cvs/FlightGear-0.9/data/Aircraft/P-38-Lightning/System
In directory baron:/tmp/cvs-serv23240/P-38-Lightning/System
Added Files:
FA-18-autopilot.xml cmd-p38.nas electrical.nas nav.nas p38.nas
Log Message:
Gerard ROBIN:
Here is available the GPL version of P-38L Lightning.
--- NEW FILE ---
<?xml version="1.0"?>
<!-- FA-18 Autopilot Configuration, Initially taken from the Generic Autopilot -->
<!-- Each component is evaluated in the order specified. You can make up -->
<!-- property names to pass the result of one component on to a subsequent -->
<!-- component. -->
<PropertyList>
<!-- =============================================================== -->
<!-- Roll Axis Modes -->
<!-- =============================================================== -->
<!-- Wing leveler -->
<pid-controller>
<name>Wing Leveler (Turn Coordinator based)</name>
<debug>false</debug>
<enable>
<prop>/autopilot/locks/heading</prop>
<value>wing-leveler</value>
</enable>
<input>
<prop>/instrumentation/turn-indicator/indicated-turn-rate</prop>
</input>
<reference>
<value>0.0</value>
</reference>
<output>
<prop>/controls/flight/aileron</prop>
</output>
<config>
<Kp>0.015</Kp> <!-- proportional gain -->
<beta>1.0</beta> <!-- input value weighing factor -->
<alpha>0.1</alpha> <!-- low pass filter weighing factor -->
<gamma>0.0</gamma> <!-- input value weighing factor for -->
<!-- unfiltered derivative error -->
<Ti>10.0</Ti> <!-- integrator time -->
<Td>0.00001</Td> <!-- derivator time -->
<u_min>-1.0</u_min> <!-- minimum output clamp -->
<u_max>1.0</u_max> <!-- maximum output clamp -->
</config>
</pid-controller>
<!-- Heading Bug Hold. 2 stage cascade controller. -->
<!-- Stage #1 sets target roll based on diff between current heading -->
<!-- and heading bug. -->
<pid-controller>
<name>Heading Bug Hold (DG based) Stage 1</name>
<debug>false</debug>
<enable>
<prop>/autopilot/locks/heading</prop>
<value>dg-heading-hold</value>
</enable>
<input>
<prop>/autopilot/internal/heading-bug-error-deg</prop>
</input>
<reference>
<value>0.0</value>
</reference>
<output>
<prop>/autopilot/internal/target-roll-deg</prop>
</output>
<config>
<Kp>-1.0</Kp> <!-- proportional gain -->
<beta>1.0</beta> <!-- input value weighing factor -->
<alpha>0.1</alpha> <!-- low pass filter weighing factor -->
<gamma>0.0</gamma> <!-- input value weighing factor for -->
<!-- unfiltered derivative error -->
<Ti>10.0</Ti> <!-- integrator time -->
<Td>0.00001</Td> <!-- derivator time -->
<u_min>-20.0</u_min> <!-- minimum output clamp -->
<u_max>20.0</u_max> <!-- maximum output clamp -->
</config>
</pid-controller>
<!-- Stage #2 drives the ailerons to achieve the desired roll deg. -->
<pid-controller>
<name>Heading Bug Hold (DG based) Stage 2</name>
<debug>false</debug>
<enable>
<prop>/autopilot/locks/heading</prop>
<value>dg-heading-hold</value>
</enable>
<input>
<prop>/orientation/roll-deg</prop>
</input>
<reference>
<prop>/autopilot/internal/target-roll-deg</prop>
</reference>
<output>
<prop>/controls/flight/aileron</prop>
</output>
<config>
<Kp>0.015</Kp> <!-- proportional gain -->
<beta>1.0</beta> <!-- input value weighing factor -->
<alpha>0.1</alpha> <!-- low pass filter weighing factor -->
<gamma>0.0</gamma> <!-- input value weighing factor for -->
<!-- unfiltered derivative error -->
<Ti>10.0</Ti> <!-- integrator time -->
<Td>0.00001</Td> <!-- derivator time -->
<u_min>-1.0</u_min> <!-- minimum output clamp -->
<u_max>1.0</u_max> <!-- maximum output clamp -->
</config>
</pid-controller>
<!-- True Heading hold. 2 stage cascade controller. -->
<!-- Stage #1 sets target roll based on diff between current heading -->
<!-- and target heading. -->
<pid-controller>
<name>True Heading Hold (DG based) Stage 1</name>
<debug>false</debug>
<enable>
<prop>/autopilot/locks/heading</prop>
<value>true-heading-hold</value>
</enable>
<input>
<prop>/autopilot/internal/true-heading-error-deg</prop>
</input>
<reference>
<value>0.0</value>
</reference>
<output>
<prop>/autopilot/internal/target-roll-deg</prop>
</output>
<config>
<Kp>-1.0</Kp> <!-- proportional gain -->
<beta>1.0</beta> <!-- input value weighing factor -->
<alpha>0.1</alpha> <!-- low pass filter weighing factor -->
<gamma>0.0</gamma> <!-- input value weighing factor for -->
<!-- unfiltered derivative error -->
<Ti>10.0</Ti> <!-- integrator time -->
<Td>0.00001</Td> <!-- derivator time -->
<u_min>-30.0</u_min> <!-- minimum output clamp -->
<u_max>30.0</u_max> <!-- maximum output clamp -->
</config>
</pid-controller>
<!-- Stage #2 drives the ailerons to achieve the desired roll deg. -->
<pid-controller>
<name>True Heading Hold (DG based) Stage 2</name>
<debug>false</debug>
<enable>
<prop>/autopilot/locks/heading</prop>
<value>true-heading-hold</value>
</enable>
<input>
<prop>/orientation/roll-deg</prop>
</input>
<reference>
<prop>/autopilot/internal/target-roll-deg</prop>
</reference>
<output>
<prop>/controls/flight/aileron</prop>
</output>
<config>
<Kp>0.015</Kp> <!-- proportional gain -->
<beta>1.0</beta> <!-- input value weighing factor -->
<alpha>0.1</alpha> <!-- low pass filter weighing factor -->
<gamma>0.0</gamma> <!-- input value weighing factor for -->
<!-- unfiltered derivative error -->
<Ti>10.0</Ti> <!-- integrator time -->
<Td>0.00001</Td> <!-- derivator time -->
<u_min>-1.0</u_min> <!-- minimum output clamp -->
<u_max>1.0</u_max> <!-- maximum output clamp -->
</config>
</pid-controller>
<!-- Nav1 hold. 2 stage cascade controller. -->
<!-- Stage #1 sets target roll based on diff between current heading -->
<!-- and target heading. -->
<pid-controller>
<name>Nav1 Hold Stage 1</name>
<debug>false</debug>
<enable>
<prop>/autopilot/locks/heading</prop>
<value>nav1-hold</value>
</enable>
<input>
<prop>/autopilot/internal/nav1-heading-error-deg</prop>
</input>
<reference>
<value>0.0</value>
</reference>
<output>
<prop>/autopilot/internal/target-roll-deg</prop>
</output>
<config>
<Kp>-1.0</Kp> <!-- proportional gain -->
<beta>1.0</beta> <!-- input value weighing factor -->
<alpha>0.1</alpha> <!-- low pass filter weighing factor -->
<gamma>0.0</gamma> <!-- input value weighing factor for -->
<!-- unfiltered derivative error -->
<Ti>10.0</Ti> <!-- integrator time -->
<Td>0.00001</Td> <!-- derivator time -->
<u_min>-20.0</u_min> <!-- minimum output clamp -->
<u_max>20.0</u_max> <!-- maximum output clamp -->
</config>
</pid-controller>
<!-- Stage #2 drives the ailerons to achieve the desired roll deg. -->
<pid-controller>
<name>Nav1 Hold Stage 2</name>
<debug>false</debug>
<enable>
<prop>/autopilot/locks/heading</prop>
<value>nav1-hold</value>
</enable>
<input>
<prop>/orientation/roll-deg</prop>
</input>
<reference>
<prop>/autopilot/internal/target-roll-deg</prop>
</reference>
<output>
<prop>/controls/flight/aileron</prop>
</output>
<config>
<Kp>0.1</Kp> <!-- proportional gain -->
<beta>1.0</beta> <!-- input value weighing factor -->
<alpha>0.1</alpha> <!-- low pass filter weighing factor -->
<gamma>0.0</gamma> <!-- input value weighing factor for -->
<!-- unfiltered derivative error -->
<Ti>10.0</Ti> <!-- integrator time -->
<Td>0.00001</Td> <!-- derivator time -->
<u_min>-1.0</u_min> <!-- minimum output clamp -->
<u_max>1.0</u_max> <!-- maximum output clamp -->
</config>
</pid-controller>
<!-- =============================================================== -->
<!-- Pitch Axis Modes -->
<!-- =============================================================== -->
<!-- Simple pitch hold -->
<pid-controller>
<name>Pitch hold</name>
<debug>false</debug>
<enable>
<prop>/autopilot/locks/altitude</prop>
<value>pitch-hold</value>
</enable>
<input>
<prop>/orientation/pitch-deg</prop>
</input>
<reference>
<prop>/autopilot/settings/target-pitch-deg</prop>
</reference>
<output>
<prop>/controls/flight/elevator-trim</prop>
</output>
<config>
<Kp>-0.05</Kp> <!-- proportional gain -->
<beta>1.0</beta> <!-- input value weighing factor -->
<alpha>0.1</alpha> <!-- low pass filter weighing factor -->
<gamma>0.0</gamma> <!-- input value weighing factor for -->
<!-- unfiltered derivative error -->
<Ti>1.0</Ti> <!-- integrator time -->
<Td>0.00001</Td> <!-- derivator time -->
<u_min>-1.0</u_min> <!-- minimum output clamp -->
<u_max>1.0</u_max> <!-- maximum output clamp -->
</config>
</pid-controller>
<!-- Simple angle of attack hold -->
<pid-controller>
<name>AOA hold</name>
<debug>false</debug>
<enable>
<prop>/autopilot/locks/altitude</prop>
<value>aoa-hold</value>
</enable>
<input>
<prop>/orientation/alpha-deg</prop>
</input>
<reference>
<prop>/autopilot/settings/target-aoa-deg</prop>
</reference>
<output>
<prop>/controls/flight/elevator-trim</prop>
</output>
<config>
<Kp>-0.05</Kp> <!-- proportional gain -->
<beta>1.0</beta> <!-- input value weighing factor -->
<alpha>0.1</alpha> <!-- low pass filter weighing factor -->
<gamma>0.0</gamma> <!-- input value weighing factor for -->
<!-- unfiltered derivative error -->
<Ti>0.5</Ti> <!-- integrator time -->
<Td>0.00001</Td> <!-- derivator time -->
<u_min>-1.0</u_min> <!-- minimum output clamp -->
<u_max>1.0</u_max> <!-- maximum output clamp -->
</config>
</pid-controller>
<!-- Altitude hold. 2 stage cascade controller. -->
<!-- Stage #1 sets target rate of climb based on diff between current alt -->
<!-- and target altitude. -->
<pi-simple-controller>
<name>Altitude Hold (Altimeter based) Stage 1</name>
<debug>false</debug>
<enable>
<prop>/autopilot/locks/altitude</prop>
<value>altitude-hold</value>
</enable>
<input>
<prop>/position/altitude-ft</prop>
</input>
<reference>
<prop>/autopilot/settings/target-altitude-ft</prop>
</reference>
<output>
<prop>/autopilot/internal/target-climb-rate-fps</prop>
</output>
<config>
<Kp>0.3</Kp> <!-- proportional gain -->
<Ki>0.0</Ki> <!-- integral gain -->
<u_min>-33.34</u_min> <!-- minimum output clamp -->
<u_max>33.34</u_max> <!-- maximum output clamp -->
</config>
</pi-simple-controller>
<!-- Stage #2 drives the elevator-trim to achieve the desired climb rate. -->
<pid-controller>
<name>Altitude Hold (Altimeter based) Stage 2</name>
<debug>false</debug>
<enable>
<prop>/autopilot/locks/altitude</prop>
<value>altitude-hold</value>
</enable>
<input>
<prop>/velocities/vertical-speed-fps</prop>
</input>
<reference>
<prop>/autopilot/internal/target-climb-rate-fps</prop>
</reference>
<output>
<prop>/controls/flight/elevator-trim</prop>
</output>
<config>
<Kp>-0.002</Kp> <!-- proportional gain -->
<beta>1.0</beta> <!-- input value weighing factor -->
<alpha>0.1</alpha> <!-- low pass filter weighing factor -->
<gamma>0.0</gamma> <!-- input value weighing factor for -->
<!-- unfiltered derivative error -->
<Ti>10.0</Ti> <!-- integrator time -->
<Td>0.00001</Td> <!-- derivator time -->
<u_min>-1.0</u_min> <!-- minimum output clamp -->
<u_max>1.0</u_max> <!-- maximum output clamp -->
</config>
</pid-controller>
<!-- AGL hold. 2 stage cascade controller. -->
<!-- Stage #1 sets target rate of climb based on diff between current agl -->
<!-- and target agl. -->
<pi-simple-controller>
<name>AGL Hold (Altimeter based) Stage 1</name>
<debug>false</debug>
<enable>
<prop>/autopilot/locks/altitude</prop>
<value>agl-hold</value>
</enable>
<input>
<prop>/position/altitude-agl-ft</prop>
</input>
<reference>
<prop>/autopilot/settings/target-agl-ft</prop>
</reference>
<output>
<prop>/autopilot/internal/target-climb-rate-fps</prop>
</output>
<config>
<Kp>0.3</Kp> <!-- proportional gain -->
<Ki>0.0</Ki> <!-- integral gain -->
<u_min>-16.67</u_min> <!-- minimum output clamp -->
<u_max>8.33</u_max> <!-- maximum output clamp -->
</config>
</pi-simple-controller>
<!-- Stage #2 drives the elevator-trim to achieve the desired climb rate. -->
<pid-controller>
<name>Altitude Hold (Altimeter based) Stage 2</name>
<debug>false</debug>
<enable>
<prop>/autopilot/locks/altitude</prop>
<value>agl-hold</value>
</enable>
<input>
<prop>/velocities/vertical-speed-fps</prop>
</input>
<reference>
<prop>/autopilot/internal/target-climb-rate-fps</prop>
</reference>
<output>
<prop>/controls/flight/elevator-trim</prop>
</output>
<config>
<Kp>-0.002</Kp> <!-- proportional gain -->
<beta>1.0</beta> <!-- input value weighing factor -->
<alpha>0.1</alpha> <!-- low pass filter weighing factor -->
<gamma>0.0</gamma> <!-- input value weighing factor for -->
<!-- unfiltered derivative error -->
<Ti>10.0</Ti> <!-- integrator time -->
<Td>0.00001</Td> <!-- derivator time -->
<u_min>-1.0</u_min> <!-- minimum output clamp -->
<u_max>1.0</u_max> <!-- maximum output clamp -->
</config>
</pid-controller>
<!-- Glideslope hold. -->
<!-- Stage #2 drives the elevator-trim to achieve the desired climb rate. -->
<pid-controller>
<name>Glideslop Hold</name>
<debug>false</debug>
<enable>
<prop>/autopilot/locks/altitude</prop>
<value>gs1-hold</value>
</enable>
<input>
<prop>/velocities/vertical-speed-fps</prop>
</input>
<reference>
<prop>/radios/nav[0]/gs-rate-of-climb</prop>
</reference>
<output>
<prop>/controls/flight/elevator-trim</prop>
</output>
<config>
<Kp>-0.002</Kp> <!-- proportional gain -->
<beta>1.0</beta> <!-- input value weighing factor -->
<alpha>0.1</alpha> <!-- low pass filter weighing factor -->
<gamma>0.0</gamma> <!-- input value weighing factor for -->
<!-- unfiltered derivative error -->
<Ti>10.0</Ti> <!-- integrator time -->
<Td>0.00001</Td> <!-- derivator time -->
<u_min>-1.0</u_min> <!-- minimum output clamp -->
<u_max>1.0</u_max> <!-- maximum output clamp -->
</config>
</pid-controller>
<!-- vertical speed hold -->
<pid-controller>
<name>Vertical Speed Hold</name>
<debug>false</debug>
<enable>
<prop>/autopilot/locks/altitude</prop>
<value>vertical-speed-hold</value>
</enable>
<input>
<prop>/velocities/vertical-speed-fps</prop>
</input>
<reference>
<prop>/autopilot/settings/vertical-speed-fpm</prop>
<scale>0.01667</scale>
</reference>
<output>
<prop>/controls/flight/elevator-trim</prop>
</output>
<config>
<Kp>-0.002</Kp> <!-- proportional gain -->
<beta>1.0</beta> <!-- input value weighing factor -->
<alpha>0.1</alpha> <!-- low pass filter weighing factor -->
<gamma>0.0</gamma> <!-- input value weighing factor for -->
<!-- unfiltered derivative error -->
<Ti>10.0</Ti> <!-- integrator time -->
<Td>0.00001</Td> <!-- derivator time -->
<u_min>-1.0</u_min> <!-- minimum output clamp -->
<u_max>1.0</u_max> <!-- maximum output clamp -->
</config>
</pid-controller>
<!-- =============================================================== -->
<!-- Velocity Modes -->
<!-- =============================================================== -->
<!-- Auto throttle -->
<pid-controller>
<name>Auto Throttle (5 sec lookahead)</name>
<debug>false</debug>
<enable>
<prop>/autopilot/locks/speed</prop>
<value>speed-with-throttle</value>
</enable>
<input>
<!-- <prop>/autopilot/internal/lookahead-5-sec-airspeed-kt</prop> -->
<prop>/velocities/airspeed-kt</prop>
</input>
<reference>
<prop>/autopilot/settings/target-speed-kt</prop>
</reference>
<output>
<prop>/controls/engines/engine[0]/throttle</prop>
<prop>/controls/engines/engine[1]/throttle</prop>
<prop>/controls/engines/engine[2]/throttle</prop>
<prop>/controls/engines/engine[3]/throttle</prop>
<prop>/controls/engines/engine[4]/throttle</prop>
<prop>/controls/engines/engine[5]/throttle</prop>
<prop>/controls/engines/engine[6]/throttle</prop>
<prop>/controls/engines/engine[7]/throttle</prop>
</output>
<config>
<Kp>0.1</Kp> <!-- proportional gain -->
<beta>1.0</beta> <!-- input value weighing factor -->
<alpha>0.1</alpha> <!-- low pass filter weighing factor -->
<gamma>0.0</gamma> <!-- input value weighing factor for -->
<!-- unfiltered derivative error -->
<Ti>10.0</Ti> <!-- integrator time -->
<Td>0.00001</Td> <!-- derivator time -->
<u_min>0.0</u_min> <!-- minimum output clamp -->
<u_max>1.0</u_max> <!-- maximum output clamp -->
</config>
</pid-controller>
<!-- Hold speed by varying pitch trim (Two stage cascading controller) -->
<pid-controller>
<name>Speed hold (vary pitch trim) Stage #1</name>
<debug>false</debug>
<enable>
<prop>/autopilot/locks/speed</prop>
<value>speed-with-pitch-trim</value>
</enable>
<input>
<prop>/autopilot/internal/lookahead-5-sec-airspeed-kt</prop>
</input>
<reference>
<prop>/autopilot/settings/target-speed-kt</prop>
</reference>
<output>
<prop>/autopilot/settings/target-pitch-deg</prop>
</output>
<config>
<Kp>-1.0</Kp> <!-- proportional gain -->
<beta>1.0</beta> <!-- input value weighing factor -->
<alpha>0.1</alpha> <!-- low pass filter weighing factor -->
<gamma>0.0</gamma> <!-- input value weighing factor for -->
<!-- unfiltered derivative error -->
<Ti>1.0</Ti> <!-- integrator time -->
<Td>0.00001</Td> <!-- derivator time -->
<u_min>-15.0</u_min><!-- minimum output clamp -->
<u_max>15.0</u_max> <!-- maximum output clamp -->
</config>
</pid-controller>
<pid-controller>
<name>Speed hold (vary pitch trim) Stage #2</name>
<debug>false</debug>
<enable>
<prop>/autopilot/locks/speed</prop>
<value>speed-with-pitch-trim</value>
</enable>
<input>
<prop>/orientation/pitch-deg</prop>
</input>
<reference>
<prop>/autopilot/settings/target-pitch-deg</prop>
</reference>
<output>
<prop>/controls/flight/elevator-trim</prop>
</output>
<config>
<Kp>-0.002</Kp> <!-- proportional gain -->
<beta>1.0</beta> <!-- input value weighing factor -->
<alpha>0.1</alpha> <!-- low pass filter weighing factor -->
<gamma>0.0</gamma> <!-- input value weighing factor for -->
<!-- unfiltered derivative error -->
<Ti>1.0</Ti> <!-- integrator time -->
<Td>0.00001</Td> <!-- derivator time -->
<u_min>-1.0</u_min> <!-- minimum output clamp -->
<u_max>1.0</u_max> <!-- maximum output clamp -->
</config>
</pid-controller>
</PropertyList>
--- NEW FILE ---
# By G ROBIN
#cmd-p38.nas
# Copied from F4U-7
#CowlFlap =================
setprop("/position/altitude-agl-ft",0);
setprop("/controls/flight/cowl-flap",0);
setprop("/gear/gear[0]/position-norm",0);
cowlflapSurvey = func {
#print("boucle");
if(getprop("/controls/gear/gear-down")>0){
if(getprop("gear/gear[0]/wow")>0 and getprop("/controls/flight/cowl-flap")<1){
setprop("/controls/flight/cowl-flap", 1);
print("init cowlflap");
}else{
settimer(cowlflapSurvey, 0.1);
}
}
}
setlistener("/controls/gear/gear-down",cowlflapSurvey,1);
#Flap only if less than 200 knots=======================
flapcmd = func {
if(getprop("/velocities/airspeed-kt")<200){
controls.flapsDown(1);
}
}
#Control des eclairages==============================
setprop("/sim/model/p38/lighting/instrument-lights",0);
Light_Cmd=func{
if(getprop("/systems/electrical/outputs/instrument-lights")>27){
Light_Value=getprop("/sim/model/p38/lighting/instrument-lights");
setprop("/controls/lighting/instruments-norm",Light_Value);
}
}
setlistener("/sim/model/p38/lighting/instrument-lights",Light_Cmd);
#Alimentation Electrique========Allumé Coupé===========================================
Aig_AC=0;
setprop("/controls/electric/master-switch",Aig_AC);
Electric_Cmt=func{
Aig_AC=getprop("/controls/electric/master-switch");
Aig_AC=1-Aig_AC;
setprop("/controls/electric/master-switch",Aig_AC);
}
Electric_Cmd=func{
if(getprop("/controls/electric/master-switch")=="1"){
setprop("/controls/electric/battery-switch","true");
setprop("controls/electric/external-power", "true");
setprop("/controls/engines/engine[0]/master-bat", "true");
setprop("/controls/switches/master-avionics", "true");
}
elsif(getprop("/controls/electric/master-switch")=="0"){
setprop("/controls/electric/battery-switch","false");
setprop("controls/electric/external-power", "false");
setprop("/controls/engines/engine[0]/master-bat", "false");
setprop("/controls/switches/master-avionics", "false");
setprop("/controls/lighting/instruments-norm",0);
}
}
Electric_Cmd();
setlistener("/controls/electric/master-switch",Electric_Cmd);
#Magneto===============================================================
magvaleur=0;
stepMagnetos = func {
change = arg[0];
magvaleur = getprop("/controls/engines/engine[0]/magnetos");
setprop("/controls/engines/engine[0]/magnetos", magvaleur + change);
if(getprop("/controls/engines/engine[0]/magnetos")=="1"){
Electric_Cmt();
}
}
#Control surcompression et durée d'utilisation=========================================
#// (In throttle % - actual input is 0 -> 1)
#// 99 / 100 - Takeoff boost
#// 96 / 97 / 98 - Rated boost
#// 0 - 95 - Idle to Rated boost (MinManifoldPressure to MaxManifoldPressure)
#// In real life, most planes would be fitted with a mechanical 'gate' between
#// the rated boost and takeoff boost positions.
#TakeOffBoost=0.99;
#RatedBoost=0.96;
#IdleRatedBoostMin=0;
#IdleRatedBoostMax=0.95;
boost_start=0;
delay_st=300; #5 minutes ?
timer_boost=0;
now_st=0;
Ctl_Throttle=func{
if(getprop("/controls/engines/engine[0]throttle")>0.981){
if(timer_boost==1){
now_st=getprop("sim/time/elapsed-sec");
if (now_st - boost_start > delay_st ) {
setprop("/controls/engines/engine[0]throttle", 0.98);
setprop("/controls/engines/engine[1]throttle", 0.98);
setprop("/controls/flight/cowl-flap", 0);
timer_boost=0;
#print("now_st",now_st);
#print("Fin",timer_boost);
}
}else{
timer_boost=1;
boost_start=getprop("sim/time/elapsed-sec");
print("boost_start");
}
settimer(Ctl_Throttle,1);
}else{
timer_boost=0;
#print("Fin",timer_boost);
}
#print("boucle");
}
setlistener("/controls/engines/engine[0]throttle",Ctl_Throttle);
--- NEW FILE ---
##
# Procedural model of a Cessna 172S electrical system. Includes a
# preliminary battery charge/discharge model and realistic ammeter
# gauge modeling.
#
# Modified By G ROBIN
##
# Initialize internal values
#
battery = nil;
alternator = nil;
last_time = 0.0;
vbus_volts = 0.0;
ebus1_volts = 0.0;
ebus2_volts = 0.0;
ammeter_ave = 0.0;
##
# Initialize the electrical system
#
init_electrical = func {
print("Initializing Nasal Electrical System");
battery = BatteryClass.new();
alternator = AlternatorClass.new();
# set initial switch positions
setprop("/controls/engines/engine[0]/master-bat", 0);
setprop("/controls/engines/engine[0]/master-alt", "true");
setprop("/controls/switches/master-avionics", 0);
setprop("/systems/electrical/outputs/fuel-pump", 0.0);
setprop("/systems/electrical/outputs/cabin-lights", 0.0);
setprop("/systems/electrical/outputs/instr-ignition-switch", 0.0);
setprop("/systems/electrical/outputs/beacon", 0.0);
# Request that the update fuction be called next frame
settimer(update_electrical, 0);
}
##
# Battery model class.
#
BatteryClass = {};
BatteryClass.new = func {
obj = { parents : [BatteryClass],
ideal_volts : 24.0,
ideal_amps : 30.0,
amp_hours : 12.75,
charge_percent : 1.0,
charge_amps : 7.0 };
return obj;
}
##
# Passing in positive amps means the battery will be discharged.
# Negative amps indicates a battery charge.
#
BatteryClass.apply_load = func( amps, dt ) {
amphrs_used = amps * dt / 3600.0;
percent_used = amphrs_used / me.amp_hours;
me.charge_percent -= percent_used;
if ( me.charge_percent < 0.0 ) {
me.charge_percent = 0.0;
} elsif ( me.charge_percent > 1.0 ) {
me.charge_percent = 1.0;
}
# print( "battery percent = ", me.charge_percent);
return me.amp_hours * me.charge_percent;
}
##
# Return output volts based on percent charged. Currently based on a simple
# polynomal percent charge vs. volts function.
#
BatteryClass.get_output_volts = func {
x = 1.0 - me.charge_percent;
tmp = -(3.0 * x - 1.0);
factor = (tmp*tmp*tmp*tmp*tmp + 32) / 32;
return me.ideal_volts * factor;
}
##
# Return output amps available. This function is totally wrong and should be
# fixed at some point with a more sensible function based on charge percent.
# There is probably some physical limits to the number of instantaneous amps
# a battery can produce (cold cranking amps?)
#
BatteryClass.get_output_amps = func {
x = 1.0 - me.charge_percent;
tmp = -(3.0 * x - 1.0);
factor = (tmp*tmp*tmp*tmp*tmp + 32) / 32;
return me.ideal_amps * factor;
}
##
# Alternator model class.
#
AlternatorClass = {};
AlternatorClass.new = func {
obj = { parents : [AlternatorClass],
rpm_source : "/engines/engine[0]/n1",
rpm_threshold : 30.0,
ideal_volts : 28.0,
ideal_amps : 60.0 };
setprop( obj.rpm_source, 0.0 );
return obj;
}
##
# Computes available amps and returns remaining amps after load is applied
#
AlternatorClass.apply_load = func( amps, dt ) {
# Scale alternator output for rpms < 600. For rpms >= 600
# give full output. This is just a WAG, and probably not how
# it really works but I'm keeping things "simple" to start.
rpm = getprop( me.rpm_source );
factor = rpm / me.rpm_threshold;
if ( factor > 1.0 ) {
factor = 1.0;
}
# print( "alternator amps = ", me.ideal_amps * factor );
available_amps = me.ideal_amps * factor;
return available_amps - amps;
}
##
# Return output volts based on rpm
#
AlternatorClass.get_output_volts = func {
# scale alternator output for rpms < 600. For rpms >= 600
# give full output. This is just a WAG, and probably not how
# it really works but I'm keeping things "simple" to start.
rpm = getprop( me.rpm_source );
factor = rpm / me.rpm_threshold;
if ( factor > 1.0 ) {
factor = 1.0;
}
# print( "alternator volts = ", me.ideal_volts * factor );
return me.ideal_volts * factor;
}
##
# Return output amps available based on rpm.
#
AlternatorClass.get_output_amps = func {
# scale alternator output for rpms < 600. For rpms >= 600
# give full output. This is just a WAG, and probably not how
# it really works but I'm keeping things "simple" to start.
rpm = getprop( me.rpm_source );
factor = rpm / me.rpm_threshold;
if ( factor > 1.0 ) {
factor = 1.0;
}
# print( "alternator amps = ", ideal_amps * factor );
return me.ideal_amps * factor;
}
##
# This is the main electrical system update function.
#
update_electrical = func {
time = getprop("/sim/time/elapsed-sec");
dt = time - last_time;
last_time = time;
update_virtual_bus( dt );
# Request that the update fuction be called again next frame
settimer(update_electrical, 0);
}
##
# Model the system of relays and connections that join the battery,
# alternator, starter, master/alt switches, external power supply.
#
update_virtual_bus = func( dt ) {
if(getprop("/controls/electric/master-switch")==0){
battery_volts = 0;
}else{
battery_volts = battery.get_output_volts();
}
alternator_volts = alternator.get_output_volts();
if(getprop("/controls/electric/master-switch")==1 and getprop("/position/altitude-agl-ft")<6 and getprop("controls/electric/external-power")==1){
external_volts = 29.0;
}else{
external_volts = 0.0;
}
load = 0.0;
# switch state
master_bat = getprop("/controls/engines/engine[0]/master-bat");
master_alt = getprop("/controls/engines/engine[0]/master-alt");
# determine power source
bus_volts = 0.0;
power_source = nil;
if ( master_bat ) {
bus_volts = battery_volts;
power_source = "battery";
}
if ( master_alt and (alternator_volts > bus_volts) ) {
bus_volts = alternator_volts;
power_source = "alternator";
}
if ( external_volts > bus_volts ) {
bus_volts = external_volts;
power_source = "external";
}
# print( "virtual bus volts = ", bus_volts );
# starter motor
#starter_switch = getprop("/controls/engines/engine[0]/starter");
#starter_volts = 0.0;
#if ( starter_switch ) {
# starter_volts = bus_volts;
# }
#setprop("/systems/electrical/outputs/starter[0]", starter_volts);
# bus network (1. these must be called in the right order, 2. the
# bus routine itself determins where it draws power from.)
load += electrical_bus_1();
load += electrical_bus_2();
load += cross_feed_bus();
load += avionics_bus_1();
load += avionics_bus_2();
# system loads and ammeter gauge
ammeter = 0.0;
if ( bus_volts > 1.0 ) {
# normal load
load += 15.0;
# ammeter gauge
if ( power_source == "battery" ) {
ammeter = -load;
} else {
ammeter = battery.charge_amps;
}
}
# print( "ammeter = ", ammeter );
# charge/discharge the battery
if ( power_source == "battery" ) {
battery.apply_load( load, dt );
} elsif ( bus_volts > battery_volts ) {
battery.apply_load( -battery.charge_amps, dt );
}
# filter ammeter needle pos
ammeter_ave = 0.8 * ammeter_ave + 0.2 * ammeter;
# outputs
setprop("/systems/electrical/amps", ammeter_ave);
setprop("/systems/electrical/volts", bus_volts);
vbus_volts = bus_volts;
return load;
}
electrical_bus_1 = func() {
# we are fed from the "virtual" bus
bus_volts = vbus_volts;
load = 0.0;
# Cabin Lights Power
if ( getprop("/controls/circuit-breakers/cabin-lights-pwr") ) {
setprop("/systems/electrical/outputs/cabin-lights", bus_volts);
} else {
setprop("/systems/electrical/outputs/cabin-lights", 0.0);
}
# Instrument Power
setprop("/systems/electrical/outputs/instr-ignition-switch", bus_volts);
# Fuel Pump Power
if ( getprop("/controls/engines/engine[0]/fuel-pump") ) {
setprop("/systems/electrical/outputs/fuel-pump", bus_volts);
} else {
setprop("/systems/electrical/outputs/fuel-pump", 0.0);
}
# Landing Light Power
if ( getprop("/controls/switches/landing-light") ) {
setprop("/systems/electrical/outputs/landing-light", bus_volts);
} else {
setprop("/systems/electrical/outputs/landing-light", 0.0 );
}
# Beacon Power
if ( getprop("/controls/switches/flashing-beacon" ) ) {
setprop("/systems/electrical/outputs/beacon", bus_volts);
if ( bus_volts > 1.0 ) { load += 7.5; }
} else {
setprop("/systems/electrical/outputs/beacon", 0.0);
}
# Flaps Power
setprop("/systems/electrical/outputs/flaps", bus_volts);
# register bus voltage
ebus1_volts = bus_volts;
# return cumulative load
return load;
}
electrical_bus_2 = func() {
# we are fed from the "virtual" bus
bus_volts = vbus_volts;
load = 0.0;
# Turn Coordinator Power
setprop("/systems/electrical/outputs/turn-coordinator", bus_volts);
# Map Lights Power
if ( getprop("/controls/switches/nav-lights" ) ) {
setprop("/systems/electrical/outputs/map-lights", bus_volts);
if ( bus_volts > 1.0 ) { load += 7.0; }
} else {
setprop("/systems/electrical/outputs/map-lights", 0.0);
}
# Instrument Lights Power
setprop("/systems/electrical/outputs/instrument-lights", bus_volts);
# Strobe Lights Power
if ( getprop("/controls/switches/strobe-lights" ) ) {
setprop("/systems/electrical/outputs/strobe-lights", bus_volts);
} else {
setprop("/systems/electrical/outputs/strobe-lights", 0.0);
}
# Taxi Lights Power
if ( getprop("/controls/switches/taxi-lights" ) ) {
setprop("/systems/electrical/outputs/taxi-lights", bus_volts);
} else {
setprop("/systems/electrical/outputs/taxi-lights", 0.0);
}
# Pitot Heat Power
if ( getprop("/controls/switches/pitot-heat" ) ) {
setprop("/systems/electrical/outputs/pitot-heat", bus_volts);
} else {
setprop("/systems/electrical/outputs/pitot-heat", 0.0);
}
# register bus voltage
ebus2_volts = bus_volts;
# return cumulative load
return load;
}
cross_feed_bus = func() {
# we are fed from either of the electrical bus 1 or 2
if ( ebus1_volts > ebus2_volts ) {
bus_volts = ebus1_volts;
} else {
bus_volts = ebus2_volts;
}
load = 0.0;
setprop("/systems/electrical/outputs/annunciators", bus_volts);
# return cumulative load
return load;
}
avionics_bus_1 = func() {
master_av = getprop("/controls/switches/master-avionics");
# we are fed from the electrical bus 1
if ( master_av ) {
bus_volts = ebus1_volts;
} else {
bus_volts = 0.0;
}
load = 0.0;
# Avionics Fan Power
setprop("/systems/electrical/outputs/avionics-fan", bus_volts);
#RADAR Power
setprop("/systems/electrical/outputs/radar", bus_volts);
# GPS Power
setprop("/systems/electrical/outputs/gps", bus_volts);
# HSI Power
setprop("/systems/electrical/outputs/hsi", bus_volts);
# NavCom 1 Power
setprop("/systems/electrical/outputs/nav[0]", bus_volts);
# DME Power
setprop("/systems/electrical/outputs/dme", bus_volts);
# Audio Panel 1 Power
setprop("/systems/electrical/outputs/audio-panel[0]", bus_volts);
# return cumulative load
return load;
}
avionics_bus_2 = func() {
master_av = getprop("/controls/switches/master-avionics");
# we are fed from the electrical bus 2
if ( master_av ) {
bus_volts = ebus2_volts;
} else {
bus_volts = 0.0;
}
load = 0.0;
# NavCom 2 Power
setprop("/systems/electrical/outputs/nav[1]", bus_volts);
# Audio Panel 2 Power
setprop("/systems/electrical/outputs/audio-panel[1]", bus_volts);
# Transponder Power
setprop("/systems/electrical/outputs/transponder", bus_volts);
# Autopilot Power
setprop("/systems/electrical/outputs/autopilot", bus_volts);
# ADF Power
setprop("/systems/electrical/outputs/adf", bus_volts);
# Tacan Power
setprop("/systems/electrical/outputs/tacan", bus_volts);
# return cumulative load
return load;
}
# Setup a timer based call to initialized the electrical system as
# soon as possible.
settimer(init_electrical, 0);
--- NEW FILE ---
# By G ROBIN.
#Must be revisited and customized for P38
#COPIED FROM F8E CRUSADER, most of these componants are not usables with the P38========================
#
#========SAISIE=====================================
setprop("/preset/input/modrw",0);
#*********read=0********** write=1**********************
setprop("/preset/input/standby",0);
#**********normal=0********standby=1*****************
setprop("/preset/input/chan-XX",01);
#***************from 1 to 20****************************
setprop("/preset/input/selector",0);
#**************manual=0***********preset=1*********
setprop("/preset/input/store",0);
#*************transmit=1****************************
setprop("/preset/input/freqtype",0);
#***0=adf********1=dme*******2=nav**************3=comm*********4=acls*********
setprop("instrumentation/heading-indicator/nav-switch",0);
#********* Manuel = 0 ,3 ADF = 1 NAV =2
setprop("/instrumentation/tacan/indicated-bearing-true-deg",0);
setprop("/instrumentation/heading-indicator/switch-tacan-acls",0);
#temporairement tacan est exclusif à TACAN et acls dédié à MARKER ADF DME NAV
#*********ŧacan=0 acls=1
setprop("/environment/magnetic-variation-deg",0);
#zone tampon et fonction de mise en forme======================================
setprop("/preset/input/val-XXn-nn",0);
setprop("/preset/input/val-nnX-nn",0);
setprop("/preset/input/val-nnn-XX",0);
setprop("/preset/input/frequence",0);
frequence=0;
val_XXn_nn=getprop("/preset/input/val-XXn-nn");
val_nnX_nn=getprop("/preset/input/val-nnX-nn");
val_nnn_XX=getprop("/preset/input/val-nnn-XX");
channel=[];
setsize(channel,10);
channel[0]="0";
channel[1]="1";
channel[2]="2";
channel[3]="3";
channel[4]="4";
channel[5]="5";
channel[6]="6";
channel[7]="7";
channel[8]="8";
channel[9]="9";
#mise en forme des données pour affichage==============================================
format_display = func{
val_XXn_nn=int(frequence/10);
val_nnX_nn=int(frequence-(val_XXn_nn*10));
val_nnn_XX=int(frequence*100)-int(val_XXn_nn*1000)-int(val_nnX_nn*100);
setprop("/preset/input/val-XXn-nn",val_XXn_nn);
setprop("/preset/input/val-nnX-nn",val_nnX_nn);
setprop("/preset/input/val-nnn-XX",val_nnn_XX);
}
#mise en forme des données pour transfert==============================================
format_write = func{
val_XXn_nn=getprop("/preset/input/val-XXn-nn");
val_nnX_nn=getprop("/preset/input/val-nnX-nn");
val_nnn_XX=getprop("/preset/input/val-nnn-XX");
frequence=int(val_XXn_nn*10)+val_nnX_nn+(val_nnn_XX/100);
setprop("/preset/input/frequence",frequence);
}
#=============================ADF====================================
init_adf=func{
for(i=0;i<20;i=i+1){
select_num=i;
setprop("/preset/presets["~select_num~"]/selected/adf-freq-khz",000.00);
setprop("/preset/presets["~select_num~"]/standby/adf-freq-khz",000.00);
}
}
#init_adf();
setprop("/preset/adf/frequencies/selected-khz",0);
setprop("/preset/adf/frequencies/standby-khz",0);
load_preset_adf_frequency=func{
select_num=getprop("/preset/input/chan-XX")-1;
setprop("/preset/adf/frequencies/selected-khz",getprop("/preset/presets["~select_num~"]/selected/adf-freq-khz"));
setprop("/instrumentation/adf/frequencies/selected-khz",getprop("/preset/adf/frequencies/selected-khz"));
}
write_preset_adf_frequency=func{
store_num=getprop("/preset/input/chan-XX")-1;
setprop("/preset/adf/frequencies/selected-khz",frequence);
setprop("/preset/presets["~store_num~"]/selected/adf-freq-khz",getprop("/preset/adf/frequencies/selected-khz"));
}
read_adf_frequency=func{
if(getprop("/preset/input/selector")==1){
load_preset_adf_frequency();
}
frequence=getprop("/instrumentation/adf/frequencies/selected-khz");
setprop("/preset/input/frequence",frequence);
format_display();
}
write_adf_frequency=func{
frequence=getprop("/preset/input/frequence");
setprop("/instrumentation/adf/frequencies/selected-khz",frequence);
}
#===========================DME===========================================
init_dme=func{
for(i=0;i<20;i=i+1){
select_num=i;
setprop("/preset/presets["~select_num~"]/selected/dme-freq-mhz",000.00);
setprop("/preset/presets["~select_num~"]/standby/dme-freq-mhz",000.00);
}
}
#init_dme();
setprop("/preset/dme/frequencies/selected-mhz",0);
setprop("/preset/dme/frequencies/standby-mhz",0);
load_preset_dme_frequency=func{
select_num=getprop("/preset/input/chan-XX")-1;
setprop("/preset/dme/frequencies/selected-mhz",getprop("/preset/presets["~select_num~"]/selected/dme-freq-mhz"));
setprop("/instrumentation/dme/frequencies/selected-mhz",getprop("/preset/dme/frequencies/selected-mhz"));
}
write_preset_dme_frequency=func{
store_num=getprop("/preset/input/chan-XX")-1;
setprop("/preset/dme/frequencies/selected-mhz",frequence);
setprop("/preset/presets["~store_num~"]/selected/dme-freq-mhz",getprop("/preset/dme/frequencies/selected-mhz"));
}
read_dme_frequency=func{
if(getprop("/preset/input/selector")==1){
load_preset_dme_frequency();
}
if(getprop("/instrumentation/dme/frequencies/selected-mhz")==nil){
frequence=0;
}else{
frequence=getprop("/instrumentation/dme/frequencies/selected-mhz");
}
setprop("/preset/input/frequence",frequence);
format_display();
}
write_dme_frequency=func{
frequence=getprop("/preset/input/frequence");
setprop("/instrumentation/dme/frequencies/selected-mhz",frequence);
}
#=============================NAV ILS====================================
init_nav=func{
for(i=0;i<20;i=i+1){
select_num=i;
setprop("/preset/presets["~select_num~"]/selected/nav-freq-mhz",000.00);
setprop("/preset/presets["~select_num~"]/standby/nav-freq-mhz",000.00);
}
}
#init_nav();
setprop("/preset/nav/frequencies/selected-mhz",0);
setprop("/preset/nav/frequencies/standby-mhz",0);
load_preset_nav_freq = func {
select_num=getprop("/preset/input/chan-XX")-1;
setprop("/preset/nav/frequencies/selected-mhz",getprop("/preset/presets["~select_num~"]/selected/nav-freq-mhz"));
setprop("/instrumentation/nav/frequencies/selected-mhz",getprop("/preset/nav/frequencies/selected-mhz"));
}
write_preset_nav_frequency=func{
store_num=getprop("/preset/input/chan-XX")-1;
setprop("/preset/nav/frequencies/selected-mhz",frequence);
setprop("/preset/presets["~store_num~"]/selected/nav-freq-mhz",getprop("/preset/nav/frequencies/selected-mhz"));
}
read_nav_frequency= func {
if(getprop("/preset/input/selector")==1){
load_preset_nav_freq();
}
frequence=getprop("/instrumentation/nav/frequencies/selected-mhz");
setprop("/preset/input/frequence",frequence);
format_display();
}
write_nav_frequency=func{
frequence=getprop("/preset/input/frequence");
setprop("/instrumentation/nav/frequencies/selected-mhz",frequence);
}
#=============================COMM====================================
init_comm=func{
for(i=0;i<20;i=i+1){
select_num=i;
setprop("/preset/presets["~select_num~"]/selected/comm-freq-mhz",000.00);
setprop("/preset/presets["~select_num~"]/standby/comm-freq-mhz",000.00);
}
}
#init_comm();
setprop("/preset/comm/frequencies/selected-mhz",0);
setprop("/preset/comm/frequencies/standby-mhz",0);
load_preset_nav_frequency=func{
select_num=getprop("/preset/input/chan-XX")-1;
setprop("/preset/comm/frequencies/selected-mhz",getprop("/preset/presets["~select_num~"]/selected/comm-freq-mhz"));
setprop("/instrumentation/comm/frequencies/selected-mhz",getprop("/preset/comm/frequencies/selected-mhz"));
}
write_preset_comm_frequency=func{
store_num=getprop("/preset/input/chan-XX")-1;
setprop("/preset/comm/frequencies/selected-mhz",frequence);
setprop("/preset/presets["~store_num~"]/selected/comm-freq-mhz",getprop("/preset/comm/frequencies/selected-mhz"));
}
read_comm_frequency=func{
if(getprop("/preset/input/selector")==1){
load_preset_nav_frequency();
}
frequence=getprop("/instrumentation/comm/frequencies/selected-mhz");
setprop("/preset/input/frequence",frequence);
format_display();
}
write_comm_frequency=func{
frequence=getprop("/preset/input/frequence");
setprop("/instrumentation/comm/frequencies/selected-mhz",frequence);
}
#Affichage des frequences================================================
display_frequency=func{
if(getprop("/preset/input/modrw")==0){
if(getprop("/preset/input/freqtype")==0){
read_adf_frequency();
}
elsif(getprop("/preset/input/freqtype")==1){
read_dme_frequency();
}
elsif(getprop("/preset/input/freqtype")==2){
read_nav_frequency();
}
elsif(getprop("/preset/input/freqtype")==3){
read_comm_frequency();
}
}
elsif(getprop("/preset/input/modrw")==1){
frequence=0;
format_display();
}
}
display_frequency();
setlistener("/preset/input/freqtype",display_frequency);
setlistener("/preset/input/modrw",display_frequency);
setlistener("/preset/input/chan-XX",display_frequency);
setlistener("/preset/input/selector",display_frequency);
#Stockage des frequences================================================
transfer_frequency=func{
if(getprop("/preset/input/modrw")==1){
format_write();
#print("Frequence: ",frequence);
if(getprop("/preset/input/selector")==0){
if(getprop("/preset/input/freqtype")==0){
write_adf_frequency();
}
elsif(getprop("/preset/input/freqtype")==1){
write_dme_frequency();
}
elsif(getprop("/preset/input/freqtype")==2){
write_nav_frequency();
}
elsif(getprop("/preset/input/freqtype")==3){
write_comm_frequency();
}
} else {
preset_storage();
}
}
}
preset_storage=func{
if(getprop("/preset/input/freqtype")==0){
write_preset_adf_frequency();
}
elsif(getprop("/preset/input/freqtype")==1){
write_preset_dme_frequency();
}
elsif(getprop("/preset/input/freqtype")==2){
write_preset_nav_frequency();
}
elsif(getprop("/preset/input/freqtype")==3){
write_preset_comm_frequency();
}
}
transfer_frequency();
setlistener("/preset/input/store",transfer_frequency);
#init_adf(); init_dme(); init_nav(); init_comm();
#Specifique HSI ACLS instruments========
orientation=nav_heading=fromto_pointer=store_heading_marker=store_course_pointer=aig_course_pointer=aig_heading_marker=course_pointer_calc=0;
setprop("/instrumentation/heading-indicator/heading-marker",0);
setprop("/instrumentation/heading-indicator/manual-heading",0);
setprop("/instrumentation/heading-indicator/setting-manual-hdg",0);
setprop("/instrumentation/heading-indicator/course-pointer",0);
setprop("/instrumentation/heading-indicator/switch-tacan-acls",0);
setprop("/instrumentation/heading-indicator/fromto-pointer",0);
setprop("/orientation/heading-magnetic-deg",0);
setprop("/instrumentation/nav[0]/heading-deg",0);
cal_fromto_pointer=func{
orientation=getprop("/orientation/heading-magnetic-deg");
nav_heading=getprop("/instrumentation/nav[0]/heading-deg");
fromto_pointer= orientation - nav_heading ;
if (fromto_pointer <0 ){
fromto_pointer=360 + fromto_pointer;
}
if (fromto_pointer>30 and fromto_pointer< 90){
fromto_pointer=30;
}
elsif (fromto_pointer<150 and fromto_pointer >= 90){
fromto_pointer=150;
}
elsif (fromto_pointer>210 and fromto_pointer <= 270){
fromto_pointer=210;
}elsif
(fromto_pointer<330 and fromto_pointer > 270){
fromto_pointer=330;
}
setprop("instrumentation/heading-indicator/fromto-pointer",fromto_pointer);
settimer(cal_fromto_pointer,0.1);
}
cal_fromto_pointer();
#aig_course_pointer aig_heading_markr pour garder la position en mémoire lorsque nav-switch activé
course_pointer=func{
if (getprop("/instrumentation/heading-indicator/switch-tacan-acls")==1){
if (getprop("/instrumentation/heading-indicator/nav-switch")==1 ){
course_pointer_calc=getprop("/instrumentation/adf/indicated-bearing-deg")+getprop("/orientation/heading-magnetic-deg");
if(course_pointer_calc>360){
setprop("/instrumentation/heading-indicator/course-pointer",course_pointer_calc-360);
}else{
setprop("/instrumentation/heading-indicator/course-pointer",course_pointer_calc);
}
}
elsif (getprop("/instrumentation/heading-indicator/nav-switch")==2 ){
setprop("/instrumentation/heading-indicator/course-pointer",getprop("/instrumentation/nav[0]/heading-deg"));
}
elsif (getprop("/instrumentation/heading-indicator/nav-switch")==3 ){
if(aig_course_pointer==1){
aig_course_pointer=0;
setprop("/instrumentation/heading-indicator/setting-manual-hdg",store_course_pointer);
}
store_course_pointer=getprop("/instrumentation/heading-indicator/setting-manual-hdg");
setprop("/instrumentation/heading-indicator/course-pointer",store_course_pointer);
}
}
elsif (getprop("/instrumentation/heading-indicator/switch-tacan-acls")==0){
setprop("/instrumentation/heading-indicator/course-pointer",getprop("/instrumentation/tacan/indicated-bearing-true-deg")-getprop("/environment/magnetic-variation-deg"));
}
if (getprop("/instrumentation/heading-indicator/nav-switch")!=3 or getprop("/instrumentation/heading-indicator/switch-tacan-acls")==0){
if(aig_heading_marker==1){
aig_heading_marker=0;
setprop("/instrumentation/heading-indicator/setting-manual-hdg",store_heading_marker);
}
store_heading_marker=getprop("/instrumentation/heading-indicator/setting-manual-hdg");
setprop("/instrumentation/heading-indicator/heading-marker",store_heading_marker);
}
settimer(course_pointer,0,1);
}
course_pointer();
survey_nav_switch=func{
aig_course_pointer=1;
aig_heading_marker=1;
}
setlistener("/instrumentation/heading-indicator/nav-switch",survey_nav_switch,3);
#Pilote Automatique============F8E======================================================================
#========F8E==========setprop("/autopilot/switch-heading",0);
#========F8E==========setprop("/autopilot/locks/heading", "");
#========F8E==========setprop("/autopilot/switch-master",0);
#FIXE ME must be done Bug-Heading****************
#FIXE ME test si instrument OK (voltage OK)
survey_hdg_autopilot=func{
if(getprop("/autopilot/switch-heading")==1) {
setprop("/autopilot/switch-master",1);
if(getprop("/instrumentation/heading-indicator/switch-tacan-acls")==1){
if (getprop("/instrumentation/heading-indicator/nav-switch")==0){
setprop("/autopilot/settings/heading-bug-deg",getprop("/instrumentation/heading-indicator/heading-marker"));
}
if (getprop("/instrumentation/heading-indicator/nav-switch")!=0){
setprop("/autopilot/settings/heading-bug-deg",getprop("/instrumentation/heading-indicator/course-pointer"));
}
if (getprop("/autopilot/locks/heading")==""){
setprop("/autopilot/locks/heading", "dg-heading-hold");
}
}
if(getprop("/instrumentation/heading-indicator/switch-tacan-acls")==0){
setprop("/autopilot/settings/true-heading-deg",getprop("/instrumentation/heading-indicator/course-pointer"));
if (getprop("/autopilot/locks/heading")==""){
setprop("/autopilot/locks/heading", "true-heading-hold");
}
}
settimer(survey_hdg_autopilot,0);
}else{
setprop("/autopilot/locks/heading", "");
}
}
#==========F8E===============setlistener("/autopilot/switch-heading",survey_hdg_autopilot);
#FIXE ME test si instrument OK (voltage OK)
setprop("/autopilot/switch-altitude",0);
preset_alt=getprop("/autopilot/settings/target-altitude-ft");
setprop("/autopilot/locks/altitude", "");
survey_alt_autopilot=func{
if(getprop("/autopilot/switch-altitude")==1) {
setprop("/autopilot/switch-master",1);
if (getprop("/autopilot/locks/altitude")==""){
setprop("/autopilot/locks/altitude", "altitude-hold");
setprop("/autopilot/settings/target-altitude-ft",getprop("/position/altitude-ft"));
}
settimer(survey_alt_autopilot,0);
}else{
setprop("/autopilot/locks/altitude", "");
}
}
#===========F8E=============setlistener("/autopilot/switch-altitude",survey_alt_autopilot);
#Tacan********************************************************************************
setprop("/instrumentation/tacan/frequencies/valueXY",0);
basculeXY = func{
if(getprop("/instrumentation/tacan/frequencies/selected-channel[4]")=="X"){
setprop("/instrumentation/tacan/frequencies/selected-channel[4]","Y");
setprop("/instrumentation/tacan/frequencies/valueXY",1);
}else{
setprop("/instrumentation/tacan/frequencies/selected-channel[4]","X");
setprop("/instrumentation/tacan/frequencies/valueXY",0);
}
}
setprop("/instrumentation/tacan/frequencies/valueCh1",0);
setprop("/instrumentation/tacan/frequencies/valueCh1",getprop("/instrumentation/tacan/frequencies/selected-channel[1]"));
Init_Ch1=func{
valueCh1=getprop("/instrumentation/tacan/frequencies/valueCh1");
setprop("/instrumentation/tacan/frequencies/selected-channel[1]",channel[valueCh1]);
}
setlistener("/instrumentation/tacan/frequencies/valueCh1",Init_Ch1);
setprop("/instrumentation/tacan/frequencies/valueCh2",0);
setprop("/instrumentation/tacan/frequencies/valueCh2",getprop("/instrumentation/tacan/frequencies/selected-channel[2]"));
Init_Ch2=func{
valueCh2=getprop("/instrumentation/tacan/frequencies/valueCh2");
setprop("/instrumentation/tacan/frequencies/selected-channel[2]",channel[valueCh2]);
}
setlistener("/instrumentation/tacan/frequencies/valueCh2",Init_Ch2);
setprop("/instrumentation/tacan/frequencies/valueCh3",0);
setprop("/instrumentation/tacan/frequencies/valueCh3",getprop("/instrumentation/tacan/frequencies/selected-channel[3]"));
Init_Ch3=func{
valueCh3=getprop("/instrumentation/tacan/frequencies/valueCh3");
setprop("/instrumentation/tacan/frequencies/selected-channel[3]",channel[valueCh3]);
}
setlistener("/instrumentation/tacan/frequencies/valueCh3",Init_Ch3);
#Bug Heading===========P38============PROVISOIRE TEMPORARY===============
Init_BugH=func{
setprop("/autopilot/settings/heading-bug-deg",getprop("/instrumentation/heading-indicator/heading-marker"));
}
setlistener("/instrumentation/heading-indicator/heading-marker",Init_BugH);
--- NEW FILE ---
# By G ROBIN
#====CRASH_ANIMATION_WITH_JSBSim_FDM====
#===========================INITIALIZATION================================
type = getprop("sim/aircraft");
print ("type: " , type);
#=Init_SENSORS======each_one_being_defined_in_JSBAircraft.xml==========
setprop("gear/gear[3]/wow",0);
setprop("gear/gear[4]/wow",0);
setprop("gear/gear[5]/wow",0);
setprop("gear/gear[6]/wow",0);
setprop("gear/gear[7]/wow",0);
setprop("gear/gear[8]/wow",0);
setprop("gear/gear[9]/wow",0);
setprop("gear/gear[10]/wow",0);
setprop("gear/gear[11]/wow",0);
setprop("gear/gear[12]/wow",0);
setprop("sim/crashed",0);
#==========================
delay = 4;
print ("crash detection ON: ");
crashstart = 0;
# ==========================CRASH MANAGEMENT========================
crash = func {
setprop("controls/engines/engine[0]/magnetos",0);
print ("moteur coupé");
crashstart = getprop("/sim/time/elapsed-sec");
#every_animations_we_want
print ("start", crashstart);
crashdeb();
}
#==Delay_before_Stop====
crashdeb = func {
now = getprop("sim/time/elapsed-sec");
if (now - crashstart > delay ) {
print ("now", now);
crashend();
} else {
settimer (crashdeb,1);
print ("boucle");
}
}
#===fin_crash=========
crashend = func {
print ("crash actif");
setprop("sim/crashed",1);
setprop("sim/freeze/clock", 1);
setprop("sim/freeze/main", 1)
}
#==another_quick_end_without_delay====
crashgr = func {
setprop("controls/engines/engine[0]/magnetos",0);
print ("moteur coupé");
setprop("sim/freeze/clock", 1);
}
# ==========================CRASH_DETECTION================================
main_loop = func {
crashedgr = props.globals.getNode("gear/gear[12]/wow",1);
crashed3 = props.globals.getNode("gear/gear[3]/wow",1);
crashed4 = props.globals.getNode("gear/gear[4]/wow",1);
crashed5 = getprop("gear/gear[5]/wow");
crashed6 = getprop("gear/gear[6]/wow");
crashed7 = getprop("gear/gear[7]/wow");
crashed8 = getprop("gear/gear[8]/wow");
crashed9 = getprop("gear/gear[9]/wow");
crashed10 = getprop("gear/gear[10]/wow");
crashed11 = getprop("gear/gear[11]/wow");
if (crashed3.getValue()) {
print ("sensor3");
#crashgr();
}
elsif (crashed4.getValue()) {
print ("sensor4");
crashgr();
}
elsif (crashed5 == 1) {
print ("sensor5");
crash();
}
elsif (crashed6 == 1) {
print ("sensor6");
crash();
}
elsif (crashed7 == 1) {
print ("sensor7");
crash();
}
elsif (crashed8 == 1) {
print ("sensor8");
crash();
}
elsif (crashed9 == 1) {
print ("sensor9");
crash();
}
elsif (crashed10 == 1) {
print ("sensor10");
crash();
}
elsif (crashed11 == 1) {
print ("sensor11");
crash();
}
else {
settimer(main_loop,2);
}
}
main_loop();
#===========
|