149 lines
4.8 KiB
Text
149 lines
4.8 KiB
Text
|
# Copyright (C) 2015 onox
|
||
|
#
|
||
|
# This program is free software: you can redistribute it and/or modify
|
||
|
# it under the terms of the GNU General Public License as published by
|
||
|
# the Free Software Foundation; either version 2 of the License, or
|
||
|
# (at your option) any later version.
|
||
|
#
|
||
|
# This program is distributed in the hope that it will be useful,
|
||
|
# but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||
|
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||
|
# GNU General Public License for more details.
|
||
|
#
|
||
|
# You should have received a copy of the GNU General Public License
|
||
|
# along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||
|
|
||
|
# Position and offset of the start point of a tiedown. The position is on
|
||
|
# the surface of the fuselage or wing.
|
||
|
var point_coords = {
|
||
|
left: {
|
||
|
x: 0.1188,
|
||
|
y: -2.2998,
|
||
|
z: 0.4008,
|
||
|
offset: 90.0
|
||
|
},
|
||
|
|
||
|
right: {
|
||
|
x: 0.1188,
|
||
|
y: 2.2998,
|
||
|
z: 0.4008,
|
||
|
offset: -90.0
|
||
|
},
|
||
|
|
||
|
tail: {
|
||
|
x: 4.7116,
|
||
|
y: 0.0000,
|
||
|
z: -0.6663,
|
||
|
offset: 180.0
|
||
|
},
|
||
|
};
|
||
|
|
||
|
# Values must be the same as in Models/c172p.xml
|
||
|
var model_offsets_pitch_deg = -3.0;
|
||
|
var model_offsets_z_m = -0.065;
|
||
|
|
||
|
var TiedownPositionUpdater = {
|
||
|
|
||
|
new: func (name) {
|
||
|
var m = {
|
||
|
parents: [TiedownPositionUpdater]
|
||
|
};
|
||
|
m.loop = updateloop.UpdateLoop.new(components: [m], update_period: 0.0, enable: 0);
|
||
|
m.name = name;
|
||
|
return m;
|
||
|
},
|
||
|
|
||
|
enable: func {
|
||
|
me.loop.reset();
|
||
|
me.loop.enable();
|
||
|
},
|
||
|
|
||
|
disable: func {
|
||
|
me.loop.disable();
|
||
|
},
|
||
|
|
||
|
enable_or_disable: func (enable) {
|
||
|
if (enable)
|
||
|
me.enable();
|
||
|
else
|
||
|
me.disable();
|
||
|
},
|
||
|
|
||
|
reset: func {
|
||
|
me.end_point = geo.aircraft_position();
|
||
|
var heading = getprop("/orientation/heading-deg");
|
||
|
|
||
|
var x = getprop("/sim/model/c172p/tiedowns", me.name, "x");
|
||
|
var y = getprop("/sim/model/c172p/tiedowns", me.name, "y");
|
||
|
|
||
|
# Set position of end point
|
||
|
var course = heading + geo.normdeg(math_ext.atan(y, x));
|
||
|
var distance = math.sqrt(math.pow(x, 2) + math.pow(y, 2));
|
||
|
me.end_point.apply_course_distance(course, distance);
|
||
|
|
||
|
# Set altitude of end point
|
||
|
var elev_m = geo.elevation(me.end_point.lat(), me.end_point.lon());
|
||
|
me.end_point.set_alt(elev_m or getprop("/position/ground-elev-m"));
|
||
|
|
||
|
me.init_ref_length();
|
||
|
},
|
||
|
|
||
|
init_ref_length: func {
|
||
|
# Call update() to compute initial length
|
||
|
me.update(0);
|
||
|
var length = getprop("/sim/model/c172p/tiedowns", me.name, "length");
|
||
|
setprop("/sim/model/c172p/tiedowns", me.name, "ref-length", length);
|
||
|
},
|
||
|
|
||
|
update: func (dt) {
|
||
|
var point = point_coords[me.name];
|
||
|
|
||
|
var start_x = point.x;
|
||
|
var start_y = point.y;
|
||
|
var start_z = point.z + model_offsets_z_m;
|
||
|
|
||
|
var roll_deg = getprop("/orientation/roll-deg");
|
||
|
var pitch_deg = getprop("/orientation/pitch-deg") + model_offsets_pitch_deg;
|
||
|
var heading = getprop("/orientation/heading-deg");
|
||
|
|
||
|
# Compute the actual position of the start of the tiedown
|
||
|
var (start_point_2d, start_point) = math_ext.get_point(start_x, start_y, start_z, roll_deg, pitch_deg, heading);
|
||
|
|
||
|
var (yaw, pitch, distance) = math_ext.get_yaw_pitch_distance_inert(start_point_2d, start_point, me.end_point, heading);
|
||
|
(yaw, pitch) = math_ext.get_yaw_pitch_body(roll_deg, pitch_deg, yaw, pitch, point.offset);
|
||
|
|
||
|
setprop("/sim/model/c172p/tiedowns", me.name, "heading-deg", yaw);
|
||
|
setprop("/sim/model/c172p/tiedowns", me.name, "pitch-deg", pitch);
|
||
|
setprop("/sim/model/c172p/tiedowns", me.name, "length", distance);
|
||
|
},
|
||
|
|
||
|
};
|
||
|
|
||
|
var tiedown_left_updater = TiedownPositionUpdater.new("left");
|
||
|
var tiedown_right_updater = TiedownPositionUpdater.new("right");
|
||
|
var tiedown_tail_updater = TiedownPositionUpdater.new("tail");
|
||
|
|
||
|
setlistener("/sim/signals/fdm-initialized", func {
|
||
|
setlistener("/sim/model/c172p/securing/tiedownL-visible", func (node) {
|
||
|
tiedown_left_updater.enable_or_disable(node.getValue());
|
||
|
}, 1, 0);
|
||
|
|
||
|
setlistener("/sim/model/c172p/securing/tiedownR-visible", func (node) {
|
||
|
tiedown_right_updater.enable_or_disable(node.getValue());
|
||
|
}, 1, 0);
|
||
|
|
||
|
setlistener("/sim/model/c172p/securing/tiedownT-visible", func (node) {
|
||
|
tiedown_tail_updater.enable_or_disable(node.getValue());
|
||
|
}, 1, 0);
|
||
|
|
||
|
setlistener("/fdm/jsbsim/damage/repairing", func (node) {
|
||
|
# When the aircraft has been repaired (value is switched back
|
||
|
# to 0), compute the new initial length of the tiedowns
|
||
|
if (!node.getValue()) {
|
||
|
tiedown_left_updater.init_ref_length();
|
||
|
tiedown_right_updater.init_ref_length();
|
||
|
tiedown_tail_updater.init_ref_length();
|
||
|
}
|
||
|
}, 0, 0);
|
||
|
});
|