Skip to content

Commit a08bd7a

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 f27808a commit a08bd7a

File tree

14 files changed

+357
-159
lines changed

14 files changed

+357
-159
lines changed

src/CMakeLists.txt

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -470,6 +470,7 @@ list(APPEND SOURCE_FILES
470470
components/motor/MotorController.cpp
471471
components/settings/Settings.cpp
472472
components/timer/Timer.cpp
473+
components/stopwatch/StopWatchController.cpp
473474
components/alarm/AlarmController.cpp
474475
components/fs/FS.cpp
475476
drivers/Cst816s.cpp
@@ -539,6 +540,7 @@ list(APPEND RECOVERY_SOURCE_FILES
539540
components/firmwarevalidator/FirmwareValidator.cpp
540541
components/settings/Settings.cpp
541542
components/timer/Timer.cpp
543+
components/stopwatch/StopWatchController.cpp
542544
components/alarm/AlarmController.cpp
543545
drivers/Cst816s.cpp
544546
FreeRTOS/port.c
@@ -659,6 +661,7 @@ set(INCLUDE_FILES
659661
components/ble/SimpleWeatherService.h
660662
components/settings/Settings.h
661663
components/timer/Timer.h
664+
components/stopwatch/StopWatchController.h
662665
components/alarm/AlarmController.h
663666
drivers/Cst816s.h
664667
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
@@ -82,6 +82,7 @@ DisplayApp::DisplayApp(Drivers::St7789& lcd,
8282
Controllers::Settings& settingsController,
8383
Pinetime::Controllers::MotorController& motorController,
8484
Pinetime::Controllers::MotionController& motionController,
85+
Pinetime::Controllers::StopWatchController& stopWatchController,
8586
Pinetime::Controllers::AlarmController& alarmController,
8687
Pinetime::Controllers::BrightnessController& brightnessController,
8788
Pinetime::Controllers::TouchHandler& touchHandler,
@@ -98,6 +99,7 @@ DisplayApp::DisplayApp(Drivers::St7789& lcd,
9899
settingsController {settingsController},
99100
motorController {motorController},
100101
motionController {motionController},
102+
stopWatchController {stopWatchController},
101103
alarmController {alarmController},
102104
brightnessController {brightnessController},
103105
touchHandler {touchHandler},
@@ -113,6 +115,7 @@ DisplayApp::DisplayApp(Drivers::St7789& lcd,
113115
settingsController,
114116
motorController,
115117
motionController,
118+
stopWatchController,
116119
alarmController,
117120
brightnessController,
118121
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)