From b7b1af1c4c3c21f62bf9627d39a37924be541c16 Mon Sep 17 00:00:00 2001 From: Riku Isokoski Date: Sat, 17 Jul 2021 11:59:19 +0300 Subject: [PATCH] Replace app_timer with FreeRTOS timers --- src/components/timer/TimerController.cpp | 62 ++++++------------------ src/components/timer/TimerController.h | 26 +++++----- src/systemtask/SystemTask.cpp | 5 +- 3 files changed, 29 insertions(+), 64 deletions(-) diff --git a/src/components/timer/TimerController.cpp b/src/components/timer/TimerController.cpp index 79e44d6f..92f4e69f 100644 --- a/src/components/timer/TimerController.cpp +++ b/src/components/timer/TimerController.cpp @@ -1,69 +1,39 @@ -// -// Created by florian on 16.05.21. -// - #include "components/timer/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 (p_context); - if(controller != nullptr) - controller->OnTimerEnd(); - } +void TimerCallback(TimerHandle_t xTimer) { + auto* controller = static_cast(pvTimerGetTimerID(xTimer)); + controller->OnTimerEnd(); } - -void TimerController::Init() { - app_timer_create(&timerAppTimer, APP_TIMER_MODE_SINGLE_SHOT, TimerEnd); +void TimerController::Init(Pinetime::System::SystemTask* systemTask) { + this->systemTask = systemTask; + timer = xTimerCreate("Timer", 0, pdFALSE, this, TimerCallback); } 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; + xTimerChangePeriod(timer, pdMS_TO_TICKS(duration), 0); + xTimerStart(timer, 0); } uint32_t TimerController::GetTimeRemaining() { - if (!timerRunning) { - return 0; + if (IsRunning()) { + TickType_t remainingTime = xTimerGetExpiryTime(timer) - xTaskGetTickCount(); + return (remainingTime * 1000 / configTICK_RATE_HZ); } - auto currentTicks = xTaskGetTickCount(); - - TickType_t deltaTicks = 0; - if (currentTicks > endTicks) { - deltaTicks = 0xffffffff - currentTicks; - deltaTicks += (endTicks + 1); - } else { - deltaTicks = endTicks - currentTicks; - } - - return (static_cast(deltaTicks) / static_cast(configTICK_RATE_HZ)) * 1000; + return 0; } void TimerController::StopTimer() { - app_timer_stop(timerAppTimer); - timerRunning = false; + xTimerStop(timer, 0); } bool TimerController::IsRunning() { - return timerRunning; -} -void TimerController::OnTimerEnd() { - timerRunning = false; - if(systemTask != nullptr) - systemTask->PushMessage(System::Messages::OnTimerDone); + return (xTimerIsTimerActive(timer) == pdTRUE); } -void TimerController::Register(Pinetime::System::SystemTask* systemTask) { - this->systemTask = systemTask; +void TimerController::OnTimerEnd() { + systemTask->PushMessage(System::Messages::OnTimerDone); } diff --git a/src/components/timer/TimerController.h b/src/components/timer/TimerController.h index fa7bc90d..93d8afc6 100644 --- a/src/components/timer/TimerController.h +++ b/src/components/timer/TimerController.h @@ -1,37 +1,33 @@ #pragma once -#include -#include "app_timer.h" -#include "portmacro_cmsis.h" +#include +#include namespace Pinetime { namespace System { class SystemTask; } namespace Controllers { - + class TimerController { public: TimerController() = default; - - void Init(); - + + void Init(System::SystemTask* systemTask); + void StartTimer(uint32_t duration); - + void StopTimer(); - + uint32_t GetTimeRemaining(); - + bool IsRunning(); void OnTimerEnd(); - void Register(System::SystemTask* systemTask); - private: System::SystemTask* systemTask = nullptr; - TickType_t endTicks; - bool timerRunning = false; + TimerHandle_t timer; }; } -} \ No newline at end of file +} diff --git a/src/systemtask/SystemTask.cpp b/src/systemtask/SystemTask.cpp index 38c728f8..f4eeffc3 100644 --- a/src/systemtask/SystemTask.cpp +++ b/src/systemtask/SystemTask.cpp @@ -2,7 +2,7 @@ #include #include #include - +#include #include "BootloaderVersion.h" #include "components/battery/BatteryController.h" #include "components/ble/BleController.h" @@ -152,8 +152,7 @@ void SystemTask::Work() { batteryController.Register(this); motorController.Init(); motionSensor.SoftReset(); - timerController.Register(this); - timerController.Init(); + timerController.Init(this); alarmController.Init(this); // Reset the TWI device because the motion sensor chip most probably crashed it...