From 75bb3e9bac7c7125e4b81bcaf537b845764747e0 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Beat=20K=C3=BCng?= <beat-kueng@gmx.net>
Date: Tue, 12 Feb 2019 10:17:59 +0100
Subject: [PATCH] bmi055: add support for IMU_GYRO_CUTOFF and IMU_ACCEL_CUTOFF

---
 src/drivers/imu/bmi055/BMI055_accel.cpp | 19 +++++++++++++++----
 src/drivers/imu/bmi055/BMI055_gyro.cpp  | 20 ++++++++++++--------
 2 files changed, 27 insertions(+), 12 deletions(-)

diff --git a/src/drivers/imu/bmi055/BMI055_accel.cpp b/src/drivers/imu/bmi055/BMI055_accel.cpp
index 5bf7ba27cd..04a89b7b79 100644
--- a/src/drivers/imu/bmi055/BMI055_accel.cpp
+++ b/src/drivers/imu/bmi055/BMI055_accel.cpp
@@ -118,11 +118,13 @@ BMI055_accel::init()
 	_accel_reports = new ringbuffer::RingBuffer(2, sizeof(sensor_accel_s));
 
 	if (_accel_reports == nullptr) {
-		goto out;
+		return -ENOMEM;
 	}
 
-	if (reset() != OK) {
-		goto out;
+	ret = reset();
+
+	if (ret != OK) {
+		return ret;
 	}
 
 	/* Initialize offsets and scales */
@@ -135,6 +137,16 @@ BMI055_accel::init()
 
 	_accel_class_instance = register_class_devname(ACCEL_BASE_DEVICE_PATH);
 
+	param_t accel_cut_ph = param_find("IMU_ACCEL_CUTOFF");
+	float accel_cut = BMI055_ACCEL_DEFAULT_DRIVER_FILTER_FREQ;
+
+	if (accel_cut_ph != PARAM_INVALID && (param_get(accel_cut_ph, &accel_cut) == PX4_OK)) {
+
+		_accel_filter_x.set_cutoff_frequency(BMI055_ACCEL_DEFAULT_RATE, accel_cut);
+		_accel_filter_y.set_cutoff_frequency(BMI055_ACCEL_DEFAULT_RATE, accel_cut);
+		_accel_filter_z.set_cutoff_frequency(BMI055_ACCEL_DEFAULT_RATE, accel_cut);
+	}
+
 	measure();
 
 	/* advertise sensor topic, measure manually to initialize valid report */
@@ -149,7 +161,6 @@ BMI055_accel::init()
 		warnx("ADVERT FAIL");
 	}
 
-out:
 	return ret;
 }
 
diff --git a/src/drivers/imu/bmi055/BMI055_gyro.cpp b/src/drivers/imu/bmi055/BMI055_gyro.cpp
index eb737fc62d..275dba833d 100644
--- a/src/drivers/imu/bmi055/BMI055_gyro.cpp
+++ b/src/drivers/imu/bmi055/BMI055_gyro.cpp
@@ -117,11 +117,13 @@ BMI055_gyro::init()
 	_gyro_reports = new ringbuffer::RingBuffer(2, sizeof(sensor_gyro_s));
 
 	if (_gyro_reports == nullptr) {
-		goto out;
+		return -ENOMEM;
 	}
 
-	if (reset() != OK) {
-		goto out;
+	ret = reset();
+
+	if (ret != OK) {
+		return ret;
 	}
 
 	/* Initialize offsets and scales */
@@ -132,11 +134,14 @@ BMI055_gyro::init()
 	_gyro_scale.z_offset = 0;
 	_gyro_scale.z_scale  = 1.0f;
 
+	param_t gyro_cut_ph = param_find("IMU_GYRO_CUTOFF");
+	float gyro_cut = BMI055_GYRO_DEFAULT_DRIVER_FILTER_FREQ;
 
-	/* if probe/setup failed, bail now */
-	if (ret != OK) {
-		DEVICE_DEBUG("gyro init failed");
-		return ret;
+	if (gyro_cut_ph != PARAM_INVALID && (param_get(gyro_cut_ph, &gyro_cut) == PX4_OK)) {
+
+		_gyro_filter_x.set_cutoff_frequency(BMI055_GYRO_DEFAULT_RATE, gyro_cut);
+		_gyro_filter_y.set_cutoff_frequency(BMI055_GYRO_DEFAULT_RATE, gyro_cut);
+		_gyro_filter_z.set_cutoff_frequency(BMI055_GYRO_DEFAULT_RATE, gyro_cut);
 	}
 
 	_gyro_class_instance = register_class_devname(GYRO_BASE_DEVICE_PATH);
@@ -154,7 +159,6 @@ BMI055_gyro::init()
 		warnx("ADVERT FAIL");
 	}
 
-out:
 	return ret;
 }
 
-- 
GitLab