CARMA C++
AbsoluteTimer.h
Go to the documentation of this file.
1 // $Id: AbsoluteTimer.h,v 1.2 2011/11/14 22:42:02 eml Exp $
2 
3 #ifndef SZA_UTIL_ABSOLUTETIMER_H
4 #define SZA_UTIL_ABSOLUTETIMER_H
5 
15 #include <iostream>
16 
20 #include "carma/szautil/TimeOut.h"
21 #include "carma/szautil/Time.h"
22 
23 #define ABSOLUTE_TIMER_HANDLER(fn) void (fn)(void* args)
24 
25 namespace sza {
26  namespace util {
27 
28  //------------------------------------------------------------
29  // A utility class for sending messages to the ModemPager task
30  //------------------------------------------------------------
31 
32  class AbsoluteTimerMsg : public GenericTaskMsg {
33  public:
34 
35  enum MsgType {
36  TIMER,
37  ADD_HANDLER,
38  REM_HANDLER
39  };
40 
41  union {
42 
43  struct {
44  bool enable;
45 
46  unsigned delayInSeconds;
47  unsigned delayInNanoSeconds;
48 
49  unsigned offsetInNanoSeconds;
50 
51  unsigned intervalInSeconds;
52  unsigned intervalInNanoSeconds;
53 
54  } timer;
55 
56  struct {
57  ABSOLUTE_TIMER_HANDLER(*fn);
58  void* args;
59  } addHandler;
60 
61  struct {
62  ABSOLUTE_TIMER_HANDLER(*fn);
63  } remHandler;
64 
65  } body;
66 
67  // A type for this message
68 
69  MsgType type;
70  };
71 
72  //------------------------------------------------------------
73  // Main class definition
74  //------------------------------------------------------------
75 
76  class AbsoluteTimer :
77  public SpawnableTask<AbsoluteTimerMsg> {
78  public:
79 
80  //------------------------------------------------------------
81  // A utility class used to store handlers
82  //------------------------------------------------------------
83 
84  class Handler {
85  public:
86  ABSOLUTE_TIMER_HANDLER(*fn_);
87  void* args_;
88  };
89 
93  AbsoluteTimer();
94 
98  virtual ~AbsoluteTimer();
99 
100  // Add a callback function to be called whenever the timer expires
101 
102  void addHandler(ABSOLUTE_TIMER_HANDLER(*handler), void* args=0);
103 
104  // Remove a callback function from the list to be called
105 
106  void removeHandler(ABSOLUTE_TIMER_HANDLER(*handler));
107 
108  // Enable/Disable the timer
109 
110  void enableTimer(bool enable,
111  unsigned delayInSeconds=0, unsigned delayInNanoSeconds=0,
112  unsigned offsetInNanoSeconds=0,
113  unsigned intervalInSeconds=0, unsigned intervalInNanoSeconds=0);
114  private:
115 
116  Time offset_;
117  Time initialDelay_;
118  Time interval_;
119 
120  bool firstTimeoutSinceReconfiguration_;
121  double firstTimeToFireInSeconds_;
122 
123  TimeOut timeOut_;
124 
125  // A list of handlers to be called when the ephemeris is updated
126 
127  std::vector<Handler> handlers_;
128 
129  //-----------------------------------------------------------------------
130  // Methods called in response to messages received on our message queue
131  //-----------------------------------------------------------------------
132 
133  void executeEnableTimer(bool enable,
134  unsigned delayInSeconds, unsigned delayInNanoSeconds,
135  unsigned offsetInNanoSeconds,
136  unsigned intervalInSeconds, unsigned intervalInNanoSeconds);
137  void executeAddHandler(ABSOLUTE_TIMER_HANDLER(*handler), void* args=0);
138  void executeRemoveHandler(ABSOLUTE_TIMER_HANDLER(*handler));
139 
140  //-----------------------------------------------------------------------
141  // Run methods used by this class
142  //-----------------------------------------------------------------------
143 
144  void serviceMsgQ();
145  void processMsg(AbsoluteTimerMsg* msg);
146 
147  // React to a timeout in select
148 
149  void registerTimeOut();
150 
151  void callHandlers();
152 
153  void computeNextTimeout();
154 
155  }; // End class AbsoluteTimer
156 
157  } // End namespace util
158 } // End namespace sza
159 
160 
161 
162 #endif // End #ifndef SZA_UTIL_ABSOLUTETIMER_H
Tagged: Fri Nov 14 12:39:33 UTC 2003.
virtual void addHandler(AbsoluteTimerMsg *msg)
Respond to a message to add/remove a handler.
virtual void enableTimer(AbsoluteTimerMsg *msg)
Respond to a message to enable/disable a timer.
Tagged: Fri Nov 14 12:39:34 UTC 2003.
Tagged: Tue May 2 16:31:46 PDT 2006.
Tagged: Fri Jan 26 16:49:57 NZDT 2007.