diff options
Diffstat (limited to 'src/components/timer/Timer.cpp')
| -rw-r--r-- | src/components/timer/Timer.cpp | 23 |
1 files changed, 19 insertions, 4 deletions
diff --git a/src/components/timer/Timer.cpp b/src/components/timer/Timer.cpp index 279178cd..4784cdb2 100644 --- a/src/components/timer/Timer.cpp +++ b/src/components/timer/Timer.cpp @@ -9,18 +9,33 @@ Timer::Timer(void* const timerData, TimerCallbackFunction_t timerCallbackFunctio void Timer::StartTimer(std::chrono::milliseconds duration) { xTimerChangePeriod(timer, pdMS_TO_TICKS(duration.count()), 0); xTimerStart(timer, 0); + expiry = xTimerGetExpiryTime(timer); + triggered = true; } -std::chrono::milliseconds Timer::GetTimeRemaining() { +// nullopt if timer stopped (StopTimer called / StartTimer not yet called) +// otherwise TimerStatus with the ticks until/since expiry (depending on state of expired flag) +std::optional<Timer::TimerStatus> Timer::GetTimerState() { if (IsRunning()) { - TickType_t remainingTime = xTimerGetExpiryTime(timer) - xTaskGetTickCount(); - return std::chrono::milliseconds(remainingTime * 1000 / configTICK_RATE_HZ); + TickType_t remainingTime = expiry - xTaskGetTickCount(); + return std::make_optional<Timer::TimerStatus>( + {.distanceToExpiry = std::chrono::seconds(remainingTime / configTICK_RATE_HZ) + + std::chrono::milliseconds((remainingTime % configTICK_RATE_HZ) * 1000 / configTICK_RATE_HZ), + .expired = false}); } - return std::chrono::milliseconds(0); + if (triggered) { + TickType_t timeSinceExpiry = xTaskGetTickCount() - expiry; + return std::make_optional<Timer::TimerStatus>( + {.distanceToExpiry = std::chrono::seconds(timeSinceExpiry / configTICK_RATE_HZ) + + std::chrono::milliseconds((timeSinceExpiry % configTICK_RATE_HZ) * 1000 / configTICK_RATE_HZ), + .expired = true}); + } + return std::nullopt; } void Timer::StopTimer() { xTimerStop(timer, 0); + triggered = false; } bool Timer::IsRunning() { |
