Skip to content

Commit bf8ec21

Browse files
committed
finish quaternion service
use adacalll instead of updating filter inside timer callback since it take 6 ms to complete (while the callback is 10 ms), which may cause lots of lag on other services.
1 parent 0a73db5 commit bf8ec21

File tree

4 files changed

+70
-17
lines changed

4 files changed

+70
-17
lines changed

libraries/BLEAdafruitService/src/services/BLEAdafruitQuaternion.cpp

Lines changed: 33 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,7 @@
2424

2525
#include "BLEAdafruitService.h"
2626
#include <Adafruit_AHRS.h>
27+
#include <Adafruit_Sensor_Calibration.h>
2728

2829
//--------------------------------------------------------------------+
2930
// MACRO TYPEDEF CONSTANT ENUM DECLARATION
@@ -38,7 +39,7 @@
3839
* ms between measurements, -1: stop reading, 0: update when changes
3940
*
4041
* Quaternion service 0D00
41-
* - Quater 0D01 | float[4] | Read + Notify | qw, qx, qy, qz
42+
* - Quater #include <Adafruit> 0D01 | float[4] | Read + Notify | qw, qx, qy, qz
4243
* - Measurement Period 0001
4344
*/
4445

@@ -60,6 +61,7 @@ BLEAdafruitQuaternion::BLEAdafruitQuaternion(void)
6061
{
6162
_accel = _gyro = _mag = NULL;
6263
_filter = NULL;
64+
_calib = NULL;
6365

6466
// Setup Measurement Characteristic
6567
_measurement.setProperties(CHR_PROPS_READ | CHR_PROPS_NOTIFY);
@@ -78,13 +80,18 @@ err_t BLEAdafruitQuaternion::begin(Adafruit_AHRS_FusionInterface* filter, Adafru
7880
VERIFY_STATUS( BLEAdafruitSensor::_begin(DEFAULT_PERIOD) );
7981

8082
// filter timer run faster than measurement timer, but not too fast
81-
int32_t const filter_ms = minof(5, DEFAULT_PERIOD / FILTER_MEASURE_RATIO);
83+
int32_t const filter_ms = maxof(10, DEFAULT_PERIOD / FILTER_MEASURE_RATIO);
8284

8385
_filter_timer.begin(filter_ms, quaternion_filter_timer_cb, this, true);
8486

8587
return ERROR_NONE;
8688
}
8789

90+
void BLEAdafruitQuaternion::setCalibration(Adafruit_Sensor_Calibration* calib)
91+
{
92+
_calib = calib;
93+
}
94+
8895
void BLEAdafruitQuaternion::_notify_cb(uint16_t conn_hdl, uint16_t value)
8996
{
9097
// Start/Stop filter timer
@@ -102,7 +109,7 @@ void BLEAdafruitQuaternion::_notify_cb(uint16_t conn_hdl, uint16_t value)
102109

103110
void BLEAdafruitQuaternion::_update_timer(int32_t ms)
104111
{
105-
int32_t const filter_ms = minof(5, ms / FILTER_MEASURE_RATIO);
112+
int32_t const filter_ms = maxof(10, ms / FILTER_MEASURE_RATIO);
106113

107114
if ( filter_ms < 0 )
108115
{
@@ -132,34 +139,53 @@ void BLEAdafruitQuaternion::_measure_handler(void)
132139
_measurement.notify(quater, sizeof(quater));
133140
}
134141

142+
// Fusion Filter update
143+
// This function take ~ 6ms to get all sensor data and computing
135144
void BLEAdafruitQuaternion::_fitler_update(void)
136145
{
137-
// get sensor
146+
// get sensor events
138147
sensors_event_t accel_evt, gyro_evt, mag_evt;
139148

149+
// int start_ms = millis();
150+
151+
_mag->getEvent(&mag_evt);
140152
_accel->getEvent(&accel_evt);
141153
_gyro->getEvent(&gyro_evt);
142-
_mag->getEvent(&mag_evt);
143154

144-
// calibrate
155+
start_ms = millis() - start_ms;
145156

157+
// calibrate sensor if available
158+
if (_calib)
159+
{
160+
_calib->calibrate(mag_evt);
161+
_calib->calibrate(accel_evt);
162+
_calib->calibrate(gyro_evt);
163+
}
146164

147165
// Convert gyro from Rad/s to Degree/s
148166
gyro_evt.gyro.x *= SENSORS_RADS_TO_DPS;
149167
gyro_evt.gyro.y *= SENSORS_RADS_TO_DPS;
150168
gyro_evt.gyro.z *= SENSORS_RADS_TO_DPS;
151169

152-
// apply filter, update 10 times before notify
170+
// apply filter
153171
_filter->update(gyro_evt.gyro.x , gyro_evt.gyro.y, gyro_evt.gyro.z,
154172
accel_evt.acceleration.x, accel_evt.acceleration.y, accel_evt.acceleration.z,
155173
mag_evt.magnetic.x, mag_evt.magnetic.y, mag_evt.magnetic.z);
174+
175+
// PRINT_INT(start_ms);
156176
}
157177

158178
//--------------------------------------------------------------------+
159179
// Static Methods
160180
//--------------------------------------------------------------------+
181+
161182
void BLEAdafruitQuaternion::quaternion_filter_timer_cb(TimerHandle_t xTimer)
162183
{
163184
BLEAdafruitQuaternion* svc = (BLEAdafruitQuaternion*) pvTimerGetTimerID(xTimer);
185+
ada_callback(NULL, 0, quaternion_filter_update_dfr, svc);
186+
}
187+
188+
void BLEAdafruitQuaternion::quaternion_filter_update_dfr(BLEAdafruitQuaternion* svc)
189+
{
164190
svc->_fitler_update();
165191
}

libraries/BLEAdafruitService/src/services/BLEAdafruitQuaternion.h

Lines changed: 8 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -25,9 +25,9 @@
2525
#ifndef BLEADAFRUIT_QUATERNION_H_
2626
#define BLEADAFRUIT_QUATERNION_H_
2727

28-
#include <Adafruit_Sensor.h>
29-
28+
// forward declaration
3029
class Adafruit_AHRS_FusionInterface;
30+
class Adafruit_Sensor_Calibration;
3131

3232
class BLEAdafruitQuaternion : public BLEAdafruitSensor
3333
{
@@ -38,6 +38,7 @@ class BLEAdafruitQuaternion : public BLEAdafruitSensor
3838

3939
BLEAdafruitQuaternion(void);
4040
err_t begin(Adafruit_AHRS_FusionInterface* filter, Adafruit_Sensor* accel, Adafruit_Sensor* gyro, Adafruit_Sensor* mag);
41+
void setCalibration(Adafruit_Sensor_Calibration* calib);
4142

4243
protected:
4344
virtual void _update_timer(int32_t ms);
@@ -52,9 +53,14 @@ class BLEAdafruitQuaternion : public BLEAdafruitSensor
5253
Adafruit_Sensor* _mag;
5354

5455
Adafruit_AHRS_FusionInterface* _filter;
56+
Adafruit_Sensor_Calibration* _calib;
5557
SoftwareTimer _filter_timer;
5658

59+
// filter timer callback, 10x faster than period timer
5760
static void quaternion_filter_timer_cb(TimerHandle_t xTimer);
61+
62+
// filter update deferred to adacallback since it takes lots of computing time (6 ms)
63+
static void quaternion_filter_update_dfr(BLEAdafruitQuaternion* svc);
5864
};
5965

6066
#endif /* BLEADAFRUIT_QUATERNION_H_ */

libraries/BLEAdafruitService/src/services/BLEAdafruitSensor.cpp

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -162,18 +162,19 @@ void BLEAdafruitSensor::sensor_timer_cb(TimerHandle_t xTimer)
162162
// Client update period, adjust timer accordingly
163163
void BLEAdafruitSensor::sensor_period_write_cb(uint16_t conn_hdl, BLECharacteristic* chr, uint8_t* data, uint16_t len)
164164
{
165-
BLEAdafruitSensor& svc = (BLEAdafruitSensor&) chr->parentService();
165+
(void) conn_hdl;
166+
BLEAdafruitSensor* svc = (BLEAdafruitSensor*) &chr->parentService();
166167

167168
int32_t ms = 0;
168169
memcpy(&ms, data, len);
169170

170-
svc._update_timer(ms);
171+
svc->_update_timer(ms);
171172
}
172173

173174
void BLEAdafruitSensor::sensor_data_cccd_cb(uint16_t conn_hdl, BLECharacteristic* chr, uint16_t value)
174175
{
175-
BLEAdafruitSensor& svc = (BLEAdafruitSensor&) chr->parentService();
176+
BLEAdafruitSensor* svc = (BLEAdafruitSensor*) &chr->parentService();
176177

177-
svc._notify_cb(conn_hdl, value);
178+
svc->_notify_cb(conn_hdl, value);
178179
}
179180

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

Lines changed: 24 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,8 @@
1919
* - Feather Sense : https://www.adafruit.com/product/4516
2020
*/
2121

22+
#include <SPI.h>
23+
#include <SdFat.h>
2224
#include <Adafruit_LittleFS.h>
2325
#include <InternalFileSystem.h>
2426
#include <bluefruit.h>
@@ -83,7 +85,9 @@ uint16_t measure_button(uint8_t* buf, uint16_t bufsize)
8385
#include <Adafruit_BMP280.h>
8486
#include <Adafruit_SHT31.h>
8587

88+
#include <Adafruit_SPIFlash.h>
8689
#include <Adafruit_AHRS.h>
90+
#include <Adafruit_Sensor_Calibration.h>
8791

8892
#if defined(ARDUINO_NRF52840_CLUE)
8993
#define DEVICE_NAME "CLUE"
@@ -110,6 +114,14 @@ Adafruit_SHT31 sht30; // Humid
110114
//Adafruit_Madgwick filter; // faster than NXP
111115
Adafruit_Mahony filter; // fastest/smalleset
112116

117+
// Sensor calibration
118+
#define FILE_SENSOR_CALIB "sensor_calib.json"
119+
Adafruit_Sensor_Calibration_SDFat cal;
120+
121+
Adafruit_FlashTransport_QSPI flashTransport;
122+
Adafruit_SPIFlash flash(&flashTransport);
123+
FatFileSystem fatfs;
124+
113125
uint16_t measure_light(uint8_t* buf, uint16_t bufsize)
114126
{
115127
float lux;
@@ -154,6 +166,9 @@ void setup()
154166
{
155167
Adafruit_Sensor* accel_sensor;
156168

169+
Serial.begin(115200);
170+
// while(!Serial) delay(10); // wait for native USB
171+
157172
#if defined ARDUINO_NRF52840_CIRCUITPLAY
158173
CircuitPlayground.begin();
159174

@@ -191,10 +206,13 @@ void setup()
191206
filter.begin(100); // sample rate in hz
192207

193208
accel_sensor = lsm6ds33.getAccelerometerSensor();
194-
#endif
195209

196-
Serial.begin(115200);
197-
// while(!Serial) delay(10); // wait for native USB
210+
// Init flash, filesystem and calibration & load calib json
211+
flash.begin();
212+
fatfs.begin(&flash);
213+
cal.begin(FILE_SENSOR_CALIB, &fatfs);
214+
cal.loadCalibration();
215+
#endif
198216

199217
Serial.println("Bluefruit Playground Example");
200218
Serial.println("---------------------------\n");
@@ -251,8 +269,10 @@ void setup()
251269
bleHumid.begin(measure_humid);
252270
bleBaro.begin(bmp280.getPressureSensor());
253271

254-
// Quaternion
272+
// Quaternion with sensor calibration
273+
// PRINT_HEX(lsm6ds33.getGyroSensor());
255274
bleQuater.begin(&filter, accel_sensor, lsm6ds33.getGyroSensor(), &lis3mdl);
275+
bleQuater.setCalibration(&cal);
256276
#endif
257277

258278
// Set up and start advertising

0 commit comments

Comments
 (0)