fome-fw/firmware/init/sensor/init_thermistors.cpp

155 lines
4.6 KiB
C++
Raw Normal View History

#include "pch.h"
#include "adc_subscription.h"
#include "functional_sensor.h"
#include "func_chain.h"
#include "linear_func.h"
#include "resistance_func.h"
#include "thermistor_func.h"
using resist = ResistanceFunc;
using therm = ThermistorFunc;
// Each one could be either linear or thermistor
struct FuncPair {
LinearFunc linear;
FuncChain<resist, therm> thermistor;
};
static FunctionalSensor clt(SensorType::Clt, MS2NT(10));
static FunctionalSensor iat(SensorType::Iat, MS2NT(10));
static FunctionalSensor aux1(SensorType::AuxTemp1, MS2NT(10));
static FunctionalSensor aux2(SensorType::AuxTemp2, MS2NT(10));
static FunctionalSensor oilTempSensor(SensorType::OilTemperature, MS2NT(10));
static FunctionalSensor fuelTempSensor(SensorType::FuelTemperature, MS2NT(10));
static FunctionalSensor ambientTempSensor(SensorType::AmbientTemperature, MS2NT(10));
static FunctionalSensor compressorDischargeTemp(SensorType::CompressorDischargeTemperature, MS2NT(10));
2023-09-18 01:37:46 -07:00
2024-01-06 19:01:41 -08:00
static FuncPair fclt, fiat, faux1, faux2, foil, ffuel, fambient, fcdt;
2021-10-14 15:07:35 -07:00
static void validateThermistorConfig(const char *msg, thermistor_conf_s& cfg) {
2021-05-06 10:58:01 -07:00
if (cfg.tempC_1 >= cfg.tempC_2 ||
cfg.tempC_2 >= cfg.tempC_3) {
firmwareError(ObdCode::OBD_ThermistorConfig, "Invalid thermistor %s configuration: please check that temperatures are in the ascending order %f %f %f",
2021-10-14 15:07:35 -07:00
msg,
2021-05-06 10:58:01 -07:00
cfg.tempC_1,
cfg.tempC_2,
cfg.tempC_3);
}
}
2021-10-14 15:07:35 -07:00
static SensorConverter& configureTempSensorFunction(const char *msg,
thermistor_conf_s& cfg, FuncPair& p, bool isLinear, bool isPulldown) {
if (isLinear) {
p.linear.configure(cfg.resistance_1, cfg.tempC_1, cfg.resistance_2, cfg.tempC_2, -50, 250);
return p.linear;
} else /* sensor is thermistor */ {
2021-10-14 15:07:35 -07:00
validateThermistorConfig(msg, cfg);
p.thermistor.get<resist>().configure(5.0f, cfg.bias_resistor, isPulldown);
p.thermistor.get<therm>().configure(cfg);
return p.thermistor;
}
}
2021-10-14 15:07:35 -07:00
static void configTherm(const char *msg,
FunctionalSensor &sensor,
FuncPair &p,
2023-11-01 16:09:39 -07:00
ThermistorConf &cfg,
bool isLinear,
bool isPulldown) {
// nothing to do if no channel
2023-11-01 16:09:39 -07:00
if (!isAdcChannelValid(cfg.adcChannel)) {
return;
}
// Configure the conversion function for this sensor
2023-11-01 16:09:39 -07:00
sensor.setFunction(configureTempSensorFunction(msg, cfg.config, p, isLinear, isPulldown));
}
2021-10-14 15:07:35 -07:00
static void configureTempSensor(const char *msg,
FunctionalSensor &sensor,
FuncPair &p,
2023-11-01 16:09:39 -07:00
ThermistorConf &cfg,
bool isLinear,
bool isPulldown = false) {
2023-11-01 16:09:39 -07:00
auto channel = cfg.adcChannel;
// Only register if we have a sensor
if (!isAdcChannelValid(channel)) {
return;
}
2023-11-01 16:09:39 -07:00
configTherm(msg, sensor, p, cfg, isLinear, isPulldown);
// Register & subscribe
AdcSubscription::SubscribeSensor(sensor, channel, 2);
sensor.Register();
}
void initThermistors() {
2023-06-01 14:08:13 -07:00
configureTempSensor("clt",
2021-10-14 15:07:35 -07:00
clt,
fclt,
engineConfiguration->clt,
engineConfiguration->useLinearCltSensor,
engineConfiguration->cltSensorPulldown);
2023-06-01 14:08:13 -07:00
configureTempSensor("iat",
2021-10-14 15:07:35 -07:00
iat,
fiat,
engineConfiguration->iat,
engineConfiguration->useLinearIatSensor,
engineConfiguration->iatSensorPulldown);
2023-09-18 01:37:46 -07:00
configureTempSensor("oil temp",
oilTempSensor,
faux2,
engineConfiguration->oilTempSensor,
false);
configureTempSensor("fuel temp",
fuelTempSensor,
ffuel,
engineConfiguration->fuelTempSensor,
false);
configureTempSensor("ambient temp",
ambientTempSensor,
fambient,
engineConfiguration->ambientTempSensor,
false);
configureTempSensor("compressor discharge temp",
compressorDischargeTemp,
fcdt,
engineConfiguration->compressorDischargeTemperature,
false);
2021-10-14 15:07:35 -07:00
configureTempSensor("aux1",
aux1,
faux1,
engineConfiguration->auxTempSensor1,
false);
2021-10-14 15:07:35 -07:00
configureTempSensor("aux2",
aux2,
faux2,
engineConfiguration->auxTempSensor2,
false);
}
void deinitThermistors() {
AdcSubscription::UnsubscribeSensor(clt, engineConfiguration->clt.adcChannel);
AdcSubscription::UnsubscribeSensor(iat, engineConfiguration->iat.adcChannel);
2023-09-18 01:37:46 -07:00
AdcSubscription::UnsubscribeSensor(oilTempSensor, engineConfiguration->oilTempSensor.adcChannel);
AdcSubscription::UnsubscribeSensor(fuelTempSensor, engineConfiguration->fuelTempSensor.adcChannel);
AdcSubscription::UnsubscribeSensor(ambientTempSensor, engineConfiguration->ambientTempSensor.adcChannel);
AdcSubscription::UnsubscribeSensor(compressorDischargeTemp, engineConfiguration->compressorDischargeTemperature.adcChannel);
AdcSubscription::UnsubscribeSensor(aux1, engineConfiguration->auxTempSensor1.adcChannel);
AdcSubscription::UnsubscribeSensor(aux2, engineConfiguration->auxTempSensor2.adcChannel);
}