Skip to content

Commit 37068f9

Browse files
committed
Update HR Monitor example
1 parent 4b68801 commit 37068f9

File tree

1 file changed

+157
-10
lines changed

1 file changed

+157
-10
lines changed

examples/HeartRateMonitor/HeartRateMonitor.ino

Lines changed: 157 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -12,24 +12,32 @@
1212
#include "ANTPLUS.h"
1313

1414
#define BAUD_RATE 9600
15-
#define WILDCARD_DEVICE 0
1615
#define CHANNEL_0 0
1716

1817
const uint8_t NETWORK_KEY[] = {0x00, 0x11, 0x22, 0x33, 0x44, 0x55, 0x66, 0x77}; // get this from thisisant.com
1918

2019
AntWithCallbacks ant = AntWithCallbacks();
2120
AntPlusRouter router = AntPlusRouter();
22-
ProfileHeartRateMonitor hr = ProfileHeartRateMonitor(WILDCARD_DEVICE);
21+
ProfileHeartRateMonitor hr = ProfileHeartRateMonitor();
2322

24-
void previousHeartBeatDataPageHandler(HeartRatePreviousHeartBeat& dp, uintptr_t data) {
25-
Serial.print("HR: ");
26-
Serial.println(dp.getComputedHeartRate());
27-
}
23+
void heartRateBaseDataPageHandler(AntRxDataResponse& msg, uintptr_t data);
24+
void batteryStatusDataPageHandler(HeartRateBatteryStatus& msg, uintptr_t data);
25+
void capabilitiesDataPageHandler(HeartRateCapabilities& msg, uintptr_t data);
26+
void cumulativeOperatingTimeDataPageHandler(HeartRateCumulativeOperatingTime& msg, uintptr_t data);
27+
void defaultDataPageHandler(HeartRateDefault& msg, uintptr_t data);
28+
void manufacturerInformationDataPageHandler(HeartRateManufacturerInformation& msg, uintptr_t data);
29+
void previousHeartBeatDataPageHandler(HeartRatePreviousHeartBeat& msg, uintptr_t data);
30+
void productInformationDataPageHandler(HeartRateProductInformation& msg, uintptr_t data);
31+
void swimIntervalSummary(HeartRateSwimIntervalSummary& msg, uintptr_t data);
32+
void modeSettings(ModeSettings& msg, uintptr_t data);
33+
34+
void heartRateFeatures(uint8_t bitfield);
35+
void printStatus(uint8_t status);
2836

2937
void setup() {
3038
Serial1.begin(BAUD_RATE);
3139
ant.setSerial(Serial1);
32-
delay(10000);
40+
delay(15000);
3341

3442
router.setDriver(&ant); // never touch ant again
3543
router.setAntPlusNetworkKey(NETWORK_KEY);
@@ -38,14 +46,153 @@ void setup() {
3846

3947
Serial.begin(BAUD_RATE);
4048
Serial.println("Running");
41-
hr.onHeartRatePreviousHeartBeat(previousHeartBeatDataPageHandler, NULL);
49+
hr.onDataPage(heartRateBaseDataPageHandler);
50+
hr.onHeartRateBatteryStatus(batteryStatusDataPageHandler);
51+
hr.onHeartRateCapabilities(capabilitiesDataPageHandler);
52+
hr.onHeartRateCumulativeOperatingTime(cumulativeOperatingTimeDataPageHandler);
53+
hr.onHeartRateDefault(defaultDataPageHandler);
54+
hr.onHeartRateManufacturerInformation(manufacturerInformationDataPageHandler);
55+
hr.onHeartRatePreviousHeartBeat(previousHeartBeatDataPageHandler);
56+
hr.onHeartRateProductInformation(productInformationDataPageHandler);
57+
hr.onHeartRateSwimIntervalSummary(swimIntervalSummary);
58+
hr.onModeSettings(modeSettings);
4259
hr.begin();
4360
// wait for pair to complete
44-
while(hr.getChannelStatus() == CHANNEL_STATUS_SEARCHING) {router.loop();};
61+
uint8_t status = hr.waitForPair();
4562
// print channel status
46-
// get sensor serial number
63+
printStatus(status);
64+
Serial.println("===========================");
65+
Serial.print("Device Number: ");
66+
Serial.println(hr.getDeviceNumber());
67+
Serial.print("Transmisison Type: ");
68+
Serial.println(hr.getTransmissionType());
4769
}
4870

4971
void loop() {
5072
router.loop();
73+
}
74+
75+
void batteryStatusDataPageHandler(HeartRateBatteryStatus& msg, uintptr_t data) {
76+
Serial.print("Battery Level: ");
77+
Serial.println(msg.getBatteryLevel());
78+
Serial.print("Fractional Battery Voltage: ");
79+
Serial.println(msg.getFractionalBatteryVoltage());
80+
Serial.print("Coarse Battery Voltage: ");
81+
Serial.println(msg.getCoarseBatteryVoltage());
82+
Serial.print("Battery Status: ");
83+
Serial.println(msg.getBatteryStatus());
84+
}
85+
86+
void capabilitiesDataPageHandler(HeartRateCapabilities& msg, uintptr_t data) {
87+
Serial.print("Features Supported: ");
88+
heartRateFeatures(msg.getFeaturesSupported());
89+
Serial.print("Features Enabled: ");
90+
heartRateFeatures(msg.getFeaturesEnabled());
91+
}
92+
93+
void cumulativeOperatingTimeDataPageHandler(HeartRateCumulativeOperatingTime& msg, uintptr_t data) {
94+
Serial.print("Cumulative Operating Time: ");
95+
Serial.println(msg.getCumulativeOperatingTime());
96+
}
97+
98+
void defaultDataPageHandler(HeartRateDefault& msg, uintptr_t data) {
99+
// All fields are reserved
100+
}
101+
102+
void manufacturerInformationDataPageHandler(HeartRateManufacturerInformation& msg, uintptr_t data) {
103+
Serial.print("Manufacturer ID LSB: ");
104+
Serial.println(msg.getManufacturerIdLsb());
105+
Serial.print("Serial Number: ");
106+
Serial.println(msg.getSerialNumber());
107+
}
108+
109+
void previousHeartBeatDataPageHandler(HeartRatePreviousHeartBeat& dp, uintptr_t data) {
110+
Serial.print("Manufacturer Specific Byte: ");
111+
Serial.println(dp.getManufacturerSpecific());
112+
Serial.print("Previous Heart Beat Event Time: ");
113+
Serial.println(dp.getPreviousHeartBeatEventTime());
114+
}
115+
116+
void productInformationDataPageHandler(HeartRateProductInformation& msg, uintptr_t data) {
117+
Serial.print("Hardware Version: ");
118+
Serial.println(msg.getHardwareVersion());
119+
Serial.print("Software Version: ");
120+
Serial.println(msg.getSoftwareVersion());
121+
Serial.print("Model Number: ");
122+
Serial.println(msg.getModelNumber());
123+
}
124+
125+
void swimIntervalSummary(HeartRateSwimIntervalSummary& msg, uintptr_t data) {
126+
Serial.print("Interval Average Heart Rate: ");
127+
Serial.println(msg.getIntervalAverageHeartRate());
128+
Serial.print("Interval Maximum Heart Rate: ");
129+
Serial.println(msg.getIntervalMaximumHeartRate());
130+
Serial.print("Session Average Heart Rate: ");
131+
Serial.println(msg.getSessionAverageHeartRate());
132+
}
133+
134+
void modeSettings(ModeSettings& msg, uintptr_t data) {
135+
Serial.print("Sports Mode: ");
136+
uint8_t sportMode = msg.getSportMode();
137+
switch (sportMode) {
138+
case 0x01:
139+
Serial.println("Running");
140+
break;
141+
case 0x02:
142+
Serial.println("Cycling");
143+
break;
144+
case 0x05:
145+
Serial.println("Swimming");
146+
break;
147+
}
148+
}
149+
150+
void heartRateBaseDataPageHandler(AntRxDataResponse& msg, uintptr_t data) {
151+
HeartRateBaseMainDataPage dp = HeartRateBaseMainDataPage(msg);
152+
Serial.println("===========================");
153+
Serial.print("DataPage: ");
154+
Serial.println(dp.getDataPageNumber());
155+
Serial.print("Heart Beat Event Time: ");
156+
Serial.println(dp.getHeartBeatEventTime());
157+
Serial.print("Heart Beat Count: ");
158+
Serial.println(dp.getHeartBeatCount());
159+
Serial.print("Computed Heart Rate: ");
160+
Serial.println(dp.getComputedHeartRate());
161+
}
162+
163+
void heartRateFeatures(uint8_t bitfield) {
164+
if (bitfield & ANTPLUS_HEARTRATE_DATAPAGE_CAPABILITIES_FEATURES_EXTENDEDRUNNING) {
165+
Serial.print("Extended Running ");
166+
}
167+
if (bitfield & ANTPLUS_HEARTRATE_DATAPAGE_CAPABILITIES_FEATURES_EXTENDEDCYCLING) {
168+
Serial.print("Extended Cycling ");
169+
}
170+
if (bitfield & ANTPLUS_HEARTRATE_DATAPAGE_CAPABILITIES_FEATURES_EXTENDEDSWIMMING) {
171+
Serial.print("Extended Swimming ");
172+
}
173+
if (bitfield & ANTPLUS_HEARTRATE_DATAPAGE_CAPABILITIES_FEATURES_MANUFACTURER1) {
174+
Serial.print("Manufacturer Bit 1 ");
175+
}
176+
if (bitfield & ANTPLUS_HEARTRATE_DATAPAGE_CAPABILITIES_FEATURES_MANUFACTURER2) {
177+
Serial.print("Manufacturer Bit 2 ");
178+
}
179+
Serial.println();
180+
}
181+
182+
void printStatus(uint8_t status) {
183+
Serial.print("Channel Status: ");
184+
switch (status) {
185+
case CHANNEL_STATUS_UNASSIGNED:
186+
Serial.println("Unassigned");
187+
break;
188+
case CHANNEL_STATUS_ASSIGNED:
189+
Serial.println("Assigned");
190+
break;
191+
case CHANNEL_STATUS_SEARCHING:
192+
Serial.println("Searching");
193+
break;
194+
case CHANNEL_STATUS_TRACKING:
195+
Serial.println("Tracking");
196+
break;
197+
}
51198
}

0 commit comments

Comments
 (0)