Browse Source
Add a general purpose timer for different time granularities (seconds, milliseconds, microseconds and nanoseconds).
1.0.2
Add a general purpose timer for different time granularities (seconds, milliseconds, microseconds and nanoseconds).
1.0.2
7 changed files with 214 additions and 0 deletions
-
1include/Makefile.am
-
57include/tr/timer.h
-
1include/trbase.h
-
3src/Makefile.am
-
44src/timer.c
-
70src/timer_get.c
-
38src/timer_set.c
@ -0,0 +1,57 @@ |
|||
/** |
|||
* \file |
|||
* A timer with second, millisec, microsec or nanosec granularity. |
|||
* |
|||
* \author Georg Hopp |
|||
* |
|||
* \copyright |
|||
* Copyright © 2014 Georg Hopp |
|||
* |
|||
* This program is free software: you can redistribute it and/or modify |
|||
* it under the terms of the GNU General Public License as published by |
|||
* the Free Software Foundation, either version 3 of the License, or |
|||
* (at your option) any later version. |
|||
* |
|||
* This program is distributed in the hope that it will be useful, |
|||
* but WITHOUT ANY WARRANTY; without even the implied warranty of |
|||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
|||
* GNU General Public License for more details. |
|||
* |
|||
* You should have received a copy of the GNU General Public License |
|||
* along with this program. If not, see <http://www.gnu.org/licenses/>. |
|||
*/ |
|||
|
|||
#ifndef __TR_TIMER_H__ |
|||
#define __TR_TIMER_H__ |
|||
|
|||
#include "trbase.h" |
|||
|
|||
typedef enum { |
|||
TR_TBASE_NAN = 0, |
|||
TR_TBASE_MIC, |
|||
TR_TBASE_MIL, |
|||
TR_TBASE_SEC |
|||
} TR_eTimeoutBase; |
|||
|
|||
TR_CLASS(TR_Timer) { |
|||
int sec; |
|||
int nsec; |
|||
TR_eTimeoutBase base; |
|||
unsigned long timeout; |
|||
}; |
|||
|
|||
TR_INSTANCE_INIT(TR_Timer); |
|||
TR_CLASSVARS_DECL(TR_Timer) {}; |
|||
|
|||
void TR_timerSet(TR_Timer, TR_eTimeoutBase, unsigned long); |
|||
unsigned long TR_timerGet(TR_Timer, unsigned long *); // 2nd arg gets amount of |
|||
// missed since last check. |
|||
|
|||
#define TR_timerSetNan(timer, val) (TR_timerSet((timer), TR_TBASE_NAN, (val))) |
|||
#define TR_timerSetMic(timer, val) (TR_timerSet((timer), TR_TBASE_MIC, (val))) |
|||
#define TR_timerSetMil(timer, val) (TR_timerSet((timer), TR_TBASE_MIL, (val))) |
|||
#define TR_timerSetSec(timer, val) (TR_timerSet((timer), TR_TBASE_SEC, (val))) |
|||
|
|||
#endif // __TR_TIMER_H__ |
|||
|
|||
// vim: set ts=4 sw=4: |
|||
@ -0,0 +1,44 @@ |
|||
/** |
|||
* \file |
|||
* |
|||
* \author Georg Hopp |
|||
* |
|||
* \copyright |
|||
* Copyright © 2014 Georg Hopp |
|||
* |
|||
* This program is free software: you can redistribute it and/or modify |
|||
* it under the terms of the GNU General Public License as published by |
|||
* the Free Software Foundation, either version 3 of the License, or |
|||
* (at your option) any later version. |
|||
* |
|||
* This program is distributed in the hope that it will be useful, |
|||
* but WITHOUT ANY WARRANTY; without even the implied warranty of |
|||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
|||
* GNU General Public License for more details. |
|||
* |
|||
* You should have received a copy of the GNU General Public License |
|||
* along with this program. If not, see <http://www.gnu.org/licenses/>. |
|||
*/ |
|||
|
|||
#include <stdarg.h> |
|||
|
|||
#include "trbase.h" |
|||
|
|||
static |
|||
int |
|||
timerCtor(void * _this, va_list * params) |
|||
{ |
|||
TR_eTimeoutBase base = va_arg(*params, TR_eTimeoutBase); |
|||
unsigned long timeout = va_arg(*params, unsigned long); |
|||
|
|||
TR_timerSet((TR_Timer)_this, base, timeout); |
|||
|
|||
return 0; |
|||
} |
|||
|
|||
static void timerDtor(void * _this) {} |
|||
|
|||
TR_INIT_IFACE(TR_Class, timerCtor, timerDtor, NULL); |
|||
TR_CREATE_CLASS(TR_Timer, NULL, NULL, TR_IF(TR_Class)); |
|||
|
|||
// vim: set ts=4 sw=4: |
|||
@ -0,0 +1,70 @@ |
|||
/** |
|||
* \file |
|||
* |
|||
* \author Georg Hopp |
|||
* |
|||
* \copyright |
|||
* Copyright © 2014 Georg Hopp |
|||
* |
|||
* This program is free software: you can redistribute it and/or modify |
|||
* it under the terms of the GNU General Public License as published by |
|||
* the Free Software Foundation, either version 3 of the License, or |
|||
* (at your option) any later version. |
|||
* |
|||
* This program is distributed in the hope that it will be useful, |
|||
* but WITHOUT ANY WARRANTY; without even the implied warranty of |
|||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
|||
* GNU General Public License for more details. |
|||
* |
|||
* You should have received a copy of the GNU General Public License |
|||
* along with this program. If not, see <http://www.gnu.org/licenses/>. |
|||
*/ |
|||
|
|||
#include <time.h> |
|||
#include <limits.h> |
|||
|
|||
#include "trbase.h" |
|||
|
|||
unsigned long |
|||
TR_timerGet(TR_Timer this, unsigned long * missed) |
|||
{ |
|||
struct timespec now; |
|||
unsigned long long elapsed; |
|||
unsigned long sec_factor; |
|||
long nan_factor; |
|||
unsigned long _missed; |
|||
|
|||
clock_gettime(CLOCK_REALTIME, &now); |
|||
|
|||
switch (this->base) { |
|||
case TR_TBASE_NAN: |
|||
sec_factor = 1000 * 1000 * 1000; |
|||
break; |
|||
case TR_TBASE_MIC: |
|||
sec_factor = 1000 * 1000; |
|||
break; |
|||
case TR_TBASE_MIL: |
|||
sec_factor = 1000; |
|||
break; |
|||
case TR_TBASE_SEC: |
|||
sec_factor = 1; |
|||
break; |
|||
} |
|||
|
|||
nan_factor = 1000 * 1000 * 1000 / sec_factor; |
|||
elapsed = (now.tv_sec - this->sec) * sec_factor |
|||
+ (now.tv_nsec - this->nsec) / nan_factor; |
|||
|
|||
_missed = elapsed / this->timeout; |
|||
if (_missed) { |
|||
this->sec += _missed * this->timeout * sec_factor / nan_factor; |
|||
this->nsec += _missed * this->timeout * sec_factor % nan_factor; |
|||
*missed = _missed; |
|||
} else { |
|||
*missed = 0; |
|||
} |
|||
|
|||
return this->timeout - (elapsed % this->timeout); |
|||
} |
|||
|
|||
// vim: set ts=4 sw=4: |
|||
@ -0,0 +1,38 @@ |
|||
/** |
|||
* \file |
|||
* |
|||
* \author Georg Hopp |
|||
* |
|||
* \copyright |
|||
* Copyright © 2014 Georg Hopp |
|||
* |
|||
* This program is free software: you can redistribute it and/or modify |
|||
* it under the terms of the GNU General Public License as published by |
|||
* the Free Software Foundation, either version 3 of the License, or |
|||
* (at your option) any later version. |
|||
* |
|||
* This program is distributed in the hope that it will be useful, |
|||
* but WITHOUT ANY WARRANTY; without even the implied warranty of |
|||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
|||
* GNU General Public License for more details. |
|||
* |
|||
* You should have received a copy of the GNU General Public License |
|||
* along with this program. If not, see <http://www.gnu.org/licenses/>. |
|||
*/ |
|||
|
|||
#include <time.h> |
|||
|
|||
#include "trbase.h" |
|||
|
|||
void |
|||
TR_timerSet(TR_Timer this, TR_eTimeoutBase base, unsigned long timeout) |
|||
{ |
|||
struct timespec set; |
|||
clock_gettime(CLOCK_REALTIME, &set); |
|||
this->sec = set.tv_sec; |
|||
this->nsec = set.tv_nsec; |
|||
this->base = base; |
|||
this->timeout = timeout; |
|||
} |
|||
|
|||
// vim: set ts=4 sw=4: |
|||
Write
Preview
Loading…
Cancel
Save
Reference in new issue