Skip to content

Commit ce66d47

Browse files
committed
Merge branch 'develop'
merge v1.1.0
2 parents a9b61bf + 9146761 commit ce66d47

File tree

56 files changed

+460
-255
lines changed

Some content is hidden

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

56 files changed

+460
-255
lines changed

.travis.yml

+1-1
Original file line numberDiff line numberDiff line change
@@ -26,7 +26,7 @@
2626

2727
language: python
2828
python:
29-
- "2.7"
29+
- "3.6"
3030

3131
sudo: false
3232
cache:

README.md

+1
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@ An Implementation of the Ant+ Network on top of [ant-arduino](https://github.com
99

1010
## News
1111

12+
* 6/28/2020 v2.0.0 of ant-arduino released with support for mbed and softdevices
1213
* 8/20/2019 v1.0.0 released, master profiles now are available
1314
* 10/1/2017 v0.1.0 Version released, library added to managers
1415
* 9/24/2017 Proof of concept complete (for system design)

library.json

+5-4
Original file line numberDiff line numberDiff line change
@@ -7,13 +7,14 @@
77
"type": "git",
88
"url": "https://github.com/cujomalainey/antplus-arduino.git"
99
},
10-
"version": "1.0.0",
11-
"frameworks": "arduino",
12-
"platforms": "atmelavr, atmelsam, espressif32, espressif8266, intel_arc32, microchippic32, nordicnrf51, nordicnrf52, ststm32, timsp430, teensy",
10+
"version": "1.1.0",
11+
"frameworks": "*",
12+
"platforms": "*",
1313
"dependencies":
1414
[
1515
{
16-
"name":"ANT"
16+
"name":"ANT",
17+
"version": ">=2.0.0"
1718
}
1819
]
1920
}

library.properties

+1-1
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
name=ANTPLUS-Arduino
2-
version=1.0.0
2+
version=1.1.0
33
author=Curtis Malainey <[email protected]>
44
maintainer=Curtis Malainey <[email protected]>
55
sentence=Library for easy ANT+ integration

platformio.ini

+7
Original file line numberDiff line numberDiff line change
@@ -35,3 +35,10 @@ platform = espressif32
3535
framework = arduino
3636
board = featheresp32
3737
lib_deps = ANT
38+
39+
[env:nrf52_express]
40+
board = adafruit_feather_nrf52840_s340
41+
framework = arduino
42+
platform = nordicnrf52
43+
platform_packages = framework-arduinoadafruitnrf52 @ https://github.com/cujomalainey/Adafruit_nRF52_Arduino
44+
lib_deps = https://github.com/cujomalainey/ant-arduino.git#develop

src/BaseClasses/ANTPLUS_BaseDataPage.h

+4-4
Original file line numberDiff line numberDiff line change
@@ -12,10 +12,10 @@ class BaseDataPage : virtual public CoreDataPage<T> {
1212
#ifndef UNIT_TEST
1313
protected:
1414
#endif // UNIT_TEST
15-
uint8_t get8BitValue(uint8_t byte, uint8_t mask = 0xFF, uint8_t shift = 0);
16-
uint16_t get16BitValue(uint8_t lsb_byte, uint8_t msb_byte, uint16_t mask = 0xFFFF, uint8_t shift = 0);
17-
uint32_t get24BitValue(uint8_t lsb_byte, uint8_t msb_byte, uint32_t mask = 0xFFFFFF, uint8_t shift = 0);
18-
uint32_t get32BitValue(uint8_t lsb_byte, uint8_t msb_byte, uint32_t mask = 0xFFFFFFFF, uint8_t shift = 0);
15+
uint8_t get8BitValue(uint8_t byte, uint8_t mask = 0xFF, uint8_t shift = 0) override;
16+
uint16_t get16BitValue(uint8_t lsb_byte, uint8_t msb_byte, uint16_t mask = 0xFFFF, uint8_t shift = 0) override;
17+
uint32_t get24BitValue(uint8_t lsb_byte, uint8_t msb_byte, uint32_t mask = 0xFFFFFF, uint8_t shift = 0) override;
18+
uint32_t get32BitValue(uint8_t lsb_byte, uint8_t msb_byte, uint32_t mask = 0xFFFFFFFF, uint8_t shift = 0) override;
1919
};
2020

2121
#endif // ANTPLUS_BASEDATAPAGE_h

src/BaseClasses/ANTPLUS_BaseDataPageMsg.h

+4-4
Original file line numberDiff line numberDiff line change
@@ -10,10 +10,10 @@ class BaseDataPageMsg : virtual public CoreDataPage<T> {
1010
#ifndef UNIT_TEST
1111
protected:
1212
#endif // UNIT_TEST
13-
uint8_t get8BitValue(uint8_t byte, uint8_t mask = 0xFF, uint8_t shift = 0);
14-
uint16_t get16BitValue(uint8_t lsb_byte, uint8_t msb_byte, uint16_t mask = 0xFFFF, uint8_t shift = 0);
15-
uint32_t get24BitValue(uint8_t lsb_byte, uint8_t msb_byte, uint32_t mask = 0xFFFFFF, uint8_t shift = 0);
16-
uint32_t get32BitValue(uint8_t lsb_byte, uint8_t msb_byte, uint32_t mask = 0xFFFFFFFF, uint8_t shift = 0);
13+
uint8_t get8BitValue(uint8_t byte, uint8_t mask = 0xFF, uint8_t shift = 0) override;
14+
uint16_t get16BitValue(uint8_t lsb_byte, uint8_t msb_byte, uint16_t mask = 0xFFFF, uint8_t shift = 0) override;
15+
uint32_t get24BitValue(uint8_t lsb_byte, uint8_t msb_byte, uint32_t mask = 0xFFFFFF, uint8_t shift = 0) override;
16+
uint32_t get32BitValue(uint8_t lsb_byte, uint8_t msb_byte, uint32_t mask = 0xFFFFFFFF, uint8_t shift = 0) override;
1717
void set8BitValue(uint8_t value, uint8_t byte, uint8_t mask = 0xFF, uint8_t shift = 0);
1818
void set16BitValue(uint16_t value, uint8_t lsb_byte, uint8_t msb_byte, uint16_t mask = 0xFFFF, uint8_t shift = 0);
1919
void set24BitValue(uint32_t value, uint8_t lsb_byte, uint8_t msb_byte, uint32_t mask = 0xFFFFFF, uint8_t shift = 0);

src/BaseClasses/ANTPLUS_BaseMasterProfile.cpp

+14
Original file line numberDiff line numberDiff line change
@@ -56,3 +56,17 @@ void BaseMasterProfile::begin() {
5656
// send first datapage manually so we don't transmit 0s
5757
transmitNextDataPage();
5858
}
59+
60+
void BaseMasterProfile::transmitMsg(BaseDataPageMsg<BroadcastDataMsg> &msg) {
61+
if (isRequestedPageAcknowledged() && isRequestedPagePending()) {
62+
AcknowledgedDataMsg ack;
63+
ack.setDataBuffer(msg.getDataBuffer());
64+
send(ack);
65+
} else {
66+
send(msg);
67+
}
68+
}
69+
70+
void BaseMasterProfile::transmitMsg(BaseDataPageMsg<AcknowledgedDataMsg> &msg) {
71+
send(msg);
72+
}

src/BaseClasses/ANTPLUS_BaseMasterProfile.h

+11-5
Original file line numberDiff line numberDiff line change
@@ -2,28 +2,29 @@
22
#define ANTPLUS_BASEMASTERPROFILE_h
33

44
#include <BaseClasses/ANTPLUS_BaseProfile.h>
5+
#include <BaseClasses/ANTPLUS_BaseDataPageMsg.h>
56

67
class BaseMasterProfile : public BaseProfile {
78
public:
89
BaseMasterProfile(uint16_t deviceNumber, uint8_t transmissionType);
910
/**
1011
* start profile transmission sequence
1112
*/
12-
virtual void begin();
13+
virtual void begin() override;
1314
protected:
1415
/**
1516
* Used to catch EVENT_TX and continue transmission pattern
1617
* Also handles EVENT_TRANSFER_TX_COMPLETED for acknowledgement
1718
*/
18-
virtual void onChannelEventResponse(ChannelEventResponse& msg);
19+
virtual void onChannelEventResponse(ChannelEventResponse& msg) override;
1920
/**
2021
* This function, when called, will transmit the next message in the broadcast pattern
2122
*/
2223
virtual void transmitNextDataPage() = 0;
2324
/**
2425
* Checks for RequestDataPage messages and handles them accordingly
2526
*/
26-
virtual void onAcknowledgedData(AcknowledgedData& msg);
27+
virtual void onAcknowledgedData(AcknowledgedData& msg) override;
2728
/**
2829
* Checks with subclass to see if request is valid
2930
*/
@@ -40,11 +41,16 @@ class BaseMasterProfile : public BaseProfile {
4041
* returns true if the request is meant to be sent as a acknowledged message
4142
*/
4243
bool isRequestedPageAcknowledged();
44+
/**
45+
* Handles ack msg conversions for requests, all transmissions that are part of the broadcast pattern should be through this.
46+
*/
47+
void transmitMsg(BaseDataPageMsg<BroadcastDataMsg> &msg);
48+
void transmitMsg(BaseDataPageMsg<AcknowledgedDataMsg> &msg);
4349
private:
4450
void handleRequestDataPage(AcknowledgedData& msg);
45-
uint8_t _requestedPage;
51+
uint8_t _requestedPage = 0;
4652
uint8_t _requestedCount = 0;
47-
bool _isRequestAcknowledged;
53+
bool _isRequestAcknowledged = false;
4854
bool _requestAcked = true;
4955
};
5056

src/BaseClasses/ANTPLUS_BaseProfile.cpp

+1-1
Original file line numberDiff line numberDiff line change
@@ -128,7 +128,7 @@ void BaseProfile::checkProfileStatus() {
128128
}
129129

130130
void BaseProfile::send(AcknowledgedDataMsg& msg) {
131-
msg.setChannelNumber(_channel);
131+
msg.setChannel(_channel);
132132
_router->send(msg);
133133
}
134134

src/BaseClasses/ANTPLUS_BaseProfile.h

+6-6
Original file line numberDiff line numberDiff line change
@@ -97,12 +97,12 @@ class BaseProfile {
9797
void setSearchTimeout(uint8_t counts);
9898
private:
9999
void checkProfileStatus();
100-
AntPlusRouter* _router;
101-
Callback<AntRxDataResponse&> _onDataPage;
102-
Callback<AntRxDataResponse&> _onOtherDataPage;
103-
Callback<ChannelEventResponse&> _onChannelEvent;
104-
Callback<ChannelIdResponse&> _onChannelIdResponse;
105-
uint8_t _channel;
100+
AntPlusRouter* _router = NULL;
101+
AntCallback<AntRxDataResponse&> _onDataPage;
102+
AntCallback<AntRxDataResponse&> _onOtherDataPage;
103+
AntCallback<ChannelEventResponse&> _onChannelEvent;
104+
AntCallback<ChannelIdResponse&> _onChannelIdResponse;
105+
uint8_t _channel = 0;
106106
uint8_t _channelType = 0;
107107
uint16_t _channelPeriod = 0;
108108
uint8_t _channelStatus = 0;

src/BaseClasses/ANTPLUS_CoreDataPage.cpp

+1-1
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,7 @@ CoreDataPage<T>::CoreDataPage() : T() {
1111
template<class T>
1212
uint8_t CoreDataPage<T>::getDataPageNumber() {
1313
// TODO handle shared channels
14-
return this->getData(ANTPLUS_DEFAULT_DATAPAGE_BYTE);
14+
return this->get8BitValue(ANTPLUS_DEFAULT_DATAPAGE_BYTE);
1515
}
1616

1717
template<class T>

src/MainClasses/ANTPLUS_CallbackWorkAround.cpp

+15-15
Original file line numberDiff line numberDiff line change
@@ -13,76 +13,76 @@
1313
*/
1414

1515
void onPacketErrorCallback(uint8_t error, uintptr_t data) {
16-
AntPlusRouter* router = (AntPlusRouter*)data;
16+
AntPlusRouter* router = reinterpret_cast<AntPlusRouter*>(data);
1717
router->onPacketError(error);
1818
}
1919

2020
void onAcknowledgedDataCallback(AcknowledgedData& msg, uintptr_t data) {
21-
AntPlusRouter* router = (AntPlusRouter*)data;
21+
AntPlusRouter* router = reinterpret_cast<AntPlusRouter*>(data);
2222
router->onAcknowledgedData(msg);
2323
}
2424

2525
void onAdvancedBurstDataCallback(AdvancedBurstData& msg, uintptr_t data) {
26-
AntPlusRouter* router = (AntPlusRouter*)data;
26+
AntPlusRouter* router = reinterpret_cast<AntPlusRouter*>(data);
2727
router->onAdvancedBurstData(msg);
2828
}
2929

3030
void onBroadcastDataCallback(BroadcastData& msg, uintptr_t data) {
31-
AntPlusRouter* router = (AntPlusRouter*)data;
31+
AntPlusRouter* router = reinterpret_cast<AntPlusRouter*>(data);
3232
router->onBroadcastData(msg);
3333
}
3434

3535
void onBurstTransferDataCallback(BurstTransferData& msg, uintptr_t data) {
36-
AntPlusRouter* router = (AntPlusRouter*)data;
36+
AntPlusRouter* router = reinterpret_cast<AntPlusRouter*>(data);
3737
router->onBurstTransferData(msg);
3838
}
3939

4040
void onAdvancedBurstCapabilitiesConfigurationCallback(AdvancedBurstCapabilitiesConfiguration& msg, uintptr_t data) {
41-
AntPlusRouter* router = (AntPlusRouter*)data;
41+
AntPlusRouter* router = reinterpret_cast<AntPlusRouter*>(data);
4242
router->onAdvancedBurstCapabilitiesConfiguration(msg);
4343
}
4444

4545
void onAntVersionCallback(AntVersion& msg, uintptr_t data) {
46-
AntPlusRouter* router = (AntPlusRouter*)data;
46+
AntPlusRouter* router = reinterpret_cast<AntPlusRouter*>(data);
4747
router->onAntVersion(msg);
4848
}
4949

5050
void onCapabilitiesCallback(Capabilities& msg, uintptr_t data) {
51-
AntPlusRouter* router = (AntPlusRouter*)data;
51+
AntPlusRouter* router = reinterpret_cast<AntPlusRouter*>(data);
5252
router->onCapabilities(msg);
5353
}
5454

5555
void onChannelEventResponseCallback(ChannelEventResponse& msg, uintptr_t data) {
56-
AntPlusRouter* router = (AntPlusRouter*)data;
56+
AntPlusRouter* router = reinterpret_cast<AntPlusRouter*>(data);
5757
router->onChannelEventResponse(msg);
5858
}
5959

6060
void onChannelIdResponseCallback(ChannelIdResponse& msg, uintptr_t data) {
61-
AntPlusRouter* router = (AntPlusRouter*)data;
61+
AntPlusRouter* router = reinterpret_cast<AntPlusRouter*>(data);
6262
router->onChannelIdResponse(msg);
6363
}
6464

6565
void onChannelStatusCallback(ChannelStatus& msg, uintptr_t data) {
66-
AntPlusRouter* router = (AntPlusRouter*)data;
66+
AntPlusRouter* router = reinterpret_cast<AntPlusRouter*>(data);
6767
router->onChannelStatus(msg);
6868
}
6969

7070
void onEncryptionModeParametersCallback(EncryptionModeParameters& msg, uintptr_t data) {
71-
AntPlusRouter* router = (AntPlusRouter*)data;
71+
AntPlusRouter* router = reinterpret_cast<AntPlusRouter*>(data);
7272
router->onEncryptionModeParameters(msg);
7373
}
7474

7575
void onEventFilterCallback(EventFilter& msg, uintptr_t data) {
76-
AntPlusRouter* router = (AntPlusRouter*)data;
76+
AntPlusRouter* router = reinterpret_cast<AntPlusRouter*>(data);
7777
router->onEventFilter(msg);
7878
}
7979

8080
void onSelectiveDataUpdateMaskSettingCallback(SelectiveDataUpdateMaskSetting& msg, uintptr_t data) {
81-
AntPlusRouter* router = (AntPlusRouter*)data;
81+
AntPlusRouter* router = reinterpret_cast<AntPlusRouter*>(data);
8282
router->onSelectiveDataUpdateMaskSetting(msg);
8383
}
8484

8585
void onStartUpMessageCallback(StartUpMessage& msg, uintptr_t data) {
86-
AntPlusRouter* router = (AntPlusRouter*)data;
86+
AntPlusRouter* router = reinterpret_cast<AntPlusRouter*>(data);
8787
router->onStartUpMessage(msg);
8888
}

src/Profiles/BicycleSpeed/ANTPLUS_BicycleSpeedPrivateDefines.h

+2-8
Original file line numberDiff line numberDiff line change
@@ -30,20 +30,14 @@
3030
#define ANTPLUS_BICYCLESPEED_DATAPAGE_CUMULATIVEOPERATINGTIME_NUMBER 1
3131

3232
#define ANTPLUS_BICYCLESPEED_DATAPAGE_CUMULATIVEOPERATINGTIME_TIME_LSB_BYTE 1
33-
#define ANTPLUS_BICYCLESPEED_DATAPAGE_CUMULATIVEOPERATINGTIME_TIME_MID_BYTE 2
3433
#define ANTPLUS_BICYCLESPEED_DATAPAGE_CUMULATIVEOPERATINGTIME_TIME_MSB_BYTE 3
3534

36-
#define ANTPLUS_BICYCLESPEED_DATAPAGE_CUMULATIVEOPERATINGTIME_TIME_MID_SHIFT 8
37-
#define ANTPLUS_BICYCLESPEED_DATAPAGE_CUMULATIVEOPERATINGTIME_TIME_MSB_SHIFT 16
38-
3935
/* ManufacturerID */
4036
#define ANTPLUS_BICYCLESPEED_DATAPAGE_MANUFACTURERID_NUMBER 2
4137

4238
#define ANTPLUS_BICYCLESPEED_DATAPAGE_MANUFACTURERINFORMATION_MANUFACTUREREID_BYTE 1
43-
#define ANTPLUS_BICYCLESPEED_DATAPAGE_MANUFACTURERINFORMATION_SERIALNUMBERLSB_BYTE 2
44-
#define ANTPLUS_BICYCLESPEED_DATAPAGE_MANUFACTURERINFORMATION_SERIALNUMBERMSB_BYTE 3
45-
46-
#define ANTPLUS_BICYCLESPEED_DATAPAGE_MANUFACTURERINFORMATION_SERIALNUMBERMSB_SHIFT 8
39+
#define ANTPLUS_BICYCLESPEED_DATAPAGE_MANUFACTURERINFORMATION_SERIALNUMBER_LSB_BYTE 2
40+
#define ANTPLUS_BICYCLESPEED_DATAPAGE_MANUFACTURERINFORMATION_SERIALNUMBER_MSB_BYTE 3
4741

4842
/* Product ID */
4943
#define ANTPLUS_BICYCLESPEED_DATAPAGE_PRODUCTID_NUMBER 3
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,30 @@
1+
#include <Profiles/BicycleSpeed/DataPages/Base/ANTPLUS_BicycleSpeedBaseBatteryStatus.h>
2+
#include <Profiles/BicycleSpeed/ANTPLUS_BicycleSpeedPrivateDefines.h>
3+
4+
template<class T>
5+
BicycleSpeedBaseBatteryStatus<T>::BicycleSpeedBaseBatteryStatus() : CoreDataPage<T>() {
6+
}
7+
8+
template<class T>
9+
uint8_t BicycleSpeedBaseBatteryStatus<T>::getFractionalBatteryVoltage() {
10+
return this->get8BitValue(
11+
ANTPLUS_BICYCLESPEED_DATAPAGE_BATTERYSTATUS_FRACTIONALBATTERYVOLTAGE_BYTE);
12+
}
13+
14+
template<class T>
15+
uint8_t BicycleSpeedBaseBatteryStatus<T>::getCoarseBatteryVoltage() {
16+
return this->get8BitValue(
17+
ANTPLUS_BICYCLESPEED_DATAPAGE_BATTERYSTATUS_COARSEBATTERYVOLTAGE_BYTE,
18+
ANTPLUS_BICYCLESPEED_DATAPAGE_BATTERYSTATUS_COARSEBATTERYVOLTAGE_MASK);
19+
}
20+
21+
template<class T>
22+
uint8_t BicycleSpeedBaseBatteryStatus<T>::getBatteryStatus() {
23+
return this->get8BitValue(
24+
ANTPLUS_BICYCLESPEED_DATAPAGE_BATTERYSTATUS_BATTERYSTATUS_BYTE,
25+
ANTPLUS_BICYCLESPEED_DATAPAGE_BATTERYSTATUS_BATTERYSTATUS_MASK,
26+
ANTPLUS_BICYCLESPEED_DATAPAGE_BATTERYSTATUS_BATTERYSTATUS_SHIFT);
27+
}
28+
29+
template class BicycleSpeedBaseBatteryStatus<BroadcastData>;
30+
template class BicycleSpeedBaseBatteryStatus<BroadcastDataMsg>;
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,17 @@
1+
#ifndef ANTPLUS_BICYCLESPEEDBASEBATTERYSTATUS_h
2+
#define ANTPLUS_BICYCLESPEEDBASEBATTERYSTATUS_h
3+
4+
#include <BaseClasses/ANTPLUS_CoreDataPage.h>
5+
6+
#include "ANT.h"
7+
8+
template<class T>
9+
class BicycleSpeedBaseBatteryStatus : virtual public CoreDataPage<T> {
10+
public:
11+
BicycleSpeedBaseBatteryStatus();
12+
uint8_t getFractionalBatteryVoltage();
13+
uint8_t getCoarseBatteryVoltage();
14+
uint8_t getBatteryStatus();
15+
};
16+
17+
#endif // ANTPLUS_BICYCLESPEEDBASEBATTERYSTATUS_h
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,16 @@
1+
#include <Profiles/BicycleSpeed/DataPages/Base/ANTPLUS_BicycleSpeedBaseCumulativeOperatingTime.h>
2+
#include <Profiles/BicycleSpeed/ANTPLUS_BicycleSpeedPrivateDefines.h>
3+
4+
template<class T>
5+
BicycleSpeedBaseCumulativeOperatingTime<T>::BicycleSpeedBaseCumulativeOperatingTime() : CoreDataPage<T>() {
6+
}
7+
8+
template<class T>
9+
uint32_t BicycleSpeedBaseCumulativeOperatingTime<T>::getCumulativeOperatingTime() {
10+
return this->get24BitValue(
11+
ANTPLUS_BICYCLESPEED_DATAPAGE_CUMULATIVEOPERATINGTIME_TIME_LSB_BYTE,
12+
ANTPLUS_BICYCLESPEED_DATAPAGE_CUMULATIVEOPERATINGTIME_TIME_MSB_BYTE);
13+
}
14+
15+
template class BicycleSpeedBaseCumulativeOperatingTime<BroadcastData>;
16+
template class BicycleSpeedBaseCumulativeOperatingTime<BroadcastDataMsg>;
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,15 @@
1+
#ifndef ANTPLUS_BICYCLESPEEDBASECUMULITIVEOPERATINGTIME_h
2+
#define ANTPLUS_BICYCLESPEEDBASECUMULITIVEOPERATINGTIME_h
3+
4+
#include <BaseClasses/ANTPLUS_CoreDataPage.h>
5+
6+
#include "ANT.h"
7+
8+
template<class T>
9+
class BicycleSpeedBaseCumulativeOperatingTime : virtual public CoreDataPage<T> {
10+
public:
11+
BicycleSpeedBaseCumulativeOperatingTime();
12+
uint32_t getCumulativeOperatingTime(); // only 24 bits
13+
};
14+
15+
#endif // ANTPLUS_BICYCLESPEEDBASECUMULITIVEOPERATINGTIME_h

src/Profiles/BicycleSpeed/DataPages/Base/ANTPLUS_BicycleSpeedBaseMainDataPage.h

+1-1
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@
88
class BicycleSpeedBaseMainDataPage : public BaseDataPage<BroadcastData> {
99
public:
1010
BicycleSpeedBaseMainDataPage(AntRxDataResponse& dp);
11-
uint8_t getDataPageNumber();
11+
uint8_t getDataPageNumber() override;
1212
uint8_t getPageChangeToggle();
1313
uint16_t getBikeSpeedEventTime();
1414
uint16_t getCumulativeSpeedRevolutionCount();

0 commit comments

Comments
 (0)