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 |