rusEFI
The most advanced open source ECU
Loading...
Searching...
No Matches
Public Member Functions | Data Fields
EngineState Class Reference

#include <engine_state.h>

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

Public Member Functions

 EngineState ()
 
void periodicFastCallback ()
 
void updateTChargeK (float rpm, float tps)
 
void updateSparkSkip ()
 

Data Fields

angle_t engineCycle {getEngineCycle(FOUR_STROKE_CRANK_SENSOR)}
 
bool useOddFireWastedSpark = false
 
float injectionStage2Fraction = 0
 
Timer crankingTimer {}
 
Timer undervoltageCrankingTimer {}
 
WarningCodeState warnings {}
 
float airflowEstimate = 0
 
float auxValveStart = 0
 
float auxValveEnd = 0
 
angle_t mapAveragingStart [MAX_CYLINDER_COUNT] {}
 
angle_t mapAveragingDuration = 0
 
angle_t timingAdvance [MAX_CYLINDER_COUNT] {}
 
angle_t trailingSparkAngle = 0
 
Timer timeSinceLastTChargeK {}
 
floatms_t baseFuel = 0
 
floatms_t tpsAccelEnrich = 0
 
floatms_t injectionDuration = 0
 
floatms_t injectionDurationStage2 = 0
 
angle_t injectionOffset = 0
 
multispark_state multispark {}
 
bool shouldUpdateInjectionTiming = true
 
- Data Fields inherited from engine_state_s
float injectionMass [MAX_CYLINDER_COUNT] = {}
 
LuaAdjustments lua
 
speed_density_s sd
 
cranking_fuel_s crankingFuel
 
float baroCorrection = (float)0
 
int16_t hellenBoardId = (int16_t)0
 
int8_t clutchUpState = (int8_t)0
 
int8_t brakePedalState = (int8_t)0
 
int8_t startStopState = (int8_t)0
 
int8_t smartChipState = (int8_t)0
 
int8_t smartChipRestartCounter = (int8_t)0
 
int8_t smartChipAliveCounter = (int8_t)0
 
bool startStopPhysicalState: 1 {}
 
bool acrActive: 1 {}
 
bool acrEngineMovedRecently: 1 {}
 
bool heaterControlEnabled: 1 {}
 
bool luaDigitalState0: 1 {}
 
bool luaDigitalState1: 1 {}
 
bool luaDigitalState2: 1 {}
 
bool luaDigitalState3: 1 {}
 
bool clutchDownState: 1 {}
 
bool unusedBit_21_9: 1 {}
 
bool unusedBit_21_10: 1 {}
 
bool unusedBit_21_11: 1 {}
 
bool unusedBit_21_12: 1 {}
 
bool unusedBit_21_13: 1 {}
 
bool unusedBit_21_14: 1 {}
 
bool unusedBit_21_15: 1 {}
 
bool unusedBit_21_16: 1 {}
 
bool unusedBit_21_17: 1 {}
 
bool unusedBit_21_18: 1 {}
 
bool unusedBit_21_19: 1 {}
 
bool unusedBit_21_20: 1 {}
 
bool unusedBit_21_21: 1 {}
 
bool unusedBit_21_22: 1 {}
 
bool unusedBit_21_23: 1 {}
 
bool unusedBit_21_24: 1 {}
 
bool unusedBit_21_25: 1 {}
 
bool unusedBit_21_26: 1 {}
 
bool unusedBit_21_27: 1 {}
 
bool unusedBit_21_28: 1 {}
 
bool unusedBit_21_29: 1 {}
 
bool unusedBit_21_30: 1 {}
 
bool unusedBit_21_31: 1 {}
 
uint32_t startStopStateToggleCounter = (uint32_t)0
 
float currentVe = (float)0
 
float luaSoftSparkSkip = (float)0
 
float luaHardSparkSkip = (float)0
 
float tractionControlSparkSkip = (float)0
 
uint32_t fuelInjectionCounter = (uint32_t)0
 
uint32_t globalSparkCounter = (uint32_t)0
 
float fuelingLoad = (float)0
 
float ignitionLoad = (float)0
 
scaled_channel< uint16_t, 100, 1 > veTableYAxis = (uint16_t)0
 
uint8_t overDwellCounter = (uint8_t)0
 
uint8_t overDwellNotScheduledCounter = (uint8_t)0
 
uint8_t sparkOutOfOrderCounter = (uint8_t)0
 
uint8_t alignmentFill_at_137 [3] = {}
 
float stftCorrection [FT_BANK_COUNT] = {}
 

Detailed Description

Definition at line 15 of file engine_state.h.

Constructor & Destructor Documentation

◆ EngineState()

EngineState::EngineState ( )

Definition at line 133 of file engine2.cpp.

133 {
135}
Timer timeSinceLastTChargeK
efitick_t getTimeNowNt()
Definition efitime.cpp:19
Here is the call graph for this function:

Member Function Documentation

◆ periodicFastCallback()

void EngineState::periodicFastCallback ( )

Definition at line 154 of file engine2.cpp.

154 {
156
157#if EFI_SHAFT_POSITION_INPUT
159 warning(ObdCode::CUSTOM_SLOW_NOT_INVOKED, "Slow not invoked yet");
160 }
161
162 efitick_t nowNt = getTimeNowNt();
163 bool isCranking = engine->rpmCalculator.isCranking();
165
166 if (isCranking) {
167 crankingTimer.reset(nowNt);
168 }
169
171
172#if EFI_AUX_VALVES
174#endif //EFI_AUX_VALVES
175
176 engine->ignitionState.updateDwell(rpm, isCranking);
177
178 // todo: move this into slow callback, no reason for IAT corr to be here
180 // todo: move this into slow callback, no reason for CLT corr to be here
182
183 engine->module<DfcoController>()->update();
184 // should be called before getInjectionMass() and getLimitingTimingRetard()
186
188
190
191 auto tps = Sensor::get(SensorType::Tps1);
192 updateTChargeK(rpm, tps.value_or(0));
193
194 float untrimmedInjectionMass = getInjectionMass(rpm) * engine->engineState.lua.fuelMult + engine->engineState.lua.fuelAdd;
195 float fuelLoad = getFuelingLoad();
196
197 auto clResult = engine->module<ShortTermFuelTrim>()->getCorrection(rpm, fuelLoad);
198
199 engine->module<LongTermFuelTrim>()->learn(clResult, rpm, fuelLoad);
200
201 auto ltftResult = engine->module<LongTermFuelTrim>()->getTrims(rpm, fuelLoad);
202
204 float stage2InjectionMass = untrimmedInjectionMass * injectionStage2Fraction;
205 float stage1InjectionMass = untrimmedInjectionMass - stage2InjectionMass;
206
207 // Store the pre-wall wetting injection duration for scheduling purposes only, not the actual injection duration
208 engine->engineState.injectionDuration = engine->module<InjectorModelPrimary>()->getInjectionDuration(stage1InjectionMass);
211 ? engine->module<InjectorModelSecondary>()->getInjectionDuration(stage2InjectionMass)
212 : 0;
213
214 injectionOffset = getInjectionOffset(rpm, fuelLoad);
215 engine->lambdaMonitor.update(rpm, fuelLoad);
216
217#if EFI_LAUNCH_CONTROL
220#endif //EFI_LAUNCH_CONTROL
221
222 float l_ignitionLoad = getIgnitionLoad();
224 float baseAdvance = engine->ignitionState.getWrappedAdvance(rpm, l_ignitionLoad);
225 float corrections = engineConfiguration->timingMode == TM_DYNAMIC ?
226 // Pull any extra timing for knock retard
227 - engine->module<KnockController>()->getKnockRetard()
228 // Degrees of timing REMOVED from actual timing during soft RPM limit window
230 0;
231 float correctedIgnitionAdvance = baseAdvance + corrections;
232 // these fields are scaled_channel so let's only use for observability, with a local variables holding value while it matters locally
233 engine->ignitionState.baseIgnitionAdvance = MAKE_HUMAN_READABLE_ADVANCE(baseAdvance);
235
236 // compute per-bank fueling
237 for (size_t bankIndex = 0; bankIndex < FT_BANK_COUNT; bankIndex++) {
238 engine->engineState.stftCorrection[bankIndex] = clResult.banks[bankIndex];
239 }
240
241 // Now apply that to per-cylinder fueling and timing
242 for (size_t cylinderIndex = 0; cylinderIndex < engineConfiguration->cylindersCount; cylinderIndex++) {
243 uint8_t bankIndex = engineConfiguration->cylinderBankSelect[cylinderIndex];
244 /* TODO: add LTFT trims when ready */
245 auto bankTrim = clResult.banks[bankIndex] * ltftResult.banks[bankIndex];
246 auto cylinderTrim = getCylinderFuelTrim(cylinderIndex, rpm, fuelLoad);
247 auto knockTrim = engine->module<KnockController>()->getFuelTrimMultiplier();
248
249 // Apply both per-bank and per-cylinder trims
250 engine->engineState.injectionMass[cylinderIndex] = untrimmedInjectionMass * bankTrim * cylinderTrim * knockTrim;
251
252 angle_t cylinderIgnitionAdvance = correctedIgnitionAdvance
253 + getCylinderIgnitionTrim(cylinderIndex, rpm, l_ignitionLoad)
254 // spark hardware latency correction, for implementation details see:
255 // https://github.com/rusefi/rusefi/issues/6832:
257 wrapAngle(cylinderIgnitionAdvance, "EngineState::periodicFastCallback", ObdCode::CUSTOM_ERR_ADCANCE_CALC_ANGLE);
258 // todo: is it OK to apply cylinder trim with FIXED timing?
259 timingAdvance[cylinderIndex] = cylinderIgnitionAdvance;
260 }
261
263
265
267
268#if EFI_ANTILAG_SYSTEM
270#endif //EFI_ANTILAG_SYSTEM
271#endif // EFI_SHAFT_POSITION_INPUT
272}
size_t getMultiSparkCount(float rpm)
angle_t getCylinderIgnitionTrim(size_t cylinderNumber, float rpm, float ignitionLoad)
void recalculateAuxValveTiming()
FuelComputer fuelComputer
Definition engine.h:139
IgnitionState ignitionState
Definition engine.h:239
bool slowCallBackWasInvoked
Definition engine.h:304
LaunchControlBase launchController
Definition engine.h:220
EngineState engineState
Definition engine.h:344
RpmCalculator rpmCalculator
Definition engine.h:306
AntilagSystemBase antilagController
Definition engine.h:228
LambdaMonitor lambdaMonitor
Definition engine.h:236
constexpr auto & module()
Definition engine.h:200
ShiftTorqueReductionController shiftTorqueReductionController
Definition engine.h:221
angle_t injectionOffset
Timer crankingTimer
bool shouldUpdateInjectionTiming
void updateTChargeK(float rpm, float tps)
Definition engine2.cpp:275
floatms_t injectionDuration
floatms_t injectionDurationStage2
float injectionStage2Fraction
multispark_state multispark
angle_t timingAdvance[MAX_CYLINDER_COUNT]
void updateAdvanceCorrections(float engineLoad)
angle_t getTrailingSparkAngle(const float rpm, const float engineLoad)
angle_t getWrappedAdvance(const float rpm, const float engineLoad)
angle_t getSparkHardwareLatencyCorrection()
void updateDwell(float rpm, bool isCranking)
void updateRevLimit(float rpm)
angle_t getLimitingTimingRetard() const
bool isCranking() const override
virtual SensorResult get() const =0
static float getOrZero(SensorType type)
Definition sensor.h:83
LimpManager * getLimpManager()
Definition engine.cpp:596
static EngineAccessor engine
Definition engine.h:413
static constexpr engine_configuration_s * engineConfiguration
float getFuelingLoad()
float getIgnitionLoad()
bool warning(ObdCode code, const char *fmt,...)
float getStage2InjectionFraction(float rpm, float load)
float getPostCrankingFuelCorrection()
angle_t getInjectionOffset(float rpm, float load)
float getIatFuelCorrection()
float getBaroCorrection()
float getCltFuelCorrection()
Engine warm-up fuel correction.
PUBLIC_API_WEAK_SOMETHING_WEIRD float getCylinderFuelTrim(size_t cylinderNumber, float rpm, float fuelLoad)
float getInjectionMass(float rpm)
percent_t getInjectorDutyCycle(float rpm)
@ CUSTOM_SLOW_NOT_INVOKED
@ CUSTOM_ERR_ADCANCE_CALC_ANGLE
@ EngineStatePeriodicFastCallback
float angle_t
correctedIgnitionAdvance("Timing: ignition", SensorCategory.SENSOR_INPUTS, FieldType.INT16, 962, 0.02, 0.0, 0.0, "deg")
void update(float rpm, float load)
float stftCorrection[FT_BANK_COUNT]
float injectionMass[MAX_CYLINDER_COUNT]
scaled_channel< uint16_t, 100, 1 > afrTableYAxis
scaled_channel< int16_t, 100, 1 > trailingSparkAngle
scaled_channel< int16_t, 50, 1 > baseIgnitionAdvance
scaled_channel< int16_t, 50, 1 > correctedIgnitionAdvance
void wrapAngle(angle_t &angle, const char *msg, ObdCode code)

Referenced by Engine::periodicFastCallback().

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

◆ updateSparkSkip()

void EngineState::updateSparkSkip ( )

Definition at line 137 of file engine2.cpp.

137 {
138#if EFI_LAUNCH_CONTROL
143 /*
144 * We are applying launch controller spark skip ratio only for hard skip limiter (see
145 * https://github.com/rusefi/rusefi/issues/6566#issuecomment-2153149902).
146 */
148 );
149#endif // EFI_LAUNCH_CONTROL
150}
SoftSparkLimiter softSparkLimiter
Definition engine.h:222
SoftSparkLimiter hardSparkLimiter
Definition engine.h:224
float getSparkSkipRatio() const
void updateTargetSkipRatio(float luaSoftSparkSkip, float tractionControlSparkSkip, float launchOrShiftTorqueReductionControllerSparkSkipRatio=0.0f)

Referenced by configureRusefiLuaHooks(), and getRunningAdvance().

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

◆ updateTChargeK()

void EngineState::updateTChargeK ( float  rpm,
float  tps 
)

Definition at line 275 of file engine2.cpp.

275 {
276 float newTCharge = engine->fuelComputer.getTCharge(rpm, tps);
277 if (!std::isnan(newTCharge)) {
278 // control the rate of change or just fill with the initial value
279 efitick_t nowNt = getTimeNowNt();
280 float secsPassed = timeSinceLastTChargeK.getElapsedSeconds(nowNt);
281 sd.tCharge = (sd.tChargeK == 0) ? newTCharge : limitRateOfChange(newTCharge, sd.tCharge, engineConfiguration->tChargeAirIncrLimit, engineConfiguration->tChargeAirDecrLimit, secsPassed);
282 sd.tChargeK = convertCelsiusToKelvin(sd.tCharge);
283 timeSinceLastTChargeK.reset(nowNt);
284 }
285}
float limitRateOfChange(float newValue, float oldValue, float incrLimitPerSec, float decrLimitPerSec, float secsPassed)
Definition efilib.cpp:170
temperature_t getTCharge(float rpm, float tps)
scaled_channel< int16_t, 100, 1 > tCharge

Referenced by periodicFastCallback().

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

Field Documentation

◆ airflowEstimate

float EngineState::airflowEstimate = 0

◆ auxValveEnd

float EngineState::auxValveEnd = 0

Definition at line 42 of file engine_state.h.

Referenced by auxPlainPinTurnOn(), and recalculateAuxValveTiming().

◆ auxValveStart

float EngineState::auxValveStart = 0

Definition at line 41 of file engine_state.h.

Referenced by auxPlainPinTurnOn(), recalculateAuxValveTiming(), and scheduleOpen().

◆ baseFuel

floatms_t EngineState::baseFuel = 0

Raw fuel injection duration produced by current fuel algorithm, without any correction

Definition at line 63 of file engine_state.h.

Referenced by getBaseFuelMass().

◆ crankingTimer

Timer EngineState::crankingTimer {}

Definition at line 33 of file engine_state.h.

33{};

Referenced by periodicFastCallback().

◆ engineCycle

angle_t EngineState::engineCycle {getEngineCycle(FOUR_STROKE_CRANK_SENSOR)}

◆ injectionDuration

floatms_t EngineState::injectionDuration = 0

Each individual fuel injection duration for current engine cycle, without wall wetting including everything including injector lag, both cranking and running

See also
getInjectionDuration()

Definition at line 75 of file engine_state.h.

Referenced by InjectionEvent::computeInjectionAngle(), getInjectorDutyCycle(), periodicFastCallback(), populateFrame(), populateFrame(), and LimpManager::updateState().

◆ injectionDurationStage2

floatms_t EngineState::injectionDurationStage2 = 0

Definition at line 76 of file engine_state.h.

Referenced by getInjectorDutyCycleStage2(), and periodicFastCallback().

◆ injectionOffset

angle_t EngineState::injectionOffset = 0

Definition at line 78 of file engine_state.h.

Referenced by InjectionEvent::computeInjectionAngle(), and periodicFastCallback().

◆ injectionStage2Fraction

float EngineState::injectionStage2Fraction = 0

Definition at line 31 of file engine_state.h.

Referenced by InjectionEvent::onTriggerTooth(), and periodicFastCallback().

◆ mapAveragingDuration

angle_t EngineState::mapAveragingDuration = 0

Definition at line 48 of file engine_state.h.

Referenced by MapAveragingModule::onFastCallback(), and startAveraging().

◆ mapAveragingStart

angle_t EngineState::mapAveragingStart[MAX_CYLINDER_COUNT] {}

MAP averaging angle start, in relation to '0' trigger index index

Definition at line 47 of file engine_state.h.

47{};

Referenced by MapAveragingModule::onEnginePhase(), and MapAveragingModule::onFastCallback().

◆ multispark

multispark_state EngineState::multispark {}

◆ shouldUpdateInjectionTiming

bool EngineState::shouldUpdateInjectionTiming = true

Definition at line 82 of file engine_state.h.

Referenced by periodicFastCallback().

◆ timeSinceLastTChargeK

Timer EngineState::timeSinceLastTChargeK {}

Definition at line 58 of file engine_state.h.

58{};

Referenced by EngineState(), and updateTChargeK().

◆ timingAdvance

angle_t EngineState::timingAdvance[MAX_CYLINDER_COUNT] {}

timing advance is angle distance before Top Dead Center (TDP), i.e. "10 degree timing advance" means "happens 10 degrees before TDC"

Definition at line 53 of file engine_state.h.

53{};

Referenced by canDashboardHaltech(), handleGetDataRequest(), initializeIgnitionActions(), KnockControllerBase::onKnockSenseCompleted(), periodicFastCallback(), populateFrame(), populateFrame(), and prepareCylinderIgnitionSchedule().

◆ tpsAccelEnrich

floatms_t EngineState::tpsAccelEnrich = 0

TPS acceleration: extra fuel amount

Definition at line 68 of file engine_state.h.

Referenced by getInjectionMass(), and updateTunerStudioState().

◆ trailingSparkAngle

angle_t EngineState::trailingSparkAngle = 0

Definition at line 56 of file engine_state.h.

◆ undervoltageCrankingTimer

Timer EngineState::undervoltageCrankingTimer {}

Definition at line 34 of file engine_state.h.

34{};

Referenced by Engine::periodicSlowCallback().

◆ useOddFireWastedSpark

bool EngineState::useOddFireWastedSpark = false

◆ warnings

WarningCodeState EngineState::warnings {}

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