Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
62 changes: 16 additions & 46 deletions src/components/timer/TimerController.cpp
Original file line number Diff line number Diff line change
@@ -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);
}
26 changes: 11 additions & 15 deletions src/components/timer/TimerController.h
Original file line number Diff line number Diff line change
@@ -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;
};
}
}
}
5 changes: 2 additions & 3 deletions src/systemtask/SystemTask.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@
#include <hal/nrf_rtc.h>
#include <libraries/gpiote/app_gpiote.h>
#include <libraries/log/nrf_log.h>

#include <app_timer.h>
#include "BootloaderVersion.h"
#include "components/battery/BatteryController.h"
#include "components/ble/BleController.h"
Expand Down Expand Up @@ -151,8 +151,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...
Expand Down