rusefi/firmware/controllers/math/engine_math.cpp

479 lines
14 KiB
C++
Raw Normal View History

2015-07-10 06:01:56 -07:00
/**
* @file engine_math.cpp
* @brief
*
* @date Jul 13, 2013
2020-01-13 18:57:43 -08:00
* @author Andrey Belomutskiy, (c) 2012-2020
2015-07-10 06:01:56 -07:00
*
* This file is part of rusEfi - see http://rusefi.com
*
* rusEfi is free software; you can redistribute it and/or modify it under the terms of
* the GNU General Public License as published by the Free Software Foundation; either
* version 3 of the License, or (at your option) any later version.
*
* rusEfi is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without
* even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License along with this program.
* If not, see <http://www.gnu.org/licenses/>.
*/
#include "pch.h"
2015-07-10 06:01:56 -07:00
#include "event_registry.h"
#include "fuel_math.h"
2016-01-08 12:01:38 -08:00
#include "advance_map.h"
2015-07-10 06:01:56 -07:00
2019-08-24 22:15:18 -07:00
#if EFI_UNIT_TEST
extern bool verboseMode;
#endif /* EFI_UNIT_TEST */
2015-07-10 06:01:56 -07:00
floatms_t getEngineCycleDuration(int rpm DECLARE_ENGINE_PARAMETER_SUFFIX) {
return getCrankshaftRevolutionTimeMs(rpm) * (engine->getOperationMode(PASS_ENGINE_PARAMETER_SIGNATURE) == TWO_STROKE ? 1 : 2);
2017-03-08 21:51:27 -08:00
}
2015-07-10 06:01:56 -07:00
/**
2016-01-08 12:01:38 -08:00
* @return number of milliseconds in one crank shaft revolution
2015-07-10 06:01:56 -07:00
*/
2015-09-07 06:03:24 -07:00
floatms_t getCrankshaftRevolutionTimeMs(int rpm) {
2016-08-30 19:02:21 -07:00
if (rpm == 0) {
return NAN;
}
2015-07-10 06:01:56 -07:00
return 360 * getOneDegreeTimeMs(rpm);
}
float getFuelingLoad(DECLARE_ENGINE_PARAMETER_SIGNATURE) {
return ENGINE(engineState.fuelingLoad);
}
float getIgnitionLoad(DECLARE_ENGINE_PARAMETER_SIGNATURE) {
return ENGINE(engineState.ignitionLoad);
}
2019-11-05 20:17:44 -08:00
/**
* see also setConstantDwell
*/
void setSingleCoilDwell(DECLARE_CONFIG_PARAMETER_SIGNATURE) {
2015-07-10 06:01:56 -07:00
for (int i = 0; i < DWELL_CURVE_SIZE; i++) {
2017-02-18 12:01:47 -08:00
engineConfiguration->sparkDwellRpmBins[i] = i + 1;
engineConfiguration->sparkDwellValues[i] = 4;
2015-07-10 06:01:56 -07:00
}
2017-02-18 12:01:47 -08:00
engineConfiguration->sparkDwellRpmBins[5] = 10;
engineConfiguration->sparkDwellValues[5] = 4;
2015-07-10 06:01:56 -07:00
2017-02-18 12:01:47 -08:00
engineConfiguration->sparkDwellRpmBins[6] = 4500;
engineConfiguration->sparkDwellValues[6] = 4;
2015-07-10 06:01:56 -07:00
2017-02-18 12:01:47 -08:00
engineConfiguration->sparkDwellRpmBins[7] = 12500;
engineConfiguration->sparkDwellValues[7] = 0;
2015-07-10 06:01:56 -07:00
}
/**
2017-04-18 05:16:53 -07:00
* @return Spark dwell time, in milliseconds. 0 if tables are not ready.
2015-07-10 06:01:56 -07:00
*/
2017-05-15 20:28:49 -07:00
floatms_t getSparkDwell(int rpm DECLARE_ENGINE_PARAMETER_SUFFIX) {
2019-04-12 19:07:03 -07:00
#if EFI_ENGINE_CONTROL && EFI_SHAFT_POSITION_INPUT
2016-11-30 12:02:43 -08:00
float dwellMs;
if (ENGINE(rpmCalculator).isCranking()) {
dwellMs = CONFIG(ignitionDwellForCrankingMs);
2016-11-30 12:02:43 -08:00
} else {
2018-07-25 20:30:00 -07:00
efiAssert(CUSTOM_ERR_ASSERT, !cisnan(rpm), "invalid rpm", NAN);
2016-11-30 12:02:43 -08:00
auto base = interpolate2d(rpm, engineConfiguration->sparkDwellRpmBins, engineConfiguration->sparkDwellValues);
auto voltageMult = 0.02f *
interpolate2d(
2021-10-05 16:59:07 -07:00
10 * Sensor::getOrZero(SensorType::BatteryVoltage),
engineConfiguration->dwellVoltageCorrVoltBins,
engineConfiguration->dwellVoltageCorrValues);
// for compat (table full of zeroes)
if (voltageMult < 0.1f) {
voltageMult = 1;
}
dwellMs = base * voltageMult;
2015-07-10 06:01:56 -07:00
}
2017-04-18 05:16:53 -07:00
if (cisnan(dwellMs) || dwellMs <= 0) {
// this could happen during engine configuration reset
2018-01-23 09:05:14 -08:00
warning(CUSTOM_ERR_DWELL_DURATION, "invalid dwell: %.2f at rpm=%d", dwellMs, rpm);
2017-04-18 05:16:53 -07:00
return 0;
2016-11-30 12:02:43 -08:00
}
return dwellMs;
2019-01-31 14:55:23 -08:00
#else
return 0;
#endif
2015-07-10 06:01:56 -07:00
}
static const int order_1[] = {1};
2015-07-10 06:01:56 -07:00
2019-01-05 05:06:18 -08:00
static const int order_1_2[] = {1, 2};
2017-02-07 22:03:36 -08:00
2019-01-05 05:06:18 -08:00
static const int order_1_2_3[] = {1, 2, 3};
static const int order_1_3_2[] = {1, 3, 2};
2017-02-07 22:03:36 -08:00
// 4 cylinder
2019-01-05 05:06:18 -08:00
static const int order_1_THEN_3_THEN_4_THEN2[] = { 1, 3, 4, 2 };
static const int order_1_THEN_2_THEN_4_THEN3[] = { 1, 2, 4, 3 };
static const int order_1_THEN_3_THEN_2_THEN4[] = { 1, 3, 2, 4 };
2019-08-15 16:36:16 -07:00
static const int order_1_THEN_4_THEN_3_THEN2[] = { 1, 4, 3, 2 };
2015-07-10 06:01:56 -07:00
2017-02-07 22:03:36 -08:00
// 5 cylinder
2019-01-05 05:06:18 -08:00
static const int order_1_2_4_5_3[] = {1, 2, 4, 5, 3};
2015-07-10 06:01:56 -07:00
2017-02-07 22:03:36 -08:00
// 6 cylinder
2019-01-05 05:06:18 -08:00
static const int order_1_THEN_5_THEN_3_THEN_6_THEN_2_THEN_4[] = { 1, 5, 3, 6, 2, 4 };
static const int order_1_THEN_4_THEN_2_THEN_5_THEN_3_THEN_6[] = { 1, 4, 2, 5, 3, 6 };
static const int order_1_THEN_2_THEN_3_THEN_4_THEN_5_THEN_6[] = { 1, 2, 3, 4, 5, 6 };
static const int order_1_6_3_2_5_4[] = {1, 6, 3, 2, 5, 4};
2021-07-08 17:42:35 -07:00
static const int order_1_4_3_6_2_5[] = {1, 4, 3, 6, 2, 5};
2021-08-24 04:28:56 -07:00
static const int order_1_6_2_4_3_5[] = {1, 6, 2, 4, 3, 5};
2021-09-17 21:18:06 -07:00
static const int order_1_6_5_4_3_2[] = {1, 6, 5, 4, 3, 2};
static const int order_1_4_5_2_3_6[] = {1, 4, 5, 2, 3, 6};
2015-07-10 06:01:56 -07:00
2017-02-07 22:03:36 -08:00
// 8 cylinder
2019-01-05 05:06:18 -08:00
static const int order_1_8_4_3_6_5_7_2[] = { 1, 8, 4, 3, 6, 5, 7, 2 };
static const int order_1_8_7_2_6_5_4_3[] = { 1, 8, 7, 2, 6, 5, 4, 3 };
static const int order_1_5_4_2_6_3_7_8[] = { 1, 5, 4, 2, 6, 3, 7, 8 };
2019-09-28 07:25:57 -07:00
static const int order_1_2_7_8_4_5_6_3[] = { 1, 2, 7, 8, 4, 5, 6, 3 };
2020-04-29 13:46:59 -07:00
static const int order_1_3_7_2_6_5_4_8[] = { 1, 3, 7, 2, 6, 5, 4, 8 };
static const int order_1_2_3_4_5_6_7_8[] = { 1, 2, 3, 4, 5, 6, 7, 8 };
static const int order_1_5_4_8_6_3_7_2[] = { 1, 5, 4, 8, 6, 3, 7, 2 };
static const int order_1_8_7_3_6_5_4_2[] = { 1, 8, 7, 3, 6, 5, 4, 2 };
2020-04-29 13:46:59 -07:00
// 9 cylinder
static const int order_1_2_3_4_5_6_7_8_9[] = { 1, 2, 3, 4, 5, 6, 7, 8, 9 };
2016-05-22 10:07:12 -07:00
2017-02-07 22:03:36 -08:00
// 10 cylinder
2019-01-05 05:06:18 -08:00
static const int order_1_10_9_4_3_6_5_8_7_2[] = {1, 10, 9, 4, 3, 6, 5, 8, 7, 2};
2015-07-10 06:01:56 -07:00
2017-02-07 22:03:36 -08:00
// 12 cyliner
2019-01-05 05:06:18 -08:00
static const int order_1_7_5_11_3_9_6_12_2_8_4_10[] = {1, 7, 5, 11, 3, 9, 6, 12, 2, 8, 4, 10};
static const int order_1_7_4_10_2_8_6_12_3_9_5_11[] = {1, 7, 4, 10, 2, 8, 6, 12, 3, 9, 5, 11};
static const int order_1_12_5_8_3_10_6_7_2_11_4_9[] = {1, 12, 5, 8, 3, 10, 6, 7, 2, 11, 4, 9};
2020-05-21 17:44:14 -07:00
static const int order_1_2_3_4_5_6_7_8_9_10_11_12[] = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12};
2015-09-10 16:01:32 -07:00
2020-05-21 15:28:35 -07:00
// no comments
static const int order_1_14_9_4_7_12_15_6_13_8_3_16_11_2_5_10[] = {1, 14, 9, 4, 7, 12, 15, 6, 13, 8, 3, 16, 11, 2, 5, 10};
2017-05-15 20:28:49 -07:00
static int getFiringOrderLength(DECLARE_ENGINE_PARAMETER_SIGNATURE) {
2017-03-23 19:01:10 -07:00
switch (CONFIG(specs.firingOrder)) {
case FO_1:
return 1;
// 2 cylinder
case FO_1_2:
return 2;
// 3 cylinder
case FO_1_2_3:
case FO_1_3_2:
2017-03-23 19:01:10 -07:00
return 3;
// 4 cylinder
case FO_1_3_4_2:
case FO_1_2_4_3:
case FO_1_3_2_4:
2019-08-15 16:36:16 -07:00
case FO_1_4_3_2:
2017-03-23 19:01:10 -07:00
return 4;
// 5 cylinder
case FO_1_2_4_5_3:
return 5;
// 6 cylinder
case FO_1_5_3_6_2_4:
case FO_1_4_2_5_3_6:
case FO_1_2_3_4_5_6:
case FO_1_6_3_2_5_4:
2021-07-08 17:42:35 -07:00
case FO_1_4_3_6_2_5:
2021-08-24 04:28:56 -07:00
case FO_1_6_2_4_3_5:
2021-09-17 21:18:06 -07:00
case FO_1_6_5_4_3_2:
case FO_1_4_5_2_3_6:
2017-03-23 19:01:10 -07:00
return 6;
// 8 cylinder
case FO_1_8_4_3_6_5_7_2:
case FO_1_8_7_2_6_5_4_3:
case FO_1_5_4_2_6_3_7_8:
2019-09-28 07:25:57 -07:00
case FO_1_2_7_8_4_5_6_3:
2020-04-29 13:46:59 -07:00
case FO_1_3_7_2_6_5_4_8:
case FO_1_2_3_4_5_6_7_8:
case FO_1_5_4_8_6_3_7_2:
case FO_1_8_7_3_6_5_4_2:
2017-03-23 19:01:10 -07:00
return 8;
2020-04-29 13:46:59 -07:00
// 9 cylinder radial
case FO_1_2_3_4_5_6_7_8_9:
return 9;
2017-03-23 19:01:10 -07:00
// 10 cylinder
case FO_1_10_9_4_3_6_5_8_7_2:
return 10;
// 12 cylinder
case FO_1_7_5_11_3_9_6_12_2_8_4_10:
2017-06-08 17:35:42 -07:00
case FO_1_7_4_10_2_8_6_12_3_9_5_11:
case FO_1_12_5_8_3_10_6_7_2_11_4_9:
2020-05-21 17:44:14 -07:00
case FO_1_2_3_4_5_6_7_8_9_10_11_12:
2017-03-23 19:01:10 -07:00
return 12;
2020-05-21 15:28:35 -07:00
case FO_1_14_9_4_7_12_15_6_13_8_3_16_11_2_5_10:
return 16;
2017-03-23 19:01:10 -07:00
default:
firmwareError(CUSTOM_OBD_UNKNOWN_FIRING_ORDER, "Invalid firing order: %d", CONFIG(specs.firingOrder));
2017-03-23 19:01:10 -07:00
}
return 1;
}
static const int *getFiringOrderTable(DECLARE_ENGINE_PARAMETER_SIGNATURE)
{
2017-03-23 19:01:10 -07:00
switch (CONFIG(specs.firingOrder)) {
2016-07-20 16:04:27 -07:00
case FO_1:
return order_1;
2015-09-10 16:01:32 -07:00
// 2 cylinder
2016-07-20 16:04:27 -07:00
case FO_1_2:
return order_1_2;
2015-09-10 16:01:32 -07:00
// 3 cylinder
case FO_1_2_3:
return order_1_2_3;
case FO_1_3_2:
return order_1_3_2;
2015-07-10 06:01:56 -07:00
// 4 cylinder
2016-07-20 16:04:27 -07:00
case FO_1_3_4_2:
return order_1_THEN_3_THEN_4_THEN2;
2016-07-20 16:04:27 -07:00
case FO_1_2_4_3:
return order_1_THEN_2_THEN_4_THEN3;
2016-07-20 16:04:27 -07:00
case FO_1_3_2_4:
return order_1_THEN_3_THEN_2_THEN4;
2019-08-15 16:36:16 -07:00
case FO_1_4_3_2:
return order_1_THEN_4_THEN_3_THEN2;
2015-07-10 06:01:56 -07:00
// 5 cylinder
case FO_1_2_4_5_3:
return order_1_2_4_5_3;
2015-07-10 06:01:56 -07:00
// 6 cylinder
2016-07-20 16:04:27 -07:00
case FO_1_5_3_6_2_4:
return order_1_THEN_5_THEN_3_THEN_6_THEN_2_THEN_4;
2016-07-20 16:04:27 -07:00
case FO_1_4_2_5_3_6:
return order_1_THEN_4_THEN_2_THEN_5_THEN_3_THEN_6;
2016-07-20 16:04:27 -07:00
case FO_1_2_3_4_5_6:
return order_1_THEN_2_THEN_3_THEN_4_THEN_5_THEN_6;
2017-01-12 21:03:30 -08:00
case FO_1_6_3_2_5_4:
return order_1_6_3_2_5_4;
2021-07-08 17:42:35 -07:00
case FO_1_4_3_6_2_5:
return order_1_4_3_6_2_5;
2021-08-24 04:28:56 -07:00
case FO_1_6_2_4_3_5:
2021-08-24 04:31:55 -07:00
return order_1_6_2_4_3_5;
2021-09-17 21:18:06 -07:00
case FO_1_6_5_4_3_2:
return order_1_6_5_4_3_2;
case FO_1_4_5_2_3_6:
return order_1_4_5_2_3_6;
2015-09-05 20:02:46 -07:00
2015-07-10 06:01:56 -07:00
// 8 cylinder
case FO_1_8_4_3_6_5_7_2:
return order_1_8_4_3_6_5_7_2;
2016-05-22 10:07:12 -07:00
case FO_1_8_7_2_6_5_4_3:
return order_1_8_7_2_6_5_4_3;
2016-06-05 17:03:16 -07:00
case FO_1_5_4_2_6_3_7_8:
return order_1_5_4_2_6_3_7_8;
2019-09-28 07:25:57 -07:00
case FO_1_2_7_8_4_5_6_3:
return order_1_2_7_8_4_5_6_3;
2020-04-29 13:46:59 -07:00
case FO_1_3_7_2_6_5_4_8:
return order_1_3_7_2_6_5_4_8;
case FO_1_2_3_4_5_6_7_8:
return order_1_2_3_4_5_6_7_8;
case FO_1_5_4_8_6_3_7_2:
return order_1_5_4_8_6_3_7_2;
case FO_1_8_7_3_6_5_4_2:
return order_1_8_7_3_6_5_4_2;
2020-04-29 13:46:59 -07:00
// 9 cylinder
2020-04-29 13:46:59 -07:00
case FO_1_2_3_4_5_6_7_8_9:
return order_1_2_3_4_5_6_7_8_9;
2020-04-29 13:46:59 -07:00
2015-07-10 06:01:56 -07:00
2017-02-07 22:03:36 -08:00
// 10 cylinder
case FO_1_10_9_4_3_6_5_8_7_2:
return order_1_10_9_4_3_6_5_8_7_2;
2017-02-07 22:03:36 -08:00
// 12 cylinder
case FO_1_7_5_11_3_9_6_12_2_8_4_10:
return order_1_7_5_11_3_9_6_12_2_8_4_10;
2017-06-08 17:35:42 -07:00
case FO_1_7_4_10_2_8_6_12_3_9_5_11:
return order_1_7_4_10_2_8_6_12_3_9_5_11;
case FO_1_12_5_8_3_10_6_7_2_11_4_9:
return order_1_12_5_8_3_10_6_7_2_11_4_9;
2020-05-21 17:44:14 -07:00
case FO_1_2_3_4_5_6_7_8_9_10_11_12:
return order_1_2_3_4_5_6_7_8_9_10_11_12;
2017-02-07 22:03:36 -08:00
2020-05-21 15:28:35 -07:00
// do not ask
case FO_1_14_9_4_7_12_15_6_13_8_3_16_11_2_5_10:
return order_1_14_9_4_7_12_15_6_13_8_3_16_11_2_5_10;
2020-05-21 15:28:35 -07:00
2015-07-10 06:01:56 -07:00
default:
firmwareError(CUSTOM_OBD_UNKNOWN_FIRING_ORDER, "Invalid firing order: %d", CONFIG(specs.firingOrder));
2015-07-10 06:01:56 -07:00
}
return NULL;
}
/**
* @param index from zero to cylindersCount - 1
* @return cylinderId from one to cylindersCount
*/
int getCylinderId(int index DECLARE_ENGINE_PARAMETER_SUFFIX) {
const int firingOrderLength = getFiringOrderLength(PASS_ENGINE_PARAMETER_SIGNATURE);
if (firingOrderLength < 1 || firingOrderLength > MAX_CYLINDER_COUNT) {
2021-10-02 22:30:42 -07:00
firmwareError(CUSTOM_FIRING_LENGTH, "fol %d", firingOrderLength);
return 1;
}
if (engineConfiguration->specs.cylindersCount != firingOrderLength) {
// May 2020 this somehow still happens with functional tests, maybe race condition?
firmwareError(CUSTOM_OBD_WRONG_FIRING_ORDER, "Wrong cyl count for firing order, expected %d cylinders", firingOrderLength);
return 1;
}
if (index < 0 || index >= firingOrderLength) {
// May 2020 this somehow still happens with functional tests, maybe race condition?
warning(CUSTOM_ERR_6686, "firing order index %d", index);
return 1;
}
const int *firingOrderTable = getFiringOrderTable(PASS_ENGINE_PARAMETER_SIGNATURE);
if (firingOrderTable)
return firingOrderTable[index];
/* else
error already reported */
return 1;
}
/**
* @param prevCylinderId from one to cylindersCount
* @return cylinderId from one to cylindersCount
*/
int getNextFiringCylinderId(int prevCylinderId DECLARE_ENGINE_PARAMETER_SUFFIX) {
const int firingOrderLength = getFiringOrderLength(PASS_ENGINE_PARAMETER_SIGNATURE);
const int *firingOrderTable = getFiringOrderTable(PASS_ENGINE_PARAMETER_SIGNATURE);
if (firingOrderTable) {
for (size_t i = 0; i < firingOrderLength; i++)
if (firingOrderTable[i] == prevCylinderId)
return firingOrderTable[(i + 1) % firingOrderLength];
}
2015-07-10 06:01:56 -07:00
return 1;
}
2019-10-26 18:53:22 -07:00
/**
2019-11-17 06:18:43 -08:00
* @param cylinderIndex from 0 to cylinderCount, not cylinder number
2019-10-26 18:53:22 -07:00
*/
static int getIgnitionPinForIndex(int cylinderIndex DECLARE_ENGINE_PARAMETER_SUFFIX) {
switch (getCurrentIgnitionMode(PASS_ENGINE_PARAMETER_SIGNATURE)) {
2015-07-10 06:01:56 -07:00
case IM_ONE_COIL:
2016-01-16 14:02:38 -08:00
return 0;
2015-07-10 06:01:56 -07:00
case IM_WASTED_SPARK: {
2019-10-10 04:07:59 -07:00
if (CONFIG(specs.cylindersCount) == 1) {
// we do not want to divide by zero
return 0;
}
2019-10-26 18:53:22 -07:00
return cylinderIndex % (CONFIG(specs.cylindersCount) / 2);
2015-07-10 06:01:56 -07:00
}
case IM_INDIVIDUAL_COILS:
2019-10-26 18:53:22 -07:00
return cylinderIndex;
2019-10-27 13:19:59 -07:00
case IM_TWO_COILS:
return cylinderIndex % 2;
2015-07-10 06:01:56 -07:00
default:
firmwareError(CUSTOM_OBD_IGNITION_MODE, "Invalid ignition mode getIgnitionPinForIndex(): %d", engineConfiguration->ignitionMode);
2016-01-16 14:02:38 -08:00
return 0;
2015-07-10 06:01:56 -07:00
}
}
void prepareIgnitionPinIndices(ignition_mode_e ignitionMode DECLARE_ENGINE_PARAMETER_SUFFIX) {
(void)ignitionMode;
2019-04-12 19:07:03 -07:00
#if EFI_ENGINE_CONTROL
for (size_t cylinderIndex = 0; cylinderIndex < CONFIG(specs.cylindersCount); cylinderIndex++) {
2020-12-20 16:31:14 -08:00
ENGINE(ignitionPin[cylinderIndex]) = getIgnitionPinForIndex(cylinderIndex PASS_ENGINE_PARAMETER_SUFFIX);
}
2020-12-20 16:31:14 -08:00
#endif /* EFI_ENGINE_CONTROL */
}
/**
* @return IM_WASTED_SPARK if in SPINNING mode and IM_INDIVIDUAL_COILS setting
* @return CONFIG(ignitionMode) otherwise
*/
ignition_mode_e getCurrentIgnitionMode(DECLARE_ENGINE_PARAMETER_SIGNATURE) {
ignition_mode_e ignitionMode = CONFIG(ignitionMode);
2019-04-12 19:07:03 -07:00
#if EFI_SHAFT_POSITION_INPUT
// In spin-up cranking mode we don't have full phase sync. info yet, so wasted spark mode is better
if (ignitionMode == IM_INDIVIDUAL_COILS && ENGINE(rpmCalculator.isSpinningUp()))
ignitionMode = IM_WASTED_SPARK;
2019-01-31 14:55:23 -08:00
#endif /* EFI_SHAFT_POSITION_INPUT */
return ignitionMode;
}
2019-04-12 19:07:03 -07:00
#if EFI_ENGINE_CONTROL
2015-07-10 06:01:56 -07:00
2016-01-14 21:01:42 -08:00
/**
* This heavy method is only invoked in case of a configuration change or initialization.
*/
2017-05-15 20:28:49 -07:00
void prepareOutputSignals(DECLARE_ENGINE_PARAMETER_SIGNATURE) {
ENGINE(engineCycle) = getEngineCycle(engine->getOperationMode(PASS_ENGINE_PARAMETER_SIGNATURE));
2015-07-10 06:01:56 -07:00
2021-11-06 21:09:17 -07:00
angle_t maxTimingCorrMap = -FOUR_STROKE_CYCLE_DURATION;
angle_t maxTimingMap = -FOUR_STROKE_CYCLE_DURATION;
2016-11-11 16:02:29 -08:00
for (int rpmIndex = 0;rpmIndex<IGN_RPM_COUNT;rpmIndex++) {
for (int l = 0;l<IGN_LOAD_COUNT;l++) {
maxTimingCorrMap = maxF(maxTimingCorrMap, config->ignitionIatCorrTable[l][rpmIndex]);
maxTimingMap = maxF(maxTimingMap, config->ignitionTable[l][rpmIndex]);
}
}
2016-10-31 19:02:12 -07:00
#if EFI_UNIT_TEST
2019-08-24 22:15:18 -07:00
if (verboseMode) {
printf("prepareOutputSignals %d onlyEdge=%s %s\r\n", engineConfiguration->trigger.type, boolToString(engineConfiguration->useOnlyRisingEdgeForTrigger),
getIgnition_mode_e(engineConfiguration->ignitionMode));
}
2018-03-03 06:11:49 -08:00
#endif /* EFI_UNIT_TEST */
2016-10-31 19:02:12 -07:00
for (size_t i = 0; i < CONFIG(specs.cylindersCount); i++) {
2019-10-26 18:53:22 -07:00
ENGINE(ignitionPositionWithinEngineCycle[i]) = ENGINE(engineCycle) * i / CONFIG(specs.cylindersCount);
2015-07-10 06:01:56 -07:00
}
prepareIgnitionPinIndices(CONFIG(ignitionMode) PASS_ENGINE_PARAMETER_SUFFIX);
2020-08-25 09:45:18 -07:00
TRIGGER_WAVEFORM(prepareShape(&ENGINE(triggerCentral.triggerFormDetails) PASS_ENGINE_PARAMETER_SUFFIX));
// Fuel schedule may now be completely wrong, force a reset
ENGINE(injectionEvents).invalidate();
2015-07-10 06:01:56 -07:00
}
void setTimingRpmBin(float from, float to DECLARE_CONFIG_PARAMETER_SUFFIX) {
2016-01-21 19:01:31 -08:00
setRpmBin(config->ignitionRpmBins, IGN_RPM_COUNT, from, to);
2015-07-10 06:01:56 -07:00
}
void setTimingLoadBin(float from, float to DECLARE_CONFIG_PARAMETER_SUFFIX) {
setLinearCurve(config->ignitionLoadBins, from, to);
2015-07-10 06:01:56 -07:00
}
/**
* this method sets algorithm and ignition table scale
*/
void setAlgorithm(engine_load_mode_e algo DECLARE_CONFIG_PARAMETER_SUFFIX) {
2016-08-28 13:02:34 -07:00
engineConfiguration->fuelAlgorithm = algo;
2020-07-29 01:35:17 -07:00
if (algo == LM_SPEED_DENSITY) {
setLinearCurve(config->ignitionLoadBins, 20, 120, 3);
buildTimingMap(35 PASS_CONFIG_PARAMETER_SUFFIX);
2015-07-10 06:01:56 -07:00
}
}
2016-07-24 20:02:52 -07:00
void setFlatInjectorLag(float value DECLARE_CONFIG_PARAMETER_SUFFIX) {
setArrayValues(engineConfiguration->injector.battLagCorr, value);
2016-07-24 20:02:52 -07:00
}
#endif /* EFI_ENGINE_CONTROL */