summaryrefslogtreecommitdiff
path: root/gr-qtgui/lib/highResTimeFunctions.h
diff options
context:
space:
mode:
authorNick Foster2011-04-13 17:18:14 -0700
committerNick Foster2011-04-13 17:18:14 -0700
commit9b7d444aaebbe0708e9703bce30c63b63bc81825 (patch)
tree29121aa250decfb1ed9ca7876e1857eec8779d83 /gr-qtgui/lib/highResTimeFunctions.h
parent258186d5ca2e811ced7ea637fd16e3ed3bb5573e (diff)
parente8ff9ef4bb77517428e1208ff4b3551a38107bbd (diff)
downloadgnuradio-9b7d444aaebbe0708e9703bce30c63b63bc81825.tar.gz
gnuradio-9b7d444aaebbe0708e9703bce30c63b63bc81825.tar.bz2
gnuradio-9b7d444aaebbe0708e9703bce30c63b63bc81825.zip
Merge branch 'master' of http://gnuradio.org/git/gnuradio into cpuid
Conflicts: volk/Makefile.common volk/lib/qa_utils.cc
Diffstat (limited to 'gr-qtgui/lib/highResTimeFunctions.h')
-rw-r--r--gr-qtgui/lib/highResTimeFunctions.h299
1 files changed, 299 insertions, 0 deletions
diff --git a/gr-qtgui/lib/highResTimeFunctions.h b/gr-qtgui/lib/highResTimeFunctions.h
new file mode 100644
index 000000000..251bbad8b
--- /dev/null
+++ b/gr-qtgui/lib/highResTimeFunctions.h
@@ -0,0 +1,299 @@
+#ifndef HIGH_RES_TIME_FUNCTIONS_H
+#define HIGH_RES_TIME_FUNCTIONS_H
+
+#include <ctime>
+#include <sys/time.h>
+#include <cmath>
+/* Requires the librt and libm libraries */
+
+static const long NSEC_PER_SEC = 1000000000L;
+
+static inline bool
+timespec_greater(const struct timespec* t1,
+ const struct timespec* t0)
+{
+ return ((t1->tv_sec > t0->tv_sec) ||
+ ((t1->tv_sec == t0->tv_sec) &&
+ (t1->tv_nsec > t0->tv_nsec)));
+}
+
+static inline bool
+timespec_greater(const struct timespec t1,
+ const struct timespec t0)
+{
+ return ((t1.tv_sec > t0.tv_sec) ||
+ ((t1.tv_sec == t0.tv_sec) &&
+ (t1.tv_nsec > t0.tv_nsec)));
+}
+
+static inline bool
+timespec_less(const struct timespec* t1,
+ const struct timespec* t0)
+{
+ return ((t1->tv_sec < t0->tv_sec) ||
+ ((t1->tv_sec == t0->tv_sec) &&
+ (t1->tv_nsec < t0->tv_nsec)));
+}
+
+static inline bool
+timespec_less(const struct timespec t1,
+ const struct timespec t0)
+{
+ return ((t1.tv_sec < t0.tv_sec) ||
+ ((t1.tv_sec == t0.tv_sec) &&
+ (t1.tv_nsec < t0.tv_nsec)));
+}
+
+static inline bool
+timespec_equal(const struct timespec* t1,
+ const struct timespec* t0)
+{
+ return ((t1->tv_sec == t0->tv_sec) &&
+ (t1->tv_nsec == t0->tv_nsec));
+}
+
+static inline bool
+timespec_equal(const struct timespec t1,
+ const struct timespec t0)
+{
+ return ((t1.tv_sec == t0.tv_sec) &&
+ (t1.tv_nsec == t0.tv_nsec));
+}
+
+static inline void
+timespec_reset(struct timespec* ret)
+{
+ ret->tv_sec = 0;
+ ret->tv_nsec = 0;
+}
+
+static inline void
+set_normalized_timespec(struct timespec *ts,
+ time_t sec, long nsec)
+{
+ while (nsec > NSEC_PER_SEC) {
+ nsec -= NSEC_PER_SEC;
+ ++sec;
+ }
+ while(nsec < 0) {
+ nsec += NSEC_PER_SEC;
+ --sec;
+ }
+ ts->tv_sec = sec;
+ ts->tv_nsec = nsec;
+}
+
+static inline struct timespec
+convert_to_timespec(const double timeValue)
+{
+ struct timespec ret;
+ double seconds = 0;
+ long nsec = static_cast<long>(modf(timeValue, &seconds) *
+ static_cast<double>(NSEC_PER_SEC));
+ time_t sec = static_cast<time_t>(seconds);
+
+ set_normalized_timespec(&ret, sec, nsec);
+
+ return ret;
+}
+
+static inline double
+convert_from_timespec(const timespec actual)
+{
+ return (static_cast<double>(actual.tv_sec) +
+ (static_cast<double>(actual.tv_nsec) /
+ static_cast<double>(NSEC_PER_SEC)));
+}
+
+static inline void
+timespec_add(struct timespec *ret,
+ const struct timespec* t1,
+ const struct timespec* t0)
+{
+ time_t sec = t1->tv_sec + t0->tv_sec;
+ long nsec = t1->tv_nsec + t0->tv_nsec;
+
+ set_normalized_timespec(ret, sec, nsec);
+}
+
+static inline void
+timespec_add(struct timespec *ret,
+ const struct timespec t1,
+ const struct timespec t0)
+{
+ return timespec_add(ret, &t1, &t0);
+}
+
+static inline struct timespec
+timespec_add(const struct timespec t1,
+ const struct timespec t0)
+{
+ struct timespec ret;
+ timespec_add(&ret, &t1, &t0);
+ return ret;
+}
+
+static inline struct timespec
+timespec_add(const struct timespec t1,
+ const double time0)
+{
+ struct timespec ret;
+ struct timespec t0;
+ t0 = convert_to_timespec(time0);
+
+ timespec_add(&ret, &t1, &t0);
+
+ return ret;
+}
+
+static inline void
+timespec_subtract(struct timespec *ret,
+ const struct timespec* t1,
+ const struct timespec* t0)
+{
+ time_t sec = t1->tv_sec - t0->tv_sec;
+ long nsec = t1->tv_nsec - t0->tv_nsec;
+
+ set_normalized_timespec(ret, sec, nsec);
+}
+
+static inline void
+timespec_subtract(struct timespec *ret,
+ const struct timespec t1,
+ const struct timespec t0)
+{
+ return timespec_subtract(ret, &t1, &t0);
+}
+
+static inline struct timespec
+timespec_subtract(const struct timespec t1,
+ const struct timespec t0)
+{
+ struct timespec ret;
+ timespec_subtract(&ret, &t1, &t0);
+ return ret;
+}
+
+static inline struct timespec
+timespec_subtract(const struct timespec t1,
+ const double time0)
+{
+ struct timespec ret;
+ struct timespec t0;
+ t0 = convert_to_timespec(time0);
+
+ timespec_subtract(&ret, &t1, &t0);
+
+ return ret;
+}
+
+static inline double
+diff_timespec(struct timespec* ret,
+ const struct timespec *t1,
+ const struct timespec* t0)
+{
+ struct timespec actual;
+ time_t sec = 0;
+ long nsec = 0;
+
+ if(timespec_greater(t1, t0)){
+ sec = t1->tv_sec - t0->tv_sec;
+ nsec = t1->tv_nsec - t0->tv_nsec;
+
+ set_normalized_timespec(&actual, sec, nsec);
+
+ if(ret != NULL){
+ ret->tv_sec = actual.tv_sec;
+ ret->tv_nsec = actual.tv_nsec;
+ }
+
+ return convert_from_timespec(actual);
+ }
+ else{
+ sec = t0->tv_sec - t1->tv_sec;
+ nsec = t0->tv_nsec - t1->tv_nsec;
+
+ // Do nothing with the ret value as the ret value
+ // would have to store a negative, which it can't.
+
+ set_normalized_timespec(&actual, sec, nsec);
+
+ return (-convert_from_timespec(actual));
+ }
+}
+
+static inline double
+diff_timespec(struct timespec* ret,
+ const struct timespec t1,
+ const struct timespec t0)
+{
+ return diff_timespec(ret, &t1, &t0);
+}
+
+static inline double
+diff_timespec(const struct timespec t1,
+ const struct timespec t0)
+{
+ return diff_timespec(NULL, &t1, &t0);
+}
+
+
+static inline double
+diff_timespec(const struct timespec* t1,
+ const struct timespec* t0)
+{
+ return diff_timespec(NULL, t1, t0);
+}
+
+
+#ifdef CLOCK_REALTIME
+// If we can use clock_gettime, use it;
+// otherwise, use gettimeofday
+static inline void
+get_highres_clock(struct timespec* ret)
+{
+ if(clock_gettime(CLOCK_REALTIME, ret) != 0){
+ // Unable to get high resolution time -
+ // fail over to low resolution time
+ timeval lowResTime;
+ gettimeofday(&lowResTime, NULL);
+ ret->tv_sec = lowResTime.tv_sec;
+ ret->tv_nsec = lowResTime.tv_usec*1000;
+ }
+}
+
+#else
+
+// Trick timer functions into thinking it has an nsec timer
+// but only use the low resolution (usec) timer.
+static inline void
+get_highres_clock(struct timespec* ret)
+{
+ timeval lowResTime;
+ gettimeofday(&lowResTime, NULL);
+ ret->tv_sec = lowResTime.tv_sec;
+ ret->tv_nsec = lowResTime.tv_usec*1000;
+}
+#endif
+
+static inline struct timespec
+get_highres_clock()
+{
+ struct timespec ret;
+ get_highres_clock(&ret);
+ return ret;
+}
+
+static inline bool
+timespec_empty(const struct timespec* ret)
+{
+ return ( (ret->tv_sec == 0 ) && (ret->tv_nsec == 0) );
+}
+
+static inline bool
+timespec_empty(const struct timespec ret)
+{
+ return timespec_empty(&ret);
+}
+
+#endif /* HIGH_RES_TIME_FUNCTIONS_H */