GCC Code Coverage Report


Directory: ./
File: firmware/controllers/algo/defaults/default_base_engine.cpp
Date: 2025-12-07 23:45:09
Coverage Exec Excl Total
Lines: 90.9% 241 0 265
Functions: 90.4% 47 0 52
Branches: 82.1% 23 0 28
Decisions: 90.9% 20 - 22

Line Branch Decision Exec Source
1 #include "pch.h"
2
3 #include "defaults.h"
4 #include "vr_pwm.h"
5 #include "kline.h"
6 #include "engine_configuration_defaults.h"
7 #include <rusefi/manifest.h>
8 #if HW_PROTEUS
9 #include "proteus_meta.h"
10 #endif // HW_PROTEUS
11
12 #if EFI_ALTERNATOR_CONTROL
13 593 static void setDefaultAlternatorParameters() {
14 593 setTable(config->alternatorVoltageTargetTable, 14);
15
16 593 engineConfiguration->alternatorControl.offset = 0;
17 593 engineConfiguration->alternatorControl.pFactor = 30;
18 593 engineConfiguration->alternatorControl.periodMs = 100;
19 593 }
20 #endif // EFI_ALTERNATOR_CONTROL
21
22 594 void setHpfpLobeProfileAngle(int lobes) {
23 #if HPFP_LOBE_PROFILE_SIZE == 16
24 static const float hardCodedHpfpLobeProfileAnglesForThreeLobes[16] = {0.0, 7.5, 16.5, 24.0,
25 32.0 , 40.0, 48.0, 56.0,
26 64.0 , 72.0, 80.0, 88.0,
27 96.0 , 103.5, 112.5, 120.0
28 };
29
30 594 float multiplier = 3.0 / lobes;
31
2/2
✓ Branch 0 taken 9504 times.
✓ Branch 1 taken 594 times.
2/2
✓ Decision 'true' taken 9504 times.
✓ Decision 'false' taken 594 times.
10098 for (size_t i = 0; i < HPFP_LOBE_PROFILE_SIZE; i++) {
32 9504 config->hpfpLobeProfileAngle[i] = multiplier * hardCodedHpfpLobeProfileAnglesForThreeLobes[i];
33 }
34 #endif // HPFP_LOBE_PROFILE_SIZE
35 594 }
36
37 593 static void setDefaultHPFP() {
38 #if ! EFI_UNIT_TEST
39 // unit tests rely on 'hpfpCamLobes' for isGdiEngine() and we need not-GDI by default for unit tests
40 engineConfiguration->hpfpCamLobes = 3;
41 #endif
42
43 // todo: would be nice for unit tests to be happy about these defaults
44 #if EFI_PROD_CODE || EFI_SIMULATOR
45 engineConfiguration->hpfpPumpVolume = 0.290;
46 #endif
47 593 engineConfiguration->hpfpMinAngle = 10;
48 593 engineConfiguration->hpfpActivationAngle = 30;
49 593 engineConfiguration->hpfpTargetDecay = 2000;
50 593 engineConfiguration->hpfpPidP = 0.01;
51 593 engineConfiguration->hpfpPidI = 0.0003;
52 593 engineConfiguration->hpfpPeakPos = 10;
53 593 }
54
55 593 static void setGdiDefaults() {
56 593 setDefaultHPFP();
57
58 593 setRpmTableBin(config->hpfpTargetRpmBins);
59 593 setLinearCurve(config->hpfpTargetLoadBins, 0, 180, 1);
60 593 setTable(config->hpfpTarget, 5000);
61
62 593 setLinearCurve(config->hpfpFuelMassCompensationFuelMass, 0.0, 500, 10);
63 593 setLinearCurve(config->hpfpFuelMassCompensationFuelPressure, 0, 300, 25);
64 593 setTable(config->hpfpFuelMassCompensation, 1.0);
65
66 593 setLinearCurve(config->injectorFlowLinearizationFuelMassBins, 0.0, 500, 10);
67 593 setLinearCurve(config->injectorFlowLinearizationPressureBins, 0, 300, 25);
68 593 }
69
70 1 void setGDIFueling() {
71 #ifdef HW_HELLEN_8CHAN
72 engineConfiguration->externalRusEfiGdiModule = true;
73 #endif
74
75 1 engineConfiguration->injectionMode = IM_SEQUENTIAL;
76 1 engineConfiguration->crankingInjectionMode = IM_SEQUENTIAL;
77 1 engineConfiguration->ignitionMode = IM_INDIVIDUAL_COILS;
78
79 1 setGdiWallWetting();
80 // Use high pressure sensor
81 1 engineConfiguration->injectorPressureType = IPT_High;
82 // Automatic compensation of injector flow based on rail pressure
83 1 engineConfiguration->injectorCompensationMode = ICM_SensedRailPressure;
84 // Reference rail pressure is 10 000 kPa = 100 bar
85 1 engineConfiguration->fuelReferencePressure = 10000;
86 //setting "flat" 0.2 ms injector's lag time
87 1 setTable(engineConfiguration->injector.battLagCorrTable, 0.2);
88
89 1 setTable(config->injectionPhase, -200.0f);
90 1 engineConfiguration->injectionTimingMode = InjectionTimingMode::Center;
91 1 engineConfiguration->isPhaseSyncRequiredForIgnition = true;
92 1 }
93
94 /* Cylinder to bank mapping */
95 void setLeftRightBanksNeedBetterName() {
96 for (size_t i = 0; i < engineConfiguration->cylindersCount; i++) {
97 // zero-based index
98 engineConfiguration->cylinderBankSelect[i] = i % 2;
99 }
100 }
101
102 593 static void mc33810defaults() {
103 593 engineConfiguration->mc33810Nomi = 5.5;
104 593 engineConfiguration->mc33810maxDwellTimer = mc33810maxDwellTimer_e::DWELL_8MS;
105 593 engineConfiguration->mc33810Maxi = 14;
106 593 }
107
108 590 void setDynoDefaults() {
109 590 config->dynoRpmStep = 100;
110
111 590 config->dynoSaeTemperatureC = 20;
112 590 config->dynoSaeBaro = STD_ATMOSPHERE;
113 590 config->dynoSaeRelativeHumidity = 80;
114
115 590 config->dynoCarWheelDiaInch = 18;
116 590 config->dynoCarWheelTireWidthMm = 235;
117 590 config->dynoCarWheelAspectRatio = 40;
118
119 590 config->dynoCarGearPrimaryReduction = 1;
120 590 config->dynoCarGearRatio = 1.0;
121 590 config->dynoCarGearFinalDrive = 4.2;
122
123 590 config->dynoCarCarMassKg = 1000;
124 590 config->dynoCarCargoMassKg = 95;
125 590 config->dynoCarCoeffOfDrag = 0.29;
126 590 config->dynoCarFrontalAreaM2 = 1.85;
127 590 }
128
129 1184 void defaultsOrFixOnBurn() {
130
2/2
✓ Branch 1 taken 590 times.
✓ Branch 2 taken 594 times.
2/2
✓ Decision 'true' taken 590 times.
✓ Decision 'false' taken 594 times.
1184 if (config->dynoCarCarMassKg == 0) {
131 590 setDynoDefaults();
132 }
133
134
3/4
✓ Branch 0 taken 591 times.
✓ Branch 1 taken 593 times.
✗ Branch 2 not taken.
✓ Branch 3 taken 591 times.
2/2
✓ Decision 'true' taken 593 times.
✓ Decision 'false' taken 591 times.
1184 if (engineConfiguration->mapExpAverageAlpha <= 0 || engineConfiguration->mapExpAverageAlpha > 1) {
135 593 engineConfiguration->mapExpAverageAlpha = 1;
136 }
137
138
3/4
✓ Branch 0 taken 591 times.
✓ Branch 1 taken 593 times.
✗ Branch 2 not taken.
✓ Branch 3 taken 591 times.
2/2
✓ Decision 'true' taken 593 times.
✓ Decision 'false' taken 591 times.
1184 if (engineConfiguration->ppsExpAverageAlpha <= 0 || engineConfiguration->ppsExpAverageAlpha > 1) {
139 593 engineConfiguration->ppsExpAverageAlpha = 1;
140 }
141
3/4
✓ Branch 0 taken 591 times.
✓ Branch 1 taken 593 times.
✗ Branch 2 not taken.
✓ Branch 3 taken 591 times.
2/2
✓ Decision 'true' taken 593 times.
✓ Decision 'false' taken 591 times.
1184 if (engineConfiguration->afrExpAverageAlpha <= 0 || engineConfiguration->afrExpAverageAlpha > 1) {
142 593 engineConfiguration->afrExpAverageAlpha = 1;
143 }
144
145
2/2
✓ Branch 0 taken 593 times.
✓ Branch 1 taken 591 times.
2/2
✓ Decision 'true' taken 593 times.
✓ Decision 'false' taken 591 times.
1184 if (engineConfiguration->alternator_iTermMin == 0) {
146 593 engineConfiguration->alternator_iTermMin = -1000;
147 }
148
2/2
✓ Branch 0 taken 593 times.
✓ Branch 1 taken 591 times.
2/2
✓ Decision 'true' taken 593 times.
✓ Decision 'false' taken 591 times.
1184 if (engineConfiguration->alternator_iTermMax == 0) {
149 593 engineConfiguration->alternator_iTermMax = 1000;
150 }
151
2/2
✓ Branch 1 taken 593 times.
✓ Branch 2 taken 591 times.
2/2
✓ Decision 'true' taken 593 times.
✓ Decision 'false' taken 591 times.
1184 if (engineConfiguration->idleReturnTargetRampDuration <= 0.1){
152 593 engineConfiguration->idleReturnTargetRampDuration = 3;
153 }
154
155
2/2
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 1182 times.
2/2
✓ Decision 'true' taken 2 times.
✓ Decision 'false' taken 1182 times.
1184 if (engineConfiguration->vvtControlMinRpm < engineConfiguration->cranking.rpm) {
156 2 engineConfiguration->vvtControlMinRpm = engineConfiguration->cranking.rpm;
157 }
158 1184 }
159
160 593 void setDefaultBaseEngine() {
161 // Base Engine Settings
162 593 engineConfiguration->displacement = 2;
163 593 engineConfiguration->knockDetectionUseDoubleFrequency = true;
164 #if MAX_CYLINDER_COUNT >= 4
165 593 setInline4();
166 #else
167 // todo: invoke more complete one cylinder default?
168 engineConfiguration->cylindersCount = 1;
169 #endif
170
171 593 engineConfiguration->isTuningDetectorEnabled = true;
172
173
2/2
✓ Branch 0 taken 2372 times.
✓ Branch 1 taken 593 times.
2/2
✓ Decision 'true' taken 2372 times.
✓ Decision 'false' taken 593 times.
2965 for (size_t i = 0; i < engineConfiguration->cylindersCount; i++) {
174 // one knock sensor by default. See also 'setLeftRightBanksNeedBetterName()'
175 // zero-based index
176 2372 engineConfiguration->cylinderBankSelect[i] = 0;
177 }
178
179 593 engineConfiguration->ltft.enabled = true;
180 593 engineConfiguration->ltft.correctionEnabled = true;
181
182 593 engineConfiguration->compressionRatio = 9;
183 593 engineConfiguration->vssFilterReciprocal = VSS_FILTER_MIN;
184 593 engineConfiguration->boardUseCanTerminator = true;
185 593 engineConfiguration->acLowRpmLimit = 500;
186
187 593 engineConfiguration->mafFilterParameter = 1;
188
189 #ifdef EFI_KLINE
190 engineConfiguration->kLinePeriodUs = 300 /* us*/;
191 engineConfiguration->kLineDoHondaSend = true;
192 #endif
193
194 593 setGdiDefaults();
195
196 // it's useful to know what starting point is given tune based on
197 593 engineConfiguration->calibrationBirthday = compilationYear() * 10000 + compilationMonth() * 100 + compilationDay();
198
199 593 engineConfiguration->enableExtendedCanBroadcast = true;
200
201 593 engineConfiguration->fan1ExtraIdle = 2;
202 593 engineConfiguration->fan2ExtraIdle = 2;
203
204 593 engineConfiguration->auxSpeed1Multiplier = 1;
205 593 engineConfiguration->magicNumberAvailableForDevTricks = 1;
206
207 593 engineConfiguration->acrRevolutions = 5;
208 593 engineConfiguration->acPressure.v2 = 5;
209 593 engineConfiguration->acPressure.value2 = 100;
210
211 593 engineConfiguration->lowPressureFuel.v2 = 5;
212 593 engineConfiguration->lowPressureFuel.value2 = 100;
213
214 593 engineConfiguration->wastegatePositionOpenedVoltage = 4.0;
215
216 593 engineConfiguration->fuelLevelAveragingAlpha = engine_configuration_defaults::FUEL_LEVEL_AVERAGING_ALPHA;
217 593 engineConfiguration->fuelLevelUpdatePeriodSec = engine_configuration_defaults::FUEL_LEVEL_UPDATE_PERIOD_SEC;
218 593 engineConfiguration->fuelLevelLowThresholdVoltage = engine_configuration_defaults::FUEL_LEVEL_LOW_THRESHOLD_VOLTAGE;
219 593 engineConfiguration->fuelLevelHighThresholdVoltage = engine_configuration_defaults::FUEL_LEVEL_HIGH_THRESHOLD_VOLTAGE;
220
221 593 engineConfiguration->watchOutForLinearTime = true;
222
223 593 setLinearCurve(engineConfiguration->tractionControlSlipBins, /*from*/0.9, /*to*/1.2, 0.05);
224 593 setLinearCurve(engineConfiguration->tractionControlSpeedBins, /*from*/10, /*to*/120, 5);
225
226 593 engineConfiguration->turbochargerFilter = 0.01f;
227
228 593 mc33810defaults();
229
230 593 setRpmTableBin(config->torqueRpmBins);
231 593 setLinearCurve(config->torqueLoadBins, 0, 100, 1);
232
233 593 engineConfiguration->fuelAlgorithm = engine_load_mode_e::LM_SPEED_DENSITY;
234 // let's have valid default while we still have the field
235 593 engineConfiguration->debugMode = DBG_EXECUTOR;
236
237 593 engineConfiguration->speedometerPulsePerKm = 2485; // GM GMT800 platform
238
239 593 engineConfiguration->primingDelay = 0.5;
240 // this should not be below default rpm! maybe even make them equal?
241 593 engineConfiguration->vvtControlMinRpm = 600;
242
243 // todo: this "2JZ" trigger is very powerful for many low tooth quantity applications
244 // todo: we might be getting closer to a re-name
245 // by the way 2GRFE intake likes position 160 / precision 20
246 // see also https://github.com/rusefi/rusefi/issues/7345
247 //
248 // 2JZ values
249 593 engineConfiguration->camDecoder2jzPosition = 95;
250 593 engineConfiguration->camDecoder2jzPrecision = 40;
251
252 // Limits and Fallbacks
253 593 engineConfiguration->rpmHardLimit = 7000;
254 593 engineConfiguration->rpmHardLimitHyst = 50;
255 593 engineConfiguration->cutFuelOnHardLimit = true;
256 593 engineConfiguration->cutSparkOnHardLimit = true;
257 593 engineConfiguration->etbRevLimitRange = 250;
258
259 593 engineConfiguration->tpsAccelFractionDivisor = 1;
260
261 593 engineConfiguration->rpmSoftLimitWindowSize = 200;
262 593 engineConfiguration->rpmSoftLimitTimingRetard = 4;
263
264 // CLT RPM limit table - just the X axis
265 593 copyArray(config->cltRevLimitRpmBins, { -20, 0, 40, 80 });
266
267 593 engineConfiguration->ALSMinRPM = 400;
268 593 engineConfiguration->ALSMaxRPM = 3200;
269 593 engineConfiguration->ALSMaxDuration = 3;
270 593 engineConfiguration->ALSMaxCLT = 105;
271 // engineConfiguration->alsMinPps = 10;
272 593 engineConfiguration->alsMinTimeBetween = 5;
273 593 engineConfiguration->alsEtbPosition = 30;
274 593 engineConfiguration->ALSMaxTPS = 5;
275
276 593 engineConfiguration->torqueReductionActivationTemperature = 60;
277
278 593 engineConfiguration->knockRetardAggression = 20;
279 593 engineConfiguration->knockRetardReapplyRate = 3;
280 593 engineConfiguration->knockFuelTrim = 0;
281 593 engineConfiguration->knockSuppressMinTps = 10;
282
283 // Trigger
284 593 engineConfiguration->trigger.type = trigger_type_e::TT_TOOTHED_WHEEL_60_2;
285
286 #if EFI_SIMULATOR
287 engineConfiguration->vvtMode[0] = VVT_SINGLE_TOOTH;
288 engineConfiguration->vvtOffsets[0] = 450;
289 engineConfiguration->vvtPins[0] = Gpio::A0; // a random unused pin needed to unblock startSimplePwmExt()
290 #endif // EFI_SIMULATOR
291
292 #if EFI_SIMULATOR
293 // R
294 config->tcuSolenoidTable[0][0] = 99;
295 config->tcuSolenoidTable[0][1] = 1;
296 config->tcuSolenoidTable[0][2] = 2;
297 config->tcuSolenoidTable[0][3] = 3;
298 config->tcuSolenoidTable[0][4] = 4;
299 config->tcuSolenoidTable[0][5] = 5;
300 // P/N
301 config->tcuSolenoidTable[1][0] = 10;
302 config->tcuSolenoidTable[1][1] = 11;
303 config->tcuSolenoidTable[1][2] = 12;
304 config->tcuSolenoidTable[1][3] = 13;
305 config->tcuSolenoidTable[1][4] = 14;
306 config->tcuSolenoidTable[1][5] = 15;
307 config->tcuSolenoidTable[1][6] = 16;
308 config->tcuSolenoidTable[1][7] = 17;
309 config->tcuSolenoidTable[1][8] = 18;
310 config->tcuSolenoidTable[1][9] = 19;
311 // 1
312 config->tcuSolenoidTable[2][0] = 20;
313 config->tcuSolenoidTable[2][1] = 21;
314 config->tcuSolenoidTable[2][2] = 22;
315 // 2
316 config->tcuSolenoidTable[3][0] = 30;
317 config->tcuSolenoidTable[3][1] = 31;
318 config->tcuSolenoidTable[3][3] = 33;
319 // 3
320 config->tcuSolenoidTable[4][0] = 40;
321 config->tcuSolenoidTable[4][1] = 41;
322 config->tcuSolenoidTable[4][4] = 44;
323 // 4
324 config->tcuSolenoidTable[5][0] = 50;
325 config->tcuSolenoidTable[5][1] = 51;
326 config->tcuSolenoidTable[5][5] = 55;
327
328 // [tag:runNotSquareTest] huh why is this not a unit test?!
329 config->scriptTable4[0][0] = 140;
330 config->scriptTable4[0][1] = 141;
331 config->scriptTable4[0][2] = 142;
332 config->scriptTable4[0][3] = 143;
333 config->scriptTable4[0][4] = 144;
334 config->scriptTable4[0][5] = 145;
335
336 config->scriptTable4[1][0] = 240;
337 config->scriptTable4[1][1] = 241;
338 config->scriptTable4[1][2] = 242;
339 config->scriptTable4[1][3] = 243;
340 config->scriptTable4[1][4] = 244;
341 config->scriptTable4[1][5] = 245;
342
343 config->scriptTable4[4][0] = 40;
344 config->scriptTable4[4][2] = 41;
345 config->scriptTable4[4][3] = 42;
346 config->scriptTable4[4][4] = 43;
347 config->scriptTable4[4][5] = 44;
348 config->scriptTable4[4][5] = 45;
349
350 config->scriptTable4[5][0] = 50;
351 config->scriptTable4[5][1] = 51;
352 config->scriptTable4[5][2] = 52;
353 config->scriptTable4[5][3] = 53;
354 config->scriptTable4[5][4] = 54;
355 config->scriptTable4[5][5] = 55;
356
357 #endif // EFI_SIMULATOR
358
359 593 engineConfiguration->globalTriggerAngleOffset = 0;
360
361 // Default this to on - if you want to diagnose, turn it off.
362 593 engineConfiguration->silentTriggerError = true;
363
364 593 engineConfiguration->idleStepperReactionTime = 3;
365 593 engineConfiguration->idleStepperTotalSteps = 200;
366 593 engineConfiguration->stepperForceParkingEveryRestart = true;
367 593 engineConfiguration->iacByTpsTaper = 2;
368
369 593 engineConfiguration->etbSplit = MAX_TPS_PPS_DISCREPANCY;
370
371 // Advanced Trigger
372
373 // Battery and alternator
374 593 engineConfiguration->vbattDividerCoeff = ((float) (15 + 65)) / 15;
375
376 #if EFI_ALTERNATOR_CONTROL
377 593 setDefaultAlternatorParameters();
378 #endif /* EFI_ALTERNATOR_CONTROL */
379
380 // Fuel pump
381 // todo: maybe change to 2s as default?
382 593 engineConfiguration->startUpFuelPumpDuration = 4;
383
384 593 engineConfiguration->kLineBaudRate = KLINE_BAUD_RATE;
385
386 593 engineConfiguration->benchTestOnTime = 4;
387 593 engineConfiguration->benchTestOffTime = 500;
388 593 engineConfiguration->benchTestCount = 3;
389
390
391 // Tachometer
392 // 50% duty cycle is the default for tach signal
393 593 engineConfiguration->tachPulseDurationAsDutyCycle = true;
394 593 engineConfiguration->tachPulseDuractionMs = 0.5;
395 593 engineConfiguration->tachPulsePerRev = 1;
396
397 593 engineConfiguration->etbMinimumPosition = 1;
398 593 engineConfiguration->etbMaximumPosition = 100;
399
400 593 engineConfiguration->tcuInputSpeedSensorTeeth = 1;
401 593 engineConfiguration->issFilterReciprocal = 2;
402
403 //knock
404 #ifdef KNOCK_SPECTROGRAM
405 engineConfiguration->enableKnockSpectrogram = false;
406 engineConfiguration->enableKnockSpectrogramFilter = false;
407 engineConfiguration->knockSpectrumSensitivity = 1.0;
408 engineConfiguration->knockFrequency = 0.0;
409 #endif
410
411 // Check engine light
412 #if EFI_PROD_CODE
413 engineConfiguration->warningPeriod = 10;
414 #else
415 593 engineConfiguration->warningPeriod = 0;
416 #endif /* EFI_PROD_CODE */
417
418 593 setDefaultVrThresholds();
419
420 // Oil pressure protection
421 593 engineConfiguration->minimumOilPressureTimeout = 0.5f;
422 593 setRpmTableBin(config->minimumOilPressureBins);
423 593 setRpmTableBin(config->maximumOilPressureBins);
424
425 18383 engine->engineModules.apply_all([](auto & m) { m.setDefaultConfiguration(); });
426 // we invoke this last so that we can validate even defaults
427 defaultsOrFixOnBurn();
428 }
429
430 1 void setPPSInputs(adc_channel_e pps1, adc_channel_e pps2) {
431 1 engineConfiguration->throttlePedalPositionAdcChannel = pps1;
432 1 engineConfiguration->throttlePedalPositionSecondAdcChannel = pps2;
433 1 }
434
435 void setTPS1Inputs(adc_channel_e tps1, adc_channel_e tps2) {
436 engineConfiguration->tps1_1AdcChannel = tps1;
437 engineConfiguration->tps1_2AdcChannel = tps2;
438 }
439
440 594 void setTPS1Calibration(uint16_t tpsMin, uint16_t tpsMax) {
441 594 engineConfiguration->tpsMin = tpsMin;
442 594 engineConfiguration->tpsMax = tpsMax;
443 594 }
444
445 594 void setTPS1Calibration(uint16_t tpsMin, uint16_t tpsMax, uint16_t tps1SecondaryMin, uint16_t tps1SecondaryMax) {
446 594 setTPS1Calibration(tpsMin, tpsMax);
447
448
449 594 engineConfiguration->tps1SecondaryMin = tps1SecondaryMin;
450 594 engineConfiguration->tps1SecondaryMax = tps1SecondaryMax;
451 594 }
452
453 10 void setCustomMap(float lowValue, float mapLowValueVoltage, float highValue, float mapHighValueVoltage) {
454 10 engineConfiguration->map.sensor.type = MT_CUSTOM;
455 10 engineConfiguration->map.sensor.lowValue = lowValue;
456 10 engineConfiguration->mapLowValueVoltage = mapLowValueVoltage;
457 10 engineConfiguration->map.sensor.highValue = highValue;
458 10 engineConfiguration->mapHighValueVoltage = mapHighValueVoltage;
459 10 }
460
461 596 void setPPSCalibration(float primaryUp, float primaryDown, float secondaryUp, float secondaryDown) {
462 596 engineConfiguration->throttlePedalUpVoltage = primaryUp;
463 596 engineConfiguration->throttlePedalWOTVoltage = primaryDown;
464 596 engineConfiguration->throttlePedalSecondaryUpVoltage = secondaryUp;
465 596 engineConfiguration->throttlePedalSecondaryWOTVoltage = secondaryDown;
466 596 }
467
468 1 void setEtbPID(float p, float i, float d) {
469 1 engineConfiguration->etb.pFactor = p;
470 1 engineConfiguration->etb.iFactor = i;
471 1 engineConfiguration->etb.dFactor = d;
472 1 }
473
474 597 void setInline4() {
475 597 engineConfiguration->cylindersCount = 4;
476 597 engineConfiguration->firingOrder = FO_1_3_4_2;
477 597 }
478
479 void setProteusEtbIO() {
480 #if HW_PROTEUS && EFI_PROD_CODE
481 engineConfiguration->tps1_2AdcChannel = PROTEUS_IN_TPS1_2;
482 setPPSInputs(PROTEUS_IN_PPS, PROTEUS_IN_PPS2);
483 #endif // HW_PROTEUS
484 }
485
486 void setupTLE9201(Gpio controlPin, Gpio direction, Gpio disable, int dcIndex) {
487 // TLE9201 driver
488 // This chip has three control pins:
489 // DIR - sets direction of the motor
490 // PWM - pwm control (enable high, coast low)
491 // DIS - disables motor (enable low)
492
493 // PWM pin
494 engineConfiguration->etbIo[dcIndex].controlPin = controlPin;
495 // DIR pin
496 engineConfiguration->etbIo[dcIndex].directionPin1 = direction;
497 // Disable pin
498 engineConfiguration->etbIo[dcIndex].disablePin = disable;
499
500 // we only have pwm/dir, no dira/dirb
501 engineConfiguration->etb_use_two_wires = false;
502 }
503
504 void setupTLE9201IncludingStepper(Gpio controlPin, Gpio direction, Gpio disable, int dcIndex) {
505 setupTLE9201(controlPin, direction, disable, dcIndex);
506
507 // on SBC style stepper IAC fully-extended valve shaft would give least idle air
508 // fully-retracted valve shaft would give most idle air
509 int stepperIndexWeirdness = 1 - dcIndex;
510 engineConfiguration->stepperDcIo[stepperIndexWeirdness].controlPin = controlPin;
511 engineConfiguration->stepperDcIo[stepperIndexWeirdness].directionPin1 = direction;
512 engineConfiguration->stepperDcIo[stepperIndexWeirdness].directionPin2 = Gpio::Unassigned;
513 engineConfiguration->stepperDcIo[stepperIndexWeirdness].disablePin = disable;
514 }
515