rusEFI
The most advanced open source ECU
Loading...
Searching...
No Matches
engine_configuration_generated_structures_uaefi.h
Go to the documentation of this file.
1// this section was generated automatically by rusEFI tool config_definition-all.jar based on (unknown script) integration/rusefi_config.txt
2// by class com.rusefi.output.CHeaderConsumer
3// begin
4#pragma once
5#include "rusefi_types.h"
6// start of stft_cell_cfg_s
7struct stft_cell_cfg_s {
8 /**
9 * Maximum % that the short term fuel trim can add
10 * units: %
11 * offset 0
12 */
13 scaled_channel<uint8_t, 10, 1> maxAdd;
14 /**
15 * Maximum % that the short term fuel trim can remove
16 * units: %
17 * offset 1
18 */
19 scaled_channel<uint8_t, 10, 1> maxRemove;
20 /**
21 * Commonly referred as Integral gain.
22 * Time constant for correction while in this cell: this sets responsiveness of the closed loop correction. A value of 5.0 means it will try to make most of the correction within 5 seconds, and a value of 1.0 will try to correct within 1 second.
23 * Lower values makes the correction more sensitive, higher values slow the correction down.
24 * units: sec
25 * offset 2
26 */
27 scaled_channel<uint16_t, 10, 1> timeConstant;
28};
29static_assert(sizeof(stft_cell_cfg_s) == 4);
30
31// start of stft_s
32struct stft_s {
33 /**
34 * Below this RPM, the idle region is active, idle+300 would be a good value
35 * units: RPM
36 * offset 0
37 */
38 scaled_channel<uint8_t, 1, 50> maxIdleRegionRpm;
39 /**
40 * need 4 byte alignment
41 * units: units
42 * offset 1
43 */
44 uint8_t alignmentFill_at_1[1] = {};
45 /**
46 * Below this engine load, the overrun region is active
47 * When tuning by MAP the units are kPa/psi, e.g. 30 would mean 30kPa. When tuning TPS, 30 would be 30%
48 * units: load
49 * offset 2
50 */
51 uint16_t maxOverrunLoad;
52 /**
53 * Above this engine load, the power region is active
54 * When tuning by MAP the units are kPa/psi
55 * units: load
56 * offset 4
57 */
58 uint16_t minPowerLoad;
59 /**
60 * When close to correct AFR, pause correction. This can improve stability by not changing the adjustment if the error is extremely small, but is not required.
61 * units: %
62 * offset 6
63 */
64 scaled_channel<uint8_t, 10, 1> deadband;
65 /**
66 * Minimum coolant temperature before closed loop operation is allowed.
67 * units: SPECIAL_CASE_TEMPERATURE
68 * offset 7
69 */
70 int8_t minClt;
71 /**
72 * Below this AFR, correction is paused
73 * units: afr
74 * offset 8
75 */
76 scaled_channel<uint8_t, 10, 1> minAfr;
77 /**
78 * Above this AFR, correction is paused
79 * units: afr
80 * offset 9
81 */
82 scaled_channel<uint8_t, 10, 1> maxAfr;
83 /**
84 * Time after startup before closed loop operation is allowed.
85 * units: seconds
86 * offset 10
87 */
88 uint8_t startupDelay;
89 /**
90 * need 4 byte alignment
91 * units: units
92 * offset 11
93 */
94 uint8_t alignmentFill_at_11[1] = {};
95 /**
96 * offset 12
97 */
98 stft_cell_cfg_s cellCfgs[STFT_CELL_COUNT] = {};
99};
100static_assert(sizeof(stft_s) == 28);
101
102// start of ltft_s
103struct ltft_s {
104 /**
105 * Enables lambda sensor long term fuel corrections data gathering into LTFT trim tables
106 offset 0 bit 0 */
107 bool enabled : 1 {};
108 /**
109 * Apply LTFT trims into fuel calculation on top of VE table.
110 * We do not adjust VE table automatically, please click 'Apply to VE' if you want to adjust your VE tables and reset trims.
111 offset 0 bit 1 */
112 bool correctionEnabled : 1 {};
113 /**
114 offset 0 bit 2 */
115 bool unusedBit_2_2 : 1 {};
116 /**
117 offset 0 bit 3 */
118 bool unusedBit_2_3 : 1 {};
119 /**
120 offset 0 bit 4 */
121 bool unusedBit_2_4 : 1 {};
122 /**
123 offset 0 bit 5 */
124 bool unusedBit_2_5 : 1 {};
125 /**
126 offset 0 bit 6 */
127 bool unusedBit_2_6 : 1 {};
128 /**
129 offset 0 bit 7 */
130 bool unusedBit_2_7 : 1 {};
131 /**
132 offset 0 bit 8 */
133 bool unusedBit_2_8 : 1 {};
134 /**
135 offset 0 bit 9 */
136 bool unusedBit_2_9 : 1 {};
137 /**
138 offset 0 bit 10 */
139 bool unusedBit_2_10 : 1 {};
140 /**
141 offset 0 bit 11 */
142 bool unusedBit_2_11 : 1 {};
143 /**
144 offset 0 bit 12 */
145 bool unusedBit_2_12 : 1 {};
146 /**
147 offset 0 bit 13 */
148 bool unusedBit_2_13 : 1 {};
149 /**
150 offset 0 bit 14 */
151 bool unusedBit_2_14 : 1 {};
152 /**
153 offset 0 bit 15 */
154 bool unusedBit_2_15 : 1 {};
155 /**
156 offset 0 bit 16 */
157 bool unusedBit_2_16 : 1 {};
158 /**
159 offset 0 bit 17 */
160 bool unusedBit_2_17 : 1 {};
161 /**
162 offset 0 bit 18 */
163 bool unusedBit_2_18 : 1 {};
164 /**
165 offset 0 bit 19 */
166 bool unusedBit_2_19 : 1 {};
167 /**
168 offset 0 bit 20 */
169 bool unusedBit_2_20 : 1 {};
170 /**
171 offset 0 bit 21 */
172 bool unusedBit_2_21 : 1 {};
173 /**
174 offset 0 bit 22 */
175 bool unusedBit_2_22 : 1 {};
176 /**
177 offset 0 bit 23 */
178 bool unusedBit_2_23 : 1 {};
179 /**
180 offset 0 bit 24 */
181 bool unusedBit_2_24 : 1 {};
182 /**
183 offset 0 bit 25 */
184 bool unusedBit_2_25 : 1 {};
185 /**
186 offset 0 bit 26 */
187 bool unusedBit_2_26 : 1 {};
188 /**
189 offset 0 bit 27 */
190 bool unusedBit_2_27 : 1 {};
191 /**
192 offset 0 bit 28 */
193 bool unusedBit_2_28 : 1 {};
194 /**
195 offset 0 bit 29 */
196 bool unusedBit_2_29 : 1 {};
197 /**
198 offset 0 bit 30 */
199 bool unusedBit_2_30 : 1 {};
200 /**
201 offset 0 bit 31 */
202 bool unusedBit_2_31 : 1 {};
203 /**
204 * When close to correct AFR, pause correction. This can improve stability by not changing the adjustment if the error is extremely small, but is not required.
205 * units: %
206 * offset 4
207 */
208 scaled_channel<uint8_t, 10, 1> deadband;
209 /**
210 * Maximum % that the long term fuel trim can add
211 * units: %
212 * offset 5
213 */
214 scaled_channel<uint8_t, 10, 1> maxAdd;
215 /**
216 * Maximum % that the long term fuel trim can remove
217 * units: %
218 * offset 6
219 */
220 scaled_channel<uint8_t, 10, 1> maxRemove;
221 /**
222 * need 4 byte alignment
223 * units: units
224 * offset 7
225 */
226 uint8_t alignmentFill_at_7[1] = {};
227 /**
228 * Commonly referred as Integral gain.
229 * Time constant for correction while in this cell: this sets responsiveness of the closed loop correction. A value of 30.0 means it will try to make most of the correction within 30 seconds, and a value of 300.0 will try to correct within 5 minutes.
230 * Lower values makes the correction more sensitive, higher values slow the correction down.
231 * units: sec
232 * offset 8
233 */
234 scaled_channel<uint16_t, 1, 1> timeConstant[STFT_CELL_COUNT] = {};
235};
236static_assert(sizeof(ltft_s) == 16);
237
238// start of pid_s
239struct pid_s {
240 /**
241 * offset 0
242 */
243 float pFactor;
244 /**
245 * offset 4
246 */
247 float iFactor;
248 /**
249 * offset 8
250 */
251 float dFactor;
252 /**
253 * Linear addition to PID logic
254 * Also known as feedforward.
255 * offset 12
256 */
257 int16_t offset;
258 /**
259 * PID dTime
260 * units: ms
261 * offset 14
262 */
263 int16_t periodMs;
264 /**
265 * Output Min Duty Cycle
266 * offset 16
267 */
268 int16_t minValue;
269 /**
270 * Output Max Duty Cycle
271 * offset 18
272 */
273 int16_t maxValue;
274};
275static_assert(sizeof(pid_s) == 20);
276
277// start of MsIoBox_config_s
278struct MsIoBox_config_s {
279 /**
280 * offset 0
281 */
283 /**
284 * offset 1
285 */
287 /**
288 * need 4 byte alignment
289 * units: units
290 * offset 2
291 */
292 uint8_t alignmentFill_at_2[2] = {};
293};
294static_assert(sizeof(MsIoBox_config_s) == 4);
295
296// start of cranking_parameters_s
298 /**
299 * This sets the RPM limit below which the ECU will use cranking fuel and ignition logic, typically this is around 350-450rpm.
300 * set cranking_rpm X
301 * units: RPM
302 * offset 0
303 */
304 int16_t rpm;
305 /**
306 * need 4 byte alignment
307 * units: units
308 * offset 2
309 */
310 uint8_t alignmentFill_at_2[2] = {};
311};
312static_assert(sizeof(cranking_parameters_s) == 4);
313
314// start of gppwm_channel
315struct gppwm_channel {
316 /**
317 * Select a pin to use for PWM or on-off output.
318 * offset 0
319 */
321 /**
322 * If an error (with a sensor, etc) is detected, this value is used instead of reading from the table.
323 * This should be a safe value for whatever hardware is connected to prevent damage.
324 * units: %
325 * offset 2
326 */
327 uint8_t dutyIfError;
328 /**
329 * need 4 byte alignment
330 * units: units
331 * offset 3
332 */
333 uint8_t alignmentFill_at_3[1] = {};
334 /**
335 * Select a frequency to run PWM at.
336 * Set this to 0hz to enable on-off mode.
337 * units: hz
338 * offset 4
339 */
340 uint16_t pwmFrequency;
341 /**
342 * Hysteresis: in on-off mode, turn the output on when the table value is above this duty.
343 * units: %
344 * offset 6
345 */
346 uint8_t onAboveDuty;
347 /**
348 * Hysteresis: in on-off mode, turn the output off when the table value is below this duty.
349 * units: %
350 * offset 7
351 */
352 uint8_t offBelowDuty;
353 /**
354 * Selects the Y axis to use for the table.
355 * offset 8
356 */
358 /**
359 * Selects the X axis to use for the table.
360 * offset 9
361 */
363 /**
364 * offset 10
365 */
366 scaled_channel<int16_t, 2, 1> loadBins[GPPWM_LOAD_COUNT] = {};
367 /**
368 * offset 26
369 */
370 int16_t rpmBins[GPPWM_RPM_COUNT] = {};
371 /**
372 * units: duty
373 * offset 42
374 */
375 scaled_channel<uint8_t, 2, 1> table[GPPWM_LOAD_COUNT][GPPWM_RPM_COUNT] = {};
376 /**
377 * need 4 byte alignment
378 * units: units
379 * offset 106
380 */
381 uint8_t alignmentFill_at_106[2] = {};
382};
383static_assert(sizeof(gppwm_channel) == 108);
384
385// start of air_pressure_sensor_config_s
387 /**
388 * kPa/psi value at low volts
389 * units: SPECIAL_CASE_PRESSURE
390 * offset 0
391 */
392 float lowValue;
393 /**
394 * kPa/psi value at high volts
395 * units: SPECIAL_CASE_PRESSURE
396 * offset 4
397 */
398 float highValue;
399 /**
400 * offset 8
401 */
403 /**
404 * offset 9
405 */
407 /**
408 * need 4 byte alignment
409 * units: units
410 * offset 10
411 */
412 uint8_t alignmentFill_at_10[2] = {};
413};
414static_assert(sizeof(air_pressure_sensor_config_s) == 12);
415
416// start of MAP_sensor_config_s
417struct MAP_sensor_config_s {
418 /**
419 * offset 0
420 */
421 float samplingAngleBins[MAP_ANGLE_SIZE] = {};
422 /**
423 * MAP averaging sampling start crank degree angle
424 * units: deg
425 * offset 32
426 */
427 float samplingAngle[MAP_ANGLE_SIZE] = {};
428 /**
429 * offset 64
430 */
431 float samplingWindowBins[MAP_WINDOW_SIZE] = {};
432 /**
433 * MAP averaging angle crank degree duration
434 * units: deg
435 * offset 96
436 */
437 float samplingWindow[MAP_WINDOW_SIZE] = {};
438 /**
439 * offset 128
440 */
442};
443static_assert(sizeof(MAP_sensor_config_s) == 140);
444
445/**
446 * @brief Thermistor known values
447
448*/
449// start of thermistor_conf_s
450struct thermistor_conf_s {
451 /**
452 * these values are in Celcius
453 * units: *C
454 * offset 0
455 */
456 float tempC_1;
457 /**
458 * units: *C
459 * offset 4
460 */
461 float tempC_2;
462 /**
463 * units: *C
464 * offset 8
465 */
466 float tempC_3;
467 /**
468 * units: Ohm
469 * offset 12
470 */
471 float resistance_1;
472 /**
473 * units: Ohm
474 * offset 16
475 */
476 float resistance_2;
477 /**
478 * units: Ohm
479 * offset 20
480 */
481 float resistance_3;
482 /**
483 * Pull-up resistor value on your board
484 * units: Ohm
485 * offset 24
486 */
487 float bias_resistor;
488};
489static_assert(sizeof(thermistor_conf_s) == 28);
490
491// start of linear_sensor_s
492struct linear_sensor_s {
493 /**
494 * offset 0
495 */
497 /**
498 * need 4 byte alignment
499 * units: units
500 * offset 1
501 */
502 uint8_t alignmentFill_at_1[3] = {};
503 /**
504 * units: volts
505 * offset 4
506 */
507 float v1;
508 /**
509 * offset 8
510 */
511 float value1;
512 /**
513 * units: volts
514 * offset 12
515 */
516 float v2;
517 /**
518 * offset 16
519 */
520 float value2;
521};
522static_assert(sizeof(linear_sensor_s) == 20);
523
524// start of ThermistorConf
525struct ThermistorConf {
526 /**
527 * offset 0
528 */
530 /**
531 * offset 28
532 */
534 /**
535 * need 4 byte alignment
536 * units: units
537 * offset 29
538 */
539 uint8_t alignmentFill_at_29[3] = {};
540};
541static_assert(sizeof(ThermistorConf) == 32);
542
543// start of injector_s
544struct injector_s {
545 /**
546 * This is your injector flow at the fuel pressure used in the vehicle
547 * See units setting below
548 * offset 0
549 */
550 float flow;
551 /**
552 * units: volts
553 * offset 4
554 */
555 scaled_channel<int16_t, 100, 1> battLagCorrBattBins[VBAT_INJECTOR_CURVE_SIZE] = {};
556 /**
557 * Injector correction pressure
558 * units: SPECIAL_CASE_PRESSURE
559 * offset 20
560 */
561 scaled_channel<uint32_t, 10, 1> battLagCorrPressBins[VBAT_INJECTOR_CURVE_PRESSURE_SIZE] = {};
562 /**
563 * ms delay between injector open and close dead times
564 * units: ms
565 * offset 28
566 */
567 scaled_channel<int16_t, 100, 1> battLagCorrTable[VBAT_INJECTOR_CURVE_PRESSURE_SIZE][VBAT_INJECTOR_CURVE_SIZE] = {};
568};
569static_assert(sizeof(injector_s) == 60);
570
571// start of trigger_config_s
572struct trigger_config_s {
573 /**
574 * https://github.com/rusefi/rusefi/wiki/All-Supported-Triggers
575 * offset 0
576 */
578 /**
579 * units: number
580 * offset 4
581 */
583 /**
584 * units: number
585 * offset 8
586 */
588};
589static_assert(sizeof(trigger_config_s) == 12);
590
591// start of afr_sensor_s
592struct afr_sensor_s {
593 /**
594 * offset 0
595 */
597 /**
598 * offset 1
599 */
601 /**
602 * need 4 byte alignment
603 * units: units
604 * offset 2
605 */
606 uint8_t alignmentFill_at_2[2] = {};
607 /**
608 * units: volts
609 * offset 4
610 */
611 float v1;
612 /**
613 * units: AFR
614 * offset 8
615 */
616 float value1;
617 /**
618 * units: volts
619 * offset 12
620 */
621 float v2;
622 /**
623 * units: AFR
624 * offset 16
625 */
626 float value2;
627};
628static_assert(sizeof(afr_sensor_s) == 20);
629
630// start of idle_hardware_s
631struct idle_hardware_s {
632 /**
633 * units: Hz
634 * offset 0
635 */
637 /**
638 * offset 4
639 */
641 /**
642 * offset 6
643 */
645 /**
646 * offset 8
647 */
649 /**
650 * offset 10
651 */
653 /**
654 * need 4 byte alignment
655 * units: units
656 * offset 11
657 */
658 uint8_t alignmentFill_at_11[1] = {};
659};
660static_assert(sizeof(idle_hardware_s) == 12);
661
662// start of dc_io
663struct dc_io {
664 /**
665 * offset 0
666 */
668 /**
669 * offset 2
670 */
672 /**
673 * Acts as EN pin in two-wire mode
674 * offset 4
675 */
677 /**
678 * offset 6
679 */
681};
682static_assert(sizeof(dc_io) == 8);
683
684// start of vr_threshold_s
685struct vr_threshold_s {
686 /**
687 * units: rpm
688 * offset 0
689 */
690 scaled_channel<uint8_t, 1, 50> rpmBins[6] = {};
691 /**
692 * units: volts
693 * offset 6
694 */
695 scaled_channel<uint8_t, 100, 1> values[6] = {};
696 /**
697 * offset 12
698 */
699 Gpio pin;
700 /**
701 * need 4 byte alignment
702 * units: units
703 * offset 14
704 */
705 uint8_t alignmentFill_at_14[2] = {};
706};
707static_assert(sizeof(vr_threshold_s) == 16);
708
709// start of wbo_s
710struct wbo_s {
711 /**
712 * offset 0
713 */
715 /**
716 * offset 1
717 */
719 /**
720 * offset 2
721 */
723 /**
724 * offset 3
725 */
727 /**
728 offset 4 bit 0 */
729 bool enableRemap : 1 {};
730 /**
731 offset 4 bit 1 */
732 bool unusedBit_5_1 : 1 {};
733 /**
734 offset 4 bit 2 */
735 bool unusedBit_5_2 : 1 {};
736 /**
737 offset 4 bit 3 */
738 bool unusedBit_5_3 : 1 {};
739 /**
740 offset 4 bit 4 */
741 bool unusedBit_5_4 : 1 {};
742 /**
743 offset 4 bit 5 */
744 bool unusedBit_5_5 : 1 {};
745 /**
746 offset 4 bit 6 */
747 bool unusedBit_5_6 : 1 {};
748 /**
749 offset 4 bit 7 */
750 bool unusedBit_5_7 : 1 {};
751 /**
752 offset 4 bit 8 */
753 bool unusedBit_5_8 : 1 {};
754 /**
755 offset 4 bit 9 */
756 bool unusedBit_5_9 : 1 {};
757 /**
758 offset 4 bit 10 */
759 bool unusedBit_5_10 : 1 {};
760 /**
761 offset 4 bit 11 */
762 bool unusedBit_5_11 : 1 {};
763 /**
764 offset 4 bit 12 */
765 bool unusedBit_5_12 : 1 {};
766 /**
767 offset 4 bit 13 */
768 bool unusedBit_5_13 : 1 {};
769 /**
770 offset 4 bit 14 */
771 bool unusedBit_5_14 : 1 {};
772 /**
773 offset 4 bit 15 */
774 bool unusedBit_5_15 : 1 {};
775 /**
776 offset 4 bit 16 */
777 bool unusedBit_5_16 : 1 {};
778 /**
779 offset 4 bit 17 */
780 bool unusedBit_5_17 : 1 {};
781 /**
782 offset 4 bit 18 */
783 bool unusedBit_5_18 : 1 {};
784 /**
785 offset 4 bit 19 */
786 bool unusedBit_5_19 : 1 {};
787 /**
788 offset 4 bit 20 */
789 bool unusedBit_5_20 : 1 {};
790 /**
791 offset 4 bit 21 */
792 bool unusedBit_5_21 : 1 {};
793 /**
794 offset 4 bit 22 */
795 bool unusedBit_5_22 : 1 {};
796 /**
797 offset 4 bit 23 */
798 bool unusedBit_5_23 : 1 {};
799 /**
800 offset 4 bit 24 */
801 bool unusedBit_5_24 : 1 {};
802 /**
803 offset 4 bit 25 */
804 bool unusedBit_5_25 : 1 {};
805 /**
806 offset 4 bit 26 */
807 bool unusedBit_5_26 : 1 {};
808 /**
809 offset 4 bit 27 */
810 bool unusedBit_5_27 : 1 {};
811 /**
812 offset 4 bit 28 */
813 bool unusedBit_5_28 : 1 {};
814 /**
815 offset 4 bit 29 */
816 bool unusedBit_5_29 : 1 {};
817 /**
818 offset 4 bit 30 */
819 bool unusedBit_5_30 : 1 {};
820 /**
821 offset 4 bit 31 */
822 bool unusedBit_5_31 : 1 {};
823};
824static_assert(sizeof(wbo_s) == 8);
825
826// start of vvl_s
827struct vvl_s {
828 /**
829 * units: %
830 * offset 0
831 */
832 int8_t fuelAdderPercent;
833 /**
834 * need 4 byte alignment
835 * units: units
836 * offset 1
837 */
838 uint8_t alignmentFill_at_1[3] = {};
839 /**
840 * Retard timing to remove from actual final timing (after all corrections) due to additional air.
841 * units: deg
842 * offset 4
843 */
844 float ignitionRetard;
845 /**
846 * offset 8
847 */
848 int minimumTps;
849 /**
850 * units: SPECIAL_CASE_TEMPERATURE
851 * offset 12
852 */
853 int16_t minimumClt;
854 /**
855 * units: SPECIAL_CASE_PRESSURE
856 * offset 14
857 */
858 int16_t maximumMap;
859 /**
860 * units: afr
861 * offset 16
862 */
863 scaled_channel<uint8_t, 10, 1> maximumAfr;
864 /**
865 * need 4 byte alignment
866 * units: units
867 * offset 17
868 */
869 uint8_t alignmentFill_at_17[1] = {};
870 /**
871 * units: rpm
872 * offset 18
873 */
874 uint16_t activationRpm;
875 /**
876 * units: rpm
877 * offset 20
878 */
879 uint16_t deactivationRpm;
880 /**
881 * units: rpm
882 * offset 22
883 */
884 uint16_t deactivationRpmWindow;
885};
886static_assert(sizeof(vvl_s) == 24);
887
888// start of engine_configuration_s
890 /**
891 * http://rusefi.com/wiki/index.php?title=Manual:Engine_Type
892 * set engine_type X
893 * offset 0
894 */
896 /**
897 * offset 2
898 */
900 /**
901 * A secondary Rev limit engaged by the driver to help launch the vehicle faster
902 * units: rpm
903 * offset 4
904 */
905 uint16_t launchRpm;
906 /**
907 * set rpm_hard_limit X
908 * units: rpm
909 * offset 6
910 */
911 uint16_t rpmHardLimit;
912 /**
913 * Engine sniffer would be disabled above this rpm
914 * set engineSnifferRpmThreshold X
915 * units: RPM
916 * offset 8
917 */
919 /**
920 * Disable multispark above this engine speed.
921 * units: rpm
922 * offset 10
923 */
924 scaled_channel<uint8_t, 1, 50> multisparkMaxRpm;
925 /**
926 * Above this RPM, disable AC. Set to 0 to disable check.
927 * units: rpm
928 * offset 11
929 */
930 scaled_channel<uint8_t, 1, 50> maxAcRpm;
931 /**
932 * Above this TPS, disable AC. Set to 0 to disable check.
933 * units: %
934 * offset 12
935 */
936 uint8_t maxAcTps;
937 /**
938 * need 4 byte alignment
939 * units: units
940 * offset 13
941 */
942 uint8_t alignmentFill_at_13[1] = {};
943 /**
944 * Above this CLT, disable AC to prevent overheating the engine. Set to 0 to disable check.
945 * units: SPECIAL_CASE_TEMPERATURE
946 * offset 14
947 */
948 int16_t maxAcClt;
949 /**
950 * Just for reference really, not taken into account by any logic at this point
951 * units: CR
952 * offset 16
953 */
954 float compressionRatio;
955 /**
956 * Voltage when the idle valve is closed.
957 * You probably don't have one of these!
958 * units: mv
959 * offset 20
960 */
961 uint16_t idlePositionMin;
962 /**
963 * Voltage when the idle valve is open.
964 * You probably don't have one of these!
965 * 1 volt = 1000 units
966 * units: mv
967 * offset 22
968 */
969 uint16_t idlePositionMax;
970 /**
971 * Enable LTIT (Long Term Idle Trim) learning
972 offset 24 bit 0 */
973 bool ltitEnabled : 1 {};
974 /**
975 offset 24 bit 1 */
976 bool unusedBit_14_1 : 1 {};
977 /**
978 offset 24 bit 2 */
979 bool unusedBit_14_2 : 1 {};
980 /**
981 offset 24 bit 3 */
982 bool unusedBit_14_3 : 1 {};
983 /**
984 offset 24 bit 4 */
985 bool unusedBit_14_4 : 1 {};
986 /**
987 offset 24 bit 5 */
988 bool unusedBit_14_5 : 1 {};
989 /**
990 offset 24 bit 6 */
991 bool unusedBit_14_6 : 1 {};
992 /**
993 offset 24 bit 7 */
994 bool unusedBit_14_7 : 1 {};
995 /**
996 offset 24 bit 8 */
997 bool unusedBit_14_8 : 1 {};
998 /**
999 offset 24 bit 9 */
1000 bool unusedBit_14_9 : 1 {};
1001 /**
1002 offset 24 bit 10 */
1003 bool unusedBit_14_10 : 1 {};
1004 /**
1005 offset 24 bit 11 */
1006 bool unusedBit_14_11 : 1 {};
1007 /**
1008 offset 24 bit 12 */
1009 bool unusedBit_14_12 : 1 {};
1010 /**
1011 offset 24 bit 13 */
1012 bool unusedBit_14_13 : 1 {};
1013 /**
1014 offset 24 bit 14 */
1015 bool unusedBit_14_14 : 1 {};
1016 /**
1017 offset 24 bit 15 */
1018 bool unusedBit_14_15 : 1 {};
1019 /**
1020 offset 24 bit 16 */
1021 bool unusedBit_14_16 : 1 {};
1022 /**
1023 offset 24 bit 17 */
1024 bool unusedBit_14_17 : 1 {};
1025 /**
1026 offset 24 bit 18 */
1027 bool unusedBit_14_18 : 1 {};
1028 /**
1029 offset 24 bit 19 */
1030 bool unusedBit_14_19 : 1 {};
1031 /**
1032 offset 24 bit 20 */
1033 bool unusedBit_14_20 : 1 {};
1034 /**
1035 offset 24 bit 21 */
1036 bool unusedBit_14_21 : 1 {};
1037 /**
1038 offset 24 bit 22 */
1039 bool unusedBit_14_22 : 1 {};
1040 /**
1041 offset 24 bit 23 */
1042 bool unusedBit_14_23 : 1 {};
1043 /**
1044 offset 24 bit 24 */
1045 bool unusedBit_14_24 : 1 {};
1046 /**
1047 offset 24 bit 25 */
1048 bool unusedBit_14_25 : 1 {};
1049 /**
1050 offset 24 bit 26 */
1051 bool unusedBit_14_26 : 1 {};
1052 /**
1053 offset 24 bit 27 */
1054 bool unusedBit_14_27 : 1 {};
1055 /**
1056 offset 24 bit 28 */
1057 bool unusedBit_14_28 : 1 {};
1058 /**
1059 offset 24 bit 29 */
1060 bool unusedBit_14_29 : 1 {};
1061 /**
1062 offset 24 bit 30 */
1063 bool unusedBit_14_30 : 1 {};
1064 /**
1065 offset 24 bit 31 */
1066 bool unusedBit_14_31 : 1 {};
1067 /**
1068 * EMA filter constant for LTIT (0-255)
1069 * units: 0-255
1070 * offset 28
1071 */
1072 uint8_t ltitEmaAlpha;
1073 /**
1074 * RPM range to consider stable idle
1075 * units: rpm
1076 * offset 29
1077 */
1078 uint8_t ltitStableRpmThreshold;
1079 /**
1080 * Minimum time of stable idle before learning
1081 * units: s
1082 * offset 30
1083 */
1084 uint8_t ltitStableTime;
1085 /**
1086 * LTIT learning rate
1087 * units: %/s
1088 * offset 31
1089 */
1090 uint8_t ltitCorrectionRate;
1091 /**
1092 * Delay after ignition ON before LTIT learning/application
1093 * units: s
1094 * offset 32
1095 */
1096 uint8_t ltitIgnitionOnDelay;
1097 /**
1098 * Delay after ignition OFF before LTIT save
1099 * units: s
1100 * offset 33
1101 */
1103 /**
1104 * need 4 byte alignment
1105 * units: units
1106 * offset 34
1107 */
1108 uint8_t alignmentFill_at_34[2] = {};
1109 /**
1110 * Minimum LTIT multiplicative correction value
1111 * units: %
1112 * offset 36
1113 */
1114 float ltitClampMin;
1115 /**
1116 * Maximum LTIT multiplicative correction value
1117 * units: %
1118 * offset 40
1119 */
1120 float ltitClampMax;
1121 /**
1122 * LTIT table regional smoothing intensity (0=no smoothing)
1123 * units: ratio
1124 * offset 44
1125 */
1126 scaled_channel<uint8_t, 100, 1> ltitSmoothingIntensity;
1127 /**
1128 * need 4 byte alignment
1129 * units: units
1130 * offset 45
1131 */
1132 uint8_t alignmentFill_at_45[3] = {};
1133 /**
1134 * Minimum threshold of PID integrator for LTIT correction
1135 * units: %
1136 * offset 48
1137 */
1139 /**
1140 * offset 52
1141 */
1143 /**
1144 * offset 54
1145 */
1147 /**
1148 * offset 56
1149 */
1150 Gpio canTxPin;
1151 /**
1152 * offset 58
1153 */
1154 Gpio canRxPin;
1155 /**
1156 * Pin that activates the reduction/cut for shifting. Sometimes shared with the Launch Control pin
1157 * offset 60
1158 */
1160 /**
1161 * units: %
1162 * offset 62
1163 */
1165 /**
1166 * Time after which the throttle is considered jammed.
1167 * units: sec
1168 * offset 63
1169 */
1170 scaled_channel<uint8_t, 50, 1> etbJamTimeout;
1171 /**
1172 * offset 64
1173 */
1175 /**
1176 * offset 66
1177 */
1179 /**
1180 * Additional idle % while A/C is active
1181 * units: %
1182 * offset 67
1183 */
1184 uint8_t acIdleExtraOffset;
1185 /**
1186 * This parameter sets the latest that the last multispark can occur after the main ignition event. For example, if the ignition timing is 30 degrees BTDC, and this parameter is set to 45, no multispark will ever be fired after 15 degrees ATDC.
1187 * units: deg
1188 * offset 68
1189 */
1191 /**
1192 * Configures the maximum number of extra sparks to fire (does not include main spark)
1193 * units: count
1194 * offset 69
1195 */
1197 /**
1198 * units: RPM
1199 * offset 70
1200 */
1201 int16_t vvtControlMinRpm;
1202 /**
1203 * offset 72
1204 */
1206 /**
1207 * offset 132
1208 */
1210 /**
1211 * Does the vehicle have a turbo or supercharger?
1212 offset 192 bit 0 */
1213 bool isForcedInduction : 1 {};
1214 /**
1215 * On some Ford and Toyota vehicles one of the throttle sensors is not linear on the full range, i.e. in the specific range of the positions we effectively have only one sensor.
1216 offset 192 bit 1 */
1217 bool useFordRedundantTps : 1 {};
1218 /**
1219 offset 192 bit 2 */
1220 bool enableKline : 1 {};
1221 /**
1222 offset 192 bit 3 */
1223 bool overrideTriggerGaps : 1 {};
1224 /**
1225 * Turn on this fan when AC is on.
1226 offset 192 bit 4 */
1227 bool enableFan1WithAc : 1 {};
1228 /**
1229 * Turn on this fan when AC is on.
1230 offset 192 bit 5 */
1231 bool enableFan2WithAc : 1 {};
1232 /**
1233 * Enable secondary spark outputs that fire after the primary (rotaries, twin plug engines).
1234 offset 192 bit 6 */
1235 bool enableTrailingSparks : 1 {};
1236 /**
1237 * TLE7209 and L6205 use two-wire mode. TLE9201 and VNH2SP30 do NOT use two wire mode.
1238 offset 192 bit 7 */
1239 bool etb_use_two_wires : 1 {};
1240 /**
1241 * Subaru/BMW style where default valve position is somewhere in the middle. First solenoid opens it more while second can close it more than default position.
1242 offset 192 bit 8 */
1243 bool isDoubleSolenoidIdle : 1 {};
1244 /**
1245 offset 192 bit 9 */
1246 bool useEeprom : 1 {};
1247 /**
1248 * Switch between Industrial and Cic PID implementation
1249 offset 192 bit 10 */
1250 bool useCicPidForIdle : 1 {};
1251 /**
1252 offset 192 bit 11 */
1253 bool useTLE8888_cranking_hack : 1 {};
1254 /**
1255 offset 192 bit 12 */
1256 bool kickStartCranking : 1 {};
1257 /**
1258 * This uses separate ignition timing and VE tables not only for idle conditions, also during the postcranking-to-idle taper transition (See also afterCrankingIACtaperDuration).
1259 offset 192 bit 13 */
1261 /**
1262 offset 192 bit 14 */
1263 bool launchControlEnabled : 1 {};
1264 /**
1265 offset 192 bit 15 */
1266 bool antiLagEnabled : 1 {};
1267 /**
1268 * For cranking either use the specified fixed base fuel mass, or use the normal running math (VE table).
1269 offset 192 bit 16 */
1270 bool useRunningMathForCranking : 1 {};
1271 /**
1272 * Shall we display real life signal or just the part consumed by trigger decoder.
1273 * Applies to both trigger and cam/vvt input.
1274 offset 192 bit 17 */
1276 /**
1277 offset 192 bit 18 */
1278 bool useTLE8888_stepper : 1 {};
1279 /**
1280 offset 192 bit 19 */
1282 /**
1283 * Print incoming and outgoing first bus CAN messages in rusEFI console
1284 offset 192 bit 20 */
1285 bool verboseCan : 1 {};
1286 /**
1287 * Experimental setting that will cause a misfire
1288 * DO NOT ENABLE.
1289 offset 192 bit 21 */
1290 bool artificialTestMisfire : 1 {};
1291 /**
1292 * On some Ford and Toyota vehicles one of the pedal sensors is not linear on the full range, i.e. in the specific range of the positions we effectively have only one sensor.
1293 offset 192 bit 22 */
1294 bool useFordRedundantPps : 1 {};
1295 /**
1296 offset 192 bit 23 */
1297 bool cltSensorPulldown : 1 {};
1298 /**
1299 offset 192 bit 24 */
1300 bool iatSensorPulldown : 1 {};
1301 /**
1302 offset 192 bit 25 */
1303 bool allowIdenticalPps : 1 {};
1304 /**
1305 offset 192 bit 26 */
1306 bool overrideVvtTriggerGaps : 1 {};
1307 /**
1308 * If enabled - use onboard SPI Accelerometer, otherwise listen for CAN messages
1309 offset 192 bit 27 */
1310 bool useSpiImu : 1 {};
1311 /**
1312 offset 192 bit 28 */
1313 bool enableStagedInjection : 1 {};
1314 /**
1315 offset 192 bit 29 */
1316 bool useIdleAdvanceWhileCoasting : 1 {};
1317 /**
1318 offset 192 bit 30 */
1319 bool unusedBit_102_30 : 1 {};
1320 /**
1321 offset 192 bit 31 */
1322 bool unusedBit_102_31 : 1 {};
1323 /**
1324 * Closed voltage for primary throttle position sensor
1325 * offset 196
1326 */
1328 /**
1329 * Fully opened voltage for primary throttle position sensor
1330 * offset 198
1331 */
1333 /**
1334 * TPS error detection: what throttle % is unrealistically low?
1335 * Also used for accelerator pedal error detection if so equipped.
1336 * units: %
1337 * offset 200
1338 */
1340 /**
1341 * TPS error detection: what throttle % is unrealistically high?
1342 * Also used for accelerator pedal error detection if so equipped.
1343 * units: %
1344 * offset 202
1345 */
1347 /**
1348 * offset 204
1349 */
1351 /**
1352 * Dwell duration while cranking
1353 * units: ms
1354 * offset 208
1355 */
1357 /**
1358 * Once engine speed passes this value, start reducing ETB angle.
1359 * units: rpm
1360 * offset 212
1361 */
1362 uint16_t etbRevLimitStart;
1363 /**
1364 * This far above 'Soft limiter start', fully close the throttle. At the bottom of the range, throttle control is normal. At the top of the range, the throttle is fully closed.
1365 * units: rpm
1366 * offset 214
1367 */
1368 uint16_t etbRevLimitRange;
1369 /**
1370 * @see isMapAveragingEnabled
1371 * offset 216
1372 */
1374 /**
1375 * todo: merge with channel settings, use full-scale Thermistor here!
1376 * offset 356
1377 */
1379 /**
1380 * offset 388
1381 */
1383 /**
1384 * units: deg
1385 * offset 420
1386 */
1387 float launchTimingRetard;
1388 /**
1389 * Maximum commanded airmass for the idle controller.
1390 * units: mg
1391 * offset 424
1392 */
1393 scaled_channel<uint8_t, 1, 2> idleMaximumAirmass;
1394 /**
1395 * need 4 byte alignment
1396 * units: units
1397 * offset 425
1398 */
1399 uint8_t alignmentFill_at_425[1] = {};
1400 /**
1401 * iTerm min value
1402 * offset 426
1403 */
1404 int16_t alternator_iTermMin;
1405 /**
1406 * iTerm max value
1407 * offset 428
1408 */
1409 int16_t alternator_iTermMax;
1410 /**
1411 * need 4 byte alignment
1412 * units: units
1413 * offset 430
1414 */
1415 uint8_t alignmentFill_at_430[2] = {};
1416 /**
1417 * @@DISPLACEMENT_TOOLTIP@@
1418 * units: L
1419 * offset 432
1420 */
1421 float displacement;
1422 /**
1423 * units: RPM
1424 * offset 436
1425 */
1426 uint16_t triggerSimulatorRpm;
1427 /**
1428 * need 4 byte alignment
1429 * units: units
1430 * offset 438
1431 */
1432 uint8_t alignmentFill_at_438[2] = {};
1433 /**
1434 * Number of cylinder the engine has.
1435 * offset 440
1436 */
1437 uint32_t cylindersCount;
1438 /**
1439 * offset 444
1440 */
1442 /**
1443 * offset 445
1444 */
1445 uint8_t justATempTest;
1446 /**
1447 * Delta kPa/psi for MAP sync
1448 * units: SPECIAL_CASE_PRESSURE
1449 * offset 446
1450 */
1451 uint8_t mapSyncThreshold;
1452 /**
1453 * need 4 byte alignment
1454 * units: units
1455 * offset 447
1456 */
1457 uint8_t alignmentFill_at_447[1] = {};
1458 /**
1459 * @@CYLINDER_BORE_TOOLTIP@@
1460 * units: mm
1461 * offset 448
1462 */
1463 float cylinderBore;
1464 /**
1465 * Determines the method used for calculating fuel delivery. The following options are available:
1466 * Uses intake manifold pressure (MAP) and intake air temperature (IAT) to calculate air density and fuel requirements. This is a common strategy, especially for naturally aspirated or turbocharged engines.
1467 * Alpha-N: Uses throttle position as the primary load input for fuel calculation. This strategy is generally used in engines with individual throttle bodies or those that lack a reliable MAP signal.
1468 * MAF Air Charge: Relies on a Mass Air Flow (MAF) sensor to measure the amount of air entering the engine directly, making it effective for engines equipped with a MAF sensor.
1469 * Lua: Allows for custom fuel calculations using Lua scripting, enabling highly specific tuning applications where the other strategies don't apply.
1470 * offset 452
1471 */
1473 /**
1474 * units: %
1475 * offset 453
1476 */
1477 uint8_t ALSMaxTPS;
1478 /**
1479 * This is the injection strategy during engine start. See Fuel/Injection settings for more detail. It is suggested to use "Simultaneous".
1480 * offset 454
1481 */
1483 /**
1484 * This is where the fuel injection type is defined: "Simultaneous" means all injectors will fire together at once. "Sequential" fires the injectors on a per cylinder basis, which requires individually wired injectors. "Batched" will fire the injectors in groups.
1485 * offset 455
1486 */
1488 /**
1489 * Minimum RPM to enable boost control. Use this to avoid solenoid noise at idle, and help spool in some cases.
1490 * offset 456
1491 */
1492 uint16_t boostControlMinRpm;
1493 /**
1494 * Minimum TPS to enable boost control. Use this to avoid solenoid noise at idle, and help spool in some cases.
1495 * offset 458
1496 */
1497 uint8_t boostControlMinTps;
1498 /**
1499 * need 4 byte alignment
1500 * units: units
1501 * offset 459
1502 */
1503 uint8_t alignmentFill_at_459[1] = {};
1504 /**
1505 * Minimum MAP to enable boost control. Use this to avoid solenoid noise at idle, and help spool in some cases.
1506 * offset 460
1507 */
1508 uint16_t boostControlMinMap;
1509 /**
1510 * Wastegate control Solenoid, set to 'NONE' if you are using DC wastegate
1511 * offset 462
1512 */
1514 /**
1515 * offset 464
1516 */
1518 /**
1519 * need 4 byte alignment
1520 * units: units
1521 * offset 465
1522 */
1523 uint8_t alignmentFill_at_465[3] = {};
1524 /**
1525 * Ignition advance angle used during engine cranking, 5-10 degrees will work as a base setting for most engines.
1526 * There is tapering towards running timing advance
1527 * set cranking_timing_angle X
1528 * units: deg
1529 * offset 468
1530 */
1532 /**
1533 * Single coil = distributor
1534 * Individual coils = one coil per cylinder (COP, coil-near-plug), requires sequential mode
1535 * Wasted spark = Fires pairs of cylinders together, either one coil per pair of cylinders or one coil per cylinder
1536 * Two distributors = A pair of distributors, found on some BMW, Toyota and other engines
1537 * set ignition_mode X
1538 * offset 472
1539 */
1541 /**
1542 * How many consecutive gap rations have to match expected ranges for sync to happen
1543 * units: count
1544 * offset 473
1545 */
1547 /**
1548 * Above this speed, disable closed loop idle control. Set to 0 to disable (allow closed loop idle at any speed).
1549 * units: SPECIAL_CASE_SPEED
1550 * offset 474
1551 */
1552 uint8_t maxIdleVss;
1553 /**
1554 * Allowed range around detection position
1555 * offset 475
1556 */
1557 uint8_t camDecoder2jzPrecision;
1558 /**
1559 * Expected oil pressure after starting the engine. If oil pressure does not reach this level within 5 seconds of engine start, fuel will be cut. Set to 0 to disable and always allow starting.
1560 * units: SPECIAL_CASE_PRESSURE
1561 * offset 476
1562 */
1563 uint16_t minOilPressureAfterStart;
1564 /**
1565 * Dynamic uses the timing map to decide the ignition timing
1566 * Static timing fixes the timing to the value set below (only use for checking static timing with a timing light).
1567 * offset 478
1568 */
1570 /**
1571 * offset 479
1572 */
1574 /**
1575 * This value is the ignition timing used when in 'fixed timing' mode, i.e. constant timing
1576 * This mode is useful when adjusting distributor location.
1577 * units: RPM
1578 * offset 480
1579 */
1581 /**
1582 * Angle between Top Dead Center (TDC) and the first trigger event.
1583 * Positive value in case of synchronization point before TDC and negative in case of synchronization point after TDC
1584 * .Knowing this angle allows us to control timing and other angles in reference to TDC.
1585 * HOWTO:
1586 * 1: Switch to fixed timing mode on 'ignition setting' dialog
1587 * 2: use an actual timing light to calibrate
1588 * 3: add/subtract until timing light confirms desired fixed timing value!'
1589 * units: deg btdc
1590 * offset 484
1591 */
1593 /**
1594 * Ratio/coefficient of input voltage dividers on your PCB. For example, use '2' if your board divides 5v into 2.5v. Use '1.66' if your board divides 5v into 3v.
1595 * units: coef
1596 * offset 488
1597 */
1599 /**
1600 * This is the ratio of the resistors for the battery voltage, measure the voltage at the battery and then adjust this number until the gauge matches the reading.
1601 * units: coef
1602 * offset 492
1603 */
1604 float vbattDividerCoeff;
1605 /**
1606 * offset 496
1607 */
1609 /**
1610 * offset 498
1611 */
1613 /**
1614 * need 4 byte alignment
1615 * units: units
1616 * offset 499
1617 */
1618 uint8_t alignmentFill_at_499[1] = {};
1619 /**
1620 * Cooling fan turn-on temperature threshold, in Celsius
1621 * units: SPECIAL_CASE_TEMPERATURE
1622 * offset 500
1623 */
1624 int16_t fanOnTemperature;
1625 /**
1626 * Cooling fan turn-off temperature threshold, in Celsius
1627 * units: SPECIAL_CASE_TEMPERATURE
1628 * offset 502
1629 */
1630 int16_t fanOffTemperature;
1631 /**
1632 * offset 504
1633 */
1635 /**
1636 * offset 506
1637 */
1639 /**
1640 * need 4 byte alignment
1641 * units: units
1642 * offset 507
1643 */
1644 uint8_t alignmentFill_at_507[1] = {};
1645 /**
1646 * Cooling fan turn-on temperature threshold, in Celsius
1647 * units: SPECIAL_CASE_TEMPERATURE
1648 * offset 508
1649 */
1650 int16_t fan2OnTemperature;
1651 /**
1652 * Cooling fan turn-off temperature threshold, in Celsius
1653 * units: SPECIAL_CASE_TEMPERATURE
1654 * offset 510
1655 */
1656 int16_t fan2OffTemperature;
1657 /**
1658 * offset 512
1659 */
1660 int8_t disableFan1AtSpeed;
1661 /**
1662 * offset 513
1663 */
1664 int8_t disableFan2AtSpeed;
1665 /**
1666 * need 4 byte alignment
1667 * units: units
1668 * offset 514
1669 */
1670 uint8_t alignmentFill_at_514[2] = {};
1671 /**
1672 * Inhibit operation of this fan while the engine is not running.
1673 offset 516 bit 0 */
1674 bool disableFan1WhenStopped : 1 {};
1675 /**
1676 * Inhibit operation of this fan while the engine is not running.
1677 offset 516 bit 1 */
1678 bool disableFan2WhenStopped : 1 {};
1679 /**
1680 offset 516 bit 2 */
1681 bool unusedBit_168_2 : 1 {};
1682 /**
1683 offset 516 bit 3 */
1684 bool unusedBit_168_3 : 1 {};
1685 /**
1686 offset 516 bit 4 */
1687 bool unusedBit_168_4 : 1 {};
1688 /**
1689 offset 516 bit 5 */
1690 bool unusedBit_168_5 : 1 {};
1691 /**
1692 offset 516 bit 6 */
1693 bool unusedBit_168_6 : 1 {};
1694 /**
1695 offset 516 bit 7 */
1696 bool unusedBit_168_7 : 1 {};
1697 /**
1698 offset 516 bit 8 */
1699 bool unusedBit_168_8 : 1 {};
1700 /**
1701 offset 516 bit 9 */
1702 bool unusedBit_168_9 : 1 {};
1703 /**
1704 offset 516 bit 10 */
1705 bool unusedBit_168_10 : 1 {};
1706 /**
1707 offset 516 bit 11 */
1708 bool unusedBit_168_11 : 1 {};
1709 /**
1710 offset 516 bit 12 */
1711 bool unusedBit_168_12 : 1 {};
1712 /**
1713 offset 516 bit 13 */
1714 bool unusedBit_168_13 : 1 {};
1715 /**
1716 offset 516 bit 14 */
1717 bool unusedBit_168_14 : 1 {};
1718 /**
1719 offset 516 bit 15 */
1720 bool unusedBit_168_15 : 1 {};
1721 /**
1722 offset 516 bit 16 */
1723 bool unusedBit_168_16 : 1 {};
1724 /**
1725 offset 516 bit 17 */
1726 bool unusedBit_168_17 : 1 {};
1727 /**
1728 offset 516 bit 18 */
1729 bool unusedBit_168_18 : 1 {};
1730 /**
1731 offset 516 bit 19 */
1732 bool unusedBit_168_19 : 1 {};
1733 /**
1734 offset 516 bit 20 */
1735 bool unusedBit_168_20 : 1 {};
1736 /**
1737 offset 516 bit 21 */
1738 bool unusedBit_168_21 : 1 {};
1739 /**
1740 offset 516 bit 22 */
1741 bool unusedBit_168_22 : 1 {};
1742 /**
1743 offset 516 bit 23 */
1744 bool unusedBit_168_23 : 1 {};
1745 /**
1746 offset 516 bit 24 */
1747 bool unusedBit_168_24 : 1 {};
1748 /**
1749 offset 516 bit 25 */
1750 bool unusedBit_168_25 : 1 {};
1751 /**
1752 offset 516 bit 26 */
1753 bool unusedBit_168_26 : 1 {};
1754 /**
1755 offset 516 bit 27 */
1756 bool unusedBit_168_27 : 1 {};
1757 /**
1758 offset 516 bit 28 */
1759 bool unusedBit_168_28 : 1 {};
1760 /**
1761 offset 516 bit 29 */
1762 bool unusedBit_168_29 : 1 {};
1763 /**
1764 offset 516 bit 30 */
1765 bool unusedBit_168_30 : 1 {};
1766 /**
1767 offset 516 bit 31 */
1768 bool unusedBit_168_31 : 1 {};
1769 /**
1770 * offset 520
1771 */
1773 /**
1774 * need 4 byte alignment
1775 * units: units
1776 * offset 522
1777 */
1778 uint8_t alignmentFill_at_522[2] = {};
1779 /**
1780 * Number of revolutions per kilometer for the wheels your vehicle speed sensor is connected to. Use an online calculator to determine this based on your tire size.
1781 * units: revs/km
1782 * offset 524
1783 */
1784 float driveWheelRevPerKm;
1785 /**
1786 * CANbus thread period in ms
1787 * units: ms
1788 * offset 528
1789 */
1790 int canSleepPeriodMs;
1791 /**
1792 * units: index
1793 * offset 532
1794 */
1796 /**
1797 * First throttle body, first sensor. See also pedalPositionAdcChannel
1798 * Analog TPS inputs have 200Hz low-pass cutoff.
1799 * offset 536
1800 */
1802 /**
1803 * This is the processor input pin that the battery voltage circuit is connected to, if you are unsure of what pin to use, check the schematic that corresponds to your PCB.
1804 * offset 537
1805 */
1807 /**
1808 * This is the processor pin that your fuel level sensor in connected to. This is a non standard input so will need to be user defined.
1809 * offset 538
1810 */
1812 /**
1813 * Second throttle body position sensor, single channel so far
1814 * offset 539
1815 */
1817 /**
1818 * 0.1 is a good default value
1819 * units: x
1820 * offset 540
1821 */
1823 /**
1824 * offset 544
1825 */
1827 /**
1828 * Extra air taper amount
1829 * units: %
1830 * offset 556
1831 */
1832 float airByRpmTaper;
1833 /**
1834 * Duty cycle to use in case of a sensor failure. This duty cycle should produce the minimum possible amount of boost. This duty is also used in case any of the minimum RPM/TPS/MAP conditions are not met.
1835 * units: %
1836 * offset 560
1837 */
1839 /**
1840 * offset 561
1841 */
1843 /**
1844 * offset 562
1845 */
1846 uint8_t acrRevolutions;
1847 /**
1848 * need 4 byte alignment
1849 * units: units
1850 * offset 563
1851 */
1852 uint8_t alignmentFill_at_563[1] = {};
1853 /**
1854 * offset 564
1855 */
1857 /**
1858 * units: volts
1859 * offset 568
1860 */
1861 float adcVcc;
1862 /**
1863 * Magic engine phase: we compare instant MAP at X to instant MAP at x+360 angle in one complete cycle
1864 * units: Deg
1865 * offset 572
1866 */
1868 /**
1869 * Camshaft input could be used either just for engine phase detection if your trigger shape does not include cam sensor as 'primary' channel, or it could be used for Variable Valve timing on one of the camshafts.
1870 * offset 576
1871 */
1872 brain_input_pin_e camInputs[CAM_INPUTS_COUNT] = {};
1873 /**
1874 * offset 584
1875 */
1877 /**
1878 * Electronic throttle pedal position first channel
1879 * See throttlePedalPositionSecondAdcChannel for second channel
1880 * See also tps1_1AdcChannel
1881 * See throttlePedalUpVoltage and throttlePedalWOTVoltage
1882 * offset 604
1883 */
1885 /**
1886 * TPS/PPS error threshold
1887 * units: %
1888 * offset 605
1889 */
1890 scaled_channel<uint8_t, 10, 1> etbSplit;
1891 /**
1892 * offset 606
1893 */
1895 /**
1896 * offset 608
1897 */
1899 /**
1900 * offset 609
1901 */
1903 /**
1904 * need 4 byte alignment
1905 * units: units
1906 * offset 610
1907 */
1908 uint8_t alignmentFill_at_610[2] = {};
1909 /**
1910 * @see hasBaroSensor
1911 * offset 612
1912 */
1914 /**
1915 * offset 624
1916 */
1918 /**
1919 * Ignition timing to remove when a knock event occurs. Advice: 5% (mild), 10% (turbo/high comp.), 15% (high knock, e.g. GDI), 20% (spicy lump),
1920 * units: %
1921 * offset 636
1922 */
1923 scaled_channel<uint8_t, 10, 1> knockRetardAggression;
1924 /**
1925 * After a knock event, reapply timing at this rate.
1926 * units: deg/s
1927 * offset 637
1928 */
1929 scaled_channel<uint8_t, 10, 1> knockRetardReapplyRate;
1930 /**
1931 * Select which cam is used for engine sync. Other cams will be used only for VVT measurement, but not engine sync.
1932 * offset 638
1933 */
1935 /**
1936 * offset 639
1937 */
1939 /**
1940 * Number of turns of your vehicle speed sensor per turn of the wheels. For example if your sensor is on the transmission output, enter your axle/differential ratio. If you are using a hub-mounted sensor, enter a value of 1.0.
1941 * units: ratio
1942 * offset 640
1943 */
1944 scaled_channel<uint16_t, 1000, 1> vssGearRatio;
1945 /**
1946 * Set this so your vehicle speed signal is responsive, but not noisy. Larger value give smoother but slower response.
1947 * offset 642
1948 */
1949 uint8_t vssFilterReciprocal;
1950 /**
1951 * Number of pulses output per revolution of the shaft where your VSS is mounted. For example, GM applications of the T56 output 17 pulses per revolution of the transmission output shaft.
1952 * units: count
1953 * offset 643
1954 */
1955 uint8_t vssToothCount;
1956 /**
1957 * Allows you to change the default load axis used for the VE table, which is typically MAP (manifold absolute pressure).
1958 * offset 644
1959 */
1961 /**
1962 * need 4 byte alignment
1963 * units: units
1964 * offset 645
1965 */
1966 uint8_t alignmentFill_at_645[1] = {};
1967 /**
1968 * offset 646
1969 */
1970 Gpio l9779_cs;
1971 /**
1972 * offset 648
1973 */
1974 output_pin_e injectionPins[MAX_CYLINDER_COUNT] = {};
1975 /**
1976 * offset 672
1977 */
1978 output_pin_e ignitionPins[MAX_CYLINDER_COUNT] = {};
1979 /**
1980 * offset 696
1981 */
1983 /**
1984 * offset 697
1985 */
1987 /**
1988 * offset 698
1989 */
1991 /**
1992 * offset 700
1993 */
1995 /**
1996 * How many consecutive VVT gap rations have to match expected ranges for sync to happen
1997 * units: count
1998 * offset 701
1999 */
2001 /**
2002 * Check engine light, also malfunction indicator light. Always blinks once on boot.
2003 * offset 702
2004 */
2006 /**
2007 * offset 704
2008 */
2010 /**
2011 * need 4 byte alignment
2012 * units: units
2013 * offset 705
2014 */
2015 uint8_t alignmentFill_at_705[1] = {};
2016 /**
2017 * Some cars have a switch to indicate that clutch pedal is all the way down
2018 * offset 706
2019 */
2021 /**
2022 * offset 708
2023 */
2025 /**
2026 * offset 710
2027 */
2029 /**
2030 * offset 711
2031 */
2033 /**
2034 * offset 712
2035 */
2036 Gpio digitalPotentiometerChipSelect[DIGIPOT_COUNT] = {};
2037 /**
2038 * offset 720
2039 */
2041 /**
2042 * offset 721
2043 */
2045 /**
2046 * offset 722
2047 */
2049 /**
2050 * Digital Potentiometer is used by stock ECU stimulation code
2051 * offset 724
2052 */
2054 /**
2055 * offset 725
2056 */
2058 /**
2059 * offset 726
2060 */
2062 /**
2063 * offset 728
2064 */
2066 /**
2067 * Useful in Research&Development phase
2068 * offset 729
2069 */
2071 /**
2072 * First throttle body, second sensor.
2073 * offset 730
2074 */
2076 /**
2077 * Second throttle body, second sensor.
2078 * offset 731
2079 */
2081 /**
2082 * Electronic throttle pedal position input
2083 * Second channel
2084 * See also tps1_1AdcChannel
2085 * See throttlePedalSecondaryUpVoltage and throttlePedalSecondaryWOTVoltage
2086 * offset 732
2087 */
2089 /**
2090 * AFR, WBO, EGO - whatever you like to call it
2091 * offset 733
2092 */
2094 /**
2095 * offset 734
2096 */
2097 Gpio mc33810_cs[C_MC33810_COUNT] = {};
2098 /**
2099 * 0.1 is a good default value
2100 * units: x
2101 * offset 736
2102 */
2103 float idle_antiwindupFreq;
2104 /**
2105 * offset 740
2106 */
2107 brain_input_pin_e triggerInputPins[TRIGGER_INPUT_PIN_COUNT] = {};
2108 /**
2109 * Minimum allowed time for the boost phase. If the boost target current is reached before this time elapses, it is assumed that the injector has failed short circuit.
2110 * units: us
2111 * offset 744
2112 */
2113 uint16_t mc33_t_min_boost;
2114 /**
2115 * Ratio between the wheels and your transmission output.
2116 * units: ratio
2117 * offset 746
2118 */
2119 scaled_channel<uint16_t, 100, 1> finalGearRatio;
2120 /**
2121 * offset 748
2122 */
2124 /**
2125 * offset 750
2126 */
2128 /**
2129 * need 4 byte alignment
2130 * units: units
2131 * offset 751
2132 */
2133 uint8_t alignmentFill_at_751[1] = {};
2134 /**
2135 * Each rusEFI piece can provide synthetic trigger signal for external ECU. Sometimes these wires are routed back into trigger inputs of the same rusEFI board.
2136 * See also directSelfStimulation which is different.
2137 * offset 752
2138 */
2139 Gpio triggerSimulatorPins[TRIGGER_SIMULATOR_PIN_COUNT] = {};
2140 /**
2141 * units: g/s
2142 * offset 756
2143 */
2144 scaled_channel<uint16_t, 1000, 1> fordInjectorSmallPulseSlope;
2145 /**
2146 * offset 758
2147 */
2148 pin_output_mode_e triggerSimulatorPinModes[TRIGGER_SIMULATOR_PIN_COUNT] = {};
2149 /**
2150 * offset 760
2151 */
2153 /**
2154 * need 4 byte alignment
2155 * units: units
2156 * offset 761
2157 */
2158 uint8_t alignmentFill_at_761[1] = {};
2159 /**
2160 * On-off O2 sensor heater control. 'ON' if engine is running, 'OFF' if stopped or cranking.
2161 * offset 762
2162 */
2164 /**
2165 * offset 764
2166 */
2168 /**
2169 * units: RPM
2170 * offset 765
2171 */
2172 scaled_channel<uint8_t, 1, 100> lambdaProtectionMinRpm;
2173 /**
2174 * units: %
2175 * offset 766
2176 */
2177 scaled_channel<uint8_t, 1, 10> lambdaProtectionMinLoad;
2178 /**
2179 * need 4 byte alignment
2180 * units: units
2181 * offset 767
2182 */
2183 uint8_t alignmentFill_at_767[1] = {};
2184 /**
2185 offset 768 bit 0 */
2186 bool is_enabled_spi_1 : 1 {};
2187 /**
2188 offset 768 bit 1 */
2189 bool is_enabled_spi_2 : 1 {};
2190 /**
2191 offset 768 bit 2 */
2192 bool is_enabled_spi_3 : 1 {};
2193 /**
2194 offset 768 bit 3 */
2195 bool isSdCardEnabled : 1 {};
2196 /**
2197 * Use 11 bit (standard) or 29 bit (extended) IDs for rusEFI verbose CAN format.
2198 offset 768 bit 4 */
2199 bool rusefiVerbose29b : 1 {};
2200 /**
2201 offset 768 bit 5 */
2202 bool rethrowHardFault : 1 {};
2203 /**
2204 offset 768 bit 6 */
2205 bool verboseQuad : 1 {};
2206 /**
2207 * This setting should only be used if you have a stepper motor idle valve and a stepper motor driver installed.
2208 offset 768 bit 7 */
2209 bool useStepperIdle : 1 {};
2210 /**
2211 offset 768 bit 8 */
2212 bool enabledStep1Limiter : 1 {};
2213 /**
2214 offset 768 bit 9 */
2215 bool lambdaProtectionEnable : 1 {};
2216 /**
2217 offset 768 bit 10 */
2218 bool verboseTLE8888 : 1 {};
2219 /**
2220 * CAN broadcast using custom rusEFI protocol
2221 offset 768 bit 11 */
2222 bool enableVerboseCanTx : 1 {};
2223 /**
2224 offset 768 bit 12 */
2225 bool externalRusEfiGdiModule : 1 {};
2226 /**
2227 offset 768 bit 13 */
2228 bool unusedFlipWboChannels : 1 {};
2229 /**
2230 * Useful for individual intakes
2231 offset 768 bit 14 */
2232 bool measureMapOnlyInOneCylinder : 1 {};
2233 /**
2234 offset 768 bit 15 */
2236 /**
2237 * If enabled, try to fire the engine before a full engine cycle has been completed using RPM estimated from the last 90 degrees of engine rotation. As soon as the trigger syncs plus 90 degrees rotation, fuel and ignition events will occur. If disabled, worst case may require up to 4 full crank rotations before any events are scheduled.
2238 offset 768 bit 16 */
2239 bool isFasterEngineSpinUpEnabled : 1 {};
2240 /**
2241 * This setting disables fuel injection while the engine is in overrun, this is useful as a fuel saving measure and to prevent back firing.
2242 offset 768 bit 17 */
2243 bool coastingFuelCutEnabled : 1 {};
2244 /**
2245 * Override the IAC position during overrun conditions to help reduce engine breaking, this can be helpful for large engines in light weight cars or engines that have trouble returning to idle.
2246 offset 768 bit 18 */
2247 bool useIacTableForCoasting : 1 {};
2248 /**
2249 offset 768 bit 19 */
2250 bool useNoiselessTriggerDecoder : 1 {};
2251 /**
2252 offset 768 bit 20 */
2253 bool useIdleTimingPidControl : 1 {};
2254 /**
2255 * Allows disabling the ETB when the engine is stopped. You may not like the power draw or PWM noise from the motor, so this lets you turn it off until it's necessary.
2256 offset 768 bit 21 */
2257 bool disableEtbWhenEngineStopped : 1 {};
2258 /**
2259 offset 768 bit 22 */
2260 bool is_enabled_spi_4 : 1 {};
2261 /**
2262 * Disable the electronic throttle motor and DC idle motor for testing.
2263 * This mode is for testing ETB/DC idle position sensors, etc without actually driving the throttle.
2264 offset 768 bit 23 */
2265 bool pauseEtbControl : 1 {};
2266 /**
2267 offset 768 bit 24 */
2268 bool verboseKLine : 1 {};
2269 /**
2270 offset 768 bit 25 */
2271 bool idleIncrementalPidCic : 1 {};
2272 /**
2273 * AEM X-Series or rusEFI Wideband
2274 offset 768 bit 26 */
2275 bool enableAemXSeries : 1 {};
2276 /**
2277 offset 768 bit 27 */
2278 bool modeledFlowIdle : 1 {};
2279 /**
2280 offset 768 bit 28 */
2281 bool isTuningDetectorEnabled : 1 {};
2282 /**
2283 offset 768 bit 29 */
2285 /**
2286 offset 768 bit 30 */
2287 bool unusedBit_312_30 : 1 {};
2288 /**
2289 offset 768 bit 31 */
2290 bool unusedBit_312_31 : 1 {};
2291 /**
2292 * offset 772
2293 */
2294 brain_input_pin_e logicAnalyzerPins[LOGIC_ANALYZER_CHANNEL_COUNT] = {};
2295 /**
2296 * offset 780
2297 */
2299 /**
2300 * need 4 byte alignment
2301 * units: units
2302 * offset 781
2303 */
2304 uint8_t alignmentFill_at_781[3] = {};
2305 /**
2306 * offset 784
2307 */
2308 uint32_t verboseCanBaseAddress;
2309 /**
2310 * Boost Voltage
2311 * units: v
2312 * offset 788
2313 */
2314 uint8_t mc33_hvolt;
2315 /**
2316 * need 4 byte alignment
2317 * units: units
2318 * offset 789
2319 */
2320 uint8_t alignmentFill_at_789[1] = {};
2321 /**
2322 * Minimum MAP before closed loop boost is enabled. Use to prevent misbehavior upon entering boost.
2323 * units: SPECIAL_CASE_PRESSURE
2324 * offset 790
2325 */
2327 /**
2328 * units: %
2329 * offset 792
2330 */
2332 /**
2333 * units: %
2334 * offset 793
2335 */
2337 /**
2338 * offset 794
2339 */
2341 /**
2342 * offset 795
2343 */
2345 /**
2346 * offset 796
2347 */
2349 /**
2350 * need 4 byte alignment
2351 * units: units
2352 * offset 797
2353 */
2354 uint8_t alignmentFill_at_797[1] = {};
2355 /**
2356 * How far above idle speed do we consider idling, i.e. coasting detection threshold.
2357 * For example, if target = 800, this param = 200, then anything below 1000 RPM is considered idle.
2358 * units: RPM
2359 * offset 798
2360 */
2361 int16_t idlePidRpmUpperLimit;
2362 /**
2363 * Apply nonlinearity correction below a pulse of this duration. Pulses longer than this duration will receive no adjustment.
2364 * units: ms
2365 * offset 800
2366 */
2367 scaled_channel<uint16_t, 1000, 1> applyNonlinearBelowPulse;
2368 /**
2369 * offset 802
2370 */
2372 /**
2373 * offset 804
2374 */
2376 /**
2377 * offset 806
2378 */
2380 /**
2381 * Some vehicles have a switch to indicate that clutch pedal is all the way up
2382 * offset 808
2383 */
2385 /**
2386 * offset 810
2387 */
2389 /**
2390 * offset 811
2391 */
2393 /**
2394 * offset 812
2395 */
2396 Gpio max31855_cs[EGT_CHANNEL_COUNT] = {};
2397 /**
2398 * Continental/GM flex fuel sensor, 50-150hz type
2399 * offset 828
2400 */
2402 /**
2403 * Since torque reduction pin is usually shared with launch control, most people have an RPM where behavior under that is Launch Control, over that is Flat Shift/Torque Reduction
2404 * units: rpm
2405 * offset 830
2406 */
2407 uint16_t torqueReductionArmingRpm;
2408 /**
2409 * offset 832
2410 */
2412 /**
2413 * offset 833
2414 */
2416 /**
2417 * Stoichiometric ratio for your secondary fuel. This value is used when the Flex Fuel sensor indicates E100, typically 9.0
2418 * units: :1
2419 * offset 834
2420 */
2421 scaled_channel<uint8_t, 10, 1> stoichRatioSecondary;
2422 /**
2423 * Maximum allowed ETB position. Some throttles go past fully open, so this allows you to limit it to fully open.
2424 * units: %
2425 * offset 835
2426 */
2427 uint8_t etbMaximumPosition;
2428 /**
2429 * Rate the ECU will log to the SD card, in hz (log lines per second).
2430 * units: hz
2431 * offset 836
2432 */
2433 uint16_t sdCardLogFrequency;
2434 /**
2435 * offset 838
2436 */
2438 /**
2439 * need 4 byte alignment
2440 * units: units
2441 * offset 839
2442 */
2443 uint8_t alignmentFill_at_839[1] = {};
2444 /**
2445 * offset 840
2446 */
2447 uint16_t launchCorrectionsEndRpm;
2448 /**
2449 * offset 842
2450 */
2452 /**
2453 * On some vehicles we can disable starter once engine is already running
2454 * offset 844
2455 */
2457 /**
2458 * need 4 byte alignment
2459 * units: units
2460 * offset 845
2461 */
2462 uint8_t alignmentFill_at_845[1] = {};
2463 /**
2464 * Some Subaru and some Mazda use double-solenoid idle air valve
2465 * offset 846
2466 */
2468 /**
2469 * See also starterControlPin
2470 * offset 848
2471 */
2473 /**
2474 * units: RPM
2475 * offset 850
2476 */
2477 scaled_channel<uint8_t, 1, 100> lambdaProtectionRestoreRpm;
2478 /**
2479 * offset 851
2480 */
2482 /**
2483 * This many MAP samples are used to estimate the current MAP. This many samples are considered, and the minimum taken. Recommended value is 1 for single-throttle engines, and your number of cylinders for individual throttle bodies.
2484 * units: count
2485 * offset 852
2486 */
2488 /**
2489 * Below this throttle position, the engine is considered idling. If you have an electronic throttle, this checks accelerator pedal position instead of throttle position, and should be set to 1-2%.
2490 * units: %
2491 * offset 856
2492 */
2494 /**
2495 * units: %
2496 * offset 858
2497 */
2499 /**
2500 * Closed voltage for secondary throttle position sensor
2501 * offset 860
2502 */
2504 /**
2505 * Fully opened voltage for secondary throttle position sensor
2506 * offset 862
2507 */
2509 /**
2510 * Maximum time to crank starter when start/stop button is pressed
2511 * units: Seconds
2512 * offset 864
2513 */
2514 uint16_t startCrankingDuration;
2515 /**
2516 * This pin is used for debugging - snap a logic analyzer on it and see if it's ever high
2517 * offset 866
2518 */
2520 /**
2521 * offset 868
2522 */
2524 /**
2525 * need 4 byte alignment
2526 * units: units
2527 * offset 869
2528 */
2529 uint8_t alignmentFill_at_869[1] = {};
2530 /**
2531 * offset 870
2532 */
2534 /**
2535 * units: %
2536 * offset 872
2537 */
2538 uint8_t lambdaProtectionMinTps;
2539 /**
2540 * Only respond once lambda is out of range for this period of time. Use to avoid transients triggering lambda protection when not needed
2541 * units: s
2542 * offset 873
2543 */
2544 scaled_channel<uint8_t, 10, 1> lambdaProtectionTimeout;
2545 /**
2546 * need 4 byte alignment
2547 * units: units
2548 * offset 874
2549 */
2550 uint8_t alignmentFill_at_874[2] = {};
2551 /**
2552 * offset 876
2553 */
2554 script_setting_t scriptSetting[SCRIPT_SETTING_COUNT] = {};
2555 /**
2556 * offset 908
2557 */
2559 /**
2560 * offset 910
2561 */
2563 /**
2564 * offset 912
2565 */
2567 /**
2568 * offset 914
2569 */
2571 /**
2572 * offset 916
2573 */
2575 /**
2576 * offset 918
2577 */
2579 /**
2580 * offset 920
2581 */
2583 /**
2584 * offset 922
2585 */
2587 /**
2588 * offset 924
2589 */
2591 /**
2592 * UNUSED
2593 * Will remove in 2026 for sure
2594 * Saab Combustion Detection Module knock signal input pin
2595 * also known as Saab Ion Sensing Module
2596 * offset 926
2597 */
2599 /**
2600 * offset 928
2601 */
2603 /**
2604 * need 4 byte alignment
2605 * units: units
2606 * offset 929
2607 */
2608 uint8_t alignmentFill_at_929[3] = {};
2609 /**
2610 * Ramp the idle target down from the entry threshold over N seconds when returning to idle. Helps prevent overshooting (below) the idle target while returning to idle from coasting.
2611 offset 932 bit 0 */
2612 bool idleReturnTargetRamp : 1 {};
2613 /**
2614 offset 932 bit 1 */
2616 /**
2617 * If enabled we use two H-bridges to drive stepper idle air valve
2618 offset 932 bit 2 */
2620 /**
2621 offset 932 bit 3 */
2622 bool multisparkEnable : 1 {};
2623 /**
2624 offset 932 bit 4 */
2625 bool enableLaunchRetard : 1 {};
2626 /**
2627 offset 932 bit 5 */
2628 bool canInputBCM : 1 {};
2629 /**
2630 * This property is useful if using rusEFI as TCM or BCM only
2631 offset 932 bit 6 */
2632 bool consumeObdSensors : 1 {};
2633 /**
2634 * Read VSS from OEM CAN bus according to selected CAN vehicle configuration.
2635 offset 932 bit 7 */
2636 bool enableCanVss : 1 {};
2637 /**
2638 * If enabled, adjust at a constant rate instead of a rate proportional to the current lambda error. This mode may be easier to tune, and more tolerant of sensor noise.
2639 offset 932 bit 8 */
2640 bool stftIgnoreErrorMagnitude : 1 {};
2641 /**
2642 offset 932 bit 9 */
2644 /**
2645 offset 932 bit 10 */
2646 bool enableSoftwareKnock : 1 {};
2647 /**
2648 * Verbose info in console below engineSnifferRpmThreshold
2649 offset 932 bit 11 */
2650 bool verboseVVTDecoding : 1 {};
2651 /**
2652 offset 932 bit 12 */
2653 bool invertCamVVTSignal : 1 {};
2654 /**
2655 * When set to yes, it enables intake air temperature-based corrections for Alpha-N tuning strategies.
2656 offset 932 bit 13 */
2657 bool alphaNUseIat : 1 {};
2658 /**
2659 offset 932 bit 14 */
2660 bool knockBankCyl1 : 1 {};
2661 /**
2662 offset 932 bit 15 */
2663 bool knockBankCyl2 : 1 {};
2664 /**
2665 offset 932 bit 16 */
2666 bool knockBankCyl3 : 1 {};
2667 /**
2668 offset 932 bit 17 */
2669 bool knockBankCyl4 : 1 {};
2670 /**
2671 offset 932 bit 18 */
2672 bool knockBankCyl5 : 1 {};
2673 /**
2674 offset 932 bit 19 */
2675 bool knockBankCyl6 : 1 {};
2676 /**
2677 offset 932 bit 20 */
2678 bool knockBankCyl7 : 1 {};
2679 /**
2680 offset 932 bit 21 */
2681 bool knockBankCyl8 : 1 {};
2682 /**
2683 offset 932 bit 22 */
2684 bool knockBankCyl9 : 1 {};
2685 /**
2686 offset 932 bit 23 */
2687 bool knockBankCyl10 : 1 {};
2688 /**
2689 offset 932 bit 24 */
2690 bool knockBankCyl11 : 1 {};
2691 /**
2692 offset 932 bit 25 */
2693 bool knockBankCyl12 : 1 {};
2694 /**
2695 offset 932 bit 26 */
2696 bool tcuEnabled : 1 {};
2697 /**
2698 offset 932 bit 27 */
2699 bool canBroadcastUseChannelTwo : 1 {};
2700 /**
2701 * If enabled we use four Push-Pull outputs to directly drive stepper idle air valve coils
2702 offset 932 bit 28 */
2704 /**
2705 * Print incoming and outgoing second bus CAN messages in rusEFI console
2706 offset 932 bit 29 */
2707 bool verboseCan2 : 1 {};
2708 /**
2709 offset 932 bit 30 */
2710 bool unusedBit_409_30 : 1 {};
2711 /**
2712 offset 932 bit 31 */
2713 bool unusedBit_409_31 : 1 {};
2714 /**
2715 * offset 936
2716 */
2717 dc_io etbIo[ETB_COUNT] = {};
2718 /**
2719 * offset 952
2720 */
2722 /**
2723 * offset 954
2724 */
2726 /**
2727 * offset 956
2728 */
2730 /**
2731 * offset 976
2732 */
2734 /**
2735 * offset 977
2736 */
2738 /**
2739 * offset 978
2740 */
2742 /**
2743 * units: Hz
2744 * offset 980
2745 */
2747 /**
2748 * offset 984
2749 */
2751 /**
2752 * offset 985
2753 */
2755 /**
2756 * offset 986
2757 */
2759 /**
2760 * How long to look back for TPS-based acceleration enrichment. Increasing this time will trigger enrichment for longer when a throttle position change occurs.
2761 * units: sec
2762 * offset 987
2763 */
2764 scaled_channel<uint8_t, 20, 1> tpsAccelLookback;
2765 /**
2766 * For decel we simply multiply delta of TPS and tFor decel we do not use table?!
2767 * units: roc
2768 * offset 988
2769 */
2771 /**
2772 * Magic multiplier, we multiply delta of TPS and get fuel squirt duration
2773 * units: coeff
2774 * offset 992
2775 */
2777 /**
2778 * Selects the acceleration enrichment strategy.
2779 * offset 996
2780 */
2782 /**
2783 * Pause closed loop fueling after deceleration fuel cut occurs. Set this to a little longer than however long is required for normal fueling behavior to resume after fuel cut.
2784 * units: sec
2785 * offset 997
2786 */
2787 scaled_channel<uint8_t, 10, 1> noFuelTrimAfterDfcoTime;
2788 /**
2789 * Pause closed loop fueling after acceleration fuel occurs. Set this to a little longer than however long is required for normal fueling behavior to resume after fuel accel.
2790 * units: sec
2791 * offset 998
2792 */
2793 scaled_channel<uint8_t, 10, 1> noFuelTrimAfterAccelTime;
2794 /**
2795 * need 4 byte alignment
2796 * units: units
2797 * offset 999
2798 */
2799 uint8_t alignmentFill_at_999[1] = {};
2800 /**
2801 * Launch disabled above this speed if setting is above zero
2802 * units: SPECIAL_CASE_SPEED
2803 * offset 1000
2804 */
2806 /**
2807 * Starting Launch RPM window to activate (subtracts from Launch RPM)
2808 * units: RPM
2809 * offset 1004
2810 */
2811 int launchRpmWindow;
2812 /**
2813 * units: ms
2814 * offset 1008
2815 */
2817 /**
2818 * A higher alpha (closer to 1) means the EMA reacts more quickly to changes in the data.
2819 * '100%' means no filtering, 98% would be some filtering.
2820 * units: percent
2821 * offset 1012
2822 */
2823 float ppsExpAverageAlpha;
2824 /**
2825 * A higher alpha (closer to 1) means the EMA reacts more quickly to changes in the data.
2826 * '1' means no filtering, 0.98 would be some filtering.
2827 * offset 1016
2828 */
2829 float mapExpAverageAlpha;
2830 /**
2831 * offset 1020
2832 */
2834 /**
2835 * offset 1024
2836 */
2837 float turbochargerFilter;
2838 /**
2839 * offset 1028
2840 */
2842 /**
2843 * offset 1032
2844 */
2845 float launchActivateDelay;
2846 /**
2847 * offset 1036
2848 */
2849 stft_s stft;
2850 /**
2851 * offset 1064
2852 */
2853 ltft_s ltft;
2854 /**
2855 * offset 1080
2856 */
2857 dc_io stepperDcIo[DC_PER_STEPPER] = {};
2858 /**
2859 * For example, BMW, GM or Chevrolet
2860 * REQUIRED for rusEFI Online
2861 * offset 1096
2862 */
2864 /**
2865 * For example, LS1 or NB2
2866 * REQUIRED for rusEFI Online
2867 * offset 1128
2868 */
2870 /**
2871 * For example, Hunchback or Orange Miata
2872 * Vehicle name has to be unique between your vehicles.
2873 * REQUIRED for rusEFI Online
2874 * offset 1160
2875 */
2877 /**
2878 * offset 1192
2879 */
2880 output_pin_e tcu_solenoid[TCU_SOLENOID_COUNT] = {};
2881 /**
2882 * offset 1204
2883 */
2884 dc_function_e etbFunctions[ETB_COUNT] = {};
2885 /**
2886 * offset 1206
2887 */
2889 /**
2890 * need 4 byte alignment
2891 * units: units
2892 * offset 1207
2893 */
2894 uint8_t alignmentFill_at_1207[1] = {};
2895 /**
2896 * offset 1208
2897 */
2899 /**
2900 * offset 1210
2901 */
2903 /**
2904 * need 4 byte alignment
2905 * units: units
2906 * offset 1211
2907 */
2908 uint8_t alignmentFill_at_1211[1] = {};
2909 /**
2910 * offset 1212
2911 */
2913 /**
2914 * offset 1214
2915 */
2916 output_pin_e luaOutputPins[LUA_PWM_COUNT] = {};
2917 /**
2918 * need 4 byte alignment
2919 * units: units
2920 * offset 1230
2921 */
2922 uint8_t alignmentFill_at_1230[2] = {};
2923 /**
2924 * Angle between cam sensor and VVT zero position
2925 * units: value
2926 * offset 1232
2927 */
2928 float vvtOffsets[CAM_INPUTS_COUNT] = {};
2929 /**
2930 * offset 1248
2931 */
2932 vr_threshold_s vrThreshold[VR_THRESHOLD_COUNT] = {};
2933 /**
2934 * offset 1280
2935 */
2936 gppwm_note_t gpPwmNote[GPPWM_CHANNELS] = {};
2937 /**
2938 * units: ADC
2939 * offset 1344
2940 */
2941 uint16_t tps2SecondaryMin;
2942 /**
2943 * units: ADC
2944 * offset 1346
2945 */
2946 uint16_t tps2SecondaryMax;
2947 /**
2948 * Select which bus the wideband controller is attached to.
2949 offset 1348 bit 0 */
2950 bool widebandOnSecondBus : 1 {};
2951 /**
2952 * Enables lambda sensor closed loop feedback for fuelling.
2953 offset 1348 bit 1 */
2955 /**
2956 * Write SD card log even when powered by USB
2957 offset 1348 bit 2 */
2958 bool alwaysWriteSdCard : 1 {};
2959 /**
2960 * Second harmonic (aka double) is usually quieter background noise
2961 offset 1348 bit 3 */
2963 /**
2964 offset 1348 bit 4 */
2965 bool yesUnderstandLocking : 1 {};
2966 /**
2967 * Sometimes we have a performance issue while printing error
2968 offset 1348 bit 5 */
2969 bool silentTriggerError : 1 {};
2970 /**
2971 offset 1348 bit 6 */
2972 bool useLinearCltSensor : 1 {};
2973 /**
2974 * enable can_read/disable can_read
2975 offset 1348 bit 7 */
2976 bool canReadEnabled : 1 {};
2977 /**
2978 * enable can_write/disable can_write. See also can1ListenMode
2979 offset 1348 bit 8 */
2980 bool canWriteEnabled : 1 {};
2981 /**
2982 offset 1348 bit 9 */
2983 bool useLinearIatSensor : 1 {};
2984 /**
2985 offset 1348 bit 10 */
2986 bool enableOilPressureProtect : 1 {};
2987 /**
2988 * Treat milliseconds value as duty cycle value, i.e. 0.5ms would become 50%
2989 offset 1348 bit 11 */
2990 bool tachPulseDurationAsDutyCycle : 1 {};
2991 /**
2992 * This enables smart alternator control and activates the extra alternator settings.
2993 offset 1348 bit 12 */
2994 bool isAlternatorControlEnabled : 1 {};
2995 /**
2996 * https://wiki.rusefi.com/Trigger-Configuration-Guide
2997 * This setting flips the signal from the primary engine speed sensor.
2998 offset 1348 bit 13 */
2999 bool invertPrimaryTriggerSignal : 1 {};
3000 /**
3001 * https://wiki.rusefi.com/Trigger-Configuration-Guide
3002 * This setting flips the signal from the secondary engine speed sensor.
3003 offset 1348 bit 14 */
3004 bool invertSecondaryTriggerSignal : 1 {};
3005 /**
3006 * When enabled, this option cuts the fuel supply when the RPM limit is reached. Cutting fuel provides a smoother limiting action; however, it may lead to slightly higher combustion chamber temperatures since unburned fuel is not present to cool the combustion process.
3007 offset 1348 bit 15 */
3008 bool cutFuelOnHardLimit : 1 {};
3009 /**
3010 * When selected, this option cuts the spark to limit RPM. Cutting spark can produce flames from the exhaust due to unburned fuel igniting in the exhaust system. Additionally, this unburned fuel can help cool the combustion chamber, which may be beneficial in high-performance applications.
3011 * Be careful enabling this: some engines are known to self-disassemble their valvetrain with a spark cut. Fuel cut is much safer.
3012 offset 1348 bit 16 */
3013 bool cutSparkOnHardLimit : 1 {};
3014 /**
3015 offset 1348 bit 17 */
3016 bool launchFuelCutEnable : 1 {};
3017 /**
3018 * This is the Cut Mode normally used
3019 offset 1348 bit 18 */
3020 bool launchSparkCutEnable : 1 {};
3021 /**
3022 offset 1348 bit 19 */
3023 bool torqueReductionEnabled : 1 {};
3024 /**
3025 offset 1348 bit 20 */
3027 /**
3028 offset 1348 bit 21 */
3029 bool limitTorqueReductionTime : 1 {};
3030 /**
3031 * Are you a developer troubleshooting TS over CAN ISO/TP?
3032 offset 1348 bit 22 */
3033 bool verboseIsoTp : 1 {};
3034 /**
3035 * In this mode only trigger events go into engine sniffer and not coils/injectors etc
3036 offset 1348 bit 23 */
3037 bool engineSnifferFocusOnInputs : 1 {};
3038 /**
3039 offset 1348 bit 24 */
3040 bool twoStroke : 1 {};
3041 /**
3042 * Where is your primary skipped wheel located?
3043 offset 1348 bit 25 */
3044 bool skippedWheelOnCam : 1 {};
3045 /**
3046 offset 1348 bit 26 */
3047 bool unusedBit_485_26 : 1 {};
3048 /**
3049 offset 1348 bit 27 */
3050 bool unusedBit_485_27 : 1 {};
3051 /**
3052 offset 1348 bit 28 */
3053 bool unusedBit_485_28 : 1 {};
3054 /**
3055 offset 1348 bit 29 */
3056 bool unusedBit_485_29 : 1 {};
3057 /**
3058 offset 1348 bit 30 */
3059 bool unusedBit_485_30 : 1 {};
3060 /**
3061 offset 1348 bit 31 */
3062 bool unusedBit_485_31 : 1 {};
3063 /**
3064 * A/C button input
3065 * offset 1352
3066 */
3068 /**
3069 * offset 1354
3070 */
3072 /**
3073 * Expected neutral position
3074 * units: %
3075 * offset 1355
3076 */
3077 uint8_t etbNeutralPosition;
3078 /**
3079 * See also idleRpmPid
3080 * offset 1356
3081 */
3083 /**
3084 * need 4 byte alignment
3085 * units: units
3086 * offset 1357
3087 */
3088 uint8_t alignmentFill_at_1357[3] = {};
3089 /**
3090 offset 1360 bit 0 */
3091 bool isInjectionEnabled : 1 {};
3092 /**
3093 offset 1360 bit 1 */
3094 bool isIgnitionEnabled : 1 {};
3095 /**
3096 * When enabled if TPS is held above 95% no fuel is injected while cranking to clear excess fuel from the cylinders.
3097 offset 1360 bit 2 */
3098 bool isCylinderCleanupEnabled : 1 {};
3099 /**
3100 * Should we use tables to vary tau/beta based on CLT/MAP, or just with fixed values?
3101 offset 1360 bit 3 */
3102 bool complexWallModel : 1 {};
3103 /**
3104 * RPM is measured based on last 720 degrees while instant RPM is measured based on the last 90 degrees of crank revolution
3105 offset 1360 bit 4 */
3106 bool alwaysInstantRpm : 1 {};
3107 /**
3108 offset 1360 bit 5 */
3109 bool isMapAveragingEnabled : 1 {};
3110 /**
3111 * This activates a separate ignition timing table for idle conditions, this can help idle stability by using ignition retard and advance either side of the desired idle speed. Extra advance at low idle speeds will prevent stalling and extra retard at high idle speeds can help reduce engine power and slow the idle speed.
3112 offset 1360 bit 6 */
3113 bool useSeparateAdvanceForIdle : 1 {};
3114 /**
3115 offset 1360 bit 7 */
3116 bool isWaveAnalyzerEnabled : 1 {};
3117 /**
3118 * This activates a separate fuel table for Idle, this allows fine tuning of the idle fuelling.
3119 offset 1360 bit 8 */
3120 bool useSeparateVeForIdle : 1 {};
3121 /**
3122 * Verbose info in console below engineSnifferRpmThreshold
3123 offset 1360 bit 9 */
3124 bool verboseTriggerSynchDetails : 1 {};
3125 /**
3126 offset 1360 bit 10 */
3127 bool hondaK : 1 {};
3128 /**
3129 * This is needed if your coils are individually wired (COP) and you wish to use batch ignition (Wasted Spark).
3130 offset 1360 bit 11 */
3131 bool twoWireBatchIgnition : 1 {};
3132 /**
3133 * Read MAP sensor on ECU start-up to use as baro value.
3134 offset 1360 bit 12 */
3135 bool useFixedBaroCorrFromMap : 1 {};
3136 /**
3137 * In Constant mode, timing is automatically tapered to running as RPM increases.
3138 * In Table mode, the "Cranking ignition advance" table is used directly.
3139 offset 1360 bit 13 */
3141 /**
3142 * This enables the various ignition corrections during cranking (IAT, CLT and PID idle).
3143 * You probably don't need this.
3144 offset 1360 bit 14 */
3146 /**
3147 * Enable a second cranking table to use for E100 flex fuel, interpolating between the two based on flex fuel sensor.
3148 offset 1360 bit 15 */
3149 bool flexCranking : 1 {};
3150 /**
3151 * This flag allows to use a special 'PID Multiplier' table (0.0-1.0) to compensate for nonlinear nature of IAC-RPM controller
3152 offset 1360 bit 16 */
3153 bool useIacPidMultTable : 1 {};
3154 /**
3155 offset 1360 bit 17 */
3156 bool isBoostControlEnabled : 1 {};
3157 /**
3158 * Interpolates the Ignition Retard from 0 to 100% within the RPM Range
3159 offset 1360 bit 18 */
3160 bool launchSmoothRetard : 1 {};
3161 /**
3162 * Some engines are OK running semi-random sequential while other engine require phase synchronization
3163 offset 1360 bit 19 */
3165 /**
3166 * If enabled, use a curve for RPM limit (based on coolant temperature) instead of a constant value.
3167 offset 1360 bit 20 */
3168 bool useCltBasedRpmLimit : 1 {};
3169 /**
3170 * If enabled, don't wait for engine start to heat O2 sensors.
3171 * WARNING: this will reduce the life of your sensor, as condensation in the exhaust from a cold start can crack the sensing element.
3172 offset 1360 bit 21 */
3173 bool forceO2Heating : 1 {};
3174 /**
3175 * If increased VVT duty cycle increases the indicated VVT angle, set this to 'advance'. If it decreases, set this to 'retard'. Most intake cams use 'advance', and most exhaust cams use 'retard'.
3176 offset 1360 bit 22 */
3177 bool invertVvtControlIntake : 1 {};
3178 /**
3179 * If increased VVT duty cycle increases the indicated VVT angle, set this to 'advance'. If it decreases, set this to 'retard'. Most intake cams use 'advance', and most exhaust cams use 'retard'.
3180 offset 1360 bit 23 */
3181 bool invertVvtControlExhaust : 1 {};
3182 /**
3183 offset 1360 bit 24 */
3184 bool useBiQuadOnAuxSpeedSensors : 1 {};
3185 /**
3186 * 'Trigger' mode will write a high speed log of trigger events (warning: uses lots of space!). 'Normal' mode will write a standard MLG of sensors, engine function, etc. similar to the one captured in TunerStudio.
3187 offset 1360 bit 25 */
3188 bool sdTriggerLog : 1 {};
3189 /**
3190 offset 1360 bit 26 */
3191 bool stepper_dc_use_two_wires : 1 {};
3192 /**
3193 offset 1360 bit 27 */
3194 bool watchOutForLinearTime : 1 {};
3195 /**
3196 offset 1360 bit 28 */
3197 bool unusedBit_524_28 : 1 {};
3198 /**
3199 offset 1360 bit 29 */
3200 bool unusedBit_524_29 : 1 {};
3201 /**
3202 offset 1360 bit 30 */
3203 bool unusedBit_524_30 : 1 {};
3204 /**
3205 offset 1360 bit 31 */
3206 bool unusedBit_524_31 : 1 {};
3207 /**
3208 * units: count
3209 * offset 1364
3210 */
3211 uint32_t engineChartSize;
3212 /**
3213 * units: mult
3214 * offset 1368
3215 */
3217 /**
3218 * Idle target speed when A/C is enabled. Some cars need the extra speed to keep the AC efficient while idling.
3219 * units: RPM
3220 * offset 1372
3221 */
3222 int16_t acIdleRpmTarget;
3223 /**
3224 * set warningPeriod X
3225 * units: seconds
3226 * offset 1374
3227 */
3228 int16_t warningPeriod;
3229 /**
3230 * units: angle
3231 * offset 1376
3232 */
3234 /**
3235 * units: ms
3236 * offset 1380
3237 */
3239 /**
3240 * units: count
3241 * offset 1384
3242 */
3244 /**
3245 * Pedal position to realize that we need to reduce torque when the trigger pin is uuuh triggered
3246 * offset 1388
3247 */
3249 /**
3250 * Duration in ms or duty cycle depending on selected mode
3251 * offset 1392
3252 */
3254 /**
3255 * Length of time the deposited wall fuel takes to dissipate after the start of acceleration.
3256 * units: Seconds
3257 * offset 1396
3258 */
3259 float wwaeTau;
3260 /**
3261 * offset 1400
3262 */
3264 /**
3265 * offset 1420
3266 */
3267 pid_s etb;
3268 /**
3269 * RPM range above upper limit for extra air taper
3270 * units: RPM
3271 * offset 1440
3272 */
3273 int16_t airTaperRpmRange;
3274 /**
3275 * offset 1442
3276 */
3278 /**
3279 * Closed throttle#2. todo: extract these two fields into a structure
3280 * See also tps2_1AdcChannel
3281 * units: ADC
3282 * offset 1444
3283 */
3284 int16_t tps2Min;
3285 /**
3286 * Full throttle#2. tpsMax value as 10 bit ADC value. Not Voltage!
3287 * See also tps1_1AdcChannel
3288 * units: ADC
3289 * offset 1446
3290 */
3291 int16_t tps2Max;
3292 /**
3293 * See also startStopButtonPin
3294 * offset 1448
3295 */
3297 /**
3298 * offset 1450
3299 */
3301 /**
3302 * need 4 byte alignment
3303 * units: units
3304 * offset 1451
3305 */
3306 uint8_t alignmentFill_at_1451[1] = {};
3307 /**
3308 * offset 1452
3309 */
3311 /**
3312 * offset 1454
3313 */
3314 scaled_channel<uint16_t, 1000, 1> tachPulsePerRev;
3315 /**
3316 * kPa/psi value which is too low to be true
3317 * units: SPECIAL_CASE_PRESSURE
3318 * offset 1456
3319 */
3321 /**
3322 * kPa/psi value which is too high to be true
3323 * units: SPECIAL_CASE_PRESSURE
3324 * offset 1460
3325 */
3327 /**
3328 * How long to wait for the spark to fire before recharging the coil for another spark.
3329 * units: ms
3330 * offset 1464
3331 */
3332 scaled_channel<uint16_t, 1000, 1> multisparkSparkDuration;
3333 /**
3334 * This sets the dwell time for subsequent sparks. The main spark's dwell is set by the dwell table.
3335 * units: ms
3336 * offset 1466
3337 */
3338 scaled_channel<uint16_t, 1000, 1> multisparkDwell;
3339 /**
3340 * See cltIdleRpmBins
3341 * offset 1468
3342 */
3344 /**
3345 * 0 = No fuel settling on port walls 1 = All the fuel settling on port walls setting this to 0 disables the wall wetting enrichment.
3346 * units: Fraction
3347 * offset 1488
3348 */
3349 float wwaeBeta;
3350 /**
3351 * See also EFI_CONSOLE_RX_BRAIN_PIN
3352 * offset 1492
3353 */
3355 /**
3356 * offset 1494
3357 */
3359 /**
3360 * offset 1496
3361 */
3362 Gpio auxValves[AUX_DIGITAL_VALVE_COUNT] = {};
3363 /**
3364 * offset 1500
3365 */
3367 /**
3368 * offset 1502
3369 */
3371 /**
3372 * units: volts
3373 * offset 1504
3374 */
3376 /**
3377 * Pedal in the floor
3378 * units: volts
3379 * offset 1508
3380 */
3382 /**
3383 * on IGN voltage detection turn fuel pump on to build fuel pressure
3384 * units: seconds
3385 * offset 1512
3386 */
3388 /**
3389 * larger value = larger intake manifold volume
3390 * offset 1514
3391 */
3392 uint16_t mafFilterParameter;
3393 /**
3394 * If the RPM closer to target than this value, disable closed loop idle correction to prevent oscillation
3395 * units: RPM
3396 * offset 1516
3397 */
3398 int16_t idlePidRpmDeadZone;
3399 /**
3400 * need 4 byte alignment
3401 * units: units
3402 * offset 1518
3403 */
3404 uint8_t alignmentFill_at_1518[2] = {};
3405 /**
3406 * See Over/Undervoltage Shutdown/Retry bit in documentation
3407 offset 1520 bit 0 */
3408 bool mc33810DisableRecoveryMode : 1 {};
3409 /**
3410 offset 1520 bit 1 */
3411 bool mc33810Gpgd0Mode : 1 {};
3412 /**
3413 offset 1520 bit 2 */
3414 bool mc33810Gpgd1Mode : 1 {};
3415 /**
3416 offset 1520 bit 3 */
3417 bool mc33810Gpgd2Mode : 1 {};
3418 /**
3419 offset 1520 bit 4 */
3420 bool mc33810Gpgd3Mode : 1 {};
3421 /**
3422 * Send out board statistics
3423 offset 1520 bit 5 */
3424 bool enableExtendedCanBroadcast : 1 {};
3425 /**
3426 * global_can_data performance hack
3427 offset 1520 bit 6 */
3428 bool luaCanRxWorkaround : 1 {};
3429 /**
3430 offset 1520 bit 7 */
3431 bool flexSensorInverted : 1 {};
3432 /**
3433 offset 1520 bit 8 */
3434 bool useHardSkipInTraction : 1 {};
3435 /**
3436 * Use Aux Speed 1 as one of speeds for wheel slip ratio?
3437 offset 1520 bit 9 */
3438 bool useAuxSpeedForSlipRatio : 1 {};
3439 /**
3440 * VSS and Aux Speed 1 or Aux Speed 1 with Aux Speed 2?
3441 offset 1520 bit 10 */
3442 bool useVssAsSecondWheelSpeed : 1 {};
3443 /**
3444 offset 1520 bit 11 */
3445 bool is_enabled_spi_5 : 1 {};
3446 /**
3447 offset 1520 bit 12 */
3448 bool is_enabled_spi_6 : 1 {};
3449 /**
3450 * AEM X-Series EGT gauge kit or rusEFI EGT sensor from Wideband controller
3451 offset 1520 bit 13 */
3452 bool enableAemXSeriesEgt : 1 {};
3453 /**
3454 offset 1520 bit 14 */
3455 bool startRequestPinInverted : 1 {};
3456 /**
3457 offset 1520 bit 15 */
3458 bool tcu_rangeSensorPulldown : 1 {};
3459 /**
3460 offset 1520 bit 16 */
3461 bool devBit01 : 1 {};
3462 /**
3463 offset 1520 bit 17 */
3464 bool devBit0 : 1 {};
3465 /**
3466 offset 1520 bit 18 */
3467 bool devBit1 : 1 {};
3468 /**
3469 offset 1520 bit 19 */
3470 bool devBit2 : 1 {};
3471 /**
3472 offset 1520 bit 20 */
3473 bool devBit3 : 1 {};
3474 /**
3475 offset 1520 bit 21 */
3476 bool devBit4 : 1 {};
3477 /**
3478 offset 1520 bit 22 */
3479 bool devBit5 : 1 {};
3480 /**
3481 offset 1520 bit 23 */
3482 bool devBit6 : 1 {};
3483 /**
3484 offset 1520 bit 24 */
3485 bool devBit7 : 1 {};
3486 /**
3487 offset 1520 bit 25 */
3488 bool invertExhaustCamVVTSignal : 1 {};
3489 /**
3490 * "Available via TS Plugin see https://rusefi.com/s/knock"
3491 offset 1520 bit 26 */
3492 bool enableKnockSpectrogram : 1 {};
3493 /**
3494 offset 1520 bit 27 */
3495 bool enableKnockSpectrogramFilter : 1 {};
3496 /**
3497 offset 1520 bit 28 */
3498 bool unusedBit_594_28 : 1 {};
3499 /**
3500 offset 1520 bit 29 */
3501 bool unusedBit_594_29 : 1 {};
3502 /**
3503 offset 1520 bit 30 */
3504 bool unusedBit_594_30 : 1 {};
3505 /**
3506 offset 1520 bit 31 */
3507 bool unusedBit_594_31 : 1 {};
3508 /**
3509 * This value is an added for base idle value. Idle Value added when coasting and transitioning into idle.
3510 * units: percent
3511 * offset 1524
3512 */
3513 int16_t iacByTpsTaper;
3514 /**
3515 * offset 1526
3516 */
3518 /**
3519 * Below this speed, disable DFCO. Use this to prevent jerkiness from fuel enable/disable in low gears.
3520 * units: SPECIAL_CASE_SPEED
3521 * offset 1528
3522 */
3523 uint8_t coastingFuelCutVssLow;
3524 /**
3525 * Above this speed, allow DFCO. Use this to prevent jerkiness from fuel enable/disable in low gears.
3526 * units: SPECIAL_CASE_SPEED
3527 * offset 1529
3528 */
3529 uint8_t coastingFuelCutVssHigh;
3530 /**
3531 * need 4 byte alignment
3532 * units: units
3533 * offset 1530
3534 */
3535 uint8_t alignmentFill_at_1530[2] = {};
3536 /**
3537 * Maximum change delta of TPS percentage over the 'length'. Actual TPS change has to be above this value in order for TPS/TPS acceleration to kick in.
3538 * units: roc
3539 * offset 1532
3540 */
3542 /**
3543 * offset 1536
3544 */
3545 brain_input_pin_e auxSpeedSensorInputPin[AUX_SPEED_SENSOR_COUNT] = {};
3546 /**
3547 * offset 1540
3548 */
3549 uint8_t totalGearsCount;
3550 /**
3551 * Defines when fuel is injected relative to the intake valve opening. Options include End of Injection or other timing references.
3552 * offset 1541
3553 */
3555 /**
3556 * See http://rusefi.com/s/debugmode
3557 * offset 1542
3558 */
3560 /**
3561 * Additional idle % when fan #1 is active
3562 * units: %
3563 * offset 1543
3564 */
3565 uint8_t fan1ExtraIdle;
3566 /**
3567 * Band rate for primary TTL
3568 * units: BPs
3569 * offset 1544
3570 */
3571 uint32_t uartConsoleSerialSpeed;
3572 /**
3573 * units: volts
3574 * offset 1548
3575 */
3577 /**
3578 * Pedal in the floor
3579 * units: volts
3580 * offset 1552
3581 */
3583 /**
3584 * offset 1556
3585 */
3587 /**
3588 * Override the Y axis (load) value used for the VE table.
3589 * Advanced users only: If you aren't sure you need this, you probably don't need this.
3590 * offset 1557
3591 */
3593 /**
3594 * offset 1558
3595 */
3597 /**
3598 * Override the Y axis (load) value used for the AFR table.
3599 * Advanced users only: If you aren't sure you need this, you probably don't need this.
3600 * offset 1559
3601 */
3603 /**
3604 * units: A
3605 * offset 1560
3606 */
3607 scaled_channel<uint8_t, 10, 1> mc33_hpfp_i_peak;
3608 /**
3609 * units: A
3610 * offset 1561
3611 */
3612 scaled_channel<uint8_t, 10, 1> mc33_hpfp_i_hold;
3613 /**
3614 * How long to deactivate power when hold current is reached before applying power again
3615 * units: us
3616 * offset 1562
3617 */
3618 uint8_t mc33_hpfp_i_hold_off;
3619 /**
3620 * Maximum amount of time the solenoid can be active before assuming a programming error
3621 * units: ms
3622 * offset 1563
3623 */
3624 uint8_t mc33_hpfp_max_hold;
3625 /**
3626 * Enable if DC-motor driver (H-bridge) inverts the signals (eg. RZ7899 on Hellen boards)
3627 offset 1564 bit 0 */
3628 bool stepperDcInvertedPins : 1 {};
3629 /**
3630 * Allow OpenBLT on Primary CAN
3631 offset 1564 bit 1 */
3632 bool canOpenBLT : 1 {};
3633 /**
3634 * Allow OpenBLT on Secondary CAN
3635 offset 1564 bit 2 */
3636 bool can2OpenBLT : 1 {};
3637 /**
3638 * Select whether to configure injector flow in volumetric flow (default, cc/min) or mass flow (g/s).
3639 offset 1564 bit 3 */
3640 bool injectorFlowAsMassFlow : 1 {};
3641 /**
3642 offset 1564 bit 4 */
3643 bool boardUseCanTerminator : 1 {};
3644 /**
3645 offset 1564 bit 5 */
3646 bool kLineDoHondaSend : 1 {};
3647 /**
3648 * ListenMode is about acknowledging CAN traffic on the protocol level. Different from canWriteEnabled
3649 offset 1564 bit 6 */
3650 bool can1ListenMode : 1 {};
3651 /**
3652 offset 1564 bit 7 */
3653 bool can2ListenMode : 1 {};
3654 /**
3655 offset 1564 bit 8 */
3656 bool unusedBit_628_8 : 1 {};
3657 /**
3658 offset 1564 bit 9 */
3659 bool unusedBit_628_9 : 1 {};
3660 /**
3661 offset 1564 bit 10 */
3662 bool unusedBit_628_10 : 1 {};
3663 /**
3664 offset 1564 bit 11 */
3665 bool unusedBit_628_11 : 1 {};
3666 /**
3667 offset 1564 bit 12 */
3668 bool unusedBit_628_12 : 1 {};
3669 /**
3670 offset 1564 bit 13 */
3671 bool unusedBit_628_13 : 1 {};
3672 /**
3673 offset 1564 bit 14 */
3674 bool unusedBit_628_14 : 1 {};
3675 /**
3676 offset 1564 bit 15 */
3677 bool unusedBit_628_15 : 1 {};
3678 /**
3679 offset 1564 bit 16 */
3680 bool unusedBit_628_16 : 1 {};
3681 /**
3682 offset 1564 bit 17 */
3683 bool unusedBit_628_17 : 1 {};
3684 /**
3685 offset 1564 bit 18 */
3686 bool unusedBit_628_18 : 1 {};
3687 /**
3688 offset 1564 bit 19 */
3689 bool unusedBit_628_19 : 1 {};
3690 /**
3691 offset 1564 bit 20 */
3692 bool unusedBit_628_20 : 1 {};
3693 /**
3694 offset 1564 bit 21 */
3695 bool unusedBit_628_21 : 1 {};
3696 /**
3697 offset 1564 bit 22 */
3698 bool unusedBit_628_22 : 1 {};
3699 /**
3700 offset 1564 bit 23 */
3701 bool unusedBit_628_23 : 1 {};
3702 /**
3703 offset 1564 bit 24 */
3704 bool unusedBit_628_24 : 1 {};
3705 /**
3706 offset 1564 bit 25 */
3707 bool unusedBit_628_25 : 1 {};
3708 /**
3709 offset 1564 bit 26 */
3710 bool unusedBit_628_26 : 1 {};
3711 /**
3712 offset 1564 bit 27 */
3713 bool unusedBit_628_27 : 1 {};
3714 /**
3715 offset 1564 bit 28 */
3716 bool unusedBit_628_28 : 1 {};
3717 /**
3718 offset 1564 bit 29 */
3719 bool unusedBit_628_29 : 1 {};
3720 /**
3721 offset 1564 bit 30 */
3722 bool unusedBit_628_30 : 1 {};
3723 /**
3724 offset 1564 bit 31 */
3725 bool unusedBit_628_31 : 1 {};
3726 /**
3727 * Angle of tooth detection within engine phase cycle
3728 * units: angle
3729 * offset 1568
3730 */
3731 uint16_t camDecoder2jzPosition;
3732 /**
3733 * offset 1570
3734 */
3736 /**
3737 * need 4 byte alignment
3738 * units: units
3739 * offset 1571
3740 */
3741 uint8_t alignmentFill_at_1571[1] = {};
3742 /**
3743 * Duration of each test pulse
3744 * units: ms
3745 * offset 1572
3746 */
3747 scaled_channel<uint16_t, 100, 1> benchTestOnTime;
3748 /**
3749 * units: %
3750 * offset 1574
3751 */
3753 /**
3754 * units: %
3755 * offset 1575
3756 */
3757 scaled_channel<uint8_t, 1, 10> lambdaProtectionRestoreLoad;
3758 /**
3759 * offset 1576
3760 */
3762 /**
3763 * need 4 byte alignment
3764 * units: units
3765 * offset 1577
3766 */
3767 uint8_t alignmentFill_at_1577[1] = {};
3768 /**
3769 * offset 1578
3770 */
3772 /**
3773 * offset 1580
3774 */
3776 /**
3777 * offset 1582
3778 */
3780 /**
3781 * offset 1583
3782 */
3784 /**
3785 * Override the Y axis (load) value used for the ignition table.
3786 * Advanced users only: If you aren't sure you need this, you probably don't need this.
3787 * offset 1584
3788 */
3790 /**
3791 * Select which fuel pressure sensor measures the pressure of the fuel at your injectors.
3792 * offset 1585
3793 */
3795 /**
3796 * offset 1586
3797 */
3799 /**
3800 * offset 1588
3801 */
3803 /**
3804 * need 4 byte alignment
3805 * units: units
3806 * offset 1589
3807 */
3808 uint8_t alignmentFill_at_1589[3] = {};
3809 /**
3810 * Specifies the boost pressure allowed before triggering a cut. Setting this to 0 will DISABLE overboost cut.
3811 * units: SPECIAL_CASE_PRESSURE
3812 * offset 1592
3813 */
3814 float boostCutPressure;
3815 /**
3816 * units: kg/h
3817 * offset 1596
3818 */
3819 scaled_channel<uint8_t, 1, 5> tchargeBins[16] = {};
3820 /**
3821 * units: ratio
3822 * offset 1612
3823 */
3824 scaled_channel<uint8_t, 100, 1> tchargeValues[16] = {};
3825 /**
3826 * Fixed timing, useful for TDC testing
3827 * units: deg
3828 * offset 1628
3829 */
3830 float fixedTiming;
3831 /**
3832 * MAP voltage for low point
3833 * units: v
3834 * offset 1632
3835 */
3836 float mapLowValueVoltage;
3837 /**
3838 * MAP voltage for low point
3839 * units: v
3840 * offset 1636
3841 */
3842 float mapHighValueVoltage;
3843 /**
3844 * EGO value correction
3845 * units: value
3846 * offset 1640
3847 */
3848 float egoValueShift;
3849 /**
3850 * VVT output solenoid pin for this cam
3851 * offset 1644
3852 */
3853 output_pin_e vvtPins[CAM_INPUTS_COUNT] = {};
3854 /**
3855 * offset 1652
3856 */
3857 scaled_channel<uint8_t, 200, 1> tChargeMinRpmMinTps;
3858 /**
3859 * offset 1653
3860 */
3861 scaled_channel<uint8_t, 200, 1> tChargeMinRpmMaxTps;
3862 /**
3863 * offset 1654
3864 */
3865 scaled_channel<uint8_t, 200, 1> tChargeMaxRpmMinTps;
3866 /**
3867 * offset 1655
3868 */
3869 scaled_channel<uint8_t, 200, 1> tChargeMaxRpmMaxTps;
3870 /**
3871 * offset 1656
3872 */
3874 /**
3875 * Minimim timing advance allowed. No spark on any cylinder will ever fire after this angle BTDC. For example, setting -10 here means no spark ever fires later than 10 deg ATDC. Note that this only concerns the primary spark: any trailing sparks or multispark may violate this constraint.
3876 * units: deg BTDC
3877 * offset 1658
3878 */
3879 int8_t minimumIgnitionTiming;
3880 /**
3881 * Maximum timing advance allowed. No spark on any cylinder will ever fire before this angle BTDC. For example, setting 45 here means no spark ever fires earlier than 45 deg BTDC
3882 * units: deg BTDC
3883 * offset 1659
3884 */
3885 int8_t maximumIgnitionTiming;
3886 /**
3887 * units: Hz
3888 * offset 1660
3889 */
3891 /**
3892 * offset 1664
3893 */
3894 vvt_mode_e vvtMode[CAMS_PER_BANK] = {};
3895 /**
3896 * Additional idle % when fan #2 is active
3897 * units: %
3898 * offset 1666
3899 */
3900 uint8_t fan2ExtraIdle;
3901 /**
3902 * Delay to allow fuel pressure to build before firing the priming pulse.
3903 * units: sec
3904 * offset 1667
3905 */
3906 scaled_channel<uint8_t, 100, 1> primingDelay;
3907 /**
3908 * offset 1668
3909 */
3910 adc_channel_e auxAnalogInputs[LUA_ANALOG_INPUT_COUNT] = {};
3911 /**
3912 * offset 1676
3913 */
3914 output_pin_e trailingCoilPins[MAX_CYLINDER_COUNT] = {};
3915 /**
3916 * offset 1700
3917 */
3919 /**
3920 * offset 1701
3921 */
3923 /**
3924 * None = I have a MAP-referenced fuel pressure regulator
3925 * Fixed rail pressure = I have an atmosphere-referenced fuel pressure regulator (returnless, typically)
3926 * Sensed rail pressure = I have a fuel pressure sensor
3927 * HPFP fuel mass compensation = manual mode for GDI engines
3928 * offset 1702
3929 */
3931 /**
3932 * need 4 byte alignment
3933 * units: units
3934 * offset 1703
3935 */
3936 uint8_t alignmentFill_at_1703[1] = {};
3937 /**
3938 * This is the pressure at which your injector flow is known.
3939 * For example if your injectors flow 400cc/min at 3.5 bar, enter 350kpa/50.7psi here.
3940 * This is gauge pressure/in reference to atmospheric.
3941 * units: SPECIAL_CASE_PRESSURE
3942 * offset 1704
3943 */
3945 /**
3946 * offset 1708
3947 */
3949 /**
3950 * offset 1740
3951 */
3953 /**
3954 * units: Deg
3955 * offset 1772
3956 */
3957 int16_t knockSamplingDuration;
3958 /**
3959 * units: Hz
3960 * offset 1774
3961 */
3962 int16_t etbFreq;
3963 /**
3964 * offset 1776
3965 */
3967 /**
3968 * For micro-stepping, make sure that PWM frequency (etbFreq) is high enough
3969 * offset 1796
3970 */
3972 /**
3973 * Use to limit the current when the stepper motor is idle, not moving (100% = no limit)
3974 * units: %
3975 * offset 1797
3976 */
3977 uint8_t stepperMinDutyCycle;
3978 /**
3979 * Use to limit the max.current through the stepper motor (100% = no limit)
3980 * units: %
3981 * offset 1798
3982 */
3983 uint8_t stepperMaxDutyCycle;
3984 /**
3985 * offset 1799
3986 */
3988 /**
3989 * per-cylinder ignition and fueling timing correction for uneven engines
3990 * units: deg
3991 * offset 1800
3992 */
3993 angle_t timing_offset_cylinder[MAX_CYLINDER_COUNT] = {};
3994 /**
3995 * units: seconds
3996 * offset 1848
3997 */
3999 /**
4000 * Minimum coolant temperature to activate VVT
4001 * units: SPECIAL_CASE_TEMPERATURE
4002 * offset 1852
4003 */
4004 int16_t vvtControlMinClt;
4005 /**
4006 * offset 1854
4007 */
4009 /**
4010 * Modes count be used for 3v<>5v integration using pull-ups/pull-downs etc.
4011 * offset 1855
4012 */
4014 /**
4015 * offset 1856
4016 */
4018 /**
4019 * offset 1857
4020 */
4022 /**
4023 * offset 1858
4024 */
4026 /**
4027 * offset 1859
4028 */
4030 /**
4031 * offset 1860
4032 */
4034 /**
4035 * offset 1861
4036 */
4038 /**
4039 * offset 1862
4040 */
4042 /**
4043 * offset 1863
4044 */
4046 /**
4047 * ResetB
4048 * offset 1864
4049 */
4051 /**
4052 * offset 1866
4053 */
4055 /**
4056 * Brake pedal switch
4057 * offset 1868
4058 */
4060 /**
4061 * need 4 byte alignment
4062 * units: units
4063 * offset 1870
4064 */
4065 uint8_t alignmentFill_at_1870[2] = {};
4066 /**
4067 * VVT output PID
4068 * TODO: rename to vvtPid
4069 * offset 1872
4070 */
4071 pid_s auxPid[CAMS_PER_BANK] = {};
4072 /**
4073 * offset 1912
4074 */
4075 float injectorCorrectionPolynomial[8] = {};
4076 /**
4077 * units: SPECIAL_CASE_TEMPERATURE
4078 * offset 1944
4079 */
4080 scaled_channel<int16_t, 1, 1> primeBins[PRIME_CURVE_COUNT] = {};
4081 /**
4082 * offset 1960
4083 */
4085 /**
4086 * offset 1980
4087 */
4089 /**
4090 * need 4 byte alignment
4091 * units: units
4092 * offset 1981
4093 */
4094 uint8_t alignmentFill_at_1981[1] = {};
4095 /**
4096 * offset 1982
4097 */
4099 /**
4100 * offset 1984
4101 */
4103 /**
4104 * offset 1986
4105 */
4107 /**
4108 * need 4 byte alignment
4109 * units: units
4110 * offset 1987
4111 */
4112 uint8_t alignmentFill_at_1987[1] = {};
4113 /**
4114 * offset 1988
4115 */
4117 /**
4118 * need 4 byte alignment
4119 * units: units
4120 * offset 1990
4121 */
4122 uint8_t alignmentFill_at_1990[2] = {};
4123 /**
4124 * units: hz
4125 * offset 1992
4126 */
4127 float auxFrequencyFilter;
4128 /**
4129 * offset 1996
4130 */
4131 sent_input_pin_e sentInputPins[SENT_INPUT_COUNT] = {};
4132 /**
4133 * This sets the RPM above which fuel cut is active.
4134 * units: rpm
4135 * offset 1998
4136 */
4137 int16_t coastingFuelCutRpmHigh;
4138 /**
4139 * This sets the RPM below which fuel cut is deactivated, this prevents jerking or issues transitioning to idle
4140 * units: rpm
4141 * offset 2000
4142 */
4143 int16_t coastingFuelCutRpmLow;
4144 /**
4145 * Throttle position below which fuel cut is active. With an electronic throttle enabled, this checks against pedal position.
4146 * units: %
4147 * offset 2002
4148 */
4149 int16_t coastingFuelCutTps;
4150 /**
4151 * Fuel cutoff is disabled when the engine is cold.
4152 * units: SPECIAL_CASE_TEMPERATURE
4153 * offset 2004
4154 */
4155 int16_t coastingFuelCutClt;
4156 /**
4157 * Increases PID reaction for RPM<target by adding extra percent to PID-error
4158 * units: %
4159 * offset 2006
4160 */
4161 int16_t pidExtraForLowRpm;
4162 /**
4163 * MAP value above which fuel injection is re-enabled.
4164 * units: SPECIAL_CASE_PRESSURE
4165 * offset 2008
4166 */
4167 int16_t coastingFuelCutMap;
4168 /**
4169 * need 4 byte alignment
4170 * units: units
4171 * offset 2010
4172 */
4173 uint8_t alignmentFill_at_2010[2] = {};
4174 /**
4175 * offset 2012
4176 */
4178 /**
4179 * offset 2032
4180 */
4182 /**
4183 * offset 2052
4184 */
4185 gppwm_note_t scriptCurveName[SCRIPT_CURVE_COUNT] = {};
4186 /**
4187 * offset 2148
4188 */
4189 gppwm_note_t scriptTableName[SCRIPT_TABLE_COUNT] = {};
4190 /**
4191 * offset 2212
4192 */
4193 gppwm_note_t scriptSettingName[SCRIPT_SETTING_COUNT] = {};
4194 /**
4195 * Heat transfer coefficient at zero flow.
4196 * 0 means the air charge is fully heated to the same temperature as CLT.
4197 * 1 means the air charge gains no heat, and enters the cylinder at the temperature measured by IAT.
4198 * offset 2340
4199 */
4200 float tChargeAirCoefMin;
4201 /**
4202 * Heat transfer coefficient at high flow, as defined by "max air flow".
4203 * 0 means the air charge is fully heated to the same temperature as CLT.
4204 * 1 means the air charge gains no heat, and enters the cylinder at the temperature measured by IAT.
4205 * offset 2344
4206 */
4207 float tChargeAirCoefMax;
4208 /**
4209 * High flow point for heat transfer estimation.
4210 * Set this to perhaps 50-75% of your maximum airflow at wide open throttle.
4211 * units: kg/h
4212 * offset 2348
4213 */
4214 float tChargeAirFlowMax;
4215 /**
4216 * Maximum allowed rate of increase allowed for the estimated charge temperature
4217 * units: deg/sec
4218 * offset 2352
4219 */
4220 float tChargeAirIncrLimit;
4221 /**
4222 * Maximum allowed rate of decrease allowed for the estimated charge temperature
4223 * units: deg/sec
4224 * offset 2356
4225 */
4226 float tChargeAirDecrLimit;
4227 /**
4228 * iTerm min value
4229 * offset 2360
4230 */
4231 int16_t etb_iTermMin;
4232 /**
4233 * iTerm max value
4234 * offset 2362
4235 */
4236 int16_t etb_iTermMax;
4237 /**
4238 * See useIdleTimingPidControl
4239 * offset 2364
4240 */
4242 /**
4243 * When entering idle, and the PID settings are aggressive, it's good to make a soft entry upon entering closed loop
4244 * offset 2384
4245 */
4247 /**
4248 * offset 2388
4249 */
4251 /**
4252 * offset 2389
4253 */
4255 /**
4256 * A delay in cycles between fuel-enrich. portions
4257 * units: cycles
4258 * offset 2390
4259 */
4260 int16_t tpsAccelFractionPeriod;
4261 /**
4262 * A fraction divisor: 1 or less = entire portion at once, or split into diminishing fractions
4263 * units: coef
4264 * offset 2392
4265 */
4267 /**
4268 * offset 2396
4269 */
4271 /**
4272 * offset 2397
4273 */
4275 /**
4276 * iTerm min value
4277 * offset 2398
4278 */
4279 int16_t idlerpmpid_iTermMin;
4280 /**
4281 * offset 2400
4282 */
4284 /**
4285 * Stoichiometric ratio for your primary fuel. When Flex Fuel is enabled, this value is used when the Flex Fuel sensor indicates E0.
4286 * E0 = 14.7
4287 * E10 = 14.1
4288 * E85 = 9.9
4289 * E100 = 9.0
4290 * units: :1
4291 * offset 2401
4292 */
4293 scaled_channel<uint8_t, 10, 1> stoichRatioPrimary;
4294 /**
4295 * iTerm max value
4296 * offset 2402
4297 */
4298 int16_t idlerpmpid_iTermMax;
4299 /**
4300 * This sets the range of the idle control on the ETB. At 100% idle position, the value specified here sets the base ETB position. Can also be interpreted as the maximum allowed TPS% Opening for Idle Control.
4301 * units: %
4302 * offset 2404
4303 */
4305 /**
4306 * Select which fuel correction bank this cylinder belongs to. Group cylinders that share the same O2 sensor
4307 * offset 2408
4308 */
4309 uint8_t cylinderBankSelect[MAX_CYLINDER_COUNT] = {};
4310 /**
4311 * units: mg
4312 * offset 2420
4313 */
4314 scaled_channel<uint8_t, 1, 5> primeValues[PRIME_CURVE_COUNT] = {};
4315 /**
4316 * Trigger comparator center point voltage
4317 * units: V
4318 * offset 2428
4319 */
4320 scaled_channel<uint8_t, 50, 1> triggerCompCenterVolt;
4321 /**
4322 * Trigger comparator hysteresis voltage (Min)
4323 * units: V
4324 * offset 2429
4325 */
4326 scaled_channel<uint8_t, 50, 1> triggerCompHystMin;
4327 /**
4328 * Trigger comparator hysteresis voltage (Max)
4329 * units: V
4330 * offset 2430
4331 */
4332 scaled_channel<uint8_t, 50, 1> triggerCompHystMax;
4333 /**
4334 * VR-sensor saturation RPM
4335 * units: RPM
4336 * offset 2431
4337 */
4338 scaled_channel<uint8_t, 1, 50> triggerCompSensorSatRpm;
4339 /**
4340 * units: ratio
4341 * offset 2432
4342 */
4343 scaled_channel<uint16_t, 100, 1> tractionControlSlipBins[TRACTION_CONTROL_ETB_DROP_SLIP_SIZE] = {};
4344 /**
4345 * units: RPM
4346 * offset 2444
4347 */
4348 uint8_t tractionControlSpeedBins[TRACTION_CONTROL_ETB_DROP_SPEED_SIZE] = {};
4349 /**
4350 * offset 2450
4351 */
4353 /**
4354 * need 4 byte alignment
4355 * units: units
4356 * offset 2451
4357 */
4358 uint8_t alignmentFill_at_2451[1] = {};
4359 /**
4360 * offset 2452
4361 */
4362 gppwm_channel gppwm[GPPWM_CHANNELS] = {};
4363 /**
4364 * Boost Current
4365 * units: mA
4366 * offset 2884
4367 */
4368 uint16_t mc33_i_boost;
4369 /**
4370 * Peak Current
4371 * units: mA
4372 * offset 2886
4373 */
4374 uint16_t mc33_i_peak;
4375 /**
4376 * Hold Current
4377 * units: mA
4378 * offset 2888
4379 */
4380 uint16_t mc33_i_hold;
4381 /**
4382 * Maximum allowed boost phase time. If the injector current doesn't reach the threshold before this time elapses, it is assumed that the injector is missing or has failed open circuit.
4383 * units: us
4384 * offset 2890
4385 */
4386 uint16_t mc33_t_max_boost;
4387 /**
4388 * units: us
4389 * offset 2892
4390 */
4391 uint16_t mc33_t_peak_off;
4392 /**
4393 * Peak phase duration
4394 * units: us
4395 * offset 2894
4396 */
4397 uint16_t mc33_t_peak_tot;
4398 /**
4399 * units: us
4400 * offset 2896
4401 */
4402 uint16_t mc33_t_bypass;
4403 /**
4404 * units: us
4405 * offset 2898
4406 */
4407 uint16_t mc33_t_hold_off;
4408 /**
4409 * Hold phase duration
4410 * units: us
4411 * offset 2900
4412 */
4413 uint16_t mc33_t_hold_tot;
4414 /**
4415 * offset 2902
4416 */
4418 /**
4419 * offset 2903
4420 */
4422 /**
4423 * offset 2904
4424 */
4426 /**
4427 * offset 2905
4428 */
4429 pin_output_mode_e tcu_solenoid_mode[TCU_SOLENOID_COUNT] = {};
4430 /**
4431 * need 4 byte alignment
4432 * units: units
4433 * offset 2911
4434 */
4435 uint8_t alignmentFill_at_2911[1] = {};
4436 /**
4437 * units: ratio
4438 * offset 2912
4439 */
4440 float triggerGapOverrideFrom[GAP_TRACKING_LENGTH] = {};
4441 /**
4442 * units: ratio
4443 * offset 2984
4444 */
4445 float triggerGapOverrideTo[GAP_TRACKING_LENGTH] = {};
4446 /**
4447 * Below this RPM, use camshaft information to synchronize the crank's position for full sequential operation. Use this if your cam sensor does weird things at high RPM. Set to 0 to disable, and always use cam to help sync crank.
4448 * units: rpm
4449 * offset 3056
4450 */
4451 scaled_channel<uint8_t, 1, 50> maxCamPhaseResolveRpm;
4452 /**
4453 * Delay before cutting fuel. Set to 0 to cut immediately with no delay. May cause rumbles and pops out of your exhaust...
4454 * units: sec
4455 * offset 3057
4456 */
4457 scaled_channel<uint8_t, 10, 1> dfcoDelay;
4458 /**
4459 * Delay before engaging the AC compressor. Set to 0 to engage immediately with no delay. Use this to prevent bogging at idle when AC engages.
4460 * units: sec
4461 * offset 3058
4462 */
4463 scaled_channel<uint8_t, 10, 1> acDelay;
4464 /**
4465 * offset 3059
4466 */
4468 /**
4469 * units: mg
4470 * offset 3060
4471 */
4472 scaled_channel<uint16_t, 1000, 1> fordInjectorSmallPulseBreakPoint;
4473 /**
4474 * Threshold in ETB error (target vs. actual) above which the jam timer is started. If the timer reaches the time specified in the jam detection timeout period, the throttle is considered jammed, and engine operation limited.
4475 * units: %
4476 * offset 3062
4477 */
4478 uint8_t etbJamDetectThreshold;
4479 /**
4480 * units: lobes/cam
4481 * offset 3063
4482 */
4483 uint8_t hpfpCamLobes;
4484 /**
4485 * offset 3064
4486 */
4488 /**
4489 * Low engine speed for A/C. Larger engines can survive lower values
4490 * units: RPM
4491 * offset 3065
4492 */
4493 scaled_channel<int8_t, 1, 10> acLowRpmLimit;
4494 /**
4495 * If the requested activation time is below this angle, don't bother running the pump
4496 * units: deg
4497 * offset 3066
4498 */
4499 uint8_t hpfpMinAngle;
4500 /**
4501 * need 4 byte alignment
4502 * units: units
4503 * offset 3067
4504 */
4505 uint8_t alignmentFill_at_3067[1] = {};
4506 /**
4507 * Size of the pump chamber in cc. Typical Bosch HDP5 has a 9.0mm diameter, typical BMW N* stroke is 4.4mm.
4508 * units: cc
4509 * offset 3068
4510 */
4511 scaled_channel<uint16_t, 1000, 1> hpfpPumpVolume;
4512 /**
4513 * How long to keep the valve activated (in order to allow the pump to build pressure and keep the valve open on its own)
4514 * https://rusefi.com/forum/viewtopic.php?t=2192
4515 * units: deg
4516 * offset 3070
4517 */
4518 uint8_t hpfpActivationAngle;
4519 /**
4520 * offset 3071
4521 */
4522 uint8_t issFilterReciprocal;
4523 /**
4524 * units: %/kPa
4525 * offset 3072
4526 */
4527 scaled_channel<uint16_t, 1000, 1> hpfpPidP;
4528 /**
4529 * units: %/kPa/lobe
4530 * offset 3074
4531 */
4532 scaled_channel<uint16_t, 100000, 1> hpfpPidI;
4533 /**
4534 * iTerm min value
4535 * offset 3076
4536 */
4537 int16_t hpfpPid_iTermMin;
4538 /**
4539 * iTerm max value
4540 * offset 3078
4541 */
4542 int16_t hpfpPid_iTermMax;
4543 /**
4544 * The fastest rate the target pressure can be reduced by. This is because HPFP have no way to bleed off pressure other than injecting fuel.
4545 * units: kPa/s
4546 * offset 3080
4547 */
4548 uint16_t hpfpTargetDecay;
4549 /**
4550 * offset 3082
4551 */
4553 /**
4554 * units: ratio
4555 * offset 3090
4556 */
4557 scaled_channel<uint16_t, 100, 1> gearRatio[TCU_GEAR_COUNT] = {};
4558 /**
4559 * We need to give engine time to build oil pressure without diverting it to VVT
4560 * units: ms
4561 * offset 3110
4562 */
4563 uint16_t vvtActivationDelayMs;
4564 /**
4565 * offset 3112
4566 */
4568 /**
4569 * offset 3113
4570 */
4572 /**
4573 * During revolution where ACR should be disabled at what specific angle to disengage
4574 * units: deg
4575 * offset 3114
4576 */
4577 uint16_t acrDisablePhase;
4578 /**
4579 * offset 3116
4580 */
4582 /**
4583 * offset 3136
4584 */
4586 /**
4587 * offset 3156
4588 */
4590 /**
4591 * offset 3158
4592 */
4594 /**
4595 * need 4 byte alignment
4596 * units: units
4597 * offset 3159
4598 */
4599 uint8_t alignmentFill_at_3159[1] = {};
4600 /**
4601 * offset 3160
4602 */
4604 /**
4605 * offset 3162
4606 */
4608 /**
4609 * need 4 byte alignment
4610 * units: units
4611 * offset 3163
4612 */
4613 uint8_t alignmentFill_at_3163[1] = {};
4614 /**
4615 * offset 3164
4616 */
4618 /**
4619 * offset 3166
4620 */
4622 /**
4623 * offset 3168
4624 */
4626 /**
4627 * need 4 byte alignment
4628 * units: units
4629 * offset 3169
4630 */
4631 uint8_t alignmentFill_at_3169[1] = {};
4632 /**
4633 * offset 3170
4634 */
4636 /**
4637 * offset 3172
4638 */
4640 /**
4641 * offset 3174
4642 */
4644 /**
4645 * need 4 byte alignment
4646 * units: units
4647 * offset 3175
4648 */
4649 uint8_t alignmentFill_at_3175[1] = {};
4650 /**
4651 * offset 3176
4652 */
4654 /**
4655 * offset 3178
4656 */
4658 /**
4659 * Set a minimum allowed target position to avoid slamming/driving against the hard mechanical stop in the throttle.
4660 * units: %
4661 * offset 3180
4662 */
4663 scaled_channel<uint8_t, 10, 1> etbMinimumPosition;
4664 /**
4665 * need 4 byte alignment
4666 * units: units
4667 * offset 3181
4668 */
4669 uint8_t alignmentFill_at_3181[1] = {};
4670 /**
4671 * offset 3182
4672 */
4673 uint16_t tuneHidingKey;
4674 /**
4675 * Individual characters are accessible using vin(index) Lua function
4676 * offset 3184
4677 */
4679 /**
4680 * units: SPECIAL_CASE_TEMPERATURE
4681 * offset 3201
4682 */
4684 /**
4685 * offset 3202
4686 */
4688 /**
4689 * need 4 byte alignment
4690 * units: units
4691 * offset 3203
4692 */
4693 uint8_t alignmentFill_at_3203[1] = {};
4694 /**
4695 * offset 3204
4696 */
4697 switch_input_pin_e luaDigitalInputPins[LUA_DIGITAL_INPUT_COUNT] = {};
4698 /**
4699 * units: rpm
4700 * offset 3220
4701 */
4702 int16_t ALSMinRPM;
4703 /**
4704 * units: rpm
4705 * offset 3222
4706 */
4707 int16_t ALSMaxRPM;
4708 /**
4709 * units: sec
4710 * offset 3224
4711 */
4712 int16_t ALSMaxDuration;
4713 /**
4714 * units: SPECIAL_CASE_TEMPERATURE
4715 * offset 3226
4716 */
4717 int8_t ALSMinCLT;
4718 /**
4719 * units: SPECIAL_CASE_TEMPERATURE
4720 * offset 3227
4721 */
4722 int8_t ALSMaxCLT;
4723 /**
4724 * offset 3228
4725 */
4726 uint8_t alsMinTimeBetween;
4727 /**
4728 * offset 3229
4729 */
4730 uint8_t alsEtbPosition;
4731 /**
4732 * units: %
4733 * offset 3230
4734 */
4736 /**
4737 * If you have SENT TPS sensor please select type. For analog TPS leave None
4738 * offset 3231
4739 */
4741 /**
4742 * offset 3232
4743 */
4744 uint16_t customSentTpsMin;
4745 /**
4746 * need 4 byte alignment
4747 * units: units
4748 * offset 3234
4749 */
4750 uint8_t alignmentFill_at_3234[2] = {};
4751 /**
4752 * units: %
4753 * offset 3236
4754 */
4755 int ALSIdleAdd;
4756 /**
4757 * units: %
4758 * offset 3240
4759 */
4760 int ALSEtbAdd;
4761 /**
4762 * offset 3244
4763 */
4764 float ALSSkipRatio;
4765 /**
4766 * Hysterisis: if Pressure High Disable is 240kpa, and acPressureEnableHyst is 20, when the ECU sees 240kpa, A/C will be disabled, and stay disabled until 240-20=220kpa is reached
4767 * units: SPECIAL_CASE_PRESSURE
4768 * offset 3248
4769 */
4770 scaled_channel<uint8_t, 2, 1> acPressureEnableHyst;
4771 /**
4772 * offset 3249
4773 */
4775 /**
4776 * For Ford TPS, use 53%. For Toyota ETCS-i, use ~65%
4777 * units: %
4778 * offset 3250
4779 */
4780 scaled_channel<uint8_t, 2, 1> tpsSecondaryMaximum;
4781 /**
4782 * For Toyota ETCS-i, use ~69%
4783 * units: %
4784 * offset 3251
4785 */
4786 scaled_channel<uint8_t, 2, 1> ppsSecondaryMaximum;
4787 /**
4788 * offset 3252
4789 */
4790 pin_input_mode_e luaDigitalInputPinModes[LUA_DIGITAL_INPUT_COUNT] = {};
4791 /**
4792 * offset 3260
4793 */
4794 uint16_t customSentTpsMax;
4795 /**
4796 * offset 3262
4797 */
4798 uint16_t kLineBaudRate;
4799 /**
4800 * offset 3264
4801 */
4803 /**
4804 * offset 3265
4805 */
4806 UiMode uiMode;
4807 /**
4808 * Crank angle ATDC of first lobe peak
4809 * units: deg
4810 * offset 3266
4811 */
4812 int16_t hpfpPeakPos;
4813 /**
4814 * units: us
4815 * offset 3268
4816 */
4817 int16_t kLinePeriodUs;
4818 /**
4819 * Window that the correction will be added throughout (example, if rpm limit is 7000, and rpmSoftLimitWindowSize is 200, the corrections activate at 6800RPM, creating a 200rpm window)
4820 * units: RPM
4821 * offset 3270
4822 */
4823 scaled_channel<uint8_t, 1, 10> rpmSoftLimitWindowSize;
4824 /**
4825 * Degrees of timing REMOVED from actual timing during soft RPM limit window
4826 * units: deg
4827 * offset 3271
4828 */
4829 scaled_channel<uint8_t, 5, 1> rpmSoftLimitTimingRetard;
4830 /**
4831 * % of fuel ADDED during window
4832 * units: %
4833 * offset 3272
4834 */
4835 scaled_channel<uint8_t, 5, 1> rpmSoftLimitFuelAdded;
4836 /**
4837 * Sets a buffer below the RPM hard limit, helping avoid rapid cycling of cut actions by defining a range within which RPM must drop before cut actions are re-enabled.
4838 * Hysterisis: if the hard limit is 7200rpm and rpmHardLimitHyst is 200rpm, then when the ECU sees 7200rpm, fuel/ign will cut, and stay cut until 7000rpm (7200-200) is reached
4839 * units: RPM
4840 * offset 3273
4841 */
4842 scaled_channel<uint8_t, 1, 10> rpmHardLimitHyst;
4843 /**
4844 * Time between bench test pulses
4845 * units: ms
4846 * offset 3274
4847 */
4848 scaled_channel<uint16_t, 10, 1> benchTestOffTime;
4849 /**
4850 * Defines a pressure range below the cut limit at which boost can resume, providing smoother control over boost cut actions.
4851 * For example: if hard cut is 240kpa, and boost cut hysteresis is 20, when the ECU sees 240kpa, fuel/ign will cut, and stay cut until 240-20=220kpa is reached
4852 * units: SPECIAL_CASE_PRESSURE
4853 * offset 3276
4854 */
4855 scaled_channel<uint8_t, 2, 1> boostCutPressureHyst;
4856 /**
4857 * Boost duty cycle modified by gear
4858 * units: %
4859 * offset 3277
4860 */
4861 scaled_channel<int8_t, 2, 1> gearBasedOpenLoopBoostAdder[TCU_GEAR_COUNT] = {};
4862 /**
4863 * need 4 byte alignment
4864 * units: units
4865 * offset 3287
4866 */
4867 uint8_t alignmentFill_at_3287[1] = {};
4868 /**
4869 * How many test bench pulses do you want
4870 * offset 3288
4871 */
4872 uint32_t benchTestCount;
4873 /**
4874 * How long initial idle adder is held before starting to decay.
4875 * units: seconds
4876 * offset 3292
4877 */
4878 scaled_channel<uint8_t, 10, 1> iacByTpsHoldTime;
4879 /**
4880 * How long it takes to remove initial IAC adder to return to normal idle.
4881 * units: seconds
4882 * offset 3293
4883 */
4884 scaled_channel<uint8_t, 10, 1> iacByTpsDecayTime;
4885 /**
4886 * offset 3294
4887 */
4888 switch_input_pin_e tcu_rangeInput[RANGE_INPUT_COUNT] = {};
4889 /**
4890 * offset 3306
4891 */
4892 pin_input_mode_e tcu_rangeInputMode[RANGE_INPUT_COUNT] = {};
4893 /**
4894 * Scale the reported vehicle speed value from CAN. Example: Parameter set to 1.1, CAN VSS reports 50kph, ECU will report 55kph instead.
4895 * units: ratio
4896 * offset 3312
4897 */
4898 scaled_channel<uint16_t, 10000, 1> canVssScaling;
4899 /**
4900 * need 4 byte alignment
4901 * units: units
4902 * offset 3314
4903 */
4904 uint8_t alignmentFill_at_3314[2] = {};
4905 /**
4906 * offset 3316
4907 */
4909 /**
4910 * offset 3348
4911 */
4913 /**
4914 * offset 3380
4915 */
4917 /**
4918 * offset 3412
4919 */
4921 /**
4922 * Place the sensor before the throttle, but after any turbocharger/supercharger and intercoolers if fitted. Uses the same calibration as the MAP sensor.
4923 * offset 3444
4924 */
4926 /**
4927 * Place the sensor after the turbocharger/supercharger, but before any intercoolers if fitted. Uses the same calibration as the MAP sensor.
4928 * offset 3445
4929 */
4931 /**
4932 * offset 3446
4933 */
4934 Gpio dacOutputPins[DAC_OUTPUT_COUNT] = {};
4935 /**
4936 * offset 3450
4937 */
4939 /**
4940 * Number of speedometer pulses per kilometer travelled.
4941 * offset 3452
4942 */
4943 uint16_t speedometerPulsePerKm;
4944 /**
4945 * offset 3454
4946 */
4947 uint8_t simulatorCamPosition[CAM_INPUTS_COUNT] = {};
4948 /**
4949 * offset 3458
4950 */
4952 /**
4953 * need 4 byte alignment
4954 * units: units
4955 * offset 3459
4956 */
4957 uint8_t alignmentFill_at_3459[1] = {};
4958 /**
4959 * offset 3460
4960 */
4961 float ignKeyAdcDivider;
4962 /**
4963 * offset 3464
4964 */
4966 /**
4967 * need 4 byte alignment
4968 * units: units
4969 * offset 3465
4970 */
4971 uint8_t alignmentFill_at_3465[3] = {};
4972 /**
4973 * units: ratio
4974 * offset 3468
4975 */
4976 float triggerVVTGapOverrideFrom[VVT_TRACKING_LENGTH] = {};
4977 /**
4978 * units: ratio
4979 * offset 3484
4980 */
4981 float triggerVVTGapOverrideTo[VVT_TRACKING_LENGTH] = {};
4982 /**
4983 * units: %
4984 * offset 3500
4985 */
4986 int8_t tractionControlEtbDrop[TRACTION_CONTROL_ETB_DROP_SPEED_SIZE][TRACTION_CONTROL_ETB_DROP_SLIP_SIZE] = {};
4987 /**
4988 * This sets an immediate limit on injector duty cycle. If this threshold is reached, the system will immediately cut the injectors.
4989 * units: %
4990 * offset 3536
4991 */
4992 uint8_t maxInjectorDutyInstant;
4993 /**
4994 * This limit allows injectors to operate up to the specified duty cycle percentage for a short period (as defined by the delay). After this delay, if the duty cycle remains above the limit, it will trigger a cut.
4995 * units: %
4996 * offset 3537
4997 */
4999 /**
5000 * Timeout period for duty cycle over the sustained limit to trigger duty cycle protection.
5001 * units: sec
5002 * offset 3538
5003 */
5004 scaled_channel<uint8_t, 10, 1> maxInjectorDutySustainedTimeout;
5005 /**
5006 * need 4 byte alignment
5007 * units: units
5008 * offset 3539
5009 */
5010 uint8_t alignmentFill_at_3539[1] = {};
5011 /**
5012 * offset 3540
5013 */
5014 output_pin_e injectionPinsStage2[MAX_CYLINDER_COUNT] = {};
5015 /**
5016 * units: Deg
5017 * offset 3564
5018 */
5019 int8_t tractionControlTimingDrop[TRACTION_CONTROL_ETB_DROP_SPEED_SIZE][TRACTION_CONTROL_ETB_DROP_SLIP_SIZE] = {};
5020 /**
5021 * units: %
5022 * offset 3600
5023 */
5024 int8_t tractionControlIgnitionSkip[TRACTION_CONTROL_ETB_DROP_SPEED_SIZE][TRACTION_CONTROL_ETB_DROP_SLIP_SIZE] = {};
5025 /**
5026 * offset 3636
5027 */
5028 float auxSpeed1Multiplier;
5029 /**
5030 * offset 3640
5031 */
5033 /**
5034 * offset 3644
5035 */
5037 /**
5038 * offset 3646
5039 */
5041 /**
5042 * offset 3648
5043 */
5045 /**
5046 * offset 3650
5047 */
5049 /**
5050 * offset 3652
5051 */
5053 /**
5054 * offset 3654
5055 */
5057 /**
5058 * offset 3656
5059 */
5061 /**
5062 * offset 3658
5063 */
5065 /**
5066 * offset 3660
5067 */
5069 /**
5070 * offset 3662
5071 */
5073 /**
5074 * offset 3663
5075 */
5077 /**
5078 * offset 3664
5079 */
5081 /**
5082 * offset 3665
5083 */
5085 /**
5086 * offset 3666
5087 */
5089 /**
5090 * offset 3667
5091 */
5093 /**
5094 * offset 3668
5095 */
5097 /**
5098 * offset 3669
5099 */
5101 /**
5102 * need 4 byte alignment
5103 * units: units
5104 * offset 3670
5105 */
5106 uint8_t alignmentFill_at_3670[2] = {};
5107 /**
5108 * Secondary TTL channel baud rate
5109 * units: BPs
5110 * offset 3672
5111 */
5112 uint32_t tunerStudioSerialSpeed;
5113 /**
5114 * offset 3676
5115 */
5117 /**
5118 * offset 3678
5119 */
5121 /**
5122 * need 4 byte alignment
5123 * units: units
5124 * offset 3679
5125 */
5126 uint8_t alignmentFill_at_3679[1] = {};
5127 /**
5128 * offset 3680
5129 */
5130 int anotherCiTest;
5131 /**
5132 * offset 3684
5133 */
5134 uint32_t device_uid[3] = {};
5135 /**
5136 * offset 3696
5137 */
5138 adc_channel_e tcu_rangeAnalogInput[RANGE_INPUT_COUNT] = {};
5139 /**
5140 * need 4 byte alignment
5141 * units: units
5142 * offset 3702
5143 */
5144 uint8_t alignmentFill_at_3702[2] = {};
5145 /**
5146 * units: Ohm
5147 * offset 3704
5148 */
5150 /**
5151 * offset 3708
5152 */
5154 /**
5155 * Nominal coil charge current, 0.25A step
5156 * units: A
5157 * offset 3712
5158 */
5159 scaled_channel<uint8_t, 4, 1> mc33810Nomi;
5160 /**
5161 * Maximum coil charge current, 1A step
5162 * units: A
5163 * offset 3713
5164 */
5165 uint8_t mc33810Maxi;
5166 /**
5167 * need 4 byte alignment
5168 * units: units
5169 * offset 3714
5170 */
5171 uint8_t alignmentFill_at_3714[2] = {};
5172 /**
5173 * offset 3716
5174 */
5176 /**
5177 * value of A/C pressure in kPa/psi before that compressor is disengaged
5178 * units: SPECIAL_CASE_PRESSURE
5179 * offset 3736
5180 */
5181 uint16_t minAcPressure;
5182 /**
5183 * value of A/C pressure in kPa/psi after that compressor is disengaged
5184 * units: SPECIAL_CASE_PRESSURE
5185 * offset 3738
5186 */
5187 uint16_t maxAcPressure;
5188 /**
5189 * Delay before cutting fuel due to low oil pressure. Use this to ignore short pressure blips and sensor noise.
5190 * units: sec
5191 * offset 3740
5192 */
5193 scaled_channel<uint8_t, 10, 1> minimumOilPressureTimeout;
5194 /**
5195 * need 4 byte alignment
5196 * units: units
5197 * offset 3741
5198 */
5199 uint8_t alignmentFill_at_3741[3] = {};
5200 /**
5201 * offset 3744
5202 */
5204 /**
5205 * offset 3764
5206 */
5208 /**
5209 * offset 3784
5210 */
5212 /**
5213 * need 4 byte alignment
5214 * units: units
5215 * offset 3785
5216 */
5217 uint8_t alignmentFill_at_3785[1] = {};
5218 /**
5219 * offset 3786
5220 */
5222 /**
5223 * offset 3788
5224 */
5226 /**
5227 * need 4 byte alignment
5228 * units: units
5229 * offset 3790
5230 */
5231 uint8_t alignmentFill_at_3790[2] = {};
5232 /**
5233 offset 3792 bit 0 */
5234 bool can3ListenMode : 1 {};
5235 /**
5236 offset 3792 bit 1 */
5237 bool verboseCan3 : 1 {};
5238 /**
5239 offset 3792 bit 2 */
5240 bool unusedBit_957_2 : 1 {};
5241 /**
5242 offset 3792 bit 3 */
5243 bool unusedBit_957_3 : 1 {};
5244 /**
5245 offset 3792 bit 4 */
5246 bool unusedBit_957_4 : 1 {};
5247 /**
5248 offset 3792 bit 5 */
5249 bool unusedBit_957_5 : 1 {};
5250 /**
5251 offset 3792 bit 6 */
5252 bool unusedBit_957_6 : 1 {};
5253 /**
5254 offset 3792 bit 7 */
5255 bool unusedBit_957_7 : 1 {};
5256 /**
5257 offset 3792 bit 8 */
5258 bool unusedBit_957_8 : 1 {};
5259 /**
5260 offset 3792 bit 9 */
5261 bool unusedBit_957_9 : 1 {};
5262 /**
5263 offset 3792 bit 10 */
5264 bool unusedBit_957_10 : 1 {};
5265 /**
5266 offset 3792 bit 11 */
5267 bool unusedBit_957_11 : 1 {};
5268 /**
5269 offset 3792 bit 12 */
5270 bool unusedBit_957_12 : 1 {};
5271 /**
5272 offset 3792 bit 13 */
5273 bool unusedBit_957_13 : 1 {};
5274 /**
5275 offset 3792 bit 14 */
5276 bool unusedBit_957_14 : 1 {};
5277 /**
5278 offset 3792 bit 15 */
5279 bool unusedBit_957_15 : 1 {};
5280 /**
5281 offset 3792 bit 16 */
5282 bool unusedBit_957_16 : 1 {};
5283 /**
5284 offset 3792 bit 17 */
5285 bool unusedBit_957_17 : 1 {};
5286 /**
5287 offset 3792 bit 18 */
5288 bool unusedBit_957_18 : 1 {};
5289 /**
5290 offset 3792 bit 19 */
5291 bool unusedBit_957_19 : 1 {};
5292 /**
5293 offset 3792 bit 20 */
5294 bool unusedBit_957_20 : 1 {};
5295 /**
5296 offset 3792 bit 21 */
5297 bool unusedBit_957_21 : 1 {};
5298 /**
5299 offset 3792 bit 22 */
5300 bool unusedBit_957_22 : 1 {};
5301 /**
5302 offset 3792 bit 23 */
5303 bool unusedBit_957_23 : 1 {};
5304 /**
5305 offset 3792 bit 24 */
5306 bool unusedBit_957_24 : 1 {};
5307 /**
5308 offset 3792 bit 25 */
5309 bool unusedBit_957_25 : 1 {};
5310 /**
5311 offset 3792 bit 26 */
5312 bool unusedBit_957_26 : 1 {};
5313 /**
5314 offset 3792 bit 27 */
5315 bool unusedBit_957_27 : 1 {};
5316 /**
5317 offset 3792 bit 28 */
5318 bool unusedBit_957_28 : 1 {};
5319 /**
5320 offset 3792 bit 29 */
5321 bool unusedBit_957_29 : 1 {};
5322 /**
5323 offset 3792 bit 30 */
5324 bool unusedBit_957_30 : 1 {};
5325 /**
5326 offset 3792 bit 31 */
5327 bool unusedBit_957_31 : 1 {};
5328 /**
5329 * Below TPS value all knock suppression will be disabled.
5330 * units: %
5331 * offset 3796
5332 */
5333 scaled_channel<uint8_t, 1, 1> knockSuppressMinTps;
5334 /**
5335 * Fuel to odd when a knock event occurs. Advice: 5% (mild), 10% (turbo/high comp.), 15% (high knock, e.g. GDI), 20% (spicy lump),
5336 * units: %
5337 * offset 3797
5338 */
5339 scaled_channel<uint8_t, 10, 1> knockFuelTrimAggression;
5340 /**
5341 * After a knock event, reapply fuel at this rate.
5342 * units: 1%/s
5343 * offset 3798
5344 */
5345 scaled_channel<uint8_t, 10, 1> knockFuelTrimReapplyRate;
5346 /**
5347 * Fuel trim when knock, max 30%
5348 * units: %
5349 * offset 3799
5350 */
5351 scaled_channel<uint8_t, 1, 1> knockFuelTrim;
5352 /**
5353 * units: sense
5354 * offset 3800
5355 */
5357 /**
5358 * "Estimated knock frequency, ignore cylinderBore if this one > 0"
5359 * units: Hz
5360 * offset 3804
5361 */
5362 float knockFrequency;
5363 /**
5364 * None = I have a MAP-referenced fuel pressure regulator
5365 * Fixed rail pressure = I have an atmosphere-referenced fuel pressure regulator (returnless, typically)
5366 * Sensed rail pressure = I have a fuel pressure sensor
5367 * offset 3808
5368 */
5370 /**
5371 * need 4 byte alignment
5372 * units: units
5373 * offset 3809
5374 */
5375 uint8_t alignmentFill_at_3809[3] = {};
5376 /**
5377 * This is the pressure at which your injector flow is known.
5378 * For example if your injectors flow 400cc/min at 3.5 bar, enter 350kpa here.
5379 * units: SPECIAL_CASE_PRESSURE
5380 * offset 3812
5381 */
5383 /**
5384 * SENT input connected to ETB
5385 * offset 3816
5386 */
5388 /**
5389 * SENT input used for high pressure fuel sensor
5390 * offset 3817
5391 */
5393 /**
5394 * If you have SENT High Pressure Fuel Sensor please select type. For analog TPS leave None
5395 * offset 3818
5396 */
5398 /**
5399 * need 4 byte alignment
5400 * units: units
5401 * offset 3819
5402 */
5403 uint8_t alignmentFill_at_3819[1] = {};
5404 /**
5405 offset 3820 bit 0 */
5406 bool nitrousControlEnabled : 1 {};
5407 /**
5408 offset 3820 bit 1 */
5409 bool vvlControlEnabled : 1 {};
5410 /**
5411 offset 3820 bit 2 */
5412 bool unusedFancy3 : 1 {};
5413 /**
5414 offset 3820 bit 3 */
5415 bool unusedFancy4 : 1 {};
5416 /**
5417 offset 3820 bit 4 */
5418 bool unusedFancy5 : 1 {};
5419 /**
5420 offset 3820 bit 5 */
5421 bool unusedFancy6 : 1 {};
5422 /**
5423 offset 3820 bit 6 */
5424 bool unusedFancy7 : 1 {};
5425 /**
5426 offset 3820 bit 7 */
5427 bool unusedFancy8 : 1 {};
5428 /**
5429 offset 3820 bit 8 */
5430 bool unusedFancy9 : 1 {};
5431 /**
5432 offset 3820 bit 9 */
5433 bool unusedFancy10 : 1 {};
5434 /**
5435 offset 3820 bit 10 */
5436 bool unusedFancy11 : 1 {};
5437 /**
5438 offset 3820 bit 11 */
5439 bool unusedFancy12 : 1 {};
5440 /**
5441 offset 3820 bit 12 */
5442 bool unusedFancy13 : 1 {};
5443 /**
5444 offset 3820 bit 13 */
5445 bool unusedFancy14 : 1 {};
5446 /**
5447 offset 3820 bit 14 */
5448 bool unusedFancy15 : 1 {};
5449 /**
5450 offset 3820 bit 15 */
5451 bool unusedFancy16 : 1 {};
5452 /**
5453 offset 3820 bit 16 */
5454 bool unusedFancy17 : 1 {};
5455 /**
5456 offset 3820 bit 17 */
5457 bool unusedFancy18 : 1 {};
5458 /**
5459 offset 3820 bit 18 */
5460 bool unusedFancy19 : 1 {};
5461 /**
5462 offset 3820 bit 19 */
5463 bool unusedFancy20 : 1 {};
5464 /**
5465 offset 3820 bit 20 */
5466 bool unusedFancy21 : 1 {};
5467 /**
5468 offset 3820 bit 21 */
5469 bool unusedFancy22 : 1 {};
5470 /**
5471 offset 3820 bit 22 */
5472 bool unusedFancy23 : 1 {};
5473 /**
5474 offset 3820 bit 23 */
5475 bool unusedFancy24 : 1 {};
5476 /**
5477 offset 3820 bit 24 */
5478 bool unusedFancy25 : 1 {};
5479 /**
5480 offset 3820 bit 25 */
5481 bool unusedFancy26 : 1 {};
5482 /**
5483 offset 3820 bit 26 */
5484 bool unusedFancy27 : 1 {};
5485 /**
5486 offset 3820 bit 27 */
5487 bool unusedFancy28 : 1 {};
5488 /**
5489 offset 3820 bit 28 */
5490 bool unusedFancy29 : 1 {};
5491 /**
5492 offset 3820 bit 29 */
5493 bool unusedFancy30 : 1 {};
5494 /**
5495 offset 3820 bit 30 */
5496 bool unusedFancy31 : 1 {};
5497 /**
5498 offset 3820 bit 31 */
5499 bool unusedFancy32 : 1 {};
5500 /**
5501 * offset 3824
5502 */
5504 /**
5505 * need 4 byte alignment
5506 * units: units
5507 * offset 3825
5508 */
5509 uint8_t alignmentFill_at_3825[1] = {};
5510 /**
5511 * Pin that activates nitrous control
5512 * offset 3826
5513 */
5515 /**
5516 * offset 3828
5517 */
5519 /**
5520 * offset 3829
5521 */
5523 /**
5524 * offset 3830
5525 */
5527 /**
5528 * need 4 byte alignment
5529 * units: units
5530 * offset 3831
5531 */
5532 uint8_t alignmentFill_at_3831[1] = {};
5533 /**
5534 * offset 3832
5535 */
5537 /**
5538 * offset 3836
5539 */
5541 /**
5542 * units: SPECIAL_CASE_TEMPERATURE
5543 * offset 3840
5544 */
5545 int16_t nitrousMinimumClt;
5546 /**
5547 * units: SPECIAL_CASE_PRESSURE
5548 * offset 3842
5549 */
5550 int16_t nitrousMaximumMap;
5551 /**
5552 * units: afr
5553 * offset 3844
5554 */
5555 scaled_channel<uint8_t, 10, 1> nitrousMaximumAfr;
5556 /**
5557 * need 4 byte alignment
5558 * units: units
5559 * offset 3845
5560 */
5561 uint8_t alignmentFill_at_3845[1] = {};
5562 /**
5563 * units: rpm
5564 * offset 3846
5565 */
5566 uint16_t nitrousActivationRpm;
5567 /**
5568 * units: rpm
5569 * offset 3848
5570 */
5571 uint16_t nitrousDeactivationRpm;
5572 /**
5573 * units: rpm
5574 * offset 3850
5575 */
5577 /**
5578 * Retard timing by this amount during DFCO. Smooths the transition back from fuel cut. After fuel is restored, ramp timing back in over the period specified.
5579 * units: deg
5580 * offset 3852
5581 */
5582 uint8_t dfcoRetardDeg;
5583 /**
5584 * Smooths the transition back from fuel cut. After fuel is restored, ramp timing back in over the period specified.
5585 * units: s
5586 * offset 3853
5587 */
5588 scaled_channel<uint8_t, 10, 1> dfcoRetardRampInTime;
5589 /**
5590 * offset 3854
5591 */
5593 /**
5594 * offset 3856
5595 */
5597 /**
5598 * units: %
5599 * offset 3857
5600 */
5602 /**
5603 * need 4 byte alignment
5604 * units: units
5605 * offset 3858
5606 */
5607 uint8_t alignmentFill_at_3858[2] = {};
5608 /**
5609 * Retard timing to remove from actual final timing (after all corrections) due to additional air.
5610 * units: deg
5611 * offset 3860
5612 */
5614 /**
5615 * units: SPECIAL_CASE_SPEED
5616 * offset 3864
5617 */
5619 /**
5620 * need 4 byte alignment
5621 * units: units
5622 * offset 3866
5623 */
5624 uint8_t alignmentFill_at_3866[2] = {};
5625 /**
5626 * Exponential Average Alpha filtering parameter
5627 * offset 3868
5628 */
5630 /**
5631 * How often do we update fuel level gauge
5632 * units: seconds
5633 * offset 3872
5634 */
5636 /**
5637 * Error below specified value
5638 * units: v
5639 * offset 3876
5640 */
5642 /**
5643 * Error above specified value
5644 * units: v
5645 * offset 3880
5646 */
5648 /**
5649 * A higher alpha (closer to 1) means the EMA reacts more quickly to changes in the data.
5650 * '1' means no filtering, 0.98 would be some filtering.
5651 * offset 3884
5652 */
5653 float afrExpAverageAlpha;
5654 /**
5655 * Compensates for trigger delay due to belt stretch, or other electromechanical issues. beware that raising this value advances ignition timing!
5656 * units: uS
5657 * offset 3888
5658 */
5659 scaled_channel<uint8_t, 1, 1> sparkHardwareLatencyCorrection;
5660 /**
5661 * Delay before cutting fuel due to extra high oil pressure. Use this to ignore short pressure blips and sensor noise.
5662 * units: sec
5663 * offset 3889
5664 */
5665 scaled_channel<uint8_t, 10, 1> maxOilPressureTimeout;
5666 /**
5667 * units: kg/h
5668 * offset 3890
5669 */
5670 scaled_channel<uint16_t, 100, 1> idleFlowEstimateFlow[8] = {};
5671 /**
5672 * units: %
5673 * offset 3906
5674 */
5675 scaled_channel<uint8_t, 2, 1> idleFlowEstimatePosition[8] = {};
5676 /**
5677 * units: mg
5678 * offset 3914
5679 */
5680 int8_t airmassToTimingBins[8] = {};
5681 /**
5682 * units: deg
5683 * offset 3922
5684 */
5685 int8_t airmassToTimingValues[8] = {};
5686 /**
5687 * idle return target ramp duration
5688 * units: seconds
5689 * offset 3930
5690 */
5691 scaled_channel<uint8_t, 10, 1> idleReturnTargetRampDuration;
5692 /**
5693 * need 4 byte alignment
5694 * units: units
5695 * offset 3931
5696 */
5697 uint8_t alignmentFill_at_3931[1] = {};
5698 /**
5699 * Voltage when the wastegate is fully open
5700 * units: v
5701 * offset 3932
5702 */
5704 /**
5705 * Voltage when the wastegate is closed
5706 * units: v
5707 * offset 3936
5708 */
5710 /**
5711 * offset 3940
5712 */
5713 wbo_s canWbo[CAN_WBO_COUNT] = {};
5714 /**
5715 * offset 3956
5716 */
5718 /**
5719 * offset 3958
5720 */
5722 /**
5723 * need 4 byte alignment
5724 * units: units
5725 * offset 3959
5726 */
5727 uint8_t alignmentFill_at_3959[1] = {};
5728 /**
5729 * offset 3960
5730 */
5732};
5733static_assert(sizeof(engine_configuration_s) == 3984);
5734
5735// start of ign_cyl_trim_s
5736struct ign_cyl_trim_s {
5737 /**
5738 * offset 0
5739 */
5740 scaled_channel<int8_t, 5, 1> table[IGN_TRIM_SIZE][IGN_TRIM_SIZE] = {};
5741};
5742static_assert(sizeof(ign_cyl_trim_s) == 16);
5743
5744// start of fuel_cyl_trim_s
5745struct fuel_cyl_trim_s {
5746 /**
5747 * offset 0
5748 */
5749 scaled_channel<int8_t, 5, 1> table[FUEL_TRIM_SIZE][FUEL_TRIM_SIZE] = {};
5750};
5751static_assert(sizeof(fuel_cyl_trim_s) == 16);
5752
5753// start of blend_table_s
5754struct blend_table_s {
5755 /**
5756 * offset 0
5757 */
5758 scaled_channel<int16_t, 10, 1> table[BLEND_TABLE_COUNT][BLEND_TABLE_COUNT] = {};
5759 /**
5760 * units: Load
5761 * offset 128
5762 */
5763 uint16_t loadBins[BLEND_TABLE_COUNT] = {};
5764 /**
5765 * units: RPM
5766 * offset 144
5767 */
5768 uint16_t rpmBins[BLEND_TABLE_COUNT] = {};
5769 /**
5770 * offset 160
5771 */
5773 /**
5774 * offset 161
5775 */
5777 /**
5778 * offset 162
5779 */
5780 scaled_channel<int16_t, 10, 1> blendBins[BLEND_FACTOR_SIZE] = {};
5781 /**
5782 * units: %
5783 * offset 178
5784 */
5785 scaled_channel<uint8_t, 2, 1> blendValues[BLEND_FACTOR_SIZE] = {};
5786 /**
5787 * need 4 byte alignment
5788 * units: units
5789 * offset 186
5790 */
5791 uint8_t alignmentFill_at_186[2] = {};
5792};
5793static_assert(sizeof(blend_table_s) == 188);
5794
5795// start of persistent_config_s
5796struct persistent_config_s {
5797 /**
5798 * offset 0
5799 */
5801 /**
5802 * offset 3984
5803 */
5804 float tmfTable[TMF_RATIO_SIZE][TMF_SIZE] = {};
5805 /**
5806 * offset 4000
5807 */
5808 float tmfRatioBins[TMF_RATIO_SIZE] = {};
5809 /**
5810 * offset 4008
5811 */
5812 float tmfOpeningBins[TMF_SIZE] = {};
5813 /**
5814 * units: Nm
5815 * offset 4016
5816 */
5817 scaled_channel<uint8_t, 1, 10> torqueTable[TORQUE_CURVE_SIZE][TORQUE_CURVE_RPM_SIZE] = {};
5818 /**
5819 * units: RPM
5820 * offset 4052
5821 */
5822 uint16_t torqueRpmBins[TORQUE_CURVE_RPM_SIZE] = {};
5823 /**
5824 * units: Load
5825 * offset 4064
5826 */
5827 uint16_t torqueLoadBins[TORQUE_CURVE_SIZE] = {};
5828 /**
5829 * units: mult
5830 * offset 4076
5831 */
5832 float postCrankingFactor[CRANKING_ENRICH_CLT_COUNT][CRANKING_ENRICH_COUNT] = {};
5833 /**
5834 * units: count
5835 * offset 4220
5836 */
5837 uint16_t postCrankingDurationBins[CRANKING_ENRICH_COUNT] = {};
5838 /**
5839 * units: SPECIAL_CASE_TEMPERATURE
5840 * offset 4232
5841 */
5842 int16_t postCrankingCLTBins[CRANKING_ENRICH_CLT_COUNT] = {};
5843 /**
5844 * target TPS value, 0 to 100%
5845 * TODO: use int8 data date once we template interpolation method
5846 * units: target TPS position
5847 * offset 4244
5848 */
5849 float etbBiasBins[ETB_BIAS_CURVE_LENGTH] = {};
5850 /**
5851 * PWM bias, open loop component of PID closed loop control
5852 * units: ETB duty cycle bias
5853 * offset 4276
5854 */
5855 float etbBiasValues[ETB_BIAS_CURVE_LENGTH] = {};
5856 /**
5857 * target Wastegate value, 0 to 100%
5858 * units: target DC position
5859 * offset 4308
5860 */
5861 int8_t dcWastegateBiasBins[ETB_BIAS_CURVE_LENGTH] = {};
5862 /**
5863 * PWM bias, open loop component of PID closed loop control
5864 * units: DC wastegate duty cycle bias
5865 * offset 4316
5866 */
5867 scaled_channel<int16_t, 100, 1> dcWastegateBiasValues[ETB_BIAS_CURVE_LENGTH] = {};
5868 /**
5869 * units: %
5870 * offset 4332
5871 */
5872 scaled_channel<uint8_t, 20, 1> iacPidMultTable[IAC_PID_MULT_SIZE][IAC_PID_MULT_SIZE] = {};
5873 /**
5874 * units: Load
5875 * offset 4396
5876 */
5877 uint8_t iacPidMultLoadBins[IAC_PID_MULT_SIZE] = {};
5878 /**
5879 * units: RPM
5880 * offset 4404
5881 */
5882 scaled_channel<uint8_t, 1, 10> iacPidMultRpmBins[IAC_PID_MULT_RPM_SIZE] = {};
5883 /**
5884 * On Single Coil or Wasted Spark setups you have to lower dwell at high RPM
5885 * units: RPM
5886 * offset 4412
5887 */
5888 uint16_t sparkDwellRpmBins[DWELL_CURVE_SIZE] = {};
5889 /**
5890 * units: ms
5891 * offset 4428
5892 */
5893 scaled_channel<uint16_t, 100, 1> sparkDwellValues[DWELL_CURVE_SIZE] = {};
5894 /**
5895 * CLT-based target RPM for automatic idle controller
5896 * units: SPECIAL_CASE_TEMPERATURE
5897 * offset 4444
5898 */
5899 scaled_channel<int16_t, 1, 1> cltIdleRpmBins[CLT_CURVE_SIZE] = {};
5900 /**
5901 * See idleRpmPid
5902 * units: RPM
5903 * offset 4476
5904 */
5905 scaled_channel<uint8_t, 1, 20> cltIdleRpm[CLT_CURVE_SIZE] = {};
5906 /**
5907 * units: deg
5908 * offset 4492
5909 */
5910 scaled_channel<int16_t, 10, 1> ignitionCltCorrTable[CLT_TIMING_LOAD_AXIS_SIZE][CLT_TIMING_TEMP_AXIS_SIZE] = {};
5911 /**
5912 * CLT-based timing correction
5913 * units: SPECIAL_CASE_TEMPERATURE
5914 * offset 4542
5915 */
5916 scaled_channel<int16_t, 1, 1> ignitionCltCorrTempBins[CLT_TIMING_TEMP_AXIS_SIZE] = {};
5917 /**
5918 * units: Load
5919 * offset 4552
5920 */
5921 scaled_channel<uint8_t, 1, 5> ignitionCltCorrLoadBins[CLT_TIMING_LOAD_AXIS_SIZE] = {};
5922 /**
5923 * need 4 byte alignment
5924 * units: units
5925 * offset 4557
5926 */
5927 uint8_t alignmentFill_at_4557[3] = {};
5928 /**
5929 * units: x
5930 * offset 4560
5931 */
5932 float scriptCurve1Bins[SCRIPT_CURVE_16] = {};
5933 /**
5934 * units: y
5935 * offset 4624
5936 */
5937 float scriptCurve1[SCRIPT_CURVE_16] = {};
5938 /**
5939 * units: x
5940 * offset 4688
5941 */
5942 float scriptCurve2Bins[SCRIPT_CURVE_16] = {};
5943 /**
5944 * units: y
5945 * offset 4752
5946 */
5947 float scriptCurve2[SCRIPT_CURVE_16] = {};
5948 /**
5949 * units: x
5950 * offset 4816
5951 */
5952 float scriptCurve3Bins[SCRIPT_CURVE_8] = {};
5953 /**
5954 * units: y
5955 * offset 4848
5956 */
5957 float scriptCurve3[SCRIPT_CURVE_8] = {};
5958 /**
5959 * units: x
5960 * offset 4880
5961 */
5962 float scriptCurve4Bins[SCRIPT_CURVE_8] = {};
5963 /**
5964 * units: y
5965 * offset 4912
5966 */
5967 float scriptCurve4[SCRIPT_CURVE_8] = {};
5968 /**
5969 * units: x
5970 * offset 4944
5971 */
5972 float scriptCurve5Bins[SCRIPT_CURVE_8] = {};
5973 /**
5974 * units: y
5975 * offset 4976
5976 */
5977 float scriptCurve5[SCRIPT_CURVE_8] = {};
5978 /**
5979 * units: x
5980 * offset 5008
5981 */
5982 float scriptCurve6Bins[SCRIPT_CURVE_8] = {};
5983 /**
5984 * units: y
5985 * offset 5040
5986 */
5987 float scriptCurve6[SCRIPT_CURVE_8] = {};
5988 /**
5989 * units: SPECIAL_CASE_PRESSURE
5990 * offset 5072
5991 */
5992 float baroCorrPressureBins[BARO_CORR_SIZE] = {};
5993 /**
5994 * units: RPM
5995 * offset 5088
5996 */
5997 float baroCorrRpmBins[BARO_CORR_SIZE] = {};
5998 /**
5999 * units: ratio
6000 * offset 5104
6001 */
6002 float baroCorrTable[BARO_CORR_SIZE][BARO_CORR_SIZE] = {};
6003 /**
6004 * Cranking fuel correction coefficient based on TPS
6005 * units: Ratio
6006 * offset 5168
6007 */
6008 float crankingTpsCoef[CRANKING_CURVE_SIZE] = {};
6009 /**
6010 * units: %
6011 * offset 5200
6012 */
6013 float crankingTpsBins[CRANKING_CURVE_SIZE] = {};
6014 /**
6015 * Optional timing advance table for Cranking (see useSeparateAdvanceForCranking)
6016 * units: RPM
6017 * offset 5232
6018 */
6019 uint16_t crankingAdvanceBins[CRANKING_ADVANCE_CURVE_SIZE] = {};
6020 /**
6021 * Optional timing advance table for Cranking (see useSeparateAdvanceForCranking)
6022 * units: deg
6023 * offset 5240
6024 */
6025 scaled_channel<int16_t, 100, 1> crankingAdvance[CRANKING_ADVANCE_CURVE_SIZE] = {};
6026 /**
6027 * RPM-based idle position for coasting
6028 * units: RPM
6029 * offset 5248
6030 */
6031 scaled_channel<uint8_t, 1, 100> iacCoastingRpmBins[CLT_CURVE_SIZE] = {};
6032 /**
6033 * RPM-based idle position for coasting
6034 * units: %
6035 * offset 5264
6036 */
6037 scaled_channel<uint8_t, 2, 1> iacCoasting[CLT_CURVE_SIZE] = {};
6038 /**
6039 * offset 5280
6040 */
6041 scaled_channel<uint8_t, 2, 1> boostTableOpenLoop[BOOST_LOAD_COUNT][BOOST_RPM_COUNT] = {};
6042 /**
6043 * units: RPM
6044 * offset 5344
6045 */
6046 scaled_channel<uint8_t, 1, 100> boostRpmBins[BOOST_RPM_COUNT] = {};
6047 /**
6048 * offset 5352
6049 */
6050 uint16_t boostOpenLoopLoadBins[BOOST_LOAD_COUNT] = {};
6051 /**
6052 * offset 5368
6053 */
6054 scaled_channel<uint8_t, 1, 2> boostTableClosedLoop[BOOST_LOAD_COUNT][BOOST_RPM_COUNT] = {};
6055 /**
6056 * offset 5432
6057 */
6058 uint16_t boostClosedLoopLoadBins[BOOST_LOAD_COUNT] = {};
6059 /**
6060 * units: %
6061 * offset 5448
6062 */
6063 uint8_t pedalToTpsTable[PEDAL_TO_TPS_SIZE][PEDAL_TO_TPS_RPM_SIZE] = {};
6064 /**
6065 * units: %
6066 * offset 5512
6067 */
6068 uint8_t pedalToTpsPedalBins[PEDAL_TO_TPS_SIZE] = {};
6069 /**
6070 * units: RPM
6071 * offset 5520
6072 */
6073 scaled_channel<uint8_t, 1, 100> pedalToTpsRpmBins[PEDAL_TO_TPS_RPM_SIZE] = {};
6074 /**
6075 * CLT-based cranking position %. The values in this curve represent a percentage of the ETB Maximum angle. e.g. If "ETB Idle Maximum Angle" is 10, a value of 70 means 7% ETB Position.
6076 * units: SPECIAL_CASE_TEMPERATURE
6077 * offset 5528
6078 */
6079 float cltCrankingCorrBins[CLT_CRANKING_CURVE_SIZE] = {};
6080 /**
6081 * CLT-based cranking position %. The values in this curve represent a percentage of the ETB Maximum angle. e.g. If "ETB Idle Maximum Angle" is 10, a value of 70 means 7% ETB Position.
6082 * units: percent
6083 * offset 5560
6084 */
6085 float cltCrankingCorr[CLT_CRANKING_CURVE_SIZE] = {};
6086 /**
6087 * units: SPECIAL_CASE_TEMPERATURE
6088 * offset 5592
6089 */
6090 float afterCrankingIACtaperDurationBins[CLT_CRANKING_TAPER_CURVE_SIZE] = {};
6091 /**
6092 * This is the duration in cycles that the IAC will take to reach its normal idle position, it can be used to hold the idle higher for a few seconds after cranking to improve startup.
6093 * Should be 100 once tune is better
6094 * units: cycles
6095 * offset 5616
6096 */
6097 uint16_t afterCrankingIACtaperDuration[CLT_CRANKING_TAPER_CURVE_SIZE] = {};
6098 /**
6099 * Optional timing advance table for Idle (see useSeparateAdvanceForIdle)
6100 * units: RPM
6101 * offset 5628
6102 */
6103 scaled_channel<uint8_t, 1, 50> idleAdvanceBins[IDLE_ADVANCE_CURVE_SIZE] = {};
6104 /**
6105 * Optional timing advance table for Idle (see useSeparateAdvanceForIdle)
6106 * units: deg
6107 * offset 5636
6108 */
6109 float idleAdvance[IDLE_ADVANCE_CURVE_SIZE] = {};
6110 /**
6111 * units: RPM
6112 * offset 5668
6113 */
6114 scaled_channel<uint8_t, 1, 10> idleVeRpmBins[IDLE_VE_SIZE_RPM] = {};
6115 /**
6116 * units: load
6117 * offset 5672
6118 */
6119 uint8_t idleVeLoadBins[IDLE_VE_SIZE] = {};
6120 /**
6121 * units: %
6122 * offset 5676
6123 */
6124 scaled_channel<uint16_t, 10, 1> idleVeTable[IDLE_VE_SIZE][IDLE_VE_SIZE_RPM] = {};
6125 /**
6126 * offset 5708
6127 */
6129 /**
6130 * units: SPECIAL_CASE_TEMPERATURE
6131 * offset 13708
6132 */
6133 float cltFuelCorrBins[CLT_FUEL_CURVE_SIZE] = {};
6134 /**
6135 * units: ratio
6136 * offset 13772
6137 */
6138 float cltFuelCorr[CLT_FUEL_CURVE_SIZE] = {};
6139 /**
6140 * units: SPECIAL_CASE_TEMPERATURE
6141 * offset 13836
6142 */
6143 float iatFuelCorrBins[IAT_CURVE_SIZE] = {};
6144 /**
6145 * units: ratio
6146 * offset 13900
6147 */
6148 float iatFuelCorr[IAT_CURVE_SIZE] = {};
6149 /**
6150 * units: ratio
6151 * offset 13964
6152 */
6153 float crankingFuelCoef[CRANKING_CURVE_SIZE] = {};
6154 /**
6155 * units: SPECIAL_CASE_TEMPERATURE
6156 * offset 13996
6157 */
6158 float crankingFuelBins[CRANKING_CURVE_SIZE] = {};
6159 /**
6160 * units: counter
6161 * offset 14028
6162 */
6163 float crankingCycleBins[CRANKING_CURVE_SIZE] = {};
6164 /**
6165 * units: SPECIAL_CASE_TEMPERATURE
6166 * offset 14060
6167 */
6168 int16_t crankingCycleFuelCltBins[CRANKING_CYCLE_CLT_SIZE] = {};
6169 /**
6170 * Base mass of the per-cylinder fuel injected during cranking. This is then modified by the multipliers for IAT, TPS ect, to give the final cranking pulse width.
6171 * A reasonable starting point is 60mg per liter per cylinder.
6172 * ex: 2 liter 4 cyl = 500cc/cyl, so 30mg cranking fuel.
6173 * units: mg
6174 * offset 14068
6175 */
6176 float crankingCycleBaseFuel[CRANKING_CYCLE_CLT_SIZE][CRANKING_CURVE_SIZE] = {};
6177 /**
6178 * CLT-based idle position for simple manual idle controller
6179 * units: SPECIAL_CASE_TEMPERATURE
6180 * offset 14196
6181 */
6182 float cltIdleCorrBins[CLT_IDLE_TABLE_CLT_SIZE] = {};
6183 /**
6184 * CLT-based idle position for simple manual idle controller
6185 * units: %
6186 * offset 14228
6187 */
6188 float cltIdleCorrTable[CLT_IDLE_TABLE_RPM_SIZE][CLT_IDLE_TABLE_CLT_SIZE] = {};
6189 /**
6190 * units: Target RPM
6191 * offset 14292
6192 */
6193 scaled_channel<uint8_t, 1, 100> rpmIdleCorrBins[CLT_IDLE_TABLE_RPM_SIZE] = {};
6194 /**
6195 * Long Term Idle Trim (LTIT) multiplicativo para idle open loop
6196 * units: %
6197 * offset 14294
6198 */
6199 scaled_channel<uint16_t, 10, 1> ltitTable[CLT_IDLE_TABLE_CLT_SIZE] = {};
6200 /**
6201 * need 4 byte alignment
6202 * units: units
6203 * offset 14310
6204 */
6205 uint8_t alignmentFill_at_14310[2] = {};
6206 /**
6207 * Also known as MAF transfer function.
6208 * kg/hour value.
6209 * By the way 2.081989116 kg/h = 1 ft3/m
6210 * units: kg/hour
6211 * offset 14312
6212 */
6213 float mafDecoding[MAF_DECODING_COUNT] = {};
6214 /**
6215 * units: V
6216 * offset 14440
6217 */
6218 float mafDecodingBins[MAF_DECODING_COUNT] = {};
6219 /**
6220 * units: deg
6221 * offset 14568
6222 */
6223 scaled_channel<int16_t, 10, 1> ignitionIatCorrTable[IAT_IGN_CORR_LOAD_COUNT][IAT_IGN_CORR_COUNT] = {};
6224 /**
6225 * units: SPECIAL_CASE_TEMPERATURE
6226 * offset 14696
6227 */
6228 int8_t ignitionIatCorrTempBins[IAT_IGN_CORR_COUNT] = {};
6229 /**
6230 * units: Load
6231 * offset 14704
6232 */
6233 scaled_channel<uint8_t, 1, 5> ignitionIatCorrLoadBins[IAT_IGN_CORR_LOAD_COUNT] = {};
6234 /**
6235 * units: deg
6236 * offset 14712
6237 */
6238 int16_t injectionPhase[INJ_PHASE_LOAD_COUNT][INJ_PHASE_RPM_COUNT] = {};
6239 /**
6240 * units: Load
6241 * offset 15224
6242 */
6243 uint16_t injPhaseLoadBins[INJ_PHASE_LOAD_COUNT] = {};
6244 /**
6245 * units: RPM
6246 * offset 15256
6247 */
6248 uint16_t injPhaseRpmBins[INJ_PHASE_RPM_COUNT] = {};
6249 /**
6250 * units: onoff
6251 * offset 15288
6252 */
6253 uint8_t tcuSolenoidTable[TCU_SOLENOID_COUNT][TCU_GEAR_COUNT] = {};
6254 /**
6255 * This table represents MAP at a given TPS vs RPM, which we use if our MAP sensor has failed, or if we are using MAP Prediciton.
6256 * This table should be a direct representation of MAP, you can tune it manually by disconnecting MAP sensor, and filling out the table with values that match an external gauge that shows MAP.
6257 * Additionally, you can also use MLV to get the map values and/or generate the table for you
6258 * units: SPECIAL_CASE_PRESSURE
6259 * offset 15348
6260 */
6261 scaled_channel<uint16_t, 100, 1> mapEstimateTable[MAP_EST_LOAD_COUNT][MAP_EST_RPM_COUNT] = {};
6262 /**
6263 * units: % TPS
6264 * offset 15860
6265 */
6266 scaled_channel<uint16_t, 100, 1> mapEstimateTpsBins[MAP_EST_LOAD_COUNT] = {};
6267 /**
6268 * units: RPM
6269 * offset 15892
6270 */
6271 uint16_t mapEstimateRpmBins[MAP_EST_RPM_COUNT] = {};
6272 /**
6273 * units: value
6274 * offset 15924
6275 */
6276 int8_t vvtTable1[VVT_TABLE_SIZE][VVT_TABLE_RPM_SIZE] = {};
6277 /**
6278 * units: L
6279 * offset 15988
6280 */
6281 uint16_t vvtTable1LoadBins[VVT_TABLE_SIZE] = {};
6282 /**
6283 * units: RPM
6284 * offset 16004
6285 */
6286 uint16_t vvtTable1RpmBins[VVT_TABLE_RPM_SIZE] = {};
6287 /**
6288 * units: value
6289 * offset 16020
6290 */
6291 int8_t vvtTable2[VVT_TABLE_SIZE][VVT_TABLE_RPM_SIZE] = {};
6292 /**
6293 * units: L
6294 * offset 16084
6295 */
6296 uint16_t vvtTable2LoadBins[VVT_TABLE_SIZE] = {};
6297 /**
6298 * units: RPM
6299 * offset 16100
6300 */
6301 uint16_t vvtTable2RpmBins[VVT_TABLE_RPM_SIZE] = {};
6302 /**
6303 * units: deg
6304 * offset 16116
6305 */
6306 scaled_channel<int16_t, 10, 1> ignitionTable[IGN_LOAD_COUNT][IGN_RPM_COUNT] = {};
6307 /**
6308 * units: Load
6309 * offset 16628
6310 */
6311 uint16_t ignitionLoadBins[IGN_LOAD_COUNT] = {};
6312 /**
6313 * units: RPM
6314 * offset 16660
6315 */
6316 uint16_t ignitionRpmBins[IGN_RPM_COUNT] = {};
6317 /**
6318 * units: %
6319 * offset 16692
6320 */
6321 scaled_channel<uint16_t, 10, 1> veTable[VE_LOAD_COUNT][VE_RPM_COUNT] = {};
6322 /**
6323 * units: {bitStringValue(fuelUnits, fuelAlgorithm) }
6324 * offset 17204
6325 */
6326 uint16_t veLoadBins[VE_LOAD_COUNT] = {};
6327 /**
6328 * units: RPM
6329 * offset 17236
6330 */
6331 uint16_t veRpmBins[VE_RPM_COUNT] = {};
6332 /**
6333 * units: lambda
6334 * offset 17268
6335 */
6336 scaled_channel<uint8_t, 147, 1> lambdaTable[FUEL_LOAD_COUNT][FUEL_RPM_COUNT] = {};
6337 /**
6338 * offset 17524
6339 */
6340 uint16_t lambdaLoadBins[FUEL_LOAD_COUNT] = {};
6341 /**
6342 * units: RPM
6343 * offset 17556
6344 */
6345 uint16_t lambdaRpmBins[FUEL_RPM_COUNT] = {};
6346 /**
6347 * units: value
6348 * offset 17588
6349 */
6350 float tpsTpsAccelTable[TPS_TPS_ACCEL_TABLE][TPS_TPS_ACCEL_TABLE] = {};
6351 /**
6352 * units: %
6353 * offset 17844
6354 */
6355 float tpsTpsAccelFromRpmBins[TPS_TPS_ACCEL_TABLE] = {};
6356 /**
6357 * units: %
6358 * offset 17876
6359 */
6360 float tpsTpsAccelToRpmBins[TPS_TPS_ACCEL_TABLE] = {};
6361 /**
6362 * units: value
6363 * offset 17908
6364 */
6365 float scriptTable1[SCRIPT_TABLE_8][SCRIPT_TABLE_8] = {};
6366 /**
6367 * units: L
6368 * offset 18164
6369 */
6370 int16_t scriptTable1LoadBins[SCRIPT_TABLE_8] = {};
6371 /**
6372 * units: RPM
6373 * offset 18180
6374 */
6375 int16_t scriptTable1RpmBins[SCRIPT_TABLE_8] = {};
6376 /**
6377 * units: value
6378 * offset 18196
6379 */
6380 float scriptTable2[TABLE_2_LOAD_SIZE][TABLE_2_RPM_SIZE] = {};
6381 /**
6382 * units: L
6383 * offset 18452
6384 */
6385 int16_t scriptTable2LoadBins[TABLE_2_LOAD_SIZE] = {};
6386 /**
6387 * units: RPM
6388 * offset 18468
6389 */
6390 int16_t scriptTable2RpmBins[TABLE_2_RPM_SIZE] = {};
6391 /**
6392 * units: value
6393 * offset 18484
6394 */
6395 uint8_t scriptTable3[TABLE_3_LOAD_SIZE][TABLE_3_RPM_SIZE] = {};
6396 /**
6397 * units: L
6398 * offset 18548
6399 */
6400 int16_t scriptTable3LoadBins[TABLE_3_LOAD_SIZE] = {};
6401 /**
6402 * units: RPM
6403 * offset 18564
6404 */
6405 int16_t scriptTable3RpmBins[TABLE_3_RPM_SIZE] = {};
6406 /**
6407 * units: value
6408 * offset 18580
6409 */
6410 uint8_t scriptTable4[TABLE_4_LOAD_SIZE][TABLE_4_RPM_SIZE] = {};
6411 /**
6412 * units: L
6413 * offset 18660
6414 */
6415 int16_t scriptTable4LoadBins[TABLE_4_LOAD_SIZE] = {};
6416 /**
6417 * units: RPM
6418 * offset 18676
6419 */
6420 int16_t scriptTable4RpmBins[TABLE_4_RPM_SIZE] = {};
6421 /**
6422 * offset 18696
6423 */
6424 uint16_t ignTrimLoadBins[IGN_TRIM_SIZE] = {};
6425 /**
6426 * units: rpm
6427 * offset 18704
6428 */
6429 uint16_t ignTrimRpmBins[IGN_TRIM_SIZE] = {};
6430 /**
6431 * offset 18712
6432 */
6433 ign_cyl_trim_s ignTrims[MAX_CYLINDER_COUNT] = {};
6434 /**
6435 * offset 18904
6436 */
6437 uint16_t fuelTrimLoadBins[FUEL_TRIM_SIZE] = {};
6438 /**
6439 * units: rpm
6440 * offset 18912
6441 */
6442 uint16_t fuelTrimRpmBins[FUEL_TRIM_SIZE] = {};
6443 /**
6444 * offset 18920
6445 */
6446 fuel_cyl_trim_s fuelTrims[MAX_CYLINDER_COUNT] = {};
6447 /**
6448 * units: ratio
6449 * offset 19112
6450 */
6451 scaled_channel<uint16_t, 100, 1> crankingFuelCoefE100[CRANKING_CURVE_SIZE] = {};
6452 /**
6453 * units: Airmass
6454 * offset 19128
6455 */
6456 scaled_channel<uint8_t, 1, 5> tcu_pcAirmassBins[TCU_TABLE_WIDTH] = {};
6457 /**
6458 * units: %
6459 * offset 19136
6460 */
6461 uint8_t tcu_pcValsR[TCU_TABLE_WIDTH] = {};
6462 /**
6463 * units: %
6464 * offset 19144
6465 */
6466 uint8_t tcu_pcValsN[TCU_TABLE_WIDTH] = {};
6467 /**
6468 * units: %
6469 * offset 19152
6470 */
6471 uint8_t tcu_pcVals1[TCU_TABLE_WIDTH] = {};
6472 /**
6473 * units: %
6474 * offset 19160
6475 */
6476 uint8_t tcu_pcVals2[TCU_TABLE_WIDTH] = {};
6477 /**
6478 * units: %
6479 * offset 19168
6480 */
6481 uint8_t tcu_pcVals3[TCU_TABLE_WIDTH] = {};
6482 /**
6483 * units: %
6484 * offset 19176
6485 */
6486 uint8_t tcu_pcVals4[TCU_TABLE_WIDTH] = {};
6487 /**
6488 * units: %
6489 * offset 19184
6490 */
6491 uint8_t tcu_pcVals12[TCU_TABLE_WIDTH] = {};
6492 /**
6493 * units: %
6494 * offset 19192
6495 */
6496 uint8_t tcu_pcVals23[TCU_TABLE_WIDTH] = {};
6497 /**
6498 * units: %
6499 * offset 19200
6500 */
6501 uint8_t tcu_pcVals34[TCU_TABLE_WIDTH] = {};
6502 /**
6503 * units: %
6504 * offset 19208
6505 */
6506 uint8_t tcu_pcVals21[TCU_TABLE_WIDTH] = {};
6507 /**
6508 * units: %
6509 * offset 19216
6510 */
6511 uint8_t tcu_pcVals32[TCU_TABLE_WIDTH] = {};
6512 /**
6513 * units: %
6514 * offset 19224
6515 */
6516 uint8_t tcu_pcVals43[TCU_TABLE_WIDTH] = {};
6517 /**
6518 * units: TPS
6519 * offset 19232
6520 */
6521 uint8_t tcu_tccTpsBins[8] = {};
6522 /**
6523 * units: SPECIAL_CASE_SPEED
6524 * offset 19240
6525 */
6526 uint8_t tcu_tccLockSpeed[8] = {};
6527 /**
6528 * units: SPECIAL_CASE_SPEED
6529 * offset 19248
6530 */
6531 uint8_t tcu_tccUnlockSpeed[8] = {};
6532 /**
6533 * units: SPECIAL_CASE_SPEED
6534 * offset 19256
6535 */
6536 uint8_t tcu_32SpeedBins[8] = {};
6537 /**
6538 * units: %
6539 * offset 19264
6540 */
6541 uint8_t tcu_32Vals[8] = {};
6542 /**
6543 * units: %
6544 * offset 19272
6545 */
6546 scaled_channel<int8_t, 10, 1> throttle2TrimTable[ETB2_TRIM_SIZE][ETB2_TRIM_RPM_SIZE] = {};
6547 /**
6548 * units: %
6549 * offset 19308
6550 */
6551 uint8_t throttle2TrimTpsBins[ETB2_TRIM_SIZE] = {};
6552 /**
6553 * units: RPM
6554 * offset 19314
6555 */
6556 scaled_channel<uint8_t, 1, 100> throttle2TrimRpmBins[ETB2_TRIM_RPM_SIZE] = {};
6557 /**
6558 * units: deg
6559 * offset 19320
6560 */
6561 scaled_channel<uint8_t, 4, 1> maxKnockRetardTable[KNOCK_TABLE_SIZE][KNOCK_TABLE_RPM_SIZE] = {};
6562 /**
6563 * units: %
6564 * offset 19356
6565 */
6566 uint8_t maxKnockRetardLoadBins[KNOCK_TABLE_SIZE] = {};
6567 /**
6568 * units: RPM
6569 * offset 19362
6570 */
6571 scaled_channel<uint8_t, 1, 100> maxKnockRetardRpmBins[KNOCK_TABLE_RPM_SIZE] = {};
6572 /**
6573 * units: deg
6574 * offset 19368
6575 */
6576 scaled_channel<int16_t, 10, 1> ALSTimingRetardTable[ALS_SIZE][ALS_RPM_SIZE] = {};
6577 /**
6578 * units: TPS
6579 * offset 19400
6580 */
6581 uint16_t alsIgnRetardLoadBins[ALS_SIZE] = {};
6582 /**
6583 * units: RPM
6584 * offset 19408
6585 */
6586 uint16_t alsIgnRetardrpmBins[ALS_RPM_SIZE] = {};
6587 /**
6588 * units: percent
6589 * offset 19416
6590 */
6591 scaled_channel<int16_t, 10, 1> ALSFuelAdjustment[ALS_SIZE][ALS_RPM_SIZE] = {};
6592 /**
6593 * units: TPS
6594 * offset 19448
6595 */
6596 uint16_t alsFuelAdjustmentLoadBins[ALS_SIZE] = {};
6597 /**
6598 * units: RPM
6599 * offset 19456
6600 */
6601 uint16_t alsFuelAdjustmentrpmBins[ALS_RPM_SIZE] = {};
6602 /**
6603 * units: ratio
6604 * offset 19464
6605 */
6606 scaled_channel<int16_t, 1, 10> ALSIgnSkipTable[ALS_SIZE][ALS_RPM_SIZE] = {};
6607 /**
6608 * units: TPS
6609 * offset 19496
6610 */
6611 uint16_t alsIgnSkipLoadBins[ALS_SIZE] = {};
6612 /**
6613 * units: RPM
6614 * offset 19504
6615 */
6616 uint16_t alsIgnSkiprpmBins[ALS_RPM_SIZE] = {};
6617 /**
6618 * offset 19512
6619 */
6620 blend_table_s ignBlends[IGN_BLEND_COUNT] = {};
6621 /**
6622 * offset 20264
6623 */
6624 blend_table_s veBlends[VE_BLEND_COUNT] = {};
6625 /**
6626 * units: %
6627 * offset 21016
6628 */
6629 scaled_channel<uint16_t, 10, 1> throttleEstimateEffectiveAreaBins[THR_EST_SIZE] = {};
6630 /**
6631 * In units of g/s normalized to choked flow conditions
6632 * units: g/s
6633 * offset 21040
6634 */
6635 scaled_channel<uint16_t, 10, 1> throttleEstimateEffectiveAreaValues[THR_EST_SIZE] = {};
6636 /**
6637 * offset 21064
6638 */
6639 blend_table_s boostOpenLoopBlends[BOOST_BLEND_COUNT] = {};
6640 /**
6641 * offset 21440
6642 */
6643 blend_table_s boostClosedLoopBlends[BOOST_BLEND_COUNT] = {};
6644 /**
6645 * units: level
6646 * offset 21816
6647 */
6648 float tcu_rangeP[RANGE_INPUT_COUNT] = {};
6649 /**
6650 * units: level
6651 * offset 21840
6652 */
6653 float tcu_rangeR[RANGE_INPUT_COUNT] = {};
6654 /**
6655 * units: level
6656 * offset 21864
6657 */
6658 float tcu_rangeN[RANGE_INPUT_COUNT] = {};
6659 /**
6660 * units: level
6661 * offset 21888
6662 */
6663 float tcu_rangeD[RANGE_INPUT_COUNT] = {};
6664 /**
6665 * units: level
6666 * offset 21912
6667 */
6668 float tcu_rangeM[RANGE_INPUT_COUNT] = {};
6669 /**
6670 * units: level
6671 * offset 21936
6672 */
6673 float tcu_rangeM3[RANGE_INPUT_COUNT] = {};
6674 /**
6675 * units: level
6676 * offset 21960
6677 */
6678 float tcu_rangeM2[RANGE_INPUT_COUNT] = {};
6679 /**
6680 * units: level
6681 * offset 21984
6682 */
6683 float tcu_rangeM1[RANGE_INPUT_COUNT] = {};
6684 /**
6685 * units: level
6686 * offset 22008
6687 */
6688 float tcu_rangePlus[RANGE_INPUT_COUNT] = {};
6689 /**
6690 * units: level
6691 * offset 22032
6692 */
6693 float tcu_rangeMinus[RANGE_INPUT_COUNT] = {};
6694 /**
6695 * units: level
6696 * offset 22056
6697 */
6698 float tcu_rangeLow[RANGE_INPUT_COUNT] = {};
6699 /**
6700 * units: lambda
6701 * offset 22080
6702 */
6703 scaled_channel<uint8_t, 100, 1> lambdaMaxDeviationTable[LAM_SIZE][LAM_RPM_SIZE] = {};
6704 /**
6705 * offset 22096
6706 */
6707 uint16_t lambdaMaxDeviationLoadBins[LAM_SIZE] = {};
6708 /**
6709 * units: RPM
6710 * offset 22104
6711 */
6712 uint16_t lambdaMaxDeviationRpmBins[LAM_RPM_SIZE] = {};
6713 /**
6714 * units: %
6715 * offset 22112
6716 */
6717 uint8_t injectorStagingTable[INJ_STAGING_COUNT][INJ_STAGING_RPM_SIZE] = {};
6718 /**
6719 * offset 22148
6720 */
6721 uint16_t injectorStagingLoadBins[INJ_STAGING_COUNT] = {};
6722 /**
6723 * units: RPM
6724 * offset 22160
6725 */
6726 uint16_t injectorStagingRpmBins[INJ_STAGING_RPM_SIZE] = {};
6727 /**
6728 * units: SPECIAL_CASE_TEMPERATURE
6729 * offset 22172
6730 */
6731 int16_t wwCltBins[WWAE_TABLE_SIZE] = {};
6732 /**
6733 * offset 22188
6734 */
6735 scaled_channel<uint8_t, 100, 1> wwTauCltValues[WWAE_TABLE_SIZE] = {};
6736 /**
6737 * offset 22196
6738 */
6739 scaled_channel<uint8_t, 100, 1> wwBetaCltValues[WWAE_TABLE_SIZE] = {};
6740 /**
6741 * units: SPECIAL_CASE_PRESSURE
6742 * offset 22204
6743 */
6744 uint8_t wwMapBins[WWAE_TABLE_SIZE] = {};
6745 /**
6746 * offset 22212
6747 */
6748 scaled_channel<uint8_t, 100, 1> wwTauMapValues[WWAE_TABLE_SIZE] = {};
6749 /**
6750 * offset 22220
6751 */
6752 scaled_channel<uint8_t, 100, 1> wwBetaMapValues[WWAE_TABLE_SIZE] = {};
6753 /**
6754 * units: %
6755 * offset 22228
6756 */
6757 scaled_channel<uint8_t, 2, 1> hpfpLobeProfileQuantityBins[HPFP_LOBE_PROFILE_SIZE] = {};
6758 /**
6759 * units: deg
6760 * offset 22244
6761 */
6762 scaled_channel<uint8_t, 2, 1> hpfpLobeProfileAngle[HPFP_LOBE_PROFILE_SIZE] = {};
6763 /**
6764 * units: volts
6765 * offset 22260
6766 */
6767 uint8_t hpfpDeadtimeVoltsBins[HPFP_DEADTIME_SIZE] = {};
6768 /**
6769 * units: ms
6770 * offset 22268
6771 */
6772 scaled_channel<uint16_t, 1000, 1> hpfpDeadtimeMS[HPFP_DEADTIME_SIZE] = {};
6773 /**
6774 * units: kPa
6775 * offset 22284
6776 */
6777 uint16_t hpfpTarget[HPFP_TARGET_SIZE][HPFP_TARGET_SIZE] = {};
6778 /**
6779 * units: load
6780 * offset 22484
6781 */
6782 scaled_channel<uint16_t, 10, 1> hpfpTargetLoadBins[HPFP_TARGET_SIZE] = {};
6783 /**
6784 * units: RPM
6785 * offset 22504
6786 */
6787 scaled_channel<uint8_t, 1, 50> hpfpTargetRpmBins[HPFP_TARGET_SIZE] = {};
6788 /**
6789 * units: %
6790 * offset 22514
6791 */
6792 int8_t hpfpCompensation[HPFP_COMPENSATION_SIZE][HPFP_COMPENSATION_RPM_SIZE] = {};
6793 /**
6794 * units: cc/lobe
6795 * offset 22614
6796 */
6797 scaled_channel<uint16_t, 1000, 1> hpfpCompensationLoadBins[HPFP_COMPENSATION_SIZE] = {};
6798 /**
6799 * units: RPM
6800 * offset 22634
6801 */
6802 scaled_channel<uint8_t, 1, 50> hpfpCompensationRpmBins[HPFP_COMPENSATION_RPM_SIZE] = {};
6803 /**
6804 * units: %
6805 * offset 22644
6806 */
6807 scaled_channel<uint16_t, 100, 1> hpfpFuelMassCompensation[HPFP_FUEL_MASS_COMPENSATION_SIZE][HPFP_FUEL_MASS_COMPENSATION_SIZE] = {};
6808 /**
6809 * units: fuel mass/mg
6810 * offset 22772
6811 */
6812 scaled_channel<uint16_t, 100, 1> hpfpFuelMassCompensationFuelMass[HPFP_FUEL_MASS_COMPENSATION_SIZE] = {};
6813 /**
6814 * units: bar
6815 * offset 22788
6816 */
6817 scaled_channel<uint16_t, 10, 1> hpfpFuelMassCompensationFuelPressure[HPFP_FUEL_MASS_COMPENSATION_SIZE] = {};
6818 /**
6819 * units: ms
6820 * offset 22804
6821 */
6822 scaled_channel<uint16_t, 100, 1> injectorFlowLinearization[FLOW_LINEARIZATION_PRESSURE_SIZE][FLOW_LINEARIZATION_MASS_SIZE] = {};
6823 /**
6824 * units: fuel mass/mg
6825 * offset 22812
6826 */
6827 scaled_channel<uint16_t, 100, 1> injectorFlowLinearizationFuelMassBins[FLOW_LINEARIZATION_MASS_SIZE] = {};
6828 /**
6829 * units: bar
6830 * offset 22816
6831 */
6832 scaled_channel<uint16_t, 10, 1> injectorFlowLinearizationPressureBins[FLOW_LINEARIZATION_PRESSURE_SIZE] = {};
6833 /**
6834 * units: RPM
6835 * offset 22820
6836 */
6837 uint16_t knockNoiseRpmBins[ENGINE_NOISE_CURVE_SIZE] = {};
6838 /**
6839 * Knock sensor output knock detection threshold depending on current RPM.
6840 * units: dB
6841 * offset 22852
6842 */
6843 scaled_channel<int8_t, 2, 1> knockBaseNoise[ENGINE_NOISE_CURVE_SIZE] = {};
6844 /**
6845 * units: RPM
6846 * offset 22868
6847 */
6848 scaled_channel<uint8_t, 1, 50> tpsTspCorrValuesBins[TPS_TPS_ACCEL_CLT_CORR_TABLE] = {};
6849 /**
6850 * units: multiplier
6851 * offset 22872
6852 */
6853 scaled_channel<uint8_t, 50, 1> tpsTspCorrValues[TPS_TPS_ACCEL_CLT_CORR_TABLE] = {};
6854 /**
6855 * units: RPM
6856 * offset 22876
6857 */
6858 scaled_channel<uint8_t, 1, 50> predictiveMapBlendDurationBins[TPS_TPS_ACCEL_CLT_CORR_TABLE] = {};
6859 /**
6860 * units: second
6861 * offset 22880
6862 */
6863 scaled_channel<uint8_t, 50, 1> predictiveMapBlendDurationValues[TPS_TPS_ACCEL_CLT_CORR_TABLE] = {};
6864 /**
6865 * units: SPECIAL_CASE_TEMPERATURE
6866 * offset 22884
6867 */
6868 scaled_channel<int16_t, 1, 1> cltRevLimitRpmBins[CLT_LIMITER_CURVE_SIZE] = {};
6869 /**
6870 * units: RPM
6871 * offset 22892
6872 */
6873 uint16_t cltRevLimitRpm[CLT_LIMITER_CURVE_SIZE] = {};
6874 /**
6875 * units: volt
6876 * offset 22900
6877 */
6878 scaled_channel<uint16_t, 1000, 1> fuelLevelBins[FUEL_LEVEL_TABLE_COUNT] = {};
6879 /**
6880 * units: %
6881 * offset 22916
6882 */
6883 uint8_t fuelLevelValues[FUEL_LEVEL_TABLE_COUNT] = {};
6884 /**
6885 * units: volts
6886 * offset 22924
6887 */
6888 scaled_channel<uint8_t, 10, 1> dwellVoltageCorrVoltBins[DWELL_CURVE_SIZE] = {};
6889 /**
6890 * units: multiplier
6891 * offset 22932
6892 */
6893 scaled_channel<uint8_t, 50, 1> dwellVoltageCorrValues[DWELL_CURVE_SIZE] = {};
6894 /**
6895 * units: %
6896 * offset 22940
6897 */
6898 scaled_channel<uint8_t, 1, 1> tcu_shiftTpsBins[TCU_TABLE_WIDTH] = {};
6899 /**
6900 * units: SPECIAL_CASE_SPEED
6901 * offset 22948
6902 */
6903 uint8_t tcu_shiftSpeed12[TCU_TABLE_WIDTH] = {};
6904 /**
6905 * units: SPECIAL_CASE_SPEED
6906 * offset 22956
6907 */
6908 uint8_t tcu_shiftSpeed23[TCU_TABLE_WIDTH] = {};
6909 /**
6910 * units: SPECIAL_CASE_SPEED
6911 * offset 22964
6912 */
6913 uint8_t tcu_shiftSpeed34[TCU_TABLE_WIDTH] = {};
6914 /**
6915 * units: SPECIAL_CASE_SPEED
6916 * offset 22972
6917 */
6918 uint8_t tcu_shiftSpeed21[TCU_TABLE_WIDTH] = {};
6919 /**
6920 * units: SPECIAL_CASE_SPEED
6921 * offset 22980
6922 */
6923 uint8_t tcu_shiftSpeed32[TCU_TABLE_WIDTH] = {};
6924 /**
6925 * units: SPECIAL_CASE_SPEED
6926 * offset 22988
6927 */
6928 uint8_t tcu_shiftSpeed43[TCU_TABLE_WIDTH] = {};
6929 /**
6930 * units: ms
6931 * offset 22996
6932 */
6933 float tcu_shiftTime;
6934 /**
6935 * units: volts
6936 * offset 23000
6937 */
6938 scaled_channel<int16_t, 10, 1> alternatorVoltageTargetTable[ALTERNATOR_VOLTAGE_TARGET_SIZE][ALTERNATOR_VOLTAGE_RPM_SIZE] = {};
6939 /**
6940 * units: Load
6941 * offset 23032
6942 */
6943 uint16_t alternatorVoltageTargetLoadBins[ALTERNATOR_VOLTAGE_TARGET_SIZE] = {};
6944 /**
6945 * units: RPM
6946 * offset 23040
6947 */
6948 uint16_t alternatorVoltageTargetRpmBins[ALTERNATOR_VOLTAGE_RPM_SIZE] = {};
6949 /**
6950 * units: C
6951 * offset 23048
6952 */
6953 float cltBoostCorrBins[BOOST_CURVE_SIZE] = {};
6954 /**
6955 * units: ratio
6956 * offset 23068
6957 */
6958 float cltBoostCorr[BOOST_CURVE_SIZE] = {};
6959 /**
6960 * units: C
6961 * offset 23088
6962 */
6963 float iatBoostCorrBins[BOOST_CURVE_SIZE] = {};
6964 /**
6965 * units: ratio
6966 * offset 23108
6967 */
6968 float iatBoostCorr[BOOST_CURVE_SIZE] = {};
6969 /**
6970 * units: C
6971 * offset 23128
6972 */
6973 float cltBoostAdderBins[BOOST_CURVE_SIZE] = {};
6974 /**
6975 * offset 23148
6976 */
6977 float cltBoostAdder[BOOST_CURVE_SIZE] = {};
6978 /**
6979 * units: C
6980 * offset 23168
6981 */
6982 float iatBoostAdderBins[BOOST_CURVE_SIZE] = {};
6983 /**
6984 * offset 23188
6985 */
6986 float iatBoostAdder[BOOST_CURVE_SIZE] = {};
6987 /**
6988 * units: RPM
6989 * offset 23208
6990 */
6991 scaled_channel<uint8_t, 1, 100> minimumOilPressureBins[8] = {};
6992 /**
6993 * units: SPECIAL_CASE_PRESSURE
6994 * offset 23216
6995 */
6996 scaled_channel<uint8_t, 1, 10> minimumOilPressureValues[8] = {};
6997 /**
6998 * offset 23224
6999 */
7000 blend_table_s targetAfrBlends[TARGET_AFR_BLEND_COUNT] = {};
7001 /**
7002 * @@DYNO_RPM_STEP_TOOLTIP@@
7003 * units: Rpm
7004 * offset 23600
7005 */
7006 scaled_channel<uint8_t, 1, 1> dynoRpmStep;
7007 /**
7008 * @@DYNO_SAE_TEMPERATURE_C_TOOLTIP@@
7009 * units: C
7010 * offset 23601
7011 */
7012 scaled_channel<int8_t, 1, 1> dynoSaeTemperatureC;
7013 /**
7014 * @@DYNO_SAE_RELATIVE_HUMIDITY_TOOLTIP@@
7015 * units: %
7016 * offset 23602
7017 */
7018 scaled_channel<uint8_t, 1, 1> dynoSaeRelativeHumidity;
7019 /**
7020 * need 4 byte alignment
7021 * units: units
7022 * offset 23603
7023 */
7024 uint8_t alignmentFill_at_23603[1] = {};
7025 /**
7026 * @@DYNO_SAE_BARO_TOOLTIP@@
7027 * units: KPa
7028 * offset 23604
7029 */
7030 scaled_channel<float, 1, 1> dynoSaeBaro;
7031 /**
7032 * @@DYNO_CAR_WHEEL_DIA_INCH_TOOLTIP@@
7033 * units: Inch
7034 * offset 23608
7035 */
7036 scaled_channel<int8_t, 1, 1> dynoCarWheelDiaInch;
7037 /**
7038 * @@DYNO_CAR_WHEEL_ASPECT_RATIO_TOOLTIP@@
7039 * units: Aspect Ratio (height)
7040 * offset 23609
7041 */
7042 scaled_channel<int8_t, 1, 1> dynoCarWheelAspectRatio;
7043 /**
7044 * @@DYNO_CAR_WHEEL_TIRE_WIDTH_TOOLTIP@@
7045 * units: Width mm
7046 * offset 23610
7047 */
7048 scaled_channel<int16_t, 1, 1> dynoCarWheelTireWidthMm;
7049 /**
7050 * @@DYNO_CAR_GEAR_PRIMARY_REDUCTION_TOOLTIP@@
7051 * units: Units
7052 * offset 23612
7053 */
7054 scaled_channel<float, 1, 1> dynoCarGearPrimaryReduction;
7055 /**
7056 * @@DYNO_CAR_GEAR_RATIO_TOOLTIP@@
7057 * units: Units
7058 * offset 23616
7059 */
7060 scaled_channel<float, 1, 1> dynoCarGearRatio;
7061 /**
7062 * @@DYNO_CAR_GEAR_FINAL_DRIVE_TOOLTIP@@
7063 * units: Units
7064 * offset 23620
7065 */
7066 scaled_channel<float, 1, 1> dynoCarGearFinalDrive;
7067 /**
7068 * @@DYNO_CAR_CAR_MASS_TOOLTIP@@
7069 * units: Kg
7070 * offset 23624
7071 */
7072 scaled_channel<int16_t, 1, 1> dynoCarCarMassKg;
7073 /**
7074 * @@DYNO_CAR_CARGO_MASS_TOOLTIP@@
7075 * units: Kg
7076 * offset 23626
7077 */
7078 scaled_channel<int16_t, 1, 1> dynoCarCargoMassKg;
7079 /**
7080 * @@DYNO_CAR_COEFF_OF_DRAG_TOOLTIP@@
7081 * units: Coeff
7082 * offset 23628
7083 */
7084 scaled_channel<float, 1, 1> dynoCarCoeffOfDrag;
7085 /**
7086 * @@DYNO_CAR_FRONTAL_AREA_TOOLTIP@@
7087 * units: m2
7088 * offset 23632
7089 */
7090 scaled_channel<float, 1, 1> dynoCarFrontalAreaM2;
7091 /**
7092 * units: deg
7093 * offset 23636
7094 */
7095 scaled_channel<int8_t, 10, 1> trailingSparkTable[TRAILING_SPARK_SIZE][TRAILING_SPARK_RPM_SIZE] = {};
7096 /**
7097 * units: rpm
7098 * offset 23652
7099 */
7100 scaled_channel<uint8_t, 1, 50> trailingSparkRpmBins[TRAILING_SPARK_RPM_SIZE] = {};
7101 /**
7102 * units: Load
7103 * offset 23656
7104 */
7105 scaled_channel<uint8_t, 1, 5> trailingSparkLoadBins[TRAILING_SPARK_SIZE] = {};
7106 /**
7107 * units: RPM
7108 * offset 23660
7109 */
7110 scaled_channel<uint8_t, 1, 100> maximumOilPressureBins[4] = {};
7111 /**
7112 * units: SPECIAL_CASE_PRESSURE
7113 * offset 23664
7114 */
7115 scaled_channel<uint8_t, 1, 10> maximumOilPressureValues[4] = {};
7116 /**
7117 * Selects the X axis to use for the table.
7118 * offset 23668
7119 */
7121 /**
7122 * How many % of ignition events will be cut
7123 * units: %
7124 * offset 23669
7125 */
7126 int8_t torqueReductionIgnitionCutTable[TORQUE_TABLE_Y_SIZE][TORQUE_TABLE_X_SIZE] = {};
7127 /**
7128 * need 4 byte alignment
7129 * units: units
7130 * offset 23681
7131 */
7132 uint8_t alignmentFill_at_23681[1] = {};
7133 /**
7134 * offset 23682
7135 */
7136 int16_t torqueReductionCutXBins[TORQUE_TABLE_X_SIZE] = {};
7137 /**
7138 * units: gear N°
7139 * offset 23694
7140 */
7141 int8_t torqueReductionCutGearBins[TORQUE_TABLE_Y_SIZE] = {};
7142 /**
7143 * Selects the X axis to use for the table.
7144 * offset 23696
7145 */
7147 /**
7148 * need 4 byte alignment
7149 * units: units
7150 * offset 23697
7151 */
7152 uint8_t alignmentFill_at_23697[3] = {};
7153 /**
7154 * For how long after the pin has been triggered will the cut/reduction stay active. After that, even if the pin is still triggered, torque is re-introduced
7155 * units: ms
7156 * offset 23700
7157 */
7158 float torqueReductionTimeTable[TORQUE_TABLE_Y_SIZE][TORQUE_TABLE_X_SIZE] = {};
7159 /**
7160 * offset 23748
7161 */
7162 int16_t torqueReductionTimeXBins[TORQUE_TABLE_X_SIZE] = {};
7163 /**
7164 * units: gear N°
7165 * offset 23760
7166 */
7167 int8_t torqueReductionTimeGearBins[TORQUE_TABLE_Y_SIZE] = {};
7168 /**
7169 * Selects the X axis to use for the table.
7170 * offset 23762
7171 */
7173 /**
7174 * need 4 byte alignment
7175 * units: units
7176 * offset 23763
7177 */
7178 uint8_t alignmentFill_at_23763[1] = {};
7179 /**
7180 * How many degrees of timing advance will be reduced during the Torque Reduction Time
7181 * units: deg
7182 * offset 23764
7183 */
7184 float torqueReductionIgnitionRetardTable[TORQUE_TABLE_Y_SIZE][TORQUE_TABLE_X_SIZE] = {};
7185 /**
7186 * offset 23812
7187 */
7188 int16_t torqueReductionIgnitionRetardXBins[TORQUE_TABLE_X_SIZE] = {};
7189 /**
7190 * units: gear N°
7191 * offset 23824
7192 */
7193 int8_t torqueReductionIgnitionRetardGearBins[TORQUE_TABLE_Y_SIZE] = {};
7194 /**
7195 * need 4 byte alignment
7196 * units: units
7197 * offset 23826
7198 */
7199 uint8_t alignmentFill_at_23826[2] = {};
7200 /**
7201 offset 23828 bit 0 */
7203 /**
7204 offset 23828 bit 1 */
7205 bool unusedBit_276_1 : 1 {};
7206 /**
7207 offset 23828 bit 2 */
7208 bool unusedBit_276_2 : 1 {};
7209 /**
7210 offset 23828 bit 3 */
7211 bool unusedBit_276_3 : 1 {};
7212 /**
7213 offset 23828 bit 4 */
7214 bool unusedBit_276_4 : 1 {};
7215 /**
7216 offset 23828 bit 5 */
7217 bool unusedBit_276_5 : 1 {};
7218 /**
7219 offset 23828 bit 6 */
7220 bool unusedBit_276_6 : 1 {};
7221 /**
7222 offset 23828 bit 7 */
7223 bool unusedBit_276_7 : 1 {};
7224 /**
7225 offset 23828 bit 8 */
7226 bool unusedBit_276_8 : 1 {};
7227 /**
7228 offset 23828 bit 9 */
7229 bool unusedBit_276_9 : 1 {};
7230 /**
7231 offset 23828 bit 10 */
7232 bool unusedBit_276_10 : 1 {};
7233 /**
7234 offset 23828 bit 11 */
7235 bool unusedBit_276_11 : 1 {};
7236 /**
7237 offset 23828 bit 12 */
7238 bool unusedBit_276_12 : 1 {};
7239 /**
7240 offset 23828 bit 13 */
7241 bool unusedBit_276_13 : 1 {};
7242 /**
7243 offset 23828 bit 14 */
7244 bool unusedBit_276_14 : 1 {};
7245 /**
7246 offset 23828 bit 15 */
7247 bool unusedBit_276_15 : 1 {};
7248 /**
7249 offset 23828 bit 16 */
7250 bool unusedBit_276_16 : 1 {};
7251 /**
7252 offset 23828 bit 17 */
7253 bool unusedBit_276_17 : 1 {};
7254 /**
7255 offset 23828 bit 18 */
7256 bool unusedBit_276_18 : 1 {};
7257 /**
7258 offset 23828 bit 19 */
7259 bool unusedBit_276_19 : 1 {};
7260 /**
7261 offset 23828 bit 20 */
7262 bool unusedBit_276_20 : 1 {};
7263 /**
7264 offset 23828 bit 21 */
7265 bool unusedBit_276_21 : 1 {};
7266 /**
7267 offset 23828 bit 22 */
7268 bool unusedBit_276_22 : 1 {};
7269 /**
7270 offset 23828 bit 23 */
7271 bool unusedBit_276_23 : 1 {};
7272 /**
7273 offset 23828 bit 24 */
7274 bool unusedBit_276_24 : 1 {};
7275 /**
7276 offset 23828 bit 25 */
7277 bool unusedBit_276_25 : 1 {};
7278 /**
7279 offset 23828 bit 26 */
7280 bool unusedBit_276_26 : 1 {};
7281 /**
7282 offset 23828 bit 27 */
7283 bool unusedBit_276_27 : 1 {};
7284 /**
7285 offset 23828 bit 28 */
7286 bool unusedBit_276_28 : 1 {};
7287 /**
7288 offset 23828 bit 29 */
7289 bool unusedBit_276_29 : 1 {};
7290 /**
7291 offset 23828 bit 30 */
7292 bool unusedBit_276_30 : 1 {};
7293 /**
7294 offset 23828 bit 31 */
7295 bool unusedBit_276_31 : 1 {};
7296 /**
7297 * offset 23832
7298 */
7299 uint8_t rainTimingAdjustment[TIMING_ADJUSTMENT_SIZE][TIMING_ADJUSTMENT_SIZE] = {};
7300 /**
7301 * units: RPM
7302 * offset 23848
7303 */
7304 uint16_t rainTimingRpmBins[TIMING_ADJUSTMENT_SIZE] = {};
7305 /**
7306 * units: C
7307 * offset 23856
7308 */
7309 float rainTimingPpsBins[TIMING_ADJUSTMENT_SIZE] = {};
7310};
7311static_assert(sizeof(persistent_config_s) == 23872);
7312
7313// end
7314// this section was generated automatically by rusEFI tool config_definition-all.jar based on (unknown script) integration/rusefi_config.txt
torqueReductionTable torqueReductionTimeTable
engine_type_e
debug_mode_e
trigger_type_e
firing_order_e
ve_override_e
idle_mode_e
MsIoBoxVss
launchActivationMode_e
can_wbo_re_hwidx_e
can_wbo_aem_id_e
InjectorNonlinearMode
boostType_e
MsIoBoxId
tle8888_mode_e
cranking_condition_e
lua_gauge_e
mc33810maxDwellTimer_e
ignition_mode_e
vvt_mode_e
stepper_num_micro_steps_e
gppwm_channel_e
air_pressure_sensor_type_e
can_wbo_type_e
dc_function_e
can_wbo_re_id_e
SentInput
ego_sensor_e
load_override_e
injector_pressure_type_e
SentFuelHighPressureType
injector_compensation_mode_e
SentEtbType
uart_device_e
InjectionTimingMode
nitrous_arming_method_e
can_vss_nbc_e
CanGpioType
spi_device_e
pin_input_mode_e
fuel_pressure_sensor_mode_e
hpfp_cam_e
can_baudrate_e
antiLagActivationMode_e
injection_mode_e
timing_mode_e
can_nbc_e
UiMode
imu_type_e
torqueReductionActivationMode_e
TransmissionControllerMode
pin_output_mode_e
tChargeMode_e
GearControllerMode
accel_enrichment_mode_e
lua_gauge_meaning_e
int16_t pwm_freq_t
uint8_t engineSyncCam_e
char[LUA_SCRIPT_SIZE] lua_script_t
char[VIN_NUMBER_SIZE] vin_number_t
float angle_t
char[VEHICLE_INFO_SIZE] vehicle_info_t
int16_t tps_limit_t
char[GPPWM_NOTE_SIZE] gppwm_note_t
scaled_channel< int16_t, 10, 1 > blendBins[BLEND_FACTOR_SIZE]
scaled_channel< uint8_t, 2, 1 > blendValues[BLEND_FACTOR_SIZE]
scaled_channel< int16_t, 10, 1 > table[BLEND_TABLE_COUNT][BLEND_TABLE_COUNT]
scaled_channel< uint16_t, 100, 1 > gearRatio[TCU_GEAR_COUNT]
uint8_t tractionControlSpeedBins[TRACTION_CONTROL_ETB_DROP_SPEED_SIZE]
int8_t tractionControlTimingDrop[TRACTION_CONTROL_ETB_DROP_SPEED_SIZE][TRACTION_CONTROL_ETB_DROP_SLIP_SIZE]
brain_input_pin_e logicAnalyzerPins[LOGIC_ANALYZER_CHANNEL_COUNT]
scaled_channel< int16_t, 1, 1 > primeBins[PRIME_CURVE_COUNT]
scaled_channel< uint16_t, 100, 1 > tractionControlSlipBins[TRACTION_CONTROL_ETB_DROP_SLIP_SIZE]
scaled_channel< uint8_t, 1, 5 > primeValues[PRIME_CURVE_COUNT]
scaled_channel< uint16_t, 1000, 1 > fordInjectorSmallPulseBreakPoint
int8_t tractionControlIgnitionSkip[TRACTION_CONTROL_ETB_DROP_SPEED_SIZE][TRACTION_CONTROL_ETB_DROP_SLIP_SIZE]
switch_input_pin_e luaDigitalInputPins[LUA_DIGITAL_INPUT_COUNT]
int8_t tractionControlEtbDrop[TRACTION_CONTROL_ETB_DROP_SPEED_SIZE][TRACTION_CONTROL_ETB_DROP_SLIP_SIZE]
brain_input_pin_e triggerInputPins[TRIGGER_INPUT_PIN_COUNT]
pin_output_mode_e triggerSimulatorPinModes[TRIGGER_SIMULATOR_PIN_COUNT]
scaled_channel< int8_t, 2, 1 > gearBasedOpenLoopBoostAdder[TCU_GEAR_COUNT]
pin_input_mode_e luaDigitalInputPinModes[LUA_DIGITAL_INPUT_COUNT]
brain_input_pin_e auxSpeedSensorInputPin[AUX_SPEED_SENSOR_COUNT]
scaled_channel< int8_t, 5, 1 > table[FUEL_TRIM_SIZE][FUEL_TRIM_SIZE]
scaled_channel< uint8_t, 2, 1 > table[GPPWM_LOAD_COUNT][GPPWM_RPM_COUNT]
scaled_channel< int16_t, 2, 1 > loadBins[GPPWM_LOAD_COUNT]
scaled_channel< int8_t, 5, 1 > table[IGN_TRIM_SIZE][IGN_TRIM_SIZE]
scaled_channel< int16_t, 100, 1 > battLagCorrBattBins[VBAT_INJECTOR_CURVE_SIZE]
scaled_channel< uint32_t, 10, 1 > battLagCorrPressBins[VBAT_INJECTOR_CURVE_PRESSURE_SIZE]
scaled_channel< int16_t, 100, 1 > battLagCorrTable[VBAT_INJECTOR_CURVE_PRESSURE_SIZE][VBAT_INJECTOR_CURVE_SIZE]
scaled_channel< uint8_t, 10, 1 > maxRemove
scaled_channel< uint8_t, 10, 1 > deadband
scaled_channel< uint16_t, 1, 1 > timeConstant[STFT_CELL_COUNT]
scaled_channel< uint8_t, 10, 1 > maxAdd
scaled_channel< uint16_t, 10, 1 > injectorFlowLinearizationPressureBins[FLOW_LINEARIZATION_PRESSURE_SIZE]
float cltIdleCorrTable[CLT_IDLE_TABLE_RPM_SIZE][CLT_IDLE_TABLE_CLT_SIZE]
scaled_channel< uint8_t, 2, 1 > hpfpLobeProfileQuantityBins[HPFP_LOBE_PROFILE_SIZE]
scaled_channel< int16_t, 1, 1 > cltIdleRpmBins[CLT_CURVE_SIZE]
scaled_channel< int16_t, 100, 1 > dcWastegateBiasValues[ETB_BIAS_CURVE_LENGTH]
scaled_channel< uint8_t, 1, 10 > iacPidMultRpmBins[IAC_PID_MULT_RPM_SIZE]
scaled_channel< uint8_t, 1, 100 > maximumOilPressureBins[4]
uint16_t afterCrankingIACtaperDuration[CLT_CRANKING_TAPER_CURVE_SIZE]
scaled_channel< uint8_t, 1, 100 > iacCoastingRpmBins[CLT_CURVE_SIZE]
scaled_channel< uint16_t, 10, 1 > hpfpFuelMassCompensationFuelPressure[HPFP_FUEL_MASS_COMPENSATION_SIZE]
float crankingCycleBaseFuel[CRANKING_CYCLE_CLT_SIZE][CRANKING_CURVE_SIZE]
scaled_channel< uint8_t, 10, 1 > dwellVoltageCorrVoltBins[DWELL_CURVE_SIZE]
scaled_channel< uint8_t, 20, 1 > iacPidMultTable[IAC_PID_MULT_SIZE][IAC_PID_MULT_SIZE]
scaled_channel< uint8_t, 100, 1 > wwTauMapValues[WWAE_TABLE_SIZE]
scaled_channel< int16_t, 10, 1 > ALSTimingRetardTable[ALS_SIZE][ALS_RPM_SIZE]
uint8_t injectorStagingTable[INJ_STAGING_COUNT][INJ_STAGING_RPM_SIZE]
scaled_channel< int8_t, 2, 1 > knockBaseNoise[ENGINE_NOISE_CURVE_SIZE]
scaled_channel< uint16_t, 100, 1 > injectorFlowLinearization[FLOW_LINEARIZATION_PRESSURE_SIZE][FLOW_LINEARIZATION_MASS_SIZE]
uint8_t pedalToTpsTable[PEDAL_TO_TPS_SIZE][PEDAL_TO_TPS_RPM_SIZE]
int16_t injectionPhase[INJ_PHASE_LOAD_COUNT][INJ_PHASE_RPM_COUNT]
scaled_channel< int8_t, 10, 1 > throttle2TrimTable[ETB2_TRIM_SIZE][ETB2_TRIM_RPM_SIZE]
scaled_channel< uint8_t, 1, 5 > tcu_pcAirmassBins[TCU_TABLE_WIDTH]
scaled_channel< uint8_t, 1, 50 > trailingSparkRpmBins[TRAILING_SPARK_RPM_SIZE]
scaled_channel< uint8_t, 1, 50 > hpfpCompensationRpmBins[HPFP_COMPENSATION_RPM_SIZE]
scaled_channel< uint16_t, 1000, 1 > hpfpCompensationLoadBins[HPFP_COMPENSATION_SIZE]
float tpsTpsAccelTable[TPS_TPS_ACCEL_TABLE][TPS_TPS_ACCEL_TABLE]
scaled_channel< uint16_t, 10, 1 > throttleEstimateEffectiveAreaValues[THR_EST_SIZE]
scaled_channel< uint16_t, 1000, 1 > fuelLevelBins[FUEL_LEVEL_TABLE_COUNT]
scaled_channel< int16_t, 1, 10 > ALSIgnSkipTable[ALS_SIZE][ALS_RPM_SIZE]
scaled_channel< int16_t, 100, 1 > crankingAdvance[CRANKING_ADVANCE_CURVE_SIZE]
float torqueReductionIgnitionRetardTable[TORQUE_TABLE_Y_SIZE][TORQUE_TABLE_X_SIZE]
uint8_t tcuSolenoidTable[TCU_SOLENOID_COUNT][TCU_GEAR_COUNT]
uint16_t alternatorVoltageTargetLoadBins[ALTERNATOR_VOLTAGE_TARGET_SIZE]
scaled_channel< int16_t, 10, 1 > ALSFuelAdjustment[ALS_SIZE][ALS_RPM_SIZE]
scaled_channel< uint8_t, 1, 10 > minimumOilPressureValues[8]
scaled_channel< int16_t, 10, 1 > ignitionCltCorrTable[CLT_TIMING_LOAD_AXIS_SIZE][CLT_TIMING_TEMP_AXIS_SIZE]
scaled_channel< uint16_t, 10, 1 > throttleEstimateEffectiveAreaBins[THR_EST_SIZE]
scaled_channel< uint8_t, 1, 10 > idleVeRpmBins[IDLE_VE_SIZE_RPM]
scaled_channel< uint8_t, 1, 50 > hpfpTargetRpmBins[HPFP_TARGET_SIZE]
scaled_channel< uint8_t, 1, 5 > trailingSparkLoadBins[TRAILING_SPARK_SIZE]
scaled_channel< uint8_t, 50, 1 > dwellVoltageCorrValues[DWELL_CURVE_SIZE]
scaled_channel< uint8_t, 100, 1 > lambdaMaxDeviationTable[LAM_SIZE][LAM_RPM_SIZE]
scaled_channel< uint8_t, 1, 50 > tpsTspCorrValuesBins[TPS_TPS_ACCEL_CLT_CORR_TABLE]
scaled_channel< uint8_t, 100, 1 > wwBetaMapValues[WWAE_TABLE_SIZE]
scaled_channel< uint16_t, 10, 1 > veTable[VE_LOAD_COUNT][VE_RPM_COUNT]
int8_t hpfpCompensation[HPFP_COMPENSATION_SIZE][HPFP_COMPENSATION_RPM_SIZE]
scaled_channel< uint8_t, 100, 1 > wwBetaCltValues[WWAE_TABLE_SIZE]
scaled_channel< uint16_t, 100, 1 > mapEstimateTpsBins[MAP_EST_LOAD_COUNT]
scaled_channel< uint8_t, 1, 5 > ignitionCltCorrLoadBins[CLT_TIMING_LOAD_AXIS_SIZE]
scaled_channel< int16_t, 1, 1 > ignitionCltCorrTempBins[CLT_TIMING_TEMP_AXIS_SIZE]
scaled_channel< uint16_t, 1000, 1 > hpfpDeadtimeMS[HPFP_DEADTIME_SIZE]
float postCrankingFactor[CRANKING_ENRICH_CLT_COUNT][CRANKING_ENRICH_COUNT]
scaled_channel< uint8_t, 50, 1 > predictiveMapBlendDurationValues[TPS_TPS_ACCEL_CLT_CORR_TABLE]
scaled_channel< uint8_t, 100, 1 > wwTauCltValues[WWAE_TABLE_SIZE]
scaled_channel< uint8_t, 1, 100 > boostRpmBins[BOOST_RPM_COUNT]
float afterCrankingIACtaperDurationBins[CLT_CRANKING_TAPER_CURVE_SIZE]
int8_t vvtTable1[VVT_TABLE_SIZE][VVT_TABLE_RPM_SIZE]
scaled_channel< int16_t, 1, 1 > cltRevLimitRpmBins[CLT_LIMITER_CURVE_SIZE]
scaled_channel< uint8_t, 1, 1 > tcu_shiftTpsBins[TCU_TABLE_WIDTH]
scaled_channel< uint16_t, 10, 1 > ltitTable[CLT_IDLE_TABLE_CLT_SIZE]
scaled_channel< uint8_t, 1, 100 > throttle2TrimRpmBins[ETB2_TRIM_RPM_SIZE]
uint8_t rainTimingAdjustment[TIMING_ADJUSTMENT_SIZE][TIMING_ADJUSTMENT_SIZE]
uint8_t scriptTable4[TABLE_4_LOAD_SIZE][TABLE_4_RPM_SIZE]
scaled_channel< uint8_t, 1, 2 > boostTableClosedLoop[BOOST_LOAD_COUNT][BOOST_RPM_COUNT]
uint16_t hpfpTarget[HPFP_TARGET_SIZE][HPFP_TARGET_SIZE]
scaled_channel< uint8_t, 50, 1 > tpsTspCorrValues[TPS_TPS_ACCEL_CLT_CORR_TABLE]
scaled_channel< uint8_t, 2, 1 > boostTableOpenLoop[BOOST_LOAD_COUNT][BOOST_RPM_COUNT]
scaled_channel< uint8_t, 1, 10 > torqueTable[TORQUE_CURVE_SIZE][TORQUE_CURVE_RPM_SIZE]
scaled_channel< uint8_t, 1, 100 > rpmIdleCorrBins[CLT_IDLE_TABLE_RPM_SIZE]
scaled_channel< uint16_t, 100, 1 > crankingFuelCoefE100[CRANKING_CURVE_SIZE]
scaled_channel< uint8_t, 1, 100 > pedalToTpsRpmBins[PEDAL_TO_TPS_RPM_SIZE]
scaled_channel< uint16_t, 100, 1 > injectorFlowLinearizationFuelMassBins[FLOW_LINEARIZATION_MASS_SIZE]
scaled_channel< uint8_t, 1, 100 > maxKnockRetardRpmBins[KNOCK_TABLE_RPM_SIZE]
scaled_channel< int16_t, 10, 1 > alternatorVoltageTargetTable[ALTERNATOR_VOLTAGE_TARGET_SIZE][ALTERNATOR_VOLTAGE_RPM_SIZE]
scaled_channel< uint8_t, 1, 50 > idleAdvanceBins[IDLE_ADVANCE_CURVE_SIZE]
scaled_channel< int16_t, 10, 1 > ignitionIatCorrTable[IAT_IGN_CORR_LOAD_COUNT][IAT_IGN_CORR_COUNT]
scaled_channel< uint16_t, 10, 1 > idleVeTable[IDLE_VE_SIZE][IDLE_VE_SIZE_RPM]
int8_t vvtTable2[VVT_TABLE_SIZE][VVT_TABLE_RPM_SIZE]
scaled_channel< int8_t, 10, 1 > trailingSparkTable[TRAILING_SPARK_SIZE][TRAILING_SPARK_RPM_SIZE]
float scriptTable2[TABLE_2_LOAD_SIZE][TABLE_2_RPM_SIZE]
scaled_channel< int16_t, 10, 1 > ignitionTable[IGN_LOAD_COUNT][IGN_RPM_COUNT]
scaled_channel< uint8_t, 1, 5 > ignitionIatCorrLoadBins[IAT_IGN_CORR_LOAD_COUNT]
scaled_channel< uint8_t, 2, 1 > iacCoasting[CLT_CURVE_SIZE]
scaled_channel< uint16_t, 100, 1 > hpfpFuelMassCompensationFuelMass[HPFP_FUEL_MASS_COMPENSATION_SIZE]
int8_t torqueReductionIgnitionCutTable[TORQUE_TABLE_Y_SIZE][TORQUE_TABLE_X_SIZE]
uint16_t crankingAdvanceBins[CRANKING_ADVANCE_CURVE_SIZE]
uint8_t scriptTable3[TABLE_3_LOAD_SIZE][TABLE_3_RPM_SIZE]
scaled_channel< uint16_t, 100, 1 > mapEstimateTable[MAP_EST_LOAD_COUNT][MAP_EST_RPM_COUNT]
scaled_channel< uint16_t, 10, 1 > hpfpTargetLoadBins[HPFP_TARGET_SIZE]
scaled_channel< uint8_t, 1, 100 > minimumOilPressureBins[8]
scaled_channel< uint8_t, 1, 20 > cltIdleRpm[CLT_CURVE_SIZE]
scaled_channel< uint8_t, 2, 1 > hpfpLobeProfileAngle[HPFP_LOBE_PROFILE_SIZE]
scaled_channel< uint8_t, 1, 50 > predictiveMapBlendDurationBins[TPS_TPS_ACCEL_CLT_CORR_TABLE]
scaled_channel< uint8_t, 1, 10 > maximumOilPressureValues[4]
scaled_channel< uint16_t, 100, 1 > sparkDwellValues[DWELL_CURVE_SIZE]
scaled_channel< uint8_t, 147, 1 > lambdaTable[FUEL_LOAD_COUNT][FUEL_RPM_COUNT]
scaled_channel< uint8_t, 4, 1 > maxKnockRetardTable[KNOCK_TABLE_SIZE][KNOCK_TABLE_RPM_SIZE]
scaled_channel< uint16_t, 100, 1 > hpfpFuelMassCompensation[HPFP_FUEL_MASS_COMPENSATION_SIZE][HPFP_FUEL_MASS_COMPENSATION_SIZE]
uint16_t alternatorVoltageTargetRpmBins[ALTERNATOR_VOLTAGE_RPM_SIZE]
scaled_channel< uint8_t, 10, 1 > maxAfr
scaled_channel< uint8_t, 10, 1 > minAfr
scaled_channel< uint8_t, 10, 1 > deadband
scaled_channel< uint8_t, 1, 50 > maxIdleRegionRpm
stft_cell_cfg_s cellCfgs[STFT_CELL_COUNT]
scaled_channel< uint8_t, 10, 1 > maximumAfr