Merge branch 'master' into ECAM3

This commit is contained in:
Josh Davidson 2019-03-24 00:06:54 -04:00
commit 2a73b57ac5
20 changed files with 1124 additions and 250 deletions

View file

@ -23,7 +23,7 @@
</hud>
<model>
<pushback>
<autopush>
<connected type="bool">0</connected>
<position-norm type="double">0</position-norm>
<enabled type="int"/>
@ -39,18 +39,18 @@
<F_i type="float">0.1</F_i>
<K_d type="float">0.0</K_d>
<F_d type="float">0.0</F_d>
<pitch-deg type="float">0.0</pitch-deg>
<min-turn-radius-m type="float">15</min-turn-radius-m>
<stopping-distance-m type="float">5.0</stopping-distance-m>
<driver>
<K_V type="float">5.5</K_V>
<F_V type="float">5.5</F_V>
<D_min-m type="float">5.0</D_min-m>
<K_psi type="float">0.03</K_psi>
<debug type="bool">true</debug>
</driver>
<route>
<show type="bool"/>
<view type="string">Model View</view>
</route>
</pushback>
<debug type="bool">false</debug>
</autopush>
<icing>
<iceable>
<name>Wing</name>
@ -429,9 +429,9 @@
<jsbsim>
<external_reactions>
<tractor>
<magnitude alias="/sim/model/pushback/force-lbf"/>
<x alias="/sim/model/pushback/force-x"/>
<y alias="/sim/model/pushback/force-y"/>
<magnitude alias="/sim/model/autopush/force-lbf"/>
<x alias="/sim/model/autopush/force-x"/>
<y alias="/sim/model/autopush/force-y"/>
</tractor>
</external_reactions>
</jsbsim>

View file

@ -94,6 +94,8 @@ setprop("/systems/acconfig/options/nd-rate", 1);
setprop("/systems/acconfig/options/uecam-rate", 1);
setprop("/systems/acconfig/options/lecam-rate", 1);
setprop("/systems/acconfig/options/iesi-rate", 1);
setprop("/systems/acconfig/options/autopush/show-route", 1);
setprop("/systems/acconfig/options/autopush/show-wingtip", 1);
var main_dlg = gui.Dialog.new("sim/gui/dialogs/acconfig/main/dialog", "Aircraft/IDG-A32X/AircraftConfig/main.xml");
var welcome_dlg = gui.Dialog.new("sim/gui/dialogs/acconfig/welcome/dialog", "Aircraft/IDG-A32X/AircraftConfig/welcome.xml");
var ps_load_dlg = gui.Dialog.new("sim/gui/dialogs/acconfig/psload/dialog", "Aircraft/IDG-A32X/AircraftConfig/psload.xml");
@ -215,12 +217,17 @@ var readSettings = func {
setprop("/options/system/keyboard-mode", getprop("/systems/acconfig/options/keyboard-mode"));
setprop("/options/system/laptop-mode", getprop("/systems/acconfig/options/laptop-mode"));
setprop("/controls/adirs/skip", getprop("/systems/acconfig/options/adirs-skip"));
setprop("/sim/model/autopush/route/show", getprop("/systems/acconfig/options/autopush/show-route"));
setprop("/sim/model/autopush/route/show-wingtip", getprop("/systems/acconfig/options/autopush/show-wingtip"));
}
var writeSettings = func {
setprop("/systems/acconfig/options/keyboard-mode", getprop("/options/system/keyboard-mode"));
setprop("/systems/acconfig/options/laptop-mode", getprop("/options/system/laptop-mode"));
setprop("/systems/acconfig/options/adirs-skip", getprop("/controls/adirs/skip"));
setprop("/systems/acconfig/options/autopush/show-route", getprop("/sim/model/autopush/route/show"));
setprop("/systems/acconfig/options/autopush/show-wingtip", getprop("/sim/model/autopush/route/show-wingtip"));
io.write_properties(getprop("/sim/fg-home") ~ "/Export/IDG-A32X-config.xml", "/systems/acconfig/options");
}

View file

@ -78,15 +78,15 @@ Distribute under the terms of GPLv2.
<animation>
<type>select</type>
<condition>
<!-- SETTING Whether connected: /sim/model/pushback/connected -->
<property>sim/model/pushback/connected</property>
<!-- SETTING Whether connected: /sim/model/autopush/connected -->
<property>sim/model/autopush/connected</property>
</condition>
</animation>
<animation>
<type>rotate</type>
<property>sim/model/pushback/yaw</property>
<!-- SETTING The value of /sim/model/pushback/yaw-mult. -->
<property>sim/model/autopush/yaw</property>
<!-- SETTING The value of /sim/model/autopush/yaw-mult. -->
<factor>60.0</factor>
<center>
<x-m>0</x-m>

View file

@ -21,9 +21,26 @@ Distribute under the terms of GPLv2.
<animation>
<type>scale</type>
<property>/sim/model/pushback/driver/D_min-m</property>
<property>/sim/model/autopush/stopping-distance-m</property>
<z-factor>0.0</z-factor>
<z-min>1.0</z-min>
</animation>
<animation>
<type>material</type>
<condition>
<property>/sim/model/autopush/route/invalid</property>
</condition>
<diffuse>
<red>1.0</red>
<green>0.0</green>
<blue>0.0</blue>
</diffuse>
<emission>
<red>1.0</red>
<green>0.0</green>
<blue>0.0</blue>
</emission>
</animation>
</PropertyList>

View file

@ -0,0 +1,133 @@
AC3Db
MATERIAL "autopush cursor" rgb 0.0000 0.0000 0.0000 amb 0.0000 0.0000 0.0000 emis 1.000 0.173 0.545 spec 0.0000 0.0000 0.0000 shi 50 trans 0.0000
OBJECT world
name "Blender_exporter_v2.26__cursor_reverse.ac"
kids 1
OBJECT poly
name "Circle"
data 11
Circle.mesh
crease 40.0
numvert 36
-0.86603 0.2 0.15
-0.64952 0.2 0.15
-0.64952 0.2 -0.375
-0.86603 0.2 -0.15
-0.64952 0.2 -0.15
-0.86603 0.2 -0.5
-0.56292 0.2 -0.675
-0.45466 0.2 -0.4875
-0 0.2 -0.75
-0 0.2 -1
-0.30311 0.2 -0.825
-0.19486 0.2 -0.6375
0.30311 0.2 -0.825
0.19486 0.2 -0.6375
0.64952 0.2 -0.375
0.86603 0.2 -0.5
0.56292 0.2 -0.675
0.45466 0.2 -0.4875
0.86603 0.2 -0.15
0.64952 0.2 -0.15
0.86603 0.2 0.5
0.86603 0.2 0.15
0.64952 0.2 0.15
0.64952 0.2 0.375
0.56292 0.2 0.675
0.45466 0.2 0.4875
0.30311 0.2 0.825
0.19486 0.2 0.6375
-0 0.2 0.75
-0 0.2 1
-0.30311 0.2 0.825
-0.19486 0.2 0.6375
-0.64952 0.2 0.375
-0.86603 0.2 0.5
-0.56292 0.2 0.675
-0.45466 0.2 0.4875
numsurf 12
SURF 0X10
mat 0
refs 4
2 0.078125 0.40625
5 0.0625 0.375
3 0.0625 0.5
4 0.078125 0.5
SURF 0X10
mat 0
refs 4
32 0.078125 0.40625
1 0.078125 0.5
0 0.0625 0.5
33 0.0625 0.375
SURF 0X10
mat 0
refs 4
8 0.078125 0.40625
9 0.0625 0.375
10 0.0625 0.5
11 0.078125 0.5
SURF 0X10
mat 0
refs 4
2 0.078125 0.40625
7 0.078125 0.5
6 0.0625 0.5
5 0.0625 0.375
SURF 0X10
mat 0
refs 4
14 0.078125 0.40625
15 0.0625 0.375
16 0.0625 0.5
17 0.078125 0.5
SURF 0X10
mat 0
refs 4
8 0.078125 0.40625
13 0.078125 0.5
12 0.0625 0.5
9 0.0625 0.375
SURF 0X10
mat 0
refs 4
23 0.078125 0.40625
20 0.0625 0.375
21 0.0625 0.5
22 0.078125 0.5
SURF 0X10
mat 0
refs 4
14 0.078125 0.40625
19 0.078125 0.5
18 0.0625 0.5
15 0.0625 0.375
SURF 0X10
mat 0
refs 4
28 0.078125 0.40625
29 0.0625 0.375
26 0.0625 0.5
27 0.078125 0.5
SURF 0X10
mat 0
refs 4
23 0.078125 0.40625
25 0.078125 0.5
24 0.0625 0.5
20 0.0625 0.375
SURF 0X10
mat 0
refs 4
32 0.078125 0.40625
33 0.0625 0.375
34 0.0625 0.5
35 0.078125 0.5
SURF 0X10
mat 0
refs 4
28 0.078125 0.40625
31 0.078125 0.5
30 0.0625 0.5
29 0.0625 0.375
kids 0

View file

@ -0,0 +1,46 @@
<?xml version="1.0" encoding="UTF-8"?>
<!--
AUTOPUSH
Cursor model.
Copyright (c) 2018 Autopush authors:
Michael Danilov <mike.d.ft402 -eh- gmail.com>
Joshua Davidson http://github.com/it0uchpods
Merspieler http://gitlab.com/merspieler
Distribute under the terms of GPLv2.
-->
<PropertyList>
<path>cursor_reverse.ac</path>
<animation>
<enable-hot>false</enable-hot>
</animation>
<animation>
<type>scale</type>
<property>/sim/model/autopush/stopping-distance-m</property>
<z-factor>0.0</z-factor>
<z-min>1.0</z-min>
</animation>
<animation>
<type>material</type>
<condition>
<property>/sim/model/autopush/route/invalid</property>
</condition>
<diffuse>
<red>1.0</red>
<green>0.0</green>
<blue>0.0</blue>
</diffuse>
<emission>
<red>1.0</red>
<green>0.0</green>
<blue>0.0</blue>
</emission>
</animation>
</PropertyList>

View file

@ -21,9 +21,26 @@ Distribute under the terms of GPLv2.
<animation>
<type>scale</type>
<property>/sim/model/pushback/driver/D_min-m</property>
<property>/sim/model/autopush/stopping-distance-m</property>
<z-factor>0.0</z-factor>
<z-min>1.0</z-min>
</animation>
<animation>
<type>material</type>
<condition>
<property>/sim/model/autopush/route/invalid</property>
</condition>
<diffuse>
<red>1.0</red>
<green>0.0</green>
<blue>0.0</blue>
</diffuse>
<emission>
<red>1.0</red>
<green>0.0</green>
<blue>0.0</blue>
</emission>
</animation>
</PropertyList>

View file

@ -2,9 +2,9 @@ AC3Db
MATERIAL "autopush cursor" rgb 0.0000 0.0000 0.0000 amb 0.0000 0.0000 0.0000 emis 1.000 0.173 0.545 spec 0.0000 0.0000 0.0000 shi 50 trans 0.0000
OBJECT world
name "Blender_exporter_v2.26__waypoint.ac"
kids 1
kids 3
OBJECT poly
name "Circle"
name "Waypoint"
data 11
Circle.mesh
crease 40.0
@ -16,7 +16,7 @@ numvert 33
0.16629 0.2 -0.11111
0.18478 0.2 -0.07654
0.19616 0.2 -0.03902
0.2 0.2 -0
0.2 0.2 0
0.19616 0.2 0.03902
0.18478 0.2 0.07654
0.16629 0.2 0.11111
@ -236,3 +236,41 @@ refs 3
5 0.182742 0.595671
4 0.176967 0.638893
kids 0
OBJECT poly
name "WingtipL"
data 15
Circle.mesh.001
crease 40.0
numvert 4
-0.1 0.2 -0.1
-0.1 0.2 0.1
0.1 0.2 -0.1
0.1 0.2 0.1
numsurf 1
SURF 0X0
mat 0
refs 4
0 0 0
1 0 0
3 0 0
2 0 0
kids 0
OBJECT poly
name "WingtipR"
data 15
Circle.mesh.007
crease 40.0
numvert 4
-0.1 0.2 -0.1
-0.1 0.2 0.1
0.1 0.2 -0.1
0.1 0.2 0.1
numsurf 1
SURF 0X0
mat 0
refs 4
0 0 0
1 0 0
3 0 0
2 0 0
kids 0

View file

@ -20,10 +20,68 @@ Distribute under the terms of GPLv2.
</animation>
<animation>
<type>scale</type>
<property>/sim/model/pushback/driver/D_min-m</property>
<type>select</type>
<object-name>WingtipL</object-name>
<object-name>WingtipR</object-name>
<condition>
<property>/sim/model/autopush/route/show-wingtip</property>
</condition>
</animation>
<animation>
<type>translate</type>
<object-name>WingtipL</object-name>
<property>/sim/model/autopush/route/wingspan-m</property>
<factor>0.5</factor>
<axis>
<x>0</x>
<y>1</y>
<z>0</z>
</axis>
<z-factor>0.0</z-factor>
<z-min>1.0</z-min>
</animation>
<animation>
<type>translate</type>
<object-name>WingtipR</object-name>
<property>/sim/model/autopush/route/wingspan-m</property>
<factor>-0.5</factor>
<axis>
<x>0</x>
<y>1</y>
<z>0</z>
</axis>
<z-factor>0.0</z-factor>
<z-min>1.0</z-min>
</animation>
<animation>
<type>scale</type>
<!-- Object names must be here, because we need to scale each separately, not the the whole thing at once. -->
<object-name>Waypoint</object-name>
<object-name>WingtipL</object-name>
<object-name>WingtipR</object-name>
<property>/sim/model/autopush/stopping-distance-m</property>
<z-factor>0.0</z-factor>
<z-min>1.0</z-min>
</animation>
<animation>
<type>material</type>
<condition>
<property>/sim/model/autopush/route/invalid</property>
</condition>
<diffuse>
<red>1.0</red>
<green>0.0</green>
<blue>0.0</blue>
</diffuse>
<emission>
<red>1.0</red>
<green>0.0</green>
<blue>0.0</blue>
</emission>
</animation>
</PropertyList>

View file

@ -1,14 +1,10 @@
<?xml version="1.0"?>
<!--
##############################################
# Copyright (c) Joshua Davidson (it0uchpods) #
##############################################
-->
<!-- Copyright (c) 2019 Joshua Davidson (it0uchpods) -->
<PropertyList>
<path>res/Audio1.ac</path>
<path>res/Audio.ac</path>
<!-- INT/RAD switch -->
<animation>
@ -118,10 +114,37 @@
<property>systems/audio/acp[0]/call_chan</property>
<value>vhf1</value>
<condition>
<greater-than-equals>
<property>systems/electrical/bus/dc-ess</property>
<value>25</value>
</greater-than-equals>
<and>
<not-equals>
<property>systems/audio/acp[0]/call_chan</property>
<value>vhf1</value>
</not-equals>
<greater-than-equals>
<property>systems/electrical/bus/dc-ess</property>
<value>25</value>
</greater-than-equals>
</and>
</condition>
</binding>
</action>
<action>
<button>0</button>
<repeatable>false</repeatable>
<binding>
<command>property-assign</command>
<property>systems/audio/acp[0]/call_chan</property>
<value></value>
<condition>
<and>
<equals>
<property>systems/audio/acp[0]/call_chan</property>
<value>vhf1</value>
</equals>
<greater-than-equals>
<property>systems/electrical/bus/dc-ess</property>
<value>25</value>
</greater-than-equals>
</and>
</condition>
</binding>
</action>
@ -139,10 +162,37 @@
<property>systems/audio/acp[0]/call_chan</property>
<value>vhf2</value>
<condition>
<greater-than-equals>
<property>systems/electrical/bus/dc-ess</property>
<value>25</value>
</greater-than-equals>
<and>
<not-equals>
<property>systems/audio/acp[0]/call_chan</property>
<value>vhf2</value>
</not-equals>
<greater-than-equals>
<property>systems/electrical/bus/dc-ess</property>
<value>25</value>
</greater-than-equals>
</and>
</condition>
</binding>
</action>
<action>
<button>0</button>
<repeatable>false</repeatable>
<binding>
<command>property-assign</command>
<property>systems/audio/acp[0]/call_chan</property>
<value></value>
<condition>
<and>
<equals>
<property>systems/audio/acp[0]/call_chan</property>
<value>vhf2</value>
</equals>
<greater-than-equals>
<property>systems/electrical/bus/dc-ess</property>
<value>25</value>
</greater-than-equals>
</and>
</condition>
</binding>
</action>
@ -160,10 +210,37 @@
<property>systems/audio/acp[0]/call_chan</property>
<value>vhf3</value>
<condition>
<greater-than-equals>
<property>systems/electrical/bus/dc-ess</property>
<value>25</value>
</greater-than-equals>
<and>
<not-equals>
<property>systems/audio/acp[0]/call_chan</property>
<value>vhf3</value>
</not-equals>
<greater-than-equals>
<property>systems/electrical/bus/dc-ess</property>
<value>25</value>
</greater-than-equals>
</and>
</condition>
</binding>
</action>
<action>
<button>0</button>
<repeatable>false</repeatable>
<binding>
<command>property-assign</command>
<property>systems/audio/acp[0]/call_chan</property>
<value></value>
<condition>
<and>
<equals>
<property>systems/audio/acp[0]/call_chan</property>
<value>vhf3</value>
</equals>
<greater-than-equals>
<property>systems/electrical/bus/dc-ess</property>
<value>25</value>
</greater-than-equals>
</and>
</condition>
</binding>
</action>
@ -181,10 +258,37 @@
<property>systems/audio/acp[0]/call_chan</property>
<value>hf1</value>
<condition>
<greater-than-equals>
<property>systems/electrical/bus/dc-ess</property>
<value>25</value>
</greater-than-equals>
<and>
<not-equals>
<property>systems/audio/acp[0]/call_chan</property>
<value>hf1</value>
</not-equals>
<greater-than-equals>
<property>systems/electrical/bus/dc-ess</property>
<value>25</value>
</greater-than-equals>
</and>
</condition>
</binding>
</action>
<action>
<button>0</button>
<repeatable>false</repeatable>
<binding>
<command>property-assign</command>
<property>systems/audio/acp[0]/call_chan</property>
<value></value>
<condition>
<and>
<equals>
<property>systems/audio/acp[0]/call_chan</property>
<value>hf1</value>
</equals>
<greater-than-equals>
<property>systems/electrical/bus/dc-ess</property>
<value>25</value>
</greater-than-equals>
</and>
</condition>
</binding>
</action>
@ -202,10 +306,37 @@
<property>systems/audio/acp[0]/call_chan</property>
<value>hf2</value>
<condition>
<greater-than-equals>
<property>systems/electrical/bus/dc-ess</property>
<value>25</value>
</greater-than-equals>
<and>
<not-equals>
<property>systems/audio/acp[0]/call_chan</property>
<value>hf2</value>
</not-equals>
<greater-than-equals>
<property>systems/electrical/bus/dc-ess</property>
<value>25</value>
</greater-than-equals>
</and>
</condition>
</binding>
</action>
<action>
<button>0</button>
<repeatable>false</repeatable>
<binding>
<command>property-assign</command>
<property>systems/audio/acp[0]/call_chan</property>
<value></value>
<condition>
<and>
<equals>
<property>systems/audio/acp[0]/call_chan</property>
<value>hf2</value>
</equals>
<greater-than-equals>
<property>systems/electrical/bus/dc-ess</property>
<value>25</value>
</greater-than-equals>
</and>
</condition>
</binding>
</action>
@ -223,10 +354,37 @@
<property>systems/audio/acp[0]/call_chan</property>
<value>mech</value>
<condition>
<greater-than-equals>
<property>systems/electrical/bus/dc-ess</property>
<value>25</value>
</greater-than-equals>
<and>
<not-equals>
<property>systems/audio/acp[0]/call_chan</property>
<value>mech</value>
</not-equals>
<greater-than-equals>
<property>systems/electrical/bus/dc-ess</property>
<value>25</value>
</greater-than-equals>
</and>
</condition>
</binding>
</action>
<action>
<button>0</button>
<repeatable>false</repeatable>
<binding>
<command>property-assign</command>
<property>systems/audio/acp[0]/call_chan</property>
<value></value>
<condition>
<and>
<equals>
<property>systems/audio/acp[0]/call_chan</property>
<value>mech</value>
</equals>
<greater-than-equals>
<property>systems/electrical/bus/dc-ess</property>
<value>25</value>
</greater-than-equals>
</and>
</condition>
</binding>
</action>
@ -244,10 +402,37 @@
<property>systems/audio/acp[0]/call_chan</property>
<value>att</value>
<condition>
<greater-than-equals>
<property>systems/electrical/bus/dc-ess</property>
<value>25</value>
</greater-than-equals>
<and>
<not-equals>
<property>systems/audio/acp[0]/call_chan</property>
<value>att</value>
</not-equals>
<greater-than-equals>
<property>systems/electrical/bus/dc-ess</property>
<value>25</value>
</greater-than-equals>
</and>
</condition>
</binding>
</action>
<action>
<button>0</button>
<repeatable>false</repeatable>
<binding>
<command>property-assign</command>
<property>systems/audio/acp[0]/call_chan</property>
<value></value>
<condition>
<and>
<equals>
<property>systems/audio/acp[0]/call_chan</property>
<value>att</value>
</equals>
<greater-than-equals>
<property>systems/electrical/bus/dc-ess</property>
<value>25</value>
</greater-than-equals>
</and>
</condition>
</binding>
</action>
@ -1471,4 +1656,4 @@
<object-name>audio_adf2.axis</object-name>
</axis>
</animation>
</PropertyList>
</PropertyList>

View file

@ -1,14 +1,10 @@
<?xml version="1.0"?>
<!--
##############################################
# Copyright (c) Joshua Davidson (it0uchpods) #
##############################################
-->
<!-- Copyright (c) 2019 Joshua Davidson (it0uchpods) -->
<PropertyList>
<path>res/Audio1.ac</path>
<path>res/Audio.ac</path>
<!-- INT/RAD switch -->
<animation>
@ -118,10 +114,37 @@
<property>systems/audio/acp[1]/call_chan</property>
<value>vhf1</value>
<condition>
<greater-than-equals>
<property>systems/electrical/bus/dc-ess</property>
<value>25</value>
</greater-than-equals>
<and>
<not-equals>
<property>systems/audio/acp[1]/call_chan</property>
<value>vhf1</value>
</not-equals>
<greater-than-equals>
<property>systems/electrical/bus/dc-ess</property>
<value>25</value>
</greater-than-equals>
</and>
</condition>
</binding>
</action>
<action>
<button>0</button>
<repeatable>false</repeatable>
<binding>
<command>property-assign</command>
<property>systems/audio/acp[1]/call_chan</property>
<value></value>
<condition>
<and>
<equals>
<property>systems/audio/acp[1]/call_chan</property>
<value>vhf1</value>
</equals>
<greater-than-equals>
<property>systems/electrical/bus/dc-ess</property>
<value>25</value>
</greater-than-equals>
</and>
</condition>
</binding>
</action>
@ -139,10 +162,37 @@
<property>systems/audio/acp[1]/call_chan</property>
<value>vhf2</value>
<condition>
<greater-than-equals>
<property>systems/electrical/bus/dc-ess</property>
<value>25</value>
</greater-than-equals>
<and>
<not-equals>
<property>systems/audio/acp[1]/call_chan</property>
<value>vhf2</value>
</not-equals>
<greater-than-equals>
<property>systems/electrical/bus/dc-ess</property>
<value>25</value>
</greater-than-equals>
</and>
</condition>
</binding>
</action>
<action>
<button>0</button>
<repeatable>false</repeatable>
<binding>
<command>property-assign</command>
<property>systems/audio/acp[1]/call_chan</property>
<value></value>
<condition>
<and>
<equals>
<property>systems/audio/acp[1]/call_chan</property>
<value>vhf2</value>
</equals>
<greater-than-equals>
<property>systems/electrical/bus/dc-ess</property>
<value>25</value>
</greater-than-equals>
</and>
</condition>
</binding>
</action>
@ -160,10 +210,37 @@
<property>systems/audio/acp[1]/call_chan</property>
<value>vhf3</value>
<condition>
<greater-than-equals>
<property>systems/electrical/bus/dc-ess</property>
<value>25</value>
</greater-than-equals>
<and>
<not-equals>
<property>systems/audio/acp[1]/call_chan</property>
<value>vhf3</value>
</not-equals>
<greater-than-equals>
<property>systems/electrical/bus/dc-ess</property>
<value>25</value>
</greater-than-equals>
</and>
</condition>
</binding>
</action>
<action>
<button>0</button>
<repeatable>false</repeatable>
<binding>
<command>property-assign</command>
<property>systems/audio/acp[1]/call_chan</property>
<value></value>
<condition>
<and>
<equals>
<property>systems/audio/acp[1]/call_chan</property>
<value>vhf3</value>
</equals>
<greater-than-equals>
<property>systems/electrical/bus/dc-ess</property>
<value>25</value>
</greater-than-equals>
</and>
</condition>
</binding>
</action>
@ -181,10 +258,37 @@
<property>systems/audio/acp[1]/call_chan</property>
<value>hf1</value>
<condition>
<greater-than-equals>
<property>systems/electrical/bus/dc-ess</property>
<value>25</value>
</greater-than-equals>
<and>
<not-equals>
<property>systems/audio/acp[1]/call_chan</property>
<value>hf1</value>
</not-equals>
<greater-than-equals>
<property>systems/electrical/bus/dc-ess</property>
<value>25</value>
</greater-than-equals>
</and>
</condition>
</binding>
</action>
<action>
<button>0</button>
<repeatable>false</repeatable>
<binding>
<command>property-assign</command>
<property>systems/audio/acp[1]/call_chan</property>
<value></value>
<condition>
<and>
<equals>
<property>systems/audio/acp[1]/call_chan</property>
<value>hf1</value>
</equals>
<greater-than-equals>
<property>systems/electrical/bus/dc-ess</property>
<value>25</value>
</greater-than-equals>
</and>
</condition>
</binding>
</action>
@ -202,10 +306,37 @@
<property>systems/audio/acp[1]/call_chan</property>
<value>hf2</value>
<condition>
<greater-than-equals>
<property>systems/electrical/bus/dc-ess</property>
<value>25</value>
</greater-than-equals>
<and>
<not-equals>
<property>systems/audio/acp[1]/call_chan</property>
<value>hf2</value>
</not-equals>
<greater-than-equals>
<property>systems/electrical/bus/dc-ess</property>
<value>25</value>
</greater-than-equals>
</and>
</condition>
</binding>
</action>
<action>
<button>0</button>
<repeatable>false</repeatable>
<binding>
<command>property-assign</command>
<property>systems/audio/acp[1]/call_chan</property>
<value></value>
<condition>
<and>
<equals>
<property>systems/audio/acp[1]/call_chan</property>
<value>hf2</value>
</equals>
<greater-than-equals>
<property>systems/electrical/bus/dc-ess</property>
<value>25</value>
</greater-than-equals>
</and>
</condition>
</binding>
</action>
@ -223,10 +354,37 @@
<property>systems/audio/acp[1]/call_chan</property>
<value>mech</value>
<condition>
<greater-than-equals>
<property>systems/electrical/bus/dc-ess</property>
<value>25</value>
</greater-than-equals>
<and>
<not-equals>
<property>systems/audio/acp[1]/call_chan</property>
<value>mech</value>
</not-equals>
<greater-than-equals>
<property>systems/electrical/bus/dc-ess</property>
<value>25</value>
</greater-than-equals>
</and>
</condition>
</binding>
</action>
<action>
<button>0</button>
<repeatable>false</repeatable>
<binding>
<command>property-assign</command>
<property>systems/audio/acp[1]/call_chan</property>
<value></value>
<condition>
<and>
<equals>
<property>systems/audio/acp[1]/call_chan</property>
<value>mech</value>
</equals>
<greater-than-equals>
<property>systems/electrical/bus/dc-ess</property>
<value>25</value>
</greater-than-equals>
</and>
</condition>
</binding>
</action>
@ -244,10 +402,37 @@
<property>systems/audio/acp[1]/call_chan</property>
<value>att</value>
<condition>
<greater-than-equals>
<property>systems/electrical/bus/dc-ess</property>
<value>25</value>
</greater-than-equals>
<and>
<not-equals>
<property>systems/audio/acp[1]/call_chan</property>
<value>att</value>
</not-equals>
<greater-than-equals>
<property>systems/electrical/bus/dc-ess</property>
<value>25</value>
</greater-than-equals>
</and>
</condition>
</binding>
</action>
<action>
<button>0</button>
<repeatable>false</repeatable>
<binding>
<command>property-assign</command>
<property>systems/audio/acp[1]/call_chan</property>
<value></value>
<condition>
<and>
<equals>
<property>systems/audio/acp[1]/call_chan</property>
<value>att</value>
</equals>
<greater-than-equals>
<property>systems/electrical/bus/dc-ess</property>
<value>25</value>
</greater-than-equals>
</and>
</condition>
</binding>
</action>
@ -957,7 +1142,7 @@
<factor-prop>sim/model/lights/dome-light</factor-prop>
</emission>
</animation>
<effect>
<inherits-from>Aircraft/IDG-A32X/Models/Effects/cockpit-irradiance</inherits-from>
<object-name>audio_body</object-name>
@ -1471,5 +1656,4 @@
<object-name>audio_adf2.axis</object-name>
</axis>
</animation>
</PropertyList>
</PropertyList>

View file

@ -10,7 +10,7 @@
<!-- switch to night/day textures -->
<animation>
<type>textranslate</type>
<property>/sim/time/sun-angle-rad</property>
<property>sim/time/sun-angle-rad</property>
<step>1.60</step>
<factor>0.318471338</factor>
<center>
@ -29,7 +29,7 @@
<type>material</type>
<condition>
<greater-than>
<property>/sim/time/sun-angle-rad</property>
<property>sim/time/sun-angle-rad</property>
<value>1.60</value>
</greater-than>
</condition>
@ -44,7 +44,7 @@
<type>material</type>
<condition>
<less-than-equals>
<property>/sim/time/sun-angle-rad</property>
<property>sim/time/sun-angle-rad</property>
<value>1.60</value>
</less-than-equals>
</condition>
@ -58,7 +58,7 @@
<animation>
<type>select</type>
<condition>
<property>sim/model/pushback/enabled</property>
<property>sim/model/autopush/enabled</property>
<property>gear/gear[0]/wow</property>
</condition>
</animation>

View file

@ -380,7 +380,7 @@ var messages_right_memo = func {
rat.colour = "g";
}
if (getprop("/sim/model/pushback/enabled") == 1) { # this message is only on when towing - not when disc with switch
if (getprop("/sim/model/autopush/enabled") == 1) { # this message is only on when towing - not when disc with switch
nw_strg_disc.active = 1;
} else {
nw_strg_disc.active = 0;

View file

@ -27,30 +27,30 @@ var _unitconv = M2FT / 3.6;
var _debug = nil;
var _loop = func() {
if (!getprop("/sim/model/pushback/available")) {
if (!getprop("/sim/model/autopush/available")) {
_stop();
return;
}
var force = 0.0;
var x = 0.0;
var y = 0.0;
var z = 0.0;
# Rollspeed is only adequate if the wheel is touching the ground.
if (getprop("/gear/gear[0]/wow")) {
var V = getprop("/gear/gear[0]/rollspeed-ms") * 3.6;
var deltaV = getprop("/sim/model/pushback/target-speed-km_h") - V;
var dV = V - _V;
var deltaV = getprop("/sim/model/autopush/target-speed-km_h") - V;
var minus_dV = _V - V;
var time = getprop("/sim/time/elapsed-sec");
var prop = math.min(math.max(_K_p * deltaV, -_F_p), _F_p);
var speedup = getprop("/sim/speed-up");
var dt = time - _time;
var deriv = 0.0;
dt = time - _time;
# XXX Sanitising dt. Smaller chance of freakout on lag spike.
if(dt > 0.0) {
if(dt < 0.05) {
_int = math.min(math.max(_int + _K_i * deltaV * dt, -_F_i), _F_i);
}
if(dt > 0.002) {
deriv = math.min(math.max(_K_d * dV / dt, -_F_d), _F_d);
deriv = math.min(math.max(_K_d * minus_dV / dt, -_F_d), _F_d);
}
}
var accel = prop + _int + deriv;
@ -64,18 +64,24 @@ var _loop = func() {
} else {
force = accel * getprop("/fdm/yasim/gross-weight-lbs") * _unitconv;
}
var yaw = getprop("/sim/model/pushback/yaw") * _K_yaw;
x = math.cos(yaw);
y = math.sin(yaw);
setprop("/sim/model/pushback/force-x", x);
setprop("/sim/model/pushback/force-y", y);
var pitch = getprop("/sim/model/autopush/pitch-deg") * D2R;
z = math.sin(pitch);
var pz = math.cos(pitch);
var yaw = getprop("/sim/model/autopush/yaw") * _K_yaw;
x = math.cos(yaw) * pz;
y = math.sin(yaw) * pz;
setprop("/sim/model/autopush/force-x", x);
setprop("/sim/model/autopush/force-y", y);
# JSBSim force's z is down.
setprop("/sim/model/autopush/force-z", -z);
}
setprop("/sim/model/pushback/force-lbf", force);
setprop("/sim/model/autopush/force-lbf", force);
if (_yasim) {
# The force is divided by YASim thrust="100000.0" setting.
setprop("/sim/model/pushback/force-x-yasim", x * force * 0.00001);
# YASim's y is to the left.
setprop("/sim/model/pushback/force-y-yasim", -y * force * 0.00001);
setprop("/sim/model/autopush/force-x-yasim", x * force * 0.00001);
# YASim force's y is to the left.
setprop("/sim/model/autopush/force-y-yasim", -y * force * 0.00001);
setprop("/sim/model/autopush/force-z-yasim", z * force * 0.00001);
}
}
@ -84,26 +90,26 @@ var _timer = maketimer(0.0167, func{_loop()});
var _start = func() {
# Else overwritten by dialog.
settimer(func() {
setprop("/sim/model/pushback/target-speed-km_h", 0.0)
setprop("/sim/model/autopush/target-speed-km_h", 0.0)
}, 0.1);
_K_p = getprop("/sim/model/pushback/K_p");
_F_p = getprop("/sim/model/pushback/F_p");
_K_i = getprop("/sim/model/pushback/K_i");
_F_i = getprop("/sim/model/pushback/F_i");
_K_d = getprop("/sim/model/pushback/K_d");
_F_d = getprop("/sim/model/pushback/F_d");
_F = getprop("/sim/model/pushback/F");
_T_f = getprop("/sim/model/pushback/T_f");
_K_yaw = getprop("/sim/model/pushback/yaw-mult") * D2R;
_K_p = getprop("/sim/model/autopush/K_p");
_F_p = getprop("/sim/model/autopush/F_p");
_K_i = getprop("/sim/model/autopush/K_i");
_F_i = getprop("/sim/model/autopush/F_i");
_K_d = getprop("/sim/model/autopush/K_d");
_F_d = getprop("/sim/model/autopush/F_d");
_F = getprop("/sim/model/autopush/F");
_T_f = getprop("/sim/model/autopush/T_f");
_K_yaw = getprop("/sim/model/autopush/yaw-mult") * D2R;
_yasim = (getprop("/sim/flight-model") == "yasim");
_debug = getprop("/sim/model/pushback/debug") or 0;
_debug = getprop("/sim/model/autopush/debug") or 0;
_int = 0.0;
_V = 0.0;
_time = getprop("/sim/time/elapsed-sec");
setprop("/sim/model/pushback/connected", 1);
setprop("/sim/model/autopush/connected", 1);
if (!_timer.isRunning) {
if (getprop("/sim/model/pushback/chocks")) {
setprop("/sim/model/pushback/chocks", 0);
if (getprop("/sim/model/autopush/chocks")) {
setprop("/sim/model/autopush/chocks", 0);
screen.log.write("(pushback): Pushback connected, chocks removed. Please release brakes.");
} else {
screen.log.write("(pushback): Pushback connected, please release brakes.");
@ -117,18 +123,18 @@ var _stop = func() {
screen.log.write("(pushback): Pushback and bypass pin removed.");
}
_timer.stop();
setprop("/sim/model/pushback/force-lbf", 0.0);
setprop("/sim/model/autopush/force-lbf", 0.0);
if (_yasim) {
setprop("/sim/model/pushback/force-x-yasim", 0.0);
setprop("/sim/model/pushback/force-y-yasim", 0.0);
setprop("/sim/model/autopush/force-x-yasim", 0.0);
setprop("/sim/model/autopush/force-y-yasim", 0.0);
}
setprop("/sim/model/pushback/connected", 0);
setprop("/sim/model/pushback/enabled", 0);
setprop("/sim/model/autopush/connected", 0);
setprop("/sim/model/autopush/enabled", 0);
}
setlistener("/sim/model/pushback/enabled", func(p) {
setlistener("/sim/model/autopush/enabled", func(p) {
var enabled = p.getValue();
if ((enabled > _enabled) and getprop("/sim/model/pushback/available")) {
if ((enabled > _enabled) and getprop("/sim/model/autopush/available")) {
_start();
} else if (enabled < _enabled) {
_stop();

View file

@ -12,90 +12,131 @@
var _K_V = nil;
var _F_V = nil;
var _D_min = nil;
var _R_turn_min = nil;
var _D_stop = nil;
var _K_psi = nil;
var _debug = nil;
var _route = nil;
var _route_reverse = nil;
var _push = nil;
var _sign = nil;
var _psi_park = nil;
var _to_wp = nil;
var _to_wp = 1;
var _is_last_wp = 0;
var _is_reverse_wp = 0;
var _advance_wp = func(flip_sign = 0) {
_to_wp += 1;
_is_last_wp = (_to_wp == (size(_route) - 1));
_is_reverse_wp = (_route_reverse[_to_wp]);
if (flip_sign) {
_sign *= -1;
_push = !_push;
}
if (_debug == 1) {
print("autopush_driver to_wp " ~ _to_wp);
}
}
var _loop = func() {
if (!getprop("/sim/model/pushback/connected")) {
if (!getprop("/sim/model/autopush/connected")) {
stop();
return;
}
var psi = getprop("/orientation/heading-deg") + _push * 180.0;
var (A, D) = courseAndDistance(_route[_to_wp]);
D *= NM2M;
# FIXME Use _K_V and total remaining distance.
var (psi_leg, D_leg) = courseAndDistance(_route[_to_wp - 1], _route[_to_wp]);
var deltapsi = geo.normdeg180(A - psi_leg);
var deltaA = geo.normdeg180(A - psi);
# TODO Either use _K_V and total remaining distance or turn radius to calculate speed.
# TODO Make slider input override speed.
var V = _F_V;
if ((D < _D_min) or (abs(geo.normdeg180(A - psi) > 45.0))) {
_to_wp += 1;
if (_to_wp == size(_route)) {
_done();
autopush_route.clear();
return;
if (_is_reverse_wp or _is_last_wp) {
if ((D < _D_stop) or (abs(deltapsi) > 90.0)) {
if (_is_last_wp) {
_done();
return;
}
if (_is_reverse_wp) {
_advance_wp(1);
}
}
if (_debug) {
print("pushback_driver wp " ~ _to_wp);
} else {
if ((D < _R_turn_min) or (abs(deltapsi) > 90.0)) {
_advance_wp();
}
}
if (_debug > 1) {
print("pushback_driver psi_target " ~ geo.normdeg(A) ~ ", deltapsi " ~ _sign * geo.normdeg180(A - psi));
print("autopush_driver to_wp " ~ _to_wp ~ ", psi_target " ~ geo.normdeg(A) ~ ", deltapsi " ~ deltapsi ~ ", deltapsi_steer " ~ _sign * deltaA);
}
setprop("/sim/model/pushback/target-speed-km_h", _sign * V);
steering = math.min(math.max(_sign * _K_psi * geo.normdeg180(A - psi), -1.0), 1.0);
setprop("/sim/model/pushback/steer-cmd-norm", steering);
setprop("/sim/model/autopush/target-speed-km_h", _sign * V);
steering = math.min(math.max(_sign * _K_psi * deltaA, -1.0), 1.0);
setprop("/sim/model/autopush/steer-cmd-norm", steering);
}
var _timer = maketimer(0.051, func{_loop()});
var _done = func() {
stop();
autopush_route.clear();
screen.log.write("(pushback): Pushback complete, please set parking brake.");
}
var start = func() {
if (_timer.isRunning) {
stop();
gui.popupTip("Already moving");
return;
}
if (!getprop("/sim/model/pushback/connected")) {
gui.popupTip("Pushback must be connected");
if (!getprop("/sim/model/autopush/connected")) {
gui.popupTip("Pushback not connected");
return;
}
_route = autopush_route.route();
_route_reverse = autopush_route.route_reverse();
if ((_route == nil) or size(_route) < 2) {
autopush_route.enter(1);
gui.popupTip("Pushback route empty or invalid");
return;
}else{
autopush_route.done();
}
_K_V = getprop("/sim/model/pushback/driver/K_V");
_F_V = getprop("/sim/model/pushback/driver/F_V");
_D_min = getprop("/sim/model/pushback/driver/D_min-m");
_K_psi = getprop("/sim/model/pushback/driver/K_psi");
_debug = getprop("/sim/model/pushback/debug") or 0;
var (psi_park, D_park) = courseAndDistance(_route[0], _route[1]);
var (psi_twy, D_twy) = courseAndDistance(_route[size(_route) - 2], _route[size(_route) - 1]);
_psi_park = psi_park;
_push = (abs(geo.normdeg180(getprop("/orientation/heading-deg") - psi_park)) > 90.0);
_sign = 1.0 - 2.0 * _push;
_to_wp = 0;
_K_V = getprop("/sim/model/autopush/driver/K_V");
_F_V = getprop("/sim/model/autopush/driver/F_V");
_R_turn_min = getprop("/sim/model/autopush/min-turn-radius-m");
_D_stop = getprop("/sim/model/autopush/stopping-distance-m");
_K_psi = getprop("/sim/model/autopush/driver/K_psi");
_debug = getprop("/sim/model/autopush/debug") or 0;
if (_to_wp == 1) {
var (psi_park, D_park) = courseAndDistance(_route[0], _route[1]);
_push = (abs(geo.normdeg180(getprop("/orientation/heading-deg") - psi_park)) > 90.0);
_sign = 1.0 - 2.0 * _push;
}
_timer.start();
if (_sign < 0.0) {
var endsign = _sign;
for (ii = _to_wp; ii < size(_route_reverse); ii += 1) {
if (_route_reverse[ii]) {
endsign = -endsign;
}
}
var (psi_twy, D_twy) = courseAndDistance(_route[size(_route) - 2], _route[size(_route) - 1]);
if (endsign < 0.0) {
screen.log.write("(pushback): Push back facing " ~ int(geo.normdeg(psi_twy + 180.0 - magvar())) ~ ".");
} else {
screen.log.write("(pushback): Tow facing " ~ int(geo.normdeg(psi_twy - magvar())) ~ ".");
}
}
var stop = func() {
var pause = func() {
_timer.stop();
setprop("/sim/model/pushback/target-speed-km_h", 0.0);
autopush_route.clear();
setprop("/sim/model/autopush/target-speed-km_h", 0.0);
}
var stop = func() {
pause();
_to_wp = 1;
_is_last_wp = 0;
_is_reverse_wp = 0;
}

View file

@ -11,26 +11,28 @@
var _listener = nil;
var _view_listener = nil;
var _user_points = dynarr.dynarr.new(4);
var _user_point_modes = dynarr.dynarr.new(4); # Modes: 0 = Bezier node, 1 = Bezier end/start node
var _user_point_modes = dynarr.dynarr.new(4); # Modes: 0 = Bezier node, 1 = Bezier end/start node, 2 = Reverse
var _route = [];
var _route_hdg = [];
var _route_reverse = [];
var _view_index = nil;
var _user_point_models = [];
var _waypoint_models = [];
var _N = 0;
var _show = 0;
var _view_changed_or_external = 0;
var _start_immediately = nil;
var _D_min = nil;
var _R_turn_min = 0;
var _invalid = 0;
var _add = func(pos) {
if (_N) {
var (A, S) = courseAndDistance(_user_points.arr[_N - 1], pos);
S *= NM2M;
if (S < 3 * _D_min) {
if (S < _R_turn_min) {
gui.popupTip("Too close to the previous point,\ntry again");
return;
}else if (S > 10000.0) {
}else if (S > 10000.0) {
gui.popupTip("Too far from the previous point,\ntry again");
return;
}
@ -76,11 +78,7 @@ var _stop = func(fail = 0) {
if (!fail) {
settimer(func() {
_reset_view();
if (_start_immediately) {
autopush_driver.start();
} else {
gui.popupTip("Done");
}
gui.popupTip("Done");
}, 1.0);
} else {
_reset_view();
@ -96,6 +94,8 @@ var _place_user_point_models = func() {
var model = "Models/Autopush/cursor.xml";
if (_user_point_modes.arr[ii] == 1) {
model = "Models/Autopush/cursor_sharp.xml";
} else if (_user_point_modes.arr[ii] == 2) {
model = "Models/Autopush/cursor_reverse.xml";
}
_user_point_models[ii] = geo.put_model(model, user_points[ii], 0.0);
}
@ -115,7 +115,7 @@ var _place_waypoint_models = func() {
_clear_waypoint_models();
setsize(_waypoint_models, size(_route));
for (var ii = 0; ii < size(_route); ii += 1) {
_waypoint_models[ii] = geo.put_model("Models/Autopush/waypoint.xml", _route[ii], 0.0);
_waypoint_models[ii] = geo.put_model("Models/Autopush/waypoint.xml", _route[ii], _route_hdg[ii]);
}
}
@ -135,7 +135,11 @@ var _set_view = func() {
return;
}
_view_index = getprop("/sim/current-view/view-number");
# While "Chase View Without Yaw" would have looked better, only "Model View" resets its z-offset back to normal by itself.
setprop("/sim/current-view/view-number", view.indexof("Model View"));
setprop("/sim/current-view/z-offset-m", -500.0);
setprop("/sim/current-view/pitch-offset-deg", 90.0);
setprop("/sim/current-view/heading-offset-deg", 0.0);
_view_changed_or_external = 0;
_view_listener = setlistener("/sim/current-view/name", func {
_view_changed_or_external = 1;
@ -158,36 +162,66 @@ var _reset_view = func() {
var _calculate_route = func() {
_route = [];
user_points = _user_points.get_sliced();
_route_reverse = [];
var user_points = _user_points.get_sliced();
var route = dynarr.dynarr.new();
# add the first point cause it will be fix at this pos
route.add(geo.Coord.new(user_points[0]));
n = size(user_points);
var base = 0;
# Detect points where push/pull direction is reversed.
for (var i = 0; i < n; i += 1) {
if (_user_point_modes.arr[i] == 1 or i == n - 1) {
if (i and (i < n - 1)) {
if((_user_point_modes.arr[i] == 1) or (_user_point_modes.arr[i] == 2)) {
var newmode = 1;
var deltaA = abs(geo.normdeg180(user_points[i - 1].course_to(user_points[i]) - user_points[i].course_to(user_points[i + 1])));
if (deltaA > 91.0) {
newmode = 2;
}
if(newmode != _user_point_modes.arr[i]){
_set_userpoint_mode(i, newmode);
}
}
} else {
# Clear reverse for first and last points.
if(_user_point_modes.arr[i] == 2) {
if(_user_point_modes.arr[i] != 1){
_set_userpoint_mode(i, 1);
}
}
}
}
for (var i = 0; i < n; i += 1) {
if (_user_point_modes.arr[i] or (i == n - 1)) {
if (i - base > 0) {
var bezier = _calculate_bezier(user_points[base:i]);
var m = size(bezier);
for (var j = 0; j < m; j += 1) {
route.add(geo.Coord.new(bezier[j]));
if (bezier != nil) {
var m = size(bezier);
for (var j = 0; j < m; j += 1) {
route.add(geo.Coord.new(bezier[j]));
}
}
}
base = i;
route.add(geo.Coord.new(user_points[i]));
if (_user_point_modes.arr[i] == 2) {
var route_size = size(route.get_sliced());
setsize(_route_reverse, route_size);
_route_reverse[route_size - 1] = 1;
}
}
}
PNumber = size(user_points);
var PNumber = size(user_points);
_route = route.get_sliced();
setsize(_route_reverse, size(_route));
_check_turn_radius();
_calculate_hdg();
}
var _calculate_bezier = func(user_points) {
var route = dynarr.dynarr.new();
PNumber = size(user_points);
var PNumber = size(user_points);
if (PNumber > 1) {
var pointList = [];
@ -204,7 +238,7 @@ var _calculate_bezier = func(user_points) {
len += user_points[i].distance_to(user_points[i + 1]);
}
var step = _D_min / len;
var step = _R_turn_min / len;
for (var i = step; i < 1 - step; i+= step) {
# start iterating from 1 cause we don't need to iterate over Pn
@ -224,7 +258,63 @@ var _calculate_bezier = func(user_points) {
return route.get_sliced();
}
setlistener("/sim/model/pushback/route/show", func(p) {
var _calculate_hdg = func() {
_route_hdg = [];
var route_hdg = dynarr.dynarr.new();
var ilast = size(_route) - 1;
for (i = 0; i < ilast; i += 1) {
var hdg = _route[i].course_to(_route[i + 1]);
route_hdg.add(hdg);
}
# Last heading would be undefined, so just repeat the one before the last.
route_hdg.add(route_hdg.get_sliced()[ilast - 1]);
_route_hdg = route_hdg.get_sliced();
}
# Checks each waypoint's turn radius and marks the route invalid if
# it is smaller than the aircraft's turn radius.
var _check_turn_radius = func() {
# A waypoint's turn radius is the radius of a circle circumscribed around the waypoint, previous and next waypoints.
# Formula source: https://math.stackexchange.com/questions/947882/radius-of-circumscribed-circle-of-triangle-as-function-of-the-sides
var len = size(_route);
_invalid = 0;
# We can't calculate the radius for the first and last point
for (i = 1; i < len - 2; i += 1) {
# Disable check for push and pull points
if (_route_reverse[i] != 1) {
var a = _route[i].distance_to(_route[i + 1]);
var b = _route[i].distance_to(_route[i - 1]);
var c = _route[i - 1].distance_to(_route[i + 1]);
var margin = _R_turn_min / 5000;
# Stright line check with marging to prevent floating point error
if (a + b + margin >= c and a + b - margin <= c) {
var r = - 1;
} else {
var r = (a * b * c) / math.sqrt(
2 * a * a * b * b
+ 2 * a * a * c * c
+ 2 * b * b * c * c
- a * a * a * a
- b * b * b * b
- c * c * c * c
);
}
if ((r < _R_turn_min) and (r != -1)) {
_invalid = 1;
}
}
}
setprop("/sim/model/autopush/route/invalid", _invalid);
}
setlistener("/sim/model/autopush/route/show", func(p) {
var show = p.getValue();
if (_listener == nil) {
if (show > _show) {
@ -239,10 +329,10 @@ setlistener("/sim/model/pushback/route/show", func(p) {
});
var enter = func(start_immediately = 0) {
var enter = func() {
clear();
_set_view();
_D_min = getprop("/sim/model/pushback/driver/D_min-m");
_R_turn_min = getprop("/sim/model/autopush/min-turn-radius-m");
var wp = geo.aircraft_position();
var H = geo.elevation(wp.lat(), wp.lon());
if (H != nil) {
@ -252,25 +342,46 @@ var enter = func(start_immediately = 0) {
_listener = setlistener("/sim/signals/click", func {
_add(geo.click_position());
});
_start_immediately = start_immediately;
# This property can be overridden manually, if needed.
var wingspan = getprop("/sim/model/autopush/route/wingspan-m");
if ((wingspan == nil) or (wingspan == 0.0)) {
# JSBSim
wingspan = getprop("/fdm/jsbsim/metrics/bw-ft");
if (wingspan != nil) {
wingspan *= FT2M;
} else {
# YAsim
wingspan = getprop("/fdm/yasim/model/wings/wing/wing-span");
}
setprop("/sim/model/autopush/route/wingspan-m", wingspan);
}
}
var toggle_node = func() {
var _set_userpoint_mode = func(id, mode) {
if (_user_point_modes.arr[id] != mode) {
_user_point_modes.arr[id] = mode;
}
if (_user_point_models[id] != nil) {
_user_point_models[id].remove();
var model = "Models/Autopush/cursor.xml";
if (_user_point_modes.arr[id] == 1) {
model = "Models/Autopush/cursor_sharp.xml";
} else if (_user_point_modes.arr[id] == 2) {
model = "Models/Autopush/cursor_reverse.xml";
}
_user_point_models[id] = geo.put_model(model, _user_points.get_sliced()[id], 0.0);
}
}
var toggle_sharp = func() {
if (_listener == nil) {
return;
}
if (_user_point_modes.arr[_N - 1] == 0) {
_user_point_modes.arr[_N - 1] = 1;
id = _N - 1;
if (_user_point_modes.arr[id]) {
_set_userpoint_mode(id, 0);
} else {
_user_point_modes.arr[_N - 1] = 0;
}
if (_user_point_models[_N - 1] != nil) {
_user_point_models[_N - 1].remove();
var model = "Models/Autopush/cursor.xml";
if (_user_point_modes.arr[_N - 1] == 1) {
model = "Models/Autopush/cursor_sharp.xml";
}
_user_point_models[_N - 1] = geo.put_model(model, _user_points.get_sliced()[_N - 1], 0.0);
_set_userpoint_mode(id, 1);
}
}
@ -279,6 +390,7 @@ var done = func() {
}
var clear = func() {
autopush_driver.stop();
_stop(1);
_clear_user_point_models();
_clear_waypoint_models();
@ -288,9 +400,15 @@ var clear = func() {
}
var route = func() {
if (_N < 2) {
if (_invalid or (_N < 2)) {
return nil;
}
_calculate_route();
return _route;
}
var route_reverse = func() {
if (_invalid or (_N < 2)) {
return nil;
}
return _route_reverse;
}

View file

@ -2022,26 +2022,6 @@
</test>
</switch>
<switch name="hydraulics/tiller/hyd-pwr">
<default value="0"/>
<test logic="AND" value="1">
position/wow eq 1
hydraulics/tiller/elec-pwr eq 1
/systems/hydraulic/yellow-psi ge 1500
/sim/model/pushback/connected eq 0
/controls/gear/nws-switch eq 1
/engines/engine[0]/state eq 3
</test>
<test logic="AND" value="1">
position/wow eq 1
hydraulics/tiller/elec-pwr eq 1
/systems/hydraulic/yellow-psi ge 1500
/sim/model/pushback/connected eq 0
/controls/gear/nws-switch eq 1
/engines/engine[1]/state eq 3
</test>
</switch>
<switch name="hydraulics/tiller/elec-pwr">
<default value="0"/>
<test logic="OR" value="1">
@ -2052,11 +2032,31 @@
</test>
</switch>
<switch name="hydraulics/tiller/hyd-pwr">
<default value="0"/>
<test logic="AND" value="1">
position/wow eq 1
hydraulics/tiller/elec-pwr eq 1
/systems/hydraulic/yellow-psi ge 1500
/sim/model/autopush/connected eq 0
/controls/gear/nws-switch eq 1
/engines/engine[0]/state eq 3
</test>
<test logic="AND" value="1">
position/wow eq 1
hydraulics/tiller/elec-pwr eq 1
/systems/hydraulic/yellow-psi ge 1500
/sim/model/autopush/connected eq 0
/controls/gear/nws-switch eq 1
/engines/engine[1]/state eq 3
</test>
</switch>
<fcs_function name="hydraulics/tiller/function">
<function>
<ifthen>
<eq>
<property>/sim/model/pushback/connected</property>
<property>/sim/model/autopush/connected</property>
<value>1</value>
</eq>
<product>
@ -2067,7 +2067,7 @@
<independentVar lookup="row">/velocities/groundspeed-kt</independentVar>
<independentVar lookup="column">hydraulics/tiller/switch</independentVar>
<tableData>
-1 0 1
-1 0 1
0.500 0 0 0
1.000 -75 0 75
30.000 -47 0 47
@ -2083,7 +2083,7 @@
<default value="0"/>
<test logic="OR" value="75">
hydraulics/tiller/hyd-pwr eq 1
/sim/model/pushback/connected eq 1
/sim/model/autopush/connected eq 1
/systems/acconfig/autoconfig-running eq 1
</test>
</switch>
@ -2097,7 +2097,7 @@
<switch name="fcs/pushback-steer-deg">
<default value="0"/>
<test value="fcs/steer-deg">
/sim/model/pushback/connected eq 1
/sim/model/autopush/connected eq 1
</test>
</switch>

View file

@ -2,11 +2,11 @@
<!--
AUTOPUSH
Waypoint model.
Pushback dialog.
Copyright (c) 2018 Autopush authors:
Michael Danilov <mike.d.ft402 -eh- gmail.com>
Joshua Davidson http://github.com/it0uchpods
Merspieler http://github.com/merspieler
Merspieler http://gitlab.com/merspieler
Distribute under the terms of GPLv2.
-->
@ -52,7 +52,7 @@ Distribute under the terms of GPLv2.
<checkbox>
<halign>left</halign>
<label>Connect</label>
<property>/sim/model/pushback/enabled</property>
<property>/sim/model/autopush/enabled</property>
<live>true</live>
<binding>
<command>dialog-apply</command>
@ -77,7 +77,7 @@ Distribute under the terms of GPLv2.
<legend>&lt;</legend>
<binding>
<command>property-adjust</command>
<property>/sim/model/pushback/steer-cmd-norm</property>
<property>/sim/model/autopush/steer-cmd-norm</property>
<min>-1.0</min>
<max>1.0</max>
<step>-0.02</step>
@ -91,7 +91,7 @@ Distribute under the terms of GPLv2.
<min>-1.0</min>
<max>1.0</max>
<step>0.1</step>
<property>/sim/model/pushback/steer-cmd-norm</property>
<property>/sim/model/autopush/steer-cmd-norm</property>
<live>true</live>
<binding>
<command>dialog-apply</command>
@ -106,7 +106,7 @@ Distribute under the terms of GPLv2.
<legend>&gt;</legend>
<binding>
<command>property-adjust</command>
<property>/sim/model/pushback/steer-cmd-norm</property>
<property>/sim/model/autopush/steer-cmd-norm</property>
<min>-1.0</min>
<max>1.0</max>
<step>0.02</step>
@ -122,7 +122,7 @@ Distribute under the terms of GPLv2.
<legend>Center</legend>
<binding>
<command>property-assign</command>
<property>/sim/model/pushback/steer-cmd-norm</property>
<property>/sim/model/autopush/steer-cmd-norm</property>
<value>0</value>
</binding>
</button>
@ -142,7 +142,7 @@ Distribute under the terms of GPLv2.
<legend>&lt;</legend>
<binding>
<command>property-adjust</command>
<property>/sim/model/pushback/target-speed-km_h</property>
<property>/sim/model/autopush/target-speed-km_h</property>
<min>-25</min>
<max>25</max>
<step>-1</step>
@ -155,7 +155,7 @@ Distribute under the terms of GPLv2.
<col>2</col>
<min>-25</min>
<max>25</max>
<property>/sim/model/pushback/target-speed-km_h</property>
<property>/sim/model/autopush/target-speed-km_h</property>
<step>1.0</step>
<live>true</live>
<binding>
@ -171,7 +171,7 @@ Distribute under the terms of GPLv2.
<legend>&gt;</legend>
<binding>
<command>property-adjust</command>
<property>/sim/model/pushback/target-speed-km_h</property>
<property>/sim/model/autopush/target-speed-km_h</property>
<min>-25</min>
<max>25</max>
<step>1</step>
@ -187,16 +187,20 @@ Distribute under the terms of GPLv2.
<legend>Stop</legend>
<binding>
<command>property-assign</command>
<property>/sim/model/pushback/target-speed-km_h</property>
<property>/sim/model/autopush/target-speed-km_h</property>
<value>0</value>
</binding>
<binding>
<command>nasal</command>
<script>autopush_driver.pause();</script>
</binding>
</button>
<text>
<row>1</row>
<col>5</col>
<pref-width>16</pref-width>
<property>/sim/model/pushback/target-speed-km_h</property>
<property>/sim/model/autopush/target-speed-km_h</property>
<format>%3.0f</format>
<live>true</live>
<halign>right</halign>
@ -240,10 +244,10 @@ Distribute under the terms of GPLv2.
<col>2</col>
<pref-width>50</pref-width>
<pref-height>25</pref-height>
<legend>Stop</legend>
<legend>Pause</legend>
<binding>
<command>nasal</command>
<script>autopush_driver.stop();</script>
<script>autopush_driver.pause();</script>
</binding>
</button>
@ -284,10 +288,14 @@ Distribute under the terms of GPLv2.
<halign>left</halign>
<label>Always Show</label>
<live>true</live>
<property>/sim/model/pushback/route/show</property>
<property>/sim/model/autopush/route/show</property>
<binding>
<command>dialog-apply</command>
</binding>
<binding>
<command>nasal</command>
<script>acconfig.writeSettings();</script>
</binding>
</checkbox>
<text>
@ -305,7 +313,7 @@ Distribute under the terms of GPLv2.
<legend>Sharp</legend>
<binding>
<command>nasal</command>
<script>autopush_route.toggle_node();</script>
<script>autopush_route.toggle_sharp();</script>
</binding>
</button>
@ -321,6 +329,22 @@ Distribute under the terms of GPLv2.
</binding>
</button>
<checkbox>
<row>2</row>
<col>3</col>
<halign>left</halign>
<label>Show Wingtip</label>
<live>true</live>
<property>/sim/model/autopush/route/show-wingtip</property>
<binding>
<command>dialog-apply</command>
</binding>
<binding>
<command>nasal</command>
<script>acconfig.writeSettings();</script>
</binding>
</checkbox>
</group>
</group>

View file

@ -1 +1 @@
4785
4787