36#if EFI_ENGINE_CONTROL && EFI_SHAFT_POSITION_INPUT
42 if (std::isnan(engineLoad)) {
81 advanceAngle += result.Value;
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(
218 if (std::isnan(engineLoad)) {
236 if (std::isnan(angle)) {
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;
335 if (std::isnan(dwellMs) || dwellMs <= 0) {
353 if (std::isnan(engineLoad)) {
357 return interpolate3d(
368 if (!std::isnan(correction)) {
375 return interpolate3d(
383 const size_t cylinderNumber,
387 return interpolate3d(
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() const
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, 1412, 1.0, -1.0, -1.0, "")
scaled_channel< int16_t, 100, 1 > timingALSCorrection
float nitrousIgnitionRetard
uint8_t multisparkMaxSparkingAngle
bool launchControlEnabled
angle_t crankingTimingAngle
uint8_t multisparkMaxExtraSparkCount
uint16_t launchCorrectionsEndRpm
uint8_t tractionControlSpeedBins[TRACTION_CONTROL_ETB_DROP_SPEED_SIZE]
int8_t tractionControlIgnitionSkip[TRACTION_CONTROL_ETB_DROP_SLIP_SIZE][TRACTION_CONTROL_ETB_DROP_SPEED_SIZE]
bool nitrousControlEnabled
cranking_parameters_s cranking
float ignitionDwellForCrankingMs
scaled_channel< uint16_t, 1000, 1 > multisparkDwell
scaled_channel< uint8_t, 1, 1 > sparkHardwareLatencyCorrection
scaled_channel< uint16_t, 1000, 1 > multisparkSparkDuration
scaled_channel< uint16_t, 100, 1 > tractionControlSlipBins[TRACTION_CONTROL_ETB_DROP_SLIP_SIZE]
bool torqueReductionEnabled
bool useAdvanceCorrectionsForCranking
bool useSeparateAdvanceForIdle
bool useSeparateAdvanceForCranking
int16_t idlePidDeactivationTpsThreshold
int8_t tractionControlTimingDrop[TRACTION_CONTROL_ETB_DROP_SLIP_SIZE][TRACTION_CONTROL_ETB_DROP_SPEED_SIZE]
float tractionControlSparkSkip
scaled_channel< int8_t, 5, 1 > table[IGN_TRIM_SIZE][IGN_TRIM_SIZE]
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]
blend_table_s ignBlends[IGN_BLEND_COUNT]
uint16_t alsIgnRetardLoadBins[ALS_SIZE]
float idleAdvance[IDLE_ADVANCE_CURVE_SIZE]
scaled_channel< uint8_t, 10, 1 > dwellVoltageCorrVoltBins[DWELL_CURVE_SIZE]
uint16_t ignTrimRpmBins[IGN_TRIM_SIZE]
scaled_channel< int16_t, 100, 1 > crankingAdvance[CRANKING_ADVANCE_CURVE_SIZE]
uint16_t sparkDwellRpmBins[DWELL_CURVE_SIZE]
uint16_t ignitionLoadBins[IGN_LOAD_COUNT]
scaled_channel< int8_t, 10, 1 > trailingSparkTable[TRAILING_SPARK_SIZE][TRAILING_SPARK_SIZE]
scaled_channel< uint8_t, 1, 5 > trailingSparkLoadBins[TRAILING_SPARK_SIZE]
scaled_channel< uint8_t, 50, 1 > dwellVoltageCorrValues[DWELL_CURVE_SIZE]
scaled_channel< int16_t, 10, 1 > ignitionCltCorrTable[CLT_TIMING_CURVE_SIZE][CLT_TIMING_CURVE_SIZE]
uint16_t ignitionRpmBins[IGN_RPM_COUNT]
int8_t ignitionIatCorrTempBins[IAT_IGN_CORR_COUNT]
scaled_channel< int16_t, 1, 1 > ignitionCltCorrTempBins[CLT_TIMING_CURVE_SIZE]
uint16_t alsIgnRetardrpmBins[ALS_SIZE]
scaled_channel< uint8_t, 1, 50 > trailingSparkRpmBins[TRAILING_SPARK_SIZE]
scaled_channel< uint8_t, 1, 50 > idleAdvanceBins[IDLE_ADVANCE_CURVE_SIZE]
scaled_channel< int16_t, 10, 1 > ignitionIatCorrTable[IAT_IGN_CORR_LOAD_COUNT][IAT_IGN_CORR_COUNT]
scaled_channel< int16_t, 10, 1 > ignitionTable[IGN_LOAD_COUNT][IGN_RPM_COUNT]
scaled_channel< uint8_t, 1, 5 > ignitionIatCorrLoadBins[IAT_IGN_CORR_LOAD_COUNT]
uint16_t crankingAdvanceBins[CRANKING_ADVANCE_CURVE_SIZE]
scaled_channel< uint16_t, 100, 1 > sparkDwellValues[DWELL_CURVE_SIZE]
scaled_channel< int16_t, 10, 1 > ALSTimingRetardTable[ALS_SIZE][ALS_SIZE]
scaled_channel< uint8_t, 1, 5 > ignitionCltCorrLoadBins[CLT_TIMING_CURVE_SIZE]
ign_cyl_trim_s ignTrims[MAX_CYLINDER_COUNT]
uint16_t ignTrimLoadBins[IGN_TRIM_SIZE]
bool isFlatShiftConditionSatisfied
void wrapAngle(angle_t &angle, const char *msg, ObdCode code)