Skip to content

Commit a97d245

Browse files
committed
finish quaternion service
1 parent 6e98e29 commit a97d245

File tree

4 files changed

+29
-19
lines changed

4 files changed

+29
-19
lines changed

cores/nRF5/common_func.h

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -145,6 +145,7 @@ const char* dbg_err_str(int32_t err_id); // TODO move to other place
145145
#define PRTNT_HEAP() if (CFG_DEBUG == 3) PRINTF("\n%s: %d: Heap free: %d\n", __FUNCTION__, __LINE__, util_heap_get_free_size())
146146
#define PRINT_STR(x) PRINTF("%s: %d: " #x " = %s\n" , __FUNCTION__, __LINE__, (char*)(x) )
147147
#define PRINT_INT(x) PRINTF("%s: %d: " #x " = %ld\n" , __FUNCTION__, __LINE__, (uint32_t) (x) )
148+
#define PRINT_FLOAT(x) PRINTF("%s: %d: " #x " = %f\n" , __FUNCTION__, __LINE__, (float) (x) )
148149

149150
#define PRINT_HEX(x) \
150151
do {\
@@ -184,6 +185,7 @@ const char* dbg_err_str(int32_t err_id); // TODO move to other place
184185
#define PRINT_STR(x)
185186
#define PRINT_INT(x)
186187
#define PRINT_HEX(x)
188+
#define PRINT_FLOAT(x)
187189
#define PRINT_BUFFER(buf, n)
188190
#define ADALOG(...)
189191

libraries/BLEAdafruitService/src/services/BLEAdafruitQuaternion.cpp

Lines changed: 17 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -76,13 +76,16 @@ err_t BLEAdafruitQuaternion::begin(Adafruit_AHRS_FusionInterface* filter, Adafru
7676
_gyro = gyro;
7777
_mag = mag;
7878

79+
int32_t const period_ms = 100;
80+
7981
// Invoke base class begin(), this will add Service, Measurement and Period characteristics
80-
VERIFY_STATUS( BLEAdafruitSensor::_begin(DEFAULT_PERIOD) );
82+
VERIFY_STATUS( BLEAdafruitSensor::_begin(period_ms) );
8183

8284
// filter timer run faster than measurement timer, but not too fast
83-
int32_t const filter_ms = maxof(10, DEFAULT_PERIOD / FILTER_MEASURE_RATIO);
85+
int32_t const filter_ms = maxof(10, period_ms / FUSION_MEASURE_RATIO);
8486

8587
_filter_timer.begin(filter_ms, quaternion_filter_timer_cb, this, true);
88+
_filter->begin(1000.0f/filter_ms);
8689

8790
return ERROR_NONE;
8891
}
@@ -109,14 +112,15 @@ void BLEAdafruitQuaternion::_notify_cb(uint16_t conn_hdl, uint16_t value)
109112

110113
void BLEAdafruitQuaternion::_update_timer(int32_t ms)
111114
{
112-
int32_t const filter_ms = maxof(10, ms / FILTER_MEASURE_RATIO);
115+
int32_t const filter_ms = maxof(10, ms / FUSION_MEASURE_RATIO);
113116

114117
if ( filter_ms < 0 )
115118
{
116119
_filter_timer.stop();
117120
}else if ( filter_ms > 0)
118121
{
119122
_filter_timer.setPeriod(filter_ms);
123+
_filter->begin(1000.0f/filter_ms); // need to also change the sample frequency
120124
}else
121125
{
122126
// Period = 0: keeping the current interval, but report on changes only
@@ -127,6 +131,11 @@ void BLEAdafruitQuaternion::_update_timer(int32_t ms)
127131
BLEAdafruitSensor::_update_timer(ms);
128132
}
129133

134+
static void print_quaternion(float quater[4])
135+
{
136+
Serial.printf("Quaternion: %.04f, %.04f, %.04f, %.04f\n", quater[0], quater[1], quater[2], quater[3]);
137+
}
138+
130139
// Invoked by period timer in Base class
131140
// Note invoked in RTOS Timer thread
132141
void BLEAdafruitQuaternion::_measure_handler(void)
@@ -138,29 +147,28 @@ void BLEAdafruitQuaternion::_measure_handler(void)
138147
// TODO multiple connections
139148
_measurement.notify(quater, sizeof(quater));
140149

141-
// Serial.printf("Orientation: %.02f, %.02f, %.02f\n", _filter->getYaw(), _filter->getPitch(), _filter->getRoll());
142-
// Serial.printf("Quaternion: %.04f, %.04f, %.04f, %.04f\n", quater[0], quater[1], quater[2], quater[3]);
150+
ada_callback(quater, sizeof(quater), print_quaternion, quater);
143151
}
144152

145153
// Fusion Filter update
146-
// This function take ~ 6ms to get all sensor data (computing time is not much)
154+
// This function take ~ 1-2 ms to get all sensor data
147155
void BLEAdafruitQuaternion::_fitler_update(void)
148156
{
149157
// get sensor events
150158
sensors_event_t accel_evt, gyro_evt, mag_evt;
151159

152160
// int start_ms = millis();
153161

154-
_mag->getEvent(&mag_evt);
155162
_accel->getEvent(&accel_evt);
156163
_gyro->getEvent(&gyro_evt);
164+
_mag->getEvent(&mag_evt);
157165

158166
// calibrate sensor if available
159167
if (_calib)
160168
{
161-
_calib->calibrate(mag_evt);
162169
_calib->calibrate(accel_evt);
163170
_calib->calibrate(gyro_evt);
171+
_calib->calibrate(mag_evt);
164172
}
165173

166174
// Convert gyro from Rad/s to Degree/s
@@ -184,10 +192,6 @@ void BLEAdafruitQuaternion::_fitler_update(void)
184192
void BLEAdafruitQuaternion::quaternion_filter_timer_cb(TimerHandle_t xTimer)
185193
{
186194
BLEAdafruitQuaternion* svc = (BLEAdafruitQuaternion*) pvTimerGetTimerID(xTimer);
187-
ada_callback(NULL, 0, quaternion_filter_update_dfr, svc);
188-
}
189-
190-
void BLEAdafruitQuaternion::quaternion_filter_update_dfr(BLEAdafruitQuaternion* svc)
191-
{
192195
svc->_fitler_update();
193196
}
197+

libraries/BLEAdafruitService/src/services/BLEAdafruitQuaternion.h

Lines changed: 1 addition & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -34,7 +34,7 @@ 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
37+
static const uint8_t FUSION_MEASURE_RATIO = 10; // number of filter update for each measure report to client
3838

3939
BLEAdafruitQuaternion(void);
4040
err_t begin(Adafruit_AHRS_FusionInterface* filter, Adafruit_Sensor* accel, Adafruit_Sensor* gyro, Adafruit_Sensor* mag);
@@ -58,9 +58,6 @@ class BLEAdafruitQuaternion : public BLEAdafruitSensor
5858

5959
// filter timer callback, 10x faster than period timer
6060
static void quaternion_filter_timer_cb(TimerHandle_t xTimer);
61-
62-
// filter update deferred to ada callback since it takes lots of time to get 3 sensor data
63-
static void quaternion_filter_update_dfr(BLEAdafruitQuaternion* svc);
6461
};
6562

6663
#endif /* BLEADAFRUIT_QUATERNION_H_ */

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

Lines changed: 9 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -187,7 +187,6 @@ void setup()
187187

188188
bmp280.begin();
189189
sht30.begin(0x44);
190-
191190
lsm6ds33.begin_I2C();
192191
lis3mdl.begin_I2C();
193192

@@ -203,7 +202,8 @@ void setup()
203202
lis3mdl.setPerformanceMode(LIS3MDL_MEDIUMMODE);
204203
lis3mdl.setOperationMode(LIS3MDL_CONTINUOUSMODE);
205204

206-
filter.begin(100); // sample rate in hz
205+
// Increase I2C speed to 400 Khz
206+
Wire.setClock(400000);
207207

208208
accel_sensor = lsm6ds33.getAccelerometerSensor();
209209

@@ -212,6 +212,13 @@ void setup()
212212
fatfs.begin(&flash);
213213
cal.begin(FILE_SENSOR_CALIB, &fatfs);
214214
cal.loadCalibration();
215+
216+
PRINT_FLOAT(cal.mag_hardiron[0]); PRINT_FLOAT(cal.mag_hardiron[1]); PRINT_FLOAT(cal.mag_hardiron[2]);
217+
PRINT_FLOAT(cal.mag_field);
218+
219+
PRINT_FLOAT(cal.mag_softiron[0]);PRINT_FLOAT(cal.mag_softiron[1]); PRINT_FLOAT(cal.mag_softiron[2]);
220+
PRINT_FLOAT(cal.mag_softiron[3]); PRINT_FLOAT(cal.mag_softiron[4]); PRINT_FLOAT(cal.mag_softiron[5]);
221+
PRINT_FLOAT(cal.mag_softiron[6]); PRINT_FLOAT(cal.mag_softiron[7]); PRINT_FLOAT(cal.mag_softiron[8]);
215222
#endif
216223

217224
Serial.println("Bluefruit Playground Example");

0 commit comments

Comments
 (0)