Skip to content

Commit 12e4b91

Browse files
committed
Add Dynamic profile example
1 parent d3ccd72 commit 12e4b91

File tree

1 file changed

+317
-0
lines changed

1 file changed

+317
-0
lines changed
Lines changed: 317 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,317 @@
1+
/***********************************
2+
* AntPlus DynamicProfiles example
3+
*
4+
* Finds a nearby HR Monitor, pairs
5+
* to it and then reads the information
6+
* out via the serial port. Then switches
7+
* after 30s to a bike speed sensor. After
8+
* 30s returns to HR and loops.
9+
*
10+
* Author Curtis Malainey
11+
************************************/
12+
#include <Arduino.h>
13+
#include "ANT.h"
14+
#include "ANTPLUS.h"
15+
16+
#define BAUD_RATE 9600
17+
#define CHANNEL_0 0
18+
#define CHANNEL_RUNTIME 30*1000
19+
20+
const uint8_t NETWORK_KEY[] = {0x00, 0x11, 0x22, 0x33, 0x44, 0x55, 0x66, 0x77}; // get this from thisisant.com
21+
uint32_t timeLastSwitch = 0;
22+
bool isHrProfileRunning = true;
23+
24+
AntWithCallbacks ant = AntWithCallbacks();
25+
AntPlusRouter router = AntPlusRouter();
26+
ProfileHeartRateDisplay hr = ProfileHeartRateDisplay();
27+
ProfileBicycleSpeedDisplay bikeSpeed = ProfileBicycleSpeedDisplay();
28+
29+
void heartRateBaseDataPageHandler(AntRxDataResponse& msg, uintptr_t data);
30+
void batteryStatusDataPageHandler(HeartRateBatteryStatus& msg, uintptr_t data);
31+
void capabilitiesDataPageHandler(HeartRateCapabilities& msg, uintptr_t data);
32+
void cumulativeOperatingTimeDataPageHandler(HeartRateCumulativeOperatingTime& msg, uintptr_t data);
33+
void defaultDataPageHandler(HeartRateDefault& msg, uintptr_t data);
34+
void manufacturerInformationDataPageHandler(HeartRateManufacturerInformation& msg, uintptr_t data);
35+
void previousHeartBeatDataPageHandler(HeartRatePreviousHeartBeat& msg, uintptr_t data);
36+
void productInformationDataPageHandler(HeartRateProductInformation& msg, uintptr_t data);
37+
void swimIntervalSummary(HeartRateSwimIntervalSummary& msg, uintptr_t data);
38+
39+
void heartRateFeatures(uint8_t bitfield);
40+
41+
void bicycleSpeedBaseDataPageHandler(AntRxDataResponse& msg, uintptr_t data);
42+
void batteryStatusDataPageHandler(BicycleSpeedBatteryStatus& msg, uintptr_t data);
43+
void motionAndSpeedDataPageHandler(BicycleSpeedMotionAndSpeed& msg, uintptr_t data);
44+
void cumulativeOperatingTimeDataPageHandler(BicycleSpeedCumulativeOperatingTime& msg, uintptr_t data);
45+
void defaultDataPageHandler(BicycleSpeedDefault& msg, uintptr_t data);
46+
void manufacturerIDDataPageHandler(BicycleSpeedManufacturerID& msg, uintptr_t data);
47+
void productIDDataPageHandler(BicycleSpeedProductID& msg, uintptr_t data);
48+
49+
void bicycleSpeedFlags(uint8_t flags);
50+
void bicycleSpeedBatteryStatus(uint8_t flags);
51+
52+
void printStatus(uint8_t status);
53+
void flipProfile();
54+
55+
void setup() {
56+
Serial1.begin(BAUD_RATE);
57+
ant.setSerial(Serial1);
58+
// Delay after initial setup to wait for user to connect on serial
59+
60+
router.setDriver(&ant); // never touch ant again
61+
router.setAntPlusNetworkKey(NETWORK_KEY);
62+
63+
Serial.begin(BAUD_RATE);
64+
Serial.println("Running");
65+
bikeSpeed.onDataPage(bicycleSpeedBaseDataPageHandler);
66+
bikeSpeed.onBicycleSpeedBatteryStatus(batteryStatusDataPageHandler);
67+
bikeSpeed.onBicycleSpeedMotionAndSpeed(motionAndSpeedDataPageHandler);
68+
bikeSpeed.onBicycleSpeedCumulativeOperatingTime(cumulativeOperatingTimeDataPageHandler);
69+
bikeSpeed.onBicycleSpeedDefault(defaultDataPageHandler);
70+
bikeSpeed.onBicycleSpeedManufacturerID(manufacturerIDDataPageHandler);
71+
bikeSpeed.onBicycleSpeedProductID(productIDDataPageHandler);
72+
hr.onDataPage(heartRateBaseDataPageHandler);
73+
hr.onHeartRateBatteryStatus(batteryStatusDataPageHandler);
74+
hr.onHeartRateCapabilities(capabilitiesDataPageHandler);
75+
hr.onHeartRateCumulativeOperatingTime(cumulativeOperatingTimeDataPageHandler);
76+
hr.onHeartRateDefault(defaultDataPageHandler);
77+
hr.onHeartRateManufacturerInformation(manufacturerInformationDataPageHandler);
78+
hr.onHeartRatePreviousHeartBeat(previousHeartBeatDataPageHandler);
79+
hr.onHeartRateProductInformation(productInformationDataPageHandler);
80+
hr.onHeartRateSwimIntervalSummary(swimIntervalSummary);
81+
flipProfile();
82+
}
83+
84+
void loop() {
85+
router.loop();
86+
if (millis() - timeLastSwitch > CHANNEL_RUNTIME) {
87+
timeLastSwitch = millis();
88+
flipProfile();
89+
}
90+
}
91+
92+
void flipProfile() {
93+
if (isHrProfileRunning) {
94+
// stop will be called by remove profile as well if you forget
95+
hr.stop();
96+
// remove by profile pointer
97+
router.removeProfile(&hr);
98+
router.setProfile(CHANNEL_0, &bikeSpeed);
99+
Serial.print("Profile added to channel: ");
100+
Serial.println(CHANNEL_0);
101+
bikeSpeed.begin();
102+
uint8_t status = bikeSpeed.waitForPair();
103+
printStatus(status);
104+
} else {
105+
bikeSpeed.stop();
106+
// remove by channel index
107+
router.removeProfileByChannel(CHANNEL_0);
108+
uint8_t channel = router.addProfileToNextChannel(&hr);
109+
Serial.print("Profile added to channel: ");
110+
Serial.println(channel);
111+
hr.begin();
112+
uint8_t status = hr.waitForPair();
113+
printStatus(status);
114+
}
115+
isHrProfileRunning = !isHrProfileRunning;
116+
}
117+
118+
void printDeviceId(BaseProfile *profile) {
119+
// print channel status
120+
Serial.println("===========================");
121+
Serial.print("Device Number: ");
122+
Serial.println(profile->getDeviceNumber());
123+
Serial.print("Transmisison Type: ");
124+
Serial.println(profile->getTransmissionType());
125+
}
126+
127+
void batteryStatusDataPageHandler(HeartRateBatteryStatus& msg, uintptr_t data) {
128+
Serial.print("Battery Level: ");
129+
Serial.println(msg.getBatteryLevel());
130+
Serial.print("Fractional Battery Voltage: ");
131+
Serial.println(msg.getFractionalBatteryVoltage());
132+
Serial.print("Coarse Battery Voltage: ");
133+
Serial.println(msg.getCoarseBatteryVoltage());
134+
Serial.print("Battery Status: ");
135+
Serial.println(msg.getBatteryStatus());
136+
}
137+
138+
void capabilitiesDataPageHandler(HeartRateCapabilities& msg, uintptr_t data) {
139+
Serial.print("Features Supported: ");
140+
heartRateFeatures(msg.getFeaturesSupported());
141+
Serial.print("Features Enabled: ");
142+
heartRateFeatures(msg.getFeaturesEnabled());
143+
}
144+
145+
void cumulativeOperatingTimeDataPageHandler(HeartRateCumulativeOperatingTime& msg, uintptr_t data) {
146+
Serial.print("Cumulative Operating Time: ");
147+
Serial.println(msg.getCumulativeOperatingTime());
148+
}
149+
150+
void defaultDataPageHandler(HeartRateDefault& msg, uintptr_t data) {
151+
// All fields are reserved
152+
}
153+
154+
void manufacturerInformationDataPageHandler(HeartRateManufacturerInformation& msg, uintptr_t data) {
155+
Serial.print("Manufacturer ID LSB: ");
156+
Serial.println(msg.getManufacturerIdLsb());
157+
Serial.print("Serial Number: ");
158+
Serial.println(msg.getSerialNumber());
159+
}
160+
161+
void previousHeartBeatDataPageHandler(HeartRatePreviousHeartBeat& dp, uintptr_t data) {
162+
Serial.print("Manufacturer Specific Byte: ");
163+
Serial.println(dp.getManufacturerSpecific());
164+
Serial.print("Previous Heart Beat Event Time: ");
165+
Serial.println(dp.getPreviousHeartBeatEventTime());
166+
}
167+
168+
void productInformationDataPageHandler(HeartRateProductInformation& msg, uintptr_t data) {
169+
Serial.print("Hardware Version: ");
170+
Serial.println(msg.getHardwareVersion());
171+
Serial.print("Software Version: ");
172+
Serial.println(msg.getSoftwareVersion());
173+
Serial.print("Model Number: ");
174+
Serial.println(msg.getModelNumber());
175+
}
176+
177+
void swimIntervalSummary(HeartRateSwimIntervalSummary& msg, uintptr_t data) {
178+
Serial.print("Interval Average Heart Rate: ");
179+
Serial.println(msg.getIntervalAverageHeartRate());
180+
Serial.print("Interval Maximum Heart Rate: ");
181+
Serial.println(msg.getIntervalMaximumHeartRate());
182+
Serial.print("Session Average Heart Rate: ");
183+
Serial.println(msg.getSessionAverageHeartRate());
184+
}
185+
186+
void heartRateBaseDataPageHandler(AntRxDataResponse& msg, uintptr_t data) {
187+
HeartRateBaseMainDataPage dp = HeartRateBaseMainDataPage(msg);
188+
Serial.println("===========================");
189+
Serial.print("DataPage: ");
190+
Serial.println(dp.getDataPageNumber());
191+
Serial.print("Heart Beat Event Time: ");
192+
Serial.println(dp.getHeartBeatEventTime());
193+
Serial.print("Heart Beat Count: ");
194+
Serial.println(dp.getHeartBeatCount());
195+
Serial.print("Computed Heart Rate: ");
196+
Serial.println(dp.getComputedHeartRate());
197+
}
198+
199+
void heartRateFeatures(uint8_t bitfield) {
200+
if (bitfield & ANTPLUS_HEARTRATE_DATAPAGE_CAPABILITIES_FEATURES_EXTENDEDRUNNING) {
201+
Serial.print("Extended Running ");
202+
}
203+
if (bitfield & ANTPLUS_HEARTRATE_DATAPAGE_CAPABILITIES_FEATURES_EXTENDEDCYCLING) {
204+
Serial.print("Extended Cycling ");
205+
}
206+
if (bitfield & ANTPLUS_HEARTRATE_DATAPAGE_CAPABILITIES_FEATURES_EXTENDEDSWIMMING) {
207+
Serial.print("Extended Swimming ");
208+
}
209+
if (bitfield & ANTPLUS_HEARTRATE_DATAPAGE_CAPABILITIES_FEATURES_MANUFACTURER1) {
210+
Serial.print("Manufacturer Bit 1 ");
211+
}
212+
if (bitfield & ANTPLUS_HEARTRATE_DATAPAGE_CAPABILITIES_FEATURES_MANUFACTURER2) {
213+
Serial.print("Manufacturer Bit 2 ");
214+
}
215+
Serial.println();
216+
}
217+
218+
void printStatus(uint8_t status) {
219+
Serial.print("Channel Status: ");
220+
switch (status) {
221+
case CHANNEL_STATUS_UNASSIGNED:
222+
Serial.println("Unassigned");
223+
break;
224+
case CHANNEL_STATUS_ASSIGNED:
225+
Serial.println("Assigned");
226+
break;
227+
case CHANNEL_STATUS_SEARCHING:
228+
Serial.println("Searching");
229+
break;
230+
case CHANNEL_STATUS_TRACKING:
231+
Serial.println("Tracking");
232+
break;
233+
}
234+
}
235+
236+
void batteryStatusDataPageHandler(BicycleSpeedBatteryStatus& msg, uintptr_t data) {
237+
Serial.print("Fractional Battery Voltage: ");
238+
Serial.println(msg.getFractionalBatteryVoltage());
239+
Serial.print("Coarse Battery Voltage: ");
240+
Serial.println(msg.getCoarseBatteryVoltage());
241+
Serial.print("Battery Status: ");
242+
bicycleSpeedBatteryStatus(msg.getBatteryStatus());
243+
}
244+
245+
void motionAndSpeedDataPageHandler(BicycleSpeedMotionAndSpeed& msg, uintptr_t data) {
246+
Serial.print("Flags: ");
247+
bicycleSpeedFlags(msg.getFlags());
248+
}
249+
250+
void cumulativeOperatingTimeDataPageHandler(BicycleSpeedCumulativeOperatingTime& msg, uintptr_t data) {
251+
Serial.print("Cumulative Operating Time: ");
252+
Serial.println(msg.getCumulativeOperatingTime());
253+
}
254+
255+
void defaultDataPageHandler(BicycleSpeedDefault& msg, uintptr_t data) {
256+
// All fields are reserved
257+
}
258+
259+
void manufacturerIDDataPageHandler(BicycleSpeedManufacturerID& msg, uintptr_t data) {
260+
Serial.print("Manufacturer ID LSB: ");
261+
Serial.println(msg.getManufacturerId());
262+
Serial.print("Serial Number: ");
263+
Serial.println(msg.getSerialNumber());
264+
}
265+
266+
void productIDDataPageHandler(BicycleSpeedProductID& msg, uintptr_t data) {
267+
Serial.print("Hardware Version: ");
268+
Serial.println(msg.getHardwareVersion());
269+
Serial.print("Software Version: ");
270+
Serial.println(msg.getSoftwareVersion());
271+
Serial.print("Model Number: ");
272+
Serial.println(msg.getModelNumber());
273+
}
274+
275+
void bicycleSpeedBaseDataPageHandler(AntRxDataResponse& msg, uintptr_t data) {
276+
BicycleSpeedBaseMainDataPage dp = BicycleSpeedBaseMainDataPage(msg);
277+
Serial.println("===========================");
278+
Serial.print("DataPage: ");
279+
Serial.println(dp.getDataPageNumber());
280+
Serial.print("Bike Speed Event Time: ");
281+
Serial.println(dp.getBikeSpeedEventTime());
282+
Serial.print("Cumulative Speed Revolution Count: ");
283+
Serial.println(dp.getCumulativeSpeedRevolutionCount());
284+
}
285+
286+
void bicycleSpeedFlags(uint8_t flags) {
287+
if (flags & ANTPLUS_BICYCLESPEED_DATAPAGE_MOTIONANDSPEED_FLAGS_STOPINDICATOR) {
288+
Serial.print("Motion Stopped");
289+
}
290+
Serial.println();
291+
}
292+
293+
void bicycleSpeedBatteryStatus(uint8_t flags) {
294+
switch (flags) {
295+
case ANTPLUS_BICYCLESPEED_DATAPAGE_BATTERSTATUS_BATTERYSTATUS_NEW:
296+
Serial.println("New");
297+
break;
298+
case ANTPLUS_BICYCLESPEED_DATAPAGE_BATTERSTATUS_BATTERYSTATUS_GOOD:
299+
Serial.println("Good");
300+
break;
301+
case ANTPLUS_BICYCLESPEED_DATAPAGE_BATTERSTATUS_BATTERYSTATUS_OK:
302+
Serial.println("Ok");
303+
break;
304+
case ANTPLUS_BICYCLESPEED_DATAPAGE_BATTERSTATUS_BATTERYSTATUS_LOW:
305+
Serial.println("Low");
306+
break;
307+
case ANTPLUS_BICYCLESPEED_DATAPAGE_BATTERSTATUS_BATTERYSTATUS_CRITICAL:
308+
Serial.println("Critical");
309+
break;
310+
case ANTPLUS_BICYCLESPEED_DATAPAGE_BATTERSTATUS_BATTERYSTATUS_INVALID:
311+
Serial.println("Invalid");
312+
break;
313+
default:
314+
Serial.println("Reserved/Unknown");
315+
break;
316+
}
317+
}

0 commit comments

Comments
 (0)