|
|
@ -33,7 +33,6 @@ Vector3f AP_InertialSensor_Flymaple::_accel_filtered; |
|
|
|
uint32_t AP_InertialSensor_Flymaple::_accel_samples; |
|
|
|
uint32_t AP_InertialSensor_Flymaple::_accel_samples; |
|
|
|
Vector3f AP_InertialSensor_Flymaple::_gyro_filtered; |
|
|
|
Vector3f AP_InertialSensor_Flymaple::_gyro_filtered; |
|
|
|
uint32_t AP_InertialSensor_Flymaple::_gyro_samples; |
|
|
|
uint32_t AP_InertialSensor_Flymaple::_gyro_samples; |
|
|
|
volatile bool AP_InertialSensor_Flymaple::_in_accumulate; |
|
|
|
|
|
|
|
uint64_t AP_InertialSensor_Flymaple::_last_accel_timestamp; |
|
|
|
uint64_t AP_InertialSensor_Flymaple::_last_accel_timestamp; |
|
|
|
uint64_t AP_InertialSensor_Flymaple::_last_gyro_timestamp; |
|
|
|
uint64_t AP_InertialSensor_Flymaple::_last_gyro_timestamp; |
|
|
|
LowPassFilter2p AP_InertialSensor_Flymaple::_accel_filter_x(800, 10); |
|
|
|
LowPassFilter2p AP_InertialSensor_Flymaple::_accel_filter_x(800, 10); |
|
|
@ -98,6 +97,13 @@ uint16_t AP_InertialSensor_Flymaple::_init_sensor( Sample_rate sample_rate ) |
|
|
|
break; |
|
|
|
break; |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
// get pointer to i2c bus semaphore
|
|
|
|
|
|
|
|
AP_HAL::Semaphore* i2c_sem = hal.i2c->get_semaphore(); |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
// take i2c bus sempahore
|
|
|
|
|
|
|
|
if (!i2c_sem->take(HAL_SEMAPHORE_BLOCK_FOREVER)) |
|
|
|
|
|
|
|
return false; |
|
|
|
|
|
|
|
|
|
|
|
// Init the accelerometer
|
|
|
|
// Init the accelerometer
|
|
|
|
uint8_t data; |
|
|
|
uint8_t data; |
|
|
|
hal.i2c->readRegister(FLYMAPLE_ACCELEROMETER_ADDRESS, FLYMAPLE_ACCELEROMETER_ADXLREG_DEVID, &data); |
|
|
|
hal.i2c->readRegister(FLYMAPLE_ACCELEROMETER_ADDRESS, FLYMAPLE_ACCELEROMETER_ADXLREG_DEVID, &data); |
|
|
@ -142,6 +148,9 @@ uint16_t AP_InertialSensor_Flymaple::_init_sensor( Sample_rate sample_rate ) |
|
|
|
// Set up the filter desired
|
|
|
|
// Set up the filter desired
|
|
|
|
_set_filter_frequency(_mpu6000_filter); |
|
|
|
_set_filter_frequency(_mpu6000_filter); |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
// give back i2c semaphore
|
|
|
|
|
|
|
|
i2c_sem->give(); |
|
|
|
|
|
|
|
|
|
|
|
return AP_PRODUCT_ID_FLYMAPLE; |
|
|
|
return AP_PRODUCT_ID_FLYMAPLE; |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
@ -239,18 +248,19 @@ float AP_InertialSensor_Flymaple::get_gyro_drift_rate(void) |
|
|
|
// within the mainline and thropttle the reads here to suit the sensors
|
|
|
|
// within the mainline and thropttle the reads here to suit the sensors
|
|
|
|
void AP_InertialSensor_Flymaple::_accumulate(void) |
|
|
|
void AP_InertialSensor_Flymaple::_accumulate(void) |
|
|
|
{ |
|
|
|
{ |
|
|
|
if (_in_accumulate) { |
|
|
|
// get pointer to i2c bus semaphore
|
|
|
|
return; // Dont be re-entrant (how can this occur?)
|
|
|
|
AP_HAL::Semaphore* i2c_sem = hal.i2c->get_semaphore(); |
|
|
|
} |
|
|
|
|
|
|
|
_in_accumulate = true; |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
// take i2c bus sempahore
|
|
|
|
|
|
|
|
if (!i2c_sem->take(HAL_SEMAPHORE_BLOCK_FOREVER)) |
|
|
|
|
|
|
|
return; |
|
|
|
|
|
|
|
|
|
|
|
// Read accelerometer
|
|
|
|
// Read accelerometer
|
|
|
|
// ADXL345 is in the default FIFO bypass mode, so the FIFO is not used
|
|
|
|
// ADXL345 is in the default FIFO bypass mode, so the FIFO is not used
|
|
|
|
uint8_t buffer[6]; |
|
|
|
uint8_t buffer[6]; |
|
|
|
uint64_t now = hal.scheduler->micros(); |
|
|
|
uint64_t now = hal.scheduler->micros(); |
|
|
|
// This takes about 500us at 200kHz I2C speed
|
|
|
|
// This takes about 500us at 200kHz I2C speed
|
|
|
|
if (now > (_last_accel_timestamp + raw_sample_interval_us)
|
|
|
|
if ((now - _last_accel_timestamp) >= raw_sample_interval_us |
|
|
|
&& hal.i2c->readRegisters(FLYMAPLE_ACCELEROMETER_ADDRESS, FLYMAPLE_ACCELEROMETER_ADXLREG_DATAX0, 6, buffer) == 0) |
|
|
|
&& hal.i2c->readRegisters(FLYMAPLE_ACCELEROMETER_ADDRESS, FLYMAPLE_ACCELEROMETER_ADXLREG_DATAX0, 6, buffer) == 0) |
|
|
|
{ |
|
|
|
{ |
|
|
|
// The order is a bit wierd here since the standard we have adopted for Flymaple
|
|
|
|
// The order is a bit wierd here since the standard we have adopted for Flymaple
|
|
|
@ -270,7 +280,7 @@ void AP_InertialSensor_Flymaple::_accumulate(void) |
|
|
|
// Read gyro
|
|
|
|
// Read gyro
|
|
|
|
now = hal.scheduler->micros(); |
|
|
|
now = hal.scheduler->micros(); |
|
|
|
// This takes about 500us at 200kHz I2C speed
|
|
|
|
// This takes about 500us at 200kHz I2C speed
|
|
|
|
if (now > (_last_gyro_timestamp + raw_sample_interval_us)
|
|
|
|
if ((now - _last_gyro_timestamp) >= raw_sample_interval_us |
|
|
|
&& hal.i2c->readRegisters(FLYMAPLE_GYRO_ADDRESS, FLYMAPLE_GYRO_GYROX_H, 6, buffer) == 0) |
|
|
|
&& hal.i2c->readRegisters(FLYMAPLE_GYRO_ADDRESS, FLYMAPLE_GYRO_GYROX_H, 6, buffer) == 0) |
|
|
|
{ |
|
|
|
{ |
|
|
|
// See above re order of samples in buffer
|
|
|
|
// See above re order of samples in buffer
|
|
|
@ -284,8 +294,8 @@ void AP_InertialSensor_Flymaple::_accumulate(void) |
|
|
|
_last_gyro_timestamp = now; |
|
|
|
_last_gyro_timestamp = now; |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
_in_accumulate = false; |
|
|
|
// give back i2c semaphore
|
|
|
|
|
|
|
|
i2c_sem->give(); |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
bool AP_InertialSensor_Flymaple::sample_available(void) |
|
|
|
bool AP_InertialSensor_Flymaple::sample_available(void) |
|
|
|