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