Torsten DREYER: use var keyword, named args, etc.; add 13 tutorials
[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   obj.outputNode.setBoolValue( 0 );
30   obj.t0Node  = obj.timerNode.getNode( "t0" );
31   obj.expires = 0;
32
33   setlistener( obj.startNode, propertyListener );
34
35   var s = GetPropertyPath( obj.startNode );
36   listenerHash[s] = obj;
37
38   return obj;
39 }
40
41 Timer.getProperty = func(prop) {
42   var node = me.timerNode.getNode( prop );
43   if( node == nil ) {
44     return nil;
45   }
46   return props.globals.getNode( node.getValue() );
47 }
48
49 Timer.listener = func {
50   if( ! me.outputNode.getBoolValue() and me.startNode.getBoolValue() ) {
51     me.outputNode.setBoolValue( 1 );
52     me.expires = timeNode.getValue() + me.t0Node.getValue();
53     settimer( expireTimers, me.t0Node.getValue() );
54   }
55 }
56
57 Timer.expire = func {
58   if( me.outputNode.getBoolValue() and me.expires <= timeNode.getValue() ) {
59     me.outputNode.setBoolValue( 0 );
60   }
61 }
62
63 var timers = [];
64
65 createTimer = func(timer) {
66   var t = Timer.new( timer );
67   append( timers, t );
68 }
69
70 var expireTimers = func {
71   foreach( var timer; timers ) {
72     timer.expire();
73   }
74 }
75
76 # read the property-tree
77 var timersNode = props.globals.getNode( "/sim/timers");
78 var timerNodes = timersNode.getChildren( "timer" );
79 foreach( var timer; timerNodes ) {
80   createTimer( timer );
81 }