rusEFI
The most advanced open source ECU
Loading...
Searching...
No Matches
init_flex.cpp
Go to the documentation of this file.
1#include "pch.h"
2
3#include "init.h"
4#include "functional_sensor.h"
5#include "flex_sensor.h"
6
8
9// 30 sec timeout to avoid issues around cranking
13
15#if EFI_PROD_CODE
16
17static Timer flexFreq, flexPulse;
18
21static float frequency;
22static float pulseWidthUs;
23static efitick_t latestCallbackTime;
24
25static void flexCallback(efitick_t nowNt, bool value) {
26 latestCallbackTime = nowNt;
28 if (value) {
29 frequency = 1 / flexFreq.getElapsedSecondsAndReset(nowNt);
31
32 // Start timing pulse width on rising edge
33 flexPulse.reset(nowNt);
34 } else {
36 // End pulse timing on falling edge
37 pulseWidthUs = flexPulse.getElapsedUs(nowNt);
38
39 if (pulseWidthUs < 900) {
40 flexFuelTemp.invalidate(UnexpectedCode::Low);
42 } else if (pulseWidthUs > 5100) {
43 flexFuelTemp.invalidate(UnexpectedCode::High);
45 } else {
46 // -40C = 1000us
47 // 125C = 5000us
48 float tempC = interpolateClamped(1000, -40, 5000, 125, pulseWidthUs);
51 }
52 }
53}
54
56
57static void flexExtiCallback(void*, efitick_t nowNt) {
59}
60#endif
61
62// https://rusefi.com/forum/viewtopic.php?p=37452#p37452
63
64void initFlexSensor(bool isFirstTime) {
65#if EFI_PROD_CODE
67 PAL_EVENT_MODE_BOTH_EDGES, flexExtiCallback, nullptr) < 0) {
68 return;
69 }
71#endif
72
73 // 0.01 means filter bandwidth of ~1hz with ~100hz sensor
76
77#if EFI_PROD_CODE
78 if (isFirstTime) {
79 addConsoleAction("flexinfo", []() {
80 efiPrintf("flex counter %d", flexCallbackCounter);
81 efiPrintf("lowFlexCallbackCounter counter %d", lowFlexCallbackCounter);
82 efiPrintf("flex freq %f", frequency);
83 efiPrintf("pulseWidthUs %f", pulseWidthUs);
84 efiPrintf("latestCallbackTime %lld", latestCallbackTime);
85 });
86 }
87
88#endif // EFI_PROD_CODE
89
91
92 // If an analog fuel temp sensor is configured, don't use the flex sensor for fuel temp
95 }
96}
97
101
102#if EFI_PROD_CODE
103 if (!isBrainPinValid(flexPin)) {
104 return;
105 }
106
108
110#endif
111}
bool isAdcChannelValid(adc_channel_e hwChannel)
Definition adc_inputs.h:23
float filter(float input)
Definition biquad.cpp:74
void configureLowpass(float samplingFrequency, float cutoffFrequency, float Q=0.54f)
Definition biquad.cpp:48
Class for sensors that convert from some raw floating point value (ex: voltage, frequency,...
void setFunction(ConverterType &func)
void postRawValue(float inputValue, efitick_t timestamp) override
bool Register()
Definition sensor.cpp:131
void unregister()
Definition sensor.cpp:135
Base class for sensors that compute a value on one thread, and want to make it available to consumers...
void setValidValue(float value, efitick_t timestamp)
void addConsoleAction(const char *token, Void callback)
Register console action without parameters.
@ Unassigned
void efiExtiDisablePin(brain_pin_e brainPin)
int efiExtiEnablePin(const char *msg, brain_pin_e brainPin, uint32_t mode, ExtiCallback cb, void *cb_data)
float interpolateClamped(float x1, float y1, float x2, float y2, float x)
static constexpr engine_configuration_s * engineConfiguration
bool warning(ObdCode code, const char *fmt,...)
static efitick_t latestCallbackTime
Definition init_flex.cpp:23
static void flexCallback(efitick_t nowNt, bool value)
Definition init_flex.cpp:25
static Timer flexFreq
Definition init_flex.cpp:17
static FunctionalSensor flexSensor(SensorType::FuelEthanolPercent, MS2NT(30000))
void initFlexSensor(bool isFirstTime)
Definition init_flex.cpp:64
void deInitFlexSensor()
Definition init_flex.cpp:98
static Gpio flexPin
Definition init_flex.cpp:55
static FlexConverter converter
Definition init_flex.cpp:12
static void flexExtiCallback(void *, efitick_t nowNt)
Definition init_flex.cpp:57
static int lowFlexCallbackCounter
Definition init_flex.cpp:20
int flexCallbackCounter
Definition init_flex.cpp:19
static StoredValueSensor flexFuelTemp(SensorType::FuelTemperature, MS2NT(30000))
static float pulseWidthUs
Definition init_flex.cpp:22
static Timer flexPulse
Definition init_flex.cpp:17
static float frequency
Definition init_flex.cpp:21
static Biquad flexTempFilter
Definition init_flex.cpp:14
bool efiReadPin(brain_pin_e pin)
Definition io_pins.cpp:89
@ CUSTOM_FLEX_HIGH
@ CUSTOM_FLEX_LOW
bool isBrainPinValid(brain_pin_e brainPin)
@ FuelEthanolPercent
tempC("WBO: Temperature", SensorCategory.SENSOR_INPUTS, FieldType.INT16, 1936, 1.0, 500.0, 1000.0, "C")