aboutsummaryrefslogtreecommitdiffstats
path: root/src/components
diff options
context:
space:
mode:
Diffstat (limited to 'src/components')
-rw-r--r--src/components/stopwatch/StopWatchController.cpp43
-rw-r--r--src/components/stopwatch/StopWatchController.h19
2 files changed, 19 insertions, 43 deletions
diff --git a/src/components/stopwatch/StopWatchController.cpp b/src/components/stopwatch/StopWatchController.cpp
index 200919f4..f9709e6b 100644
--- a/src/components/stopwatch/StopWatchController.cpp
+++ b/src/components/stopwatch/StopWatchController.cpp
@@ -2,20 +2,6 @@
using namespace Pinetime::Controllers;
-namespace {
- TickType_t CalculateDelta(const TickType_t startTime, const TickType_t currentTime) {
- TickType_t delta = 0;
- // Take care of overflow
- if (startTime > currentTime) {
- delta = 0xffffffff - startTime;
- delta += (currentTime + 1);
- } else {
- delta = currentTime - startTime;
- }
- return delta;
- }
-}
-
StopWatchController::StopWatchController() {
Clear();
}
@@ -29,14 +15,14 @@ void StopWatchController::Start() {
void StopWatchController::Pause() {
currentState = StopWatchStates::Paused;
- timeElapsedPreviously += CalculateDelta(startTime, xTaskGetTickCount());
+ timeElapsedPreviously += xTaskGetTickCount() - startTime;
}
void StopWatchController::Clear() {
currentState = StopWatchStates::Cleared;
timeElapsedPreviously = 0;
- for (int i = 0; i < LAP_CAPACITY; i++) {
+ for (int i = 0; i < lapCapacity; i++) {
laps[i].count = 0;
laps[i].time = 0;
}
@@ -51,14 +37,7 @@ void StopWatchController::PushLap() {
laps[lapHead].time = lapEnd;
laps[lapHead].count = lapCount + 1;
lapCount += 1;
- lapHead = lapCount % LAP_CAPACITY;
-}
-
-int StopWatchController::GetLapNum() {
- if (lapCount < LAP_CAPACITY)
- return lapCount;
- else
- return LAP_CAPACITY;
+ lapHead = lapCount % lapCapacity;
}
int StopWatchController::GetLapCount() {
@@ -66,17 +45,17 @@ int StopWatchController::GetLapCount() {
}
int Wrap(int index) {
- return ((index % LAP_CAPACITY) + LAP_CAPACITY) % LAP_CAPACITY;
+ return ((index % lapCapacity) + lapCapacity) % lapCapacity;
}
-LapInfo* StopWatchController::LastLap(int lap) {
- if (lap >= LAP_CAPACITY || lap > lapCount || lapCount == 0) {
- // Return "empty" LapInfo_t
- return &emptyLapInfo;
+std::optional<LapInfo> StopWatchController::LastLap(int lap) {
+ if (lap >= lapCapacity || lap >= lapCount) {
+ return {};
}
// Index backwards
- int index = Wrap(lapHead - lap);
- return &laps[index];
+ int mostRecentLap = lapHead - 1;
+ int index = Wrap(mostRecentLap - lap);
+ return laps[index];
}
// Data / State acess
@@ -85,7 +64,7 @@ TickType_t StopWatchController::GetElapsedTime() {
if (!IsRunning()) {
return timeElapsedPreviously;
}
- return timeElapsedPreviously + CalculateDelta(startTime, xTaskGetTickCount());
+ return timeElapsedPreviously + (xTaskGetTickCount() - startTime);
}
bool StopWatchController::IsRunning() {
diff --git a/src/components/stopwatch/StopWatchController.h b/src/components/stopwatch/StopWatchController.h
index 0aaeb5ca..c549a71e 100644
--- a/src/components/stopwatch/StopWatchController.h
+++ b/src/components/stopwatch/StopWatchController.h
@@ -1,10 +1,9 @@
#pragma once
#include <FreeRTOS.h>
+#include <optional>
#include <timers.h>
-#define LAP_CAPACITY 2
-
namespace Pinetime {
namespace System {
class SystemTask;
@@ -18,6 +17,8 @@ namespace Pinetime {
TickType_t time = 0; // Delta time from beginning of stopwatch
};
+ constexpr int lapCapacity = 2;
+
class StopWatchController {
public:
StopWatchController();
@@ -34,22 +35,17 @@ namespace Pinetime {
/// Only the latest laps are stored, the lap count is saved until reset
void PushLap();
- /// Returns actual count of stored laps
- int GetLapNum();
-
/// Returns lapCount
int GetLapCount();
/// Indexes into lap history, with 0 being the latest lap.
- /// If the lap is unavailable, count and time will be 0. If there is a
- /// real value, count should be above 0
- LapInfo* LastLap(int lap = 0);
+ std::optional<LapInfo> LastLap(int lap = 0);
bool IsRunning();
bool IsCleared();
bool IsPaused();
- private:
+ // private:
// Current state of stopwatch
StopWatchStates currentState = StopWatchStates::Cleared;
// Start time of current duration
@@ -57,9 +53,10 @@ namespace Pinetime {
// How much time was elapsed before current duration
TickType_t timeElapsedPreviously = 0;
// Stores lap times
- LapInfo laps[LAP_CAPACITY];
- LapInfo emptyLapInfo = {.count = 0, .time = 0};
+ LapInfo laps[lapCapacity];
+ // Total lap count; may exceed lapCapacity
int lapCount = 0;
+ // Index for next lap time; must be lower than lapCapacity
int lapHead = 0;
};
}