dataloggerclock.cpp 1.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263
  1. //////////////////////////////////////////////////////////////////////////////////
  2. //////////////////////////////////////////////////////////////////////////////////
  3. #include <errno.h>
  4. #include "datalogger.h"
  5. //////////////////////////////////////////////////////////////////////////////////
  6. CDataLoggerClock::CDataLoggerClock(unsigned long long nSampleTimeNs) : m_nSampleTimeNs(nSampleTimeNs)
  7. {
  8. m_fSleepStarted = false;
  9. }
  10. CDataLoggerClock::~CDataLoggerClock(void)
  11. {
  12. }
  13. //////////////////////////////////////////////////////////////////////////////////
  14. unsigned long long CDataLoggerClock::GetNanoTick(struct timespec *pts)
  15. {
  16. struct timespec ts;
  17. if(!pts)
  18. pts = &ts;
  19. clock_gettime(CLOCK_MONOTONIC, pts);
  20. return Timespec2NanoSec(pts);
  21. }
  22. bool CDataLoggerClock::Sleep(bool &bTimerUnderrun, bool fAvoidCatchUpRaceOnTimerUnderrun)
  23. {
  24. int nRet;
  25. unsigned long long dt;
  26. if(!m_fSleepStarted)
  27. {
  28. clock_gettime(CLOCK_MONOTONIC, &m_tsDueTime);
  29. m_fSleepStarted = true;
  30. return true;
  31. }
  32. dt = IncTime(&m_tsDueTime, m_nSampleTimeNs);
  33. if(fAvoidCatchUpRaceOnTimerUnderrun)
  34. {
  35. if(dt < GetNanoTick())
  36. {
  37. bTimerUnderrun = true;
  38. clock_gettime(CLOCK_MONOTONIC, &m_tsDueTime);
  39. return true;
  40. }
  41. }
  42. if((nRet = clock_nanosleep(CLOCK_MONOTONIC, TIMER_ABSTIME, &m_tsDueTime, NULL)))
  43. {
  44. while(nRet && (errno == EINTR))
  45. {
  46. errno = 0;
  47. nRet = clock_nanosleep(CLOCK_MONOTONIC, TIMER_ABSTIME, &m_tsDueTime, NULL);
  48. }
  49. }
  50. return !nRet;
  51. }