| Line | Branch | Decision | Exec | Source |
|---|---|---|---|---|
| 1 | /** | |||
| 2 | * @file flex_sensor.h | |||
| 3 | */ | |||
| 4 | #include "sensor_type.h" | |||
| 5 | #include "functional_sensor.h" | |||
| 6 | #include "sensor_converter_func.h" | |||
| 7 | #include "biquad.h" | |||
| 8 | #include <rusefi/timer.h> | |||
| 9 | ||||
| 10 | class FlexConverter : public SensorConverter { | |||
| 11 | public: | |||
| 12 | 4 | FlexConverter() { | ||
| 13 | // Update rate is 50-150hz, so this actually filters at 0.5-1.5hz -3db depending on E%, which is ok | |||
| 14 | 4 | m_filter.configureLowpass(100, 1); | ||
| 15 | 4 | } | ||
| 16 | ||||
| 17 | 999 | SensorResult convert(float frequency) const override { | ||
| 18 | // Sensor should only report 50-150hz, significantly outside that range indicates a problem | |||
| 19 | // it changes to 200hz+ to indicate methanol "contamination" | |||
| 20 |
1/2✗ Branch 0 not taken.
✓ Branch 1 taken 999 times.
|
1/2✗ Decision 'true' not taken.
✓ Decision 'false' taken 999 times.
|
999 | if (frequency < 45) { |
| 21 | ✗ | return UnexpectedCode::Low; | ||
| 22 | } | |||
| 23 | ||||
| 24 |
1/2✗ Branch 0 not taken.
✓ Branch 1 taken 999 times.
|
1/2✗ Decision 'true' not taken.
✓ Decision 'false' taken 999 times.
|
999 | if (frequency > 155) { |
| 25 | ✗ | return UnexpectedCode::High; | ||
| 26 | } | |||
| 27 | ||||
| 28 | 999 | float flexPct = clampF(0, frequency - 50, 100); | ||
| 29 | ||||
| 30 |
1/1✓ Branch 2 taken 999 times.
|
999 | return m_filter.filter(flexPct); | |
| 31 | } | |||
| 32 | ||||
| 33 | private: | |||
| 34 | mutable Biquad m_filter; | |||
| 35 | }; | |||
| 36 | ||||
| 37 | class FlexSensor { | |||
| 38 | public: | |||
| 39 | 4 | FlexSensor(efidur_t timeoutPeriod) | ||
| 40 | 4 | : flexSensor(SensorType::FuelEthanolPercent, timeoutPeriod) | ||
| 41 | 4 | , flexFuelTemp(SensorType::FuelTemperature, timeoutPeriod) | ||
| 42 | { | |||
| 43 | // 0.01 means filter bandwidth of ~1hz with ~100hz sensor | |||
| 44 | 4 | flexTempFilter.configureLowpass(1, 0.01f); | ||
| 45 | 4 | flexSensor.setFunction(converter); | ||
| 46 | 4 | } | ||
| 47 | void Register(bool withTempSensor); | |||
| 48 | void unregister(); | |||
| 49 | void callback(efitick_t nowNt, bool value); | |||
| 50 | void debug(); | |||
| 51 | ||||
| 52 | private: | |||
| 53 | FunctionalSensor flexSensor; | |||
| 54 | StoredValueSensor flexFuelTemp; | |||
| 55 | FlexConverter converter; | |||
| 56 | ||||
| 57 | Biquad flexTempFilter; | |||
| 58 | ||||
| 59 | Timer flexFreq, flexPulse; | |||
| 60 | ||||
| 61 | bool gotRising = false; | |||
| 62 | ||||
| 63 | int lowFlexCallbackCounter = 0; | |||
| 64 | int flexCallbackCounter = 0; | |||
| 65 | ||||
| 66 | float frequency; | |||
| 67 | float pulseWidthUs; | |||
| 68 | efitick_t latestCallbackTime; | |||
| 69 | }; | |||
| 70 |