////////////////////////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////////////////////////// #include #include "datalogger.h" ////////////////////////////////////////////////////////////////////////////////// CDataLoggerClock::CDataLoggerClock(unsigned long long nSampleTimeNs) : m_nSampleTimeNs(nSampleTimeNs) { m_fSleepStarted = false; } CDataLoggerClock::~CDataLoggerClock(void) { } ////////////////////////////////////////////////////////////////////////////////// unsigned long long CDataLoggerClock::GetNanoTick(struct timespec *pts) { struct timespec ts; if(!pts) pts = &ts; clock_gettime(CLOCK_MONOTONIC, pts); return Timespec2NanoSec(pts); } bool CDataLoggerClock::Sleep(bool &bTimerUnderrun, bool fAvoidCatchUpRaceOnTimerUnderrun) { int nRet; unsigned long long dt; if(!m_fSleepStarted) { clock_gettime(CLOCK_MONOTONIC, &m_tsDueTime); m_fSleepStarted = true; return true; } dt = IncTime(&m_tsDueTime, m_nSampleTimeNs); if(fAvoidCatchUpRaceOnTimerUnderrun) { if(dt < GetNanoTick()) { bTimerUnderrun = true; clock_gettime(CLOCK_MONOTONIC, &m_tsDueTime); return true; } } if((nRet = clock_nanosleep(CLOCK_MONOTONIC, TIMER_ABSTIME, &m_tsDueTime, NULL))) { while(nRet && (errno == EINTR)) { errno = 0; nRet = clock_nanosleep(CLOCK_MONOTONIC, TIMER_ABSTIME, &m_tsDueTime, NULL); } } return !nRet; }