diff --git a/src/drivers/l3gd20/l3gd20.cpp b/src/drivers/l3gd20/l3gd20.cpp index 7dcd5a0004..43a24359eb 100644 --- a/src/drivers/l3gd20/l3gd20.cpp +++ b/src/drivers/l3gd20/l3gd20.cpp @@ -66,6 +66,7 @@ #include #include #include +#include #include #include @@ -175,6 +176,7 @@ static const int ERROR = -1; #define L3GD20_DEFAULT_RATE 760 #define L3G4200D_DEFAULT_RATE 800 +#define L3GD20_MAX_OUTPUT_RATE 280 #define L3GD20_DEFAULT_RANGE_DPS 2000 #define L3GD20_DEFAULT_FILTER_FREQ 30 #define L3GD20_TEMP_OFFSET_CELSIUS 40 @@ -256,6 +258,8 @@ private: math::LowPassFilter2p _gyro_filter_y; math::LowPassFilter2p _gyro_filter_z; + Integrator _gyro_int; + /* true if an L3G4200D is detected */ bool _is_l3g4200d; @@ -427,6 +431,7 @@ L3GD20::L3GD20(int bus, const char* path, spi_dev_e device, enum Rotation rotati _gyro_filter_x(L3GD20_DEFAULT_RATE, L3GD20_DEFAULT_FILTER_FREQ), _gyro_filter_y(L3GD20_DEFAULT_RATE, L3GD20_DEFAULT_FILTER_FREQ), _gyro_filter_z(L3GD20_DEFAULT_RATE, L3GD20_DEFAULT_FILTER_FREQ), + _gyro_int(1000000 / L3GD20_MAX_OUTPUT_RATE, true), _is_l3g4200d(false), _rotation(rotation), _checked_next(0) @@ -1029,13 +1034,21 @@ L3GD20::measure() // apply user specified rotation rotate_3f(_rotation, xraw_f, yraw_f, zraw_f); - report.x = ((xraw_f * _gyro_range_scale) - _gyro_scale.x_offset) * _gyro_scale.x_scale; - report.y = ((yraw_f * _gyro_range_scale) - _gyro_scale.y_offset) * _gyro_scale.y_scale; - report.z = ((zraw_f * _gyro_range_scale) - _gyro_scale.z_offset) * _gyro_scale.z_scale; + float xin = ((xraw_f * _gyro_range_scale) - _gyro_scale.x_offset) * _gyro_scale.x_scale; + float yin = ((yraw_f * _gyro_range_scale) - _gyro_scale.y_offset) * _gyro_scale.y_scale; + float zin = ((zraw_f * _gyro_range_scale) - _gyro_scale.z_offset) * _gyro_scale.z_scale; - report.x = _gyro_filter_x.apply(report.x); - report.y = _gyro_filter_y.apply(report.y); - report.z = _gyro_filter_z.apply(report.z); + report.x = _gyro_filter_x.apply(xin); + report.y = _gyro_filter_y.apply(yin); + report.z = _gyro_filter_z.apply(zin); + + math::Vector<3> gval(xin, yin, zin); + math::Vector<3> gval_integrated; + + bool gyro_notify = _gyro_int.put(report.timestamp, gval, gval_integrated, report.integral_dt); + report.x_integral = gval_integrated(0); + report.y_integral = gval_integrated(1); + report.z_integral = gval_integrated(2); report.temperature = L3GD20_TEMP_OFFSET_CELSIUS - raw_report.temp; @@ -1044,13 +1057,15 @@ L3GD20::measure() _reports->force(&report); - /* notify anyone waiting for data */ - poll_notify(POLLIN); + if (gyro_notify) { + /* notify anyone waiting for data */ + poll_notify(POLLIN); - /* publish for subscribers */ - if (!(_pub_blocked)) { - /* publish it */ - orb_publish(ORB_ID(sensor_gyro), _gyro_topic, &report); + /* publish for subscribers */ + if (!(_pub_blocked)) { + /* publish it */ + orb_publish(ORB_ID(sensor_gyro), _gyro_topic, &report); + } } _read++;