@@ -7,18 +7,19 @@ using namespace Pinetime::Controllers;
77void HeartRateController::Update (HeartRateController::States newState, uint8_t heartRate) {
88 this ->state = newState;
99 if (this ->heartRate != heartRate) {
10-
1110 uint32_t ts = xTaskGetTickCount ();
12- uint32_t zone;
13- // auto adjustMax = pdMS_TO_TICKS(300000); // 5 minutes
14- for (zone = zoneSettings.bpmTarget .size () - 1 ; i < zoneSettings.bpmTarget .size (); --i) {
11+ uint32_t z;
12+ zone = 0 ;
13+ auto adjustMax = pdMS_TO_TICKS (zoneSettings.adjustDelay );
14+ for (z = zoneSettings.bpmTarget .size () - 1 ; i < zoneSettings.bpmTarget .size (); --i) {
1515 if (this ->heartRate >= zoneSettings.bpmTarget [i]) {
1616 uint32_t dt = ts - lastActiveTime;
1717 currentActivity.zoneTime [i] += dt;
18-
18+ zone = z + 1 ;
1919 // don't make increases unless this is consistantly higher than normal (zone 5 is max)
20- if (zone >= 4 && dt > zoneSettings.adjustDelay ) {
21- zoneSettings.maxHeartRate = zoneSettings.maxHeartRate >= this ->heartRate ? zoneSettings.maxHeartRate : this ->heartRate ;
20+ if (zoneSettings.allowCalibration && zone >= 5 && dt > adjustMax) {
21+ zoneSettings.maxHeartRate = zoneSettings.maxHeartRate >= this ->heartRate ? zoneSettings.maxHeartRate : this ->heartRate ;
22+ zoneSettings.bpmTarget = bpmZones (zoneSettings.percentTarget , zoneSettings.maxHeartRate );
2223 }
2324 break ;
2425 }
@@ -31,6 +32,46 @@ void HeartRateController::Update(HeartRateController::States newState, uint8_t h
3132 }
3233}
3334
35+ void HeartRateController::AdvanceDay () {
36+ HeartRateZones<uint16_t > convertedActivity {};
37+ auto ticksPerSecond = pdMS_TO_TICKS (1000 );
38+
39+ for (uint32_t i = 0 ; i < convertedActivity.zoneTime .size (); i++) {
40+ convertedActivity.zoneTime [i] = fixed_rounding (currentActivity.totalTime , ticksPerSecond);
41+ }
42+
43+ activity[0 ] = convertedActivity;
44+ activity++;
45+ }
46+
47+ void HeartRateController::SaveSettingsToFile () const {
48+ lfs_dir systemDir;
49+ if (fs.DirOpen (" /.system" , &systemDir) != LFS_ERR_OK) {
50+ fs.DirCreate (" /.system" );
51+ }
52+ fs.DirClose (&systemDir);
53+ lfs_file_t heartRateZoneFile;
54+ if (fs.FileOpen (&heartRateZoneFile, " /.system/hrzs.dat" , LFS_O_WRONLY | LFS_O_CREAT) != LFS_ERR_OK) {
55+ NRF_LOG_WARNING (" [HeartRateController] Failed to open heart rate zone settings file for saving" );
56+ return ;
57+ }
58+
59+ fs.FileWrite (&heartRateZoneFile, reinterpret_cast <const uint8_t *>(&zoneSettings), sizeof (zoneSettings));
60+ fs.FileClose (&heartRateZoneFile);
61+ NRF_LOG_INFO (" [HeartRateController] Saved heart rate zone settings with format version %u to file" , zoneSettings.version );
62+
63+ lfs_file_t zoneDataFile;
64+ if (fs.FileOpen (&zoneDataFile, " /.system/hrz.dat" , LFS_O_WRONLY | LFS_O_CREAT) != LFS_ERR_OK) {
65+ NRF_LOG_WARNING (" [HeartRateController] Failed to open heart rate zone data file for saving" );
66+ return ;
67+ }
68+
69+ fs.FileWrite (&zoneDataFile, reinterpret_cast <const uint8_t *>(&activity), sizeof (activity));
70+ fs.FileClose (&zoneDataFile);
71+ NRF_LOG_INFO (" [HeartRateController] Saved heart rate zone data with format version %u to file" , zoneSettings.version );
72+
73+ }
74+
3475void HeartRateController::Enable () {
3576 if (task != nullptr ) {
3677 state = States::NotEnoughData;
0 commit comments