From 2a57e6c20ddf68bf926c6514825ef2d14bf8929a Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Niccol=C3=B2=20Betto?= <niccolo.betto@skywarder.eu>
Date: Mon, 9 Sep 2024 23:05:50 +0200
Subject: [PATCH] [Payload][Radio] Implement CALIBRATION_TM system TM

---
 src/boards/Payload/Radio/MessageHandler.cpp   | 33 ++++++++++++++++++
 src/boards/Payload/Sensors/SensorData.h       | 29 ++++++++++++----
 src/boards/Payload/Sensors/Sensors.cpp        | 34 +++++++++++++++----
 src/boards/Payload/Sensors/Sensors.h          |  7 ++++
 src/scripts/logdecoder/Payload/logdecoder.cpp |  2 +-
 5 files changed, 90 insertions(+), 15 deletions(-)

diff --git a/src/boards/Payload/Radio/MessageHandler.cpp b/src/boards/Payload/Radio/MessageHandler.cpp
index 89eff4225..d56b14445 100644
--- a/src/boards/Payload/Radio/MessageHandler.cpp
+++ b/src/boards/Payload/Radio/MessageHandler.cpp
@@ -815,6 +815,39 @@ bool Radio::MavlinkBackend::enqueueSystemTm(SystemTMList tmId)
             return true;
         }
 
+        case MAV_CALIBRATION_ID:
+        {
+            mavlink_message_t msg;
+            mavlink_calibration_tm_t tm;
+
+            auto cal = parent.getModule<Sensors>()->getCalibrationData();
+
+            tm.timestamp            = TimestampTimer::getTimestamp();
+            tm.gyro_bias_x          = cal.gyroBiasX;
+            tm.gyro_bias_y          = cal.gyroBiasY;
+            tm.gyro_bias_z          = cal.gyroBiasZ;
+            tm.mag_bias_x           = cal.magBiasX;
+            tm.mag_bias_y           = cal.magBiasY;
+            tm.mag_bias_z           = cal.magBiasZ;
+            tm.mag_scale_x          = cal.magScaleX;
+            tm.mag_scale_y          = cal.magScaleY;
+            tm.mag_scale_z          = cal.magScaleZ;
+            tm.static_press_1_bias  = cal.staticPressBias;
+            tm.static_press_1_scale = cal.staticPressScale;
+            tm.static_press_2_bias  = 0.0f;
+            tm.static_press_2_scale = 0.0f;
+            tm.dpl_bay_press_bias   = 0.0f;
+            tm.dpl_bay_press_scale  = 0.0f;
+            tm.dynamic_press_bias   = cal.dynamicPressBias;
+            tm.dynamic_press_scale  = cal.dynamicPressScale;
+
+            mavlink_msg_calibration_tm_encode(config::Mavlink::SYSTEM_ID,
+                                              config::Mavlink::COMPONENT_ID,
+                                              &msg, &tm);
+            enqueueMessage(msg);
+            return true;
+        }
+
         default:
             return false;
     }
diff --git a/src/boards/Payload/Sensors/SensorData.h b/src/boards/Payload/Sensors/SensorData.h
index d198b315d..91cfe924a 100644
--- a/src/boards/Payload/Sensors/SensorData.h
+++ b/src/boards/Payload/Sensors/SensorData.h
@@ -50,22 +50,37 @@ struct DynamicPressureData : public Boardcore::PressureData
     }
 };
 
-struct SensorsCalibrationParameter
+struct SensorCalibrationData
 {
     uint64_t timestamp      = 0;
-    float referencePressure = 0;
-    float offsetStatic      = 0;
-    float offsetDynamic     = 0;
+    float gyroBiasX         = 0.0f;
+    float gyroBiasY         = 0.0f;
+    float gyroBiasZ         = 0.0f;
+    float magBiasX          = 0.0f;
+    float magBiasY          = 0.0f;
+    float magBiasZ          = 0.0f;
+    float magScaleX         = 0.0f;
+    float magScaleY         = 0.0f;
+    float magScaleZ         = 0.0f;
+    float staticPressBias   = 0.0f;
+    float staticPressScale  = 0.0f;
+    float dynamicPressBias  = 0.0f;
+    float dynamicPressScale = 0.0f;
 
     static std::string header()
     {
-        return "timestamp,referencePressure,offsetStatic,offsetDynamic\n";
+        return "timestamp,gyroBiasX,gyroBiasY,gyroBiasZ,magBiasX,magBiasY,"
+               "magBiasZ,magScaleX,magScaleY,magScaleZ,staticPressBias,"
+               "staticPressScale,dynamicPressBias,dynamicPressScale\n";
     }
 
     void print(std::ostream& os) const
     {
-        os << timestamp << "," << referencePressure << "," << offsetStatic
-           << "," << offsetDynamic << "\n";
+        os << timestamp << "," << gyroBiasX << "," << gyroBiasY << ","
+           << gyroBiasZ << "," << magBiasX << "," << magBiasY << "," << magBiasZ
+           << "," << magScaleX << "," << magScaleY << "," << magScaleZ << ","
+           << staticPressBias << "," << staticPressScale << ","
+           << dynamicPressBias << "," << dynamicPressScale << "\n";
     }
 };
 
diff --git a/src/boards/Payload/Sensors/Sensors.cpp b/src/boards/Payload/Sensors/Sensors.cpp
index a60bdb73d..49c4ab50c 100644
--- a/src/boards/Payload/Sensors/Sensors.cpp
+++ b/src/boards/Payload/Sensors/Sensors.cpp
@@ -178,17 +178,37 @@ void Sensors::calibrate()
     }
     dynamicPressure->updateOffset(dynamicPressureMean);
 
-    miosix::Lock<miosix::FastMutex> lock{gyroCalibrationMutex};
-    gyroCalibration = gyroCalibrator.computeResult();
+    {
+        miosix::Lock<miosix::FastMutex> lock{gyroCalibrationMutex};
+        gyroCalibration = gyroCalibrator.computeResult();
+    }
 
     // Log the offsets
-    auto cal = SensorsCalibrationParameter{
+    auto data = getCalibrationData();
+    Logger::getInstance().log(data);
+}
+
+SensorCalibrationData Sensors::getCalibrationData()
+{
+    miosix::Lock<miosix::FastMutex> magLock{magCalibrationMutex};
+    miosix::Lock<miosix::FastMutex> gyroLock{gyroCalibrationMutex};
+
+    return SensorCalibrationData{
         .timestamp         = TimestampTimer::getTimestamp(),
-        .referencePressure = reference,
-        .offsetStatic      = staticPressure->getOffset(),
-        .offsetDynamic     = dynamicPressure->getOffset(),
+        .gyroBiasX         = gyroCalibration.getb().x(),
+        .gyroBiasY         = gyroCalibration.getb().y(),
+        .gyroBiasZ         = gyroCalibration.getb().z(),
+        .magBiasX          = magCalibration.getb().x(),
+        .magBiasY          = magCalibration.getb().y(),
+        .magBiasZ          = magCalibration.getb().z(),
+        .magScaleX         = magCalibration.getA().x(),
+        .magScaleY         = magCalibration.getA().y(),
+        .magScaleZ         = magCalibration.getA().z(),
+        .staticPressBias   = staticPressure->getOffset(),
+        .staticPressScale  = 1.0f,
+        .dynamicPressBias  = dynamicPressure->getOffset(),
+        .dynamicPressScale = 1.0f,
     };
-    Logger::getInstance().log(cal);
 }
 
 void Sensors::resetMagCalibrator()
diff --git a/src/boards/Payload/Sensors/Sensors.h b/src/boards/Payload/Sensors/Sensors.h
index 03e302365..d69a847eb 100644
--- a/src/boards/Payload/Sensors/Sensors.h
+++ b/src/boards/Payload/Sensors/Sensors.h
@@ -67,6 +67,13 @@ public:
      */
     void calibrate();
 
+    /**
+     * @brief Returns the current sensors calibration parameters.
+     *
+     * @internal Ensure mutexes are unlocked before calling this function.
+     */
+    SensorCalibrationData getCalibrationData();
+
     /**
      * @brief Resets the magnetometer calibration.
      */
diff --git a/src/scripts/logdecoder/Payload/logdecoder.cpp b/src/scripts/logdecoder/Payload/logdecoder.cpp
index 1919157dd..2be72b49c 100644
--- a/src/scripts/logdecoder/Payload/logdecoder.cpp
+++ b/src/scripts/logdecoder/Payload/logdecoder.cpp
@@ -66,7 +66,7 @@ void registerTypes(Deserializer& ds)
     ds.registerType<WingControllerStatus>();
     ds.registerType<StaticPressureData>();
     ds.registerType<DynamicPressureData>();
-    ds.registerType<SensorsCalibrationParameter>();
+    ds.registerType<SensorCalibrationData>();
     ds.registerType<PinChangeData>();
     ds.registerType<WingControllerAlgorithmData>();
     ds.registerType<WingAlgorithmData>();
-- 
GitLab