rusEFI
The most advanced open source ECU
Loading...
Searching...
No Matches
ego.cpp
Go to the documentation of this file.
1/**
2 * @author Andrey Belomutskiy, (c) 2012-2020
3 *
4 * EGO Exhaust Gas Oxygen, also known as AFR Air/Fuel Ratio :) connectet over analog input
5 *
6 */
7#include "pch.h"
8
11
14
15#include "cyclic_buffer.h"
16
19 return true;
20 }
21
23}
24
25float getAfr(SensorType type) {
27
29 return 0;
30 }
31
32 auto volts = adcGetScaledVoltage("ego", type == SensorType::Lambda1 ? sensor->hwChannel : sensor->hwChannel2);
33
34 float interpolatedAfr = interpolateMsg("AFR", sensor->v1, sensor->value1, sensor->v2, sensor->value2, volts.value_or(0));
35
36 switch (type) {
40 break;
41 }
45 break;
46 }
47 default:
48 break;
49 }
50
51 return interpolateMsg("AFR", sensor->v1, sensor->value1, sensor->v2, sensor->value2, volts.value_or(0))
53}
54
55// this method is only used for canned tunes now! User-facing selection is defined in tunerstudio.template.ini using settingSelector
57
58 switch (type) {
59 case ES_BPSX_D1:
60 /**
61 * This decodes BPSX D1 Wideband Controller analog signal
62 */
63 sensor->v1 = 0;
64 sensor->value1 = 9;
65 sensor->v2 = 5;
66 sensor->value2 = 19;
67 break;
68
69 case ES_Innovate_MTX_L:
70 sensor->v1 = 0;
71 sensor->value1 = 7.35;
72 sensor->v2 = 5;
73 sensor->value2 = 22.39;
74 break;
75 case ES_14Point7_Free:
76 sensor->v1 = 0;
77 sensor->value1 = 9.996;
78 sensor->v2 = 5;
79 sensor->value2 = 19.992;
80 break;
81 // technically 14Point7 and PLX use the same scale
82 case ES_PLX:
83 sensor->v1 = 0;
84 sensor->value1 = 10;
85 sensor->v2 = 5;
86 sensor->value2 = 20;
87 break;
88 case ES_AEM:
89 sensor->v1 = 0.5;
90 sensor->value1 = 8.5;
91 sensor->v2 = 4.5;
92 sensor->value2 = 18;
93 break;
94 default:
95 firmwareError(ObdCode::CUSTOM_EGO_TYPE, "Unexpected EGO %d", type);
96 break;
97 }
98}
99
expected< float > adcGetScaledVoltage(const char *msg, adc_channel_e hwChannel)
bool isAdcChannelValid(adc_channel_e hwChannel)
Definition adc_inputs.h:23
void setSmoothingFactor(float p_smoothingFactor)
Definition exp_average.h:26
float initOrAverage(float value)
Definition exp_average.h:9
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)
float interpolateMsg(const char *msg, float x1, float y1, float x2, float y2, float x)
Linear interpolation by two points.
efitick_t getTimeNowNt()
Definition efitime.cpp:19
static void initEgoSensor(afr_sensor_s *sensor, ego_sensor_e type)
Definition ego.cpp:56
float getAfr(SensorType type)
Definition ego.cpp:25
StoredValueSensor smoothedLambda2Sensor(SensorType::SmoothedLambda2, MS2NT(500))
bool hasAfrSensor()
Definition ego.cpp:17
void setEgoSensor(ego_sensor_e type)
Definition ego.cpp:100
ExpAverage expAverageLambda2
Definition ego.cpp:13
StoredValueSensor smoothedLambda1Sensor(SensorType::SmoothedLambda1, MS2NT(500))
ExpAverage expAverageLambda1
Definition ego.cpp:12
static constexpr engine_configuration_s * engineConfiguration
void firmwareError(ObdCode code, const char *fmt,...)
static Lps25Sensor sensor(device)
@ CUSTOM_EGO_TYPE
ego_sensor_e
SensorType
Definition sensor_type.h:18