rusEFI
The most advanced open source ECU
Loading...
Searching...
No Matches
Public Types | Public Member Functions | Private Member Functions | Private Attributes
InjectorModelWithConfig Class Referenceabstract

#include <injector_model.h>

Inheritance diagram for InjectorModelWithConfig:
Inheritance graph
[legend]
Collaboration diagram for InjectorModelWithConfig:
Collaboration graph
[legend]

Public Types

using interface_t = IInjectorModel
 

Public Member Functions

 InjectorModelWithConfig (const injector_s *const cfg)
 
floatms_t getDeadtime () const override
 
float getBaseFlowRate () const override
 
float getInjectorFlowRatio () override
 
void updateState () override
 
expected< floatgetFuelDifferentialPressure () const override
 
expected< floatgetFuelPressure () const override
 
floatms_t getInjectionDuration (float fuelMassGram) const override
 
- Public Member Functions inherited from InjectorModelBase
void prepare () override
 
float getFuelMassForDuration (floatms_t duration) const override
 
virtual InjectorNonlinearMode getNonlinearMode () const =0
 
floatms_t getBaseDurationImpl (float fuelMassGram) const
 
virtual floatms_t correctInjectionPolynomial (float floatms_t) const
 
virtual float getSmallPulseFlowRate () const =0
 
virtual float getSmallPulseBreakPoint () const =0
 
- Public Member Functions inherited from EngineModule
virtual void initNoConfiguration ()
 
virtual void setDefaultConfiguration ()
 
virtual void onConfigurationChange (engine_configuration_s const *)
 
virtual void onSlowCallback ()
 
virtual void onFastCallback ()
 
virtual void onEngineStop ()
 
virtual void onIgnitionStateChanged (bool)
 
virtual bool needsDelayedShutoff ()
 
virtual void onEnginePhase (float, efitick_t, angle_t, angle_t)
 

Private Member Functions

virtual injector_compensation_mode_e getInjectorCompensationMode () const =0
 
virtual float getFuelReferencePressure () const =0
 

Private Attributes

const injector_s *const m_cfg
 

Additional Inherited Members

- Data Fields inherited from injector_model_s
float m_deadtime = (float)0
 
float pressureDelta = (float)0
 
float pressureRatio = (float)0
 
float pressureCorrectionReference = (float)0
 

Detailed Description

Definition at line 49 of file injector_model.h.

Member Typedef Documentation

◆ interface_t

Definition at line 61 of file injector_model.h.

Constructor & Destructor Documentation

◆ InjectorModelWithConfig()

InjectorModelWithConfig::InjectorModelWithConfig ( const injector_s *const  cfg)

Definition at line 284 of file injector_model.cpp.

285 : m_cfg(cfg)
286{
287}
const injector_s *const m_cfg

Member Function Documentation

◆ getBaseFlowRate()

float InjectorModelWithConfig::getBaseFlowRate ( ) const
overridevirtual

Implements InjectorModelBase.

Definition at line 27 of file injector_model.cpp.

27 {
29 return m_cfg->flow;
30 } else {
32 }
33}
static constexpr engine_configuration_s * engineConfiguration
constexpr float convertToGramsPerSecond(float ccPerMinute)
Here is the call graph for this function:

◆ getDeadtime()

float InjectorModelWithConfig::getDeadtime ( ) const
overridevirtual

Implements IInjectorModel.

Definition at line 177 of file injector_model.cpp.

177 {
178 return interpolate3d(
181 m_cfg->battLagCorrBattBins, Sensor::get(SensorType::BatteryVoltage).value_or(VBAT_FALLBACK_VALUE)
182 );
183}
virtual SensorResult get() const =0
scaled_channel< int16_t, 100, 1 > battLagCorrBattBins[VBAT_INJECTOR_CURVE_SIZE]
scaled_channel< uint32_t, 10, 1 > battLagCorrPressBins[VBAT_INJECTOR_CURVE_PRESSURE_SIZE]
scaled_channel< int16_t, 100, 1 > battLagCorrTable[VBAT_INJECTOR_CURVE_PRESSURE_SIZE][VBAT_INJECTOR_CURVE_SIZE]
Here is the call graph for this function:

◆ getFuelDifferentialPressure()

expected< float > InjectorModelWithConfig::getFuelDifferentialPressure ( ) const
overridevirtual

Implements InjectorModelBase.

Definition at line 88 of file injector_model.cpp.

88 {
89 auto map = Sensor::get(SensorType::Map);
91
92 float baroKpa = baro.Value;
93 // todo: extract baro sensor validation logic
94 if (!baro || baro.Value > 120 || baro.Value < 50) {
95 baroKpa = STD_ATMOSPHERE;
96 }
97
99 case ICM_FixedRailPressure:
100 // Add barometric pressure, as "fixed" really means "fixed pressure above atmosphere"
102 + baroKpa
103 - map.value_or(STD_ATMOSPHERE);
104 case ICM_SensedRailPressure: {
106 warning(ObdCode::OBD_Fuel_Pressure_Sensor_Missing, "Fuel pressure compensation is set to use a pressure sensor, but none is configured.");
107 return unexpected;
108 }
109
111
112 // TODO: what happens when the sensor fails?
113 if (!fps) {
114 return unexpected;
115 }
116
118 case FPM_Differential:
119 // This sensor directly measures delta-P, no math needed!
120 return fps.Value;
121 case FPM_Gauge:
122 if (!map) {
123 return unexpected;
124 }
125
126 return fps.Value + baroKpa - map.Value;
127 case FPM_Absolute:
128 default:
129 if (!map) {
130 return unexpected;
131 }
132
133 return fps.Value - map.Value;
134 }
135 } default: return unexpected;
136 }
137}
virtual float getFuelReferencePressure() const =0
virtual injector_compensation_mode_e getInjectorCompensationMode() const =0
virtual bool hasSensor() const
Definition sensor.h:141
bool warning(ObdCode code, const char *fmt,...)
@ OBD_Fuel_Pressure_Sensor_Missing
@ FuelPressureInjector
@ BarometricPressure

Referenced by getFuelPressure(), getInjectorFlowRatio(), and updateState().

Here is the call graph for this function:
Here is the caller graph for this function:

◆ getFuelPressure()

expected< float > InjectorModelWithConfig::getFuelPressure ( ) const
overridevirtual

Implements InjectorModelBase.

Definition at line 84 of file injector_model.cpp.

84 {
85 return getFuelDifferentialPressure().Value + Sensor::get(SensorType::Map).value_or(STD_ATMOSPHERE);
86}
expected< float > getFuelDifferentialPressure() const override
Here is the call graph for this function:

◆ getFuelReferencePressure()

virtual float InjectorModelWithConfig::getFuelReferencePressure ( ) const
privatepure virtual

Implemented in InjectorModelPrimary, and InjectorModelSecondary.

Referenced by getFuelDifferentialPressure(), and getInjectorFlowRatio().

Here is the caller graph for this function:

◆ getInjectionDuration()

floatms_t InjectorModelWithConfig::getInjectionDuration ( float  fuelMassGram) const
overridevirtual

Reimplemented from InjectorModelBase.

Definition at line 198 of file injector_model.cpp.

198 {
199 if (fuelMassGram <= 0) {
200 // If 0 mass, don't do any math, just skip the injection.
201 return 0.0f;
202 }
203
204 // hopefully one day we pick between useInjectorFlowLinearizationTable and ICM_HPFP_Manual_Compensation approaches
205 // and not more than one of these would stay
208 // todo: KPA vs BAR mess?!
209 return interpolate3d(config->injectorFlowLinearization,
210 config->injectorFlowLinearizationPressureBins, KPA2BAR(fps.Value),// array values are on bar
211 config->injectorFlowLinearizationFuelMassBins, fuelMassGram * 1000); // array values are on mg
212 }
213
214 // Get the no-offset duration
215 floatms_t baseDuration = getBaseDurationImpl(fuelMassGram);
216
217 // default non GDI case
218 if (getInjectorCompensationMode() != ICM_HPFP_Manual_Compensation) {
219 // Add deadtime offset
220 return baseDuration + m_deadtime;
221 }
222
224 return baseDuration + m_deadtime;
225 }
226
228 // todo: KPA vs BAR mess in code and UI?!
229 float fuelMassCompensation = interpolate3d(config->hpfpFuelMassCompensation,
230 config->hpfpFuelMassCompensationFuelPressure, KPA2BAR(fps.Value),// array values are on bar
231 config->hpfpFuelMassCompensationFuelMass, fuelMassGram * 1000); // array values are on mg
232
233 // recalculate base duration with fuel mass compensation
234 baseDuration = getBaseDurationImpl(fuelMassGram * fuelMassCompensation);
235 return baseDuration + m_deadtime;
236}
floatms_t getBaseDurationImpl(float fuelMassGram) const
static constexpr persistent_config_s * config
float floatms_t
scaled_channel< uint16_t, 10, 1 > injectorFlowLinearizationPressureBins[FLOW_LINEARIZATION_PRESSURE_SIZE]
scaled_channel< uint16_t, 10, 1 > hpfpFuelMassCompensationFuelPressure[HPFP_FUEL_MASS_COMPENSATION_SIZE]
scaled_channel< uint16_t, 100, 1 > injectorFlowLinearization[FLOW_LINEARIZATION_PRESSURE_SIZE][FLOW_LINEARIZATION_MASS_SIZE]
scaled_channel< uint16_t, 100, 1 > injectorFlowLinearizationFuelMassBins[FLOW_LINEARIZATION_MASS_SIZE]
scaled_channel< uint16_t, 100, 1 > hpfpFuelMassCompensationFuelMass[HPFP_FUEL_MASS_COMPENSATION_SIZE]
scaled_channel< uint16_t, 100, 1 > hpfpFuelMassCompensation[HPFP_FUEL_MASS_COMPENSATION_SIZE][HPFP_FUEL_MASS_COMPENSATION_SIZE]
Here is the call graph for this function:

◆ getInjectorCompensationMode()

virtual injector_compensation_mode_e InjectorModelWithConfig::getInjectorCompensationMode ( ) const
privatepure virtual

Implemented in InjectorModelPrimary, and InjectorModelSecondary.

Referenced by getFuelDifferentialPressure(), getInjectionDuration(), and getInjectorFlowRatio().

Here is the caller graph for this function:

◆ getInjectorFlowRatio()

float InjectorModelWithConfig::getInjectorFlowRatio ( )
overridevirtual

Implements InjectorModelBase.

Definition at line 139 of file injector_model.cpp.

139 {
140 // Compensation disabled, use reference flow.
141 auto compensationMode = getInjectorCompensationMode();
142 if (compensationMode == ICM_None || compensationMode == ICM_HPFP_Manual_Compensation) {
143 return 1.0f;
144 }
145
146 const float referencePressure = getFuelReferencePressure();
147
148 if (referencePressure < 50) {
149 // impossibly low fuel ref pressure
150 criticalError("Impossible fuel reference pressure: %f", referencePressure);
151
152 return 1.0f;
153 }
154
155 expected<float> diffPressure = getFuelDifferentialPressure();
156
157 // If sensor failed, best we can do is disable correction
158 if (!diffPressure) {
159 return 1.0f;
160 }
161
162 pressureDelta = diffPressure.Value;
163
164 // Somehow pressure delta is less than 0, assume failed sensor and return default flow
165 if (pressureDelta <= 0) {
166 return 1.0f;
167 }
168
169 pressureRatio = pressureDelta / referencePressure;
170 // todo: live data model?
171 float flowRatio = sqrtf(pressureRatio);
172
173 // TODO: should the flow ratio be clamped?
174 return flowRatio;
175}
Here is the call graph for this function:

◆ updateState()

void InjectorModelWithConfig::updateState ( )
overridevirtual

Implements InjectorModelBase.

Definition at line 80 of file injector_model.cpp.

Here is the call graph for this function:

Field Documentation

◆ m_cfg

const injector_s* const InjectorModelWithConfig::m_cfg
private

Definition at line 66 of file injector_model.h.

Referenced by getBaseFlowRate(), and getDeadtime().


The documentation for this class was generated from the following files: