Skip to content

Commit f9c0000

Browse files
codingjourneyJustScott
authored andcommitted
StopWatch: add persistence
minor fixes: * more consistent function names * lapCapacity as constexpr * LastLap returns std::optional * simplified handling of TickType_t values * removed unused methods * minor fix in lap rendering lap storage as CircularBuffer, minor fixes improved naming of lap-related fields and methods removed superfluous default values in controller render accurate time at pause fixed issues found by the test-format CI job common method for entering the Paused state added missing newline fixed an integer overflow bug in time rendering upper bound for lap numbers upper bound for elapsed time fixed layout of lap data improved layout, improved re-alignment of time fields length of lap list adapting to available space tweaked some margins to improve aesthetics reduced heap size to fix a build error fixed issues found by the test-format CI job elapsedTimeBoundary as constexpr prevent unnecessary redrawing of the time label tightened declarations of integer fields lap times without leading zeroes fixed issues found by the test-format CI job fixed a type declaration fixed irregular pause mode blinking at clock wraparound
1 parent 90227e1 commit f9c0000

File tree

14 files changed

+358
-159
lines changed

14 files changed

+358
-159
lines changed

src/CMakeLists.txt

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -469,6 +469,7 @@ list(APPEND SOURCE_FILES
469469
components/motor/MotorController.cpp
470470
components/settings/Settings.cpp
471471
components/timer/Timer.cpp
472+
components/stopwatch/StopWatchController.cpp
472473
components/alarm/AlarmController.cpp
473474
components/fs/FS.cpp
474475
drivers/Cst816s.cpp
@@ -538,6 +539,7 @@ list(APPEND RECOVERY_SOURCE_FILES
538539
components/firmwarevalidator/FirmwareValidator.cpp
539540
components/settings/Settings.cpp
540541
components/timer/Timer.cpp
542+
components/stopwatch/StopWatchController.cpp
541543
components/alarm/AlarmController.cpp
542544
drivers/Cst816s.cpp
543545
FreeRTOS/port.c
@@ -658,6 +660,7 @@ set(INCLUDE_FILES
658660
components/ble/SimpleWeatherService.h
659661
components/settings/Settings.h
660662
components/timer/Timer.h
663+
components/stopwatch/StopWatchController.h
661664
components/alarm/AlarmController.h
662665
drivers/Cst816s.h
663666
FreeRTOS/portmacro.h

src/FreeRTOSConfig.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -62,6 +62,7 @@
6262
#define configTICK_RATE_HZ 1024
6363
#define configMAX_PRIORITIES (3)
6464
#define configMINIMAL_STACK_SIZE (120)
65+
#define configTOTAL_HEAP_SIZE (1024 * 39)
6566
#define configMAX_TASK_NAME_LEN (4)
6667
#define configUSE_16_BIT_TICKS 0
6768
#define configIDLE_SHOULD_YIELD 1
Lines changed: 72 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,72 @@
1+
#include "components/stopwatch/StopWatchController.h"
2+
3+
using namespace Pinetime::Controllers;
4+
5+
StopWatchController::StopWatchController() {
6+
Clear();
7+
}
8+
9+
// State Change
10+
11+
void StopWatchController::Start() {
12+
currentState = StopWatchStates::Running;
13+
startTime = xTaskGetTickCount();
14+
}
15+
16+
void StopWatchController::Pause() {
17+
timeElapsedPreviously = GetElapsedTime();
18+
currentState = StopWatchStates::Paused;
19+
}
20+
21+
void StopWatchController::Clear() {
22+
currentState = StopWatchStates::Cleared;
23+
timeElapsedPreviously = 0;
24+
25+
for (uint8_t i = 0; i < histSize; i++) {
26+
history[i].number = 0;
27+
history[i].timeSinceStart = 0;
28+
}
29+
maxLapNumber = 0;
30+
}
31+
32+
// Lap
33+
34+
void StopWatchController::AddLapToHistory() {
35+
TickType_t lapEnd = GetElapsedTime();
36+
history--;
37+
history[0].timeSinceStart = lapEnd;
38+
history[0].number = ++maxLapNumber % lapNumberBoundary;
39+
}
40+
41+
uint16_t StopWatchController::GetMaxLapNumber() {
42+
return maxLapNumber;
43+
}
44+
45+
std::optional<LapInfo> StopWatchController::GetLapFromHistory(uint8_t index) {
46+
if (index >= histSize || history[index].number == 0) {
47+
return {};
48+
}
49+
return history[index];
50+
}
51+
52+
// Data / State acess
53+
54+
TickType_t StopWatchController::GetElapsedTime() {
55+
if (!IsRunning()) {
56+
return timeElapsedPreviously;
57+
}
58+
TickType_t delta = xTaskGetTickCount() - startTime;
59+
return (timeElapsedPreviously + delta) % elapsedTimeBoundary;
60+
}
61+
62+
bool StopWatchController::IsRunning() {
63+
return currentState == StopWatchStates::Running;
64+
}
65+
66+
bool StopWatchController::IsCleared() {
67+
return currentState == StopWatchStates::Cleared;
68+
}
69+
70+
bool StopWatchController::IsPaused() {
71+
return currentState == StopWatchStates::Paused;
72+
}
Lines changed: 68 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,68 @@
1+
#pragma once
2+
3+
#include <FreeRTOS.h>
4+
#include <optional>
5+
#include <timers.h>
6+
#include "utility/CircularBuffer.h"
7+
8+
namespace Pinetime {
9+
namespace System {
10+
class SystemTask;
11+
}
12+
13+
namespace Controllers {
14+
15+
enum class StopWatchStates { Cleared, Running, Paused };
16+
17+
struct LapInfo {
18+
uint16_t number = 0; // Used to label the lap
19+
TickType_t timeSinceStart = 0; // Excluding pauses
20+
};
21+
22+
class StopWatchController {
23+
public:
24+
StopWatchController();
25+
26+
// StopWatch functionality and data
27+
void Start();
28+
void Pause();
29+
void Clear();
30+
31+
TickType_t GetElapsedTime();
32+
33+
// Lap functionality
34+
35+
/// Only the latest histSize laps are stored
36+
void AddLapToHistory();
37+
38+
/// Returns maxLapNumber
39+
uint16_t GetMaxLapNumber();
40+
41+
/// Indexes into lap history, with 0 being the latest lap.
42+
std::optional<LapInfo> GetLapFromHistory(uint8_t index);
43+
44+
bool IsRunning();
45+
bool IsCleared();
46+
bool IsPaused();
47+
48+
private:
49+
// Time at which stopwatch wraps around to zero (1000 hours)
50+
static constexpr TickType_t elapsedTimeBoundary = static_cast<TickType_t>(configTICK_RATE_HZ) * 60 * 60 * 1000;
51+
// Current state of stopwatch
52+
StopWatchStates currentState = StopWatchStates::Cleared;
53+
// Start time of current duration
54+
TickType_t startTime;
55+
// How much time was elapsed before current duration
56+
TickType_t timeElapsedPreviously;
57+
58+
// Maximum number of stored laps
59+
static constexpr uint8_t histSize = 4;
60+
// Value at which lap numbers wrap around to zero
61+
static constexpr uint16_t lapNumberBoundary = 1000;
62+
// Lap storage
63+
Utility::CircularBuffer<LapInfo, histSize> history;
64+
// Highest lap number; less than lapNumberBoundary, may exceed histSize
65+
uint16_t maxLapNumber;
66+
};
67+
}
68+
}

src/displayapp/Controllers.h

Lines changed: 2 additions & 0 deletions
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

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -81,6 +81,7 @@ DisplayApp::DisplayApp(Drivers::St7789& lcd,
8181
Controllers::Settings& settingsController,
8282
Pinetime::Controllers::MotorController& motorController,
8383
Pinetime::Controllers::MotionController& motionController,
84+
Pinetime::Controllers::StopWatchController& stopWatchController,
8485
Pinetime::Controllers::AlarmController& alarmController,
8586
Pinetime::Controllers::BrightnessController& brightnessController,
8687
Pinetime::Controllers::TouchHandler& touchHandler,
@@ -97,6 +98,7 @@ DisplayApp::DisplayApp(Drivers::St7789& lcd,
9798
settingsController {settingsController},
9899
motorController {motorController},
99100
motionController {motionController},
101+
stopWatchController {stopWatchController},
100102
alarmController {alarmController},
101103
brightnessController {brightnessController},
102104
touchHandler {touchHandler},
@@ -112,6 +114,7 @@ DisplayApp::DisplayApp(Drivers::St7789& lcd,
112114
settingsController,
113115
motorController,
114116
motionController,
117+
stopWatchController,
115118
alarmController,
116119
brightnessController,
117120
nullptr,

src/displayapp/DisplayApp.h

Lines changed: 3 additions & 0 deletions
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

Lines changed: 1 addition & 0 deletions
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

Lines changed: 2 additions & 0 deletions
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)