@@ -25,77 +25,57 @@ void HeartRateTask::Process(void* instance) {
25
25
26
26
void HeartRateTask::Work () {
27
27
int lastBpm = 0 ;
28
+
28
29
while (true ) {
30
+ auto delay = CurrentTaskDelay ();
29
31
Messages msg;
30
- uint32_t delay;
31
- if (state == States::Running) {
32
- if (measurementStarted) {
33
- delay = ppg.deltaTms ;
34
- } else {
35
- delay = 100 ;
36
- }
37
- } else {
38
- delay = portMAX_DELAY;
39
- }
40
32
41
- if (xQueueReceive (messageQueue, &msg, delay)) {
33
+ if (xQueueReceive (messageQueue, &msg, delay) == pdTRUE ) {
42
34
switch (msg) {
43
35
case Messages::GoToSleep:
44
- StopMeasurement ();
45
- state = States::Idle;
36
+ if (state == States::Running) {
37
+ state = States::Idle;
38
+ } else if (state == States::Measuring) {
39
+ state = States::BackgroundWaiting;
40
+ StopMeasurement ();
41
+ }
46
42
break ;
47
43
case Messages::WakeUp:
48
- state = States::Running;
49
- if (measurementStarted) {
50
- lastBpm = 0 ;
44
+ if (state == States::Idle) {
45
+ state = States::Running;
46
+ } else if (state == States::BackgroundMeasuring) {
47
+ state = States::Measuring;
48
+ } else if (state == States::BackgroundWaiting) {
49
+ state = States::Measuring;
51
50
StartMeasurement ();
52
51
}
53
52
break ;
54
53
case Messages::StartMeasurement:
55
- if (measurementStarted ) {
54
+ if (state == States::Measuring || state == States::BackgroundMeasuring ) {
56
55
break ;
57
56
}
57
+ state = States::Measuring;
58
58
lastBpm = 0 ;
59
59
StartMeasurement ();
60
- measurementStarted = true ;
61
60
break ;
62
61
case Messages::StopMeasurement:
63
- if (!measurementStarted ) {
62
+ if (state == States::Running || state == States::Idle ) {
64
63
break ;
65
64
}
65
+ if (state == States::Measuring) {
66
+ state = States::Running;
67
+ } else if (state == States::BackgroundMeasuring) {
68
+ state = States::Idle;
69
+ }
66
70
StopMeasurement ();
67
- measurementStarted = false ;
68
71
break ;
69
72
}
70
73
}
71
74
72
- if (measurementStarted) {
73
- int8_t ambient = ppg.Preprocess (heartRateSensor.ReadHrs (), heartRateSensor.ReadAls ());
74
- int bpm = ppg.HeartRate ();
75
-
76
- // If ambient light detected or a reset requested (bpm < 0)
77
- if (ambient > 0 ) {
78
- // Reset all DAQ buffers
79
- ppg.Reset (true );
80
- // Force state to NotEnoughData (below)
81
- lastBpm = 0 ;
82
- bpm = 0 ;
83
- } else if (bpm < 0 ) {
84
- // Reset all DAQ buffers except HRS buffer
85
- ppg.Reset (false );
86
- // Set HR to zero and update
87
- bpm = 0 ;
88
- controller.Update (Controllers::HeartRateController::States::Running, bpm);
89
- }
90
-
91
- if (lastBpm == 0 && bpm == 0 ) {
92
- controller.Update (Controllers::HeartRateController::States::NotEnoughData, bpm);
93
- }
94
-
95
- if (bpm != 0 ) {
96
- lastBpm = bpm;
97
- controller.Update (Controllers::HeartRateController::States::Running, lastBpm);
98
- }
75
+ if (state == States::BackgroundWaiting) {
76
+ HandleBackgroundWaiting ();
77
+ } else if (state == States::BackgroundMeasuring || state == States::Measuring) {
78
+ HandleSensorData (&lastBpm);
99
79
}
100
80
}
101
81
}
@@ -120,3 +100,54 @@ void HeartRateTask::StopMeasurement() {
120
100
ppg.Reset (true );
121
101
vTaskDelay (100 );
122
102
}
103
+
104
+ void HeartRateTask::HandleBackgroundWaiting () {
105
+ if (xTaskGetTickCount () - backgroundMeasurementWaitingStart >= DURATION_BETWEEN_BACKGROUND_MEASUREMENTS) {
106
+ state = States::BackgroundMeasuring;
107
+ StartMeasurement ();
108
+ }
109
+ }
110
+
111
+ void HeartRateTask::HandleSensorData (int * lastBpm) {
112
+ int8_t ambient = ppg.Preprocess (heartRateSensor.ReadHrs (), heartRateSensor.ReadAls ());
113
+ int bpm = ppg.HeartRate ();
114
+
115
+ // If ambient light detected or a reset requested (bpm < 0)
116
+ if (ambient > 0 ) {
117
+ // Reset all DAQ buffers
118
+ ppg.Reset (true );
119
+ } else if (bpm < 0 ) {
120
+ // Reset all DAQ buffers except HRS buffer
121
+ ppg.Reset (false );
122
+ // Set HR to zero and update
123
+ bpm = 0 ;
124
+ }
125
+
126
+ if (*lastBpm == 0 && bpm == 0 ) {
127
+ controller.Update (Controllers::HeartRateController::States::NotEnoughData, bpm);
128
+ }
129
+
130
+ if (bpm != 0 ) {
131
+ *lastBpm = bpm;
132
+ controller.Update (Controllers::HeartRateController::States::Running, bpm);
133
+ if (state == States::BackgroundMeasuring) {
134
+ StopMeasurement ();
135
+ state = States::BackgroundWaiting;
136
+ backgroundMeasurementWaitingStart = xTaskGetTickCount ();
137
+ }
138
+ }
139
+ }
140
+
141
+ int HeartRateTask::CurrentTaskDelay () {
142
+ switch (state) {
143
+ case States::Measuring:
144
+ case States::BackgroundMeasuring:
145
+ return ppg.deltaTms ;
146
+ case States::Running:
147
+ return 100 ;
148
+ case States::BackgroundWaiting:
149
+ return 10000 ;
150
+ default :
151
+ return portMAX_DELAY;
152
+ }
153
+ }
0 commit comments