Reinit revisited, added an option to ignore fdm-initialized and cleaned up the doc.
This commit is contained in:
parent
60d806be6b
commit
1bae213eb9
2 changed files with 69 additions and 48 deletions
|
@ -28,7 +28,7 @@
|
||||||
# - add wind correction to speed-to-fly
|
# - add wind correction to speed-to-fly
|
||||||
# - final glide computer
|
# - final glide computer
|
||||||
|
|
||||||
io.include("update_loop.nas");
|
io.include("updateloop.nas");
|
||||||
|
|
||||||
var MPS2KPH = 3.6;
|
var MPS2KPH = 3.6;
|
||||||
var sqr = func(x) {x * x}
|
var sqr = func(x) {x * x}
|
||||||
|
@ -44,14 +44,19 @@ var InstrumentComponent = {
|
||||||
# TODO: Refactor aircrafts that use it and remove this.
|
# TODO: Refactor aircrafts that use it and remove this.
|
||||||
var Instrument = UpdateLoop;
|
var Instrument = UpdateLoop;
|
||||||
|
|
||||||
# update_prop(property)
|
##
|
||||||
# Helper generator for updating the given property on every element update
|
# Helper generator for updating a property on every element update
|
||||||
#
|
#
|
||||||
# Example:
|
# Example:
|
||||||
|
#
|
||||||
# var needle = Dampener.new(
|
# var needle = Dampener.new(
|
||||||
# input: probe,
|
# input: probe,
|
||||||
# dampening: 2.8,
|
# dampening: 2.8,
|
||||||
# on_update: update_prop("/instrumentation/variometer/te-reading-mps"));
|
# on_update: update_prop("/instrumentation/variometer/te-reading-mps"));
|
||||||
|
#
|
||||||
|
# See Aircraft/Instruments-3d/glider/vario/ilec-sc7.nas and
|
||||||
|
# Aircraft/Generic/soaring-instrumentation-sdk.nas for usage examples.
|
||||||
|
# You can also refer to the soaring sdk wiki page.
|
||||||
|
|
||||||
var update_prop = func(property) {
|
var update_prop = func(property) {
|
||||||
func(value) { setprop(property, value) }
|
func(value) { setprop(property, value) }
|
||||||
|
|
|
@ -1,4 +1,4 @@
|
||||||
# update_loop.nas - Generic Nasal update loop for implementing sytems,
|
# updateloop.nas - Generic Nasal update loop for implementing sytems,
|
||||||
# instruments or physics simulation.
|
# instruments or physics simulation.
|
||||||
#
|
#
|
||||||
# Copyright (C) 2014 Anton Gomez Alvedro
|
# Copyright (C) 2014 Anton Gomez Alvedro
|
||||||
|
@ -17,45 +17,44 @@
|
||||||
# along with this program; if not, write to the Free Software
|
# along with this program; if not, write to the Free Software
|
||||||
# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
|
# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
|
||||||
|
|
||||||
# Updatable
|
|
||||||
|
##
|
||||||
|
# The UpdateLoop accepts a vector of Updatable components that it will call
|
||||||
|
# at regular intervals. In order to define custom objects to be controlled by
|
||||||
|
# the loop, the Updatable interface must be implemented:
|
||||||
#
|
#
|
||||||
# The update loop accepts a vector of Updatable elements that it will update at
|
# var MyComponent = {
|
||||||
# regular intervals. In order to make custom elements, you should add Updatable
|
|
||||||
# to the parents vector of your object:
|
|
||||||
#
|
|
||||||
# var MyElement = {
|
|
||||||
# parents: [Updatable],
|
# parents: [Updatable],
|
||||||
|
#
|
||||||
|
# reset: func {
|
||||||
|
# ...
|
||||||
|
# },
|
||||||
|
# update: func(dt) {
|
||||||
|
# ...
|
||||||
|
# },
|
||||||
# ...
|
# ...
|
||||||
# };
|
# };
|
||||||
#
|
|
||||||
# Your component shall then implement an "update" and "reset" methods that
|
|
||||||
# the UpdateLoop will call when needed.
|
|
||||||
|
|
||||||
var Updatable = {
|
var Updatable = {
|
||||||
|
|
||||||
|
##
|
||||||
|
# When reset() is called, the component shall clean all internal state and
|
||||||
|
# reinitialize itself as if starting from scratch.
|
||||||
|
#
|
||||||
|
# Reset will be called automatically after a teleport, and then on demand
|
||||||
|
# when UpdateLoop.reset() is explicitly called.
|
||||||
|
|
||||||
reset: func { },
|
reset: func { },
|
||||||
|
|
||||||
|
##
|
||||||
|
# Called at regular intervals from the UdateLoop.
|
||||||
|
# dt: Elapsed time in seconds since the last call.
|
||||||
|
|
||||||
update: func(dt) { },
|
update: func(dt) { },
|
||||||
};
|
};
|
||||||
|
|
||||||
##
|
##
|
||||||
# Helper generator for updating a property on every element update
|
# Wraps a set of user provided Updatable objects and calls them periodically.
|
||||||
#
|
|
||||||
# Example:
|
|
||||||
#
|
|
||||||
# var needle = Dampener.new(
|
|
||||||
# input: probe,
|
|
||||||
# dampening: 2.8,
|
|
||||||
# on_update: update_prop("/instrumentation/variometer/te-reading-mps"));
|
|
||||||
#
|
|
||||||
# See Aircraft/Instruments-3d/glider/vario/ilec-sc7.nas and
|
|
||||||
# Aircraft/Generic/soaring-instrumentation-sdk.nas for usage examples.
|
|
||||||
# You can also refer to the soaring sdk wiki page.
|
|
||||||
|
|
||||||
var update_prop = func(property) {
|
|
||||||
func(value) { setprop(property, value) }
|
|
||||||
};
|
|
||||||
|
|
||||||
# UpdateLoop
|
|
||||||
# Wraps a set of user provided objects and updates them periodically.
|
|
||||||
# Takes care of critical sim signals (reinit, fdm-initialized, speed-up).
|
# Takes care of critical sim signals (reinit, fdm-initialized, speed-up).
|
||||||
|
|
||||||
var UpdateLoop = {
|
var UpdateLoop = {
|
||||||
|
@ -63,14 +62,16 @@ var UpdateLoop = {
|
||||||
# UpdateLoop.new(components, [update_period], [enable])
|
# UpdateLoop.new(components, [update_period], [enable])
|
||||||
#
|
#
|
||||||
# components: Vector of components to update on every iteration.
|
# components: Vector of components to update on every iteration.
|
||||||
# update_period: Time in seconds between updates (optional).
|
# update_period: Time in seconds between updates.
|
||||||
# enable: Enable the loop immediately after creation (optional).
|
# enable: Enable the loop immediately after creation.
|
||||||
|
# ignore_fdm: Do not wait for the fdm to be ready for starting the loop.
|
||||||
|
|
||||||
new: func(components, update_period = 0, enable = 1) {
|
new: func(components, update_period = 0, enable = 1, ignore_fdm = 0) {
|
||||||
|
|
||||||
var m = { parents: [UpdateLoop] };
|
var m = { parents: [UpdateLoop] };
|
||||||
m.initialized = 0;
|
m.initialized = 0;
|
||||||
m.enabled = enable;
|
m.enabled = enable;
|
||||||
|
m.ignore_fdm = ignore_fdm;
|
||||||
m.update_period = update_period;
|
m.update_period = update_period;
|
||||||
m.time_last = 0;
|
m.time_last = 0;
|
||||||
m.sim_speed = 1;
|
m.sim_speed = 1;
|
||||||
|
@ -84,16 +85,18 @@ var UpdateLoop = {
|
||||||
append(m.lst, setlistener("/sim/speed-up",
|
append(m.lst, setlistener("/sim/speed-up",
|
||||||
func(n) { m.sim_speed = n.getValue() }, 1, 0));
|
func(n) { m.sim_speed = n.getValue() }, 1, 0));
|
||||||
|
|
||||||
append(m.lst, setlistener("sim/signals/reinit", func {
|
append(m.lst, setlistener("sim/signals/reinit",
|
||||||
m.timer.stop();
|
func(n) { m._on_teleport(n) }));
|
||||||
m.initialized = 0;
|
|
||||||
}));
|
|
||||||
|
|
||||||
append(m.lst, setlistener("sim/signals/fdm-initialized", func {
|
if (ignore_fdm or getprop("sim/signals/fdm-initialized")) {
|
||||||
if (m.timer.isRunning) m.timer.stop();
|
m.reset();
|
||||||
call(me.reset, [], m);
|
enable and m.timer.start();
|
||||||
if (m.enabled) m.timer.start();
|
}
|
||||||
}));
|
|
||||||
|
if (!ignore_fdm) {
|
||||||
|
append(m.lst, setlistener("sim/signals/fdm-initialized",
|
||||||
|
func(n) { m._on_teleport(n) }));
|
||||||
|
}
|
||||||
|
|
||||||
return m;
|
return m;
|
||||||
},
|
},
|
||||||
|
@ -118,8 +121,7 @@ var UpdateLoop = {
|
||||||
},
|
},
|
||||||
|
|
||||||
##
|
##
|
||||||
# Enables the loop if it was disabled, i.e. the loop will start updating
|
# The loop will start updating the components under its control.
|
||||||
# the components under control
|
|
||||||
|
|
||||||
enable: func {
|
enable: func {
|
||||||
if (me.initialized) me.timer.start();
|
if (me.initialized) me.timer.start();
|
||||||
|
@ -127,8 +129,8 @@ var UpdateLoop = {
|
||||||
},
|
},
|
||||||
|
|
||||||
##
|
##
|
||||||
# Disables the loop if it was enabled, i.e. the loop will freeze and its
|
# The loop will freeze and its components will not get updates until
|
||||||
# components will not get updates until enabled again
|
# enabled again.
|
||||||
|
|
||||||
disable: func {
|
disable: func {
|
||||||
me.timer.stop();
|
me.timer.stop();
|
||||||
|
@ -145,4 +147,18 @@ var UpdateLoop = {
|
||||||
foreach (var component; me.components)
|
foreach (var component; me.components)
|
||||||
component.update(dt);
|
component.update(dt);
|
||||||
},
|
},
|
||||||
|
|
||||||
|
_on_teleport: func(n) {
|
||||||
|
var signal = n.getName();
|
||||||
|
|
||||||
|
if (signal == "reinit" and n.getValue()) {
|
||||||
|
me.timer.stop();
|
||||||
|
me.initialized = 0;
|
||||||
|
}
|
||||||
|
elsif (me.ignore_fdm or signal == "fdm-initialized") {
|
||||||
|
me.timer.isRunning and me.timer.stop();
|
||||||
|
me.reset();
|
||||||
|
me.enabled and me.timer.start();
|
||||||
|
}
|
||||||
|
}
|
||||||
};
|
};
|
||||||
|
|
Loading…
Add table
Reference in a new issue