| 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 |