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;
72
73/**
74 * Current engine configuration. On firmware start we assign empty configuration, then
75 * we copy actual configuration after reading settings from flash.
76 * This is useful to compare old/current (activeConfiguration) and new/future (engineConfiguration) configurations in order to apply new settings.
77 *
78 * todo: place this field next to 'engineConfiguration'?
79 */
80static bool hasRememberedConfiguration = false;
81#if EFI_ACTIVE_CONFIGURATION_IN_FLASH
82#include "flash_int.h"
83engine_configuration_s & activeConfiguration = reinterpret_cast<persistent_config_container_s*>(getFlashAddrFirstCopy())->persistentConfiguration.engineConfiguration;
84// we cannot use this activeConfiguration until we call rememberCurrentConfiguration()
86#else
89#endif /* EFI_ACTIVE_CONFIGURATION_IN_FLASH */
90
92#if ! EFI_ACTIVE_CONFIGURATION_IN_FLASH
94#else
96#endif /* EFI_ACTIVE_CONFIGURATION_IN_FLASH */
98}
99
100static void fillAfterString(char *string, int size) {
101 // we have to reset bytes after \0 symbol in order to calculate correct tune CRC from MSQ file
102 for (int i = std::strlen(string) + 1; i < size; i++) {
103 string[i] = 0;
104 }
105}
106
112
119
120/**
121 * this hook is about https://github.com/rusefi/rusefi/wiki/Custom-Firmware and https://github.com/rusefi/rusefi/wiki/Canned-Tune-Process
122 * todo: why two hooks? is one already dead?
123 */
124PUBLIC_API_WEAK void boardBeforeTuneDefaults() { }
125
126// Weak link a stub so that every board doesn't have to implement this function
127PUBLIC_API_WEAK void boardOnConfigurationChange(engine_configuration_s* /*previousConfiguration*/) { }
128
129/**
130 * this is the top-level method which should be called in case of any changes to engine configuration
131 * online tuning of most values in the maps does not count as configuration change, but 'Burn' command does
132 *
133 * this method is NOT currently invoked on ECU start - actual user input has to happen!
134 * See 'preCalculate' or 'startHardware' which are invoked BOTH on start and configuration change
135 */
138 assertStackVoid("increment", ObdCode::STACK_USAGE_MISC, EXPECTED_REMAINING_STACK);
140 criticalError("too early to invoke incrementGlobalConfigurationVersion %s", msg);
141 }
143#if EFI_DETAILED_LOGGING
144 efiPrintf("set globalConfigurationVersion=%d", globalConfigurationVersion);
145#endif /* EFI_DETAILED_LOGGING */
146
148
150
152
153#if EFI_ELECTRONIC_THROTTLE_BODY
155#endif /* EFI_ELECTRONIC_THROTTLE_BODY */
156
157#if EFI_ENGINE_CONTROL && EFI_PROD_CODE
159#endif
160
161#if EFI_SHAFT_POSITION_INPUT
163#endif /* EFI_SHAFT_POSITION_INPUT */
164#if EFI_EMULATE_POSITION_SENSORS && ! EFI_UNIT_TEST
166#endif /* EFI_EMULATE_POSITION_SENSORS */
167
168 engine->engineModules.apply_all([](auto & m) {
169 m.onConfigurationChange(&activeConfiguration);
170 });
172}
173
174/**
175 * @brief Sets the same dwell time across the whole getRpm() range
176 * set dwell X
177 */
179 for (int i = 0; i < DWELL_CURVE_SIZE; i++) {
180 config->sparkDwellRpmBins[i] = 1000 * i;
181 }
183}
184
185void setFuelTablesLoadBin(float minValue, float maxValue) {
186 setLinearCurve(config->injPhaseLoadBins, minValue, maxValue, 1);
187 setLinearCurve(config->veLoadBins, minValue, maxValue, 1);
188 setLinearCurve(config->lambdaLoadBins, minValue, maxValue, 1);
189}
190
191void setWholeIatCorrTimingTable(float value) {
193}
194
195/**
196 * See also crankingTimingAngle
197 */
200}
201
202#if EFI_ENGINE_CONTROL
203namespace {
204 void initTemperatureCurve(
205 float * const bins,
206 float * const values,
207 const int size,
208 const float defaultValue,
209 const float initialTemperature = -40.0f,
210 const float temperatureStep = 10.0f
211 ) {
212 for (int i = 0; i < size; i++) {
213 bins[i] = initialTemperature + i * temperatureStep;
214 values[i] = defaultValue; // this correction is a multiplier
215 }
216 }
217
218 void initBoostTemperatureCurve(float* const bins, float* const values, const float defaultValue) {
219 initTemperatureCurve(bins, values, BOOST_CURVE_SIZE, defaultValue, 20.0f, 20.0f);
220 }
221}
222#endif // EFI_ENGINE_CONTROL
223
225 criticalAssertVoid(p_engineConfiguration != nullptr, "ec NULL");
226 efi::clear(p_engineConfiguration);
227
228 p_engineConfiguration->clutchDownPinMode = PI_PULLUP;
229 p_engineConfiguration->clutchUpPinMode = PI_PULLUP;
230 p_engineConfiguration->brakePedalPinMode = PI_PULLUP;
231}
232
234#if EFI_PROD_CODE
235 // call overrided board-specific serial configuration setup, if needed (for custom boards only)
236 // needed also by bootloader code
238#endif /* EFI_PROD_CODE */
239
240 // set UART pads configuration based on the board
241// needed also by bootloader code
242#ifdef TS_SECONDARY_UxART_PORT
245#endif // TS_SECONDARY_UxART_PORT
246
249}
250
251// needed also by bootloader code
252// at the moment bootloader does NOT really need SD card, this is a step towards future bootloader SD card usage
256
257#if EFI_ENGINE_CONTROL
258
259/**
260 * see also setTargetRpmCurve()
261 */
263#if CLT_CURVE_SIZE == 16
264 copyArray(config->cltIdleRpmBins, { -30, - 20, -10, 0, 10, 20, 30, 40, 50, 60, 70, 80, 90, 100 , 110, 120 });
265 copyArray(config->cltIdleRpm, { 1350, 1350, 1300, 1200, 1150, 1100, 1050, 1000, 1000, 950, 950, 930, 900, 900, 1000, 1100 });
266#endif // CLT_CURVE_SIZE
267}
268#endif // EFI_ENGINE_CONTROL
269
270/**
271 * see also setDefaultIdleSpeedTarget()
272 */
273void setTargetRpmCurve(float rpm) {
274 setLinearCurve(config->cltIdleRpmBins, CLT_CURVE_RANGE_FROM, 140, 10);
275 setLinearCurve(config->cltIdleRpm, rpm, rpm, 10);
276}
277
279 // Same config for all channels
280 for (size_t i = 0; i < efi::size(engineConfiguration->gppwm); i++) {
281 auto& cfg = engineConfiguration->gppwm[i];
282 chsnprintf(engineConfiguration->gpPwmNote[i], sizeof(engineConfiguration->gpPwmNote[0]), "GPPWM%d", i);
283
284 // Set default axes
285 cfg.loadAxis = GPPWM_Zero;
286 cfg.rpmAxis = GPPWM_Rpm;
287
288 cfg.pin = Gpio::Unassigned;
289 cfg.dutyIfError = 0;
290 cfg.onAboveDuty = 60;
291 cfg.offBelowDuty = 50;
292 cfg.pwmFrequency = 250;
293
294 for (size_t j = 0; j < efi::size(cfg.loadBins); j++) {
295 uint8_t z = j * 100 / (efi::size(cfg.loadBins) - 1);
296 cfg.loadBins[j] = z;
297
298 // Fill some values in the table
299 for (size_t k = 0; k < efi::size(cfg.rpmBins); k++) {
300 cfg.table[j][k] = z;
301 }
302
303 }
304
305 for (size_t j = 0; j < efi::size(cfg.rpmBins); j++) {
306 cfg.rpmBins[j] = 1000 * j;
307 }
308 }
309}
310
314
315#if EFI_ENGINE_CONTROL
324#endif // EFI_ENGINE_CONTROL
325
327 // OBD-II default rate is 500kbps
330
335
336 // Don't enable, but set default address
337 engineConfiguration->verboseCanBaseAddress = CAN_DEFAULT_BASE;
338}
339
350
353 setLinearCurve(config->cltIdleCorrBins, CLT_CURVE_RANGE_FROM, 140, 10);
354 for (size_t i = 0; i < CLT_IDLE_TABLE_RPM_SIZE; i++) {
355 setLinearCurve(config->cltIdleCorrTable[i], 75.0, 50, 5);
356 }
357}
358
359/**
360 * @brief Global default engine configuration
361 * This method sets the global engine configuration defaults. These default values are then
362 * overridden by engine-specific defaults and the settings are saved in flash memory.
363 *
364 * This method is invoked only when new configuration is needed:
365 * * recently re-flashed chip
366 * * flash version of configuration failed CRC check or appears to be older then FLASH_DATA_VERSION
367 * * 'rewriteconfig' command
368 * * 'set engine_type X' command
369 *
370 * This method should only change the state of the configuration data structure but should NOT change the state of
371 * anything else.
372 *
373 * This method should NOT be setting any default pinout
374 */
376#if (! EFI_UNIT_TEST)
378#endif
380
381#if EFI_BOOST_CONTROL
383#endif
384
386
388
392
393#if EFI_ENGINE_CONTROL
398
399 // VVT closed loop, totally random values!
406
407 engineConfiguration->vvtOutputFrequency = DEFAULT_SOLENOID_FREQUENCY; // VVT solenoid control
408
410
415
417
418#if EFI_IDLE_CONTROL
420#endif /* EFI_IDLE_CONTROL */
421
422#if EFI_ELECTRONIC_THROTTLE_BODY
425#endif /* EFI_ELECTRONIC_THROTTLE_BODY */
426
428
431
433
437
438 initTemperatureCurve(IAT_FUEL_CORRECTION_CURVE, 1);
439
440 initBoostTemperatureCurve(config->cltBoostCorrBins, config->cltBoostCorr, 1.0f);
441 initBoostTemperatureCurve(config->iatBoostCorrBins, config->iatBoostCorr, 1.0f);
442 initBoostTemperatureCurve(config->cltBoostAdderBins, config->cltBoostAdder, 0.0f);
443 initBoostTemperatureCurve(config->iatBoostAdderBins, config->iatBoostAdder, 0.0f);
444
447
450
451 setLinearCurve(config->scriptCurve2Bins, 0, 100, /*precision*/1);
452 setLinearCurve(config->scriptCurve2, 30, 170, 1);
453
458
459 setLinearCurve(config->alsIgnRetardLoadBins, 2, 10, /*precision*/1);
461 setLinearCurve(config->alsFuelAdjustmentLoadBins, 2, 10, /*precision*/1);
464
465
470
471#if VVT_TABLE_SIZE == 8
474#else
477#endif
480
482
483 // is this same old setCommonNTCSensor?
484 engineConfiguration->clt.config = {0, 23.8889, 48.8889, 9500, 2100, 1000, 1500};
485
487
488 // wow unit tests have much cooler setDefaultLaunchParameters method
490// engineConfiguration->launchTimingRetard = 10;
493
495
496 /**
497 * Idle control defaults
498 */
500 // setTargetRpmCurve(1200);
501
504
507 /**
508 * between variation between different sensor and weather and fabrication tolerance
509 * five percent looks like a safer default
510 */
512
513 engineConfiguration->idle.solenoidFrequency = DEFAULT_SOLENOID_FREQUENCY;
514 // set idle_position 50
516// engineConfiguration->idleMode = IM_AUTO;
518
520
522
523#if !EFI_UNIT_TEST
525#endif
526
527
532
537
538 engineConfiguration->idlePositionMin = PACK_MULT_VOLTAGE * 0;
539 engineConfiguration->idlePositionMax = PACK_MULT_VOLTAGE * 5;
544
548 engineConfiguration->oilPressure.value2 = 689.476f; // 100psi = 689.476kPa
549
551 // todo: start using this for custom MAP
553
555
557
558 setEgoSensor(ES_14Point7_Free);
559
561
562 engineConfiguration->map.sensor.type = MT_MPX4250;
563
567
568#if EFI_PROD_CODE
570#else
571 // need more events for automated test
573#endif
574
575#if EFI_PROD_CODE || EFI_SIMULATOR
576 // some tests broke with map averaging, see https://github.com/rusefi/rusefi/issues/7868
578#endif
580
587
594
595 engineConfiguration->triggerSimulatorRpm = DEFAULT_SELT_STIM_RPM;
596 engineConfiguration->simulatorCamPosition[0] = DEFAULT_SELT_STIM_VVT0;
597
598 engineConfiguration->alternatorPwmFrequency = DEFAULT_SOLENOID_FREQUENCY;
599
601
606
608 // todo: default limits should be hard-coded for each sensor type
609 // https://github.com/rusefi/rusefi/issues/4030
611
613#endif // EFI_ENGINE_CONTROL
614 #include "default_script.lua"
615}
616
617#if defined(STM32F7) && defined(HARDWARE_CI)
618// part of F7 drama looks like we are having a hard time erasing configuration on HW CI :(
619#define IGNORE_FLASH_CONFIGURATION true
620#endif
621
622// by default, do not ignore config from flash! use it!
623#ifndef IGNORE_FLASH_CONFIGURATION
624#define IGNORE_FLASH_CONFIGURATION false
625#endif
626
628
629#if ! EFI_ACTIVE_CONFIGURATION_IN_FLASH
630 // Clear the active configuration so that registered output pins (etc) detect the change on startup and init properly
632#endif /* EFI_ACTIVE_CONFIGURATION_IN_FLASH */
633
634 /* If board have any storage */
635#if EFI_CONFIGURATION_STORAGE
636 if (IGNORE_FLASH_CONFIGURATION) {
637 engineConfiguration->engineType = DEFAULT_ENGINE_TYPE;
640 } else {
641 // this call reads configuration from flash memory or sets default configuration
642 // if flash state does not look right.
644 }
645#else
646 // This board doesn't load configuration, initialize the default
647 engineConfiguration->engineType = DEFAULT_ENGINE_TYPE;
649#endif /* EFI_CONFIGURATION_STORAGE */
650
651 // Force any board configuration options that humans shouldn't be able to change
653}
654
656 enginePins.reset(); // that's mostly important for functional tests
657 /**
658 * Let's apply global defaults first
659 */
661
662 /**
663 * custom board engine defaults. Yes, this overlaps with (older) engine_type_e approach.
664 */
666
667 // set initial pin groups
669
670 if (boardCallback != nullptr) {
671 boardCallback(engineConfiguration);
672 }
673
674#if EFI_PROD_CODE
675 // call board-specific configuration setup, if needed (for custom boards only)
678#endif // EFI_PROD_CODE
679
680 engineConfiguration->engineType = engineType;
681 applyEngineType(engineType);
683}
684
686 UNUSED(p_engineConfiguration);
687}
688
692
694#if EFI_PROD_CODE
695 efiAssertVoid(ObdCode::CUSTOM_APPLY_STACK, hasLotsOfRemainingStack(), "apply c");
696 efiPrintf("applyNonPersistentConfiguration()");
697#endif
698
699#if EFI_ENGINE_CONTROL
701#endif // EFI_ENGINE_CONTROL
702}
703
707
709 // this is related to 'setDefaultBaseEngine' having 'skippedWheelOnCam = true' which is a weird fact by itself
711}
712
714 /**
715 * VBatt
716 */
718}
719
721 // custom_board_DefaultConfiguration
722}
724 // time to force migration to custom_board_ConfigOverrides
725}
726
727PUBLIC_API_WEAK int hackHellenBoardId(int detectedId) { return detectedId; }
728
729PUBLIC_API_WEAK void onBoardStandBy() { }
730
731PUBLIC_API_WEAK_SOMETHING_WEIRD int getBoardMetaOutputsCount() { return 0; }
732// default implementation: treat all outputs as low side
734PUBLIC_API_WEAK Gpio* getBoardMetaOutputs() { return nullptr; }
735PUBLIC_API_WEAK int getBoardMetaDcOutputsCount() { return 0; }
alternator controller
void onConfigurationChangeBenchTest()
Utility methods related to bench testing.
static bool call_board_override(std::optional< setup_custom_board_overrides_type > board_override)
void setDefaultBoostParameters()
void setPinConfigurationOverrides()
void preCalculate()
Definition engine.cpp:324
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)
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 void boardBeforeTuneDefaults()
PUBLIC_API_WEAK int hackHellenBoardId(int detectedId)
static bool hasRememberedConfiguration
void rememberCurrentConfiguration()
void setBoardConfigOverrides()
void applyNonPersistentConfiguration()
static void fillAfterString(char *string, int size)
void setWholeTimingTable(angle_t value)
PUBLIC_API_WEAK void boardOnConfigurationChange(engine_configuration_s *)
static void wipeStrings()
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:311
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)