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
113
120
121/**
122 * this hook is about https://github.com/rusefi/rusefi/wiki/Custom-Firmware and https://github.com/rusefi/rusefi/wiki/Canned-Tune-Process
123 * todo: why two hooks? is one already dead?
124 */
126 // placeholder
127}
128
129void boardOnConfigurationChange(engine_configuration_s* /*previousConfiguration*/) {
130 // placeholder
131}
132
133/**
134 * this is the top-level method which should be called in case of any changes to engine configuration
135 * online tuning of most values in the maps does not count as configuration change, but 'Burn' command does
136 *
137 * this method is NOT currently invoked on ECU start - actual user input has to happen!
138 * See 'preCalculate' or 'startHardware' which are invoked BOTH on start and configuration change
139 */
142 assertStackVoid("increment", ObdCode::STACK_USAGE_MISC, EXPECTED_REMAINING_STACK);
144 criticalError("too early to invoke incrementGlobalConfigurationVersion %s", msg);
145 }
147#if EFI_DETAILED_LOGGING
148 efiPrintf("set globalConfigurationVersion=%d", globalConfigurationVersion);
149#endif /* EFI_DETAILED_LOGGING */
150
152
154
156
157#if EFI_ELECTRONIC_THROTTLE_BODY
159#endif /* EFI_ELECTRONIC_THROTTLE_BODY */
160
161#if EFI_ENGINE_CONTROL && EFI_PROD_CODE
163#endif
164
165#if EFI_SHAFT_POSITION_INPUT
167#endif /* EFI_SHAFT_POSITION_INPUT */
168#if EFI_EMULATE_POSITION_SENSORS && ! EFI_UNIT_TEST
170#endif /* EFI_EMULATE_POSITION_SENSORS */
171
172 engine->engineModules.apply_all([](auto & m) {
173 m.onConfigurationChange(&activeConfiguration);
174 });
176}
177
178/**
179 * @brief Sets the same dwell time across the whole getRpm() range
180 * set dwell X
181 */
183 for (int i = 0; i < DWELL_CURVE_SIZE; i++) {
184 config->sparkDwellRpmBins[i] = 1000 * i;
185 }
187}
188
189void setFuelTablesLoadBin(float minValue, float maxValue) {
190 setLinearCurve(config->injPhaseLoadBins, minValue, maxValue, 1);
191 setLinearCurve(config->veLoadBins, minValue, maxValue, 1);
192 setLinearCurve(config->lambdaLoadBins, minValue, maxValue, 1);
193}
194
195void setWholeIatCorrTimingTable(float value) {
197}
198
199/**
200 * See also crankingTimingAngle
201 */
204}
205
206#if EFI_ENGINE_CONTROL
207namespace {
208 void initTemperatureCurve(
209 float * const bins,
210 float * const values,
211 const int size,
212 const float defaultValue,
213 const float initialTemperature = -40.0f,
214 const float temperatureStep = 10.0f
215 ) {
216 for (int i = 0; i < size; i++) {
217 bins[i] = initialTemperature + i * temperatureStep;
218 values[i] = defaultValue; // this correction is a multiplier
219 }
220 }
221
222 void initBoostTemperatureCurve(float* const bins, float* const values, const float defaultValue) {
223 initTemperatureCurve(bins, values, BOOST_CURVE_SIZE, defaultValue, 20.0f, 20.0f);
224 }
225}
226#endif // EFI_ENGINE_CONTROL
227
229 criticalAssertVoid(p_engineConfiguration != nullptr, "ec NULL");
230 efi::clear(p_engineConfiguration);
231
232 p_engineConfiguration->clutchDownPinMode = PI_PULLUP;
233 p_engineConfiguration->clutchUpPinMode = PI_PULLUP;
234 p_engineConfiguration->brakePedalPinMode = PI_PULLUP;
235}
236
238#if EFI_PROD_CODE
239 // call overrided board-specific serial configuration setup, if needed (for custom boards only)
240 // needed also by bootloader code
242#endif /* EFI_PROD_CODE */
243
244 // set UART pads configuration based on the board
245// needed also by bootloader code
246#ifdef TS_SECONDARY_UxART_PORT
249#endif // TS_SECONDARY_UxART_PORT
250
253}
254
255// needed also by bootloader code
256// at the moment bootloader does NOT really need SD card, this is a step towards future bootloader SD card usage
260
261#if EFI_ENGINE_CONTROL
262
263/**
264 * see also setTargetRpmCurve()
265 */
267#if CLT_CURVE_SIZE == 16
268 copyArray(config->cltIdleRpmBins, { -30, - 20, -10, 0, 10, 20, 30, 40, 50, 60, 70, 80, 90, 100 , 110, 120 });
269 copyArray(config->cltIdleRpm, { 1350, 1350, 1300, 1200, 1150, 1100, 1050, 1000, 1000, 950, 950, 930, 900, 900, 1000, 1100 });
270#endif // CLT_CURVE_SIZE
271}
272#endif // EFI_ENGINE_CONTROL
273
274/**
275 * see also setDefaultIdleSpeedTarget()
276 */
277void setTargetRpmCurve(float rpm) {
278 setLinearCurve(config->cltIdleRpmBins, CLT_CURVE_RANGE_FROM, 140, 10);
279 setLinearCurve(config->cltIdleRpm, rpm, rpm, 10);
280}
281
283 // Same config for all channels
284 for (size_t i = 0; i < efi::size(engineConfiguration->gppwm); i++) {
285 auto& cfg = engineConfiguration->gppwm[i];
286 chsnprintf(engineConfiguration->gpPwmNote[i], sizeof(engineConfiguration->gpPwmNote[0]), "GPPWM%d", i);
287
288 // Set default axes
289 cfg.loadAxis = GPPWM_Zero;
290 cfg.rpmAxis = GPPWM_Rpm;
291
292 cfg.pin = Gpio::Unassigned;
293 cfg.dutyIfError = 0;
294 cfg.onAboveDuty = 60;
295 cfg.offBelowDuty = 50;
296 cfg.pwmFrequency = 250;
297
298 for (size_t j = 0; j < efi::size(cfg.loadBins); j++) {
299 uint8_t z = j * 100 / (efi::size(cfg.loadBins) - 1);
300 cfg.loadBins[j] = z;
301
302 // Fill some values in the table
303 for (size_t k = 0; k < efi::size(cfg.rpmBins); k++) {
304 cfg.table[j][k] = z;
305 }
306
307 }
308
309 for (size_t j = 0; j < efi::size(cfg.rpmBins); j++) {
310 cfg.rpmBins[j] = 1000 * j;
311 }
312 }
313}
314
318
319#if EFI_ENGINE_CONTROL
328#endif // EFI_ENGINE_CONTROL
329
331 // OBD-II default rate is 500kbps
334#if (EFI_CAN_BUS_COUNT >= 3)
336#endif
337
342
343 // Don't enable, but set default address
344 engineConfiguration->verboseCanBaseAddress = CAN_DEFAULT_BASE;
345}
346
357
360 setLinearCurve(config->cltIdleCorrBins, CLT_CURVE_RANGE_FROM, 140, 10);
361 for (size_t i = 0; i < CLT_IDLE_TABLE_RPM_SIZE; i++) {
362 setLinearCurve(config->cltIdleCorrTable[i], 75.0, 50, 5);
363 }
364}
365
366/**
367 * @brief Global default engine configuration
368 * This method sets the global engine configuration defaults. These default values are then
369 * overridden by engine-specific defaults and the settings are saved in flash memory.
370 *
371 * This method is invoked only when new configuration is needed:
372 * * recently re-flashed chip
373 * * flash version of configuration failed CRC check or appears to be older then FLASH_DATA_VERSION
374 * * 'rewriteconfig' command
375 * * 'set engine_type X' command
376 *
377 * This method should only change the state of the configuration data structure but should NOT change the state of
378 * anything else.
379 *
380 * This method should NOT be setting any default pinout
381 */
383#if (! EFI_UNIT_TEST)
385#endif
387
388#if EFI_BOOST_CONTROL
390#endif
391
393
395
399
400#if EFI_ENGINE_CONTROL
405
406 // VVT closed loop, totally random values!
413
414 engineConfiguration->vvtOutputFrequency = DEFAULT_SOLENOID_FREQUENCY; // VVT solenoid control
415
417
422
424
425#if EFI_IDLE_CONTROL
427#endif /* EFI_IDLE_CONTROL */
428
429#if EFI_ELECTRONIC_THROTTLE_BODY
432#endif /* EFI_ELECTRONIC_THROTTLE_BODY */
433
435
438
440
444
445 initTemperatureCurve(IAT_FUEL_CORRECTION_CURVE, 1);
446
447 initBoostTemperatureCurve(config->cltBoostCorrBins, config->cltBoostCorr, 1.0f);
448 initBoostTemperatureCurve(config->iatBoostCorrBins, config->iatBoostCorr, 1.0f);
449 initBoostTemperatureCurve(config->cltBoostAdderBins, config->cltBoostAdder, 0.0f);
450 initBoostTemperatureCurve(config->iatBoostAdderBins, config->iatBoostAdder, 0.0f);
451
454
457
458 setLinearCurve(config->scriptCurve2Bins, 0, 100, /*precision*/1);
459 setLinearCurve(config->scriptCurve2, 30, 170, 1);
460
465
466 setLinearCurve(config->alsIgnRetardLoadBins, 2, 10, /*precision*/1);
468 setLinearCurve(config->alsFuelAdjustmentLoadBins, 2, 10, /*precision*/1);
471
472
477
478#if VVT_TABLE_SIZE == 8
481#else
484#endif
487
489
490 // is this same old setCommonNTCSensor?
491 engineConfiguration->clt.config = {0, 23.8889, 48.8889, 9500, 2100, 1000, 1500};
492
494
495 // wow unit tests have much cooler setDefaultLaunchParameters method
497// engineConfiguration->launchTimingRetard = 10;
500
502
503 /**
504 * Idle control defaults
505 */
507 // setTargetRpmCurve(1200);
508
511
514 /**
515 * between variation between different sensor and weather and fabrication tolerance
516 * five percent looks like a safer default
517 */
519
520 engineConfiguration->idle.solenoidFrequency = DEFAULT_SOLENOID_FREQUENCY;
521 // set idle_position 50
523// engineConfiguration->idleMode = IM_AUTO;
525
527
529
530#if !EFI_UNIT_TEST
532#endif
533
534
539
544
545 engineConfiguration->idlePositionMin = PACK_MULT_VOLTAGE * 0;
546 engineConfiguration->idlePositionMax = PACK_MULT_VOLTAGE * 5;
551
555 engineConfiguration->oilPressure.value2 = 689.476f; // 100psi = 689.476kPa
556
558 // todo: start using this for custom MAP
560
562
564
565 setEgoSensor(ES_14Point7_Free);
566
568
569 engineConfiguration->map.sensor.type = MT_MPX4250;
570
574
575#if EFI_PROD_CODE
577#else
578 // need more events for automated test
580#endif
581
582#if EFI_PROD_CODE || EFI_SIMULATOR
583 // some tests broke with map averaging, see https://github.com/rusefi/rusefi/issues/7868
585#endif
587
594
601
602 engineConfiguration->triggerSimulatorRpm = DEFAULT_SELT_STIM_RPM;
603 engineConfiguration->simulatorCamPosition[0] = DEFAULT_SELT_STIM_VVT0;
604
605 engineConfiguration->alternatorPwmFrequency = DEFAULT_SOLENOID_FREQUENCY;
606
608
613
615 // todo: default limits should be hard-coded for each sensor type
616 // https://github.com/rusefi/rusefi/issues/4030
618
620#endif // EFI_ENGINE_CONTROL
621 #include "default_script.lua"
622}
623
624#if defined(STM32F7) && defined(HARDWARE_CI)
625// part of F7 drama looks like we are having a hard time erasing configuration on HW CI :(
626#define IGNORE_FLASH_CONFIGURATION true
627#endif
628
629// by default, do not ignore config from flash! use it!
630#ifndef IGNORE_FLASH_CONFIGURATION
631#define IGNORE_FLASH_CONFIGURATION false
632#endif
633
635
636#if ! EFI_ACTIVE_CONFIGURATION_IN_FLASH
637 // Clear the active configuration so that registered output pins (etc) detect the change on startup and init properly
639#endif /* EFI_ACTIVE_CONFIGURATION_IN_FLASH */
640
641 /* If board have any storage */
642#if EFI_CONFIGURATION_STORAGE
643 if (IGNORE_FLASH_CONFIGURATION) {
644 engineConfiguration->engineType = DEFAULT_ENGINE_TYPE;
647 } else {
648 // this call reads configuration from flash memory or sets default configuration
649 // if flash state does not look right.
651 }
652#else
653 // This board doesn't load configuration, initialize the default
654 engineConfiguration->engineType = DEFAULT_ENGINE_TYPE;
656#endif /* EFI_CONFIGURATION_STORAGE */
657
658 // Force any board configuration options that humans shouldn't be able to change
660}
661
663 enginePins.reset(); // that's mostly important for functional tests
664 /**
665 * Let's apply global defaults first
666 */
668
669 /**
670 * custom board engine defaults. Yes, this overlaps with (older) engine_type_e approach.
671 */
673
674 // set initial pin groups
676
677 if (boardCallback != nullptr) {
678 boardCallback(engineConfiguration);
679 }
680
681#if EFI_PROD_CODE
682 // call board-specific configuration setup, if needed (for custom boards only)
685#endif // EFI_PROD_CODE
686
687 engineConfiguration->engineType = engineType;
688 applyEngineType(engineType);
690}
691
693 UNUSED(p_engineConfiguration);
694}
695
699
701#if EFI_PROD_CODE
702 efiAssertVoid(ObdCode::CUSTOM_APPLY_STACK, hasLotsOfRemainingStack(), "apply c");
703 efiPrintf("applyNonPersistentConfiguration()");
704#endif
705
706#if EFI_ENGINE_CONTROL
708#endif // EFI_ENGINE_CONTROL
709}
710
714
716 // this is related to 'setDefaultBaseEngine' having 'skippedWheelOnCam = true' which is a weird fact by itself
718}
719
721 /**
722 * VBatt
723 */
725}
726
728 // custom_board_DefaultConfiguration
729}
731 // time to force migration to custom_board_ConfigOverrides
732}
733
734PUBLIC_API_WEAK int hackHellenBoardId(int detectedId) { return detectedId; }
735
736PUBLIC_API_WEAK void onBoardStandBy() { }
737
738PUBLIC_API_WEAK_SOMETHING_WEIRD int getBoardMetaOutputsCount() { return 0; }
739// default implementation: treat all outputs as low side
741PUBLIC_API_WEAK Gpio* getBoardMetaOutputs() { return nullptr; }
742PUBLIC_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
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)