make use of initNode and catch uninitialized variables
[fg:toms-fgdata.git] / Aircraft / SenecaII / Nasal / timers.nas
1 GetPropertyPath = func(node) {
2   if( node.getParent() != nil ) {
3     return GetPropertyPath( node.getParent() ) ~ "/" ~ node.getName();
4   }
5   return "";
6 }
7
8 var listenerHash = {};
9
10 propertyListener = func(node) {
11   var timer = listenerHash[ GetPropertyPath( node ) ];
12   if( timer != nil ) {
13     timer.listener();
14   }
15 }
16
17 var timeNode = props.globals.getNode( "/sim/time/elapsed-sec" );
18
19 var Timer = {};
20
21 Timer.new = func {
22   var obj = {};
23   obj.parents = [Timer];
24   obj.timerNode = arg[0];
25   obj.name = obj.timerNode.getNode( "name" ).getValue();
26   obj.enableNode = obj.getProperty( "enable-property" );
27   obj.startNode  = obj.getProperty( "start-property" );
28   obj.outputNode = obj.getProperty( "output-property" );
29   if( obj.outputNode != nil )
30     obj.outputNode.setBoolValue( 0 );
31   obj.t0Node  = obj.timerNode.getNode( "t0" );
32   obj.expires = 0;
33
34   setlistener( obj.startNode, propertyListener );
35
36   var s = GetPropertyPath( obj.startNode );
37   listenerHash[s] = obj;
38
39   return obj;
40 }
41
42 Timer.getProperty = func(prop) {
43   var node = me.timerNode.getNode( prop );
44   if( node == nil ) {
45     return nil;
46   }
47   return props.globals.getNode( node.getValue() );
48 }
49
50 Timer.listener = func {
51   if( ! me.outputNode.getBoolValue() and me.startNode.getBoolValue() ) {
52     me.outputNode.setBoolValue( 1 );
53     me.expires = timeNode.getValue() + me.t0Node.getValue();
54     settimer( expireTimers, me.t0Node.getValue() );
55   }
56 }
57
58 Timer.expire = func {
59   if( me.outputNode.getBoolValue() and me.expires <= timeNode.getValue() ) {
60     me.outputNode.setBoolValue( 0 );
61   }
62 }
63
64 var timers = [];
65
66 createTimer = func(timer) {
67   var t = Timer.new( timer );
68   append( timers, t );
69 }
70
71 var expireTimers = func {
72   foreach( var timer; timers ) {
73     timer.expire();
74   }
75 }
76
77 # read the property-tree
78 var timersNode = props.globals.getNode( "/sim/timers");
79 var timerNodes = timersNode.getChildren( "timer" );
80 foreach( var timer; timerNodes ) {
81   createTimer( timer );
82 }