From 2c754cc2f4b2df6055a9eb0621cf0ba38337f13a Mon Sep 17 00:00:00 2001
From: Davide <davide.mor@skywarder.eu>
Date: Mon, 26 Feb 2024 01:52:43 +0100
Subject: [PATCH] [RIGv2] Added thermocouple to sample and radio

---
 src/boards/RIGv2/Configs/SensorsConfig.h    |  1 +
 src/boards/RIGv2/Radio/Radio.cpp            |  3 ++
 src/boards/RIGv2/Sensors/Sensors.cpp        | 35 +++++++++++++++++++--
 src/boards/RIGv2/Sensors/Sensors.h          |  6 ++++
 src/boards/RIGv2/Sensors/SensorsData.h      | 31 ++++++++++++++++--
 src/scripts/logdecoder/RIGv2/logdecoder.cpp |  1 +
 6 files changed, 73 insertions(+), 4 deletions(-)

diff --git a/src/boards/RIGv2/Configs/SensorsConfig.h b/src/boards/RIGv2/Configs/SensorsConfig.h
index 7f12a6710..28712cd8f 100644
--- a/src/boards/RIGv2/Configs/SensorsConfig.h
+++ b/src/boards/RIGv2/Configs/SensorsConfig.h
@@ -34,6 +34,7 @@ namespace Sensors
 {
 
 static constexpr uint32_t ADC_SAMPLE_PERIOD = 10;
+static constexpr uint32_t TC_SAMPLE_PERIOD = 100;
 
 }
 
diff --git a/src/boards/RIGv2/Radio/Radio.cpp b/src/boards/RIGv2/Radio/Radio.cpp
index b4d51c193..8e5f5d3f1 100644
--- a/src/boards/RIGv2/Radio/Radio.cpp
+++ b/src/boards/RIGv2/Radio/Radio.cpp
@@ -402,7 +402,10 @@ bool Radio::packSystemTm(uint8_t tmId, mavlink_message_t& msg)
         {
             mavlink_motor_tm_t tm;
 
+            auto tc1 = modules.get<Sensors>()->getTc1LastSample();
+
             tm.timestamp            = TimestampTimer::getTimestamp();
+            tm.tank_temperature     = tc1.temperature;
             tm.top_tank_pressure    = 69;
             tm.bottom_tank_pressure = 420;
 
diff --git a/src/boards/RIGv2/Sensors/Sensors.cpp b/src/boards/RIGv2/Sensors/Sensors.cpp
index 4318603df..fabc78951 100644
--- a/src/boards/RIGv2/Sensors/Sensors.cpp
+++ b/src/boards/RIGv2/Sensors/Sensors.cpp
@@ -37,6 +37,7 @@ bool Sensors::start()
 {
     SensorManager::SensorMap_t map;
     adc1Init(map);
+    tc1Init(map);
 
     manager = std::make_unique<SensorManager>(map, &scheduler);
     if (!manager->start())
@@ -61,6 +62,12 @@ ADS131M08Data Sensors::getADC1LastSample()
     return adc1->getLastSample();
 }
 
+Boardcore::MAX31856Data Sensors::getTc1LastSample()
+{
+    PauseKernelLock l;
+    return tc1->getLastSample();
+}
+
 void Sensors::adc1Init(SensorManager::SensorMap_t &map)
 {
     ModuleManager &modules = ModuleManager::getInstance();
@@ -92,8 +99,32 @@ void Sensors::adc1Callback()
                   sample.voltage[4], sample.voltage[5],
                   sample.voltage[6], sample.voltage[7]};
 
-    // For Flavio, fuck Flavio
-    LOG_INFO(logger, "{}\t{}", sample.voltage[6], sample.voltage[7]);
+    sdLogger.log(data);
+}
+
+void Sensors::tc1Init(SensorManager::SensorMap_t &map)
+{
+    ModuleManager &modules = ModuleManager::getInstance();
+
+    SPIBusConfig spiConfig = MAX31856::getDefaultSPIConfig();
+    spiConfig.clockDivider = SPI::ClockDivider::DIV_32;
+
+    tc1 =
+        std::make_unique<MAX31856>(modules.get<Buses>()->getMAX31856_1(),
+                                   sensors::MAX31856_1::cs::getPin(), spiConfig,
+                                   MAX31856::ThermocoupleType::K_TYPE);
+
+    SensorInfo info("MAX31856_1", Config::Sensors::TC_SAMPLE_PERIOD,
+                    [this]() { tc1Callback(); });
+    map.emplace(std::make_pair(tc1.get(), info));
+}
+
+void Sensors::tc1Callback()
+{
+    MAX31856Data sample = tc1->getLastSample();
+
+    TCsData data{sample.temperatureTimestamp, 1, sample.temperature,
+                 sample.coldJunctionTemperature};
 
     sdLogger.log(data);
 }
\ No newline at end of file
diff --git a/src/boards/RIGv2/Sensors/Sensors.h b/src/boards/RIGv2/Sensors/Sensors.h
index 14eeef191..43d614ee7 100644
--- a/src/boards/RIGv2/Sensors/Sensors.h
+++ b/src/boards/RIGv2/Sensors/Sensors.h
@@ -23,6 +23,7 @@
 #pragma once
 
 #include <sensors/ADS131M08/ADS131M08.h>
+#include <sensors/MAX31856/MAX31856.h>
 #include <sensors/SensorManager.h>
 
 #include <memory>
@@ -44,10 +45,14 @@ public:
     bool isStarted();
 
     Boardcore::ADS131M08Data getADC1LastSample();
+    Boardcore::MAX31856Data getTc1LastSample();
 
 private:
     void adc1Init(Boardcore::SensorManager::SensorMap_t &map);
     void adc1Callback();
+    
+    void tc1Init(Boardcore::SensorManager::SensorMap_t &map);
+    void tc1Callback();
 
     Boardcore::Logger &sdLogger = Boardcore::Logger::getInstance();
     Boardcore::PrintLogger logger = Boardcore::Logging::getLogger("sensors");
@@ -55,6 +60,7 @@ private:
 
     std::atomic<bool> started{false};
     std::unique_ptr<Boardcore::ADS131M08> adc1;
+    std::unique_ptr<Boardcore::MAX31856> tc1;
     std::unique_ptr<Boardcore::SensorManager> manager;
 };
 
diff --git a/src/boards/RIGv2/Sensors/SensorsData.h b/src/boards/RIGv2/Sensors/SensorsData.h
index db59f9eef..ac2a64432 100644
--- a/src/boards/RIGv2/Sensors/SensorsData.h
+++ b/src/boards/RIGv2/Sensors/SensorsData.h
@@ -23,6 +23,7 @@
 #pragma once
 
 #include <sensors/ADS131M08/ADS131M08Data.h>
+#include <sensors/MAX31856/MAX31856Data.h>
 
 namespace RIGv2
 {
@@ -41,7 +42,7 @@ struct ADCsData : Boardcore::ADS131M08Data
 
     static std::string header()
     {
-        return "timestamp,adc_number,voltage_channel_1,voltage_channel_2,"
+        return "timestamp,adcNumber,voltage_channel_1,voltage_channel_2,"
                "voltage_channel_3,voltage_channel_4,voltage_channel_5,voltage_"
                "channel_6,voltage_channel_7,voltage_channel_8\n";
     }
@@ -54,4 +55,30 @@ struct ADCsData : Boardcore::ADS131M08Data
            << voltage[7] << "\n";
     }
 };
-}  // namespace RIG
\ No newline at end of file
+
+struct TCsData : Boardcore::MAX31856Data
+{
+    uint8_t tcNumber;
+
+    TCsData() : MAX31856Data{0, 0}, tcNumber{0} {}
+
+    TCsData(uint64_t time, uint8_t num, float temperature,
+            float coldJunctionTemperature)
+        : MAX31856Data{time, temperature, coldJunctionTemperature},
+          tcNumber{num}
+    {
+    }
+
+    static std::string header()
+    {
+        return "temperatureTimestamp,tcNumber,temperature,"
+               "coldJunctionTemperature\n";
+    }
+
+    void print(std::ostream& os) const
+    {
+        os << temperatureTimestamp << "," << (int)tcNumber << "," << temperature
+           << "," << coldJunctionTemperature << "\n";
+    }
+};
+}  // namespace RIGv2
\ No newline at end of file
diff --git a/src/scripts/logdecoder/RIGv2/logdecoder.cpp b/src/scripts/logdecoder/RIGv2/logdecoder.cpp
index fddfb7c20..eab10f51c 100644
--- a/src/scripts/logdecoder/RIGv2/logdecoder.cpp
+++ b/src/scripts/logdecoder/RIGv2/logdecoder.cpp
@@ -52,6 +52,7 @@ void registerTypes(Deserializer& ds)
 
     // Custom types
     ds.registerType<ADCsData>();
+    ds.registerType<TCsData>();
     ds.registerType<ActuatorsData>();
 }
 
-- 
GitLab