Skip to content

Commit 764a8fe

Browse files
committed
StopWatch: add persistence
1 parent 2105a7b commit 764a8fe

13 files changed

+333
-142
lines changed

src/CMakeLists.txt

+3
Original file line numberDiff line numberDiff line change
@@ -466,6 +466,7 @@ list(APPEND SOURCE_FILES
466466
components/motor/MotorController.cpp
467467
components/settings/Settings.cpp
468468
components/timer/Timer.cpp
469+
components/stopwatch/StopWatchController.cpp
469470
components/alarm/AlarmController.cpp
470471
components/fs/FS.cpp
471472
drivers/Cst816s.cpp
@@ -535,6 +536,7 @@ list(APPEND RECOVERY_SOURCE_FILES
535536
components/firmwarevalidator/FirmwareValidator.cpp
536537
components/settings/Settings.cpp
537538
components/timer/Timer.cpp
539+
components/stopwatch/StopWatchController.cpp
538540
components/alarm/AlarmController.cpp
539541
drivers/Cst816s.cpp
540542
FreeRTOS/port.c
@@ -654,6 +656,7 @@ set(INCLUDE_FILES
654656
components/ble/SimpleWeatherService.h
655657
components/settings/Settings.h
656658
components/timer/Timer.h
659+
components/stopwatch/StopWatchController.h
657660
components/alarm/AlarmController.h
658661
drivers/Cst816s.h
659662
FreeRTOS/portmacro.h
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,101 @@
1+
#include "components/stopwatch/StopWatchController.h"
2+
3+
using namespace Pinetime::Controllers;
4+
5+
namespace {
6+
TickType_t CalculateDelta(const TickType_t startTime, const TickType_t currentTime) {
7+
TickType_t delta = 0;
8+
// Take care of overflow
9+
if (startTime > currentTime) {
10+
delta = 0xffffffff - startTime;
11+
delta += (currentTime + 1);
12+
} else {
13+
delta = currentTime - startTime;
14+
}
15+
return delta;
16+
}
17+
}
18+
19+
StopWatchController::StopWatchController() {
20+
Clear();
21+
}
22+
23+
// State Change
24+
25+
void StopWatchController::Start() {
26+
currentState = StopWatchStates::Running;
27+
startTime = xTaskGetTickCount();
28+
}
29+
30+
void StopWatchController::Pause() {
31+
currentState = StopWatchStates::Paused;
32+
timeElapsedPreviously += CalculateDelta(startTime, xTaskGetTickCount());
33+
}
34+
35+
void StopWatchController::Clear() {
36+
currentState = StopWatchStates::Cleared;
37+
timeElapsedPreviously = 0;
38+
39+
for (int i = 0; i < LAP_CAPACITY; i++) {
40+
laps[i].count = 0;
41+
laps[i].time = 0;
42+
}
43+
lapCount = 0;
44+
lapHead = 0;
45+
}
46+
47+
// Lap
48+
49+
void StopWatchController::PushLap() {
50+
TickType_t lapEnd = GetElapsedTime();
51+
laps[lapHead].time = lapEnd;
52+
laps[lapHead].count = lapCount + 1;
53+
lapCount += 1;
54+
lapHead = lapCount % LAP_CAPACITY;
55+
}
56+
57+
int StopWatchController::GetLapNum() {
58+
if (lapCount < LAP_CAPACITY)
59+
return lapCount;
60+
else
61+
return LAP_CAPACITY;
62+
}
63+
64+
int StopWatchController::GetLapCount() {
65+
return lapCount;
66+
}
67+
68+
int Wrap(int index) {
69+
return ((index % LAP_CAPACITY) + LAP_CAPACITY) % LAP_CAPACITY;
70+
}
71+
72+
LapInfo* StopWatchController::LastLap(int lap) {
73+
if (lap >= LAP_CAPACITY || lap > lapCount || lapCount == 0) {
74+
// Return "empty" LapInfo_t
75+
return &emptyLapInfo;
76+
}
77+
// Index backwards
78+
int index = Wrap(lapHead - lap);
79+
return &laps[index];
80+
}
81+
82+
// Data / State acess
83+
84+
TickType_t StopWatchController::GetElapsedTime() {
85+
if (!IsRunning()) {
86+
return timeElapsedPreviously;
87+
}
88+
return timeElapsedPreviously + CalculateDelta(startTime, xTaskGetTickCount());
89+
}
90+
91+
bool StopWatchController::IsRunning() {
92+
return currentState == StopWatchStates::Running;
93+
}
94+
95+
bool StopWatchController::IsCleared() {
96+
return currentState == StopWatchStates::Cleared;
97+
}
98+
99+
bool StopWatchController::IsPaused() {
100+
return currentState == StopWatchStates::Paused;
101+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,66 @@
1+
#pragma once
2+
3+
#include <FreeRTOS.h>
4+
#include <timers.h>
5+
6+
#define LAP_CAPACITY 2
7+
8+
namespace Pinetime {
9+
namespace System {
10+
class SystemTask;
11+
}
12+
namespace Controllers {
13+
14+
enum class StopWatchStates { Cleared, Running, Paused };
15+
16+
struct LapInfo {
17+
int count = 0; // Used to label the lap
18+
TickType_t time = 0; // Delta time from beginning of stopwatch
19+
};
20+
21+
class StopWatchController {
22+
public:
23+
StopWatchController();
24+
25+
// StopWatch functionality and data
26+
void Start();
27+
void Pause();
28+
void Clear();
29+
30+
TickType_t GetElapsedTime();
31+
32+
// Lap functionality
33+
34+
/// Only the latest laps are stored, the lap count is saved until reset
35+
void PushLap();
36+
37+
/// Returns actual count of stored laps
38+
int GetLapNum();
39+
40+
/// Returns lapCount
41+
int GetLapCount();
42+
43+
/// Indexes into lap history, with 0 being the latest lap.
44+
/// If the lap is unavailable, count and time will be 0. If there is a
45+
/// real value, count should be above 0
46+
LapInfo* LastLap(int lap = 0);
47+
48+
bool IsRunning();
49+
bool IsCleared();
50+
bool IsPaused();
51+
52+
private:
53+
// Current state of stopwatch
54+
StopWatchStates currentState = StopWatchStates::Cleared;
55+
// Start time of current duration
56+
TickType_t startTime = 0;
57+
// How much time was elapsed before current duration
58+
TickType_t timeElapsedPreviously = 0;
59+
// Stores lap times
60+
LapInfo laps[LAP_CAPACITY];
61+
LapInfo emptyLapInfo = {.count = 0, .time = 0};
62+
int lapCount = 0;
63+
int lapHead = 0;
64+
};
65+
}
66+
}

src/displayapp/Controllers.h

+2
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,7 @@ namespace Pinetime {
1818
class Settings;
1919
class MotorController;
2020
class MotionController;
21+
class StopWatchController;
2122
class AlarmController;
2223
class BrightnessController;
2324
class SimpleWeatherService;
@@ -41,6 +42,7 @@ namespace Pinetime {
4142
Pinetime::Controllers::Settings& settingsController;
4243
Pinetime::Controllers::MotorController& motorController;
4344
Pinetime::Controllers::MotionController& motionController;
45+
Pinetime::Controllers::StopWatchController& stopWatchController;
4446
Pinetime::Controllers::AlarmController& alarmController;
4547
Pinetime::Controllers::BrightnessController& brightnessController;
4648
Pinetime::Controllers::SimpleWeatherService* weatherController;

src/displayapp/DisplayApp.cpp

+3
Original file line numberDiff line numberDiff line change
@@ -78,6 +78,7 @@ DisplayApp::DisplayApp(Drivers::St7789& lcd,
7878
Controllers::Settings& settingsController,
7979
Pinetime::Controllers::MotorController& motorController,
8080
Pinetime::Controllers::MotionController& motionController,
81+
Pinetime::Controllers::StopWatchController& stopWatchController,
8182
Pinetime::Controllers::AlarmController& alarmController,
8283
Pinetime::Controllers::BrightnessController& brightnessController,
8384
Pinetime::Controllers::TouchHandler& touchHandler,
@@ -94,6 +95,7 @@ DisplayApp::DisplayApp(Drivers::St7789& lcd,
9495
settingsController {settingsController},
9596
motorController {motorController},
9697
motionController {motionController},
98+
stopWatchController {stopWatchController},
9799
alarmController {alarmController},
98100
brightnessController {brightnessController},
99101
touchHandler {touchHandler},
@@ -109,6 +111,7 @@ DisplayApp::DisplayApp(Drivers::St7789& lcd,
109111
settingsController,
110112
motorController,
111113
motionController,
114+
stopWatchController,
112115
alarmController,
113116
brightnessController,
114117
nullptr,

src/displayapp/DisplayApp.h

+3
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,7 @@
1313
#include "components/settings/Settings.h"
1414
#include "displayapp/screens/Screen.h"
1515
#include "components/timer/Timer.h"
16+
#include "components/stopwatch/StopWatchController.h"
1617
#include "components/alarm/AlarmController.h"
1718
#include "touchhandler/TouchHandler.h"
1819

@@ -63,6 +64,7 @@ namespace Pinetime {
6364
Controllers::Settings& settingsController,
6465
Pinetime::Controllers::MotorController& motorController,
6566
Pinetime::Controllers::MotionController& motionController,
67+
Pinetime::Controllers::StopWatchController& stopWatchController,
6668
Pinetime::Controllers::AlarmController& alarmController,
6769
Pinetime::Controllers::BrightnessController& brightnessController,
6870
Pinetime::Controllers::TouchHandler& touchHandler,
@@ -93,6 +95,7 @@ namespace Pinetime {
9395
Pinetime::Controllers::Settings& settingsController;
9496
Pinetime::Controllers::MotorController& motorController;
9597
Pinetime::Controllers::MotionController& motionController;
98+
Pinetime::Controllers::StopWatchController& stopWatchController;
9699
Pinetime::Controllers::AlarmController& alarmController;
97100
Pinetime::Controllers::BrightnessController& brightnessController;
98101
Pinetime::Controllers::TouchHandler& touchHandler;

src/displayapp/DisplayAppRecovery.cpp

+1
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,7 @@ DisplayApp::DisplayApp(Drivers::St7789& lcd,
2121
Controllers::Settings& /*settingsController*/,
2222
Pinetime::Controllers::MotorController& /*motorController*/,
2323
Pinetime::Controllers::MotionController& /*motionController*/,
24+
Pinetime::Controllers::StopWatchController& /*stopWatchController*/,
2425
Pinetime::Controllers::AlarmController& /*alarmController*/,
2526
Pinetime::Controllers::BrightnessController& /*brightnessController*/,
2627
Pinetime::Controllers::TouchHandler& /*touchHandler*/,

src/displayapp/DisplayAppRecovery.h

+2
Original file line numberDiff line numberDiff line change
@@ -31,6 +31,7 @@ namespace Pinetime {
3131
class MotionController;
3232
class TouchHandler;
3333
class MotorController;
34+
class StopWatchController;
3435
class AlarmController;
3536
class BrightnessController;
3637
class FS;
@@ -57,6 +58,7 @@ namespace Pinetime {
5758
Controllers::Settings& settingsController,
5859
Pinetime::Controllers::MotorController& motorController,
5960
Pinetime::Controllers::MotionController& motionController,
61+
Pinetime::Controllers::StopWatchController& stopWatchController,
6062
Pinetime::Controllers::AlarmController& alarmController,
6163
Pinetime::Controllers::BrightnessController& brightnessController,
6264
Pinetime::Controllers::TouchHandler& touchHandler,

0 commit comments

Comments
 (0)