rusEFI
The most advanced open source ECU
Loading...
Searching...
No Matches
engine_configuration.cpp
Go to the documentation of this file.
1/**
2 * @file engine_configuration.cpp
3 * @brief Utility method related to the engine configuration data structure.
4 *
5 * @date Nov 22, 2013
6 * @author Andrey Belomutskiy, (c) 2012-2020
7 *
8 * This file is part of rusEfi - see http://rusefi.com
9 *
10 * rusEfi is free software; you can redistribute it and/or modify it under the terms of
11 * the GNU General Public License as published by the Free Software Foundation; either
12 * version 3 of the License, or (at your option) any later version.
13 *
14 * rusEfi is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without
15 * even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
16 * GNU General Public License for more details.
17 *
18 * You should have received a copy of the GNU General Public License along with this program.
19 * If not, see <http://www.gnu.org/licenses/>.
20 *
21 */
22
23#include "pch.h"
24#include "transition_events.h"
25#include "speed_density.h"
26#include "flash_main.h"
27
28#include "bench_test.h"
29
30#if EFI_ONBOARD_MEMS
31#include "accelerometer.h"
32#endif // EFI_ONBOARD_MEMS
33
34#include "defaults.h"
35
36#include "custom_engine.h"
37
38#include "boost_control.h"
40#if EFI_IDLE_CONTROL
41#include "idle_thread.h"
42#endif /* EFI_IDLE_CONTROL */
43
44#if EFI_ALTERNATOR_CONTROL
46#endif
47
48#if EFI_ELECTRONIC_THROTTLE_BODY
49#include "electronic_throttle.h"
50#endif
51
52#include "hardware.h"
53
54#if EFI_PROD_CODE
55#include "board.h"
56#endif /* EFI_PROD_CODE */
57
58#if EFI_EMULATE_POSITION_SENSORS
60#endif /* EFI_EMULATE_POSITION_SENSORS */
61
62#if EFI_TUNER_STUDIO
63#include "tunerstudio.h"
64#endif
65
66#include "board_overrides.h"
67
68#define TS_DEFAULT_SPEED 38400
69
70std::optional<setup_custom_board_overrides_type> custom_board_DefaultConfiguration;
71std::optional<setup_custom_board_overrides_type> custom_board_ConfigOverrides;
72std::optional<setup_custom_board_config_type> custom_board_OnConfigurationChange;
73
74/**
75 * Current engine configuration. On firmware start we assign empty configuration, then
76 * we copy actual configuration after reading settings from flash.
77 * This is useful to compare old/current (activeConfiguration) and new/future (engineConfiguration) configurations in order to apply new settings.
78 *
79 * todo: place this field next to 'engineConfiguration'?
80 */
81static bool hasRememberedConfiguration = false;
82#if EFI_ACTIVE_CONFIGURATION_IN_FLASH
83#include "flash_int.h"
84engine_configuration_s & activeConfiguration = reinterpret_cast<persistent_config_container_s*>(getFlashAddrFirstCopy())->persistentConfiguration.engineConfiguration;
85// we cannot use this activeConfiguration until we call rememberCurrentConfiguration()
87#else
90#endif /* EFI_ACTIVE_CONFIGURATION_IN_FLASH */
91
93#if ! EFI_ACTIVE_CONFIGURATION_IN_FLASH
95#else
97#endif /* EFI_ACTIVE_CONFIGURATION_IN_FLASH */
99}
100
101static void fillAfterString(char *string, int size) {
102 // we have to reset bytes after \0 symbol in order to calculate correct tune CRC from MSQ file
103 for (int i = std::strlen(string) + 1; i < size; i++) {
104 string[i] = 0;
105 }
106}
107
114
121
122/**
123 * this hook is about https://wiki.rusefi.com/Custom-Firmware and https://wiki.rusefi.com/Canned-Tune-Process
124 * todo: why two hooks? is one already dead?
125 */
127 // placeholder
128}
129
130void boardOnConfigurationChange(engine_configuration_s* /*previousConfiguration*/) {
131 // placeholder
132}
133
134/**
135 * this is the top-level method which should be called in case of any changes to engine configuration
136 * online tuning of most values in the maps does not count as configuration change, but 'Burn' command does
137 *
138 * this method is NOT currently invoked on ECU start - actual user input has to happen!
139 * See 'preCalculate' or 'startHardware' which are invoked BOTH on start and configuration change
140 */
143 assertStackVoid("increment", ObdCode::STACK_USAGE_MISC, EXPECTED_REMAINING_STACK);
145 criticalError("too early to invoke incrementGlobalConfigurationVersion %s", msg);
146 }
148#if EFI_DETAILED_LOGGING
149 efiPrintf("set globalConfigurationVersion=%d", globalConfigurationVersion);
150#endif /* EFI_DETAILED_LOGGING */
151
153
155
157
158#if EFI_ELECTRONIC_THROTTLE_BODY
160#endif /* EFI_ELECTRONIC_THROTTLE_BODY */
161
162#if EFI_ENGINE_CONTROL && EFI_PROD_CODE
164#endif
165
166#if EFI_SHAFT_POSITION_INPUT
168#endif /* EFI_SHAFT_POSITION_INPUT */
169#if EFI_EMULATE_POSITION_SENSORS && ! EFI_UNIT_TEST
171#endif /* EFI_EMULATE_POSITION_SENSORS */
172
173 engine->engineModules.apply_all([](auto & m) {
174 m.onConfigurationChange(&activeConfiguration);
175 });
177}
178
179/**
180 * @brief Sets the same dwell time across the whole getRpm() range
181 * set dwell X
182 */
184 for (int i = 0; i < DWELL_CURVE_SIZE; i++) {
185 config->sparkDwellRpmBins[i] = 1000 * i;
186 }
188}
189
190void setFuelTablesLoadBin(float minValue, float maxValue) {
191 setLinearCurve(config->injPhaseLoadBins, minValue, maxValue, 1);
192 setLinearCurve(config->veLoadBins, minValue, maxValue, 1);
193 setLinearCurve(config->lambdaLoadBins, minValue, maxValue, 1);
194}
195
196void setWholeIatCorrTimingTable(float value) {
198}
199
200/**
201 * See also crankingTimingAngle
202 */
205}
206
207#if EFI_ENGINE_CONTROL
208namespace {
209 void initTemperatureCurve(
210 float * const bins,
211 float * const values,
212 const int size,
213 const float defaultValue,
214 const float initialTemperature = -40.0f,
215 const float temperatureStep = 10.0f
216 ) {
217 for (int i = 0; i < size; i++) {
218 bins[i] = initialTemperature + i * temperatureStep;
219 values[i] = defaultValue; // this correction is a multiplier
220 }
221 }
222
223 void initBoostTemperatureCurve(float* const bins, float* const values, const float defaultValue) {
224 initTemperatureCurve(bins, values, BOOST_CURVE_SIZE, defaultValue, 20.0f, 20.0f);
225 }
226}
227#endif // EFI_ENGINE_CONTROL
228
230 criticalAssertVoid(p_engineConfiguration != nullptr, "ec NULL");
231 efi::clear(p_engineConfiguration);
232
233 p_engineConfiguration->clutchDownPinMode = PI_PULLUP;
234 p_engineConfiguration->clutchUpPinMode = PI_PULLUP;
235 p_engineConfiguration->brakePedalPinMode = PI_PULLUP;
236}
237
239#if EFI_PROD_CODE
240 // call overrided board-specific serial configuration setup, if needed (for custom boards only)
241 // needed also by bootloader code
243#endif /* EFI_PROD_CODE */
244
245 // set UART pads configuration based on the board
246// needed also by bootloader code
247#ifdef TS_SECONDARY_UxART_PORT
250#endif // TS_SECONDARY_UxART_PORT
251
254}
255
256// needed also by bootloader code
257// at the moment bootloader does NOT really need SD card, this is a step towards future bootloader SD card usage
261
262#if EFI_ENGINE_CONTROL
263
264/**
265 * see also setTargetRpmCurve()
266 */
268#if CLT_CURVE_SIZE == 16
269 copyArray(config->cltIdleRpmBins, { -30, - 20, -10, 0, 10, 20, 30, 40, 50, 60, 70, 80, 90, 100 , 110, 120 });
270 copyArray(config->cltIdleRpm, { 1350, 1350, 1300, 1200, 1150, 1100, 1050, 1000, 1000, 950, 950, 930, 900, 900, 1000, 1100 });
271#endif // CLT_CURVE_SIZE
272}
273#endif // EFI_ENGINE_CONTROL
274
275/**
276 * see also setDefaultIdleSpeedTarget()
277 */
278void setTargetRpmCurve(float rpm) {
279 setLinearCurve(config->cltIdleRpmBins, CLT_CURVE_RANGE_FROM, 140, 10);
280 setLinearCurve(config->cltIdleRpm, rpm, rpm, 10);
281}
282
284 // Same config for all channels
285 for (size_t i = 0; i < efi::size(engineConfiguration->gppwm); i++) {
286 auto& cfg = engineConfiguration->gppwm[i];
287 chsnprintf(engineConfiguration->gpPwmNote[i], sizeof(engineConfiguration->gpPwmNote[0]), "GPPWM%d", i);
288
289 // Set default axes
290 cfg.loadAxis = GPPWM_Zero;
291 cfg.rpmAxis = GPPWM_Rpm;
292
293 cfg.pin = Gpio::Unassigned;
294 cfg.dutyIfError = 0;
295 cfg.onAboveDuty = 60;
296 cfg.offBelowDuty = 50;
297 cfg.pwmFrequency = 250;
298
299 for (size_t j = 0; j < efi::size(cfg.loadBins); j++) {
300 uint8_t z = j * 100 / (efi::size(cfg.loadBins) - 1);
301 cfg.loadBins[j] = z;
302
303 // Fill some values in the table
304 for (size_t k = 0; k < efi::size(cfg.rpmBins); k++) {
305 cfg.table[j][k] = z;
306 }
307
308 }
309
310 for (size_t j = 0; j < efi::size(cfg.rpmBins); j++) {
311 cfg.rpmBins[j] = 1000 * j;
312 }
313 }
314}
315
319
320#if EFI_ENGINE_CONTROL
329#endif // EFI_ENGINE_CONTROL
330
332 // OBD-II default rate is 500kbps
335#if (EFI_CAN_BUS_COUNT >= 3)
337#endif
338
343
344 // Don't enable, but set default address
345 engineConfiguration->verboseCanBaseAddress = CAN_DEFAULT_BASE;
346}
347
358
361 setLinearCurve(config->cltIdleCorrBins, CLT_CURVE_RANGE_FROM, 140, 10);
362 for (size_t i = 0; i < CLT_IDLE_TABLE_RPM_SIZE; i++) {
363 setLinearCurve(config->cltIdleCorrTable[i], 75.0, 50, 5);
364 }
365}
366
367/**
368 * @brief Global default engine configuration
369 * This method sets the global engine configuration defaults. These default values are then
370 * overridden by engine-specific defaults and the settings are saved in flash memory.
371 *
372 * This method is invoked only when new configuration is needed:
373 * * recently re-flashed chip
374 * * flash version of configuration failed CRC check or appears to be older then FLASH_DATA_VERSION
375 * * 'rewriteconfig' command
376 * * 'set engine_type X' command
377 *
378 * This method should only change the state of the configuration data structure but should NOT change the state of
379 * anything else.
380 *
381 * This method should NOT be setting any default pinout
382 */
384#if (! EFI_UNIT_TEST)
386#endif
388
389#if EFI_BOOST_CONTROL
391#endif
392
394
396
400
401#if EFI_ENGINE_CONTROL
406
407 // VVT closed loop, totally random values!
414
415 engineConfiguration->vvtOutputFrequency = DEFAULT_SOLENOID_FREQUENCY; // VVT solenoid control
416
418
423
425
426#if EFI_IDLE_CONTROL
428#endif /* EFI_IDLE_CONTROL */
429
430#if EFI_ELECTRONIC_THROTTLE_BODY
433#endif /* EFI_ELECTRONIC_THROTTLE_BODY */
434
436
439
441
445
446 initTemperatureCurve(IAT_FUEL_CORRECTION_CURVE, 1);
447
448 initBoostTemperatureCurve(config->cltBoostCorrBins, config->cltBoostCorr, 1.0f);
449 initBoostTemperatureCurve(config->iatBoostCorrBins, config->iatBoostCorr, 1.0f);
450 initBoostTemperatureCurve(config->cltBoostAdderBins, config->cltBoostAdder, 0.0f);
451 initBoostTemperatureCurve(config->iatBoostAdderBins, config->iatBoostAdder, 0.0f);
452
455
458
459 setLinearCurve(config->scriptCurve2Bins, 0, 100, /*precision*/1);
460 setLinearCurve(config->scriptCurve2, 30, 170, 1);
461
466
467 setLinearCurve(config->alsIgnRetardLoadBins, 2, 10, /*precision*/1);
469 setLinearCurve(config->alsFuelAdjustmentLoadBins, 2, 10, /*precision*/1);
472
473
478
479#if VVT_TABLE_SIZE == 8
482#else
485#endif
488
490
491 // is this same old setCommonNTCSensor?
492 engineConfiguration->clt.config = {0, 23.8889, 48.8889, 9500, 2100, 1000, 1500};
493
495
496 // wow unit tests have much cooler setDefaultLaunchParameters method
498// engineConfiguration->launchTimingRetard = 10;
501
503
504 /**
505 * Idle control defaults
506 */
508 // setTargetRpmCurve(1200);
509
512
515 /**
516 * between variation between different sensor and weather and fabrication tolerance
517 * five percent looks like a safer default
518 */
520
521 engineConfiguration->idle.solenoidFrequency = DEFAULT_SOLENOID_FREQUENCY;
522 // set idle_position 50
524// engineConfiguration->idleMode = IM_AUTO;
526
528
530
531#if !EFI_UNIT_TEST
533#endif
534
535
540
545
546 engineConfiguration->idlePositionMin = PACK_MULT_VOLTAGE * 0;
547 engineConfiguration->idlePositionMax = PACK_MULT_VOLTAGE * 5;
552
556 engineConfiguration->oilPressure.value2 = 689.476f; // 100psi = 689.476kPa
557
559 // todo: start using this for custom MAP
561
563
565
566 setEgoSensor(ES_14Point7_Free);
567
569
570 engineConfiguration->map.sensor.type = MT_MPX4250;
571
575
576#if EFI_PROD_CODE
578#else
579 // need more events for automated test
581#endif
582
583#if EFI_PROD_CODE || EFI_SIMULATOR
584 // some tests broke with map averaging, see https://github.com/rusefi/rusefi/issues/7868
586#endif
588
595
602
603 engineConfiguration->triggerSimulatorRpm = DEFAULT_SELT_STIM_RPM;
604 engineConfiguration->simulatorCamPosition[0] = DEFAULT_SELT_STIM_VVT0;
605
606 engineConfiguration->alternatorPwmFrequency = DEFAULT_SOLENOID_FREQUENCY;
607
609
614
616 // todo: default limits should be hard-coded for each sensor type
617 // https://github.com/rusefi/rusefi/issues/4030
619
621#endif // EFI_ENGINE_CONTROL
622 // Allow custom default_script.lua to be provided by BOARDINC
623 // see https://gcc.gnu.org/onlinedocs/gcc-2.95.3/cpp_1.html#SEC6
624 #include <default_script.lua>
625}
626
627#if defined(STM32F7) && defined(HARDWARE_CI)
628// part of F7 drama looks like we are having a hard time erasing configuration on HW CI :(
629#define IGNORE_FLASH_CONFIGURATION true
630#endif
631
632// by default, do not ignore config from flash! use it!
633#ifndef IGNORE_FLASH_CONFIGURATION
634#define IGNORE_FLASH_CONFIGURATION false
635#endif
636
638
639#if ! EFI_ACTIVE_CONFIGURATION_IN_FLASH
640 // Clear the active configuration so that registered output pins (etc) detect the change on startup and init properly
642#endif /* EFI_ACTIVE_CONFIGURATION_IN_FLASH */
643
644 /* If board have any storage */
645#if EFI_CONFIGURATION_STORAGE
646 if (IGNORE_FLASH_CONFIGURATION) {
647 engineConfiguration->engineType = DEFAULT_ENGINE_TYPE;
650 } else {
651 // this call reads configuration from flash memory or sets default configuration
652 // if flash state does not look right.
654 }
655#else
656 // This board doesn't load configuration, initialize the default
657 engineConfiguration->engineType = DEFAULT_ENGINE_TYPE;
659#endif /* EFI_CONFIGURATION_STORAGE */
660
661 // Force any board configuration options that humans shouldn't be able to change
663}
664
666 enginePins.reset(); // that's mostly important for functional tests
667 /**
668 * Let's apply global defaults first
669 */
671
672 /**
673 * custom board engine defaults. Yes, this overlaps with (older) engine_type_e approach.
674 */
676
677 // set initial pin groups
679
680 if (boardCallback != nullptr) {
681 boardCallback(engineConfiguration);
682 }
683
684#if EFI_PROD_CODE
685 // call board-specific configuration setup, if needed (for custom boards only)
688#endif // EFI_PROD_CODE
689
690 engineConfiguration->engineType = engineType;
691 applyEngineType(engineType);
693}
694
696 UNUSED(p_engineConfiguration);
697}
698
702
704#if EFI_PROD_CODE
705 efiAssertVoid(ObdCode::CUSTOM_APPLY_STACK, hasLotsOfRemainingStack(), "apply c");
706 efiPrintf("applyNonPersistentConfiguration()");
707#endif
708
709#if EFI_ENGINE_CONTROL
711#endif // EFI_ENGINE_CONTROL
712}
713
717
719 // this is related to 'setDefaultBaseEngine' having 'skippedWheelOnCam = true' which is a weird fact by itself
721}
722
724 /**
725 * VBatt
726 */
728}
729
731 // custom_board_DefaultConfiguration
732}
734 // time to force migration to custom_board_ConfigOverrides
735}
736
737PUBLIC_API_WEAK int hackHellenBoardId(int detectedId) { return detectedId; }
738
739PUBLIC_API_WEAK void onBoardStandBy() { }
740
741PUBLIC_API_WEAK_SOMETHING_WEIRD int getBoardMetaOutputsCount() { return 0; }
742// default implementation: treat all outputs as low side
744PUBLIC_API_WEAK Gpio* getBoardMetaOutputs() { return nullptr; }
745PUBLIC_API_WEAK int getBoardMetaDcOutputsCount() { return 0; }
alternator controller
void onConfigurationChangeBenchTest()
Utility methods related to bench testing.
static bool call_board_override(std::optional< FuncType > board_override, Args &&... args)
std::optional< setup_custom_board_overrides_type > custom_board_BeforeTuneDefaults
Definition hardware.cpp:79
void setDefaultBoostParameters()
void setPinConfigurationOverrides()
void preCalculate()
Definition engine.cpp:334
int globalConfigurationVersion
Definition engine.h:315
void updateTriggerConfiguration()
Definition engine.cpp:133
type_list< Mockable< InjectorModelPrimary >, Mockable< InjectorModelSecondary >,#if EFI_IDLE_CONTROL Mockable< IdleController >,#endif TriggerScheduler,#if EFI_HPFP &&EFI_ENGINE_CONTROL Mockable< HpfpController >,#endif #if EFI_ENGINE_CONTROL Mockable< ThrottleModel >,#endif #if EFI_ALTERNATOR_CONTROL AlternatorController,#endif MainRelayController, Mockable< IgnitionController >, Mockable< AcController >, PrimeController, DfcoController,#if EFI_HD_ACR HarleyAcr,#endif Mockable< WallFuelController >, KnockController, SensorChecker,#if EFI_ENGINE_CONTROL Mockable< LimpManager >,#endif #if EFI_VVT_PID VvtController1, VvtController2, VvtController3, VvtController4,#endif #if EFI_BOOST_CONTROL BoostController,#endif TpsAccelEnrichment,#if EFI_LAUNCH_CONTROL NitrousController,#endif #if EFI_LTFT_CONTROL LongTermFuelTrim,#endif ShortTermFuelTrim,#include "modules_list_generated.h" EngineModule > engineModules
Definition engine.h:194
void reset()
Definition efi_gpio.cpp:275
@ Unassigned
void setBoschHDEV_5_injectors()
void setTPS1Calibration(uint16_t tpsMin, uint16_t tpsMax)
void setDefaultBaseEngine()
void setDefaultCranking()
void setDefaultFuel()
void setDefaultIgnition()
EnginePins enginePins
Definition efi_gpio.cpp:24
void setEgoSensor(ego_sensor_e type)
Definition ego.cpp:100
void setDefaultEtbParameters()
void onConfigurationChangeElectronicThrottleCallback(engine_configuration_s *previousConfiguration)
void setDefaultEtbBiasCurve()
static EngineAccessor engine
Definition engine.h:413
void setConstantDwell(floatms_t dwellMs)
Sets the same dwell time across the whole getRpm() range set dwell X.
PUBLIC_API_WEAK_SOMETHING_WEIRD int getBoardMetaOutputsCount()
static void setDefaultEngineConfiguration()
Global default engine configuration This method sets the global engine configuration defaults....
void setBoardDefaultConfiguration()
Board-specific configuration defaults.
void emptyCallbackWithConfiguration(engine_configuration_s *p_engineConfiguration)
static void setDefaultBoostOpenLoopParameters()
void onBurnRequest()
static void setDefaultGppwmParameters()
void setCamOperationMode()
void commonFrankensoAnalogInputs()
std::optional< setup_custom_board_overrides_type > custom_board_ConfigOverrides
void setDefaultBasePins()
static void setDefaultIdleOpenLoopParameters()
PUBLIC_API_WEAK int getBoardMetaDcOutputsCount()
PUBLIC_API_WEAK Gpio * getBoardMetaOutputs()
void incrementGlobalConfigurationVersion(const char *msg)
static void setDefaultScriptParameters()
PUBLIC_API_WEAK void onBoardStandBy()
void resetConfigurationExt(configuration_callback_t boardCallback, engine_type_e engineType)
void boardOnConfigurationChange(engine_configuration_s *)
std::optional< setup_custom_board_overrides_type > custom_board_DefaultConfiguration
void setTargetRpmCurve(float rpm)
void setDefaultSdCardParameters()
void setCrankOperationMode()
static engine_configuration_s activeConfigurationLocalStorage
void loadConfiguration()
static void setDefaultEngineNoiseTable()
void setWholeIatCorrTimingTable(float value)
PUBLIC_API_WEAK int hackHellenBoardId(int detectedId)
static bool hasRememberedConfiguration
void boardBeforeTuneDefaults()
void rememberCurrentConfiguration()
void setBoardConfigOverrides()
void applyNonPersistentConfiguration()
static void fillAfterString(char *string, int size)
void setWholeTimingTable(angle_t value)
static void wipeStrings()
std::optional< setup_custom_board_config_type > custom_board_OnConfigurationChange
static void setDefaultIdleSpeedTarget()
void prepareVoidConfiguration(engine_configuration_s *p_engineConfiguration)
bool isActiveConfigurationVoid
void setFuelTablesLoadBin(float minValue, float maxValue)
static void setDefaultCanSettings()
engine_configuration_s & activeConfiguration
PUBLIC_API_WEAK int getBoardMetaLowSideOutputsCount()
static constexpr persistent_config_s * config
void applyEngineType(engine_type_e engineType)
void(* configuration_callback_t)(engine_configuration_s *)
static constexpr engine_configuration_s * engineConfiguration
persistent_config_container_s persistentState
engine_type_e
uintptr_t getFlashAddrFirstCopy(void)
Definition mpu_util.cpp:248
void readFromFlash()
void writeToFlashNow()
void applyNewHardwareSettings()
Definition hardware.cpp:314
Idle Valve Control thread.
void setDefaultIdleParameters()
UNUSED(samplingTimeSeconds)
void setBosch0280218037()
Definition maf.cpp:25
@ STACK_USAGE_MISC
@ CUSTOM_APPLY_STACK
float floatms_t
char[VIN_NUMBER_SIZE] vin_number_t
float angle_t
char[VEHICLE_INFO_SIZE] vehicle_info_t
float cltIdleCorrTable[CLT_IDLE_TABLE_RPM_SIZE][CLT_IDLE_TABLE_CLT_SIZE]
scaled_channel< int16_t, 1, 1 > cltIdleRpmBins[CLT_CURVE_SIZE]
scaled_channel< uint8_t, 1, 100 > iacCoastingRpmBins[CLT_CURVE_SIZE]
scaled_channel< int8_t, 2, 1 > knockBaseNoise[ENGINE_NOISE_CURVE_SIZE]
scaled_channel< uint16_t, 1000, 1 > fuelLevelBins[FUEL_LEVEL_TABLE_COUNT]
scaled_channel< uint16_t, 10, 1 > throttleEstimateEffectiveAreaBins[THR_EST_SIZE]
scaled_channel< uint8_t, 1, 100 > rpmIdleCorrBins[CLT_IDLE_TABLE_RPM_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, 20 > cltIdleRpm[CLT_CURVE_SIZE]
scaled_channel< uint16_t, 100, 1 > sparkDwellValues[DWELL_CURVE_SIZE]
constexpr void setTable(TElement(&dest)[N][M], const VElement value)
void setRpmTableBin(TValue(&array)[TSize])
void setLinearCurve(TValue(&array)[TSize], float from, float to, float precision=0.01f)
void setArrayValues(TValue(&array)[TSize], float value)
void setCommonNTCSensorParameters(ThermistorConf *thermistorConf)
composite packet size
constexpr int convertVoltageTo10bitADC(float voltage)
Definition tps.h:21
void onTransitionEvent(TransitionEvent event)
void onConfigurationChangeTriggerCallback()
void onConfigurationChangeRpmEmulatorCallback(engine_configuration_s *previousConfiguration)