aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--src/components/stopwatch/StopWatchController.cpp19
-rw-r--r--src/components/stopwatch/StopWatchController.h13
-rw-r--r--src/displayapp/screens/StopWatch.cpp2
3 files changed, 13 insertions, 21 deletions
diff --git a/src/components/stopwatch/StopWatchController.cpp b/src/components/stopwatch/StopWatchController.cpp
index f9709e6b..d8e48588 100644
--- a/src/components/stopwatch/StopWatchController.cpp
+++ b/src/components/stopwatch/StopWatchController.cpp
@@ -27,35 +27,26 @@ void StopWatchController::Clear() {
laps[i].time = 0;
}
lapCount = 0;
- lapHead = 0;
}
// Lap
void StopWatchController::PushLap() {
TickType_t lapEnd = GetElapsedTime();
- laps[lapHead].time = lapEnd;
- laps[lapHead].count = lapCount + 1;
- lapCount += 1;
- lapHead = lapCount % lapCapacity;
+ laps[0].time = lapEnd;
+ laps[0].count = ++lapCount;
+ laps--;
}
int StopWatchController::GetLapCount() {
return lapCount;
}
-int Wrap(int index) {
- return ((index % lapCapacity) + lapCapacity) % lapCapacity;
-}
-
std::optional<LapInfo> StopWatchController::LastLap(int lap) {
- if (lap >= lapCapacity || lap >= lapCount) {
+ if (lap < 0 || lap >= lapCapacity || laps[lap].count == 0) {
return {};
}
- // Index backwards
- int mostRecentLap = lapHead - 1;
- int index = Wrap(mostRecentLap - lap);
- return laps[index];
+ return laps[lap];
}
// Data / State acess
diff --git a/src/components/stopwatch/StopWatchController.h b/src/components/stopwatch/StopWatchController.h
index c549a71e..626f214f 100644
--- a/src/components/stopwatch/StopWatchController.h
+++ b/src/components/stopwatch/StopWatchController.h
@@ -3,6 +3,7 @@
#include <FreeRTOS.h>
#include <optional>
#include <timers.h>
+#include "utility/CircularBuffer.h"
namespace Pinetime {
namespace System {
@@ -17,7 +18,6 @@ namespace Pinetime {
TickType_t time = 0; // Delta time from beginning of stopwatch
};
- constexpr int lapCapacity = 2;
class StopWatchController {
public:
@@ -45,19 +45,20 @@ namespace Pinetime {
bool IsCleared();
bool IsPaused();
- // private:
+ private:
// Current state of stopwatch
StopWatchStates currentState = StopWatchStates::Cleared;
// Start time of current duration
TickType_t startTime = 0;
// How much time was elapsed before current duration
TickType_t timeElapsedPreviously = 0;
- // Stores lap times
- LapInfo laps[lapCapacity];
+
+ // Number of stored laps
+ static constexpr int lapCapacity = 2;
+ // Lap storage
+ Utility::CircularBuffer<LapInfo, lapCapacity> laps;
// Total lap count; may exceed lapCapacity
int lapCount = 0;
- // Index for next lap time; must be lower than lapCapacity
- int lapHead = 0;
};
}
}
diff --git a/src/displayapp/screens/StopWatch.cpp b/src/displayapp/screens/StopWatch.cpp
index b17518d5..cc11f885 100644
--- a/src/displayapp/screens/StopWatch.cpp
+++ b/src/displayapp/screens/StopWatch.cpp
@@ -176,7 +176,7 @@ void StopWatch::RenderPause() {
void StopWatch::RenderLaps() {
lv_label_set_text(lapText, "");
- for (int i = displayedLaps - 1; i >= 0; i--) {
+ for (int i = 0; i < displayedLaps; i++) {
std::optional<LapInfo> lap = stopWatchController.LastLap(i);
if (lap) {