GCC Code Coverage Report


Directory: ./
File: firmware/controllers/sensors/converters/fuel_level_func.cpp
Date: 2025-10-03 00:57:22
Coverage Exec Excl Total
Lines: 90.6% 29 0 32
Functions: 100.0% 4 0 4
Branches: 87.5% 14 0 16
Decisions: 87.5% 7 - 8

Line Branch Decision Exec Source
1 // file fuel_level_func.cpp
2 //
3 // Created by kifir on 12/19/24.
4 //
5
6 #include "pch.h"
7
8 #include "fuel_level_func.h"
9
10 #if EFI_PROD_CODE && HW_HELLEN
11 #include "hellen_meta.h"
12 extern Timer hellenEnPinStateChange;
13 #endif // HW_HELLEN
14
15 14 SensorResult FuelLevelFunc::convert(const float inputVoltage) {
16
1/2
✗ Branch 1 not taken.
✓ Branch 2 taken 14 times.
1/2
✗ Decision 'true' not taken.
✓ Decision 'false' taken 14 times.
14 if (std::isnan(inputVoltage)) {
17 criticalError("temp error FuelLevelFunc NaN input");
18 m_filteredValue.reset();
19 return UnexpectedCode::Unknown;
20 #if EFI_PROD_CODE && HW_HELLEN
21 } else if (isBoardWithPowerManagement() && !hellenEnPinStateChange.hasElapsedMs(200)) {
22 // todo: can we accomplish same reset by AdcSubscription::ResetFilters?
23 m_filteredValue.reset();
24 return UnexpectedCode::Unknown;
25 #endif // HW_HELLEN
26
2/2
✓ Branch 0 taken 1 time.
✓ Branch 1 taken 13 times.
2/2
✓ Decision 'true' taken 1 time.
✓ Decision 'false' taken 13 times.
14 } else if (inputVoltage < engineConfiguration->fuelLevelLowThresholdVoltage) {
27 1 m_filteredValue.reset();
28 1 return UnexpectedCode::Low;
29
2/2
✓ Branch 0 taken 1 time.
✓ Branch 1 taken 12 times.
2/2
✓ Decision 'true' taken 1 time.
✓ Decision 'false' taken 12 times.
13 } else if (engineConfiguration->fuelLevelHighThresholdVoltage < inputVoltage) {
30 1 m_filteredValue.reset();
31 1 return UnexpectedCode::High;
32 } else {
33
1/1
✓ Branch 1 taken 12 times.
12 const float filteredVoltage = filterFuelValue(inputVoltage);
34
1/1
✓ Branch 2 taken 12 times.
12 const float fuelLevel = interpolate2d(filteredVoltage, config->fuelLevelBins, config->fuelLevelValues);
35 12 return fuelLevel;
36 }
37 }
38
39 2 float FuelLevelFunc::getFuelLevelAlpha() const {
40 2 const float configuredAlpha = engineConfiguration->fuelLevelAveragingAlpha;
41
1/2
✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
2 return (0.0f < configuredAlpha ? configuredAlpha : engine_configuration_defaults::FUEL_LEVEL_AVERAGING_ALPHA);
42 }
43
44 12 float FuelLevelFunc::filterFuelValue(const float inputVoltage) {
45
2/2
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 4 times.
2/2
✓ Decision 'true' taken 8 times.
✓ Decision 'false' taken 4 times.
12 if (m_filteredValue.has_value()) {
46
2/2
✓ Branch 2 taken 2 times.
✓ Branch 3 taken 6 times.
8 if (m_fuelLevelTimer.hasElapsedSec(maxF(
47 engineConfiguration->fuelLevelUpdatePeriodSec,
48 MIN_FUEL_LEVEL_UPDATE_PERIOD_SEC
49 ))) {
50 2 const float prevFilteredValue = m_filteredValue.value();
51 2 const float diff = inputVoltage - prevFilteredValue;
52 2 updateFilteredValue(prevFilteredValue + getFuelLevelAlpha() * diff);
53 }
54 } else {
55 4 updateFilteredValue(inputVoltage);
56 }
57 static bool isFirst = true;
58
2/2
✓ Branch 0 taken 1 time.
✓ Branch 1 taken 11 times.
12 if (isFirst) {
59 1 isFirst = false;
60 1 efiPrintf("[temp] first %f", m_filteredValue.value());
61 }
62 12 return m_filteredValue.value();
63 }
64
65 6 void FuelLevelFunc::updateFilteredValue(const float filteredVoltage) {
66 6 m_filteredValue = filteredVoltage;
67 6 m_fuelLevelTimer.reset();
68 6 }
69