36#if EFI_ENGINE_CONTROL && EFI_SHAFT_POSITION_INPUT
42 if (std::isnan(engineLoad)) {
64 config->ALSTimingRetardTable,
65 config->alsIgnRetardLoadBins, throttleIntent,
66 config->alsIgnRetardrpmBins, rpm
73 for (
size_t i = 0; i < efi::size(
config->ignBlends); i++) {
81 advanceAngle += result.Value;
88 float idleAdvance = interpolate2d(rpm,
config->idleAdvanceBins,
config->idleAdvance);
97 advanceAngle =
interpolateClamped(idleThreshold / 2, idleAdvance, idleThreshold, advanceAngle, tps.Value);
115#if EFI_LAUNCH_CONTROL
122 if (smoothRetardStartRpm <= rpm) {
125 return interpolateClamped(smoothRetardStartRpm, advanceAngle, smoothRetardEndRpm, launchAngle, rpm);
144#ifdef MODULE_VVL_CONTROLLER
157 return interpolate3d(
158 config->ignitionCltCorrTable,
159 config->ignitionCltCorrLoadBins, engineLoad,
160 config->ignitionCltCorrTempBins,
clt.Value
175 config->ignitionIatCorrTable,
176 config->ignitionIatCorrLoadBins, engineLoad,
177 config->ignitionIatCorrTempBins,
iat.Value
205 return interpolate2d(rpm,
config->crankingAdvanceBins,
config->crankingAdvance);
218 if (std::isnan(engineLoad)) {
236 if (std::isnan(angle)) {
243 bool allowCorrections = !isCranking ||
engineConfiguration->useAdvanceCorrectionsForCranking;
245 if (allowCorrections) {
247 if (!std::isnan(correction)) {
262PUBLIC_API_WEAK_SOMETHING_WEIRD
270 && rpm <= engineConfiguration->multisparkMaxRpm
284 constexpr float usPerDegreeAt1Rpm = 60e6 / 360;
285 floatus_t usPerDegree = usPerDegreeAt1Rpm / rpm;
290 floatus_t oneSparkTime = multiDelay + multiDwell;
293 float sparksFitInTime = additionalSparksUs / oneSparkTime;
296 uint32_t floored = sparksFitInTime;
323 config->dwellVoltageCorrVoltBins,
324 config->dwellVoltageCorrValues
335 if (std::isnan(dwellMs) || dwellMs <= 0) {
353 if (std::isnan(engineLoad)) {
357 return interpolate3d(
358 config->trailingSparkTable,
359 config->trailingSparkLoadBins, engineLoad,
360 config->trailingSparkRpmBins, rpm
368 if (!std::isnan(correction)) {
375 return interpolate3d(
378 config->ignitionRpmBins, rpm
383 const size_t cylinderNumber,
387 return interpolate3d(
388 config->ignTrims[cylinderNumber].table,
390 config->ignTrimRpmBins, rpm
angle_t getAdvanceCorrections(float engineLoad)
angle_t getCrankingAdvance(float rpm, float engineLoad)
angle_t getRunningAdvance(float rpm, float engineLoad)
TriggerCentral triggerCentral
IgnitionState ignitionState
LaunchControlBase launchController
RpmCalculator rpmCalculator
AntilagSystemBase antilagController
TunerStudioOutputChannels outputChannels
constexpr auto & module()
ShiftTorqueReductionController shiftTorqueReductionController
multispark_state multispark
bool isIdlingOrTaper() const override
bool isCoastingAdvance() const override
void updateAdvanceCorrections(float engineLoad)
angle_t getTrailingSparkAngle(const float rpm, const float engineLoad)
angle_t getAdvance(float rpm, float engineLoad)
angle_t getWrappedAdvance(const float rpm, const float engineLoad)
static angle_t getInterpolatedIgnitionTrim(size_t cylinderNumber, float rpm, float ignitionLoad)
static angle_t getInterpolatedIgnitionAngle(float rpm, float ignitionLoad)
angle_t getSparkHardwareLatencyCorrection()
floatms_t getSparkDwell(float rpm, bool isCranking)
floatms_t getDwell() const
void updateDwell(float rpm, bool isCranking)
float getInstantRpm() const
bool isCranking() const override
virtual SensorResult get() const =0
static float getOrZero(SensorType type)
float getTorqueReductionIgnitionRetard()
InstantRpmCalculator instantRpm
float getTimingModifier() const
float interpolateClamped(float x1, float y1, float x2, float y2, float x)
static EngineAccessor engine
static constexpr persistent_config_s * config
static constexpr engine_configuration_s * engineConfiguration
BlendResult calculateBlend(blend_table_s &cfg, float rpm, float load)
bool warning(ObdCode code, const char *fmt,...)
angle_t getCltTimingCorrection()
Idle Valve Control thread.
angle_t getAdvanceCorrections(float engineLoad)
angle_t getCrankingAdvance(float rpm, float engineLoad)
void initIgnitionAdvanceControl()
PUBLIC_API_WEAK_SOMETHING_WEIRD angle_t getCylinderIgnitionTrim(size_t cylinderNumber, float rpm, float ignitionLoad)
angle_t getRunningAdvance(float rpm, float engineLoad)
size_t getMultiSparkCount(float rpm)
static Map3D< TRACTION_CONTROL_ETB_DROP_SLIP_SIZE, TRACTION_CONTROL_ETB_DROP_SPEED_SIZE, int8_t, uint16_t, uint8_t > tcTimingDropTable
static Map3D< TRACTION_CONTROL_ETB_DROP_SLIP_SIZE, TRACTION_CONTROL_ETB_DROP_SPEED_SIZE, int8_t, uint16_t, uint8_t > tcSparkSkipTable
static CCM_OPTIONAL FunctionalSensor iat(SensorType::Iat, MS2NT(10))
static CCM_OPTIONAL FunctionalSensor clt(SensorType::Clt, MS2NT(10))
@ CUSTOM_ERR_DWELL_DURATION
@ CUSTOM_ERR_ADCANCE_CALC_ANGLE
instantRpm("sync: instant RPM", SensorCategory.SENSOR_INPUTS, FieldType.INT16, 326, 1.0, 0.0, 0.0, "rpm")
ignitionLoad("Ignition: load", SensorCategory.SENSOR_INPUTS, FieldType.INT, 1420, 1.0, -1.0, -1.0, "")
scaled_channel< int16_t, 100, 1 > timingALSCorrection
float tractionControlSparkSkip
int16_t rpmForIgnitionTableDot
float dwellVoltageCorrection
angle_t dwellDurationAngle
int16_t rpmForIgnitionIdleTableDot
scaled_channel< int16_t, 100, 1 > dfcoTimingRetard
scaled_channel< int16_t, 100, 1 > timingPidCorrection
scaled_channel< int16_t, 100, 1 > cltTimingCorrection
scaled_channel< int16_t, 50, 1 > tractionAdvanceDrop
float loadForIgnitionTableDot
scaled_channel< int16_t, 100, 1 > timingIatCorrection
bool isPreLaunchCondition
uint8_t multiSparkCounter
scaled_channel< int16_t, 100, 1 > ignBlendOutput[IGN_BLEND_COUNT]
scaled_channel< int16_t, 10, 1 > ignBlendParameter[IGN_BLEND_COUNT]
scaled_channel< uint8_t, 2, 1 > ignBlendBias[IGN_BLEND_COUNT]
scaled_channel< int16_t, 10, 1 > ignBlendYAxis[IGN_BLEND_COUNT]
bool isFlatShiftConditionSatisfied
void wrapAngle(angle_t &angle, const char *msg, ObdCode code)