diff --git a/src/Engine/Buses.h b/src/Engine/Buses.h index 3efddfc129ebf1099094bf534cfcc9626cd9c751..08d2283f59b3f654be38d9de664b6711d44932a6 100644 --- a/src/Engine/Buses.h +++ b/src/Engine/Buses.h @@ -39,6 +39,7 @@ public: Boardcore::SPIBus& getLIS2MDL() { return spi3; } Boardcore::SPIBus& getLSM6DSRX() { return spi3; } Boardcore::SPIBus& getADS131M08() { return spi4; } + Boardcore::SPIBus& getThermocouple() { return spi1; } Boardcore::USART& getHILUart() { return usart4; } diff --git a/src/Engine/Configs/SensorsConfig.h b/src/Engine/Configs/SensorsConfig.h index fe21e84b378fa883ec212d847bd723b485278ca5..19bbf69de2a4b110ffa591148be03341ff144fec 100644 --- a/src/Engine/Configs/SensorsConfig.h +++ b/src/Engine/Configs/SensorsConfig.h @@ -173,6 +173,12 @@ constexpr float TANK_P1_TEMP = 34.0f; } // namespace Kulite +namespace MAX31856 +{ +constexpr Hertz PERIOD = 10_hz; +constexpr bool ENABLED = true; +} // namespace MAX31856 + namespace InternalADC { constexpr Boardcore::InternalADC::Channel VBAT_CH = diff --git a/src/Engine/Sensors/Sensors.cpp b/src/Engine/Sensors/Sensors.cpp index 657c256fd2b64b415bfb8e9b9bb9518138db9e3d..360dab1f76408d9ed3fdf494d4fd7314c62b2a11 100644 --- a/src/Engine/Sensors/Sensors.cpp +++ b/src/Engine/Sensors/Sensors.cpp @@ -55,6 +55,9 @@ bool Sensors::start() tankTempInit(); } + if (Config::Sensors::MAX31856::ENABLED) + thermocoupleInit(); + if (Config::Sensors::InternalADC::ENABLED) internalAdcInit(); @@ -141,6 +144,11 @@ TemperatureData Sensors::getTankTempLastSample() return tankTemp ? tankTemp->getLastSample() : TemperatureData{}; } +TemperatureData Sensors::getThermocoupleLastSample() +{ + return thermocouple ? thermocouple->getLastSample() : TemperatureData{}; +} + VoltageData Sensors::getBatteryVoltageLastSample() { auto sample = getInternalADCLastSample(); @@ -196,6 +204,9 @@ std::vector<SensorInfo> Sensors::getSensorInfos() if (tankTemp) infos.push_back(manager->getSensorInfo(tankTemp.get())); + if (thermocouple) + infos.push_back(manager->getSensorInfo(thermocouple.get())); + return infos; } else @@ -507,6 +518,25 @@ void Sensors::tankTempInit() void Sensors::tankTempCallback() { sdLogger.log(getTankTempLastSample()); } +void Sensors::thermocoupleInit() +{ + SPIBusConfig spiConfig = MAX31856::getDefaultSPIConfig(); + spiConfig.clockDivider = SPI::ClockDivider::DIV_32; + + thermocouple = std::make_unique<MAX31856>( + getModule<Buses>()->getThermocouple(), + sensors::thermocouple::cs::getPin(), spiConfig, + MAX31856::ThermocoupleType::K_TYPE); // TODO: verify the type +} + +void Sensors::thermocoupleCallback() +{ + if (!thermocouple) + return; + + sdLogger.log(getThermocoupleLastSample()); +} + bool Sensors::sensorManagerInit() { SensorManager::SensorMap_t map; @@ -606,6 +636,13 @@ bool Sensors::sensorManagerInit() map.emplace(std::make_pair(tankTemp.get(), info)); } + if (thermocouple) + { + SensorInfo info("MAX31856", Config::Sensors::MAX31856::PERIOD, + [this]() { thermocoupleCallback(); }); + map.emplace(std::make_pair(thermocouple.get(), info)); + } + manager = std::make_unique<SensorManager>(map, &getSensorsScheduler()); return manager->start(); } diff --git a/src/Engine/Sensors/Sensors.h b/src/Engine/Sensors/Sensors.h index 7294874e85454ff237f8719d9352f5f4cdbce582..73bb192eb2ab4ffad34d002bea38adeee187e90e 100644 --- a/src/Engine/Sensors/Sensors.h +++ b/src/Engine/Sensors/Sensors.h @@ -32,6 +32,7 @@ #include <sensors/LIS2MDL/LIS2MDL.h> #include <sensors/LPS22DF/LPS22DF.h> #include <sensors/LSM6DSRX/LSM6DSRX.h> +#include <sensors/MAX31856/MAX31856.h> #include <sensors/SensorManager.h> #include <sensors/analog/TrafagPressureSensor.h> #include <utils/DependencyManager/DependencyManager.h> @@ -64,6 +65,7 @@ public: Boardcore::PressureData getCCPressLastSample(); Boardcore::TemperatureData getTankTempLastSample(); Boardcore::VoltageData getBatteryVoltageLastSample(); + Boardcore::TemperatureData getThermocoupleLastSample(); std::vector<Boardcore::SensorInfo> getSensorInfos(); @@ -80,6 +82,7 @@ protected: std::unique_ptr<Boardcore::LSM6DSRX> lsm6dsrx1; std::unique_ptr<Boardcore::ADS131M08> ads131m08; std::unique_ptr<Boardcore::InternalADC> internalAdc; + std::unique_ptr<Boardcore::MAX31856> thermocouple; // Analog sensors std::unique_ptr<Boardcore::TrafagPressureSensor> oxTopTankPressure; @@ -112,6 +115,9 @@ private: void internalAdcInit(); void internalAdcCallback(); + void thermocoupleInit(); + void thermocoupleCallback(); + void oxTopTankPressureInit(); void oxTopTankPressureCallback();