GCC Code Coverage Report


Directory: ./
File: firmware/init/sensor/init_thermistors.cpp
Date: 2025-10-03 00:57:22
Coverage Exec Excl Total
Lines: 71.7% 43 0 60
Functions: 83.3% 5 0 6
Branches: 58.3% 7 0 12
Decisions: 60.0% 6 - 10

Line Branch Decision Exec Source
1 #include "pch.h"
2
3 #include "adc_subscription.h"
4 #include "functional_sensor.h"
5 #include "linear_func.h"
6 #include "thermistor_func.h"
7
8 // Each one could be either linear or thermistor
9 struct FuncPair {
10 LinearFunc linear;
11 thermistor_t thermistor;
12 };
13
14 static CCM_OPTIONAL FunctionalSensor clt(SensorType::Clt, MS2NT(10));
15 static CCM_OPTIONAL FunctionalSensor iat(SensorType::Iat, MS2NT(10));
16 static CCM_OPTIONAL FunctionalSensor aux1(SensorType::AuxTemp1, MS2NT(10));
17 static CCM_OPTIONAL FunctionalSensor aux2(SensorType::AuxTemp2, MS2NT(10));
18
19 static CCM_OPTIONAL FunctionalSensor oilTempSensor(SensorType::OilTemperature, MS2NT(10));
20 static CCM_OPTIONAL FunctionalSensor fuelTempSensor(SensorType::FuelTemperature, MS2NT(10));
21 static CCM_OPTIONAL FunctionalSensor ambientTempSensor(SensorType::AmbientTemperature, MS2NT(10));
22 static CCM_OPTIONAL FunctionalSensor compressorDischargeTemp(SensorType::CompressorDischargeTemperature, MS2NT(10));
23
24 static FuncPair fclt, fiat, faux1, faux2, foil, ffuel, fambient, fcdt;
25
26 4 static void validateThermistorConfig(const char *msg, thermistor_conf_s& cfg) {
27
1/2
✓ Branch 0 taken 4 times.
✗ Branch 1 not taken.
1/2
✗ Decision 'true' not taken.
✓ Decision 'false' taken 4 times.
4 if (cfg.tempC_1 >= cfg.tempC_2 ||
28
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 4 times.
4 cfg.tempC_2 >= cfg.tempC_3) {
29 firmwareError(ObdCode::OBD_ThermistorConfig, "Invalid thermistor %s configuration: please check that temperatures are in the ascending order %f %f %f",
30 msg,
31 (float)cfg.tempC_1,
32 (float)cfg.tempC_2,
33 (float)cfg.tempC_3);
34 }
35 4 }
36
37 4 static SensorConverter& configureTempSensorFunction(const char *msg,
38 thermistor_conf_s& cfg, FuncPair& p, bool isLinear, bool isPulldown) {
39
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 4 times.
1/2
✗ Decision 'true' not taken.
✓ Decision 'false' taken 4 times.
4 if (isLinear) {
40 p.linear.configure(cfg.resistance_1, cfg.tempC_1, cfg.resistance_2, cfg.tempC_2, -50, 250);
41
42 return p.linear;
43 } else /* sensor is thermistor */ {
44 4 validateThermistorConfig(msg, cfg);
45
46 4 p.thermistor.get<resist>().configure(5.0f, cfg.bias_resistor, isPulldown);
47 4 p.thermistor.get<therm>().configure(cfg);
48
49 3 return p.thermistor;
50 }
51 }
52
53 4 static void configTherm(const char *msg,
54 FunctionalSensor &sensor,
55 FuncPair &p,
56 ThermistorConf &p_config,
57 bool isLinear,
58 bool isPulldown) {
59 // nothing to do if no channel
60
1/2
✗ Branch 1 not taken.
✓ Branch 2 taken 4 times.
1/2
✗ Decision 'true' not taken.
✓ Decision 'false' taken 4 times.
4 if (!isAdcChannelValid(p_config.adcChannel)) {
61 return;
62 }
63
64 // Configure the conversion function for this sensor
65 4 sensor.setFunction(configureTempSensorFunction(msg, p_config.config, p, isLinear, isPulldown));
66 }
67
68 31 static void configureTempSensor(const char *msg,
69 FunctionalSensor &sensor,
70 FuncPair &p,
71 ThermistorConf &p_config,
72 bool isLinear,
73 bool isPulldown = false) {
74 31 auto channel = p_config.adcChannel;
75
76 // Only register if we have a sensor
77
2/2
✓ Branch 1 taken 27 times.
✓ Branch 2 taken 4 times.
2/2
✓ Decision 'true' taken 27 times.
✓ Decision 'false' taken 4 times.
31 if (!isAdcChannelValid(channel)) {
78 27 return;
79 }
80
81 4 configTherm(msg, sensor, p, p_config, isLinear, isPulldown);
82
83 // Register & subscribe
84 3 AdcSubscription::SubscribeSensor(sensor, channel, 2);
85 3 sensor.Register();
86 }
87
88 4 void initThermistors() {
89
1/2
✓ Branch 0 taken 4 times.
✗ Branch 1 not taken.
1/2
✓ Decision 'true' taken 4 times.
✗ Decision 'false' not taken.
4 if (!engineConfiguration->consumeObdSensors) {
90 4 configureTempSensor("clt",
91 clt,
92 fclt,
93 4 engineConfiguration->clt,
94 4 engineConfiguration->useLinearCltSensor,
95 4 engineConfiguration->cltSensorPulldown);
96
97 4 configureTempSensor("iat",
98 iat,
99 fiat,
100 4 engineConfiguration->iat,
101 4 engineConfiguration->useLinearIatSensor,
102 4 engineConfiguration->iatSensorPulldown);
103 }
104
105 4 configureTempSensor("oil temp",
106 oilTempSensor,
107 faux2,
108 4 engineConfiguration->oilTempSensor,
109 false);
110
111 4 configureTempSensor("fuel temp",
112 fuelTempSensor,
113 ffuel,
114 4 engineConfiguration->fuelTempSensor,
115 false);
116
117 4 configureTempSensor("ambient temp",
118 ambientTempSensor,
119 fambient,
120 4 engineConfiguration->ambientTempSensor,
121 false);
122
123 4 configureTempSensor("compressor discharge temp",
124 compressorDischargeTemp,
125 fcdt,
126 4 engineConfiguration->compressorDischargeTemperature,
127 false);
128
129 4 configureTempSensor("aux1",
130 aux1,
131 faux1,
132 4 engineConfiguration->auxTempSensor1,
133 false);
134
135 3 configureTempSensor("aux2",
136 aux2,
137 faux2,
138 3 engineConfiguration->auxTempSensor2,
139 false);
140 3 }
141
142 void deinitThermistors() {
143 AdcSubscription::UnsubscribeSensor(clt, engineConfiguration->clt.adcChannel);
144 AdcSubscription::UnsubscribeSensor(iat, engineConfiguration->iat.adcChannel);
145 AdcSubscription::UnsubscribeSensor(oilTempSensor, engineConfiguration->oilTempSensor.adcChannel);
146 AdcSubscription::UnsubscribeSensor(fuelTempSensor, engineConfiguration->fuelTempSensor.adcChannel);
147 AdcSubscription::UnsubscribeSensor(ambientTempSensor, engineConfiguration->ambientTempSensor.adcChannel);
148 AdcSubscription::UnsubscribeSensor(compressorDischargeTemp, engineConfiguration->compressorDischargeTemperature.adcChannel);
149 AdcSubscription::UnsubscribeSensor(aux1, engineConfiguration->auxTempSensor1.adcChannel);
150 AdcSubscription::UnsubscribeSensor(aux2, engineConfiguration->auxTempSensor2.adcChannel);
151 }
152