summaryrefslogtreecommitdiff
path: root/src/components
diff options
context:
space:
mode:
Diffstat (limited to 'src/components')
-rw-r--r--src/components/timer/TimerController.cpp62
-rw-r--r--src/components/timer/TimerController.h26
2 files changed, 27 insertions, 61 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<Pinetime::Controllers::TimerController*> (p_context);
- if(controller != nullptr)
- controller->OnTimerEnd();
- }
+void TimerCallback(TimerHandle_t xTimer) {
+ auto* controller = static_cast<TimerController*>(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<TickType_t>(deltaTicks) / static_cast<TickType_t>(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 <cstdint>
-#include "app_timer.h"
-#include "portmacro_cmsis.h"
+#include <FreeRTOS.h>
+#include <timers.h>
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
+}