rusEFI
The most advanced open source ECU
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 updateSlowSensors ()
 
void updateTChargeK (int rpm, float tps)
 
void updateSparkSkip ()
 

Data Fields

angle_t engineCycle
 
sensor_chart_e sensorChartMode = SC_OFF
 
float injectionMass [MAX_CYLINDER_COUNT] = {0}
 
float injectionStage2Fraction = 0
 
Timer crankingTimer
 
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] = {0}
 
angle_t trailingSparkAngle = 0
 
Timer timeSinceLastTChargeK
 
float currentVe = 0
 
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
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 clutchDownState = (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
 
uint8_t alignmentFill_at_49 [3]
 
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 unusedBit_21_8: 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 luaSoftSparkSkip = (float)0
 
float luaHardSparkSkip = (float)0
 
float tractionControlSparkSkip = (float)0
 
int16_t desiredRpmLimit = (int16_t)0
 
uint8_t alignmentFill_at_74 [2]
 
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_97 [3]
 

Detailed Description

Definition at line 15 of file engine_state.h.

Constructor & Destructor Documentation

◆ EngineState()

EngineState::EngineState ( )

Definition at line 84 of file engine2.cpp.

84  {
86 }
Timer timeSinceLastTChargeK
Definition: engine_state.h:63
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 100 of file engine2.cpp.

100  {
102 
103 #if EFI_SHAFT_POSITION_INPUT
105  warning(ObdCode::CUSTOM_SLOW_NOT_INVOKED, "Slow not invoked yet");
106  }
107  efitick_t nowNt = getTimeNowNt();
108 
110  crankingTimer.reset(nowNt);
111  }
112 
114 
116 
119  engine->ignitionState.dwellDurationAngle = cisnan(rpm) ? NAN : engine->ignitionState.sparkDwell / getOneDegreeTimeMs(rpm);
120 
121  // todo: move this into slow callback, no reason for IAT corr to be here
123  // todo: move this into slow callback, no reason for CLT corr to be here
125 
126  engine->module<DfcoController>()->update();
127  // should be called before getInjectionMass() and getLimitingTimingRetard()
129 
130  // post-cranking fuel enrichment.
131  float m_postCrankingFactor = interpolate3d(
135  );
136  // for compatibility reasons, apply only if the factor is greater than unity (only allow adding fuel)
137  // if the engine run time is past the last bin, disable ASE in case the table is filled with values more than 1.0, helps with compatibility
139  m_postCrankingFactor = 1.0f;
140  }
141  engine->fuelComputer.running.postCrankingFuelCorrection = m_postCrankingFactor;
142 
144 
146 
147  auto tps = Sensor::get(SensorType::Tps1);
148  updateTChargeK(rpm, tps.value_or(0));
149 
150  float untrimmedInjectionMass = getInjectionMass(rpm) * engine->engineState.lua.fuelMult + engine->engineState.lua.fuelAdd;
151  auto clResult = fuelClosedLoopCorrection();
152 
154  float stage2InjectionMass = untrimmedInjectionMass * injectionStage2Fraction;
155  float stage1InjectionMass = untrimmedInjectionMass - stage2InjectionMass;
156 
157  // Store the pre-wall wetting injection duration for scheduling purposes only, not the actual injection duration
158  engine->engineState.injectionDuration = engine->module<InjectorModelPrimary>()->getInjectionDuration(stage1InjectionMass);
161  ? engine->module<InjectorModelSecondary>()->getInjectionDuration(stage2InjectionMass)
162  : 0;
163 
164  float fuelLoad = getFuelingLoad();
165  injectionOffset = getInjectionOffset(rpm, fuelLoad);
166  engine->lambdaMonitor.update(rpm, fuelLoad);
167 
168  float l_ignitionLoad = getIgnitionLoad();
169  float baseAdvance = getAdvance(rpm, l_ignitionLoad) * engine->ignitionState.luaTimingMult + engine->ignitionState.luaTimingAdd;
170  float correctedIgnitionAdvance = baseAdvance
171  // Pull any extra timing for knock retard
172  - engine->module<KnockController>()->getKnockRetard()
173  // Degrees of timing REMOVED from actual timing during soft RPM limit window
175  // these fields are scaled_channel so let's only use for observability, with a local variables holding value while it matters locally
176  engine->ignitionState.baseIgnitionAdvance = MAKE_HUMAN_READABLE_ADVANCE(baseAdvance);
178 
179 
180  // compute per-bank fueling
181  for (size_t i = 0; i < STFT_BANK_COUNT; i++) {
182  float corr = clResult.banks[i];
183  engine->stftCorrection[i] = corr;
184  }
185 
186  // Now apply that to per-cylinder fueling and timing
187  for (size_t i = 0; i < engineConfiguration->cylindersCount; i++) {
188  uint8_t bankIndex = engineConfiguration->cylinderBankSelect[i];
189  auto bankTrim = engine->stftCorrection[bankIndex];
190  auto cylinderTrim = getCylinderFuelTrim(i, rpm, fuelLoad);
191 
192  // Apply both per-bank and per-cylinder trims
193  engine->engineState.injectionMass[i] = untrimmedInjectionMass * bankTrim * cylinderTrim;
194 
195  timingAdvance[i] = correctedIgnitionAdvance + getCylinderIgnitionTrim(i, rpm, l_ignitionLoad);
196  }
197 
199 
200  // TODO: calculate me from a table!
202 
204 
205 #if EFI_LAUNCH_CONTROL
207 #endif //EFI_LAUNCH_CONTROL
208 
209 #if EFI_ANTILAG_SYSTEM
211 #endif //EFI_ANTILAG_SYSTEM
212 #endif // EFI_SHAFT_POSITION_INPUT
213 }
angle_t getAdvance(int rpm, float engineLoad)
size_t getMultiSparkCount(int rpm)
angle_t getCylinderIgnitionTrim(size_t cylinderNumber, int rpm, float ignitionLoad)
void recalculateAuxValveTiming()
Definition: aux_valves.cpp:79
FuelComputer fuelComputer
Definition: engine.h:118
IgnitionState ignitionState
Definition: engine.h:207
float stftCorrection[STFT_BANK_COUNT]
Definition: engine.h:285
bool slowCallBackWasInvoked
Definition: engine.h:266
LaunchControlBase launchController
Definition: engine.h:189
EngineState engineState
Definition: engine.h:310
RpmCalculator rpmCalculator
Definition: engine.h:268
constexpr auto & module()
Definition: engine.h:174
AntilagSystemBase antilagController
Definition: engine.h:196
LambdaMonitor lambdaMonitor
Definition: engine.h:204
angle_t injectionOffset
Definition: engine_state.h:85
void updateTChargeK(int rpm, float tps)
Definition: engine2.cpp:216
Timer crankingTimer
Definition: engine_state.h:39
float injectionMass[MAX_CYLINDER_COUNT]
Definition: engine_state.h:35
bool shouldUpdateInjectionTiming
Definition: engine_state.h:89
angle_t trailingSparkAngle
Definition: engine_state.h:61
floatms_t injectionDuration
Definition: engine_state.h:82
floatms_t injectionDurationStage2
Definition: engine_state.h:83
float injectionStage2Fraction
Definition: engine_state.h:37
multispark_state multispark
Definition: engine_state.h:87
angle_t timingAdvance[MAX_CYLINDER_COUNT]
Definition: engine_state.h:58
floatms_t getSparkDwell(int rpm)
Definition: engine_math.cpp:77
void updateRevLimit(int rpm)
angle_t getLimitingTimingRetard() const
bool isCranking() const override
uint32_t getRevolutionCounterSinceStart(void) const
virtual SensorResult get() const =0
static float getOrZero(SensorType type)
Definition: sensor.h:92
ClosedLoopFuelResult fuelClosedLoopCorrection()
LimpManager * getLimpManager()
Definition: engine.cpp:595
Engine * engine
float getFuelingLoad()
Definition: engine_math.cpp:47
float getIgnitionLoad()
Definition: engine_math.cpp:51
bool warning(ObdCode code, const char *fmt,...)
float getCylinderFuelTrim(size_t cylinderNumber, int rpm, float fuelLoad)
Definition: fuel_math.cpp:441
float getStage2InjectionFraction(int rpm, float load)
Definition: fuel_math.cpp:455
angle_t getCltTimingCorrection()
Definition: fuel_math.cpp:362
angle_t getInjectionOffset(float rpm, float load)
Definition: fuel_math.cpp:208
float getIatFuelCorrection()
Definition: fuel_math.cpp:371
percent_t getInjectorDutyCycle(int rpm)
Definition: fuel_math.cpp:279
float getBaroCorrection()
Definition: fuel_math.cpp:380
float getCltFuelCorrection()
Engine warm-up fuel correction.
Definition: fuel_math.cpp:353
float getInjectionMass(int rpm)
Definition: fuel_math.cpp:303
@ CUSTOM_SLOW_NOT_INVOKED
@ EngineStatePeriodicFastCallback
engine_configuration_s * engineConfiguration
correctedIgnitionAdvance("Timing: ignition", SensorCategory.SENSOR_INPUTS, FieldType.INT16, 904, 0.02, 0.0, 0.0, "deg")
void update(float rpm, float load)
float postCrankingFactor[CRANKING_ENRICH_COUNT][CRANKING_ENRICH_COUNT]
scaled_channel< uint16_t, 100, 1 > afrTableYAxis
scaled_channel< int16_t, 50, 1 > baseIgnitionAdvance
scaled_channel< int16_t, 100, 1 > cltTimingCorrection
scaled_channel< int16_t, 50, 1 > correctedIgnitionAdvance
composite packet size

Referenced by Engine::periodicFastCallback().

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

◆ updateSlowSensors()

void EngineState::updateSlowSensors ( )

Definition at line 88 of file engine2.cpp.

88  {
89 }

Referenced by Engine::updateSlowSensors().

Here is the caller graph for this function:

◆ updateSparkSkip()

void EngineState::updateSparkSkip ( )

Definition at line 91 of file engine2.cpp.

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 ( int  rpm,
float  tps 
)

Definition at line 216 of file engine2.cpp.

216  {
217  float newTCharge = engine->fuelComputer.getTCharge(rpm, tps);
218  if (!cisnan(newTCharge)) {
219  // control the rate of change or just fill with the initial value
220  efitick_t nowNt = getTimeNowNt();
221  float secsPassed = timeSinceLastTChargeK.getElapsedSeconds(nowNt);
223  sd.tChargeK = convertCelsiusToKelvin(sd.tCharge);
224  timeSinceLastTChargeK.reset(nowNt);
225  }
226 }
float limitRateOfChange(float newValue, float oldValue, float incrLimitPerSec, float decrLimitPerSec, float secsPassed)
Definition: efilib.cpp:189
temperature_t getTCharge(int 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 47 of file engine_state.h.

Referenced by auxPlainPinTurnOn(), and recalculateAuxValveTiming().

◆ auxValveStart

float EngineState::auxValveStart = 0

Definition at line 46 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 70 of file engine_state.h.

Referenced by getBaseFuelMass().

◆ crankingTimer

Timer EngineState::crankingTimer

Definition at line 39 of file engine_state.h.

Referenced by periodicFastCallback().

◆ currentVe

float EngineState::currentVe = 0

Definition at line 65 of file engine_state.h.

Referenced by AirmassVeModelBase::getVe(), and updateFuelInfo().

◆ engineCycle

angle_t EngineState::engineCycle

◆ 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 82 of file engine_state.h.

Referenced by getInjectorDutyCycle(), periodicFastCallback(), and populateFrame().

◆ injectionDurationStage2

floatms_t EngineState::injectionDurationStage2 = 0

Definition at line 83 of file engine_state.h.

Referenced by getInjectorDutyCycleStage2(), and periodicFastCallback().

◆ injectionMass

float EngineState::injectionMass[MAX_CYLINDER_COUNT] = {0}

◆ injectionOffset

angle_t EngineState::injectionOffset = 0

Definition at line 85 of file engine_state.h.

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

◆ injectionStage2Fraction

float EngineState::injectionStage2Fraction = 0

Definition at line 37 of file engine_state.h.

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

◆ mapAveragingDuration

angle_t EngineState::mapAveragingDuration = 0

◆ mapAveragingStart

angle_t EngineState::mapAveragingStart[MAX_CYLINDER_COUNT]

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

Definition at line 52 of file engine_state.h.

Referenced by mapAveragingTriggerCallback(), and refreshMapAveragingPreCalc().

◆ multispark

multispark_state EngineState::multispark

◆ sensorChartMode

sensor_chart_e EngineState::sensorChartMode = SC_OFF

this is based on sensorChartMode and sensorSnifferRpmThreshold settings

Definition at line 32 of file engine_state.h.

Referenced by rpmShaftPositionCallback(), and Engine::updateSlowSensors().

◆ shouldUpdateInjectionTiming

bool EngineState::shouldUpdateInjectionTiming = true

Definition at line 89 of file engine_state.h.

Referenced by periodicFastCallback().

◆ timeSinceLastTChargeK

Timer EngineState::timeSinceLastTChargeK

Definition at line 63 of file engine_state.h.

Referenced by EngineState(), and updateTChargeK().

◆ timingAdvance

angle_t EngineState::timingAdvance[MAX_CYLINDER_COUNT] = {0}

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 58 of file engine_state.h.

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

◆ tpsAccelEnrich

floatms_t EngineState::tpsAccelEnrich = 0

TPS acceleration: extra fuel amount

Definition at line 75 of file engine_state.h.

Referenced by getInjectionMass(), and updateTunerStudioState().

◆ trailingSparkAngle

angle_t EngineState::trailingSparkAngle = 0

◆ warnings

WarningCodeState EngineState::warnings

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