#include "fsfw/timemanager/Countdown.h" #include "fsfw/globalfunctions/timevalOperations.h" Countdown::Countdown(uint32_t initialTimeout, bool startImmediately) { if (startImmediately) { setTimeout(initialTimeout); } else { timeout.tv_sec = initialTimeout / 1000; timeout.tv_usec = (initialTimeout % 1000) * 1000; } } Countdown::~Countdown() = default; ReturnValue_t Countdown::setTimeout(uint32_t milliseconds) { timeout.tv_sec = milliseconds / 1000; timeout.tv_usec = (milliseconds % 1000) * 1000; return Clock::getClock_timeval(&startTime); } bool Countdown::hasTimedOut() const { // Account for system clock going back in time. if (getCurrentTime() < startTime) { return true; } if (getCurrentTime() - startTime >= timeout) { return true; } return false; } bool Countdown::isBusy() const { return !hasTimedOut(); } ReturnValue_t Countdown::resetTimer() { return setTimeoutTv(timeout); } void Countdown::timeOut() { startTime = this->getCurrentTime() - timeout; } uint32_t Countdown::getRemainingMillis() const { if (this->hasTimedOut()) { return 0; } timeval remainingMillisTv = (startTime + timeout) - this->getCurrentTime(); return remainingMillisTv.tv_sec * 1000 + remainingMillisTv.tv_usec / 1000; } uint32_t Countdown::timevalToMs(timeval &tv) { return tv.tv_sec * 1000 + tv.tv_usec / 1000; } ReturnValue_t Countdown::setTimeoutTv(timeval tv) { timeout = tv; return Clock::getClock_timeval(&startTime); } uint32_t Countdown::getTimeoutMs() const { return timeout.tv_sec * 1000 + timeout.tv_usec / 1000; } timeval Countdown::getTimeout() const { return timeout; } timeval Countdown::getCurrentTime() const { timeval currentTime{}; Clock::getClock_timeval(¤tTime); return currentTime; }