Skip to content

Commit 0758414

Browse files
committed
Merge branch 'develop'
Merge in fixes and features for v0.3.0
2 parents 68e0b7b + d27c430 commit 0758414

21 files changed

+590
-49
lines changed
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,318 @@
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+
Serial.begin(BAUD_RATE);
57+
Serial.println("Running");
58+
Serial1.begin(BAUD_RATE);
59+
ant.setSerial(Serial1);
60+
// Delay after initial setup to wait for user to connect on serial
61+
62+
router.setDriver(&ant); // never touch ant again
63+
router.setAntPlusNetworkKey(NETWORK_KEY);
64+
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+
uint8_t status;
94+
Serial.println("===========================");
95+
if (isHrProfileRunning) {
96+
// stop will be called by remove profile as well if you forget
97+
hr.stop();
98+
// remove by profile pointer
99+
router.removeProfile(&hr);
100+
router.setProfile(CHANNEL_0, &bikeSpeed);
101+
Serial.print("Profile added to channel: ");
102+
Serial.println(CHANNEL_0);
103+
bikeSpeed.begin();
104+
status = bikeSpeed.waitForPair();
105+
} else {
106+
bikeSpeed.stop();
107+
// remove by channel index
108+
router.removeProfileByChannel(CHANNEL_0);
109+
uint8_t channel = router.addProfileToNextChannel(&hr);
110+
Serial.print("Profile added to channel: ");
111+
Serial.println(channel);
112+
hr.begin();
113+
status = hr.waitForPair();
114+
}
115+
printStatus(status);
116+
isHrProfileRunning = !isHrProfileRunning;
117+
}
118+
119+
void printDeviceId(BaseProfile *profile) {
120+
// print channel status
121+
Serial.println("===========================");
122+
Serial.print("Device Number: ");
123+
Serial.println(profile->getDeviceNumber());
124+
Serial.print("Transmisison Type: ");
125+
Serial.println(profile->getTransmissionType());
126+
}
127+
128+
void batteryStatusDataPageHandler(HeartRateBatteryStatus& msg, uintptr_t data) {
129+
Serial.print("Battery Level: ");
130+
Serial.println(msg.getBatteryLevel());
131+
Serial.print("Fractional Battery Voltage: ");
132+
Serial.println(msg.getFractionalBatteryVoltage());
133+
Serial.print("Coarse Battery Voltage: ");
134+
Serial.println(msg.getCoarseBatteryVoltage());
135+
Serial.print("Battery Status: ");
136+
Serial.println(msg.getBatteryStatus());
137+
}
138+
139+
void capabilitiesDataPageHandler(HeartRateCapabilities& msg, uintptr_t data) {
140+
Serial.print("Features Supported: ");
141+
heartRateFeatures(msg.getFeaturesSupported());
142+
Serial.print("Features Enabled: ");
143+
heartRateFeatures(msg.getFeaturesEnabled());
144+
}
145+
146+
void cumulativeOperatingTimeDataPageHandler(HeartRateCumulativeOperatingTime& msg, uintptr_t data) {
147+
Serial.print("Cumulative Operating Time: ");
148+
Serial.println(msg.getCumulativeOperatingTime());
149+
}
150+
151+
void defaultDataPageHandler(HeartRateDefault& msg, uintptr_t data) {
152+
// All fields are reserved
153+
}
154+
155+
void manufacturerInformationDataPageHandler(HeartRateManufacturerInformation& msg, uintptr_t data) {
156+
Serial.print("Manufacturer ID LSB: ");
157+
Serial.println(msg.getManufacturerIdLsb());
158+
Serial.print("Serial Number: ");
159+
Serial.println(msg.getSerialNumber());
160+
}
161+
162+
void previousHeartBeatDataPageHandler(HeartRatePreviousHeartBeat& dp, uintptr_t data) {
163+
Serial.print("Manufacturer Specific Byte: ");
164+
Serial.println(dp.getManufacturerSpecific());
165+
Serial.print("Previous Heart Beat Event Time: ");
166+
Serial.println(dp.getPreviousHeartBeatEventTime());
167+
}
168+
169+
void productInformationDataPageHandler(HeartRateProductInformation& msg, uintptr_t data) {
170+
Serial.print("Hardware Version: ");
171+
Serial.println(msg.getHardwareVersion());
172+
Serial.print("Software Version: ");
173+
Serial.println(msg.getSoftwareVersion());
174+
Serial.print("Model Number: ");
175+
Serial.println(msg.getModelNumber());
176+
}
177+
178+
void swimIntervalSummary(HeartRateSwimIntervalSummary& msg, uintptr_t data) {
179+
Serial.print("Interval Average Heart Rate: ");
180+
Serial.println(msg.getIntervalAverageHeartRate());
181+
Serial.print("Interval Maximum Heart Rate: ");
182+
Serial.println(msg.getIntervalMaximumHeartRate());
183+
Serial.print("Session Average Heart Rate: ");
184+
Serial.println(msg.getSessionAverageHeartRate());
185+
}
186+
187+
void heartRateBaseDataPageHandler(AntRxDataResponse& msg, uintptr_t data) {
188+
HeartRateBaseMainDataPage dp = HeartRateBaseMainDataPage(msg);
189+
Serial.println("===========================");
190+
Serial.print("DataPage: ");
191+
Serial.println(dp.getDataPageNumber());
192+
Serial.print("Heart Beat Event Time: ");
193+
Serial.println(dp.getHeartBeatEventTime());
194+
Serial.print("Heart Beat Count: ");
195+
Serial.println(dp.getHeartBeatCount());
196+
Serial.print("Computed Heart Rate: ");
197+
Serial.println(dp.getComputedHeartRate());
198+
}
199+
200+
void heartRateFeatures(uint8_t bitfield) {
201+
if (bitfield & ANTPLUS_HEARTRATE_DATAPAGE_CAPABILITIES_FEATURES_EXTENDEDRUNNING) {
202+
Serial.print("Extended Running ");
203+
}
204+
if (bitfield & ANTPLUS_HEARTRATE_DATAPAGE_CAPABILITIES_FEATURES_EXTENDEDCYCLING) {
205+
Serial.print("Extended Cycling ");
206+
}
207+
if (bitfield & ANTPLUS_HEARTRATE_DATAPAGE_CAPABILITIES_FEATURES_EXTENDEDSWIMMING) {
208+
Serial.print("Extended Swimming ");
209+
}
210+
if (bitfield & ANTPLUS_HEARTRATE_DATAPAGE_CAPABILITIES_FEATURES_MANUFACTURER1) {
211+
Serial.print("Manufacturer Bit 1 ");
212+
}
213+
if (bitfield & ANTPLUS_HEARTRATE_DATAPAGE_CAPABILITIES_FEATURES_MANUFACTURER2) {
214+
Serial.print("Manufacturer Bit 2 ");
215+
}
216+
Serial.println();
217+
}
218+
219+
void printStatus(uint8_t status) {
220+
Serial.print("Channel Status: ");
221+
switch (status) {
222+
case CHANNEL_STATUS_UNASSIGNED:
223+
Serial.println("Unassigned");
224+
break;
225+
case CHANNEL_STATUS_ASSIGNED:
226+
Serial.println("Assigned");
227+
break;
228+
case CHANNEL_STATUS_SEARCHING:
229+
Serial.println("Searching");
230+
break;
231+
case CHANNEL_STATUS_TRACKING:
232+
Serial.println("Tracking");
233+
break;
234+
}
235+
}
236+
237+
void batteryStatusDataPageHandler(BicycleSpeedBatteryStatus& msg, uintptr_t data) {
238+
Serial.print("Fractional Battery Voltage: ");
239+
Serial.println(msg.getFractionalBatteryVoltage());
240+
Serial.print("Coarse Battery Voltage: ");
241+
Serial.println(msg.getCoarseBatteryVoltage());
242+
Serial.print("Battery Status: ");
243+
bicycleSpeedBatteryStatus(msg.getBatteryStatus());
244+
}
245+
246+
void motionAndSpeedDataPageHandler(BicycleSpeedMotionAndSpeed& msg, uintptr_t data) {
247+
Serial.print("Flags: ");
248+
bicycleSpeedFlags(msg.getFlags());
249+
}
250+
251+
void cumulativeOperatingTimeDataPageHandler(BicycleSpeedCumulativeOperatingTime& msg, uintptr_t data) {
252+
Serial.print("Cumulative Operating Time: ");
253+
Serial.println(msg.getCumulativeOperatingTime());
254+
}
255+
256+
void defaultDataPageHandler(BicycleSpeedDefault& msg, uintptr_t data) {
257+
// All fields are reserved
258+
}
259+
260+
void manufacturerIDDataPageHandler(BicycleSpeedManufacturerID& msg, uintptr_t data) {
261+
Serial.print("Manufacturer ID LSB: ");
262+
Serial.println(msg.getManufacturerId());
263+
Serial.print("Serial Number: ");
264+
Serial.println(msg.getSerialNumber());
265+
}
266+
267+
void productIDDataPageHandler(BicycleSpeedProductID& msg, uintptr_t data) {
268+
Serial.print("Hardware Version: ");
269+
Serial.println(msg.getHardwareVersion());
270+
Serial.print("Software Version: ");
271+
Serial.println(msg.getSoftwareVersion());
272+
Serial.print("Model Number: ");
273+
Serial.println(msg.getModelNumber());
274+
}
275+
276+
void bicycleSpeedBaseDataPageHandler(AntRxDataResponse& msg, uintptr_t data) {
277+
BicycleSpeedBaseMainDataPage dp = BicycleSpeedBaseMainDataPage(msg);
278+
Serial.println("===========================");
279+
Serial.print("DataPage: ");
280+
Serial.println(dp.getDataPageNumber());
281+
Serial.print("Bike Speed Event Time: ");
282+
Serial.println(dp.getBikeSpeedEventTime());
283+
Serial.print("Cumulative Speed Revolution Count: ");
284+
Serial.println(dp.getCumulativeSpeedRevolutionCount());
285+
}
286+
287+
void bicycleSpeedFlags(uint8_t flags) {
288+
if (flags & ANTPLUS_BICYCLESPEED_DATAPAGE_MOTIONANDSPEED_FLAGS_STOPINDICATOR) {
289+
Serial.print("Motion Stopped");
290+
}
291+
Serial.println();
292+
}
293+
294+
void bicycleSpeedBatteryStatus(uint8_t flags) {
295+
switch (flags) {
296+
case ANTPLUS_BICYCLESPEED_DATAPAGE_BATTERSTATUS_BATTERYSTATUS_NEW:
297+
Serial.println("New");
298+
break;
299+
case ANTPLUS_BICYCLESPEED_DATAPAGE_BATTERSTATUS_BATTERYSTATUS_GOOD:
300+
Serial.println("Good");
301+
break;
302+
case ANTPLUS_BICYCLESPEED_DATAPAGE_BATTERSTATUS_BATTERYSTATUS_OK:
303+
Serial.println("Ok");
304+
break;
305+
case ANTPLUS_BICYCLESPEED_DATAPAGE_BATTERSTATUS_BATTERYSTATUS_LOW:
306+
Serial.println("Low");
307+
break;
308+
case ANTPLUS_BICYCLESPEED_DATAPAGE_BATTERSTATUS_BATTERYSTATUS_CRITICAL:
309+
Serial.println("Critical");
310+
break;
311+
case ANTPLUS_BICYCLESPEED_DATAPAGE_BATTERSTATUS_BATTERYSTATUS_INVALID:
312+
Serial.println("Invalid");
313+
break;
314+
default:
315+
Serial.println("Reserved/Unknown");
316+
break;
317+
}
318+
}

platformio.ini

+8-1
Original file line numberDiff line numberDiff line change
@@ -20,4 +20,11 @@
2020
[env:teensy31]
2121
platform = teensy
2222
framework = arduino
23-
board = teensy31
23+
board = teensy31
24+
lib_deps = ANT
25+
26+
[env:huzzah32]
27+
platform = espressif32
28+
framework = arduino
29+
board = featheresp32
30+
lib_deps = ANT

src/ANTPLUS_Defines.h

+2-1
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@
1010
// Errors
1111
#define ANTPLUS_RESET_RADIO_FAILED 1
1212
#define ANTPLUS_MAX_CHANNEL_CHECK_FAILED 2
13+
#define ANTPLUS_NO_MORE_CHANNELS 255
1314

1415
// State
1516
#define ANTPLUS_DRIVER_STATE_UNKNOWN 0
@@ -19,4 +20,4 @@
1920
#define ANTPLUS_RESET_NO_WAIT_FOR_STARTUP 0
2021
#define ANTPLUS_RESET_WAIT_FOR_STARTUP 1
2122

22-
#endif // ANTPLUS_DEFINES_h
23+
#endif // ANTPLUS_DEFINES_h
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,10 @@
1+
#include <BaseClasses/ANTPLUS_BaseDataPageMsg.h>
2+
3+
#include "ANT.h"
4+
5+
template<class T>
6+
BaseDataPageMsg<T>::BaseDataPageMsg() : CoreDataPage<T>() {
7+
}
8+
9+
template class BaseDataPageMsg<BroadcastDataMsg>;
10+
template class BaseDataPageMsg<AcknowledgedDataMsg>;

src/BaseClasses/ANTPLUS_BaseMasterProfile.h

+2-5
Original file line numberDiff line numberDiff line change
@@ -6,18 +6,15 @@
66
class BaseMasterProfile : public BaseProfile {
77
public:
88
BaseMasterProfile(uint16_t deviceNumber, uint8_t transmissionType);
9-
/******************************************
10-
*LIBRARY INTERNAL ONLY FUNCTIONS BELOW
11-
******************************************/
9+
protected:
1210
/**
1311
* Used to catch EVENT_TX and continue transmission pattern
1412
*/
1513
virtual void onChannelEventResponse(ChannelEventResponse& msg);
16-
protected:
1714
/**
1815
* This function, when called, will transmit the next message in the broadcast pattern
1916
*/
2017
virtual void transmitNextDataPage() = 0;
2118
};
2219

23-
#endif // ANTPLUS_BASESLAVEPROFILE_h
20+
#endif // ANTPLUS_BASESLAVEPROFILE_h

src/BaseClasses/ANTPLUS_BaseProfile.cpp

+4
Original file line numberDiff line numberDiff line change
@@ -143,10 +143,14 @@ void BaseProfile::loop() {
143143
}
144144

145145
void BaseProfile::begin() {
146+
if (!_router)
147+
return;
146148
pushChannelConfig();
147149
openChannel();
148150
}
149151

150152
void BaseProfile::stop() {
153+
if (!_router)
154+
return;
151155
closeChannel();
152156
}

0 commit comments

Comments
 (0)