Skip to content

Commit 6e80d7d

Browse files
committed
adding unified sensor support for sensor service
1 parent 79efcb8 commit 6e80d7d

File tree

6 files changed

+93
-73
lines changed

6 files changed

+93
-73
lines changed

libraries/BLEAdafruitService/src/services/BLEAdafruitAccel.cpp

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -60,15 +60,15 @@ BLEAdafruitAccel::BLEAdafruitAccel(void)
6060

6161
}
6262

63-
err_t BLEAdafruitAccel::begin (void)
63+
err_t BLEAdafruitAccel::begin(Adafruit_Sensor* sensor, int32_t ms)
6464
{
6565
// Setup Measurement Characteristic
6666
_measurement.setProperties(CHR_PROPS_READ | CHR_PROPS_NOTIFY);
6767
_measurement.setPermission(SECMODE_OPEN, SECMODE_NO_ACCESS);
6868
_measurement.setFixedLen(4*3);
6969

7070
// Invoke base class begin(), this will add Service, Measurement and Period characteristics
71-
VERIFY_STATUS( BLEAdafruitSensor::begin(DEFAULT_PERIOD) );
71+
VERIFY_STATUS( BLEAdafruitSensor::begin(sensor, ms) );
7272

7373
return ERROR_NONE;
7474
}

libraries/BLEAdafruitService/src/services/BLEAdafruitAccel.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -33,7 +33,7 @@ class BLEAdafruitAccel : public BLEAdafruitSensor
3333
static const int32_t DEFAULT_PERIOD = 1000;
3434

3535
BLEAdafruitAccel(void);
36-
virtual err_t begin(void);
36+
virtual err_t begin(Adafruit_Sensor* sensor, int32_t ms = DEFAULT_PERIOD);
3737
};
3838

3939
#endif /* BLEADAFRUIT_ACCEL_H_ */

libraries/BLEAdafruitService/src/services/BLEAdafruitAddressablePixel.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -25,7 +25,7 @@
2525
#ifndef BLEADAFRUIT_ADDRESSABLEPIXEL_H_
2626
#define BLEADAFRUIT_ADDRESSABLEPIXEL_H_
2727

28-
#include "Adafruit_NeoPixel.h"
28+
#include <Adafruit_NeoPixel.h>
2929

3030
class BLEAdafruitAddressablePixel : public BLEService
3131
{

libraries/BLEAdafruitService/src/services/BLEAdafruitSensor.cpp

Lines changed: 34 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -62,24 +62,18 @@ err_t BLEAdafruitSensor::begin(int32_t ms)
6262
return ERROR_NONE;
6363
}
6464

65-
void BLEAdafruitSensor::setPeriod(int32_t period_ms)
65+
err_t BLEAdafruitSensor::begin(Adafruit_Sensor* sensor, int32_t ms)
6666
{
67-
_period.write32(period_ms);
68-
_update_timer(period_ms);
67+
_sensor = sensor;
68+
return begin(ms);
6969
}
7070

71-
72-
void BLEAdafruitSensor::startMeasuring(void)
73-
{
74-
_timer.start();
75-
}
76-
77-
void BLEAdafruitSensor::stopMeasuring(void)
71+
void BLEAdafruitSensor::setPeriod(int32_t period_ms)
7872
{
79-
_timer.stop();
73+
_period.write32(period_ms);
74+
_update_timer(period_ms);
8075
}
8176

82-
8377
void BLEAdafruitSensor::_update_timer(int32_t ms)
8478
{
8579
// TODO handle period = 0 which notify on changes ASAP
@@ -97,24 +91,39 @@ void BLEAdafruitSensor::_update_timer(int32_t ms)
9791

9892
void BLEAdafruitSensor::_timer_callback(void)
9993
{
100-
if (_measure_cb)
94+
uint16_t len = _measurement.getMaxLen();
95+
uint8_t buf[len];
96+
97+
// Use unified sensor API if available, only with fixed length sensor
98+
if (_sensor && _measurement.isFixedLen())
10199
{
102-
uint8_t buf[_measurement.getMaxLen()];
103-
uint16_t len = _measure_cb(buf, sizeof(buf));
104-
len = min(len, sizeof(buf));
100+
sensors_event_t event;
101+
_sensor->getEvent(&event);
105102

106-
// Period = 0, compare with old data, only update on changes
107-
if ( 0 == _period.read32() )
108-
{
109-
uint8_t prev_buf[_measurement.getMaxLen()];
110-
_measurement.read(prev_buf, sizeof(prev_buf));
103+
memcpy(buf, event.data, len);
104+
}
105+
// Else use callback
106+
else if (_measure_cb)
107+
{
108+
len = _measure_cb(buf, sizeof(buf));
109+
len = min(len, sizeof(buf));
110+
}else
111+
{
112+
return; // nothing to measure
113+
}
111114

112-
// skip notify if there is no changes
113-
if ( 0 == memcmp(prev_buf, buf, len) ) return;
114-
}
115+
// Period = 0, compare with old data, only update on changes
116+
if ( 0 == _period.read32() )
117+
{
118+
uint8_t prev_buf[_measurement.getMaxLen()];
119+
_measurement.read(prev_buf, sizeof(prev_buf));
115120

116-
_measurement.notify(buf, len);
121+
// skip notify if there is no changes
122+
if ( 0 == memcmp(prev_buf, buf, len) ) return;
117123
}
124+
125+
// TODO multiple connections
126+
_measurement.notify(buf, len);
118127
}
119128

120129
//--------------------------------------------------------------------+

libraries/BLEAdafruitService/src/services/BLEAdafruitSensor.h

Lines changed: 6 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,8 @@
2525
#ifndef BLEADAFRUIT_SENSOR_H_
2626
#define BLEADAFRUIT_SENSOR_H_
2727

28+
#include <Adafruit_Sensor.h>
29+
2830
class BLEAdafruitSensor : public BLEService
2931
{
3032
public:
@@ -33,16 +35,17 @@ class BLEAdafruitSensor : public BLEService
3335
BLEAdafruitSensor(BLEUuid service_uuid, BLEUuid data_uuid);
3436
virtual err_t begin(int32_t ms);
3537

38+
virtual err_t begin(Adafruit_Sensor* sensor, int32_t ms);
39+
3640
void setMeasureCallback(measure_callback_t fp);
3741
void setPeriod(int32_t period_ms);
3842

39-
void startMeasuring(void);
40-
void stopMeasuring(void);
41-
4243
protected:
4344
BLECharacteristic _period;
4445
BLECharacteristic _measurement;
4546

47+
Adafruit_Sensor* _sensor;
48+
4649
measure_callback_t _measure_cb;
4750
SoftwareTimer _timer;
4851

libraries/Bluefruit52Lib/examples/Peripheral/bluefruit_playground/bluefruit_playground.ino

Lines changed: 49 additions & 41 deletions
Original file line numberDiff line numberDiff line change
@@ -54,17 +54,6 @@ uint16_t measure_temperature(uint8_t* buf, uint16_t bufsize)
5454
return 4;
5555
}
5656

57-
uint16_t measure_accel(uint8_t* buf, uint16_t bufsize)
58-
{
59-
float* accel_buf = (float*) buf;
60-
61-
accel_buf[0] = CircuitPlayground.motionX();
62-
accel_buf[1] = CircuitPlayground.motionY();
63-
accel_buf[2] = CircuitPlayground.motionZ();
64-
65-
return 3*sizeof(float); // 12
66-
}
67-
6857
uint16_t measure_light(uint8_t* buf, uint16_t bufsize)
6958
{
7059
float lux;
@@ -104,6 +93,8 @@ uint16_t measure_button(uint8_t* buf, uint16_t bufsize)
10493
#include <Adafruit_BMP280.h>
10594
#include <Adafruit_SHT31.h>
10695

96+
#include <Adafruit_AHRS.h>
97+
10798
#if defined(ARDUINO_NRF52840_CLUE)
10899
#define DEVICE_NAME "CLUE"
109100
#else
@@ -113,40 +104,34 @@ uint16_t measure_button(uint8_t* buf, uint16_t bufsize)
113104
#define NEOPIXEL_COUNT 1
114105

115106

116-
BLEAdafruitGyro bleGyro;
117-
BLEAdafruitMagnetic bleMagnetic;
118-
BLEAdafruitHumid bleHumid;
119-
BLEAdafruitBaro bleBaro;
107+
//BLEAdafruitGyro bleGyro;
108+
//BLEAdafruitMagnetic bleMagnetic;
109+
110+
BLEAdafruitHumid bleHumid;
111+
BLEAdafruitBaro bleBaro;
112+
113+
BLEAdafruitQuaternion bleQuater;
120114

121-
Adafruit_APDS9960 apds9960; // Proximity, Light, Gesture, Color
122115
Adafruit_LSM6DS33 lsm6ds33; // Gyro and Accel
123116
Adafruit_LIS3MDL lis3mdl; // Magnetometer
117+
118+
Adafruit_APDS9960 apds9960; // Proximity, Light, Gesture, Color
124119
Adafruit_BMP280 bmp280; // Temperature, Barometric
125120
Adafruit_SHT31 sht30; // Humid
126121

122+
123+
// pick your filter! slower == better quality output
124+
//Adafruit_NXPSensorFusion filter; // slowest
125+
//Adafruit_Madgwick filter; // faster than NXP
126+
Adafruit_Mahony filter; // fastest/smalleset
127+
127128
uint16_t measure_temperature(uint8_t* buf, uint16_t bufsize)
128129
{
129130
float temp = bmp280.readTemperature();
130131
memcpy(buf, &temp, 4);
131132
return 4;
132133
}
133134

134-
uint16_t measure_accel(uint8_t* buf, uint16_t bufsize)
135-
{
136-
float* float_buf = (float*) buf;
137-
138-
sensors_event_t accel, gyro, temp;
139-
(void) gyro; (void) temp;
140-
141-
lsm6ds33.getEvent(&accel, &gyro, &temp);
142-
143-
float_buf[0] = accel.acceleration.x;
144-
float_buf[1] = accel.acceleration.y;
145-
float_buf[2] = accel.acceleration.z;
146-
147-
return 12;
148-
}
149-
150135
uint16_t measure_light(uint8_t* buf, uint16_t bufsize)
151136
{
152137
float lux;
@@ -226,9 +211,12 @@ Adafruit_NeoPixel strip = Adafruit_NeoPixel(NEOPIXEL_COUNT, PIN_NEOPIXEL, NEO_GR
226211
//------------- Setup -------------//
227212
void setup()
228213
{
214+
Adafruit_Sensor* accel_sensor;
215+
229216
#if defined ARDUINO_NRF52840_CIRCUITPLAY
230217
CircuitPlayground.begin();
231218

219+
accel_sensor = &CircuitPlayground.lis;
232220
#else
233221

234222
// Button
@@ -241,10 +229,27 @@ void setup()
241229
apds9960.begin();
242230
apds9960.enableColor(true);
243231

244-
lsm6ds33.begin_I2C();
245232
bmp280.begin();
246-
lis3mdl.begin_I2C();
247233
sht30.begin(0x44);
234+
235+
lsm6ds33.begin_I2C();
236+
lis3mdl.begin_I2C();
237+
238+
// set lowest range
239+
lsm6ds33.setAccelRange(LSM6DS_ACCEL_RANGE_2_G);
240+
lsm6ds33.setGyroRange(LSM6DS_GYRO_RANGE_250_DPS);
241+
lis3mdl.setRange(LIS3MDL_RANGE_4_GAUSS);
242+
243+
// set slightly above refresh rate
244+
lsm6ds33.setAccelDataRate(LSM6DS_RATE_104_HZ);
245+
lsm6ds33.setGyroDataRate(LSM6DS_RATE_104_HZ);
246+
lis3mdl.setDataRate(LIS3MDL_DATARATE_1000_HZ);
247+
lis3mdl.setPerformanceMode(LIS3MDL_MEDIUMMODE);
248+
lis3mdl.setOperationMode(LIS3MDL_CONTINUOUSMODE);
249+
250+
filter.begin(100); // sample rate in hz
251+
252+
accel_sensor = lsm6ds33.getAccelerometerSensor();
248253
#endif
249254

250255
Serial.begin(115200);
@@ -288,8 +293,7 @@ void setup()
288293
bleTemp.begin();
289294
bleTemp.setMeasureCallback(measure_temperature);
290295

291-
bleAccel.begin();
292-
bleAccel.setMeasureCallback(measure_accel);
296+
bleAccel.begin(accel_sensor);
293297

294298
bleLight.begin();
295299
bleLight.setMeasureCallback(measure_light);
@@ -305,17 +309,21 @@ void setup()
305309

306310
// CPB doesn't support these on-board sensor
307311
#ifndef ARDUINO_NRF52840_CIRCUITPLAY
308-
bleGyro.begin();
309-
bleGyro.setMeasureCallback(measure_gyro);
310-
311-
bleMagnetic.begin();
312-
bleMagnetic.setMeasureCallback(measure_magnetic);
312+
// bleGyro.begin();
313+
// bleGyro.setMeasureCallback(measure_gyro);
314+
//
315+
// bleMagnetic.begin();
316+
// bleMagnetic.setMeasureCallback(measure_magnetic);
313317

314318
bleHumid.begin();
315319
bleHumid.setMeasureCallback(measure_humid);
316320

317321
bleBaro.begin();
318322
bleBaro.setMeasureCallback(measure_baro);
323+
324+
// Quaternion
325+
bleQuater.begin(&filter, accel_sensor, lsm6ds33.getGyroSensor(), &lis3mdl);
326+
319327
#endif
320328

321329
// Set up and start advertising

0 commit comments

Comments
 (0)