Skip to content

Commit 5e81644

Browse files
committed
fully implement quaternion by override virtual func
1 parent 58a2721 commit 5e81644

File tree

5 files changed

+90
-60
lines changed

5 files changed

+90
-60
lines changed

libraries/BLEAdafruitService/src/services/BLEAdafruitQuaternion.cpp

Lines changed: 77 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -77,33 +77,89 @@ err_t BLEAdafruitQuaternion::begin(Adafruit_AHRS_FusionInterface* filter, Adafru
7777
// Invoke base class begin(), this will add Service, Measurement and Period characteristics
7878
VERIFY_STATUS( BLEAdafruitSensor::_begin(DEFAULT_PERIOD) );
7979

80+
// filter timer run faster than measurement timer, but not too fast
81+
int32_t const filter_ms = minof(5, DEFAULT_PERIOD / FILTER_MEASURE_RATIO);
82+
83+
_filter_timer.begin(filter_ms, quaternion_filter_timer_cb, this, true);
84+
8085
return ERROR_NONE;
8186
}
8287

88+
void BLEAdafruitQuaternion::_notify_cb(uint16_t conn_hdl, uint16_t value)
89+
{
90+
// Start/Stop filter timer
91+
if (value & BLE_GATT_HVX_NOTIFICATION)
92+
{
93+
_filter_timer.start();
94+
}else
95+
{
96+
_filter_timer.stop();
97+
}
98+
99+
// Call SuperClass function
100+
BLEAdafruitSensor::_notify_cb(conn_hdl, value);
101+
}
102+
103+
void BLEAdafruitQuaternion::_update_timer(int32_t ms)
104+
{
105+
int32_t const filter_ms = minof(5, ms / FILTER_MEASURE_RATIO);
106+
107+
if ( filter_ms < 0 )
108+
{
109+
_filter_timer.stop();
110+
}else if ( filter_ms > 0)
111+
{
112+
_filter_timer.setPeriod(filter_ms);
113+
}else
114+
{
115+
// Period = 0: keeping the current interval, but report on changes only
116+
// Not applicable for this service
117+
}
118+
119+
// Call SuperClass function
120+
BLEAdafruitSensor::_update_timer(ms);
121+
}
122+
83123
// Invoked by period timer in Base class
84124
// Note invoked in RTOS Timer thread
85125
void BLEAdafruitQuaternion::_measure_handler(void)
86126
{
127+
float quater[4]; // w, x, y, z
128+
129+
_filter->getQuaternion(&quater[0], &quater[1], &quater[2], &quater[3]);
130+
87131
// TODO multiple connections
88-
_measurement.notify("test", 4);
89-
90-
// // get sensor
91-
// sensors_event_t accel_evt, gyro_evt, mag_evt;
92-
//
93-
// _accel->getEvent(&accel_evt);
94-
// _gyro->getEvent(&gyro_evt);
95-
// _mag->getEvent(&mag_evt);
96-
//
97-
// // calibrate
98-
//
99-
//
100-
// // Convert gyro from Rad/s to Degree/s
101-
// gyro_evt.gyro.x *= SENSORS_RADS_TO_DPS;
102-
// gyro_evt.gyro.y *= SENSORS_RADS_TO_DPS;
103-
// gyro_evt.gyro.z *= SENSORS_RADS_TO_DPS;
104-
//
105-
// // apply filter, update 10 times before notify
106-
// filter->update(gyro_evt.gyro.x , gyro_evt.gyro.y, gyro_evt.gyro.z,
107-
// accel_evt.acceleration.x, accel_evt.acceleration.y, accel_evt.acceleration.z,
108-
// mag_evt.magnetic.x, mag_evt.magnetic.y, mag_evt.magnetic.z);
132+
_measurement.notify(quater, sizeof(quater));
133+
}
134+
135+
void BLEAdafruitQuaternion::_fitler_update(void)
136+
{
137+
// get sensor
138+
sensors_event_t accel_evt, gyro_evt, mag_evt;
139+
140+
_accel->getEvent(&accel_evt);
141+
_gyro->getEvent(&gyro_evt);
142+
_mag->getEvent(&mag_evt);
143+
144+
// calibrate
145+
146+
147+
// Convert gyro from Rad/s to Degree/s
148+
gyro_evt.gyro.x *= SENSORS_RADS_TO_DPS;
149+
gyro_evt.gyro.y *= SENSORS_RADS_TO_DPS;
150+
gyro_evt.gyro.z *= SENSORS_RADS_TO_DPS;
151+
152+
// apply filter, update 10 times before notify
153+
_filter->update(gyro_evt.gyro.x , gyro_evt.gyro.y, gyro_evt.gyro.z,
154+
accel_evt.acceleration.x, accel_evt.acceleration.y, accel_evt.acceleration.z,
155+
mag_evt.magnetic.x, mag_evt.magnetic.y, mag_evt.magnetic.z);
156+
}
157+
158+
//--------------------------------------------------------------------+
159+
// Static Methods
160+
//--------------------------------------------------------------------+
161+
void BLEAdafruitQuaternion::quaternion_filter_timer_cb(TimerHandle_t xTimer)
162+
{
163+
BLEAdafruitQuaternion* svc = (BLEAdafruitQuaternion*) pvTimerGetTimerID(xTimer);
164+
svc->_fitler_update();
109165
}

libraries/BLEAdafruitService/src/services/BLEAdafruitQuaternion.h

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -34,12 +34,17 @@ class BLEAdafruitQuaternion : public BLEAdafruitSensor
3434
public:
3535
static const uint8_t UUID128_SERVICE[16];
3636
static const uint8_t UUID128_CHR_DATA[16];
37+
static const uint8_t FILTER_MEASURE_RATIO = 10; // number of filter update for each measure report to client
3738

3839
BLEAdafruitQuaternion(void);
3940
err_t begin(Adafruit_AHRS_FusionInterface* filter, Adafruit_Sensor* accel, Adafruit_Sensor* gyro, Adafruit_Sensor* mag);
4041

4142
protected:
43+
virtual void _update_timer(int32_t ms);
4244
virtual void _measure_handler(void);
45+
virtual void _notify_cb(uint16_t conn_hdl, uint16_t value);
46+
47+
void _fitler_update(void);
4348

4449
private:
4550
Adafruit_Sensor* _accel;
@@ -48,6 +53,8 @@ class BLEAdafruitQuaternion : public BLEAdafruitSensor
4853

4954
Adafruit_AHRS_FusionInterface* _filter;
5055
SoftwareTimer _filter_timer;
56+
57+
static void quaternion_filter_timer_cb(TimerHandle_t xTimer);
5158
};
5259

5360
#endif /* BLEADAFRUIT_QUATERNION_H_ */

libraries/BLEAdafruitService/src/services/BLEAdafruitSensor.cpp

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -99,7 +99,6 @@ void BLEAdafruitSensor::_notify_cb(uint16_t conn_hdl, uint16_t value)
9999

100100
void BLEAdafruitSensor::_update_timer(int32_t ms)
101101
{
102-
// TODO handle period = 0 which notify on changes ASAP
103102
if ( ms < 0 )
104103
{
105104
_timer.stop();

libraries/BLEAdafruitService/src/services/BLEAdafruitSensor.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -50,8 +50,8 @@ class BLEAdafruitSensor : public BLEService
5050
SoftwareTimer _timer;
5151

5252
err_t _begin(int32_t ms);
53-
void _update_timer(int32_t ms);
5453

54+
virtual void _update_timer(int32_t ms);
5555
virtual void _measure_handler(void);
5656
virtual void _notify_cb(uint16_t conn_hdl, uint16_t value);
5757

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

Lines changed: 5 additions & 37 deletions
Original file line numberDiff line numberDiff line change
@@ -123,36 +123,6 @@ uint16_t measure_light(uint8_t* buf, uint16_t bufsize)
123123
return 4;
124124
}
125125

126-
//uint16_t measure_gyro(uint8_t* buf, uint16_t bufsize)
127-
//{
128-
// float* float_buf = (float*) buf;
129-
//
130-
// sensors_event_t accel, gyro, temp;
131-
// (void) accel; (void) temp;
132-
//
133-
// lsm6ds33.getEvent(&accel, &gyro, &temp);
134-
//
135-
// float_buf[0] = gyro.gyro.x;
136-
// float_buf[1] = gyro.gyro.y;
137-
// float_buf[2] = gyro.gyro.z;
138-
//
139-
// return 12;
140-
//}
141-
//
142-
//uint16_t measure_magnetic(uint8_t* buf, uint16_t bufsize)
143-
//{
144-
// float* float_buf = (float*) buf;
145-
//
146-
// sensors_event_t mag;
147-
// lis3mdl.getEvent(&mag);
148-
//
149-
// float_buf[0] = mag.magnetic.x;
150-
// float_buf[1] = mag.magnetic.y;
151-
// float_buf[2] = mag.magnetic.z;
152-
//
153-
// return 12;
154-
//}
155-
156126
uint16_t measure_button(uint8_t* buf, uint16_t bufsize)
157127
{
158128
// Button is active LOW on most board except CPlay
@@ -261,12 +231,6 @@ void setup()
261231
blebas.write(100);
262232

263233
//------------- Adafruit Service -------------//
264-
#ifdef ARDUINO_NRF52840_CIRCUITPLAY
265-
bleTemp.begin(measure_temperature);
266-
#else
267-
bleTemp.begin(bmp280.getTemperatureSensor());
268-
#endif
269-
270234
bleAccel.begin(accel_sensor);
271235
bleLight.begin(measure_light);
272236

@@ -279,7 +243,11 @@ void setup()
279243
blePixel.begin(&strip);
280244

281245
// CPB doesn't support these on-board sensor
282-
#ifndef ARDUINO_NRF52840_CIRCUITPLAY
246+
#ifdef ARDUINO_NRF52840_CIRCUITPLAY
247+
bleTemp.begin(measure_temperature);
248+
249+
#else
250+
bleTemp.begin(bmp280.getTemperatureSensor());
283251
bleHumid.begin(measure_humid);
284252
bleBaro.begin(bmp280.getPressureSensor());
285253

0 commit comments

Comments
 (0)