@@ -76,13 +76,16 @@ err_t BLEAdafruitQuaternion::begin(Adafruit_AHRS_FusionInterface* filter, Adafru
76
76
_gyro = gyro;
77
77
_mag = mag;
78
78
79
+ int32_t const period_ms = 100 ;
80
+
79
81
// 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 ) );
81
83
82
84
// 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 );
84
86
85
87
_filter_timer.begin (filter_ms, quaternion_filter_timer_cb, this , true );
88
+ _filter->begin (1000 .0f /filter_ms);
86
89
87
90
return ERROR_NONE;
88
91
}
@@ -109,14 +112,15 @@ void BLEAdafruitQuaternion::_notify_cb(uint16_t conn_hdl, uint16_t value)
109
112
110
113
void BLEAdafruitQuaternion::_update_timer (int32_t ms)
111
114
{
112
- int32_t const filter_ms = maxof (10 , ms / FILTER_MEASURE_RATIO );
115
+ int32_t const filter_ms = maxof (10 , ms / FUSION_MEASURE_RATIO );
113
116
114
117
if ( filter_ms < 0 )
115
118
{
116
119
_filter_timer.stop ();
117
120
}else if ( filter_ms > 0 )
118
121
{
119
122
_filter_timer.setPeriod (filter_ms);
123
+ _filter->begin (1000 .0f /filter_ms); // need to also change the sample frequency
120
124
}else
121
125
{
122
126
// Period = 0: keeping the current interval, but report on changes only
@@ -127,6 +131,11 @@ void BLEAdafruitQuaternion::_update_timer(int32_t ms)
127
131
BLEAdafruitSensor::_update_timer (ms);
128
132
}
129
133
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
+
130
139
// Invoked by period timer in Base class
131
140
// Note invoked in RTOS Timer thread
132
141
void BLEAdafruitQuaternion::_measure_handler (void )
@@ -138,29 +147,28 @@ void BLEAdafruitQuaternion::_measure_handler(void)
138
147
// TODO multiple connections
139
148
_measurement.notify (quater, sizeof (quater));
140
149
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);
143
151
}
144
152
145
153
// 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
147
155
void BLEAdafruitQuaternion::_fitler_update (void )
148
156
{
149
157
// get sensor events
150
158
sensors_event_t accel_evt, gyro_evt, mag_evt;
151
159
152
160
// int start_ms = millis();
153
161
154
- _mag->getEvent (&mag_evt);
155
162
_accel->getEvent (&accel_evt);
156
163
_gyro->getEvent (&gyro_evt);
164
+ _mag->getEvent (&mag_evt);
157
165
158
166
// calibrate sensor if available
159
167
if (_calib)
160
168
{
161
- _calib->calibrate (mag_evt);
162
169
_calib->calibrate (accel_evt);
163
170
_calib->calibrate (gyro_evt);
171
+ _calib->calibrate (mag_evt);
164
172
}
165
173
166
174
// Convert gyro from Rad/s to Degree/s
@@ -184,10 +192,6 @@ void BLEAdafruitQuaternion::_fitler_update(void)
184
192
void BLEAdafruitQuaternion::quaternion_filter_timer_cb (TimerHandle_t xTimer)
185
193
{
186
194
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
- {
192
195
svc->_fitler_update ();
193
196
}
197
+
0 commit comments