@@ -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
110113void 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
132141void 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
147155void 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)
184192void 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+
0 commit comments