diff options
| author | Riku Isokoski <riksu9000@gmail.com> | 2021-08-01 08:47:26 (GMT) |
|---|---|---|
| committer | Riku Isokoski <riksu9000@gmail.com> | 2021-08-01 08:47:26 (GMT) |
| commit | 5bdef365f2b8f8e0ba06d04216749205a5bba50d (patch) | |
| tree | b0260cd863c37ca1cee57fd813647706e2d07f77 /src/components/timer/TimerController.cpp | |
| parent | 9e8dd9a1e63523f4e3ed322978e5b5e079c50375 (diff) | |
| parent | 514481ef7f9c71ad816b31d979c6ab39ce9380dd (diff) | |
Merge branch 'develop' into HEAD
Diffstat (limited to 'src/components/timer/TimerController.cpp')
| -rw-r--r-- | src/components/timer/TimerController.cpp | 69 |
1 files changed, 69 insertions, 0 deletions
diff --git a/src/components/timer/TimerController.cpp b/src/components/timer/TimerController.cpp new file mode 100644 index 0000000..8d5f5c3 --- /dev/null +++ b/src/components/timer/TimerController.cpp @@ -0,0 +1,69 @@ +// +// Created by florian on 16.05.21. +// + +#include "TimerController.h" +#include "systemtask/SystemTask.h" +#include "app_timer.h" +#include "task.h" + +using namespace Pinetime::Controllers; + + +APP_TIMER_DEF(timerAppTimer); + +namespace { + void TimerEnd(void* p_context) { + auto* controller = static_cast<Pinetime::Controllers::TimerController*> (p_context); + if(controller != nullptr) + controller->OnTimerEnd(); + } +} + + +void TimerController::Init() { + app_timer_create(&timerAppTimer, APP_TIMER_MODE_SINGLE_SHOT, TimerEnd); +} + +void TimerController::StartTimer(uint32_t duration) { + app_timer_stop(timerAppTimer); + auto currentTicks = xTaskGetTickCount(); + app_timer_start(timerAppTimer, APP_TIMER_TICKS(duration), this); + endTicks = currentTicks + APP_TIMER_TICKS(duration); + timerRunning = true; +} + +uint32_t TimerController::GetTimeRemaining() { + if (!timerRunning) { + return 0; + } + auto currentTicks = xTaskGetTickCount(); + + TickType_t deltaTicks = 0; + if (currentTicks > endTicks) { + deltaTicks = 0xffffffff - currentTicks; + deltaTicks += (endTicks + 1); + } else { + deltaTicks = endTicks - currentTicks; + } + + return (static_cast<TickType_t>(deltaTicks) / static_cast<TickType_t>(configTICK_RATE_HZ)) * 1000; +} + +void TimerController::StopTimer() { + app_timer_stop(timerAppTimer); + timerRunning = false; +} + +bool TimerController::IsRunning() { + return timerRunning; +} +void TimerController::OnTimerEnd() { + timerRunning = false; + if(systemTask != nullptr) + systemTask->PushMessage(System::Messages::OnTimerDone); +} + +void TimerController::Register(Pinetime::System::SystemTask* systemTask) { + this->systemTask = systemTask; +} |
