switch to new MPL based Fraunhofer FOKUS Public License
[senf.git] / senf / PPI / IntervalTimer.hh
1 // $Id$
2 //
3 // Copyright (C) 2007
4 // Fraunhofer Institute for Open Communication Systems (FOKUS)
5 //
6 // The contents of this file are subject to the Fraunhofer FOKUS Public License
7 // Version 1.0 (the "License"); you may not use this file except in compliance
8 // with the License. You may obtain a copy of the License at 
9 // http://senf.berlios.de/license.html
10 //
11 // The Fraunhofer FOKUS Public License Version 1.0 is based on, 
12 // but modifies the Mozilla Public License Version 1.1.
13 // See the full license text for the amendments.
14 //
15 // Software distributed under the License is distributed on an "AS IS" basis, 
16 // WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License 
17 // for the specific language governing rights and limitations under the License.
18 //
19 // The Original Code is Fraunhofer FOKUS code.
20 //
21 // The Initial Developer of the Original Code is Fraunhofer-Gesellschaft e.V. 
22 // (registered association), Hansastraße 27 c, 80686 Munich, Germany.
23 // All Rights Reserved.
24 //
25 // Contributor(s):
26 //   Stefan Bund <g0dil@berlios.de>
27
28 /** \file
29     \brief IntervalTimer public header */
30
31 #ifndef HH_SENF_PPI_IntervalTimer_
32 #define HH_SENF_PPI_IntervalTimer_ 1
33
34 // Custom includes
35 #include <senf/Scheduler/ClockService.hh>
36 #include <senf/Scheduler/TimerEvent.hh>
37 #include "Events.hh"
38
39 //#include "IntervalTimer.mpp"
40 //-/////////////////////////////////////////////////////////////////////////////////////////////////
41
42 namespace senf {
43 namespace ppi {
44
45     /** \brief IntervalTimer event information
46
47         Information passed to the IntervalTimer event handler
48      */
49     struct IntervalTimerEventInfo
50     {
51         ClockService::clock_type expected; ///< Scheduled event time
52         ClockService::clock_type intervalStart; ///< Start of the current time interval
53         unsigned number;                ///< Number of the current event within the interval
54     };
55
56     /** \brief High precision regularly signaled event.
57
58         An IntervalTimer signals an event \a eventsPerInterval times each \a interval
59         nanoseconds. The event counter and timer are reset, whenever the event is disabled.
60
61         \see IntervalTimerEventInfo
62
63         \ingroup event_group
64       */
65     class IntervalTimer
66         : public EventImplementation<IntervalTimerEventInfo>
67     {
68     public:
69         //-////////////////////////////////////////////////////////////////////////
70         ///\name Structors and default members
71         //\{
72
73         explicit IntervalTimer(ClockService::clock_type interval,
74                                unsigned eventsPerInterval=1);
75         IntervalTimer();
76
77         //\}
78         //-////////////////////////////////////////////////////////////////////////
79
80         void interval(ClockService::clock_type interval, unsigned eventsPerInterval=1);
81         std::pair<ClockService::clock_type, unsigned> interval() const;
82
83     protected:
84
85     private:
86         virtual void v_enable();
87         virtual void v_disable();
88
89         void schedule();
90         void cb();
91
92         ClockService::clock_type interval_;
93         unsigned eventsPerInterval_;
94         IntervalTimerEventInfo info_;
95         scheduler::TimerEvent timer_;
96     };
97
98 }}
99
100 //-/////////////////////////////////////////////////////////////////////////////////////////////////
101 #include "IntervalTimer.cci"
102 //#include "IntervalTimer.ct"
103 //#include "IntervalTimer.cti"
104 #endif
105
106 \f
107 // Local Variables:
108 // mode: c++
109 // fill-column: 100
110 // comment-column: 40
111 // c-file-style: "senf"
112 // indent-tabs-mode: nil
113 // ispell-local-dictionary: "american"
114 // compile-command: "scons -u test"
115 // End: