2015-12-13 23:20:06 -04:00
|
|
|
#include <AP_HAL/AP_HAL.h>
|
|
|
|
|
|
|
|
#if CONFIG_HAL_BOARD_SUBTYPE == HAL_BOARD_SUBTYPE_LINUX_QFLIGHT
|
|
|
|
|
|
|
|
#include "AP_InertialSensor_qflight.h"
|
|
|
|
#include <AP_HAL_Linux/qflight/qflight_util.h>
|
|
|
|
#include <AP_HAL_Linux/qflight/qflight_dsp.h>
|
|
|
|
|
|
|
|
const extern AP_HAL::HAL& hal;
|
|
|
|
|
|
|
|
AP_InertialSensor_QFLIGHT::AP_InertialSensor_QFLIGHT(AP_InertialSensor &imu) :
|
|
|
|
AP_InertialSensor_Backend(imu)
|
|
|
|
{
|
|
|
|
}
|
|
|
|
|
|
|
|
/*
|
|
|
|
detect the sensor
|
|
|
|
*/
|
|
|
|
AP_InertialSensor_Backend *AP_InertialSensor_QFLIGHT::detect(AP_InertialSensor &_imu)
|
|
|
|
{
|
|
|
|
AP_InertialSensor_QFLIGHT *sensor = new AP_InertialSensor_QFLIGHT(_imu);
|
2016-10-30 02:24:21 -03:00
|
|
|
if (sensor == nullptr) {
|
|
|
|
return nullptr;
|
2015-12-13 23:20:06 -04:00
|
|
|
}
|
|
|
|
if (!sensor->init_sensor()) {
|
|
|
|
delete sensor;
|
2016-10-30 02:24:21 -03:00
|
|
|
return nullptr;
|
2015-12-13 23:20:06 -04:00
|
|
|
}
|
|
|
|
return sensor;
|
|
|
|
}
|
|
|
|
|
|
|
|
bool AP_InertialSensor_QFLIGHT::init_sensor(void)
|
|
|
|
{
|
2016-09-03 21:51:37 -03:00
|
|
|
gyro_instance = _imu.register_gyro(1000, 1);
|
|
|
|
accel_instance = _imu.register_accel(1000, 1);
|
2015-12-13 23:20:06 -04:00
|
|
|
|
|
|
|
hal.scheduler->register_timer_process(FUNCTOR_BIND_MEMBER(&AP_InertialSensor_QFLIGHT::timer_update, void));
|
|
|
|
return true;
|
|
|
|
}
|
|
|
|
|
|
|
|
void AP_InertialSensor_QFLIGHT::timer_update(void)
|
|
|
|
{
|
|
|
|
if (imubuf == nullptr) {
|
|
|
|
imubuf = QFLIGHT_RPC_ALLOCATE(DSPBuffer::IMU);
|
|
|
|
if (imubuf == nullptr) {
|
|
|
|
AP_HAL::panic("unable to allocate IMU buffer");
|
|
|
|
}
|
|
|
|
}
|
|
|
|
int ret = qflight_get_imu_data((uint8_t *)imubuf, sizeof(*imubuf));
|
|
|
|
if (ret != 0) {
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
for (uint16_t i=0; i<imubuf->num_samples; i++) {
|
|
|
|
DSPBuffer::IMU::BUF &b = imubuf->buf[i];
|
|
|
|
Vector3f accel(b.accel[0], b.accel[1], b.accel[2]);
|
|
|
|
Vector3f gyro(b.gyro[0], b.gyro[1], b.gyro[2]);
|
|
|
|
_rotate_and_correct_accel(accel_instance, accel);
|
|
|
|
_rotate_and_correct_gyro(gyro_instance, gyro);
|
|
|
|
_notify_new_accel_raw_sample(accel_instance, accel, b.timestamp);
|
|
|
|
_notify_new_gyro_raw_sample(gyro_instance, gyro, b.timestamp);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
bool AP_InertialSensor_QFLIGHT::update(void)
|
|
|
|
{
|
|
|
|
update_accel(accel_instance);
|
|
|
|
update_gyro(gyro_instance);
|
|
|
|
return true;
|
|
|
|
}
|
|
|
|
|
|
|
|
#endif // HAL_BOARD_QFLIGHT
|