1212#include " ANTPLUS.h"
1313
1414#define BAUD_RATE 9600
15- #define WILDCARD_DEVICE 0
1615#define CHANNEL_0 0
1716
1817const uint8_t NETWORK_KEY[] = {0x00 , 0x11 , 0x22 , 0x33 , 0x44 , 0x55 , 0x66 , 0x77 }; // get this from thisisant.com
1918
2019AntWithCallbacks ant = AntWithCallbacks();
2120AntPlusRouter 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
2937void 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
4971void 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