SenecaII: extend (c) to 2012
[fg:toms-fgdata.git] / Aircraft / SenecaII / Nasal / timers.nas
1 #############################################################################
2 # This file is part of FlightGear, the free flight simulator
3 # http://www.flightgear.org/
4 #
5 # Copyright (C) 2009 Torsten Dreyer, Torsten (at) t3r _dot_ de
6 #
7 # This program is free software; you can redistribute it and/or
8 # modify it under the terms of the GNU General Public License as
9 # published by the Free Software Foundation; either version 2 of the
10 # License, or (at your option) any later version.
11 #
12 # This program is distributed in the hope that it will be useful, but
13 # WITHOUT ANY WARRANTY; without even the implied warranty of
14 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
15 # General Public License for more details.
16 #############################################################################
17
18 GetPropertyPath = func(node) {
19   if( node.getParent() != nil ) {
20     return GetPropertyPath( node.getParent() ) ~ "/" ~ node.getName();
21   }
22   return "";
23 }
24
25 var listenerHash = {};
26
27 propertyListener = func(node) {
28   var timer = listenerHash[ GetPropertyPath( node ) ];
29   if( timer != nil ) {
30     timer.listener();
31   }
32 }
33
34 var timeNode = props.globals.getNode( "/sim/time/elapsed-sec" );
35
36 var Timer = {};
37
38 Timer.new = func {
39   var obj = {};
40   obj.parents = [Timer];
41   obj.timerNode = arg[0];
42   obj.name = obj.timerNode.getNode( "name" ).getValue();
43   obj.enableNode = obj.getProperty( "enable-property" );
44   obj.startNode  = obj.getProperty( "start-property" );
45   obj.outputNode = obj.getProperty( "output-property" );
46   if( obj.outputNode != nil )
47     obj.outputNode.setBoolValue( 0 );
48   obj.t0Node  = obj.timerNode.getNode( "t0" );
49   obj.expires = 0;
50
51   setlistener( obj.startNode, propertyListener );
52
53   var s = GetPropertyPath( obj.startNode );
54   listenerHash[s] = obj;
55
56   return obj;
57 }
58
59 Timer.getProperty = func(prop) {
60   var node = me.timerNode.getNode( prop );
61   if( node == nil ) {
62     return nil;
63   }
64   return props.globals.getNode( node.getValue() );
65 }
66
67 Timer.listener = func {
68   if( ! me.outputNode.getBoolValue() and me.startNode.getBoolValue() ) {
69     me.outputNode.setBoolValue( 1 );
70     me.expires = timeNode.getValue() + me.t0Node.getValue();
71     settimer( expireTimers, me.t0Node.getValue() );
72   }
73 }
74
75 Timer.expire = func {
76   if( me.outputNode.getBoolValue() and me.expires <= timeNode.getValue() ) {
77     me.outputNode.setBoolValue( 0 );
78   }
79 }
80
81 var timers = [];
82
83 createTimer = func(timer) {
84   var t = Timer.new( timer );
85   append( timers, t );
86 }
87
88 var expireTimers = func {
89   foreach( var timer; timers ) {
90     timer.expire();
91   }
92 }
93
94 # read the property-tree
95 var timersNode = props.globals.getNode( "/sim/timers");
96 var timerNodes = timersNode.getChildren( "timer" );
97 foreach( var timer; timerNodes ) {
98   createTimer( timer );
99 }