CppTimer
Loading...
Searching...
No Matches
CppTimer.h
1#ifndef __CPP_TIMER_H_
2#define __CPP_TIMER_H_
3
13#include <stdlib.h>
14#include <unistd.h>
15#include <stdio.h>
16#include <time.h>
17#include <thread>
18#include <sys/timerfd.h>
19
23enum cppTimerType_t
24{
25 PERIODIC,
26 ONESHOT
27};
28
34{
35
36public:
46 virtual void startns(long nanosecs, cppTimerType_t t = PERIODIC) {
47 if (uthread.joinable()) uthread.join();
48 if (running) return;
49 timerType = t;
50 if (fd < 0)
51 throw("Could not start timer");
52 switch (timerType)
53 {
54 case (PERIODIC):
55 //starts after specified period of nanoseconds
56 its.it_value.tv_sec = nanosecs / 1000000000;
57 its.it_value.tv_nsec = nanosecs % 1000000000;
58 its.it_interval.tv_sec = nanosecs / 1000000000;
59 its.it_interval.tv_nsec = nanosecs % 1000000000;
60 break;
61 case (ONESHOT):
62 //fires once after specified period of nanoseconds
63 its.it_value.tv_sec = nanosecs / 1000000000;
64 its.it_value.tv_nsec = nanosecs % 1000000000;
65 its.it_interval.tv_sec = 0;
66 its.it_interval.tv_nsec = 0;
67 break;
68 }
69 if (timerfd_settime(fd, 0, &its, NULL) == -1)
70 throw("Could not start timer");
71 uthread = std::thread(&CppTimer::worker,this);
72 }
73
83 virtual void startms(long millisecs, cppTimerType_t t = PERIODIC) {
84 if (uthread.joinable()) uthread.join();
85 if (running) return;
86 timerType = t;
87 if (fd < 0)
88 throw("Could not start timer");
89 switch (timerType)
90 {
91 case (PERIODIC):
92 //starts after specified period of milliseconds
93 its.it_value.tv_sec = millisecs / 1000;
94 its.it_value.tv_nsec = (millisecs % 1000) * 1000000;
95 its.it_interval.tv_sec = millisecs / 1000;
96 its.it_interval.tv_nsec = (millisecs % 1000) * 1000000;
97 break;
98 case (ONESHOT):
99 //fires once after specified period of milliseconds
100 its.it_value.tv_sec = millisecs / 1000;
101 its.it_value.tv_nsec = (millisecs % 1000) * 1000000;
102 its.it_interval.tv_sec = 0;
103 its.it_interval.tv_nsec = 0;
104 break;
105 }
106 if (timerfd_settime(fd, 0, &its, NULL) == -1)
107 throw("Could not start timer");
108 uthread = std::thread(&CppTimer::worker,this);
109 }
110
115 virtual void stop() {
116 running = false;
117 if (uthread.joinable()) uthread.join();
118 }
119
124 virtual ~CppTimer() {
125 stop();
126 close(fd);
127 }
128
129protected:
134 virtual void timerEvent() = 0;
135
136private:
137 cppTimerType_t timerType;
138 const int fd = timerfd_create(CLOCK_MONOTONIC, 0);
139 struct itimerspec its;
140 bool running = false;
141 std::thread uthread;
142 void worker() {
143 running = true;
144 while (running) {
145 uint64_t exp;
146 const long int s = read(fd, &exp, sizeof(uint64_t));
147 if (s != sizeof(uint64_t) ) {
148 throw "Timer didn't work.";
149 }
150 timerEvent();
151 if (ONESHOT == timerType) running = false;
152 }
153 // disarm
154 struct itimerspec itsnew;
155 itsnew.it_value.tv_sec = 0;
156 itsnew.it_value.tv_nsec = 0;
157 itsnew.it_interval.tv_sec = 0;
158 itsnew.it_interval.tv_nsec = 0;
159 timerfd_settime(fd, 0, &itsnew, &its);
160 }
161};
162
163#endif
Definition CppTimer.h:34
virtual ~CppTimer()
Definition CppTimer.h:124
virtual void startms(long millisecs, cppTimerType_t t=PERIODIC)
Definition CppTimer.h:83
virtual void stop()
Definition CppTimer.h:115
virtual void timerEvent()=0
virtual void startns(long nanosecs, cppTimerType_t t=PERIODIC)
Definition CppTimer.h:46