diff --git a/firmware/console/status_loop.cpp b/firmware/console/status_loop.cpp index dc2c7a63d84..14d3b59806c 100644 --- a/firmware/console/status_loop.cpp +++ b/firmware/console/status_loop.cpp @@ -438,6 +438,17 @@ static void updateFuelSensors() { engine->outputChannels.fuelTankLevel = Sensor::getOrZero(SensorType::FuelLevel); } +static void updateEgtSensors() { + engine->outputChannels.egt[0] = Sensor::getOrZero(SensorType::EGT1); + engine->outputChannels.egt[1] = Sensor::getOrZero(SensorType::EGT2); + engine->outputChannels.egt[2] = Sensor::getOrZero(SensorType::EGT3); + engine->outputChannels.egt[3] = Sensor::getOrZero(SensorType::EGT4); + engine->outputChannels.egt[4] = Sensor::getOrZero(SensorType::EGT5); + engine->outputChannels.egt[5] = Sensor::getOrZero(SensorType::EGT6); + engine->outputChannels.egt[6] = Sensor::getOrZero(SensorType::EGT7); + engine->outputChannels.egt[7] = Sensor::getOrZero(SensorType::EGT8); +} + static void updateVvtSensors() { #if EFI_SHAFT_POSITION_INPUT // 248 @@ -520,6 +531,7 @@ static void updateSensors() { updateRawSensors(); updateLambda(); updateFuelSensors(); + updateEgtSensors(); updateVvtSensors(); updateVehicleSpeed(); updatePressures(); diff --git a/firmware/controllers/sensors/sensor_type.h b/firmware/controllers/sensors/sensor_type.h index 3d7c8cb666e..232490e6672 100644 --- a/firmware/controllers/sensors/sensor_type.h +++ b/firmware/controllers/sensors/sensor_type.h @@ -89,9 +89,14 @@ enum class SensorType : unsigned char { InputShaftSpeed, -// todo: migrate to SensorType framework! -// EGT1, -// EGT2, + EGT1, + EGT2, + EGT3, + EGT4, + EGT5, + EGT6, + EGT7, + EGT8, Maf2, // Second bank MAF sensor diff --git a/firmware/hw_layer/sensors/max31855.cpp b/firmware/hw_layer/sensors/max31855.cpp index 467a11ff6ae..9cd6662a572 100644 --- a/firmware/hw_layer/sensors/max31855.cpp +++ b/firmware/hw_layer/sensors/max31855.cpp @@ -24,6 +24,11 @@ #if EFI_MAX_31855 #include "thread_controller.h" +#include "stored_value_sensor.h" + +#ifndef MAX31855_REFRESH_TIME +#define MAX31855_REFRESH_TIME 500 +#endif /* TODO: move all stuff to Max31855Read class */ class Max31855Read final : public ThreadController { @@ -48,12 +53,21 @@ class Max31855Read final : public ThreadController { /* WARN: this will clear all other bits in cr1 */ spiConfig.cr1 = getSpiPrescaler(_5MHz, device); for (size_t i = 0; i < EGT_CHANNEL_COUNT; i++) { - /* and mark used! */ + auto& sensor = egtSensors[i]; + + m_cs[i] = Gpio::Invalid; + + // If there's already another (CAN?) EGT sensor configured, + // don't configure this one. + if (Sensor::hasSensor(sensor.type())) + continue; + + // get CS pin and mark used! if (isBrainPinValid(cs[i])) { initSpiCs(&spiConfig, cs[i]); m_cs[i] = cs[i]; - } else { - m_cs[i] = Gpio::Invalid; + + sensor.Register(); } } ThreadController::start(); @@ -69,14 +83,15 @@ class Max31855Read final : public ThreadController { max_31855_code ret = getMax31855EgtValue(i, &value, NULL); if (ret == MC_OK) { - // todo: migrate to SensorType framework! - engine->currentEgtValue[i] = value; + auto& sensor = egtSensors[i]; + + sensor.setValidValue(value, getTimeNowNt()); } else { /* TODO: report error code? */ } } - chThdSleepMilliseconds(500); + chThdSleepMilliseconds(MAX31855_REFRESH_TIME); } } @@ -228,6 +243,17 @@ class Max31855Read final : public ThreadController { } return code; } + + StoredValueSensor egtSensors[EGT_CHANNEL_COUNT] = { + { SensorType::EGT1, MS2NT(MAX31855_REFRESH_TIME * 3) }, + { SensorType::EGT2, MS2NT(MAX31855_REFRESH_TIME * 3) }, + { SensorType::EGT3, MS2NT(MAX31855_REFRESH_TIME * 3) }, + { SensorType::EGT4, MS2NT(MAX31855_REFRESH_TIME * 3) }, + { SensorType::EGT5, MS2NT(MAX31855_REFRESH_TIME * 3) }, + { SensorType::EGT6, MS2NT(MAX31855_REFRESH_TIME * 3) }, + { SensorType::EGT7, MS2NT(MAX31855_REFRESH_TIME * 3) }, + { SensorType::EGT8, MS2NT(MAX31855_REFRESH_TIME * 3) } + }; }; static Max31855Read instance;