Skip to content

Commit 1a000fd

Browse files
authored
Merge pull request #28 from sporkfly/sporkfly-antplus-arduino-power
Addition of Bicycle Power profile
2 parents 20ea984 + cb8d52c commit 1a000fd

File tree

41 files changed

+1094
-0
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

41 files changed

+1094
-0
lines changed
Lines changed: 232 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,232 @@
1+
/***********************************
2+
* AntPlus Bicycle Power Display example
3+
*
4+
* Finds a nearby Bike Power Sensor, pairs
5+
* to it and then reads the information
6+
* out via the serial port.
7+
*
8+
* Example built for ESP32
9+
* Note: HardwareSerial required for this controller
10+
*
11+
* Author Andrew Hillier
12+
* based on the work of Curtis Malainey
13+
************************************/
14+
#include <Arduino.h>
15+
#include "ANT.h"
16+
#include "ANTPLUS.h"
17+
#include <HardwareSerial.h>
18+
19+
#define BAUD_RATE 9600
20+
#define CHANNEL_0 0
21+
22+
const uint8_t NETWORK_KEY[] = {0x00, 0x11, 0x22, 0x33, 0x44, 0x55, 0x66, 0x77}; // get this from thisisant.com
23+
24+
// *************************************
25+
// Specific to test ANT+ chip and ESP32 setup
26+
const int RTS_PIN = 23;
27+
const int SUSPEND_PIN = 22;
28+
const int SLEEP_PIN = 19;
29+
const int RESET_PIN = 2;
30+
const int TX_PIN = 17;
31+
const int RX_PIN = 16;
32+
33+
HardwareSerial antSerial(2);
34+
35+
// *************************************
36+
37+
ArduinoSerialAntWithCallbacks ant;
38+
AntPlusRouter router;
39+
ProfileBicyclePowerDisplay bikePower;
40+
41+
void bicyclePowerBaseDataPageHandler(AntRxDataResponse& msg, uintptr_t data);
42+
void batteryStatusDataPageHandler(BicyclePowerBatteryStatus& msg, uintptr_t data);
43+
void cumulativeOperatingTimeDataPageHandler(BicyclePowerCumulativeOperatingTime& msg, uintptr_t data);
44+
void manufacturerIDDataPageHandler(BicyclePowerManufacturerID& msg, uintptr_t data);
45+
void productIDDataPageHandler(BicyclePowerProductID& msg, uintptr_t data);
46+
void powerOnlyDataPageHandler(BicyclePowerPowerOnly& msg, uintptr_t data);
47+
void crankTorqueDataPageHandler(BicyclePowerCrankTorque& msg, uintptr_t data);
48+
void wheelTorqueDataPageHandler(BicyclePowerWheelTorque& msg, uintptr_t data);
49+
void pedalSmoothnessDataPageHandler(BicyclePowerPedalSmoothness& msg, uintptr_t data);
50+
51+
void bicyclePowerBatteryStatus(uint8_t flags);
52+
void printStatus(uint8_t status);
53+
54+
void setup() {
55+
56+
// Powering on the ANT+ chip
57+
// *************************************
58+
59+
pinMode(SUSPEND_PIN, OUTPUT);
60+
pinMode(SLEEP_PIN, OUTPUT);
61+
pinMode(RESET_PIN, OUTPUT);
62+
pinMode(RTS_PIN, INPUT);
63+
64+
digitalWrite(RESET_PIN, HIGH);
65+
digitalWrite(SUSPEND_PIN, HIGH);
66+
digitalWrite(SLEEP_PIN, LOW);
67+
68+
69+
// *************************************
70+
71+
antSerial.begin(BAUD_RATE);
72+
ant.setSerial(antSerial);
73+
delay(15000);
74+
75+
router.setDriver(&ant); // never touch ant again
76+
router.setAntPlusNetworkKey(NETWORK_KEY);
77+
router.setProfile(CHANNEL_0, &bikePower);
78+
// Delay after initial setup to wait for user to connect on serial
79+
80+
Serial.begin(BAUD_RATE);
81+
Serial.println("Running");
82+
bikePower.onDataPage(bicyclePowerBaseDataPageHandler);
83+
bikePower.onBicyclePowerBatteryStatus(batteryStatusDataPageHandler);
84+
bikePower.onBicyclePowerCumulativeOperatingTime(cumulativeOperatingTimeDataPageHandler);
85+
bikePower.onBicyclePowerManufacturerID(manufacturerIDDataPageHandler);
86+
bikePower.onBicyclePowerProductID(productIDDataPageHandler);
87+
bikePower.onBicyclePowerPowerOnly(powerOnlyDataPageHandler);
88+
bikePower.onBicyclePowerCrankTorque(crankTorqueDataPageHandler);
89+
bikePower.onBicyclePowerWheelTorque(wheelTorqueDataPageHandler);
90+
bikePower.onBicyclePowerPedalSmoothness(pedalSmoothnessDataPageHandler);
91+
bikePower.begin();
92+
// wait for pair to complete
93+
uint8_t status = bikePower.waitForPair();
94+
// print channel status
95+
Serial.println("===========================");
96+
printStatus(status);
97+
Serial.print("Device Number: ");
98+
Serial.println(bikePower.getDeviceNumber());
99+
Serial.print("Transmisison Type: ");
100+
Serial.println(bikePower.getTransmissionType());
101+
}
102+
103+
void loop() {
104+
router.loop();
105+
}
106+
107+
void batteryStatusDataPageHandler(BicyclePowerBatteryStatus& msg, uintptr_t data) {
108+
Serial.print("Fractional Battery Voltage: ");
109+
Serial.println(msg.getFractionalBatteryVoltage());
110+
Serial.print("Battery Status: ");
111+
bicyclePowerBatteryStatus(msg.getBatteryStatus());
112+
}
113+
114+
void cumulativeOperatingTimeDataPageHandler(BicyclePowerCumulativeOperatingTime& msg, uintptr_t data) {
115+
Serial.print("Cumulative Operating Time: ");
116+
Serial.println(msg.getCumulativeOperatingTime());
117+
}
118+
119+
void manufacturerIDDataPageHandler(BicyclePowerManufacturerID& msg, uintptr_t data) {
120+
Serial.print("Hardware ID: ");
121+
Serial.println(msg.getHardwareVersion());
122+
Serial.print("Manufacturer ID: ");
123+
Serial.println(msg.getManufacturerId());
124+
Serial.print("Model Number: ");
125+
Serial.println(msg.getModelNumber());
126+
}
127+
128+
void productIDDataPageHandler(BicyclePowerProductID& msg, uintptr_t data) {
129+
Serial.print("Software Version Supplemental: ");
130+
Serial.println(msg.getSoftwareVersionSupplemental());
131+
Serial.print("Software Version: ");
132+
Serial.println(msg.getSoftwareVersion());
133+
Serial.print("Serial Number: ");
134+
Serial.println(msg.getSerialNumber());
135+
}
136+
137+
void bicyclePowerBaseDataPageHandler(AntRxDataResponse& msg, uintptr_t data) {
138+
BicyclePowerBaseMainDataPage dp = BicyclePowerBaseMainDataPage(msg);
139+
Serial.println("===========================");
140+
Serial.print("DataPage: ");
141+
Serial.println(dp.getDataPageNumber());
142+
Serial.print("Bike Power Event Count: ");
143+
Serial.println(dp.getUpdateEventCount());
144+
}
145+
146+
void powerOnlyDataPageHandler(BicyclePowerPowerOnly& msg, uintptr_t data) {
147+
Serial.print("Pedal Balance: ");
148+
Serial.println(msg.getPedalBalance());
149+
Serial.print("Instant Cadence: ");
150+
Serial.println(msg.getInstantCadence());
151+
Serial.print("Accumulated Power: ");
152+
Serial.println(msg.getAccumulatedPower());
153+
Serial.print("Instant Power: ");
154+
Serial.println(msg.getInstantPower());
155+
}
156+
157+
void crankTorqueDataPageHandler(BicyclePowerCrankTorque& msg, uintptr_t data) {
158+
Serial.print("Crank Ticks: ");
159+
Serial.println(msg.getCrankTicks());
160+
Serial.print("Instant Cadence: ");
161+
Serial.println(msg.getInstantCadence());
162+
Serial.print("Crank Period: ");
163+
Serial.println(msg.getCrankPeriod());
164+
Serial.print("Accumulated Torque: ");
165+
Serial.println(msg.getAccumulatedTorque());
166+
}
167+
168+
void wheelTorqueDataPageHandler(BicyclePowerWheelTorque& msg, uintptr_t data) {
169+
Serial.print("Wheel Ticks: ");
170+
Serial.println(msg.getWheelTicks());
171+
Serial.print("Instant Cadence: ");
172+
Serial.println(msg.getInstantCadence());
173+
Serial.print("Wheel Period: ");
174+
Serial.println(msg.getWheelPeriod());
175+
Serial.print("Accumulated Torque: ");
176+
Serial.println(msg.getAccumulatedTorque());
177+
}
178+
179+
void pedalSmoothnessDataPageHandler(BicyclePowerPedalSmoothness& msg, uintptr_t data) {
180+
Serial.print("Left Torque Effectiveness: ");
181+
Serial.println(msg.getLeftTorqueEffectiveness());
182+
Serial.print("Right Torque Effectiveness: ");
183+
Serial.println(msg.getRightTorqueEffectiveness());
184+
Serial.print("Left Pedal Smoothness: ");
185+
Serial.println(msg.getLeftPedalSmoothness());
186+
Serial.print("Right Pedal Smoothness: ");
187+
Serial.println(msg.getRightPedalSmoothness());
188+
}
189+
190+
void printStatus(uint8_t status) {
191+
Serial.print("Channel Status: ");
192+
switch (status) {
193+
case CHANNEL_STATUS_UNASSIGNED:
194+
Serial.println("Unassigned");
195+
break;
196+
case CHANNEL_STATUS_ASSIGNED:
197+
Serial.println("Assigned");
198+
break;
199+
case CHANNEL_STATUS_SEARCHING:
200+
Serial.println("Searching");
201+
break;
202+
case CHANNEL_STATUS_TRACKING:
203+
Serial.println("Tracking");
204+
break;
205+
}
206+
}
207+
208+
void bicyclePowerBatteryStatus(uint8_t flags) {
209+
switch (flags) {
210+
case ANTPLUS_BICYCLEPOWER_DATAPAGE_BATTERYSTATUS_BATTERYSTATUS_NEW:
211+
Serial.println("New");
212+
break;
213+
case ANTPLUS_BICYCLEPOWER_DATAPAGE_BATTERYSTATUS_BATTERYSTATUS_GOOD:
214+
Serial.println("Good");
215+
break;
216+
case ANTPLUS_BICYCLEPOWER_DATAPAGE_BATTERYSTATUS_BATTERYSTATUS_OK:
217+
Serial.println("Ok");
218+
break;
219+
case ANTPLUS_BICYCLEPOWER_DATAPAGE_BATTERYSTATUS_BATTERYSTATUS_LOW:
220+
Serial.println("Low");
221+
break;
222+
case ANTPLUS_BICYCLEPOWER_DATAPAGE_BATTERYSTATUS_BATTERYSTATUS_CRITICAL:
223+
Serial.println("Critical");
224+
break;
225+
case ANTPLUS_BICYCLEPOWER_DATAPAGE_BATTERYSTATUS_BATTERYSTATUS_INVALID:
226+
Serial.println("Invalid");
227+
break;
228+
default:
229+
Serial.println("Reserved/Unknown");
230+
break;
231+
}
232+
}
Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,13 @@
1+
#ifndef ANTPLUS_BICYCLEPOWERPROFILEDEFINES_h
2+
#define ANTPLUS_BICYCLEPOWERPROFILEDEFINES_h
3+
4+
#define ANTPLUS_BICYCLEPOWER_DEVICETYPE 11
5+
6+
#define ANTPLUS_BICYCLEPOWER_DATAPAGE_BATTERYSTATUS_BATTERYSTATUS_NEW 1
7+
#define ANTPLUS_BICYCLEPOWER_DATAPAGE_BATTERYSTATUS_BATTERYSTATUS_GOOD 2
8+
#define ANTPLUS_BICYCLEPOWER_DATAPAGE_BATTERYSTATUS_BATTERYSTATUS_OK 3
9+
#define ANTPLUS_BICYCLEPOWER_DATAPAGE_BATTERYSTATUS_BATTERYSTATUS_LOW 4
10+
#define ANTPLUS_BICYCLEPOWER_DATAPAGE_BATTERYSTATUS_BATTERYSTATUS_CRITICAL 5
11+
#define ANTPLUS_BICYCLEPOWER_DATAPAGE_BATTERYSTATUS_BATTERYSTATUS_INVALID 7
12+
13+
#endif //
Lines changed: 119 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,119 @@
1+
#ifndef ANTPLUS_BICYCLEPOWERDEFINES_h
2+
#define ANTPLUS_BICYCLEPOWERDEFINES_h
3+
4+
/* Channel Config */
5+
#define ANTPLUS_BICYCLEPOWER_DEVICETYPE11
6+
#define ANTPLUS_BICYCLEPOWER_DISPLAY_CHANNELTYPE CHANNEL_TYPE_BIDIRECTIONAL_RECEIVE
7+
#define ANTPLUS_BICYCLEPOWER_MONITOR_CHANNELTYPE CHANNEL_TYPE_BIDIRECTIONAL_TRANSMIT
8+
#define ANTPLUS_BICYCLEPOWER_CHANNELPERIOD 8182
9+
10+
#define ANTPLUS_BICYCLEPOWER_SEARCHTIMEOUT 12
11+
12+
/* Fixed Bytes */
13+
#define ANTPLUS_BICYCLEPOWER_DATAPAGE_DATAPAGE_BYTE 0
14+
#define ANTPLUS_BICYCLEPOWER_DATAPAGE_UPDATEEVENTCOUNT_BYTE1
15+
16+
/* Power Only Main Data Page */
17+
/* DataPage for Power Only, CTF does not need to support.
18+
* Note: Currently not writing any of this with CTF in mind.
19+
* CTF support needs to be added (not in scope for my project.
20+
*/
21+
#define ANTPLUS_BICYCLEPOWER_DATAPAGE_DATAPAGE_POWERONLY_NUMBER0x10 // Changed, update throughout
22+
23+
#define ANTPLUS_BICYCLEPOWER_DATAPAGE_PEDALPOWER_POWERONLY_BYTE 2
24+
#define ANTPLUS_BICYCLEPOWER_DATAPAGE_CADENCE_POWERONLY_BYTE 3
25+
#define ANTPLUS_BICYCLEPOWER_DATAPAGE_ACCUMULATEDPOWERLSB_POWERONLY_BYTE4
26+
#define ANTPLUS_BICYCLEPOWER_DATAPAGE_ACCUMULATEDPOWERMSB_POWERONLY_BYTE5
27+
#define ANTPLUS_BICYCLEPOWER_DATAPAGE_INSTANTPOWERLSB_POWERONLY_BYTE6
28+
#define ANTPLUS_BICYCLEPOWER_DATAPAGE_INSTANTPOWERMSB_POWERONLY_BYTE7
29+
30+
/* Wheel Torque Main Data Page */
31+
32+
#define ANTPLUS_BICYCLEPOWER_DATAPAGE_DATAPAGE_WHEELTORQUE_NUMBER0x11 // New
33+
34+
#define ANTPLUS_BICYCLEPOWER_DATAPAGE_WHEELTICKS_WHEELTORQUE_BYTE 2 // New
35+
#define ANTPLUS_BICYCLEPOWER_DATAPAGE_CADENCE_WHEELTORQUE_BYTE 3 // New
36+
#define ANTPLUS_BICYCLEPOWER_DATAPAGE_WHEELPERIODLSB_WHEELTORQUE_BYTE4 // New
37+
#define ANTPLUS_BICYCLEPOWER_DATAPAGE_WHEELPERIODMSB_WHEELTORQUE_BYTE5 // New
38+
#define ANTPLUS_BICYCLEPOWER_DATAPAGE_ACCUMULATEDTORQUELSB_WHEELTORQUE_BYTE6 // New
39+
#define ANTPLUS_BICYCLEPOWER_DATAPAGE_ACCUMULATEDTORQUEMSB_WHEELTORQUE_BYTE7 // New
40+
41+
/* Standard Crank Torque Main Data Page */
42+
43+
#define ANTPLUS_BICYCLEPOWER_DATAPAGE_DATAPAGE_CRANKTORQUE_NUMBER0x12 // New
44+
45+
#define ANTPLUS_BICYCLEPOWER_DATAPAGE_CRANKTICKS_CRANKTORQUE_BYTE 2 // New
46+
#define ANTPLUS_BICYCLEPOWER_DATAPAGE_CADENCE_CRANKTORQUE_BYTE 3 // New
47+
#define ANTPLUS_BICYCLEPOWER_DATAPAGE_CRANKPERIODLSB_CRANKTORQUE_BYTE4 // New
48+
#define ANTPLUS_BICYCLEPOWER_DATAPAGE_CRANKPERIODMSB_CRANKTORQUE_BYTE5 // New
49+
#define ANTPLUS_BICYCLEPOWER_DATAPAGE_ACCUMULATEDTORQUELSB_CRANKTORQUE_BYTE6 // New
50+
#define ANTPLUS_BICYCLEPOWER_DATAPAGE_ACCUMULATEDTORQUEMSB_CRANKTORQUE_BYTE7 // New
51+
52+
/* Pedal Smoothness Main Data Page */
53+
54+
#define ANTPLUS_BICYCLEPOWER_DATAPAGE_DATAPAGE_PEDALSMOOTHNESS_NUMBER0x13 // New
55+
56+
#define ANTPLUS_BICYCLEPOWER_DATAPAGE_LEFTEFFECTIVENESS_PEDALSMOOTHNESS_BYTE2 // New
57+
#define ANTPLUS_BICYCLEPOWER_DATAPAGE_RIGHTEFFECTIVENESS_PEDALSMOOTHNESS_BYTE3 // New
58+
#define ANTPLUS_BICYCLEPOWER_DATAPAGE_LEFTSMOOTHNESS_PEDALSMOOTHNESS_BYTE4 // New
59+
#define ANTPLUS_BICYCLEPOWER_DATAPAGE_RIGHTSMOOTHNESS_PEDALSMOOTHNESS_BYTE5 // New
60+
61+
/* Crank Torque Frequency Main Data Page
62+
63+
NOTE: CTF messages are big endian. The byte order for multi-byte
64+
fields in these messages is reversed with respect to standard ANT+ messages
65+
66+
Not implemented.
67+
*/
68+
69+
/*
70+
#define ANTPLUS_BICYCLEPOWER_DATAPAGE_DATAPAGE_CTF_NUMBER 0x20 // New
71+
72+
#define ANTPLUS_BICYCLEPOWER_DATAPAGE_SLOPEMSB_CTF_BYTE 2 // New
73+
#define ANTPLUS_BICYCLEPOWER_DATAPAGE_SLOPELSB_CTF_BYTE 3 // New
74+
#define ANTPLUS_BICYCLEPOWER_DATAPAGE_TIMESTAMPMSB_CTF_BYTE 4 // New
75+
#define ANTPLUS_BICYCLEPOWER_DATAPAGE_TIMESTAMPLSB_CTF_BYTE 5 // New
76+
#define ANTPLUS_BICYCLEPOWER_DATAPAGE_TORQUETICKSTAMPMSB_CTF_BYTE 6 // New
77+
#define ANTPLUS_BICYCLEPOWER_DATAPAGE_TORQUETICKSTAMPLSB_CTF_BYTE 7 // New
78+
*/
79+
80+
/* Manufacturer Information */
81+
#define ANTPLUS_BICYCLEPOWER_DATAPAGE_MANUFACTURERID_NUMBER0x50
82+
83+
#define ANTPLUS_BICYCLEPOWER_DATAPAGE_MANUFACTURERID_HARDWAREVERSION_BYTE3
84+
#define ANTPLUS_BICYCLEPOWER_DATAPAGE_MANUFACTURERID_MANUFACTURERIDLSB_BYTE4
85+
#define ANTPLUS_BICYCLEPOWER_DATAPAGE_MANUFACTURERID_MANUFACTURERIDMSB_BYTE5
86+
#define ANTPLUS_BICYCLEPOWER_DATAPAGE_MANUFACTURERID_MODELNUMBERLSB_BYTE6
87+
#define ANTPLUS_BICYCLEPOWER_DATAPAGE_MANUFACTURERID_MODELNUMBERMSB_BYTE7
88+
89+
90+
/* Product Information */
91+
#define ANTPLUS_BICYCLEPOWER_DATAPAGE_PRODUCTID_NUMBER0x51
92+
93+
#define ANTPLUS_BICYCLEPOWER_DATAPAGE_PRODUCTID_SOFTWAREVERSIONSUPP_BYTE2
94+
#define ANTPLUS_BICYCLEPOWER_DATAPAGE_PRODUCTID_SOFTWAREVERSION_BYTE 3
95+
#define ANTPLUS_BICYCLEPOWER_DATAPAGE_PRODUCTID_SERIALNUMBERLSB_BYTE4
96+
#define ANTPLUS_BICYCLEPOWER_DATAPAGE_PRODUCTID_SERIALNUMBERMSB_BYTE7
97+
98+
/* Battery Status */
99+
#define ANTPLUS_BICYCLEPOWER_DATAPAGE_BATTERYSTATUS_NUMBER 0x52
100+
#define ANTPLUS_BICYCLEPOWER_DATAPAGE_CUMULATIVEOPERATINGTIME_NUMBER 52
101+
102+
#define ANTPLUS_BICYCLEPOWER_DATAPAGE_BATTERYSTATUS_IDENTIFIER_BYTE 2
103+
104+
#define ANTPLUS_BICYCLEPOWER_DATAPAGE_CUMULATIVEOPERATINGTIME_TIMELSB_BYTE 3
105+
#define ANTPLUS_BICYCLEPOWER_DATAPAGE_CUMULATIVEOPERATINGTIME_TIMEMSB_BYTE 5
106+
#define ANTPLUS_BICYCLEPOWER_DATAPAGE_BATTERYSTATUS_FRACTIONALBATTERYVOLTAGE_BYTE 6
107+
#define ANTPLUS_BICYCLEPOWER_DATAPAGE_BATTERYSTATUS_BATTERYSTATUS_BYTE 7
108+
#define ANTPLUS_BICYCLEPOWER_DATAPAGE_BATTERYSTATUS_COARSEBATTERYVOLTAGE_BYTE7
109+
110+
#define ANTPLUS_BICYCLEPOWER_DATAPAGE_BATTERYSTATUS_COARSEBATTERYVOLTAGE_MASK0x0F
111+
#define ANTPLUS_BICYCLEPOWER_DATAPAGE_BATTERYSTATUS_BATTERYSTATUS_MASK 0x70
112+
113+
#define ANTPLUS_BICYCLEPOWER_DATAPAGE_BATTERYSTATUS_BATTERYSTATUS_SHIFT 4
114+
115+
#define ANTPLUS_BICYCLEPOWER_DATAPAGE_BATTERYSTATUS_BATTERYIDENTIFIER_SHIFT 4
116+
117+
118+
119+
#endif
Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,13 @@
1+
#ifndef ANTPLUS_BICYCLEPOWERPROFILE_h
2+
#define ANTPLUS_BICYCLEPOWERPROFILE_h
3+
4+
// General Definitions
5+
#include <Profiles/BicyclePower/ANTPLUS_BicyclePowerDefines.h>
6+
7+
// Datapages
8+
#include <Profiles/BicyclePower/DataPages/ANTPLUS_ProfileBicyclePowerDataPages.h>
9+
10+
// Profile Classes
11+
#include <Profiles/BicyclePower/Display/ANTPLUS_ProfileBicyclePowerDisplay.h>
12+
13+
#endif // ANTPLUS_BICYCLEPOWERPROFILE_h
Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,14 @@
1+
#ifndef ANTPLUS_PROFILEBICYCLEPOWERDATAPAGES_h
2+
#define ANTPLUS_PROFILEBICYCLEPOWERDATAPAGES_h
3+
4+
/* RX */
5+
#include <Profiles/BicyclePower/DataPages/RX/ANTPLUS_BicyclePowerBatteryStatus.h>
6+
#include <Profiles/BicyclePower/DataPages/RX/ANTPLUS_BicyclePowerCumulativeOperatingTime.h>
7+
#include <Profiles/BicyclePower/DataPages/RX/ANTPLUS_BicyclePowerManufacturerID.h>
8+
#include <Profiles/BicyclePower/DataPages/RX/ANTPLUS_BicyclePowerProductID.h>
9+
#include <Profiles/BicyclePower/DataPages/RX/ANTPLUS_BicyclePowerPowerOnly.h>
10+
#include <Profiles/BicyclePower/DataPages/RX/ANTPLUS_BicyclePowerWheelTorque.h>
11+
#include <Profiles/BicyclePower/DataPages/RX/ANTPLUS_BicyclePowerCrankTorque.h>
12+
#include <Profiles/BicyclePower/DataPages/RX/ANTPLUS_BicyclePowerPedalSmoothness.h>
13+
14+
#endif // ANTPLUS_PROFILEBICYCLEPOWERDATAPAGES_h

0 commit comments

Comments
 (0)