From 071f89df2e8a166c95a37628ede196b931b60968 Mon Sep 17 00:00:00 2001
From: Andrew Tridgell <tridge@samba.org>
Date: Thu, 29 Mar 2012 08:57:53 +1100
Subject: [PATCH] AHRS: fixed error_yaw reporting with 2 MAVLink connections

when a user first connects with USB, and later switches to the
telemetry port without restarting we were getting zero for error_yaw
in the logs, as AHRS.get_error_yaw() was being called twice.

This ensures we give the last value after the counter is reset
---
 libraries/AP_AHRS/AP_AHRS_DCM.cpp        | 18 ++++++++++--------
 libraries/AP_AHRS/AP_AHRS_DCM.h          |  2 ++
 libraries/AP_AHRS/AP_AHRS_Quaternion.cpp | 24 ++++++++++++++----------
 libraries/AP_AHRS/AP_AHRS_Quaternion.h   |  2 ++
 4 files changed, 28 insertions(+), 18 deletions(-)

diff --git a/libraries/AP_AHRS/AP_AHRS_DCM.cpp b/libraries/AP_AHRS/AP_AHRS_DCM.cpp
index 323d1bb33..b6fa2e1f4 100644
--- a/libraries/AP_AHRS/AP_AHRS_DCM.cpp
+++ b/libraries/AP_AHRS/AP_AHRS_DCM.cpp
@@ -495,25 +495,27 @@ AP_AHRS_DCM::euler_angles(void)
 // average error_roll_pitch since last call
 float AP_AHRS_DCM::get_error_rp(void)
 {
-	float ret;
 	if (_error_rp_count == 0) {
-		return 0;
+		// this happens when telemetry is setup on two
+		// serial ports
+		return _error_rp_last;
 	}
-	ret = _error_rp_sum / _error_rp_count;
+	_error_rp_last = _error_rp_sum / _error_rp_count;
 	_error_rp_sum = 0;
 	_error_rp_count = 0;
-	return ret;
+	return _error_rp_last;
 }
 
 // average error_yaw since last call
 float AP_AHRS_DCM::get_error_yaw(void)
 {
-	float ret;
 	if (_error_yaw_count == 0) {
-		return 0;
+		// this happens when telemetry is setup on two
+		// serial ports
+		return _error_yaw_last;
 	}
-	ret = _error_yaw_sum / _error_yaw_count;
+	_error_yaw_last = _error_yaw_sum / _error_yaw_count;
 	_error_yaw_sum = 0;
 	_error_yaw_count = 0;
-	return ret;
+	return _error_yaw_last;
 }
diff --git a/libraries/AP_AHRS/AP_AHRS_DCM.h b/libraries/AP_AHRS/AP_AHRS_DCM.h
index ee5b3403a..5952380c7 100644
--- a/libraries/AP_AHRS/AP_AHRS_DCM.h
+++ b/libraries/AP_AHRS/AP_AHRS_DCM.h
@@ -75,8 +75,10 @@ private:
 	uint16_t	_renorm_val_count;
 	float		_error_rp_sum;
 	uint16_t	_error_rp_count;
+	float		_error_rp_last;
 	float		_error_yaw_sum;
 	uint16_t	_error_yaw_count;
+	float		_error_yaw_last;
 
 	// time in millis when we last got a GPS heading
 	uint32_t	_gps_last_update;
diff --git a/libraries/AP_AHRS/AP_AHRS_Quaternion.cpp b/libraries/AP_AHRS/AP_AHRS_Quaternion.cpp
index 03fe02869..5148aa878 100644
--- a/libraries/AP_AHRS/AP_AHRS_Quaternion.cpp
+++ b/libraries/AP_AHRS/AP_AHRS_Quaternion.cpp
@@ -383,30 +383,34 @@ void AP_AHRS_Quaternion::update(void)
 
 }
 
-// average error in roll/pitch since last call
+/* reporting of Quaternion state for MAVLink */
+
+// average error_roll_pitch since last call
 float AP_AHRS_Quaternion::get_error_rp(void)
 {
-	float ret;
 	if (_error_rp_count == 0) {
-		return 0;
+		// this happens when telemetry is setup on two
+		// serial ports
+		return _error_rp_last;
 	}
-	ret = _error_rp_sum / _error_rp_count;
+	_error_rp_last = _error_rp_sum / _error_rp_count;
 	_error_rp_sum = 0;
 	_error_rp_count = 0;
-	return ret;
+	return _error_rp_last;
 }
 
-// average error in yaw since last call
+// average error_yaw since last call
 float AP_AHRS_Quaternion::get_error_yaw(void)
 {
-	float ret;
 	if (_error_yaw_count == 0) {
-		return 0;
+		// this happens when telemetry is setup on two
+		// serial ports
+		return _error_yaw_last;
 	}
-	ret = _error_yaw_sum / _error_yaw_count;
+	_error_yaw_last = _error_yaw_sum / _error_yaw_count;
 	_error_yaw_sum = 0;
 	_error_yaw_count = 0;
-	return ret;
+	return _error_yaw_last;
 }
 
 // reset attitude system
diff --git a/libraries/AP_AHRS/AP_AHRS_Quaternion.h b/libraries/AP_AHRS/AP_AHRS_Quaternion.h
index a5b658390..91c41e2ea 100644
--- a/libraries/AP_AHRS/AP_AHRS_Quaternion.h
+++ b/libraries/AP_AHRS/AP_AHRS_Quaternion.h
@@ -87,8 +87,10 @@ private:
 	// estimate of error
 	float		_error_rp_sum;
 	uint16_t	_error_rp_count;
+	float		_error_rp_last;
 	float		_error_yaw_sum;
 	uint16_t	_error_yaw_count;
+	float		_error_yaw_last;
 };
 
 #endif
-- 
GitLab