rusEFI
The most advanced open source ECU
engine_configuration_generated_structures.h
Go to the documentation of this file.
1 // this section was generated automatically by rusEFI tool config_definition.jar based on (unknown script) integration/rusefi_config.txt Fri Dec 15 21:22:53 UTC 2023
2 // by class com.rusefi.output.CHeaderConsumer
3 // begin
4 #pragma once
5 #include "rusefi_types.h"
6 // start of stft_cell_cfg_s
7 struct stft_cell_cfg_s {
8  /**
9  %
10  * offset 0
11  */
12  int8_t maxAdd;
13  /**
14  %
15  * offset 1
16  */
17  int8_t maxRemove;
18  /**
19  * 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.
20  sec
21  * offset 2
22  */
23  scaled_channel<uint16_t, 10, 1> timeConstant;
24 };
25 static_assert(sizeof(stft_cell_cfg_s) == 4);
26 
27 // start of stft_s
28 struct stft_s {
29  /**
30  * Below this RPM, the idle region is active
31  RPM
32  * offset 0
33  */
34  scaled_channel<uint8_t, 1, 50> maxIdleRegionRpm;
35  /**
36  * Below this engine load, the overrun region is active
37  load
38  * offset 1
39  */
40  uint8_t maxOverrunLoad;
41  /**
42  * Above this engine load, the power region is active
43  load
44  * offset 2
45  */
46  uint8_t minPowerLoad;
47  /**
48  * 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.
49  %
50  * offset 3
51  */
52  scaled_channel<uint8_t, 10, 1> deadband;
53  /**
54  * Below this temperature, correction is disabled.
55  C
56  * offset 4
57  */
58  int8_t minClt;
59  /**
60  * Below this AFR, correction is paused
61  afr
62  * offset 5
63  */
64  scaled_channel<uint8_t, 10, 1> minAfr;
65  /**
66  * Above this AFR, correction is paused
67  afr
68  * offset 6
69  */
70  scaled_channel<uint8_t, 10, 1> maxAfr;
71  /**
72  * Delay after starting the engine before beginning closed loop correction.
73  seconds
74  * offset 7
75  */
76  uint8_t startupDelay;
77  /**
78  * offset 8
79  */
80  stft_cell_cfg_s cellCfgs[STFT_CELL_COUNT];
81 };
82 static_assert(sizeof(stft_s) == 24);
83 
84 // start of pid_s
85 struct pid_s {
86  /**
87  * offset 0
88  */
89  float pFactor;
90  /**
91  * offset 4
92  */
93  float iFactor;
94  /**
95  * offset 8
96  */
97  float dFactor;
98  /**
99  * Linear addition to PID logic
100  * offset 12
101  */
102  int16_t offset;
103  /**
104  * PID dTime
105  ms
106  * offset 14
107  */
108  int16_t periodMs;
109  /**
110  * Output Min Duty Cycle
111  * offset 16
112  */
113  int16_t minValue;
114  /**
115  * Output Max Duty Cycle
116  * offset 18
117  */
118  int16_t maxValue;
119 };
120 static_assert(sizeof(pid_s) == 20);
121 
122 // start of cranking_parameters_s
123 struct cranking_parameters_s {
124  /**
125  * Base mass of the per-cylinder fuel injected during cranking. This is then modified by the multipliers for CLT, IAT, TPS ect, to give the final cranking pulse width.
126  * A reasonable starting point is 60mg per liter per cylinder.
127  * ex: 2 liter 4 cyl = 500cc/cyl, so 30mg cranking fuel.
128  mg
129  * offset 0
130  */
131  float baseFuel;
132  /**
133  * This sets the RPM limit below which the ECU will use cranking fuel and ignition logic, typically this is around 350-450rpm.
134  * set cranking_rpm X
135  RPM
136  * offset 4
137  */
138  int16_t rpm;
139  /**
140  * need 4 byte alignment
141  units
142  * offset 6
143  */
144  uint8_t alignmentFill_at_6[2];
145 };
146 static_assert(sizeof(cranking_parameters_s) == 8);
147 
148 // start of gppwm_channel
149 struct gppwm_channel {
150  /**
151  * Select a pin to use for PWM or on-off output.
152  * offset 0
153  */
155  /**
156  * If an error (with a sensor, etc) is detected, this value is used instead of reading from the table.
157  * This should be a safe value for whatever hardware is connected to prevent damage.
158  %
159  * offset 2
160  */
161  uint8_t dutyIfError;
162  /**
163  * need 4 byte alignment
164  units
165  * offset 3
166  */
167  uint8_t alignmentFill_at_3[1];
168  /**
169  * Select a frequency to run PWM at.
170  * Set this to 0hz to enable on-off mode.
171  hz
172  * offset 4
173  */
174  uint16_t pwmFrequency;
175  /**
176  * Hysteresis: in on-off mode, turn the output on when the table value is above this duty.
177  %
178  * offset 6
179  */
180  uint8_t onAboveDuty;
181  /**
182  * Hysteresis: in on-off mode, turn the output off when the table value is below this duty.
183  %
184  * offset 7
185  */
186  uint8_t offBelowDuty;
187  /**
188  * Selects the Y axis to use for the table.
189  * offset 8
190  */
192  /**
193  * Selects the X axis to use for the table.
194  * offset 9
195  */
197  /**
198  load
199  * offset 10
200  */
201  scaled_channel<int16_t, 2, 1> loadBins[GPPWM_LOAD_COUNT];
202  /**
203  RPM
204  * offset 26
205  */
206  int16_t rpmBins[GPPWM_RPM_COUNT];
207  /**
208  duty
209  * offset 42
210  */
211  scaled_channel<uint8_t, 2, 1> table[GPPWM_LOAD_COUNT][GPPWM_RPM_COUNT];
212  /**
213  * need 4 byte alignment
214  units
215  * offset 106
216  */
217  uint8_t alignmentFill_at_106[2];
218 };
219 static_assert(sizeof(gppwm_channel) == 108);
220 
221 // start of air_pressure_sensor_config_s
223  /**
224  * kPa value at low volts
225  kpa
226  * offset 0
227  */
228  float lowValue;
229  /**
230  * kPa value at high volts
231  kpa
232  * offset 4
233  */
234  float highValue;
235  /**
236  * offset 8
237  */
239  /**
240  * offset 9
241  */
243  /**
244  * need 4 byte alignment
245  units
246  * offset 10
247  */
248  uint8_t alignmentFill_at_10[2];
249 };
250 static_assert(sizeof(air_pressure_sensor_config_s) == 12);
251 
252 // start of MAP_sensor_config_s
253 struct MAP_sensor_config_s {
254  /**
255  * offset 0
256  */
257  float samplingAngleBins[MAP_ANGLE_SIZE];
258  /**
259  * MAP averaging sampling start crank degree angle
260  deg
261  * offset 32
262  */
263  float samplingAngle[MAP_ANGLE_SIZE];
264  /**
265  * offset 64
266  */
267  float samplingWindowBins[MAP_WINDOW_SIZE];
268  /**
269  * MAP averaging angle crank degree duration
270  deg
271  * offset 96
272  */
273  float samplingWindow[MAP_WINDOW_SIZE];
274  /**
275  * offset 128
276  */
278 };
279 static_assert(sizeof(MAP_sensor_config_s) == 140);
280 
281 /**
282  * @brief Thermistor known values
283 
284 */
285 // start of thermistor_conf_s
286 struct thermistor_conf_s {
287  /**
288  * these values are in Celcius
289  *C
290  * offset 0
291  */
292  float tempC_1;
293  /**
294  *C
295  * offset 4
296  */
297  float tempC_2;
298  /**
299  *C
300  * offset 8
301  */
302  float tempC_3;
303  /**
304  Ohm
305  * offset 12
306  */
307  float resistance_1;
308  /**
309  Ohm
310  * offset 16
311  */
312  float resistance_2;
313  /**
314  Ohm
315  * offset 20
316  */
317  float resistance_3;
318  /**
319  * Pull-up resistor value on your board
320  Ohm
321  * offset 24
322  */
323  float bias_resistor;
324 };
325 static_assert(sizeof(thermistor_conf_s) == 28);
326 
327 // start of linear_sensor_s
328 struct linear_sensor_s {
329  /**
330  * offset 0
331  */
333  /**
334  * need 4 byte alignment
335  units
336  * offset 1
337  */
338  uint8_t alignmentFill_at_1[3];
339  /**
340  volts
341  * offset 4
342  */
343  float v1;
344  /**
345  * offset 8
346  */
347  float value1;
348  /**
349  volts
350  * offset 12
351  */
352  float v2;
353  /**
354  * offset 16
355  */
356  float value2;
357 };
358 static_assert(sizeof(linear_sensor_s) == 20);
359 
360 // start of ThermistorConf
361 struct ThermistorConf {
362  /**
363  * offset 0
364  */
366  /**
367  * offset 28
368  */
370  /**
371  * need 4 byte alignment
372  units
373  * offset 29
374  */
375  uint8_t alignmentFill_at_29[3];
376 };
377 static_assert(sizeof(ThermistorConf) == 32);
378 
379 // start of injector_s
380 struct injector_s {
381  /**
382  * This is your injector flow at the fuel pressure used in the vehicle. cc/min, cubic centimetre per minute
383  * By the way, g/s = 0.125997881 * (lb/hr)
384  * g/s = 0.125997881 * (cc/min)/10.5
385  * g/s = 0.0119997981 * cc/min
386  cm3/min
387  * offset 0
388  */
389  float flow;
390  /**
391  volts
392  * offset 4
393  */
394  float battLagCorrBins[VBAT_INJECTOR_CURVE_SIZE];
395  /**
396  * ms delay between injector open and close dead times
397  ms
398  * offset 36
399  */
400  float battLagCorr[VBAT_INJECTOR_CURVE_SIZE];
401 };
402 static_assert(sizeof(injector_s) == 68);
403 
404 // start of trigger_config_s
405 struct trigger_config_s {
406  /**
407  * https://github.com/rusefi/rusefi/wiki/All-Supported-Triggers
408  * set trigger_type X
409  * offset 0
410  */
412  /**
413  number
414  * offset 4
415  */
417  /**
418  number
419  * offset 8
420  */
422 };
423 static_assert(sizeof(trigger_config_s) == 12);
424 
425 // start of afr_sensor_s
426 struct afr_sensor_s {
427  /**
428  * offset 0
429  */
431  /**
432  * offset 1
433  */
435  /**
436  * need 4 byte alignment
437  units
438  * offset 2
439  */
440  uint8_t alignmentFill_at_2[2];
441  /**
442  volts
443  * offset 4
444  */
445  float v1;
446  /**
447  AFR
448  * offset 8
449  */
450  float value1;
451  /**
452  volts
453  * offset 12
454  */
455  float v2;
456  /**
457  AFR
458  * offset 16
459  */
460  float value2;
461 };
462 static_assert(sizeof(afr_sensor_s) == 20);
463 
464 // start of idle_hardware_s
465 struct idle_hardware_s {
466  /**
467  Hz
468  * offset 0
469  */
470  int solenoidFrequency;
471  /**
472  * offset 4
473  */
475  /**
476  * offset 6
477  */
479  /**
480  * offset 8
481  */
483  /**
484  * offset 10
485  */
487  /**
488  * need 4 byte alignment
489  units
490  * offset 11
491  */
492  uint8_t alignmentFill_at_11[1];
493 };
494 static_assert(sizeof(idle_hardware_s) == 12);
495 
496 // start of dc_io
497 struct dc_io {
498  /**
499  * offset 0
500  */
502  /**
503  * offset 2
504  */
506  /**
507  * Acts as EN pin in two-wire mode
508  * offset 4
509  */
511  /**
512  * offset 6
513  */
515 };
516 static_assert(sizeof(dc_io) == 8);
517 
518 // start of vr_threshold_s
519 struct vr_threshold_s {
520  /**
521  rpm
522  * offset 0
523  */
524  scaled_channel<uint8_t, 1, 50> rpmBins[6];
525  /**
526  volts
527  * offset 6
528  */
529  scaled_channel<uint8_t, 100, 1> values[6];
530  /**
531  * offset 12
532  */
533  Gpio pin;
534  /**
535  * need 4 byte alignment
536  units
537  * offset 14
538  */
539  uint8_t alignmentFill_at_14[2];
540 };
541 static_assert(sizeof(vr_threshold_s) == 16);
542 
543 // start of engine_configuration_s
544 struct engine_configuration_s {
545  /**
546  * http://rusefi.com/wiki/index.php?title=Manual:Engine_Type
547  * set engine_type X
548  * offset 0
549  */
551  /**
552  * offset 2
553  */
555  /**
556  * Disable sensor sniffer above this rpm
557  RPM
558  * offset 4
559  */
560  uint16_t sensorSnifferRpmThreshold;
561  /**
562  * A secondary Rev limit engaged by the driver to help launch the vehicle faster
563  rpm
564  * offset 6
565  */
566  uint16_t launchRpm;
567  /**
568  * set rpm_hard_limit X
569  rpm
570  * offset 8
571  */
572  uint16_t rpmHardLimit;
573  /**
574  * Engine sniffer would be disabled above this rpm
575  * set engineSnifferRpmThreshold X
576  RPM
577  * offset 10
578  */
579  uint16_t engineSnifferRpmThreshold;
580  /**
581  * Disable multispark above this engine speed.
582  rpm
583  * offset 12
584  */
585  scaled_channel<uint8_t, 1, 50> multisparkMaxRpm;
586  /**
587  * Above this RPM, disable AC. Set to 0 to disable check.
588  rpm
589  * offset 13
590  */
591  scaled_channel<uint8_t, 1, 50> maxAcRpm;
592  /**
593  * Above this TPS, disable AC. Set to 0 to disable check.
594  %
595  * offset 14
596  */
597  uint8_t maxAcTps;
598  /**
599  * Above this CLT, disable AC to prevent overheating the engine. Set to 0 to disable check.
600  deg C
601  * offset 15
602  */
603  uint8_t maxAcClt;
604  /**
605  RPM
606  * offset 16
607  */
608  uint16_t knockNoiseRpmBins[ENGINE_NOISE_CURVE_SIZE];
609  /**
610  * 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.
611  deg
612  * offset 48
613  */
615  /**
616  * Configures the maximum number of extra sparks to fire (does not include main spark)
617  count
618  * offset 49
619  */
621  /**
622  * need 4 byte alignment
623  units
624  * offset 50
625  */
626  uint8_t alignmentFill_at_50[2];
627  /**
628  * offset 52
629  */
631  /**
632  * Does the vehicle have a turbo or supercharger?
633  offset 120 bit 0 */
634  bool isForcedInduction : 1 {};
635  /**
636  * 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.
637  offset 120 bit 1 */
638  bool useFordRedundantTps : 1 {};
639  /**
640  offset 120 bit 2 */
641  bool enableKline : 1 {};
642  /**
643  offset 120 bit 3 */
644  bool overrideTriggerGaps : 1 {};
645  /**
646  * Turn on this fan when AC is on.
647  offset 120 bit 4 */
648  bool enableFan1WithAc : 1 {};
649  /**
650  * Turn on this fan when AC is on.
651  offset 120 bit 5 */
652  bool enableFan2WithAc : 1 {};
653  /**
654  * Inhibit operation of this fan while the engine is not running.
655  offset 120 bit 6 */
656  bool disableFan1WhenStopped : 1 {};
657  /**
658  * Inhibit operation of this fan while the engine is not running.
659  offset 120 bit 7 */
660  bool disableFan2WhenStopped : 1 {};
661  /**
662  * Enable secondary spark outputs that fire after the primary (rotaries, twin plug engines).
663  offset 120 bit 8 */
664  bool enableTrailingSparks : 1 {};
665  /**
666  * TLE7209 uses two-wire mode. TLE9201 and VNH2SP30 do NOT use two wire mode.
667  offset 120 bit 9 */
668  bool etb_use_two_wires : 1 {};
669  /**
670  * 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.
671  offset 120 bit 10 */
672  bool isDoubleSolenoidIdle : 1 {};
673  /**
674  offset 120 bit 11 */
675  bool useEeprom : 1 {};
676  /**
677  * Switch between Industrial and Cic PID implementation
678  offset 120 bit 12 */
679  bool useCicPidForIdle : 1 {};
680  /**
681  offset 120 bit 13 */
682  bool useTLE8888_cranking_hack : 1 {};
683  /**
684  offset 120 bit 14 */
685  bool kickStartCranking : 1 {};
686  /**
687  * This uses separate ignition timing and VE tables not only for idle conditions, also during the postcranking-to-idle taper transition (See also afterCrankingIACtaperDuration).
688  offset 120 bit 15 */
690  /**
691  offset 120 bit 16 */
692  bool launchControlEnabled : 1 {};
693  /**
694  * "Detect double trigger edges"
695  offset 120 bit 17 */
696  bool doNotFilterTriggerEdgeNoise : 1 {};
697  /**
698  offset 120 bit 18 */
699  bool antiLagEnabled : 1 {};
700  /**
701  * For cranking either use the specified fixed base fuel mass, or use the normal running math (VE table).
702  offset 120 bit 19 */
703  bool useRunningMathForCranking : 1 {};
704  /**
705  * Shall we display real life signal or just the part consumed by trigger decoder.
706  * Applies to both trigger and cam/vvt input.
707  *
708  * enable logic_level_trigger
709  offset 120 bit 20 */
711  /**
712  offset 120 bit 21 */
713  bool useTLE8888_stepper : 1 {};
714  /**
715  offset 120 bit 22 */
717  /**
718  * Print incoming and outgoing first bus CAN messages in rusEFI console
719  offset 120 bit 23 */
720  bool verboseCan : 1 {};
721  /**
722  * Experimental setting that will cause a misfire
723  * DO NOT ENABLE.
724  offset 120 bit 24 */
725  bool artificialTestMisfire : 1 {};
726  /**
727  * 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.
728  offset 120 bit 25 */
729  bool useFordRedundantPps : 1 {};
730  /**
731  offset 120 bit 26 */
732  bool cltSensorPulldown : 1 {};
733  /**
734  offset 120 bit 27 */
735  bool iatSensorPulldown : 1 {};
736  /**
737  offset 120 bit 28 */
738  bool allowIdenticalPps : 1 {};
739  /**
740  offset 120 bit 29 */
741  bool overrideVvtTriggerGaps : 1 {};
742  /**
743  offset 120 bit 30 */
744  bool useSpiImu : 1 {};
745  /**
746  offset 120 bit 31 */
747  bool unused31 : 1 {};
748  /**
749  * Closed throttle, 1 volt = 200 units.
750  * See also tps1_1AdcChannel
751  * set tps_min X
752  ADC
753  * offset 124
754  */
755  int16_t tpsMin;
756  /**
757  * Full throttle.
758  * See also tps1_1AdcChannel
759  * set tps_max X
760  ADC
761  * offset 126
762  */
763  int16_t tpsMax;
764  /**
765  * TPS error detection: what throttle % is unrealistically low?
766  * Also used for accelerator pedal error detection if so equiped.
767  %
768  * offset 128
769  */
770  int16_t tpsErrorDetectionTooLow;
771  /**
772  * TPS error detection: what throttle % is unrealistically high?
773  * Also used for accelerator pedal error detection if so equiped.
774  %
775  * offset 130
776  */
777  int16_t tpsErrorDetectionTooHigh;
778  /**
779  * offset 132
780  */
782  /**
783  * Dwell duration while cranking
784  ms
785  * offset 140
786  */
788  /**
789  * Once engine speed passes this value, start reducing ETB angle.
790  rpm
791  * offset 144
792  */
793  uint16_t etbRevLimitStart;
794  /**
795  * 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.
796  rpm
797  * offset 146
798  */
799  uint16_t etbRevLimitRange;
800  /**
801  * @see isMapAveragingEnabled
802  * offset 148
803  */
805  /**
806  * todo: merge with channel settings, use full-scale Thermistor here!
807  * offset 288
808  */
810  /**
811  * offset 320
812  */
814  /**
815  deg
816  * offset 352
817  */
818  int launchTimingRetard;
819  /**
820  * value '6' for 8MHz hw osc
821  * read hip9011 datasheet for details
822  * todo split into two bit fields
823  integer
824  * offset 356
825  */
827  /**
828  * We calculate knock band based of cylinderBore
829  * Use this to override - kHz knock band override
830  * Requires power cycling to effect
831  kHz
832  * offset 360
833  */
834  float knockBandCustom;
835  /**
836  * Engine displacement in litres
837  L
838  * offset 364
839  */
840  scaled_channel<uint16_t, 1000, 1> displacement;
841  /**
842  RPM
843  * offset 366
844  */
845  uint16_t triggerSimulatorRpm;
846  /**
847  * Number of cylinder the engine has.
848  * offset 368
849  */
850  uint32_t cylindersCount;
851  /**
852  * offset 372
853  */
855  /**
856  * need 4 byte alignment
857  units
858  * offset 373
859  */
860  uint8_t alignmentFill_at_373[3];
861  /**
862  * Cylinder diameter in mm.
863  mm
864  * offset 376
865  */
866  float cylinderBore;
867  /**
868  * This setting controls which fuel quantity control algorithm is used.
869  * Alpha-N means drive by TPS commonly only used for NA engines
870  * Speed Density requires MAP sensor and is the default choice for may installs
871  * MAF air charge is a cylinder filling based method that uses a mass air flow sensor.
872  * offset 380
873  */
875  /**
876  %
877  * offset 381
878  */
879  uint8_t ALSMaxTPS;
880  /**
881  * This is the injection strategy during engine start. See Fuel/Injection settings for more detail. It is suggested to use "Simultaneous".
882  * offset 382
883  */
885  /**
886  * 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.
887  * offset 383
888  */
890  /**
891  * Minimum RPM to enable boost control. Use this to avoid solenoid noise at idle, and help spool in some cases.
892  * offset 384
893  */
894  uint16_t boostControlMinRpm;
895  /**
896  * Minimum TPS to enable boost control. Use this to avoid solenoid noise at idle, and help spool in some cases.
897  * offset 386
898  */
899  uint8_t boostControlMinTps;
900  /**
901  * Minimum MAP to enable boost control. Use this to avoid solenoid noise at idle, and help spool in some cases.
902  * offset 387
903  */
904  uint8_t boostControlMinMap;
905  /**
906  * Ignition advance angle used during engine cranking, 5-10 degrees will work as a base setting for most engines.
907  * There is tapering towards running timing advance
908  * set cranking_timing_angle X
909  deg
910  * offset 388
911  */
913  /**
914  * Single coil = distributor
915  * Individual coils = one coil per cylinder (COP, coil-near-plug), requires sequential mode
916  * Wasted spark = Fires pairs of cylinders together, either one coil per pair of cylinders or one coil per cylinder
917  * Two distributors = A pair of distributors, found on some BMW, Toyota and other engines
918  * set ignition_mode X
919  * offset 392
920  */
922  /**
923  * How many consecutive gap rations have to match expected ranges for sync to happen
924  count
925  * offset 393
926  */
928  /**
929  * Above this speed, disable closed loop idle control. Set to 0 to disable (allow closed loop idle at any speed).
930  kph
931  * offset 394
932  */
933  uint8_t maxIdleVss;
934  /**
935  * need 4 byte alignment
936  units
937  * offset 395
938  */
939  uint8_t alignmentFill_at_395[1];
940  /**
941  * 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.
942  kPa
943  * offset 396
944  */
945  uint16_t minOilPressureAfterStart;
946  /**
947  * Dynamic uses the timing map to decide the ignition timing, Static timing fixes the timing to the value set below (only use for checking static timing with a timing light).
948  * offset 398
949  */
951  /**
952  * need 4 byte alignment
953  units
954  * offset 399
955  */
956  uint8_t alignmentFill_at_399[1];
957  /**
958  * This value is the ignition timing used when in 'fixed timing' mode, i.e. constant timing
959  * This mode is useful when adjusting distributor location.
960  RPM
961  * offset 400
962  */
964  /**
965  * Angle between Top Dead Center (TDC) and the first trigger event.
966  * Positive value in case of synchnization point before TDC and negative in case of synchnization point after TDC
967  * .Knowing this angle allows us to control timing and other angles in reference to TDC.
968  * set global_trigger_offset_angle X
969  deg btdc
970  * offset 404
971  */
973  /**
974  * 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.
975  coef
976  * offset 408
977  */
979  /**
980  * 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.
981  coef
982  * offset 412
983  */
984  float vbattDividerCoeff;
985  /**
986  * Cooling fan turn-on temperature threshold, in Celsius
987  deg C
988  * offset 416
989  */
990  float fanOnTemperature;
991  /**
992  * Cooling fan turn-off temperature threshold, in Celsius
993  deg C
994  * offset 420
995  */
996  float fanOffTemperature;
997  /**
998  * offset 424
999  */
1001  /**
1002  * need 4 byte alignment
1003  units
1004  * offset 426
1005  */
1006  uint8_t alignmentFill_at_426[2];
1007  /**
1008  * 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.
1009  revs/km
1010  * offset 428
1011  */
1012  float driveWheelRevPerKm;
1013  /**
1014  * set can_mode X
1015  * offset 432
1016  */
1018  /**
1019  * need 4 byte alignment
1020  units
1021  * offset 433
1022  */
1023  uint8_t alignmentFill_at_433[3];
1024  /**
1025  * CANbus thread period in ms
1026  ms
1027  * offset 436
1028  */
1029  int canSleepPeriodMs;
1030  /**
1031  * offset 440
1032  */
1033  uint8_t camDecoder2jzPrecision;
1034  /**
1035  * need 4 byte alignment
1036  units
1037  * offset 441
1038  */
1039  uint8_t alignmentFill_at_441[3];
1040  /**
1041  index
1042  * offset 444
1043  */
1044  int byFirmwareVersion;
1045  /**
1046  * First throttle body, first sensor. See also pedalPositionAdcChannel
1047  * offset 448
1048  */
1050  /**
1051  * 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.
1052  * offset 449
1053  */
1055  /**
1056  * 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.
1057  * offset 450
1058  */
1060  /**
1061  * Second throttle body position sensor, single channel so far
1062  * set_analog_input_pin tps2 X
1063  * offset 451
1064  */
1066  /**
1067  * 0.1 is a good default value
1068  x
1069  * offset 452
1070  */
1072  /**
1073  * just a temporary solution
1074  angle
1075  * offset 456
1076  */
1077  int trailingSparkAngle;
1078  /**
1079  * offset 460
1080  */
1082  /**
1083  * Extra air taper amount
1084  %
1085  * offset 472
1086  */
1087  float airByRpmTaper;
1088  /**
1089  * offset 476
1090  */
1092  /**
1093  * 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.
1094  %
1095  * offset 477
1096  */
1097  uint8_t boostControlSafeDutyCycle;
1098  /**
1099  * offset 478
1100  */
1102  /**
1103  * offset 479
1104  */
1105  uint8_t acrRevolutions;
1106  /**
1107  coef
1108  * offset 480
1109  */
1110  float globalFuelCorrection;
1111  /**
1112  volts
1113  * offset 484
1114  */
1115  float adcVcc;
1116  /**
1117  Deg
1118  * offset 488
1119  */
1121  /**
1122  * 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.
1123  * offset 492
1124  */
1125  brain_input_pin_e camInputs[CAM_INPUTS_COUNT];
1126  /**
1127  * offset 500
1128  */
1129  afr_sensor_s afr;
1130  /**
1131  * Electronic throttle pedal position first channel
1132  * See throttlePedalPositionSecondAdcChannel for second channel
1133  * See also tps1_1AdcChannel
1134  * set_analog_input_pin pps X
1135  * See throttlePedalUpVoltage and throttlePedalWOTVoltage
1136  * offset 520
1137  */
1139  /**
1140  * TPS/PPS error threshold
1141  %
1142  * offset 521
1143  */
1144  scaled_channel<uint8_t, 10, 1> etbSplit;
1145  /**
1146  * offset 522
1147  */
1148  Gpio tle6240_cs;
1149  /**
1150  * offset 524
1151  */
1153  /**
1154  * offset 525
1155  */
1157  /**
1158  * Throttle Pedal not pressed switch - used on some older vehicles like early Mazda Miata
1159  * offset 526
1160  */
1162  /**
1163  * @see hasBaroSensor
1164  * offset 528
1165  */
1167  /**
1168  * offset 540
1169  */
1171  /**
1172  * Value between 0 and 100 used in Manual mode
1173  %
1174  * offset 552
1175  */
1176  float manIdlePosition;
1177  /**
1178  * Ignition timing to remove when a knock event occurs.
1179  %
1180  * offset 556
1181  */
1182  scaled_channel<uint8_t, 10, 1> knockRetardAggression;
1183  /**
1184  * After a knock event, reapply timing at this rate.
1185  deg/s
1186  * offset 557
1187  */
1188  scaled_channel<uint8_t, 10, 1> knockRetardReapplyRate;
1189  /**
1190  * Select which cam is used for engine sync. Other cams will be used only for VVT measurement, but not engine sync.
1191  * offset 558
1192  */
1194  /**
1195  * Set this so your vehicle speed signal is responsive, but not noisy. Larger value give smoother but slower response.
1196  * offset 559
1197  */
1198  uint8_t vssFilterReciprocal;
1199  /**
1200  * 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.
1201  ratio
1202  * offset 560
1203  */
1204  scaled_channel<uint16_t, 1000, 1> vssGearRatio;
1205  /**
1206  * 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.
1207  count
1208  * offset 562
1209  */
1210  uint8_t vssToothCount;
1211  /**
1212  * Override the Y axis (load) value used for only the Idle VE table.
1213  * Advanced users only: If you aren't sure you need this, you probably don't need this.
1214  * offset 563
1215  */
1217  /**
1218  * offset 564
1219  */
1220  Gpio l9779_cs;
1221  /**
1222  * offset 566
1223  */
1224  output_pin_e injectionPins[MAX_CYLINDER_COUNT];
1225  /**
1226  * offset 590
1227  */
1228  output_pin_e ignitionPins[MAX_CYLINDER_COUNT];
1229  /**
1230  * offset 614
1231  */
1233  /**
1234  * offset 615
1235  */
1237  /**
1238  * offset 616
1239  */
1241  /**
1242  * offset 618
1243  */
1245  /**
1246  * How many consecutive VVT gap rations have to match expected ranges for sync to happen
1247  count
1248  * offset 619
1249  */
1251  /**
1252  * Check engine light, also malfunction indicator light. Always blinks once on boot.
1253  * offset 620
1254  */
1256  /**
1257  * offset 622
1258  */
1260  /**
1261  * offset 623
1262  */
1264  /**
1265  * offset 624
1266  */
1268  /**
1269  * Some cars have a switch to indicate that clutch pedal is all the way down
1270  * offset 626
1271  */
1273  /**
1274  * offset 628
1275  */
1277  /**
1278  * offset 630
1279  */
1281  /**
1282  * offset 631
1283  */
1285  /**
1286  * offset 632
1287  */
1288  Gpio digitalPotentiometerChipSelect[DIGIPOT_COUNT];
1289  /**
1290  * offset 640
1291  */
1293  /**
1294  * offset 641
1295  */
1297  /**
1298  * offset 642
1299  */
1301  /**
1302  * Digital Potentiometer is used by stock ECU stimulation code
1303  * offset 644
1304  */
1306  /**
1307  * need 4 byte alignment
1308  units
1309  * offset 645
1310  */
1311  uint8_t alignmentFill_at_645[1];
1312  /**
1313  * offset 646
1314  */
1315  Gpio mc33972_cs;
1316  /**
1317  * offset 648
1318  */
1320  /**
1321  * Useful in Research&Development phase
1322  * offset 649
1323  */
1325  /**
1326  * First throttle body, second sensor.
1327  * offset 650
1328  */
1330  /**
1331  * Second throttle body, second sensor.
1332  * offset 651
1333  */
1335  /**
1336  * Electronic throttle pedal position input
1337  * Second channel
1338  * See also tps1_1AdcChannel
1339  * See throttlePedalSecondaryUpVoltage and throttlePedalSecondaryWOTVoltage
1340  * offset 652
1341  */
1343  /**
1344  %
1345  * offset 653
1346  */
1347  uint8_t fuelLevelValues[FUEL_LEVEL_TABLE_COUNT];
1348  /**
1349  * AFR, WBO, EGO - whatever you like to call it
1350  * offset 661
1351  */
1353  /**
1354  * offset 662
1355  */
1356  Gpio mc33810_cs[C_MC33810_COUNT];
1357  /**
1358  * 0.1 is a good default value
1359  x
1360  * offset 664
1361  */
1362  float idle_antiwindupFreq;
1363  /**
1364  * offset 668
1365  */
1366  brain_input_pin_e triggerInputPins[TRIGGER_INPUT_PIN_COUNT];
1367  /**
1368  * 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.
1369  us
1370  * offset 672
1371  */
1372  uint16_t mc33_t_min_boost;
1373  /**
1374  * offset 674
1375  */
1377  /**
1378  * need 4 byte alignment
1379  units
1380  * offset 675
1381  */
1382  uint8_t alignmentFill_at_675[1];
1383  /**
1384  * offset 676
1385  */
1387  /**
1388  * offset 678
1389  */
1391  /**
1392  * need 4 byte alignment
1393  units
1394  * offset 679
1395  */
1396  uint8_t alignmentFill_at_679[1];
1397  /**
1398  * offset 680
1399  */
1401  /**
1402  * offset 682
1403  */
1404  Gpio sdCardCsPin;
1405  /**
1406  * set_can_tx_pin X
1407  * offset 684
1408  */
1409  Gpio canTxPin;
1410  /**
1411  * set_can_rx_pin X
1412  * offset 686
1413  */
1414  Gpio canRxPin;
1415  /**
1416  * offset 688
1417  */
1419  /**
1420  * Additional idle % while A/C is active
1421  %
1422  * offset 689
1423  */
1424  uint8_t acIdleExtraOffset;
1425  /**
1426  * Ratio between the wheels and your transmission output.
1427  ratio
1428  * offset 690
1429  */
1430  scaled_channel<uint16_t, 100, 1> finalGearRatio;
1431  /**
1432  * offset 692
1433  */
1435  /**
1436  * offset 694
1437  */
1438  uint8_t tcuInputSpeedSensorTeeth;
1439  /**
1440  * need 4 byte alignment
1441  units
1442  * offset 695
1443  */
1444  uint8_t alignmentFill_at_695[1];
1445  /**
1446  * Voltage when the wastegate is closed.
1447  * You probably don't have one of these!
1448  mv
1449  * offset 696
1450  */
1451  uint16_t wastegatePositionMin;
1452  /**
1453  * Voltage when the wastegate is fully open.
1454  * You probably don't have one of these!
1455  * 1 volt = 1000 units
1456  mv
1457  * offset 698
1458  */
1459  uint16_t wastegatePositionMax;
1460  /**
1461  * Voltage when the idle valve is closed.
1462  * You probably don't have one of these!
1463  mv
1464  * offset 700
1465  */
1466  uint16_t idlePositionMin;
1467  /**
1468  * Voltage when the idle valve is open.
1469  * You probably don't have one of these!
1470  * 1 volt = 1000 units
1471  mv
1472  * offset 702
1473  */
1474  uint16_t idlePositionMax;
1475  /**
1476  * Secondary TTL channel baud rate
1477  BPs
1478  * offset 704
1479  */
1480  uint32_t tunerStudioSerialSpeed;
1481  /**
1482  * Just for reference really, not taken into account by any logic at this point
1483  CR
1484  * offset 708
1485  */
1486  float compressionRatio;
1487  /**
1488  * 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.
1489  * See also directSelfStimulation which is different.
1490  * offset 712
1491  */
1492  Gpio triggerSimulatorPins[TRIGGER_SIMULATOR_PIN_COUNT];
1493  /**
1494  g/s
1495  * offset 716
1496  */
1497  scaled_channel<uint16_t, 1000, 1> fordInjectorSmallPulseSlope;
1498  /**
1499  * offset 718
1500  */
1501  pin_output_mode_e triggerSimulatorPinModes[TRIGGER_SIMULATOR_PIN_COUNT];
1502  /**
1503  * offset 720
1504  */
1506  /**
1507  * need 4 byte alignment
1508  units
1509  * offset 721
1510  */
1511  uint8_t alignmentFill_at_721[1];
1512  /**
1513  * On-off O2 sensor heater control. 'ON' if engine is running, 'OFF' if stopped or cranking.
1514  * offset 722
1515  */
1517  /**
1518  * offset 724
1519  */
1521  /**
1522  RPM
1523  * offset 725
1524  */
1525  scaled_channel<uint8_t, 1, 100> lambdaProtectionMinRpm;
1526  /**
1527  %
1528  * offset 726
1529  */
1530  scaled_channel<uint8_t, 1, 10> lambdaProtectionMinLoad;
1531  /**
1532  * need 4 byte alignment
1533  units
1534  * offset 727
1535  */
1536  uint8_t alignmentFill_at_727[1];
1537  /**
1538  offset 728 bit 0 */
1539  bool is_enabled_spi_1 : 1 {};
1540  /**
1541  offset 728 bit 1 */
1542  bool is_enabled_spi_2 : 1 {};
1543  /**
1544  offset 728 bit 2 */
1545  bool is_enabled_spi_3 : 1 {};
1546  /**
1547  * enable sd/disable sd
1548  offset 728 bit 3 */
1549  bool isSdCardEnabled : 1 {};
1550  /**
1551  * Use 11 bit (standard) or 29 bit (extended) IDs for rusEFI verbose CAN format.
1552  offset 728 bit 4 */
1553  bool rusefiVerbose29b : 1 {};
1554  /**
1555  offset 728 bit 5 */
1556  bool rethrowHardFault : 1 {};
1557  /**
1558  offset 728 bit 6 */
1559  bool isHip9011Enabled : 1 {};
1560  /**
1561  offset 728 bit 7 */
1562  bool requireFootOnBrakeToCrank : 1 {};
1563  /**
1564  offset 728 bit 8 */
1565  bool verboseQuad : 1 {};
1566  /**
1567  * This setting should only be used if you have a stepper motor idle valve and a stepper motor driver installed.
1568  offset 728 bit 9 */
1569  bool useStepperIdle : 1 {};
1570  /**
1571  offset 728 bit 10 */
1572  bool enabledStep1Limiter : 1 {};
1573  /**
1574  offset 728 bit 11 */
1575  bool useTpicAdvancedMode : 1 {};
1576  /**
1577  offset 728 bit 12 */
1578  bool lambdaProtectionEnable : 1 {};
1579  /**
1580  offset 728 bit 13 */
1581  bool verboseTLE8888 : 1 {};
1582  /**
1583  * CAN broadcast using custom rusEFI protocol
1584  * enable can_broadcast/disable can_broadcast
1585  offset 728 bit 14 */
1586  bool enableVerboseCanTx : 1 {};
1587  /**
1588  offset 728 bit 15 */
1589  bool etb1configured : 1 {};
1590  /**
1591  offset 728 bit 16 */
1592  bool etb2configured : 1 {};
1593  /**
1594  * Useful for individual intakes
1595  offset 728 bit 17 */
1596  bool measureMapOnlyInOneCylinder : 1 {};
1597  /**
1598  offset 728 bit 18 */
1599  bool stepperForceParkingEveryRestart : 1 {};
1600  /**
1601  * 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.
1602  offset 728 bit 19 */
1603  bool isFasterEngineSpinUpEnabled : 1 {};
1604  /**
1605  * This setting disables fuel injection while the engine is in overrun, this is useful as a fuel saving measure and to prevent back firing.
1606  offset 728 bit 20 */
1607  bool coastingFuelCutEnabled : 1 {};
1608  /**
1609  * 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.
1610  offset 728 bit 21 */
1611  bool useIacTableForCoasting : 1 {};
1612  /**
1613  offset 728 bit 22 */
1614  bool useNoiselessTriggerDecoder : 1 {};
1615  /**
1616  offset 728 bit 23 */
1617  bool useIdleTimingPidControl : 1 {};
1618  /**
1619  * 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.
1620  offset 728 bit 24 */
1621  bool disableEtbWhenEngineStopped : 1 {};
1622  /**
1623  offset 728 bit 25 */
1624  bool is_enabled_spi_4 : 1 {};
1625  /**
1626  * Disable the electronic throttle motor and DC idle motor for testing.
1627  * This mode is for testing ETB/DC idle position sensors, etc without actually driving the throttle.
1628  offset 728 bit 26 */
1629  bool pauseEtbControl : 1 {};
1630  /**
1631  offset 728 bit 27 */
1632  bool alignEngineSnifferAtTDC : 1 {};
1633  /**
1634  offset 728 bit 28 */
1635  bool verboseKLine : 1 {};
1636  /**
1637  offset 728 bit 29 */
1638  bool idleIncrementalPidCic : 1 {};
1639  /**
1640  * AEM X-Series or rusEFI Wideband
1641  offset 728 bit 30 */
1642  bool enableAemXSeries : 1 {};
1643  /**
1644  offset 728 bit 31 */
1645  bool unusedBit_226_31 : 1 {};
1646  /**
1647  * offset 732
1648  */
1649  brain_input_pin_e logicAnalyzerPins[LOGIC_ANALYZER_CHANNEL_COUNT];
1650  /**
1651  * offset 740
1652  */
1654  /**
1655  * need 4 byte alignment
1656  units
1657  * offset 741
1658  */
1659  uint8_t alignmentFill_at_741[1];
1660  /**
1661  * offset 742
1662  */
1664  /**
1665  * offset 744
1666  */
1668  /**
1669  * offset 746
1670  */
1672  /**
1673  * need 4 byte alignment
1674  units
1675  * offset 747
1676  */
1677  uint8_t alignmentFill_at_747[1];
1678  /**
1679  * offset 748
1680  */
1681  uint32_t verboseCanBaseAddress;
1682  /**
1683  * Boost Voltage
1684  v
1685  * offset 752
1686  */
1687  uint8_t mc33_hvolt;
1688  /**
1689  * Minimum MAP before closed loop boost is enabled. Use to prevent misbehavior upon entering boost.
1690  kPa
1691  * offset 753
1692  */
1693  uint8_t minimumBoostClosedLoopMap;
1694  /**
1695  * Optional Radiator Fan used with A/C
1696  * offset 754
1697  */
1699  /**
1700  * offset 756
1701  */
1703  /**
1704  * offset 757
1705  */
1707  /**
1708  volts
1709  * offset 758
1710  */
1711  scaled_channel<uint8_t, 10, 1> dwellVoltageCorrVoltBins[DWELL_CURVE_SIZE];
1712  /**
1713  * offset 766
1714  */
1716  /**
1717  multiplier
1718  * offset 767
1719  */
1720  scaled_channel<uint8_t, 50, 1> dwellVoltageCorrValues[DWELL_CURVE_SIZE];
1721  /**
1722  * need 4 byte alignment
1723  units
1724  * offset 775
1725  */
1726  uint8_t alignmentFill_at_775[1];
1727  /**
1728  kg
1729  * offset 776
1730  */
1731  uint16_t vehicleWeight;
1732  /**
1733  * How far above idle speed do we consider idling, i.e. coasting detection threshold.
1734  * For example, if target = 800, this param = 200, then anything below 1000 RPM is considered idle.
1735  RPM
1736  * offset 778
1737  */
1738  int16_t idlePidRpmUpperLimit;
1739  /**
1740  * Apply nonlinearity correction below a pulse of this duration. Pulses longer than this duration will receive no adjustment.
1741  ms
1742  * offset 780
1743  */
1744  scaled_channel<uint16_t, 1000, 1> applyNonlinearBelowPulse;
1745  /**
1746  * offset 782
1747  */
1749  /**
1750  * offset 784
1751  */
1753  /**
1754  * offset 786
1755  */
1757  /**
1758  * Some vehicles have a switch to indicate that clutch pedal is all the way up
1759  * offset 788
1760  */
1762  /**
1763  * offset 790
1764  */
1766  /**
1767  * offset 791
1768  */
1770  /**
1771  * offset 792
1772  */
1773  Gpio max31855_cs[EGT_CHANNEL_COUNT];
1774  /**
1775  * Continental/GM flex fuel sensor, 50-150hz type
1776  * offset 808
1777  */
1779  /**
1780  * offset 810
1781  */
1782  Gpio test557pin;
1783  /**
1784  * offset 812
1785  */
1787  /**
1788  * offset 813
1789  */
1791  /**
1792  * Stoichiometric ratio for your secondary fuel. This value is used when the Flex Fuel sensor indicates E100, typically 9.0
1793  :1
1794  * offset 814
1795  */
1796  scaled_channel<uint8_t, 10, 1> stoichRatioSecondary;
1797  /**
1798  * Maximum allowed ETB position. Some throttles go past fully open, so this allows you to limit it to fully open.
1799  %
1800  * offset 815
1801  */
1802  uint8_t etbMaximumPosition;
1803  /**
1804  * Rate the ECU will log to the SD card, in hz (log lines per second).
1805  hz
1806  * offset 816
1807  */
1808  uint16_t sdCardLogFrequency;
1809  /**
1810  * offset 818
1811  */
1813  /**
1814  * need 4 byte alignment
1815  units
1816  * offset 819
1817  */
1818  uint8_t alignmentFill_at_819[1];
1819  /**
1820  * offset 820
1821  */
1823  /**
1824  * offset 822
1825  */
1827  /**
1828  * On some vehicles we can disable starter once engine is already running
1829  * offset 824
1830  */
1832  /**
1833  * need 4 byte alignment
1834  units
1835  * offset 825
1836  */
1837  uint8_t alignmentFill_at_825[1];
1838  /**
1839  * Some Subaru and some Mazda use double-solenoid idle air valve
1840  * offset 826
1841  */
1843  /**
1844  * See also starterControlPin
1845  * offset 828
1846  */
1848  /**
1849  * need 4 byte alignment
1850  units
1851  * offset 830
1852  */
1853  uint8_t alignmentFill_at_830[2];
1854  /**
1855  * 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.
1856  count
1857  * offset 832
1858  */
1859  int mapMinBufferLength;
1860  /**
1861  * 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%.
1862  %
1863  * offset 836
1864  */
1866  /**
1867  %
1868  * offset 838
1869  */
1870  int16_t stepperParkingExtraSteps;
1871  /**
1872  ADC
1873  * offset 840
1874  */
1875  uint16_t tps1SecondaryMin;
1876  /**
1877  ADC
1878  * offset 842
1879  */
1880  uint16_t tps1SecondaryMax;
1881  /**
1882  rpm
1883  * offset 844
1884  */
1885  int16_t antiLagRpmTreshold;
1886  /**
1887  * Maximum time to crank starter when start/stop button is pressed
1888  Seconds
1889  * offset 846
1890  */
1891  uint16_t startCrankingDuration;
1892  /**
1893  * This pin is used for debugging - snap a logic analyzer on it and see if it's ever high
1894  * offset 848
1895  */
1897  /**
1898  * offset 850
1899  */
1901  /**
1902  * need 4 byte alignment
1903  units
1904  * offset 851
1905  */
1906  uint8_t alignmentFill_at_851[1];
1907  /**
1908  * offset 852
1909  */
1911  /**
1912  %
1913  * offset 854
1914  */
1915  uint8_t lambdaProtectionMinTps;
1916  /**
1917  * Only respond once lambda is out of range for this period of time. Use to avoid transients triggering lambda protection when not needed
1918  s
1919  * offset 855
1920  */
1921  scaled_channel<uint8_t, 10, 1> lambdaProtectionTimeout;
1922  /**
1923  RPM
1924  * offset 856
1925  */
1926  scaled_channel<uint8_t, 1, 100> lambdaProtectionRestoreRpm;
1927  /**
1928  * offset 857
1929  */
1931  /**
1932  * need 4 byte alignment
1933  units
1934  * offset 858
1935  */
1936  uint8_t alignmentFill_at_858[2];
1937  /**
1938  * offset 860
1939  */
1940  script_setting_t scriptSetting[SCRIPT_SETTING_COUNT];
1941  /**
1942  * offset 892
1943  */
1944  Gpio spi1mosiPin;
1945  /**
1946  * offset 894
1947  */
1948  Gpio spi1misoPin;
1949  /**
1950  * offset 896
1951  */
1952  Gpio spi1sckPin;
1953  /**
1954  * offset 898
1955  */
1956  Gpio spi2mosiPin;
1957  /**
1958  * offset 900
1959  */
1960  Gpio spi2misoPin;
1961  /**
1962  * offset 902
1963  */
1964  Gpio spi2sckPin;
1965  /**
1966  * offset 904
1967  */
1968  Gpio spi3mosiPin;
1969  /**
1970  * offset 906
1971  */
1972  Gpio spi3misoPin;
1973  /**
1974  * offset 908
1975  */
1976  Gpio spi3sckPin;
1977  /**
1978  * Saab Combustion Detection Module knock signal input pin
1979  * also known as Saab Ion Sensing Module
1980  * offset 910
1981  */
1982  Gpio cdmInputPin;
1983  /**
1984  * offset 912
1985  */
1987  /**
1988  * rusEFI console Sensor Sniffer mode
1989  * offset 913
1990  */
1992  /**
1993  * offset 914
1994  */
1996  /**
1997  * need 4 byte alignment
1998  units
1999  * offset 915
2000  */
2001  uint8_t alignmentFill_at_915[1];
2002  /**
2003  offset 916 bit 0 */
2004  bool clutchUpPinInverted : 1 {};
2005  /**
2006  offset 916 bit 1 */
2007  bool clutchDownPinInverted : 1 {};
2008  /**
2009  * If enabled we use two H-bridges to drive stepper idle air valve
2010  offset 916 bit 2 */
2011  bool useHbridgesToDriveIdleStepper : 1 {};
2012  /**
2013  offset 916 bit 3 */
2014  bool multisparkEnable : 1 {};
2015  /**
2016  offset 916 bit 4 */
2017  bool enableLaunchRetard : 1 {};
2018  /**
2019  offset 916 bit 5 */
2020  bool canInputBCM : 1 {};
2021  /**
2022  * This property is useful if using rusEFI as TCM or BCM only
2023  offset 916 bit 6 */
2024  bool consumeObdSensors : 1 {};
2025  /**
2026  * Read VSS from OEM CAN bus according to selected CAN vehicle configuration.
2027  offset 916 bit 7 */
2028  bool enableCanVss : 1 {};
2029  /**
2030  offset 916 bit 8 */
2031  bool enableInnovateLC2 : 1 {};
2032  /**
2033  offset 916 bit 9 */
2034  bool showHumanReadableWarning : 1 {};
2035  /**
2036  * 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. Use of this mode is required if you have a narrowband O2 sensor.
2037  offset 916 bit 10 */
2038  bool stftIgnoreErrorMagnitude : 1 {};
2039  /**
2040  offset 916 bit 11 */
2041  bool vvtBooleanForVerySpecialCases : 1 {};
2042  /**
2043  offset 916 bit 12 */
2044  bool enableSoftwareKnock : 1 {};
2045  /**
2046  * Verbose info in console below engineSnifferRpmThreshold
2047  * enable vvt_details
2048  offset 916 bit 13 */
2049  bool verboseVVTDecoding : 1 {};
2050  /**
2051  * get invertCamVVTSignal
2052  offset 916 bit 14 */
2053  bool invertCamVVTSignal : 1 {};
2054  /**
2055  * In Alpha-N mode, compensate for air temperature.
2056  offset 916 bit 15 */
2057  bool alphaNUseIat : 1 {};
2058  /**
2059  offset 916 bit 16 */
2060  bool knockBankCyl1 : 1 {};
2061  /**
2062  offset 916 bit 17 */
2063  bool knockBankCyl2 : 1 {};
2064  /**
2065  offset 916 bit 18 */
2066  bool knockBankCyl3 : 1 {};
2067  /**
2068  offset 916 bit 19 */
2069  bool knockBankCyl4 : 1 {};
2070  /**
2071  offset 916 bit 20 */
2072  bool knockBankCyl5 : 1 {};
2073  /**
2074  offset 916 bit 21 */
2075  bool knockBankCyl6 : 1 {};
2076  /**
2077  offset 916 bit 22 */
2078  bool knockBankCyl7 : 1 {};
2079  /**
2080  offset 916 bit 23 */
2081  bool knockBankCyl8 : 1 {};
2082  /**
2083  offset 916 bit 24 */
2084  bool knockBankCyl9 : 1 {};
2085  /**
2086  offset 916 bit 25 */
2087  bool knockBankCyl10 : 1 {};
2088  /**
2089  offset 916 bit 26 */
2090  bool knockBankCyl11 : 1 {};
2091  /**
2092  offset 916 bit 27 */
2093  bool knockBankCyl12 : 1 {};
2094  /**
2095  offset 916 bit 28 */
2096  bool tcuEnabled : 1 {};
2097  /**
2098  offset 916 bit 29 */
2099  bool canBroadcastUseChannelTwo : 1 {};
2100  /**
2101  * If enabled we use four Push-Pull outputs to directly drive stepper idle air valve coilss
2102  offset 916 bit 30 */
2103  bool useRawOutputToDriveIdleStepper : 1 {};
2104  /**
2105  * Print incoming and outgoing second bus CAN messages in rusEFI console
2106  offset 916 bit 31 */
2107  bool verboseCan2 : 1 {};
2108  /**
2109  * offset 920
2110  */
2111  dc_io etbIo[ETB_COUNT];
2112  /**
2113  * Wastegate control Solenoid
2114  * offset 936
2115  */
2117  /**
2118  * offset 938
2119  */
2121  /**
2122  * need 4 byte alignment
2123  units
2124  * offset 939
2125  */
2126  uint8_t alignmentFill_at_939[1];
2127  /**
2128  * offset 940
2129  */
2131  /**
2132  * offset 942
2133  */
2135  /**
2136  * offset 944
2137  */
2138  pid_s boostPid;
2139  /**
2140  * offset 964
2141  */
2143  /**
2144  * offset 965
2145  */
2147  /**
2148  * offset 966
2149  */
2151  /**
2152  Hz
2153  * offset 968
2154  */
2155  int boostPwmFrequency;
2156  /**
2157  * offset 972
2158  */
2160  /**
2161  * offset 973
2162  */
2164  /**
2165  * need 4 byte alignment
2166  units
2167  * offset 974
2168  */
2169  uint8_t alignmentFill_at_974[2];
2170  /**
2171  * Launch disabled above this speed if setting is above zero
2172  Kph
2173  * offset 976
2174  */
2176  /**
2177  * Range from Launch RPM for Timing Retard to activate
2178  RPM
2179  * offset 980
2180  */
2182  /**
2183  * Extra Fuel Added
2184  %
2185  * offset 984
2186  */
2187  int launchFuelAdded;
2188  /**
2189  * Duty Cycle for the Boost Solenoid
2190  %
2191  * offset 988
2192  */
2193  int launchBoostDuty;
2194  /**
2195  * Range from Launch RPM to activate Hard Cut
2196  RPM
2197  * offset 992
2198  */
2199  int hardCutRpmRange;
2200  /**
2201  * offset 996
2202  */
2203  float turbochargerFilter;
2204  /**
2205  * offset 1000
2206  */
2207  int launchTpsThreshold;
2208  /**
2209  * offset 1004
2210  */
2211  float launchActivateDelay;
2212  /**
2213  * offset 1008
2214  */
2215  stft_s stft;
2216  /**
2217  * offset 1032
2218  */
2219  dc_io stepperDcIo[DC_PER_STEPPER];
2220  /**
2221  * For example, BMW, GM or Chevrolet
2222  * REQUIRED for rusEFI Online
2223  * offset 1048
2224  */
2226  /**
2227  * For example, LS1 or NB2
2228  * REQUIRED for rusEFI Online
2229  * offset 1080
2230  */
2232  /**
2233  * For example, Hunchback or Orange Miata
2234  * Vehicle name has to be unique between your vehicles.
2235  * REQUIRED for rusEFI Online
2236  * offset 1112
2237  */
2239  /**
2240  * offset 1144
2241  */
2242  output_pin_e tcu_solenoid[TCU_SOLENOID_COUNT];
2243  /**
2244  * offset 1156
2245  */
2246  dc_function_e etbFunctions[ETB_COUNT];
2247  /**
2248  * offset 1158
2249  */
2251  /**
2252  * need 4 byte alignment
2253  units
2254  * offset 1159
2255  */
2256  uint8_t alignmentFill_at_1159[1];
2257  /**
2258  * offset 1160
2259  */
2260  Gpio drv8860_cs;
2261  /**
2262  * offset 1162
2263  */
2265  /**
2266  * need 4 byte alignment
2267  units
2268  * offset 1163
2269  */
2270  uint8_t alignmentFill_at_1163[1];
2271  /**
2272  * offset 1164
2273  */
2275  /**
2276  volt
2277  * offset 1166
2278  */
2279  scaled_channel<uint16_t, 1000, 1> fuelLevelBins[FUEL_LEVEL_TABLE_COUNT];
2280  /**
2281  * offset 1182
2282  */
2283  output_pin_e luaOutputPins[LUA_PWM_COUNT];
2284  /**
2285  * need 4 byte alignment
2286  units
2287  * offset 1198
2288  */
2289  uint8_t alignmentFill_at_1198[2];
2290  /**
2291  * Angle between cam sensor and VVT zero position
2292  * set vvt_offset X
2293  value
2294  * offset 1200
2295  */
2296  float vvtOffsets[CAM_INPUTS_COUNT];
2297  /**
2298  * offset 1216
2299  */
2300  vr_threshold_s vrThreshold[VR_THRESHOLD_COUNT];
2301  /**
2302  * offset 1248
2303  */
2304  gppwm_note_t gpPwmNote[GPPWM_CHANNELS];
2305  /**
2306  ADC
2307  * offset 1312
2308  */
2309  uint16_t tps2SecondaryMin;
2310  /**
2311  ADC
2312  * offset 1314
2313  */
2314  uint16_t tps2SecondaryMax;
2315  /**
2316  * Select which bus the wideband controller is attached to.
2317  offset 1316 bit 0 */
2318  bool widebandOnSecondBus : 1 {};
2319  /**
2320  * Enables lambda sensor closed loop feedback for fuelling.
2321  offset 1316 bit 1 */
2322  bool fuelClosedLoopCorrectionEnabled : 1 {};
2323  /**
2324  offset 1316 bit 2 */
2325  bool oddFireEngine : 1 {};
2326  /**
2327  offset 1316 bit 3 */
2328  bool boardUseTachPullUp : 1 {};
2329  /**
2330  offset 1316 bit 4 */
2331  bool boardUseTempPullUp : 1 {};
2332  /**
2333  offset 1316 bit 5 */
2334  bool yesUnderstandLocking : 1 {};
2335  /**
2336  * Sometimes we have a performance issue while printing error
2337  offset 1316 bit 6 */
2338  bool silentTriggerError : 1 {};
2339  /**
2340  offset 1316 bit 7 */
2341  bool useLinearCltSensor : 1 {};
2342  /**
2343  * enable can_read/disable can_read
2344  offset 1316 bit 8 */
2345  bool canReadEnabled : 1 {};
2346  /**
2347  * enable can_write/disable can_write. See also can1ListenMode
2348  offset 1316 bit 9 */
2349  bool canWriteEnabled : 1 {};
2350  /**
2351  offset 1316 bit 10 */
2352  bool useLinearIatSensor : 1 {};
2353  /**
2354  offset 1316 bit 11 */
2355  bool boardUse2stepPullDown : 1 {};
2356  /**
2357  * Treat milliseconds value as duty cycle value, i.e. 0.5ms would become 50%
2358  offset 1316 bit 12 */
2359  bool tachPulseDurationAsDutyCycle : 1 {};
2360  /**
2361  * This enables smart alternator control and activates the extra alternator settings.
2362  offset 1316 bit 13 */
2363  bool isAlternatorControlEnabled : 1 {};
2364  /**
2365  * https://wiki.rusefi.com/Trigger-Configuration-Guide
2366  * This setting flips the signal from the primary engine speed sensor.
2367  offset 1316 bit 14 */
2368  bool invertPrimaryTriggerSignal : 1 {};
2369  /**
2370  * https://wiki.rusefi.com/Trigger-Configuration-Guide
2371  * This setting flips the signal from the secondary engine speed sensor.
2372  offset 1316 bit 15 */
2373  bool invertSecondaryTriggerSignal : 1 {};
2374  /**
2375  offset 1316 bit 16 */
2376  bool cutFuelOnHardLimit : 1 {};
2377  /**
2378  * Be careful enabling this: some engines are known to self-disassemble their valvetrain with a spark cut. Fuel cut is much safer.
2379  offset 1316 bit 17 */
2380  bool cutSparkOnHardLimit : 1 {};
2381  /**
2382  offset 1316 bit 18 */
2383  bool launchFuelCutEnable : 1 {};
2384  /**
2385  * This is the Cut Mode normally used
2386  offset 1316 bit 19 */
2387  bool launchSparkCutEnable : 1 {};
2388  /**
2389  offset 1316 bit 20 */
2390  bool boardUseCrankPullUp : 1 {};
2391  /**
2392  offset 1316 bit 21 */
2393  bool boardUseCamPullDown : 1 {};
2394  /**
2395  offset 1316 bit 22 */
2396  bool boardUseCamVrPullUp : 1 {};
2397  /**
2398  offset 1316 bit 23 */
2399  bool boardUseD2PullDown : 1 {};
2400  /**
2401  offset 1316 bit 24 */
2402  bool boardUseD3PullDown : 1 {};
2403  /**
2404  offset 1316 bit 25 */
2405  bool boardUseD4PullDown : 1 {};
2406  /**
2407  offset 1316 bit 26 */
2408  bool boardUseD5PullDown : 1 {};
2409  /**
2410  * Are you a developer troubleshooting TS over CAN ISO/TP?
2411  offset 1316 bit 27 */
2412  bool verboseIsoTp : 1 {};
2413  /**
2414  offset 1316 bit 28 */
2415  bool engineSnifferFocusOnInputs : 1 {};
2416  /**
2417  offset 1316 bit 29 */
2418  bool launchActivateInverted : 1 {};
2419  /**
2420  offset 1316 bit 30 */
2421  bool twoStroke : 1 {};
2422  /**
2423  * Where is your primary skipped wheel located?
2424  offset 1316 bit 31 */
2425  bool skippedWheelOnCam : 1 {};
2426  /**
2427  * offset 1320
2428  */
2430  /**
2431  * need 4 byte alignment
2432  units
2433  * offset 1321
2434  */
2435  uint8_t alignmentFill_at_1321[1];
2436  /**
2437  * A/C button input
2438  * offset 1322
2439  */
2441  /**
2442  * offset 1324
2443  */
2445  /**
2446  * Expected neutral position
2447  %
2448  * offset 1325
2449  */
2450  uint8_t etbNeutralPosition;
2451  /**
2452  * See also idleRpmPid
2453  * offset 1326
2454  */
2456  /**
2457  * need 4 byte alignment
2458  units
2459  * offset 1327
2460  */
2461  uint8_t alignmentFill_at_1327[1];
2462  /**
2463  offset 1328 bit 0 */
2464  bool isInjectionEnabled : 1 {};
2465  /**
2466  offset 1328 bit 1 */
2467  bool isIgnitionEnabled : 1 {};
2468  /**
2469  * When enabled if TPS is held above 95% no fuel is injected while cranking to clear excess fuel from the cylinders.
2470  offset 1328 bit 2 */
2471  bool isCylinderCleanupEnabled : 1 {};
2472  /**
2473  * Should we use tables to vary tau/beta based on CLT/MAP, or just with fixed values?
2474  offset 1328 bit 3 */
2475  bool complexWallModel : 1 {};
2476  /**
2477  * RPM is measured based on last 720 degrees while instant RPM is measured based on the last 90 degrees of crank revolution
2478  offset 1328 bit 4 */
2479  bool alwaysInstantRpm : 1 {};
2480  /**
2481  offset 1328 bit 5 */
2482  bool isMapAveragingEnabled : 1 {};
2483  /**
2484  * If enabled, use separate temperature multiplier table for cranking idle position.
2485  * If disabled, use normal running multiplier table applied to the cranking base position.
2486  offset 1328 bit 6 */
2487  bool overrideCrankingIacSetting : 1 {};
2488  /**
2489  * 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 retard at low idle speeds will prevent stalling and extra advance at high idle speeds can help reduce engine power and slow the idle speed.
2490  offset 1328 bit 7 */
2491  bool useSeparateAdvanceForIdle : 1 {};
2492  /**
2493  offset 1328 bit 8 */
2494  bool isWaveAnalyzerEnabled : 1 {};
2495  /**
2496  * This activates a separate fuel table for Idle, this allows fine tuning of the idle fuelling.
2497  offset 1328 bit 9 */
2498  bool useSeparateVeForIdle : 1 {};
2499  /**
2500  * Verbose info in console below engineSnifferRpmThreshold
2501  * enable trigger_details
2502  offset 1328 bit 10 */
2503  bool verboseTriggerSynchDetails : 1 {};
2504  /**
2505  * Usually if we have no trigger events that means engine is stopped
2506  * Unless we are troubleshooting and spinning the engine by hand - this case a longer
2507  * delay is needed
2508  offset 1328 bit 11 */
2509  bool isManualSpinningMode : 1 {};
2510  /**
2511  offset 1328 bit 12 */
2512  bool cutFuelInAcr : 1 {};
2513  /**
2514  offset 1328 bit 13 */
2515  bool hondaK : 1 {};
2516  /**
2517  * This is needed if your coils are individually wired (COP) and you wish to use batch ignition (Wasted Spark).
2518  offset 1328 bit 14 */
2519  bool twoWireBatchIgnition : 1 {};
2520  /**
2521  offset 1328 bit 15 */
2522  bool useFixedBaroCorrFromMap : 1 {};
2523  /**
2524  * In Constant mode, timing is automatically tapered to running as RPM increases.
2525  * In Table mode, the "Cranking ignition advance" table is used directly.
2526  offset 1328 bit 16 */
2527  bool useSeparateAdvanceForCranking : 1 {};
2528  /**
2529  * This enables the various ignition corrections during cranking (IAT, CLT, FSIO and PID idle).
2530  * You probably don't need this.
2531  offset 1328 bit 17 */
2533  /**
2534  * Enable a second cranking table to use for E100 flex fuel, interpolating between the two based on flex fuel sensor.
2535  offset 1328 bit 18 */
2536  bool flexCranking : 1 {};
2537  /**
2538  * This flag allows to use a special 'PID Multiplier' table (0.0-1.0) to compensate for nonlinear nature of IAC-RPM controller
2539  offset 1328 bit 19 */
2540  bool useIacPidMultTable : 1 {};
2541  /**
2542  offset 1328 bit 20 */
2543  bool isBoostControlEnabled : 1 {};
2544  /**
2545  * Interpolates the Ignition Retard from 0 to 100% within the RPM Range
2546  offset 1328 bit 21 */
2547  bool launchSmoothRetard : 1 {};
2548  /**
2549  * Some engines are OK running semi-random sequential while other engine require phase synchronization
2550  offset 1328 bit 22 */
2551  bool isPhaseSyncRequiredForIgnition : 1 {};
2552  /**
2553  * If enabled, use a curve for RPM limit (based on coolant temperature) instead of a constant value.
2554  offset 1328 bit 23 */
2555  bool useCltBasedRpmLimit : 1 {};
2556  /**
2557  * If enabled, don't wait for engine start to heat O2 sensors. WARNING: this will reduce the life of your sensor, as condensation in the exhaust from a cold start can crack the sensing element.
2558  offset 1328 bit 24 */
2559  bool forceO2Heating : 1 {};
2560  /**
2561  * 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'.
2562  offset 1328 bit 25 */
2563  bool invertVvtControlIntake : 1 {};
2564  /**
2565  * 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'.
2566  offset 1328 bit 26 */
2567  bool invertVvtControlExhaust : 1 {};
2568  /**
2569  offset 1328 bit 27 */
2570  bool useBiQuadOnAuxSpeedSensors : 1 {};
2571  /**
2572  * '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.
2573  offset 1328 bit 28 */
2574  bool sdTriggerLog : 1 {};
2575  /**
2576  offset 1328 bit 29 */
2577  bool ALSActivateInverted : 1 {};
2578  /**
2579  offset 1328 bit 30 */
2580  bool stepper_dc_use_two_wires : 1 {};
2581  /**
2582  offset 1328 bit 31 */
2583  bool watchOutForLinearTime : 1 {};
2584  /**
2585  count
2586  * offset 1332
2587  */
2588  uint32_t engineChartSize;
2589  /**
2590  mult
2591  * offset 1336
2592  */
2594  /**
2595  * offset 1340
2596  */
2597  Gpio camInputsDebug[CAM_INPUTS_COUNT];
2598  /**
2599  * Idle target speed when A/C is enabled. Some cars need the extra speed to keep the AC efficient while idling.
2600  RPM
2601  * offset 1348
2602  */
2603  int16_t acIdleRpmTarget;
2604  /**
2605  * set warningPeriod X
2606  seconds
2607  * offset 1350
2608  */
2609  int16_t warningPeriod;
2610  /**
2611  angle
2612  * offset 1352
2613  */
2615  /**
2616  angle
2617  * offset 1356
2618  */
2620  /**
2621  ms
2622  * offset 1360
2623  */
2625  /**
2626  count
2627  * offset 1364
2628  */
2630  /**
2631  * TODO: finish this #413
2632  sec
2633  * offset 1368
2634  */
2636  /**
2637  * At what trigger index should some MAP-related math be executed? This is a performance trick to reduce load on synchronization trigger callback.
2638  index
2639  * offset 1372
2640  */
2642  /**
2643  * Duration in ms or duty cycle depending on selected mode
2644  * offset 1376
2645  */
2646  float tachPulseDuractionMs;
2647  /**
2648  * Length of time the deposited wall fuel takes to dissipate after the start of acceleration.
2649  Seconds
2650  * offset 1380
2651  */
2652  float wwaeTau;
2653  /**
2654  * offset 1384
2655  */
2657  /**
2658  * offset 1404
2659  */
2660  pid_s etb;
2661  /**
2662  * offset 1424
2663  */
2664  Gpio triggerInputDebugPins[TRIGGER_INPUT_PIN_COUNT];
2665  /**
2666  * RPM range above upper limit for extra air taper
2667  RPM
2668  * offset 1428
2669  */
2670  int16_t airTaperRpmRange;
2671  /**
2672  * offset 1430
2673  */
2675  /**
2676  * Closed throttle#2. todo: extract these two fields into a structure
2677  * See also tps2_1AdcChannel
2678  * set tps2_min X
2679  ADC
2680  * offset 1432
2681  */
2682  int16_t tps2Min;
2683  /**
2684  * Full throttle#2. tpsMax value as 10 bit ADC value. Not Voltage!
2685  * See also tps1_1AdcChannel
2686  * set tps2_max X
2687  ADC
2688  * offset 1434
2689  */
2690  int16_t tps2Max;
2691  /**
2692  * See also startStopButtonPin
2693  * offset 1436
2694  */
2696  /**
2697  * offset 1438
2698  */
2700  /**
2701  * need 4 byte alignment
2702  units
2703  * offset 1439
2704  */
2705  uint8_t alignmentFill_at_1439[1];
2706  /**
2707  * offset 1440
2708  */
2710  /**
2711  Pulse
2712  * offset 1442
2713  */
2714  uint8_t tachPulsePerRev;
2715  /**
2716  * need 4 byte alignment
2717  units
2718  * offset 1443
2719  */
2720  uint8_t alignmentFill_at_1443[1];
2721  /**
2722  * kPa value which is too low to be true
2723  kPa
2724  * offset 1444
2725  */
2727  /**
2728  * kPa value which is too high to be true
2729  kPa
2730  * offset 1448
2731  */
2733  /**
2734  * How long to wait for the spark to fire before recharging the coil for another spark.
2735  ms
2736  * offset 1452
2737  */
2738  scaled_channel<uint16_t, 1000, 1> multisparkSparkDuration;
2739  /**
2740  * This sets the dwell time for subsequent sparks. The main spark's dwell is set by the dwell table.
2741  ms
2742  * offset 1454
2743  */
2744  scaled_channel<uint16_t, 1000, 1> multisparkDwell;
2745  /**
2746  * See cltIdleRpmBins
2747  * offset 1456
2748  */
2749  pid_s idleRpmPid;
2750  /**
2751  * 0 = No fuel settling on port walls 1 = All the fuel settling on port walls setting this to 0 disables the wall wetting enrichment.
2752  Fraction
2753  * offset 1476
2754  */
2755  float wwaeBeta;
2756  /**
2757  * See also EFI_CONSOLE_RX_BRAIN_PIN
2758  * offset 1480
2759  */
2761  /**
2762  * offset 1482
2763  */
2765  /**
2766  * offset 1484
2767  */
2768  Gpio auxValves[AUX_DIGITAL_VALVE_COUNT];
2769  /**
2770  * offset 1488
2771  */
2773  /**
2774  * offset 1490
2775  */
2777  /**
2778  voltage
2779  * offset 1492
2780  */
2781  float throttlePedalUpVoltage;
2782  /**
2783  * Pedal in the floor
2784  voltage
2785  * offset 1496
2786  */
2788  /**
2789  * on IGN voltage detection turn fuel pump on to build fuel pressure
2790  seconds
2791  * offset 1500
2792  */
2793  int16_t startUpFuelPumpDuration;
2794  /**
2795  * If the RPM closer to target than this value, disable closed loop idle correction to prevent oscillation
2796  RPM
2797  * offset 1502
2798  */
2799  int16_t idlePidRpmDeadZone;
2800  /**
2801  * This is the target battery voltage the alternator PID control will attempt to maintain
2802  Volts
2803  * offset 1504
2804  */
2805  float targetVBatt;
2806  /**
2807  * offset 1508
2808  */
2809  uint32_t unused1372;
2810  /**
2811  * 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.
2812  cycles
2813  * offset 1512
2814  */
2816  /**
2817  * IAC Value added when coasting and transitioning into idle.
2818  percent
2819  * offset 1514
2820  */
2821  int16_t iacByTpsTaper;
2822  /**
2823  * Auxiliary sensor serial, not to be confused with secondary calibration serial
2824  * offset 1516
2825  */
2827  /**
2828  * Auxiliary sensor serial, not to be confused with secondary calibration serial
2829  * offset 1518
2830  */
2832  /**
2833  * offset 1520
2834  */
2836  /**
2837  * How long to look back for TPS-based acceleration enrichment. Increasing this time will trigger enrichment for longer when a throttle position change occurs.
2838  sec
2839  * offset 1522
2840  */
2841  scaled_channel<uint8_t, 20, 1> tpsAccelLookback;
2842  /**
2843  * Below this speed, disable DFCO. Use this to prevent jerkiness from fuel enable/disable in low gears.
2844  kph
2845  * offset 1523
2846  */
2847  uint8_t coastingFuelCutVssLow;
2848  /**
2849  * Above this speed, allow DFCO. Use this to prevent jerkiness from fuel enable/disable in low gears.
2850  kph
2851  * offset 1524
2852  */
2853  uint8_t coastingFuelCutVssHigh;
2854  /**
2855  * 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.
2856  sec
2857  * offset 1525
2858  */
2859  scaled_channel<uint8_t, 10, 1> noFuelTrimAfterDfcoTime;
2860  /**
2861  * need 4 byte alignment
2862  units
2863  * offset 1526
2864  */
2865  uint8_t alignmentFill_at_1526[2];
2866  /**
2867  * 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.
2868  roc
2869  * offset 1528
2870  */
2872  /**
2873  * offset 1532
2874  */
2875  brain_input_pin_e auxSpeedSensorInputPin[AUX_SPEED_SENSOR_COUNT];
2876  /**
2877  * offset 1536
2878  */
2879  uint8_t totalGearsCount;
2880  /**
2881  * Sets what part of injection's is controlled by the injection phase table.
2882  * offset 1537
2883  */
2885  /**
2886  * See http://rusefi.com/s/debugmode
2887  * offset 1538
2888  */
2890  /**
2891  * Additional idle % when fan #1 is active
2892  %
2893  * offset 1539
2894  */
2895  uint8_t fan1ExtraIdle;
2896  /**
2897  * Band rate for primary TTL
2898  BPs
2899  * offset 1540
2900  */
2901  uint32_t uartConsoleSerialSpeed;
2902  /**
2903  * For decel we simply multiply delta of TPS and tFor decel we do not use table?!
2904  roc
2905  * offset 1544
2906  */
2908  /**
2909  * Magic multiplier, we multiply delta of TPS and get fuel squirt duration
2910  coeff
2911  * offset 1548
2912  */
2914  /**
2915  BPs
2916  * offset 1552
2917  */
2918  uint32_t auxSerialSpeed;
2919  /**
2920  voltage
2921  * offset 1556
2922  */
2924  /**
2925  * Pedal in the floor
2926  voltage
2927  * offset 1560
2928  */
2930  /**
2931  * set can_baudrate
2932  * offset 1564
2933  */
2935  /**
2936  * Override the Y axis (load) value used for the VE table.
2937  * Advanced users only: If you aren't sure you need this, you probably don't need this.
2938  * offset 1565
2939  */
2941  /**
2942  * offset 1566
2943  */
2945  /**
2946  * Override the Y axis (load) value used for the AFR table.
2947  * Advanced users only: If you aren't sure you need this, you probably don't need this.
2948  * offset 1567
2949  */
2951  /**
2952  A
2953  * offset 1568
2954  */
2955  scaled_channel<uint8_t, 10, 1> mc33_hpfp_i_peak;
2956  /**
2957  A
2958  * offset 1569
2959  */
2960  scaled_channel<uint8_t, 10, 1> mc33_hpfp_i_hold;
2961  /**
2962  * How long to deactivate power when hold current is reached before applying power again
2963  us
2964  * offset 1570
2965  */
2966  uint8_t mc33_hpfp_i_hold_off;
2967  /**
2968  * Maximum amount of time the solenoid can be active before assuming a programming error
2969  ms
2970  * offset 1571
2971  */
2972  uint8_t mc33_hpfp_max_hold;
2973  /**
2974  * Enable if DC-motor driver (H-bridge) inverts the signals (eg. RZ7899 on Hellen boards)
2975  offset 1572 bit 0 */
2976  bool stepperDcInvertedPins : 1 {};
2977  /**
2978  * Allow OpenBLT on Primary CAN
2979  offset 1572 bit 1 */
2980  bool canOpenBLT : 1 {};
2981  /**
2982  * Allow OpenBLT on Secondary CAN
2983  offset 1572 bit 2 */
2984  bool can2OpenBLT : 1 {};
2985  /**
2986  * Select whether to configure injector flow in volumetric flow (defualt, cc/min) or mass flow (g/s).
2987  offset 1572 bit 3 */
2988  bool injectorFlowAsMassFlow : 1 {};
2989  /**
2990  offset 1572 bit 4 */
2991  bool boardUseCanTerminator : 1 {};
2992  /**
2993  offset 1572 bit 5 */
2994  bool kLineDoHondaSend : 1 {};
2995  /**
2996  * ListenMode is about acknowledging CAN traffic on the protocol level. Different from canWriteEnabled
2997  offset 1572 bit 6 */
2998  bool can1ListenMode : 1 {};
2999  /**
3000  offset 1572 bit 7 */
3001  bool can2ListenMode : 1 {};
3002  /**
3003  offset 1572 bit 8 */
3004  bool unusedBit_528_8 : 1 {};
3005  /**
3006  offset 1572 bit 9 */
3007  bool unusedBit_528_9 : 1 {};
3008  /**
3009  offset 1572 bit 10 */
3010  bool unusedBit_528_10 : 1 {};
3011  /**
3012  offset 1572 bit 11 */
3013  bool unusedBit_528_11 : 1 {};
3014  /**
3015  offset 1572 bit 12 */
3016  bool unusedBit_528_12 : 1 {};
3017  /**
3018  offset 1572 bit 13 */
3019  bool unusedBit_528_13 : 1 {};
3020  /**
3021  offset 1572 bit 14 */
3022  bool unusedBit_528_14 : 1 {};
3023  /**
3024  offset 1572 bit 15 */
3025  bool unusedBit_528_15 : 1 {};
3026  /**
3027  offset 1572 bit 16 */
3028  bool unusedBit_528_16 : 1 {};
3029  /**
3030  offset 1572 bit 17 */
3031  bool unusedBit_528_17 : 1 {};
3032  /**
3033  offset 1572 bit 18 */
3034  bool unusedBit_528_18 : 1 {};
3035  /**
3036  offset 1572 bit 19 */
3037  bool unusedBit_528_19 : 1 {};
3038  /**
3039  offset 1572 bit 20 */
3040  bool unusedBit_528_20 : 1 {};
3041  /**
3042  offset 1572 bit 21 */
3043  bool unusedBit_528_21 : 1 {};
3044  /**
3045  offset 1572 bit 22 */
3046  bool unusedBit_528_22 : 1 {};
3047  /**
3048  offset 1572 bit 23 */
3049  bool unusedBit_528_23 : 1 {};
3050  /**
3051  offset 1572 bit 24 */
3052  bool unusedBit_528_24 : 1 {};
3053  /**
3054  offset 1572 bit 25 */
3055  bool unusedBit_528_25 : 1 {};
3056  /**
3057  offset 1572 bit 26 */
3058  bool unusedBit_528_26 : 1 {};
3059  /**
3060  offset 1572 bit 27 */
3061  bool unusedBit_528_27 : 1 {};
3062  /**
3063  offset 1572 bit 28 */
3064  bool unusedBit_528_28 : 1 {};
3065  /**
3066  offset 1572 bit 29 */
3067  bool unusedBit_528_29 : 1 {};
3068  /**
3069  offset 1572 bit 30 */
3070  bool unusedBit_528_30 : 1 {};
3071  /**
3072  offset 1572 bit 31 */
3073  bool unusedBit_528_31 : 1 {};
3074  /**
3075  * offset 1576
3076  */
3077  uint8_t camDecoder2jzPosition;
3078  /**
3079  * need 4 byte alignment
3080  units
3081  * offset 1577
3082  */
3083  uint8_t alignmentFill_at_1577[1];
3084  /**
3085  * Duration of each test pulse
3086  ms
3087  * offset 1578
3088  */
3089  scaled_channel<uint16_t, 100, 1> benchTestOnTime;
3090  /**
3091  %
3092  * offset 1580
3093  */
3095  /**
3096  %
3097  * offset 1581
3098  */
3099  scaled_channel<uint8_t, 1, 10> lambdaProtectionRestoreLoad;
3100  /**
3101  * offset 1582
3102  */
3104  /**
3105  * need 4 byte alignment
3106  units
3107  * offset 1583
3108  */
3109  uint8_t alignmentFill_at_1583[1];
3110  /**
3111  * set_can2_tx_pin X
3112  * offset 1584
3113  */
3114  Gpio can2TxPin;
3115  /**
3116  * set_can2_rx_pin X
3117  * offset 1586
3118  */
3119  Gpio can2RxPin;
3120  /**
3121  * offset 1588
3122  */
3124  /**
3125  * offset 1589
3126  */
3128  /**
3129  * Override the Y axis (load) value used for the ignition table.
3130  * Advanced users only: If you aren't sure you need this, you probably don't need this.
3131  * offset 1590
3132  */
3134  /**
3135  * Select which fuel pressure sensor measures the pressure of the fuel at your injectors.
3136  * offset 1591
3137  */
3139  /**
3140  * offset 1592
3141  */
3143  /**
3144  * offset 1594
3145  */
3147  /**
3148  * need 4 byte alignment
3149  units
3150  * offset 1595
3151  */
3152  uint8_t alignmentFill_at_1595[1];
3153  /**
3154  * MAP value above which fuel is cut in case of overboost.
3155  * Set to 0 to disable overboost cut.
3156  kPa (absolute)
3157  * offset 1596
3158  */
3159  float boostCutPressure;
3160  /**
3161  kg/h
3162  * offset 1600
3163  */
3164  scaled_channel<uint8_t, 1, 5> tchargeBins[16];
3165  /**
3166  ratio
3167  * offset 1616
3168  */
3169  scaled_channel<uint8_t, 100, 1> tchargeValues[16];
3170  /**
3171  * Fixed timing, useful for TDC testing
3172  deg
3173  * offset 1632
3174  */
3175  float fixedTiming;
3176  /**
3177  * MAP voltage for low point
3178  v
3179  * offset 1636
3180  */
3181  float mapLowValueVoltage;
3182  /**
3183  * MAP voltage for low point
3184  v
3185  * offset 1640
3186  */
3187  float mapHighValueVoltage;
3188  /**
3189  * EGO value correction
3190  value
3191  * offset 1644
3192  */
3193  float egoValueShift;
3194  /**
3195  * VVT output solenoid pin for this cam
3196  * offset 1648
3197  */
3198  output_pin_e vvtPins[CAM_INPUTS_COUNT];
3199  /**
3200  * offset 1656
3201  */
3203  /**
3204  * need 4 byte alignment
3205  units
3206  * offset 1657
3207  */
3208  uint8_t alignmentFill_at_1657[3];
3209  /**
3210  * This is the IAC position during cranking, some engines start better if given more air during cranking to improve cylinder filling.
3211  percent
3212  * offset 1660
3213  */
3214  int crankingIACposition;
3215  /**
3216  * offset 1664
3217  */
3218  float tChargeMinRpmMinTps;
3219  /**
3220  * offset 1668
3221  */
3222  float tChargeMinRpmMaxTps;
3223  /**
3224  * offset 1672
3225  */
3226  float tChargeMaxRpmMinTps;
3227  /**
3228  * offset 1676
3229  */
3230  float tChargeMaxRpmMaxTps;
3231  /**
3232  * offset 1680
3233  */
3235  /**
3236  * 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.
3237  deg BTDC
3238  * offset 1682
3239  */
3240  int8_t minimumIgnitionTiming;
3241  /**
3242  * 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
3243  deg BTDC
3244  * offset 1683
3245  */
3246  int8_t maximumIgnitionTiming;
3247  /**
3248  Hz
3249  * offset 1684
3250  */
3252  /**
3253  * set vvt_mode X
3254  * offset 1688
3255  */
3256  vvt_mode_e vvtMode[CAMS_PER_BANK];
3257  /**
3258  * Additional idle % when fan #2 is active
3259  %
3260  * offset 1690
3261  */
3262  uint8_t fan2ExtraIdle;
3263  /**
3264  * Delay to allow fuel pressure to build before firing the priming pulse.
3265  sec
3266  * offset 1691
3267  */
3268  scaled_channel<uint8_t, 100, 1> primingDelay;
3269  /**
3270  * offset 1692
3271  */
3272  adc_channel_e auxAnalogInputs[LUA_ANALOG_INPUT_COUNT];
3273  /**
3274  * offset 1700
3275  */
3276  output_pin_e trailingCoilPins[MAX_CYLINDER_COUNT];
3277  /**
3278  * offset 1724
3279  */
3281  /**
3282  * offset 1725
3283  */
3285  /**
3286  * None = I have a MAP-referenced fuel pressure regulator
3287  * Fixed rail pressure = I have an atmosphere-referenced fuel pressure regulator (returnless, typically)
3288  * Sensed rail pressure = I have a fuel pressure sensor
3289  * offset 1726
3290  */
3292  /**
3293  * offset 1727
3294  */
3296  /**
3297  * This is the pressure at which your injector flow is known.
3298  * For example if your injectors flow 400cc/min at 3.5 bar, enter 350kpa here.
3299  kPa
3300  * offset 1728
3301  */
3302  float fuelReferencePressure;
3303  /**
3304  mult
3305  * offset 1732
3306  */
3307  float postCrankingFactor[CRANKING_ENRICH_COUNT][CRANKING_ENRICH_COUNT];
3308  /**
3309  count
3310  * offset 1876
3311  */
3312  float postCrankingDurationBins[CRANKING_ENRICH_COUNT];
3313  /**
3314  C
3315  * offset 1900
3316  */
3317  float postCrankingCLTBins[CRANKING_ENRICH_COUNT];
3318  /**
3319  * offset 1924
3320  */
3322  /**
3323  * offset 1956
3324  */
3326  /**
3327  Deg
3328  * offset 1988
3329  */
3330  int16_t knockSamplingDuration;
3331  /**
3332  Hz
3333  * offset 1990
3334  */
3335  int16_t etbFreq;
3336  /**
3337  * offset 1992
3338  */
3340  /**
3341  * For micro-stepping, make sure that PWM frequency (etbFreq) is high enough
3342  * offset 2012
3343  */
3345  /**
3346  * Use to limit the current when the stepper motor is idle, not moving (100% = no limit)
3347  %
3348  * offset 2013
3349  */
3350  uint8_t stepperMinDutyCycle;
3351  /**
3352  * Use to limit the max.current through the stepper motor (100% = no limit)
3353  %
3354  * offset 2014
3355  */
3356  uint8_t stepperMaxDutyCycle;
3357  /**
3358  * offset 2015
3359  */
3361  /**
3362  * per-cylinder timing correction
3363  deg
3364  * offset 2016
3365  */
3366  angle_t timing_offset_cylinder[MAX_CYLINDER_COUNT];
3367  /**
3368  seconds
3369  * offset 2064
3370  */
3371  float idlePidActivationTime;
3372  /**
3373  * offset 2068
3374  */
3376  /**
3377  * Modes count be used for 3v<>5v integration using pull-ups/pull-downs etc.
3378  * offset 2069
3379  */
3381  /**
3382  * offset 2070
3383  */
3385  /**
3386  * offset 2071
3387  */
3389  /**
3390  * offset 2072
3391  */
3393  /**
3394  * offset 2073
3395  */
3397  /**
3398  * offset 2074
3399  */
3401  /**
3402  * offset 2075
3403  */
3405  /**
3406  * offset 2076
3407  */
3409  /**
3410  * offset 2077
3411  */
3413  /**
3414  * ResetB
3415  * offset 2078
3416  */
3418  /**
3419  * offset 2080
3420  */
3422  /**
3423  * Brake pedal switch
3424  * offset 2082
3425  */
3427  /**
3428  * offset 2084
3429  */
3431  /**
3432  * need 4 byte alignment
3433  units
3434  * offset 2085
3435  */
3436  uint8_t alignmentFill_at_2085[3];
3437  /**
3438  * VVT output PID
3439  * TODO: rename to vvtPid
3440  * offset 2088
3441  */
3442  pid_s auxPid[CAMS_PER_BANK];
3443  /**
3444  * offset 2128
3445  */
3447  /**
3448  C
3449  * offset 2160
3450  */
3451  int8_t primeBins[PRIME_CURVE_COUNT];
3452  /**
3453  * offset 2168
3454  */
3456  /**
3457  * offset 2188
3458  */
3460  /**
3461  * need 4 byte alignment
3462  units
3463  * offset 2189
3464  */
3465  uint8_t alignmentFill_at_2189[1];
3466  /**
3467  * offset 2190
3468  */
3470  /**
3471  * Cooling fan turn-on temperature threshold, in Celsius
3472  deg C
3473  * offset 2192
3474  */
3475  uint8_t fan2OnTemperature;
3476  /**
3477  * Cooling fan turn-off temperature threshold, in Celsius
3478  deg C
3479  * offset 2193
3480  */
3481  uint8_t fan2OffTemperature;
3482  /**
3483  * offset 2194
3484  */
3486  /**
3487  * offset 2196
3488  */
3489  Gpio tle8888_cs;
3490  /**
3491  * offset 2198
3492  */
3494  /**
3495  * need 4 byte alignment
3496  units
3497  * offset 2199
3498  */
3499  uint8_t alignmentFill_at_2199[1];
3500  /**
3501  * offset 2200
3502  */
3503  Gpio mc33816_cs;
3504  /**
3505  * need 4 byte alignment
3506  units
3507  * offset 2202
3508  */
3509  uint8_t alignmentFill_at_2202[2];
3510  /**
3511  hz
3512  * offset 2204
3513  */
3514  float auxFrequencyFilter;
3515  /**
3516  RPM
3517  * offset 2208
3518  */
3519  int16_t vvtControlMinRpm;
3520  /**
3521  * offset 2210
3522  */
3523  sent_input_pin_e sentInputPins[SENT_INPUT_COUNT];
3524  /**
3525  %
3526  * offset 2212
3527  */
3528  int8_t launchFuelAdderPercent;
3529  /**
3530  * Time required to detect a stuck throttle.
3531  sec
3532  * offset 2213
3533  */
3534  scaled_channel<uint8_t, 50, 1> etbJamTimeout;
3535  /**
3536  * By the way ETB PID runs at 500hz, length in 1/500 of second here.
3537  * offset 2214
3538  */
3539  uint16_t etbExpAverageLength;
3540  /**
3541  * offset 2216
3542  */
3543  float etbDutyThreshold;
3544  /**
3545  * This sets the RPM above which fuel cut is active.
3546  rpm
3547  * offset 2220
3548  */
3549  int16_t coastingFuelCutRpmHigh;
3550  /**
3551  * This sets the RPM below which fuel cut is deactivated, this prevents jerking or issues transitioning to idle
3552  rpm
3553  * offset 2222
3554  */
3555  int16_t coastingFuelCutRpmLow;
3556  /**
3557  * Throttle position below which fuel cut is active. With an electronic throttle enabled, this checks against pedal position.
3558  %
3559  * offset 2224
3560  */
3561  int16_t coastingFuelCutTps;
3562  /**
3563  * Fuel cutoff is disabled when the engine is cold.
3564  C
3565  * offset 2226
3566  */
3567  int16_t coastingFuelCutClt;
3568  /**
3569  * Increases PID reaction for RPM<target by adding extra percent to PID-error
3570  %
3571  * offset 2228
3572  */
3573  int16_t pidExtraForLowRpm;
3574  /**
3575  * MAP value above which fuel injection is re-enabled.
3576  kPa
3577  * offset 2230
3578  */
3579  int16_t coastingFuelCutMap;
3580  /**
3581  * offset 2232
3582  */
3584  /**
3585  * offset 2252
3586  */
3588  /**
3589  C
3590  * offset 2272
3591  */
3592  int8_t cltRevLimitRpmBins[CLT_LIMITER_CURVE_SIZE];
3593  /**
3594  RPM
3595  * offset 2276
3596  */
3597  uint16_t cltRevLimitRpm[CLT_LIMITER_CURVE_SIZE];
3598  /**
3599  * offset 2284
3600  */
3601  gppwm_note_t scriptCurveName[SCRIPT_CURVE_COUNT];
3602  /**
3603  * offset 2380
3604  */
3605  gppwm_note_t scriptTableName[SCRIPT_TABLE_COUNT];
3606  /**
3607  * offset 2444
3608  */
3609  gppwm_note_t scriptSettingName[SCRIPT_SETTING_COUNT];
3610  /**
3611  * Heat transfer coefficient at zero flow.
3612  * 0 means the air charge is fully heated to the same temperature as CLT.
3613  * 1 means the air charge gains no heat, and enters the cylinder at the temperature measured by IAT.
3614  * offset 2572
3615  */
3616  float tChargeAirCoefMin;
3617  /**
3618  * Heat transfer coefficient at high flow, as defined by "max air flow".
3619  * 0 means the air charge is fully heated to the same temperature as CLT.
3620  * 1 means the air charge gains no heat, and enters the cylinder at the temperature measured by IAT.
3621  * offset 2576
3622  */
3623  float tChargeAirCoefMax;
3624  /**
3625  * High flow point for heat transfer estimation.
3626  * Set this to perhaps 50-75% of your maximum airflow at wide open throttle.
3627  kg/h
3628  * offset 2580
3629  */
3630  float tChargeAirFlowMax;
3631  /**
3632  * Maximum allowed rate of increase allowed for the estimated charge temperature
3633  deg/sec
3634  * offset 2584
3635  */
3636  float tChargeAirIncrLimit;
3637  /**
3638  * Maximum allowed rate of decrease allowed for the estimated charge temperature
3639  deg/sec
3640  * offset 2588
3641  */
3642  float tChargeAirDecrLimit;
3643  /**
3644  * offset 2592
3645  */
3647  /**
3648  * need 4 byte alignment
3649  units
3650  * offset 2593
3651  */
3652  uint8_t alignmentFill_at_2593[3];
3653  /**
3654  * offset 2596
3655  */
3656  float hip9011Gain;
3657  /**
3658  * iTerm min value
3659  * offset 2600
3660  */
3661  int16_t etb_iTermMin;
3662  /**
3663  * iTerm max value
3664  * offset 2602
3665  */
3666  int16_t etb_iTermMax;
3667  /**
3668  * See useIdleTimingPidControl
3669  * offset 2604
3670  */
3672  /**
3673  * When entering idle, and the PID settings are aggressive, it's good to make a soft entry upon entering closed loop
3674  * offset 2624
3675  */
3677  /**
3678  * By the way ETB PID runs at 500hz, length in 1/500 of second here.
3679  * offset 2628
3680  */
3681  int16_t etbRocExpAverageLength;
3682  /**
3683  * A delay in cycles between fuel-enrich. portions
3684  cycles
3685  * offset 2630
3686  */
3687  int16_t tpsAccelFractionPeriod;
3688  /**
3689  * A fraction divisor: 1 or less = entire portion at once, or split into diminishing fractions
3690  coef
3691  * offset 2632
3692  */
3694  /**
3695  * offset 2636
3696  */
3698  /**
3699  * offset 2637
3700  */
3702  /**
3703  * iTerm min value
3704  * offset 2638
3705  */
3706  int16_t idlerpmpid_iTermMin;
3707  /**
3708  * offset 2640
3709  */
3711  /**
3712  * Stoichiometric ratio for your primary fuel. When Flex Fuel is enabled, this value is used when the Flex Fuel sensor indicates E0.
3713  * E0 = 14.7
3714  * E10 = 14.1
3715  * E85 = 9.9
3716  * E100 = 9.0
3717  :1
3718  * offset 2641
3719  */
3720  scaled_channel<uint8_t, 10, 1> stoichRatioPrimary;
3721  /**
3722  * iTerm max value
3723  * offset 2642
3724  */
3725  int16_t idlerpmpid_iTermMax;
3726  /**
3727  * This sets the range of the idle control on the ETB. At 100% idle position, the value specified here sets the base ETB position.
3728  %
3729  * offset 2644
3730  */
3731  float etbIdleThrottleRange;
3732  /**
3733  * Select which fuel correction bank this cylinder belongs to. Group cylinders that share the same O2 sensor
3734  * offset 2648
3735  */
3736  uint8_t cylinderBankSelect[MAX_CYLINDER_COUNT];
3737  /**
3738  mg
3739  * offset 2660
3740  */
3741  scaled_channel<uint8_t, 1, 5> primeValues[PRIME_CURVE_COUNT];
3742  /**
3743  * Trigger comparator center point voltage
3744  V
3745  * offset 2668
3746  */
3747  scaled_channel<uint8_t, 50, 1> triggerCompCenterVolt;
3748  /**
3749  * Trigger comparator hysteresis voltage (Min)
3750  V
3751  * offset 2669
3752  */
3753  scaled_channel<uint8_t, 50, 1> triggerCompHystMin;
3754  /**
3755  * Trigger comparator hysteresis voltage (Max)
3756  V
3757  * offset 2670
3758  */
3759  scaled_channel<uint8_t, 50, 1> triggerCompHystMax;
3760  /**
3761  * VR-sensor saturation RPM
3762  RPM
3763  * offset 2671
3764  */
3765  scaled_channel<uint8_t, 1, 50> triggerCompSensorSatRpm;
3766  /**
3767  * offset 2672
3768  */
3770  /**
3771  * offset 2692
3772  */
3774  /**
3775  * need 4 byte alignment
3776  units
3777  * offset 2694
3778  */
3779  uint8_t alignmentFill_at_2694[2];
3780  /**
3781  * offset 2696
3782  */
3783  gppwm_channel gppwm[GPPWM_CHANNELS];
3784  /**
3785  * Boost Current
3786  mA
3787  * offset 3128
3788  */
3789  uint16_t mc33_i_boost;
3790  /**
3791  * Peak Current
3792  mA
3793  * offset 3130
3794  */
3795  uint16_t mc33_i_peak;
3796  /**
3797  * Hold Current
3798  mA
3799  * offset 3132
3800  */
3801  uint16_t mc33_i_hold;
3802  /**
3803  * 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.
3804  us
3805  * offset 3134
3806  */
3807  uint16_t mc33_t_max_boost;
3808  /**
3809  us
3810  * offset 3136
3811  */
3812  uint16_t mc33_t_peak_off;
3813  /**
3814  * Peak phase duration
3815  us
3816  * offset 3138
3817  */
3818  uint16_t mc33_t_peak_tot;
3819  /**
3820  us
3821  * offset 3140
3822  */
3823  uint16_t mc33_t_bypass;
3824  /**
3825  us
3826  * offset 3142
3827  */
3828  uint16_t mc33_t_hold_off;
3829  /**
3830  * Hold phase duration
3831  us
3832  * offset 3144
3833  */
3834  uint16_t mc33_t_hold_tot;
3835  /**
3836  * offset 3146
3837  */
3839  /**
3840  * offset 3147
3841  */
3843  /**
3844  * offset 3148
3845  */
3847  /**
3848  * offset 3149
3849  */
3850  pin_output_mode_e tcu_solenoid_mode[TCU_SOLENOID_COUNT];
3851  /**
3852  * Knock sensor output knock detection threshold depending on current RPM.
3853  dB
3854  * offset 3155
3855  */
3856  scaled_channel<int8_t, 2, 1> knockBaseNoise[ENGINE_NOISE_CURVE_SIZE];
3857  /**
3858  * need 4 byte alignment
3859  units
3860  * offset 3171
3861  */
3862  uint8_t alignmentFill_at_3171[1];
3863  /**
3864  ratio
3865  * offset 3172
3866  */
3867  float triggerGapOverrideFrom[GAP_TRACKING_LENGTH];
3868  /**
3869  ratio
3870  * offset 3244
3871  */
3872  float triggerGapOverrideTo[GAP_TRACKING_LENGTH];
3873  /**
3874  * 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.
3875  rpm
3876  * offset 3316
3877  */
3878  scaled_channel<uint8_t, 1, 50> maxCamPhaseResolveRpm;
3879  /**
3880  * Delay before cutting fuel. Set to 0 to cut immediately with no delay. May cause rumbles and pops out of your exhaust...
3881  sec
3882  * offset 3317
3883  */
3884  scaled_channel<uint8_t, 10, 1> dfcoDelay;
3885  /**
3886  * 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.
3887  sec
3888  * offset 3318
3889  */
3890  scaled_channel<uint8_t, 10, 1> acDelay;
3891  /**
3892  * need 4 byte alignment
3893  units
3894  * offset 3319
3895  */
3896  uint8_t alignmentFill_at_3319[1];
3897  /**
3898  mg
3899  * offset 3320
3900  */
3901  scaled_channel<uint16_t, 1000, 1> fordInjectorSmallPulseBreakPoint;
3902  /**
3903  multiplier
3904  * offset 3322
3905  */
3906  scaled_channel<uint8_t, 50, 1> tpsTspCorrValues[TPS_TPS_ACCEL_CLT_CORR_TABLE];
3907  /**
3908  %
3909  * offset 3326
3910  */
3911  uint8_t etbJamIntegratorLimit;
3912  /**
3913  lobes/cam
3914  * offset 3327
3915  */
3916  uint8_t hpfpCamLobes;
3917  /**
3918  * offset 3328
3919  */
3921  /**
3922  * offset 3329
3923  */
3924  uint8_t auxiliarySetting1;
3925  /**
3926  * If the requested activation time is below this angle, don't bother running the pump
3927  deg
3928  * offset 3330
3929  */
3930  uint8_t hpfpMinAngle;
3931  /**
3932  * need 4 byte alignment
3933  units
3934  * offset 3331
3935  */
3936  uint8_t alignmentFill_at_3331[1];
3937  /**
3938  * Size of the pump chamber in cc. Typical Bosch HDP5 has a 9.0mm diameter, typical BMW N* stroke is 4.4mm.
3939  cc
3940  * offset 3332
3941  */
3942  scaled_channel<uint16_t, 1000, 1> hpfpPumpVolume;
3943  /**
3944  * How long to keep the valve activated (in order to allow the pump to build pressure and keep the valve open on its own)
3945  deg
3946  * offset 3334
3947  */
3948  uint8_t hpfpActivationAngle;
3949  /**
3950  * offset 3335
3951  */
3952  uint8_t issFilterReciprocal;
3953  /**
3954  %/kPa
3955  * offset 3336
3956  */
3957  scaled_channel<uint16_t, 1000, 1> hpfpPidP;
3958  /**
3959  %/kPa/lobe
3960  * offset 3338
3961  */
3962  scaled_channel<uint16_t, 100000, 1> hpfpPidI;
3963  /**
3964  * 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.
3965  kPa/s
3966  * offset 3340
3967  */
3968  uint16_t hpfpTargetDecay;
3969  /**
3970  %
3971  * offset 3342
3972  */
3973  scaled_channel<uint8_t, 2, 1> hpfpLobeProfileQuantityBins[HPFP_LOBE_PROFILE_SIZE];
3974  /**
3975  deg
3976  * offset 3358
3977  */
3978  scaled_channel<uint8_t, 2, 1> hpfpLobeProfileAngle[HPFP_LOBE_PROFILE_SIZE];
3979  /**
3980  volts
3981  * offset 3374
3982  */
3983  uint8_t hpfpDeadtimeVoltsBins[HPFP_DEADTIME_SIZE];
3984  /**
3985  ms
3986  * offset 3382
3987  */
3988  scaled_channel<uint16_t, 1000, 1> hpfpDeadtimeMS[HPFP_DEADTIME_SIZE];
3989  /**
3990  kPa
3991  * offset 3398
3992  */
3993  uint16_t hpfpTarget[HPFP_TARGET_SIZE][HPFP_TARGET_SIZE];
3994  /**
3995  load
3996  * offset 3598
3997  */
3998  scaled_channel<uint16_t, 10, 1> hpfpTargetLoadBins[HPFP_TARGET_SIZE];
3999  /**
4000  RPM
4001  * offset 3618
4002  */
4003  scaled_channel<uint8_t, 1, 50> hpfpTargetRpmBins[HPFP_TARGET_SIZE];
4004  /**
4005  %
4006  * offset 3628
4007  */
4008  int8_t hpfpCompensation[HPFP_COMPENSATION_SIZE][HPFP_COMPENSATION_SIZE];
4009  /**
4010  cc/lobe
4011  * offset 3728
4012  */
4013  scaled_channel<uint16_t, 1000, 1> hpfpCompensationLoadBins[HPFP_COMPENSATION_SIZE];
4014  /**
4015  RPM
4016  * offset 3748
4017  */
4018  scaled_channel<uint8_t, 1, 50> hpfpCompensationRpmBins[HPFP_COMPENSATION_SIZE];
4019  /**
4020  * offset 3758
4021  */
4023  /**
4024  ratio
4025  * offset 3766
4026  */
4027  scaled_channel<uint16_t, 100, 1> gearRatio[TCU_GEAR_COUNT];
4028  /**
4029  * We need to give engine time to build oil pressure without diverting it to VVT
4030  ms
4031  * offset 3786
4032  */
4033  uint16_t vvtActivationDelayMs;
4034  /**
4035  deg C
4036  * offset 3788
4037  */
4038  int8_t wwCltBins[WWAE_TABLE_SIZE];
4039  /**
4040  * offset 3796
4041  */
4042  scaled_channel<uint8_t, 100, 1> wwTauCltValues[WWAE_TABLE_SIZE];
4043  /**
4044  * offset 3804
4045  */
4046  scaled_channel<uint8_t, 100, 1> wwBetaCltValues[WWAE_TABLE_SIZE];
4047  /**
4048  kPa
4049  * offset 3812
4050  */
4051  int8_t wwMapBins[WWAE_TABLE_SIZE];
4052  /**
4053  * offset 3820
4054  */
4055  scaled_channel<uint8_t, 100, 1> wwTauMapValues[WWAE_TABLE_SIZE];
4056  /**
4057  * offset 3828
4058  */
4059  scaled_channel<uint8_t, 100, 1> wwBetaMapValues[WWAE_TABLE_SIZE];
4060  /**
4061  Nm
4062  * offset 3836
4063  */
4064  scaled_channel<uint8_t, 1, 10> torqueTable[TORQUE_CURVE_SIZE][TORQUE_CURVE_SIZE];
4065  /**
4066  RPM
4067  * offset 3872
4068  */
4069  uint16_t torqueRpmBins[TORQUE_CURVE_SIZE];
4070  /**
4071  Load
4072  * offset 3884
4073  */
4074  uint16_t torqueLoadBins[TORQUE_CURVE_SIZE];
4075  /**
4076  * offset 3896
4077  */
4079  /**
4080  * offset 3897
4081  */
4083  /**
4084  deg
4085  * offset 3898
4086  */
4087  uint16_t acrDisablePhase;
4088  /**
4089  * offset 3900
4090  */
4092  /**
4093  * offset 3920
4094  */
4096  /**
4097  * offset 3940
4098  */
4100  /**
4101  * offset 3942
4102  */
4104  /**
4105  * need 4 byte alignment
4106  units
4107  * offset 3943
4108  */
4109  uint8_t alignmentFill_at_3943[1];
4110  /**
4111  * offset 3944
4112  */
4114  /**
4115  * offset 3946
4116  */
4118  /**
4119  * need 4 byte alignment
4120  units
4121  * offset 3947
4122  */
4123  uint8_t alignmentFill_at_3947[1];
4124  /**
4125  * offset 3948
4126  */
4128  /**
4129  * offset 3950
4130  */
4132  /**
4133  * offset 3952
4134  */
4136  /**
4137  * need 4 byte alignment
4138  units
4139  * offset 3953
4140  */
4141  uint8_t alignmentFill_at_3953[1];
4142  /**
4143  * offset 3954
4144  */
4146  /**
4147  * offset 3956
4148  */
4150  /**
4151  * offset 3958
4152  */
4154  /**
4155  * need 4 byte alignment
4156  units
4157  * offset 3959
4158  */
4159  uint8_t alignmentFill_at_3959[1];
4160  /**
4161  * offset 3960
4162  */
4164  /**
4165  * offset 3962
4166  */
4168  /**
4169  %
4170  * offset 3964
4171  */
4172  float etbMinimumPosition;
4173  /**
4174  * offset 3968
4175  */
4176  uint16_t tuneHidingKey;
4177  /**
4178  * offset 3970
4179  */
4181  /**
4182  * need 4 byte alignment
4183  units
4184  * offset 3987
4185  */
4186  uint8_t alignmentFill_at_3987[1];
4187  /**
4188  * offset 3988
4189  */
4190  uint16_t highSpeedOffsets[HIGH_SPEED_COUNT];
4191  /**
4192  * offset 4052
4193  */
4195  /**
4196  * offset 4056
4197  */
4199  /**
4200  * need 4 byte alignment
4201  units
4202  * offset 4057
4203  */
4204  uint8_t alignmentFill_at_4057[1];
4205  /**
4206  * offset 4058
4207  */
4208  switch_input_pin_e luaDigitalInputPins[LUA_DIGITAL_INPUT_COUNT];
4209  /**
4210  RPM
4211  * offset 4074
4212  */
4213  scaled_channel<uint8_t, 1, 50> tpsTspCorrValuesBins[TPS_TPS_ACCEL_CLT_CORR_TABLE];
4214  /**
4215  rpm
4216  * offset 4078
4217  */
4218  int16_t ALSMinRPM;
4219  /**
4220  rpm
4221  * offset 4080
4222  */
4223  int16_t ALSMaxRPM;
4224  /**
4225  sec
4226  * offset 4082
4227  */
4228  int16_t ALSMaxDuration;
4229  /**
4230  C
4231  * offset 4084
4232  */
4233  int8_t ALSMinCLT;
4234  /**
4235  C
4236  * offset 4085
4237  */
4238  int8_t ALSMaxCLT;
4239  /**
4240  * offset 4086
4241  */
4242  uint8_t alsMinTimeBetween;
4243  /**
4244  * offset 4087
4245  */
4246  uint8_t alsEtbPosition;
4247  /**
4248  %
4249  * offset 4088
4250  */
4252  /**
4253  * offset 4089
4254  */
4256  /**
4257  * offset 4090
4258  */
4259  uint16_t customSentTpsMin;
4260  /**
4261  %
4262  * offset 4092
4263  */
4264  int ALSIdleAdd;
4265  /**
4266  %
4267  * offset 4096
4268  */
4269  int ALSEtbAdd;
4270  /**
4271  * offset 4100
4272  */
4273  float ALSSkipRatio;
4274  /**
4275  %
4276  * offset 4104
4277  */
4279  /**
4280  * offset 4105
4281  */
4283  /**
4284  * For Ford TPS, use 53%. For Toyota ETCS-i, use ~65%
4285  %
4286  * offset 4106
4287  */
4288  scaled_channel<uint8_t, 2, 1> tpsSecondaryMaximum;
4289  /**
4290  * For Toyota ETCS-i, use ~69%
4291  %
4292  * offset 4107
4293  */
4294  scaled_channel<uint8_t, 2, 1> ppsSecondaryMaximum;
4295  /**
4296  * offset 4108
4297  */
4298  pin_input_mode_e luaDigitalInputPinModes[LUA_DIGITAL_INPUT_COUNT];
4299  /**
4300  * offset 4116
4301  */
4302  uint16_t customSentTpsMax;
4303  /**
4304  * offset 4118
4305  */
4306  uint16_t kLineBaudRate;
4307  /**
4308  * offset 4120
4309  */
4311  /**
4312  * offset 4121
4313  */
4314  UiMode uiMode;
4315  /**
4316  * Crank angle ATDC of first lobe peak
4317  deg
4318  * offset 4122
4319  */
4320  int16_t hpfpPeakPos;
4321  /**
4322  us
4323  * offset 4124
4324  */
4325  int16_t kLinePeriodUs;
4326  /**
4327  * 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)
4328  RPM
4329  * offset 4126
4330  */
4331  scaled_channel<uint8_t, 1, 10> rpmSoftLimitWindowSize;
4332  /**
4333  * Degrees of timing REMOVED from actual timing during soft RPM limit window
4334  deg
4335  * offset 4127
4336  */
4337  scaled_channel<uint8_t, 5, 1> rpmSoftLimitTimingRetard;
4338  /**
4339  * % of fuel ADDED during window
4340  %
4341  * offset 4128
4342  */
4343  scaled_channel<uint8_t, 5, 1> rpmSoftLimitFuelAdded;
4344  /**
4345  * 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
4346  RPM
4347  * offset 4129
4348  */
4349  scaled_channel<uint8_t, 1, 10> rpmHardLimitHyst;
4350  /**
4351  * Time between bench test pulses
4352  ms
4353  * offset 4130
4354  */
4355  scaled_channel<uint16_t, 10, 1> benchTestOffTime;
4356  /**
4357  * Hysterisis: if hard cut is 240kpa, and boostCutPressureHyst is 20, when the ECU sees 240kpa, fuel/ign will cut, and stay cut until 240-20=220kpa is reached
4358  kPa (absolute)
4359  * offset 4132
4360  */
4361  scaled_channel<uint8_t, 2, 1> boostCutPressureHyst;
4362  /**
4363  * Boost duty cycle added by gear
4364  %
4365  * offset 4133
4366  */
4367  scaled_channel<uint8_t, 2, 1> gearBasedOpenLoopBoostAdder[TCU_GEAR_COUNT];
4368  /**
4369  * need 4 byte alignment
4370  units
4371  * offset 4143
4372  */
4373  uint8_t alignmentFill_at_4143[1];
4374  /**
4375  * How many test bench pulses do you want
4376  * offset 4144
4377  */
4378  uint32_t benchTestCount;
4379  /**
4380  * How long initial IAC adder is held before starting to decay.
4381  seconds
4382  * offset 4148
4383  */
4384  scaled_channel<uint8_t, 10, 1> iacByTpsHoldTime;
4385  /**
4386  * How long it takes to remove initial IAC adder to return to normal idle.
4387  seconds
4388  * offset 4149
4389  */
4390  scaled_channel<uint8_t, 10, 1> iacByTpsDecayTime;
4391  /**
4392  * offset 4150
4393  */
4394  switch_input_pin_e tcu_rangeInput[RANGE_INPUT_COUNT];
4395  /**
4396  * offset 4162
4397  */
4398  pin_input_mode_e tcu_rangeInputMode[RANGE_INPUT_COUNT];
4399  /**
4400  * Scale the reported vehicle speed value from CAN. Example: Parameter set to 1.1, CAN VSS reports 50kph, ECU will report 55kph instead.
4401  ratio
4402  * offset 4168
4403  */
4404  scaled_channel<uint16_t, 10000, 1> canVssScaling;
4405  /**
4406  * need 4 byte alignment
4407  units
4408  * offset 4170
4409  */
4410  uint8_t alignmentFill_at_4170[2];
4411  /**
4412  * offset 4172
4413  */
4415  /**
4416  * offset 4204
4417  */
4419  /**
4420  * offset 4236
4421  */
4423  /**
4424  * offset 4268
4425  */
4427  /**
4428  * Place the sensor before the throttle, but after any turbocharger/supercharger and intercoolers if fitted. Uses the same calibration as the MAP sensor.
4429  * offset 4300
4430  */
4432  /**
4433  * Place the sensor after the turbocharger/supercharger, but before any intercoolers if fitted. Uses the same calibration as the MAP sensor.
4434  * offset 4301
4435  */
4437  /**
4438  * offset 4302
4439  */
4440  Gpio dacOutputPins[DAC_OUTPUT_COUNT];
4441  /**
4442  * offset 4306
4443  */
4445  /**
4446  * Number of speedometer pulses per kilometer travelled.
4447  * offset 4308
4448  */
4449  uint16_t speedometerPulsePerKm;
4450  /**
4451  * offset 4310
4452  */
4453  uint8_t simulatorCamPosition[CAM_INPUTS_COUNT];
4454  /**
4455  * offset 4314
4456  */
4458  /**
4459  * offset 4315
4460  */
4461  uint8_t unusedExplicitFilling2;
4462  /**
4463  ratio
4464  * offset 4316
4465  */
4466  float triggerVVTGapOverrideFrom[VVT_TRACKING_LENGTH];
4467  /**
4468  ratio
4469  * offset 4332
4470  */
4471  float triggerVVTGapOverrideTo[VVT_TRACKING_LENGTH];
4472  /**
4473  units
4474  * offset 4348
4475  */
4476  uint8_t mainUnusedEnd[208];
4477 };
4478 static_assert(sizeof(engine_configuration_s) == 4556);
4479 
4480 // start of cyl_trim_s
4481 struct cyl_trim_s {
4482  /**
4483  * offset 0
4484  */
4485  scaled_channel<int8_t, 5, 1> table[TRIM_SIZE][TRIM_SIZE];
4486 };
4487 static_assert(sizeof(cyl_trim_s) == 16);
4488 
4489 // start of blend_table_s
4490 struct blend_table_s {
4491  /**
4492  * offset 0
4493  */
4494  scaled_channel<int16_t, 10, 1> table[8][8];
4495  /**
4496  Load
4497  * offset 128
4498  */
4499  uint16_t loadBins[8];
4500  /**
4501  RPM
4502  * offset 144
4503  */
4504  uint16_t rpmBins[8];
4505  /**
4506  * offset 160
4507  */
4509  /**
4510  * need 4 byte alignment
4511  units
4512  * offset 161
4513  */
4514  uint8_t alignmentFill_at_161[1];
4515  /**
4516  * offset 162
4517  */
4518  scaled_channel<int16_t, 10, 1> blendBins[8];
4519  /**
4520  %
4521  * offset 178
4522  */
4523  scaled_channel<uint8_t, 2, 1> blendValues[8];
4524  /**
4525  * need 4 byte alignment
4526  units
4527  * offset 186
4528  */
4529  uint8_t alignmentFill_at_186[2];
4530 };
4531 static_assert(sizeof(blend_table_s) == 188);
4532 
4533 // start of persistent_config_s
4534 struct persistent_config_s {
4535  /**
4536  * offset 0
4537  */
4539  /**
4540  * target TPS value, 0 to 100%
4541  * TODO: use int8 data date once we template interpolation method
4542  target TPS position
4543  * offset 4556
4544  */
4545  float etbBiasBins[ETB_BIAS_CURVE_LENGTH];
4546  /**
4547  * PWM bias, 0 to 100%
4548  ETB duty cycle bias
4549  * offset 4588
4550  */
4551  float etbBiasValues[ETB_BIAS_CURVE_LENGTH];
4552  /**
4553  %
4554  * offset 4620
4555  */
4556  scaled_channel<uint8_t, 20, 1> iacPidMultTable[IAC_PID_MULT_SIZE][IAC_PID_MULT_SIZE];
4557  /**
4558  Load
4559  * offset 4684
4560  */
4561  uint8_t iacPidMultLoadBins[IAC_PID_MULT_SIZE];
4562  /**
4563  RPM
4564  * offset 4692
4565  */
4566  scaled_channel<uint8_t, 1, 10> iacPidMultRpmBins[IAC_PID_MULT_SIZE];
4567  /**
4568  * On Single Coil or Wasted Spark setups you have to lower dwell at high RPM
4569  RPM
4570  * offset 4700
4571  */
4572  uint16_t sparkDwellRpmBins[DWELL_CURVE_SIZE];
4573  /**
4574  ms
4575  * offset 4716
4576  */
4577  scaled_channel<uint16_t, 100, 1> sparkDwellValues[DWELL_CURVE_SIZE];
4578  /**
4579  * CLT-based target RPM for automatic idle controller
4580  C
4581  * offset 4732
4582  */
4583  scaled_channel<int8_t, 1, 2> cltIdleRpmBins[CLT_CURVE_SIZE];
4584  /**
4585  * See idleRpmPid
4586  RPM
4587  * offset 4748
4588  */
4589  scaled_channel<uint8_t, 1, 20> cltIdleRpm[CLT_CURVE_SIZE];
4590  /**
4591  * CLT-based timing correction
4592  C
4593  * offset 4764
4594  */
4595  float cltTimingBins[CLT_TIMING_CURVE_SIZE];
4596  /**
4597  degree
4598  * offset 4796
4599  */
4600  float cltTimingExtra[CLT_TIMING_CURVE_SIZE];
4601  /**
4602  x
4603  * offset 4828
4604  */
4605  float scriptCurve1Bins[SCRIPT_CURVE_16];
4606  /**
4607  y
4608  * offset 4892
4609  */
4610  float scriptCurve1[SCRIPT_CURVE_16];
4611  /**
4612  x
4613  * offset 4956
4614  */
4615  float scriptCurve2Bins[SCRIPT_CURVE_16];
4616  /**
4617  y
4618  * offset 5020
4619  */
4620  float scriptCurve2[SCRIPT_CURVE_16];
4621  /**
4622  x
4623  * offset 5084
4624  */
4625  float scriptCurve3Bins[SCRIPT_CURVE_8];
4626  /**
4627  y
4628  * offset 5116
4629  */
4630  float scriptCurve3[SCRIPT_CURVE_8];
4631  /**
4632  x
4633  * offset 5148
4634  */
4635  float scriptCurve4Bins[SCRIPT_CURVE_8];
4636  /**
4637  y
4638  * offset 5180
4639  */
4640  float scriptCurve4[SCRIPT_CURVE_8];
4641  /**
4642  x
4643  * offset 5212
4644  */
4645  float scriptCurve5Bins[SCRIPT_CURVE_8];
4646  /**
4647  y
4648  * offset 5244
4649  */
4650  float scriptCurve5[SCRIPT_CURVE_8];
4651  /**
4652  x
4653  * offset 5276
4654  */
4655  float scriptCurve6Bins[SCRIPT_CURVE_8];
4656  /**
4657  y
4658  * offset 5308
4659  */
4660  float scriptCurve6[SCRIPT_CURVE_8];
4661  /**
4662  kPa
4663  * offset 5340
4664  */
4665  float baroCorrPressureBins[BARO_CORR_SIZE];
4666  /**
4667  RPM
4668  * offset 5356
4669  */
4670  float baroCorrRpmBins[BARO_CORR_SIZE];
4671  /**
4672  ratio
4673  * offset 5372
4674  */
4675  float baroCorrTable[BARO_CORR_SIZE][BARO_CORR_SIZE];
4676  /**
4677  * Cranking fuel correction coefficient based on TPS
4678  Ratio
4679  * offset 5436
4680  */
4681  float crankingTpsCoef[CRANKING_CURVE_SIZE];
4682  /**
4683  %
4684  * offset 5468
4685  */
4686  float crankingTpsBins[CRANKING_CURVE_SIZE];
4687  /**
4688  * Narrow Band WBO Approximation
4689  V
4690  * offset 5500
4691  */
4692  float narrowToWideOxygenBins[NARROW_BAND_WIDE_BAND_CONVERSION_SIZE];
4693  /**
4694  ratio
4695  * offset 5532
4696  */
4697  float narrowToWideOxygen[NARROW_BAND_WIDE_BAND_CONVERSION_SIZE];
4698  /**
4699  * Optional timing advance table for Cranking (see useSeparateAdvanceForCranking)
4700  RPM
4701  * offset 5564
4702  */
4703  uint16_t crankingAdvanceBins[CRANKING_ADVANCE_CURVE_SIZE];
4704  /**
4705  * Optional timing advance table for Cranking (see useSeparateAdvanceForCranking)
4706  deg
4707  * offset 5572
4708  */
4709  scaled_channel<int16_t, 100, 1> crankingAdvance[CRANKING_ADVANCE_CURVE_SIZE];
4710  /**
4711  * RPM-based idle position for coasting
4712  RPM
4713  * offset 5580
4714  */
4715  scaled_channel<uint8_t, 1, 100> iacCoastingRpmBins[CLT_CURVE_SIZE];
4716  /**
4717  * RPM-based idle position for coasting
4718  %
4719  * offset 5596
4720  */
4721  scaled_channel<uint8_t, 2, 1> iacCoasting[CLT_CURVE_SIZE];
4722  /**
4723  * offset 5612
4724  */
4726  /**
4727  C
4728  * offset 5732
4729  */
4730  float afterstartCoolantBins[AFTERSTART_HOLD_CURVE_SIZE];
4731  /**
4732  Seconds
4733  * offset 5764
4734  */
4735  float afterstartHoldTime[AFTERSTART_HOLD_CURVE_SIZE];
4736  /**
4737  %
4738  * offset 5796
4739  */
4740  float afterstartEnrich[AFTERSTART_ENRICH_CURVE_SIZE];
4741  /**
4742  Seconds
4743  * offset 5828
4744  */
4745  float afterstartDecayTime[AFTERSTART_DECAY_CURVE_SIZE];
4746  /**
4747  * offset 5860
4748  */
4749  scaled_channel<uint8_t, 2, 1> boostTableOpenLoop[BOOST_LOAD_COUNT][BOOST_RPM_COUNT];
4750  /**
4751  RPM
4752  * offset 5924
4753  */
4754  scaled_channel<uint8_t, 1, 100> boostRpmBins[BOOST_RPM_COUNT];
4755  /**
4756  * offset 5932
4757  */
4758  scaled_channel<uint8_t, 1, 2> boostTableClosedLoop[BOOST_LOAD_COUNT][BOOST_RPM_COUNT];
4759  /**
4760  %
4761  * offset 5996
4762  */
4763  uint8_t boostTpsBins[BOOST_LOAD_COUNT];
4764  /**
4765  %
4766  * offset 6004
4767  */
4768  uint8_t pedalToTpsTable[PEDAL_TO_TPS_SIZE][PEDAL_TO_TPS_SIZE];
4769  /**
4770  %
4771  * offset 6068
4772  */
4773  uint8_t pedalToTpsPedalBins[PEDAL_TO_TPS_SIZE];
4774  /**
4775  RPM
4776  * offset 6076
4777  */
4778  scaled_channel<uint8_t, 1, 100> pedalToTpsRpmBins[PEDAL_TO_TPS_SIZE];
4779  /**
4780  * CLT-based cranking position multiplier for simple manual idle controller
4781  C
4782  * offset 6084
4783  */
4784  float cltCrankingCorrBins[CLT_CRANKING_CURVE_SIZE];
4785  /**
4786  * CLT-based cranking position multiplier for simple manual idle controller
4787  %
4788  * offset 6116
4789  */
4790  float cltCrankingCorr[CLT_CRANKING_CURVE_SIZE];
4791  /**
4792  * Optional timing advance table for Idle (see useSeparateAdvanceForIdle)
4793  RPM
4794  * offset 6148
4795  */
4796  scaled_channel<uint8_t, 1, 50> idleAdvanceBins[IDLE_ADVANCE_CURVE_SIZE];
4797  /**
4798  * Optional timing advance table for Idle (see useSeparateAdvanceForIdle)
4799  deg
4800  * offset 6156
4801  */
4802  float idleAdvance[IDLE_ADVANCE_CURVE_SIZE];
4803  /**
4804  RPM
4805  * offset 6188
4806  */
4807  scaled_channel<uint8_t, 1, 10> idleVeRpmBins[IDLE_VE_SIZE];
4808  /**
4809  load
4810  * offset 6192
4811  */
4812  uint8_t idleVeLoadBins[IDLE_VE_SIZE];
4813  /**
4814  %
4815  * offset 6196
4816  */
4817  scaled_channel<uint16_t, 10, 1> idleVeTable[IDLE_VE_SIZE][IDLE_VE_SIZE];
4818  /**
4819  * offset 6228
4820  */
4822  /**
4823  C
4824  * offset 14228
4825  */
4826  float cltFuelCorrBins[CLT_CURVE_SIZE];
4827  /**
4828  ratio
4829  * offset 14292
4830  */
4831  float cltFuelCorr[CLT_CURVE_SIZE];
4832  /**
4833  C
4834  * offset 14356
4835  */
4836  float iatFuelCorrBins[IAT_CURVE_SIZE];
4837  /**
4838  ratio
4839  * offset 14420
4840  */
4841  float iatFuelCorr[IAT_CURVE_SIZE];
4842  /**
4843  ratio
4844  * offset 14484
4845  */
4846  float crankingFuelCoef[CRANKING_CURVE_SIZE];
4847  /**
4848  C
4849  * offset 14516
4850  */
4851  float crankingFuelBins[CRANKING_CURVE_SIZE];
4852  /**
4853  ratio
4854  * offset 14548
4855  */
4856  float crankingCycleCoef[CRANKING_CURVE_SIZE];
4857  /**
4858  counter
4859  * offset 14580
4860  */
4861  float crankingCycleBins[CRANKING_CURVE_SIZE];
4862  /**
4863  * CLT-based idle position multiplier for simple manual idle controller
4864  C
4865  * offset 14612
4866  */
4867  float cltIdleCorrBins[CLT_CURVE_SIZE];
4868  /**
4869  * CLT-based idle position multiplier for simple manual idle controller
4870  ratio
4871  * offset 14676
4872  */
4873  float cltIdleCorr[CLT_CURVE_SIZE];
4874  /**
4875  * Also known as MAF transfer function.
4876  * kg/hour value.
4877  * By the way 2.081989116 kg/h = 1 ft3/m
4878  kg/hour
4879  * offset 14740
4880  */
4881  float mafDecoding[MAF_DECODING_COUNT];
4882  /**
4883  V
4884  * offset 14868
4885  */
4886  float mafDecodingBins[MAF_DECODING_COUNT];
4887  /**
4888  deg
4889  * offset 14996
4890  */
4891  scaled_channel<int8_t, 10, 1> ignitionIatCorrTable[8][8];
4892  /**
4893  C
4894  * offset 15060
4895  */
4896  int8_t ignitionIatCorrTempBins[8];
4897  /**
4898  Load
4899  * offset 15068
4900  */
4901  scaled_channel<uint8_t, 1, 5> ignitionIatCorrLoadBins[8];
4902  /**
4903  deg
4904  * offset 15076
4905  */
4906  int16_t injectionPhase[FUEL_LOAD_COUNT][FUEL_RPM_COUNT];
4907  /**
4908  Load
4909  * offset 15332
4910  */
4911  uint16_t injPhaseLoadBins[FUEL_LOAD_COUNT];
4912  /**
4913  RPM
4914  * offset 15364
4915  */
4916  uint16_t injPhaseRpmBins[FUEL_RPM_COUNT];
4917  /**
4918  onoff
4919  * offset 15380
4920  */
4921  uint8_t tcuSolenoidTable[TCU_SOLENOID_COUNT][TCU_GEAR_COUNT];
4922  /**
4923  kPa
4924  * offset 15440
4925  */
4926  scaled_channel<uint16_t, 100, 1> mapEstimateTable[FUEL_LOAD_COUNT][FUEL_RPM_COUNT];
4927  /**
4928  % TPS
4929  * offset 15696
4930  */
4931  scaled_channel<uint16_t, 100, 1> mapEstimateTpsBins[FUEL_LOAD_COUNT];
4932  /**
4933  RPM
4934  * offset 15728
4935  */
4936  uint16_t mapEstimateRpmBins[FUEL_RPM_COUNT];
4937  /**
4938  value
4939  * offset 15744
4940  */
4941  int8_t vvtTable1[SCRIPT_TABLE_8][SCRIPT_TABLE_8];
4942  /**
4943  L
4944  * offset 15808
4945  */
4946  uint16_t vvtTable1LoadBins[SCRIPT_TABLE_8];
4947  /**
4948  RPM
4949  * offset 15824
4950  */
4951  uint16_t vvtTable1RpmBins[SCRIPT_TABLE_8];
4952  /**
4953  value
4954  * offset 15840
4955  */
4956  int8_t vvtTable2[SCRIPT_TABLE_8][SCRIPT_TABLE_8];
4957  /**
4958  L
4959  * offset 15904
4960  */
4961  uint16_t vvtTable2LoadBins[SCRIPT_TABLE_8];
4962  /**
4963  RPM
4964  * offset 15920
4965  */
4966  uint16_t vvtTable2RpmBins[SCRIPT_TABLE_8];
4967  /**
4968  deg
4969  * offset 15936
4970  */
4971  scaled_channel<int16_t, 10, 1> ignitionTable[IGN_LOAD_COUNT][IGN_RPM_COUNT];
4972  /**
4973  Load
4974  * offset 16064
4975  */
4976  uint16_t ignitionLoadBins[IGN_LOAD_COUNT];
4977  /**
4978  RPM
4979  * offset 16080
4980  */
4981  uint16_t ignitionRpmBins[IGN_RPM_COUNT];
4982  /**
4983  %
4984  * offset 16096
4985  */
4986  scaled_channel<uint16_t, 10, 1> veTable[FUEL_LOAD_COUNT][FUEL_RPM_COUNT];
4987  /**
4988  kPa
4989  * offset 16352
4990  */
4991  uint16_t veLoadBins[FUEL_LOAD_COUNT];
4992  /**
4993  RPM
4994  * offset 16384
4995  */
4996  uint16_t veRpmBins[FUEL_RPM_COUNT];
4997  /**
4998  lambda
4999  * offset 16400
5000  */
5001  scaled_channel<uint8_t, 147, 1> lambdaTable[FUEL_LOAD_COUNT][FUEL_RPM_COUNT];
5002  /**
5003  * offset 16528
5004  */
5005  uint16_t lambdaLoadBins[FUEL_LOAD_COUNT];
5006  /**
5007  RPM
5008  * offset 16560
5009  */
5010  uint16_t lambdaRpmBins[FUEL_RPM_COUNT];
5011  /**
5012  value
5013  * offset 16576
5014  */
5015  float tpsTpsAccelTable[TPS_TPS_ACCEL_TABLE][TPS_TPS_ACCEL_TABLE];
5016  /**
5017  from
5018  * offset 16832
5019  */
5020  float tpsTpsAccelFromRpmBins[TPS_TPS_ACCEL_TABLE];
5021  /**
5022  to
5023  * offset 16864
5024  */
5025  float tpsTpsAccelToRpmBins[TPS_TPS_ACCEL_TABLE];
5026  /**
5027  value
5028  * offset 16896
5029  */
5030  float scriptTable1[SCRIPT_TABLE_8][SCRIPT_TABLE_8];
5031  /**
5032  L
5033  * offset 17152
5034  */
5035  int16_t scriptTable1LoadBins[SCRIPT_TABLE_8];
5036  /**
5037  RPM
5038  * offset 17168
5039  */
5040  int16_t scriptTable1RpmBins[SCRIPT_TABLE_8];
5041  /**
5042  value
5043  * offset 17184
5044  */
5045  uint8_t scriptTable2[SCRIPT_TABLE_8][SCRIPT_TABLE_8];
5046  /**
5047  L
5048  * offset 17248
5049  */
5050  int16_t scriptTable2LoadBins[SCRIPT_TABLE_8];
5051  /**
5052  RPM
5053  * offset 17264
5054  */
5055  int16_t scriptTable2RpmBins[SCRIPT_TABLE_8];
5056  /**
5057  value
5058  * offset 17280
5059  */
5060  uint8_t scriptTable3[SCRIPT_TABLE_8][SCRIPT_TABLE_8];
5061  /**
5062  L
5063  * offset 17344
5064  */
5065  int16_t scriptTable3LoadBins[SCRIPT_TABLE_8];
5066  /**
5067  RPM
5068  * offset 17360
5069  */
5070  int16_t scriptTable3RpmBins[SCRIPT_TABLE_8];
5071  /**
5072  value
5073  * offset 17376
5074  */
5075  uint8_t scriptTable4[SCRIPT_TABLE_8][TABLE_4_RPM];
5076  /**
5077  L
5078  * offset 17456
5079  */
5080  int16_t scriptTable4LoadBins[SCRIPT_TABLE_8];
5081  /**
5082  RPM
5083  * offset 17472
5084  */
5085  int16_t scriptTable4RpmBins[TABLE_4_RPM];
5086  /**
5087  * offset 17492
5088  */
5089  uint16_t ignTrimLoadBins[TRIM_SIZE];
5090  /**
5091  rpm
5092  * offset 17500
5093  */
5094  uint16_t ignTrimRpmBins[TRIM_SIZE];
5095  /**
5096  * offset 17508
5097  */
5098  cyl_trim_s ignTrims[12];
5099  /**
5100  * offset 17700
5101  */
5102  uint16_t fuelTrimLoadBins[TRIM_SIZE];
5103  /**
5104  rpm
5105  * offset 17708
5106  */
5107  uint16_t fuelTrimRpmBins[TRIM_SIZE];
5108  /**
5109  * offset 17716
5110  */
5111  cyl_trim_s fuelTrims[12];
5112  /**
5113  ratio
5114  * offset 17908
5115  */
5116  scaled_channel<uint16_t, 100, 1> crankingFuelCoefE100[CRANKING_CURVE_SIZE];
5117  /**
5118  Airmass
5119  * offset 17924
5120  */
5121  scaled_channel<uint8_t, 50, 1> tcu_pcAirmassBins[TCU_MAGIC_SIZE];
5122  /**
5123  %
5124  * offset 17932
5125  */
5126  uint8_t tcu_pcValsR[TCU_MAGIC_SIZE];
5127  /**
5128  %
5129  * offset 17940
5130  */
5131  uint8_t tcu_pcValsN[TCU_MAGIC_SIZE];
5132  /**
5133  %
5134  * offset 17948
5135  */
5136  uint8_t tcu_pcVals1[TCU_MAGIC_SIZE];
5137  /**
5138  %
5139  * offset 17956
5140  */
5141  uint8_t tcu_pcVals2[TCU_MAGIC_SIZE];
5142  /**
5143  %
5144  * offset 17964
5145  */
5146  uint8_t tcu_pcVals3[TCU_MAGIC_SIZE];
5147  /**
5148  %
5149  * offset 17972
5150  */
5151  uint8_t tcu_pcVals4[TCU_MAGIC_SIZE];
5152  /**
5153  %
5154  * offset 17980
5155  */
5156  uint8_t tcu_pcVals12[TCU_MAGIC_SIZE];
5157  /**
5158  %
5159  * offset 17988
5160  */
5161  uint8_t tcu_pcVals23[TCU_MAGIC_SIZE];
5162  /**
5163  %
5164  * offset 17996
5165  */
5166  uint8_t tcu_pcVals34[TCU_MAGIC_SIZE];
5167  /**
5168  %
5169  * offset 18004
5170  */
5171  uint8_t tcu_pcVals21[TCU_MAGIC_SIZE];
5172  /**
5173  %
5174  * offset 18012
5175  */
5176  uint8_t tcu_pcVals32[TCU_MAGIC_SIZE];
5177  /**
5178  %
5179  * offset 18020
5180  */
5181  uint8_t tcu_pcVals43[TCU_MAGIC_SIZE];
5182  /**
5183  TPS
5184  * offset 18028
5185  */
5186  uint8_t tcu_tccTpsBins[8];
5187  /**
5188  MPH
5189  * offset 18036
5190  */
5191  uint8_t tcu_tccLockSpeed[8];
5192  /**
5193  MPH
5194  * offset 18044
5195  */
5196  uint8_t tcu_tccUnlockSpeed[8];
5197  /**
5198  KPH
5199  * offset 18052
5200  */
5201  uint8_t tcu_32SpeedBins[8];
5202  /**
5203  %
5204  * offset 18060
5205  */
5206  uint8_t tcu_32Vals[8];
5207  /**
5208  %
5209  * offset 18068
5210  */
5211  scaled_channel<int8_t, 10, 1> throttle2TrimTable[6][6];
5212  /**
5213  %
5214  * offset 18104
5215  */
5216  uint8_t throttle2TrimTpsBins[6];
5217  /**
5218  RPM
5219  * offset 18110
5220  */
5221  scaled_channel<uint8_t, 1, 100> throttle2TrimRpmBins[6];
5222  /**
5223  deg
5224  * offset 18116
5225  */
5226  scaled_channel<uint8_t, 4, 1> maxKnockRetardTable[6][6];
5227  /**
5228  %
5229  * offset 18152
5230  */
5231  uint8_t maxKnockRetardLoadBins[6];
5232  /**
5233  RPM
5234  * offset 18158
5235  */
5236  scaled_channel<uint8_t, 1, 100> maxKnockRetardRpmBins[6];
5237  /**
5238  deg
5239  * offset 18164
5240  */
5241  scaled_channel<int16_t, 10, 1> ALSTimingRetardTable[4][4];
5242  /**
5243  TPS
5244  * offset 18196
5245  */
5246  uint16_t alsIgnRetardLoadBins[4];
5247  /**
5248  RPM
5249  * offset 18204
5250  */
5251  uint16_t alsIgnRetardrpmBins[4];
5252  /**
5253  percent
5254  * offset 18212
5255  */
5256  scaled_channel<int16_t, 10, 1> ALSFuelAdjustment[4][4];
5257  /**
5258  TPS
5259  * offset 18244
5260  */
5261  uint16_t alsFuelAdjustmentLoadBins[4];
5262  /**
5263  RPM
5264  * offset 18252
5265  */
5266  uint16_t alsFuelAdjustmentrpmBins[4];
5267  /**
5268  ratio
5269  * offset 18260
5270  */
5271  scaled_channel<int16_t, 1, 10> ALSIgnSkipTable[4][4];
5272  /**
5273  TPS
5274  * offset 18292
5275  */
5276  uint16_t alsIgnSkipLoadBins[4];
5277  /**
5278  RPM
5279  * offset 18300
5280  */
5281  uint16_t alsIgnSkiprpmBins[4];
5282  /**
5283  * offset 18308
5284  */
5285  blend_table_s ignBlends[IGN_BLEND_COUNT];
5286  /**
5287  * offset 19060
5288  */
5289  blend_table_s veBlends[VE_BLEND_COUNT];
5290  /**
5291  %
5292  * offset 19812
5293  */
5294  scaled_channel<uint16_t, 10, 1> throttleEstimateEffectiveAreaBins[12];
5295  /**
5296  * In units of g/s normalized to choked flow conditions
5297  g/s
5298  * offset 19836
5299  */
5300  scaled_channel<uint16_t, 10, 1> throttleEstimateEffectiveAreaValues[12];
5301  /**
5302  * offset 19860
5303  */
5304  blend_table_s boostOpenLoopBlends[BOOST_BLEND_COUNT];
5305  /**
5306  * offset 20236
5307  */
5308  blend_table_s boostClosedLoopBlends[BOOST_BLEND_COUNT];
5309  /**
5310  level
5311  * offset 20612
5312  */
5313  uint8_t tcu_rangeP[6];
5314  /**
5315  level
5316  * offset 20618
5317  */
5318  uint8_t tcu_rangeR[6];
5319  /**
5320  level
5321  * offset 20624
5322  */
5323  uint8_t tcu_rangeN[6];
5324  /**
5325  level
5326  * offset 20630
5327  */
5328  uint8_t tcu_rangeD[6];
5329  /**
5330  level
5331  * offset 20636
5332  */
5333  uint8_t tcu_rangeM[6];
5334  /**
5335  level
5336  * offset 20642
5337  */
5338  uint8_t tcu_rangeM3[6];
5339  /**
5340  level
5341  * offset 20648
5342  */
5343  uint8_t tcu_rangeM2[6];
5344  /**
5345  level
5346  * offset 20654
5347  */
5348  uint8_t tcu_rangeM1[6];
5349  /**
5350  level
5351  * offset 20660
5352  */
5353  uint8_t tcu_rangePlus[6];
5354  /**
5355  level
5356  * offset 20666
5357  */
5358  uint8_t tcu_rangeMinus[6];
5359  /**
5360  level
5361  * offset 20672
5362  */
5363  uint8_t tcu_rangeLow[6];
5364  /**
5365  lambda
5366  * offset 20678
5367  */
5368  scaled_channel<uint8_t, 100, 1> lambdaMaxDeviationTable[4][4];
5369  /**
5370  * offset 20694
5371  */
5372  uint16_t lambdaMaxDeviationLoadBins[4];
5373  /**
5374  RPM
5375  * offset 20702
5376  */
5377  uint16_t lambdaMaxDeviationRpmBins[4];
5378  /**
5379  * need 4 byte alignment
5380  units
5381  * offset 20710
5382  */
5384 };
5385 static_assert(sizeof(persistent_config_s) == 20712);
5386 
5387 // end
5388 // this section was generated automatically by rusEFI tool config_definition.jar based on (unknown script) integration/rusefi_config.txt Fri Dec 15 21:22:53 UTC 2023
Gpio
adc_channel_e
debug_mode_e
Definition: engine_types.h:292
trigger_type_e
Definition: engine_types.h:298
engine_type_e
Definition: engine_types.h:18
firing_order_e
Definition: firing_order.h:83
ve_override_e
Definition: rusefi_enums.h:600
launchActivationMode_e
Definition: rusefi_enums.h:545
InjectorNonlinearMode
Definition: rusefi_enums.h:646
boostType_e
Definition: rusefi_enums.h:539
idle_mode_e
Definition: rusefi_enums.h:172
tle8888_mode_e
Definition: rusefi_enums.h:157
ignition_mode_e
Definition: rusefi_enums.h:274
vvt_mode_e
Definition: rusefi_enums.h:117
stepper_num_micro_steps_e
Definition: rusefi_enums.h:623
gppwm_channel_e
Definition: rusefi_enums.h:579
air_pressure_sensor_type_e
Definition: rusefi_enums.h:450
engine_load_mode_e
Definition: rusefi_enums.h:141
dc_function_e
Definition: rusefi_enums.h:616
ego_sensor_e
Definition: rusefi_enums.h:382
load_override_e
Definition: rusefi_enums.h:608
injector_pressure_type_e
Definition: rusefi_enums.h:628
injector_compensation_mode_e
Definition: rusefi_enums.h:634
SentEtbType
Definition: rusefi_enums.h:174
uart_device_e
Definition: rusefi_enums.h:308
InjectionTimingMode
Definition: rusefi_enums.h:688
can_vss_nbc_e
Definition: rusefi_enums.h:337
CanGpioType
Definition: rusefi_enums.h:181
spi_device_e
Definition: rusefi_enums.h:328
pin_input_mode_e
Definition: rusefi_enums.h:213
fuel_pressure_sensor_mode_e
Definition: rusefi_enums.h:640
hpfp_cam_e
Definition: rusefi_enums.h:654
can_baudrate_e
Definition: rusefi_enums.h:589
antiLagActivationMode_e
Definition: rusefi_enums.h:550
injection_mode_e
Definition: rusefi_enums.h:300
timing_mode_e
Definition: rusefi_enums.h:494
sensor_chart_e
Definition: rusefi_enums.h:463
can_nbc_e
Definition: rusefi_enums.h:515
UiMode
Definition: rusefi_enums.h:187
imu_type_e
Definition: rusefi_enums.h:358
TransmissionControllerMode
Definition: rusefi_enums.h:682
maf_sensor_type_e
Definition: rusefi_enums.h:481
pin_output_mode_e
Definition: rusefi_enums.h:207
tChargeMode_e
Definition: rusefi_enums.h:522
GearControllerMode
Definition: rusefi_enums.h:676
pin_mode_e
int16_t pwm_freq_t
Definition: rusefi_types.h:92
uint8_t engineSyncCam_e
Definition: rusefi_types.h:63
float script_setting_t
Definition: rusefi_types.h:94
char[LUA_SCRIPT_SIZE] lua_script_t
Definition: rusefi_types.h:78
char[VIN_NUMBER_SIZE] vin_number_t
Definition: rusefi_types.h:84
char[WARNING_BUFFER_SIZE] warning_message_t
Definition: rusefi_types.h:80
float angle_t
Definition: rusefi_types.h:61
char[VEHICLE_INFO_SIZE] vehicle_info_t
Definition: rusefi_types.h:82
char[GPPWM_NOTE_SIZE] gppwm_note_t
Definition: rusefi_types.h:86
scaled_channel< int16_t, 10, 1 > blendBins[8]
scaled_channel< uint8_t, 2, 1 > blendValues[8]
scaled_channel< int16_t, 10, 1 > table[8][8]
scaled_channel< int8_t, 5, 1 > table[TRIM_SIZE][TRIM_SIZE]
scaled_channel< uint8_t, 1, 10 > lambdaProtectionRestoreLoad
scaled_channel< uint8_t, 50, 1 > triggerCompHystMax
scaled_channel< uint8_t, 10, 1 > knockRetardAggression
scaled_channel< uint16_t, 100, 1 > gearRatio[TCU_GEAR_COUNT]
scaled_channel< uint8_t, 10, 1 > lambdaProtectionTimeout
scaled_channel< uint8_t, 5, 1 > rpmSoftLimitTimingRetard
output_pin_e trailingCoilPins[MAX_CYLINDER_COUNT]
gppwm_note_t scriptSettingName[SCRIPT_SETTING_COUNT]
uint16_t cltRevLimitRpm[CLT_LIMITER_CURVE_SIZE]
scaled_channel< int8_t, 2, 1 > knockBaseNoise[ENGINE_NOISE_CURVE_SIZE]
scaled_channel< uint16_t, 1000, 1 > fordInjectorSmallPulseSlope
scaled_channel< uint8_t, 50, 1 > tpsTspCorrValues[TPS_TPS_ACCEL_CLT_CORR_TABLE]
scaled_channel< uint8_t, 100, 1 > tchargeValues[16]
scaled_channel< uint16_t, 100, 1 > finalGearRatio
scaled_channel< uint8_t, 100, 1 > wwBetaCltValues[WWAE_TABLE_SIZE]
scaled_channel< uint8_t, 10, 1 > noFuelTrimAfterDfcoTime
scaled_channel< uint8_t, 1, 50 > triggerCompSensorSatRpm
scaled_channel< uint16_t, 100000, 1 > hpfpPidI
scaled_channel< uint8_t, 1, 10 > lambdaProtectionMinLoad
scaled_channel< uint16_t, 10000, 1 > canVssScaling
Gpio triggerSimulatorPins[TRIGGER_SIMULATOR_PIN_COUNT]
scaled_channel< uint8_t, 5, 1 > rpmSoftLimitFuelAdded
float postCrankingDurationBins[CRANKING_ENRICH_COUNT]
scaled_channel< uint16_t, 1000, 1 > hpfpDeadtimeMS[HPFP_DEADTIME_SIZE]
gppwm_note_t scriptCurveName[SCRIPT_CURVE_COUNT]
vr_threshold_s vrThreshold[VR_THRESHOLD_COUNT]
pin_output_mode_e tcu_solenoid_mode[TCU_SOLENOID_COUNT]
scaled_channel< uint8_t, 50, 1 > dwellVoltageCorrValues[DWELL_CURVE_SIZE]
scaled_channel< uint8_t, 2, 1 > hpfpLobeProfileAngle[HPFP_LOBE_PROFILE_SIZE]
adc_channel_e auxAnalogInputs[LUA_ANALOG_INPUT_COUNT]
scaled_channel< uint8_t, 1, 100 > lambdaProtectionRestoreRpm
scaled_channel< uint16_t, 1000, 1 > hpfpCompensationLoadBins[HPFP_COMPENSATION_SIZE]
scaled_channel< uint8_t, 1, 10 > rpmHardLimitHyst
scaled_channel< uint8_t, 1, 10 > torqueTable[TORQUE_CURVE_SIZE][TORQUE_CURVE_SIZE]
scaled_channel< uint16_t, 1000, 1 > vssGearRatio
scaled_channel< uint16_t, 1000, 1 > multisparkDwell
scaled_channel< uint8_t, 100, 1 > wwTauMapValues[WWAE_TABLE_SIZE]
scaled_channel< uint8_t, 10, 1 > mc33_hpfp_i_hold
scaled_channel< uint8_t, 1, 50 > multisparkMaxRpm
scaled_channel< uint16_t, 100, 1 > benchTestOnTime
scaled_channel< uint8_t, 2, 1 > tpsSecondaryMaximum
scaled_channel< uint16_t, 1000, 1 > displacement
sent_input_pin_e sentInputPins[SENT_INPUT_COUNT]
scaled_channel< uint16_t, 1000, 1 > hpfpPidP
Gpio triggerInputDebugPins[TRIGGER_INPUT_PIN_COUNT]
scaled_channel< uint16_t, 1000, 1 > multisparkSparkDuration
int8_t cltRevLimitRpmBins[CLT_LIMITER_CURVE_SIZE]
scaled_channel< uint8_t, 100, 1 > primingDelay
output_pin_e injectionPins[MAX_CYLINDER_COUNT]
scaled_channel< uint8_t, 10, 1 > stoichRatioSecondary
scaled_channel< uint8_t, 2, 1 > gearBasedOpenLoopBoostAdder[TCU_GEAR_COUNT]
brain_input_pin_e logicAnalyzerPins[LOGIC_ANALYZER_CHANNEL_COUNT]
scaled_channel< uint8_t, 10, 1 > stoichRatioPrimary
scaled_channel< uint16_t, 10, 1 > hpfpTargetLoadBins[HPFP_TARGET_SIZE]
scaled_channel< uint8_t, 2, 1 > boostCutPressureHyst
scaled_channel< uint8_t, 1, 50 > maxCamPhaseResolveRpm
float postCrankingFactor[CRANKING_ENRICH_COUNT][CRANKING_ENRICH_COUNT]
pin_input_mode_e tcu_rangeInputMode[RANGE_INPUT_COUNT]
scaled_channel< uint16_t, 1000, 1 > applyNonlinearBelowPulse
scaled_channel< uint8_t, 10, 1 > iacByTpsHoldTime
scaled_channel< uint8_t, 1, 5 > primeValues[PRIME_CURVE_COUNT]
gppwm_note_t scriptTableName[SCRIPT_TABLE_COUNT]
scaled_channel< uint8_t, 1, 50 > maxAcRpm
scaled_channel< uint8_t, 50, 1 > triggerCompCenterVolt
scaled_channel< uint16_t, 10, 1 > benchTestOffTime
scaled_channel< uint16_t, 1000, 1 > fordInjectorSmallPulseBreakPoint
scaled_channel< uint8_t, 10, 1 > dwellVoltageCorrVoltBins[DWELL_CURVE_SIZE]
switch_input_pin_e luaDigitalInputPins[LUA_DIGITAL_INPUT_COUNT]
switch_input_pin_e tcu_rangeInput[RANGE_INPUT_COUNT]
brain_input_pin_e triggerInputPins[TRIGGER_INPUT_PIN_COUNT]
scaled_channel< uint8_t, 1, 50 > hpfpTargetRpmBins[HPFP_TARGET_SIZE]
uint8_t fuelLevelValues[FUEL_LEVEL_TABLE_COUNT]
injector_compensation_mode_e injectorCompensationMode
pin_output_mode_e triggerSimulatorPinModes[TRIGGER_SIMULATOR_PIN_COUNT]
script_setting_t scriptSetting[SCRIPT_SETTING_COUNT]
scaled_channel< uint8_t, 10, 1 > knockRetardReapplyRate
scaled_channel< uint16_t, 1000, 1 > hpfpPumpVolume
scaled_channel< uint8_t, 2, 1 > hpfpLobeProfileQuantityBins[HPFP_LOBE_PROFILE_SIZE]
int8_t hpfpCompensation[HPFP_COMPENSATION_SIZE][HPFP_COMPENSATION_SIZE]
scaled_channel< uint8_t, 1, 50 > hpfpCompensationRpmBins[HPFP_COMPENSATION_SIZE]
scaled_channel< uint8_t, 100, 1 > wwTauCltValues[WWAE_TABLE_SIZE]
scaled_channel< uint8_t, 50, 1 > etbJamTimeout
scaled_channel< uint16_t, 1000, 1 > fuelLevelBins[FUEL_LEVEL_TABLE_COUNT]
scaled_channel< uint8_t, 10, 1 > iacByTpsDecayTime
brain_input_pin_e camInputs[CAM_INPUTS_COUNT]
scaled_channel< uint8_t, 1, 50 > tpsTspCorrValuesBins[TPS_TPS_ACCEL_CLT_CORR_TABLE]
pin_input_mode_e luaDigitalInputPinModes[LUA_DIGITAL_INPUT_COUNT]
output_pin_e ignitionPins[MAX_CYLINDER_COUNT]
uint16_t knockNoiseRpmBins[ENGINE_NOISE_CURVE_SIZE]
scaled_channel< uint8_t, 1, 5 > tchargeBins[16]
uint16_t hpfpTarget[HPFP_TARGET_SIZE][HPFP_TARGET_SIZE]
scaled_channel< uint8_t, 1, 10 > rpmSoftLimitWindowSize
scaled_channel< uint8_t, 1, 100 > lambdaProtectionMinRpm
scaled_channel< uint8_t, 20, 1 > tpsAccelLookback
output_pin_e tcu_solenoid[TCU_SOLENOID_COUNT]
scaled_channel< uint8_t, 10, 1 > mc33_hpfp_i_peak
scaled_channel< uint8_t, 10, 1 > dfcoDelay
brain_input_pin_e auxSpeedSensorInputPin[AUX_SPEED_SENSOR_COUNT]
scaled_channel< uint8_t, 50, 1 > triggerCompHystMin
scaled_channel< uint8_t, 100, 1 > wwBetaMapValues[WWAE_TABLE_SIZE]
scaled_channel< uint8_t, 2, 1 > ppsSecondaryMaximum
scaled_channel< uint8_t, 2, 1 > table[GPPWM_LOAD_COUNT][GPPWM_RPM_COUNT]
scaled_channel< int16_t, 2, 1 > loadBins[GPPWM_LOAD_COUNT]
float battLagCorrBins[VBAT_INJECTOR_CURVE_SIZE]
float battLagCorr[VBAT_INJECTOR_CURVE_SIZE]
int8_t vvtTable1[SCRIPT_TABLE_8][SCRIPT_TABLE_8]
blend_table_s ignBlends[IGN_BLEND_COUNT]
uint8_t scriptTable3[SCRIPT_TABLE_8][SCRIPT_TABLE_8]
float idleAdvance[IDLE_ADVANCE_CURVE_SIZE]
scaled_channel< int8_t, 10, 1 > ignitionIatCorrTable[8][8]
float afterstartEnrich[AFTERSTART_ENRICH_CURVE_SIZE]
scaled_channel< int16_t, 10, 1 > ALSFuelAdjustment[4][4]
float baroCorrTable[BARO_CORR_SIZE][BARO_CORR_SIZE]
float afterstartHoldTime[AFTERSTART_HOLD_CURVE_SIZE]
scaled_channel< int16_t, 1, 10 > ALSIgnSkipTable[4][4]
scaled_channel< uint8_t, 4, 1 > maxKnockRetardTable[6][6]
scaled_channel< uint8_t, 1, 100 > iacCoastingRpmBins[CLT_CURVE_SIZE]
blend_table_s boostOpenLoopBlends[BOOST_BLEND_COUNT]
float cltCrankingCorr[CLT_CRANKING_CURVE_SIZE]
scaled_channel< uint8_t, 20, 1 > iacPidMultTable[IAC_PID_MULT_SIZE][IAC_PID_MULT_SIZE]
uint8_t scriptTable4[SCRIPT_TABLE_8][TABLE_4_RPM]
scaled_channel< uint8_t, 1, 10 > idleVeRpmBins[IDLE_VE_SIZE]
scaled_channel< uint16_t, 10, 1 > throttleEstimateEffectiveAreaBins[12]
float tpsTpsAccelTable[TPS_TPS_ACCEL_TABLE][TPS_TPS_ACCEL_TABLE]
scaled_channel< uint16_t, 10, 1 > throttleEstimateEffectiveAreaValues[12]
scaled_channel< uint8_t, 1, 100 > pedalToTpsRpmBins[PEDAL_TO_TPS_SIZE]
scaled_channel< int16_t, 100, 1 > crankingAdvance[CRANKING_ADVANCE_CURVE_SIZE]
float scriptTable1[SCRIPT_TABLE_8][SCRIPT_TABLE_8]
scaled_channel< uint8_t, 100, 1 > lambdaMaxDeviationTable[4][4]
uint8_t tcuSolenoidTable[TCU_SOLENOID_COUNT][TCU_GEAR_COUNT]
int8_t vvtTable2[SCRIPT_TABLE_8][SCRIPT_TABLE_8]
scaled_channel< uint8_t, 50, 1 > tcu_pcAirmassBins[TCU_MAGIC_SIZE]
scaled_channel< int8_t, 10, 1 > throttle2TrimTable[6][6]
scaled_channel< uint8_t, 1, 10 > iacPidMultRpmBins[IAC_PID_MULT_SIZE]
uint8_t pedalToTpsTable[PEDAL_TO_TPS_SIZE][PEDAL_TO_TPS_SIZE]
scaled_channel< int8_t, 1, 2 > cltIdleRpmBins[CLT_CURVE_SIZE]
scaled_channel< uint8_t, 1, 100 > boostRpmBins[BOOST_RPM_COUNT]
float tpsTpsAccelFromRpmBins[TPS_TPS_ACCEL_TABLE]
scaled_channel< uint16_t, 10, 1 > veTable[FUEL_LOAD_COUNT][FUEL_RPM_COUNT]
float narrowToWideOxygenBins[NARROW_BAND_WIDE_BAND_CONVERSION_SIZE]
scaled_channel< int16_t, 10, 1 > ALSTimingRetardTable[4][4]
uint8_t scriptTable2[SCRIPT_TABLE_8][SCRIPT_TABLE_8]
scaled_channel< uint8_t, 1, 2 > boostTableClosedLoop[BOOST_LOAD_COUNT][BOOST_RPM_COUNT]
scaled_channel< uint8_t, 1, 100 > throttle2TrimRpmBins[6]
scaled_channel< uint8_t, 2, 1 > boostTableOpenLoop[BOOST_LOAD_COUNT][BOOST_RPM_COUNT]
scaled_channel< uint16_t, 100, 1 > crankingFuelCoefE100[CRANKING_CURVE_SIZE]
scaled_channel< uint16_t, 100, 1 > mapEstimateTpsBins[FUEL_LOAD_COUNT]
float afterstartDecayTime[AFTERSTART_DECAY_CURVE_SIZE]
scaled_channel< uint8_t, 1, 50 > idleAdvanceBins[IDLE_ADVANCE_CURVE_SIZE]
int16_t injectionPhase[FUEL_LOAD_COUNT][FUEL_RPM_COUNT]
float cltCrankingCorrBins[CLT_CRANKING_CURVE_SIZE]
scaled_channel< uint16_t, 10, 1 > idleVeTable[IDLE_VE_SIZE][IDLE_VE_SIZE]
scaled_channel< int16_t, 10, 1 > ignitionTable[IGN_LOAD_COUNT][IGN_RPM_COUNT]
scaled_channel< uint8_t, 2, 1 > iacCoasting[CLT_CURVE_SIZE]
float afterstartCoolantBins[AFTERSTART_HOLD_CURVE_SIZE]
uint16_t crankingAdvanceBins[CRANKING_ADVANCE_CURVE_SIZE]
float narrowToWideOxygen[NARROW_BAND_WIDE_BAND_CONVERSION_SIZE]
scaled_channel< uint8_t, 1, 20 > cltIdleRpm[CLT_CURVE_SIZE]
scaled_channel< uint8_t, 1, 5 > ignitionIatCorrLoadBins[8]
scaled_channel< uint16_t, 100, 1 > sparkDwellValues[DWELL_CURVE_SIZE]
scaled_channel< uint8_t, 147, 1 > lambdaTable[FUEL_LOAD_COUNT][FUEL_RPM_COUNT]
blend_table_s boostClosedLoopBlends[BOOST_BLEND_COUNT]
scaled_channel< uint16_t, 100, 1 > mapEstimateTable[FUEL_LOAD_COUNT][FUEL_RPM_COUNT]
scaled_channel< uint8_t, 1, 100 > maxKnockRetardRpmBins[6]
scaled_channel< uint16_t, 10, 1 > timeConstant
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, 1, 50 > rpmBins[6]
scaled_channel< uint8_t, 100, 1 > values[6]