Skip to content

Commit f47af0f

Browse files
committed
MuscleOxygen: Fixes from validation
fix transmission pattern and missing battery callback
1 parent 5e88cf0 commit f47af0f

File tree

6 files changed

+56
-11
lines changed

6 files changed

+56
-11
lines changed

examples/MuscleOxygenMonitor/MuscleOxygenMonitor.ino

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -48,28 +48,40 @@ void loop() {
4848
router.loop();
4949
}
5050

51+
void printDpMsg(int dp, const char* s) {
52+
Serial.print("Sending DataPage: ");
53+
Serial.print(dp);
54+
Serial.print(" - ");
55+
Serial.println(s);
56+
}
57+
5158
void moxyCreateMsgHandler(MuscleOxygenMuscleOxygenDataMsg& msg, uintptr_t data)
5259
{
5360
const int lo = 500, hi = 2500;
5461
static uint16_t _c = lo;
5562
static uint8_t _eventCount = 0;
5663

64+
printDpMsg(ANTPLUS_SHIFTING_DATAPAGE_SHIFTSYSTEMSTATUS_NUMBER, "Muscle Oxygen Data");
5765
// demo data
5866
msg.setTotalHemoglobinConcentration(_c);
5967
msg.setCurrentSaturatedHemoglobinPercentage(_c++/4);
6068
msg.setEventCount(_eventCount++);
69+
msg.setAntFSSupport(ANTPLUS_MUSCLEOXYGEN_DATAPAGE_MUSCLEOXYGENDATA_CAPABILITIES_ANTFSSUPPORT_SUPPORTED);
70+
msg.setMeasurementInterval(ANTPLUS_MUSCLEOXYGEN_DATAPAGE_MUSCLEOXYGENDATA_CAPABILITIES_MEASUREMENTINTERVAL_1S);
6171

6272
if (_c > hi)
6373
_c = lo;
6474
}
6575

6676
void moxyCreateManufacturerInformationMsg(ManufacturersInformationMsg& msg, uintptr_t data) {
77+
printDpMsg(ANTPLUS_COMMON_DATAPAGE_MANUFACTURERSINFORMATION_NUMBER, "Manufacturers Information");
6778
msg.setHWRevision(0x01);
6879
msg.setManufacturerId(0x1234);
6980
msg.setModelNumber(0x0001);
7081
}
7182

7283
void moxyCreateProductInformationMsg(ProductInformationMsg& msg, uintptr_t data) {
84+
printDpMsg(ANTPLUS_COMMON_DATAPAGE_PRODUCTINFORMATION_NUMBER, "Product Information");
7385
msg.setSerialNumber(0x12345678);
7486
msg.setSWRevisionMain(0x01);
7587
msg.setSWRevisionSupplemental(0x00);

src/Profiles/MuscleOxygen/ANTPLUS_MuscleOxygenDefines.h

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,15 @@
88

99
#define ANTPLUS_MUSCLEOXYGEN_DATAPAGE_MUSCLEOXYGENDATA_NUMBER 1
1010

11+
#define ANTPLUS_MUSCLEOXYGEN_DATAPAGE_MUSCLEOXYGENDATA_NOTIFICATIONS_UTCTIMEREQUIRED 1
12+
13+
#define ANTPLUS_MUSCLEOXYGEN_DATAPAGE_MUSCLEOXYGENDATA_CAPABILITIES_ANTFSSUPPORT_SUPPORTED 1
14+
15+
#define ANTPLUS_MUSCLEOXYGEN_DATAPAGE_MUSCLEOXYGENDATA_CAPABILITIES_MEASUREMENTINTERVAL_250MS 1
16+
#define ANTPLUS_MUSCLEOXYGEN_DATAPAGE_MUSCLEOXYGENDATA_CAPABILITIES_MEASUREMENTINTERVAL_500MS 2
17+
#define ANTPLUS_MUSCLEOXYGEN_DATAPAGE_MUSCLEOXYGENDATA_CAPABILITIES_MEASUREMENTINTERVAL_1S 3
18+
#define ANTPLUS_MUSCLEOXYGEN_DATAPAGE_MUSCLEOXYGENDATA_CAPABILITIES_MEASUREMENTINTERVAL_2S 4
19+
1120
#define ANTPLUS_MUSCLEOXYGEN_DATAPAGE_MUSCLEOXYGENDATA_TOTALHEMOGLOBINCONCENTRATION_AMBIENTLIGHTOOHIGH 0xFFE
1221
#define ANTPLUS_MUSCLEOXYGEN_DATAPAGE_MUSCLEOXYGENDATA_TOTALHEMOGLOBINCONCENTRATION_INVALID 0xFFF
1322
#define ANTPLUS_MUSCLEOXYGEN_DATAPAGE_MUSCLEOXYGENDATA_PREVIOUSSATURATEDHEMOGLOBINPERCENTAGE_INVALID 0xFFF

src/Profiles/MuscleOxygen/DataPages/ANTPLUS_MuscleOxygenMuscleOxygenData.cpp

Lines changed: 20 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,9 @@
44
#define EVENTCOUNT_BYTE 1
55
#define NOTIFICATIONS_BYTE 2
66
#define CAPABILITIES_BYTE 3
7+
#define ANTFSSUPPORT_MASK 0x01
8+
#define MEASUREMENTINTERVAL_MASK 0x0E
9+
#define MEASUREMENTINTERVAL_SHIFT 1
710
#define TOTALHEMOGLOBINCONCENTRATION_LSB_BYTE 4
811
#define TOTALHEMOGLOBINCONCENTRATION_MSB_BYTE 5
912
#define TOTALHEMOGLOBINCONCENTRATION_MASK 0x0FFF
@@ -30,8 +33,15 @@ uint8_t MuscleOxygenBaseMuscleOxygenData<T>::getNotifications() {
3033
}
3134

3235
template<class T>
33-
uint8_t MuscleOxygenBaseMuscleOxygenData<T>::getCapabilities() {
34-
return this->get8BitValue(CAPABILITIES_BYTE);
36+
uint8_t MuscleOxygenBaseMuscleOxygenData<T>::getAntFSSupport() {
37+
return this->get8BitValue(CAPABILITIES_BYTE, ANTFSSUPPORT_MASK);
38+
}
39+
40+
template<class T>
41+
uint8_t MuscleOxygenBaseMuscleOxygenData<T>::getMeasurementInterval() {
42+
return this->get8BitValue(CAPABILITIES_BYTE,
43+
MEASUREMENTINTERVAL_MASK,
44+
MEASUREMENTINTERVAL_SHIFT);
3545
}
3646

3747
template<class T>
@@ -76,8 +86,14 @@ void MuscleOxygenMuscleOxygenDataMsg::setNotifications(uint8_t notifications) {
7686
set8BitValue(notifications, NOTIFICATIONS_BYTE);
7787
}
7888

79-
void MuscleOxygenMuscleOxygenDataMsg::setCapabilities(uint8_t capabilities) {
80-
set8BitValue(capabilities, CAPABILITIES_BYTE);
89+
void MuscleOxygenMuscleOxygenDataMsg::setAntFSSupport(uint8_t support) {
90+
set8BitValue(support, CAPABILITIES_BYTE, ANTFSSUPPORT_MASK);
91+
}
92+
93+
void MuscleOxygenMuscleOxygenDataMsg::setMeasurementInterval(uint8_t interval) {
94+
set8BitValue(interval, CAPABILITIES_BYTE,
95+
MEASUREMENTINTERVAL_MASK,
96+
MEASUREMENTINTERVAL_SHIFT);
8197
}
8298

8399
void MuscleOxygenMuscleOxygenDataMsg::setTotalHemoglobinConcentration(uint16_t concentration) {

src/Profiles/MuscleOxygen/DataPages/ANTPLUS_MuscleOxygenMuscleOxygenData.h

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,8 @@ class MuscleOxygenBaseMuscleOxygenData : public virtual CoreDataPage<T> {
99
MuscleOxygenBaseMuscleOxygenData();
1010
uint8_t getEventCount();
1111
uint8_t getNotifications();
12-
uint8_t getCapabilities();
12+
uint8_t getAntFSSupport();
13+
uint8_t getMeasurementInterval();
1314
uint16_t getTotalHemoglobinConcentration();
1415
uint16_t getPreviousSaturatedHemoglobinPercentage();
1516
uint16_t getCurrentSaturatedHemoglobinPercentage();
@@ -20,7 +21,8 @@ class MuscleOxygenMuscleOxygenDataMsg : public MuscleOxygenBaseMainDataPageMsg,
2021
MuscleOxygenMuscleOxygenDataMsg();
2122
void setEventCount(uint8_t n);
2223
void setNotifications(uint8_t notficications);
23-
void setCapabilities(uint8_t capabilities);
24+
void setAntFSSupport(uint8_t support);
25+
void setMeasurementInterval(uint8_t interval);
2426
void setTotalHemoglobinConcentration(uint16_t concentration);
2527
void setPreviousSaturatedHemoglobinPercentage(uint16_t percent);
2628
void setCurrentSaturatedHemoglobinPercentage(uint16_t percent);

src/Profiles/MuscleOxygen/Monitor/ANTPLUS_ProfileMuscleOxygenMonitor.cpp

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -40,9 +40,11 @@ void ProfileMuscleOxygenMonitor::transmitNextDataPage() {
4040
transmitMuscleOxygenMuscleOxygenDataMsg();
4141
}
4242
else {
43-
if ((_backgroundStep++ % _backgroundStepSize) == 0) {
44-
transmitManufacturerInformationMsg();
43+
if (++_backgroundStep == _backgroundStepSize) {
4544
_backgroundStep = 0;
45+
}
46+
if ((_backgroundStep % _backgroundStepSize) == 0) {
47+
transmitManufacturerInformationMsg();
4648
} else if ((_backgroundStep % _backgroundStepSize) == 1) {
4749
transmitProductInformationMsg();
4850
} else if (_flags & ANTPLUS_MUSCLEOXYGEN_FLAGS_BATTERYSTATUS_SUPPORTED) {

src/Profiles/MuscleOxygen/Monitor/ANTPLUS_ProfileMuscleOxygenMonitor.h

Lines changed: 7 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -11,17 +11,21 @@ class ProfileMuscleOxygenMonitor : public BaseMasterProfile {
1111
explicit ProfileMuscleOxygenMonitor(uint16_t deviceNumber, uint8_t transmissionType = 0, uint32_t flags = 0);
1212

1313
/**
14-
* Register callback to populate Muscle Oxygen data messages (Datapage 0)
14+
* Register callback to populate Muscle Oxygen data messages (Datapage 0x01)
1515
*/
1616
void createMuscleOxygenMuscleOxygenDataMsg(void(*func)(MuscleOxygenMuscleOxygenDataMsg&, uintptr_t), uintptr_t data = 0) { _createMuscleOxygenMuscleOxygenDataMsg.set(func, data); }
1717
/**
18-
* Register callback to populate manufacturer information data messages (Datapage 2)
18+
* Register callback to populate manufacturer information data messages (Datapage 0x50)
1919
*/
2020
void createManufacturerInformationMsg(void(*func)(ManufacturersInformationMsg&, uintptr_t), uintptr_t data = 0) { _createManufacturersInformationMsg.set(func, data); }
2121
/**
22-
* Register callback to populate product information data messages (Datapage 3)
22+
* Register callback to populate product information data messages (Datapage 0x51)
2323
*/
2424
void createProductInformationMsg(void(*func)(ProductInformationMsg&, uintptr_t), uintptr_t data = 0) { _createProductInformationMsg.set(func, data); }
25+
/**
26+
* Register callback to populate battery status data messages (Datapage 0x52)
27+
*/
28+
void createProductInformationMsg(void(*func)(BatteryStatusMsg&, uintptr_t), uintptr_t data = 0) { _createBatteryStatusMsg.set(func, data); }
2529

2630
protected:
2731
void transmitNextDataPage() override;

0 commit comments

Comments
 (0)