Shrink output channels, use scaling (#1069)

* reorder fields

* temporary tle8888 fix

* comment, simplify

* hand tweak generated

* oops, those are reciprocal

* fix engineLoadAccelExtra

* aggressive priority order
This commit is contained in:
Matthew Kennedy 2019-12-19 17:37:42 -08:00 committed by rusefi
parent bf8cdee62c
commit 89405014cf
9 changed files with 361 additions and 269 deletions

View File

@ -1888,7 +1888,7 @@
#define triggerSimulatorPins3_offset 738 #define triggerSimulatorPins3_offset 738
#define triggerSimulatorPins3_offset_hex 2e2 #define triggerSimulatorPins3_offset_hex 2e2
#define TS_FILE_VERSION 20190701 #define TS_FILE_VERSION 20190701
#define TS_OUTPUT_SIZE 356 #define TS_OUTPUT_SIZE 220
#define ts_show_cj125 true #define ts_show_cj125 true
#define ts_show_egt true #define ts_show_egt true
#define ts_show_etb true #define ts_show_etb true

View File

@ -13,6 +13,44 @@
#include "rusefi_types.h" #include "rusefi_types.h"
#include "tunerstudio_debug_struct.h"
// This class lets us transparently store something at a ratio inside an integer type
// Just use it like a float - you can read and write to it, like this:
// scaled_channel<uint8_t, 10> myVar;
// myVar = 2.4f; // converts to an int, stores 24
// float x = myVar; // converts back to float, returns 2.4f
template <typename T, int mult = 1>
class scaled_channel {
public:
scaled_channel() : m_value(static_cast<T>(0)) { }
scaled_channel(float val)
: m_value(val * mult)
{
}
// Allow reading back out as a float (note: this may be lossy!)
operator float() const {
return m_value / (float)mult;
}
private:
T m_value;
};
static_assert(sizeof(scaled_channel<uint8_t>) == 1);
static_assert(sizeof(scaled_channel<uint16_t>) == 2);
static_assert(sizeof(scaled_channel<uint32_t>) == 4);
static_assert(sizeof(scaled_channel<float>) == 4);
using scaled_temperature = scaled_channel<int16_t, 100>; // +-327 deg C at 0.01 deg resolution
using scaled_ms = scaled_channel<int16_t, 300>; // +- 100ms at 0.003ms precision
using scaled_percent = scaled_channel<int16_t, 100>; // +-327% at 0.01% resolution
using scaled_pressure = scaled_channel<uint16_t, 30>; // 0-2000kPa (~300psi) at 0.03kPa resolution
using scaled_angle = scaled_channel<int16_t, 50>; // +-655 degrees at 0.02 degree resolution
using scaled_voltage = scaled_channel<uint16_t, 1000>; // 0-65v at 1mV resolution
using scaled_afr = scaled_channel<uint16_t, 1000>; // 0-65afr at 0.001 resolution
#define PAGE_COUNT 1 #define PAGE_COUNT 1
typedef struct { typedef struct {
@ -24,36 +62,7 @@ typedef struct {
*/ */
typedef struct { typedef struct {
/* see also [OutputChannels] in rusefi.input */ /* see also [OutputChannels] in rusefi.input */
// primary instrument cluster gauges
int rpm; // size 4, offset 0
/**
* This value is in Celcius - UI would convert into F if needed
*/
float coolantTemperature; // size 4, offset 4
float intakeAirTemperature; // size 4, offset 8
float throttlePositon; // size 4, offset 12
float massAirFlowVoltage; // size 4, offset 16
float airFuelRatio; // size 4, offset 20
float engineLoad; // size 4, offset 24
float vBatt; // size 4, offset 28
short int tpsADC; // size 2, offset 32
short int alignment; // size 2, offset 34
float baroPressure; // size 4, offset 36
float manifoldAirPressure; // size 4, offset 40
float crankingFuelMs; // offset 44
/**
* This is the raw value we take from the fuel map or base fuel algorithm, before the corrections
*/
float fuelBase; // 48
float tCharge; // 52
float ignitionAdvance; // 56
float sparkDwell; // 60
/**
* this one contains total resulting fuel squirt time, per event
* With all corrections and injector lag. See also baseFuel
*/
float actualLastInjection; // 64
float debugFloatField1; // 68
/** /**
* Yes, I do not really enjoy packing bits into integers but we simply have too many boolean flags and I cannot * Yes, I do not really enjoy packing bits into integers but we simply have too many boolean flags and I cannot
* water 4 bytes per traffic - I want gauges to work as fast as possible * water 4 bytes per traffic - I want gauges to work as fast as possible
@ -76,107 +85,138 @@ typedef struct {
unsigned int brakePedalState : 1; // bit 15. 0 - not pressed, 1 = pressed unsigned int brakePedalState : 1; // bit 15. 0 - not pressed, 1 = pressed
unsigned int toothLogReady : 1; // bit 16 unsigned int toothLogReady : 1; // bit 16
unsigned int acSwitchState : 1; // bit 17. 0 - not pressed, 1 = pressed unsigned int acSwitchState : 1; // bit 17. 0 - not pressed, 1 = pressed
float vehicleSpeedKph; // 76 unsigned int isTpsError : 1; // bit 18
unsigned int isTpsError : 1; // bit 0, 80 unsigned int isCltError : 1; // bit 19
unsigned int isCltError : 1; // bit 1 unsigned int isMapError : 1; // bit 20
unsigned int isMapError : 1; // bit 2 unsigned int isIatError : 1; // bit 21
unsigned int isIatError : 1; // bit 3 unsigned int isAcSwitchEngaged : 1; // bit 22
unsigned int isAcSwitchEngaged : 1; // bit 4 unsigned int isTriggerError : 1; // bit 23
unsigned int isTriggerError : 1; // bit 5 unsigned int hasFatalError : 1; // bit 24
unsigned int hasFatalError : 1; // bit 6 unsigned int isWarnNow : 1; // bit 25
unsigned int isWarnNow : 1; // bit 7 unsigned int unused80b8 : 1; // bit 26
unsigned int unused80b8 : 1; // bit 8 unsigned int isKnockChipOk : 1; // bit 27
unsigned int isKnockChipOk : 1; // bit 9
int tsConfigVersion; // 84 // RPM, vss
egt_values_s egtValues; // 88 scaled_channel<uint16_t, 4> rpm; // 4
float rpmAcceleration; // 104 scaled_percent rpmAcceleration; // 6
float massAirFlow; // 108 scaled_percent speedToRpmRatio; // 8
/** scaled_channel<uint8_t> vehicleSpeedKph; // 10
* Current volumetric efficiency
*/ // temperatures
float veValue; // offset 112 scaled_channel<uint8_t> internalMcuTemperature; // offset 11
/** scaled_temperature coolantTemperature; // offset 12
* TPS value delta within specified number of cycles scaled_temperature intakeAirTemperature; // offset 14
* See tpsAccelFuel scaled_temperature auxTemp1; // offset 16
*/ scaled_temperature auxTemp2; // offset 18
float deltaTps; // offset 116
int triggerErrorsCounter; // offset 120 // throttle, pedal
/** scaled_percent throttlePosition; // 20
* Engine load delta scaled_percent pedalPosition; // 22
*/ uint16_t tpsADC; // 24
float engineLoadAccelExtra; // offset 124
float tpsAccelFuel; // offset 128 // air flow/mass measurment
float baroCorrection; // 132 scaled_voltage massAirFlowVoltage; // 26
float pedalPosition; // 136 scaled_channel<uint16_t, 100> massAirFlow; // 28
/** scaled_pressure manifoldAirPressure; // 30
* @see coilDutyCycle scaled_pressure baroPressure; // 32
*/
float injectorDutyCycle; // 140 scaled_afr airFuelRatio; // 34
int knockCount; // 144 scaled_channel<uint16_t, 100> engineLoad; // 36
float fuelTankLevel; // 148
float knockLevel; // 152 scaled_voltage vBatt; // 38
int totalTriggerErrorCounter; // 156 scaled_pressure oilPressure; // 40
float wallFuelAmount; // 160 scaled_angle vvtPosition; // 42
/**
* multiplier, 1 means no correction, 1.20 means 20% extra // Fuel math
*/ scaled_channel<uint16_t, 1000> chargeAirMass; // 44
float iatCorrection; // 164 scaled_ms crankingFuelMs; // 46
floatms_t wallFuelCorrection; // 168 scaled_afr currentTargetAfr; // 48
float idlePosition; // 172 // This is the raw value we take from the fuel map or base fuel algorithm, before the corrections
float currentTargetAfr; // 176 scaled_ms fuelBase; // 50
float chargeAirMass; // 180 // Total fuel with CLT, IAT and TPS acceleration without injector lag corrections per cycle, as pulse per cycle
/** scaled_ms fuelRunning; // 52
* multiplier, 1 means no correction, 1.20 means 20% extra // Actual last injection time - including all compensation and injection mode
*/ scaled_ms actualLastInjection; // 54
float cltCorrection; // 184 scaled_channel<uint8_t, 2> injectorDutyCycle; // 56
/** scaled_channel<uint8_t, 2> veValue; // 57
* Total fuel with CLT, IAT and TPS acceleration without injector lag corrections per cycle, scaled_angle injectionOffset; // 58
* as squirt duration. scaled_temperature tCharge; // 60
*
* @see actualLastInjection // Corrections
*/ scaled_ms injectorLagMs; // 62
float fuelRunning; // 188 scaled_percent iatCorrection; // 64
int debugIntField1; // 192 scaled_percent cltCorrection; // 66
float injectorLagMs; // 196 scaled_percent baroCorrection; // 68
float debugFloatField2; // 200 scaled_ms fuelPidCorrection; // 70
float debugFloatField3; // 204
float debugFloatField4; // 208 // Wall model AE
float debugFloatField5; // 212 scaled_ms wallFuelAmount; // 72
int debugIntField2; // 216 scaled_channel<int16_t, 1000> wallFuelCorrection; // 74
int debugIntField3; // 220
int timeSeconds; // 224 // TPS/load AE
float engineLoadDelta; // 228 scaled_percent engineLoadDelta; // 76
float speedToRpmRatio; // 232 scaled_percent deltaTps; // 78
int16_t warningCounter; // 236 scaled_percent engineLoadAccelExtra; // 80
int16_t unused_238; scaled_ms tpsAccelFuel; // 82
int16_t lastErrorCode; // 240
int16_t unused_242; // Ignition
/** scaled_angle ignitionAdvance; // 84
* Microcontroller own internal temperature, C scaled_ms sparkDwell; // 86
*/ scaled_percent coilDutyCycle; // 88
float internalMcuTemperature; // 244
float vvtPosition; // 248 // Idle & ETB
int engineMode; // 252 scaled_percent idlePosition; // 90
float debugFloatField6; // 256 scaled_percent etbTarget; // 92
float debugFloatField7; // 260 scaled_percent etb1DutyCycle; // 94
int firmwareVersion; // 264 scaled_percent etb1Error; // 96
float fuelPidCorrection; // 268
/** // Fuel system
* @see injectorDutyCycle scaled_percent fuelTankLevel; // 98
*/ float fuelConsumptionPerHour; // 100
float coilDutyCycle; // 272
int16_t accelerationX; // 276 // Knock
int16_t accelerationY; // 278 uint32_t knockCount; // 104
float oilPressure; // 280 float knockLevel; // 108
float fuelConsumptionPerHour; // 284
float injectionOffset; // 288 // Mode, firmware, protocol, run time
int16_t debugIntField4; // 292 uint32_t timeSeconds; // 112
int16_t debugIntField5; // 294 uint32_t engineMode; // 116
int16_t recentErrorCodes[8]; // 298 uint32_t firmwareVersion; // 120
float etbTarget; // 312 uint32_t tsConfigVersion; // 124
float etb1DutyCycle; // 316
float etb1Error; // 320 // Errors
int unused3[8]; int triggerErrorsCounter; // 128
int totalTriggerErrorCounter; // 132
int16_t warningCounter; // 136
int16_t lastErrorCode; // 138
int16_t recentErrorCodes[8]; // 140
// Debug
float debugFloatField1; // 156
float debugFloatField2;
float debugFloatField3;
float debugFloatField4;
float debugFloatField5;
float debugFloatField6;
float debugFloatField7;
int debugIntField1;
int debugIntField2;
int debugIntField3;
int16_t debugIntField4;
int16_t debugIntField5; // 198
// accelerometer
int16_t accelerationX; // 200
int16_t accelerationY; // 202
// EGT
egt_values_s egtValues; // 204
// Temporary - will remove soon
TsDebugChannels* getDebugChannels() {
return reinterpret_cast<TsDebugChannels*>(&debugFloatField1);
}
/* see also [OutputChannels] in rusefi.input */ /* see also [OutputChannels] in rusefi.input */
} TunerStudioOutputChannels; } TunerStudioOutputChannels;

View File

@ -0,0 +1,16 @@
#pragma once
typedef struct {
float debugFloatField1; // 180
float debugFloatField2;
float debugFloatField3;
float debugFloatField4;
float debugFloatField5;
float debugFloatField6;
float debugFloatField7;
int debugIntField1;
int debugIntField2;
int debugIntField3;
int16_t debugIntField4;
int16_t debugIntField5;
} TsDebugChannels;

View File

@ -726,7 +726,7 @@ void updateTunerStudioState(TunerStudioOutputChannels *tsOutputChannels DECLARE_
// offset 8 // offset 8
tsOutputChannels->intakeAirTemperature = intake; tsOutputChannels->intakeAirTemperature = intake;
// offset 12 // offset 12
tsOutputChannels->throttlePositon = tps; tsOutputChannels->throttlePosition = tps;
// offset 16 // offset 16
tsOutputChannels->massAirFlowVoltage = hasMafSensor() ? getMafVoltage(PASS_ENGINE_PARAMETER_SIGNATURE) : 0; tsOutputChannels->massAirFlowVoltage = hasMafSensor() ? getMafVoltage(PASS_ENGINE_PARAMETER_SIGNATURE) : 0;
@ -1021,7 +1021,7 @@ void updateTunerStudioState(TunerStudioOutputChannels *tsOutputChannels DECLARE_
break; break;
case DBG_TLE8888: case DBG_TLE8888:
#if (BOARD_TLE8888_COUNT > 0) #if (BOARD_TLE8888_COUNT > 0)
tle8888PostState(tsOutputChannels); tle8888PostState(tsOutputChannels->getDebugChannels());
#endif /* BOARD_TLE8888_COUNT */ #endif /* BOARD_TLE8888_COUNT */
break; break;
default: default:

View File

@ -1946,7 +1946,7 @@
#define triggerSimulatorPins3_offset 738 #define triggerSimulatorPins3_offset 738
#define triggerSimulatorPins3_offset_hex 2e2 #define triggerSimulatorPins3_offset_hex 2e2
#define TS_FILE_VERSION 20190701 #define TS_FILE_VERSION 20190701
#define TS_OUTPUT_SIZE 356 #define TS_OUTPUT_SIZE 220
#define ts_show_cj125 true #define ts_show_cj125 true
#define ts_show_egt true #define ts_show_egt true
#define ts_show_etb true #define ts_show_etb true

View File

@ -145,14 +145,14 @@ static const char* tle8888_pin_names[TLE8888_OUTPUTS] = {
}; };
#if EFI_TUNER_STUDIO #if EFI_TUNER_STUDIO
void tle8888PostState(TunerStudioOutputChannels *tsOutputChannels) { void tle8888PostState(TsDebugChannels *debugChannels) {
tsOutputChannels->debugIntField1 = tle8888SpiCounter; debugChannels->debugIntField1 = tle8888SpiCounter;
tsOutputChannels->debugIntField2 = spiTxb; debugChannels->debugIntField2 = spiTxb;
tsOutputChannels->debugIntField3 = spiRxb; debugChannels->debugIntField3 = spiRxb;
tsOutputChannels->debugIntField4 = initResponsesAccumulator; debugChannels->debugIntField4 = initResponsesAccumulator;
tsOutputChannels->debugIntField5 = reinitializationCounter; debugChannels->debugIntField5 = reinitializationCounter;
tsOutputChannels->debugFloatField1 = initResponse0; debugChannels->debugFloatField1 = initResponse0;
tsOutputChannels->debugFloatField2 = initResponse1; debugChannels->debugFloatField2 = initResponse1;
} }
#endif /* EFI_TUNER_STUDIO */ #endif /* EFI_TUNER_STUDIO */

View File

@ -54,8 +54,8 @@ int tle8888_add(unsigned int index, const struct tle8888_config *cfg);
void requestTLE8888initialization(void); void requestTLE8888initialization(void);
#if EFI_TUNER_STUDIO #if EFI_TUNER_STUDIO
#include "tunerstudio_configuration.h" #include "tunerstudio_debug_struct.h"
void tle8888PostState(TunerStudioOutputChannels *tsOutputChannels); void tle8888PostState(TsDebugChannels *tsDebugChannels);
#endif /* EFI_TUNER_STUDIO */ #endif /* EFI_TUNER_STUDIO */
#ifdef __cplusplus #ifdef __cplusplus

View File

@ -68,7 +68,7 @@ struct_no_prefix engine_configuration_s
#define ETB_BIAS_CURVE_LENGTH 8 #define ETB_BIAS_CURVE_LENGTH 8
! this is here so that rusEfi console can access it, too ! this is here so that rusEfi console can access it, too
#define TS_OUTPUT_SIZE 356 #define TS_OUTPUT_SIZE 224
#define MAP_ANGLE_SIZE 8 #define MAP_ANGLE_SIZE 8
#define MAP_WINDOW_SIZE 8 #define MAP_WINDOW_SIZE 8

View File

@ -167,136 +167,172 @@ fileVersion = { 20190701 }
; ;
; see TunerStudioOutputChannels struct ; see TunerStudioOutputChannels struct
; ;
RPMValue = scalar, U32, 0, "RPM", 1, 0.00000
; Bit flags
hasSdCard = bits, U32, 0, [0:0], "true", "false";
isIgnitionEnabledIndicator=bits,U32, 0, [1:1], "true", "false";
ind_injection_enabled=bits,U32, 0, [2:2], "true", "false";
isCylinderCleanupEnabled=bits,U32, 0, [3:3], "true", "false";
isCylinderCleanupActivated=bits,U32, 0, [4:4], "true", "false";
ind_fuel_pump = bits, U32, 0, [5:5], "true", "false";
ind_fan = bits, U32, 0, [6:6], "true", "false";
ind_o2_heater = bits, U32, 0, [7:7], "true", "false";
ind_check_engine= bits, U32, 0, [8:8], "true", "false";
needBurn = bits, U32, 0, [9:9], "true", "false";
ind_2nd_trigger_en=bits, U32, 0, [10:10], "true", "false";
clutchUpState =bits, U32, 0, [11:11], "true", "false";
clutchDownState =bits, U32, 0, [12:12], "true", "false";
knockEverIndicator=bits, U32, 0, [13:13], "true", "false";
knockNowIndicator=bits, U32, 0, [14:14], "true", "false";
brakePedalIndicator=bits, U32, 0, [15:15], "true", "false";
toothLogReady =bits, U32, 0, [16:16], "true", "false";
acSwitchIndicator =bits, U32, 0, [17:17], "true", "false";
ind_tps_error = bits, U32, 0, [18:18], "true", "false";
ind_clt_error = bits, U32, 0, [19:19], "true", "false";
ind_map_error = bits, U32, 0, [20:21], "true", "false";
ind_iat_error = bits, U32, 0, [21:22], "true", "false";
ind_isTriggerError = bits, U32, 0, [23:23], "true", "false";
ind_hasFatalError=bits, U32, 0, [24:24], "true", "false";
ind_isWarnNow =bits, U32, 0, [25:25], "true", "false";
; RPM, vss
RPMValue = scalar, U16, 4, "RPM", 0.25, 0.00000
rpmAcceleration = scalar, S16, 6, "dRpm", 0.01, 0
speedToRpmRatio = scalar, S16, 8, "value", 0.01, 0
vehicleSpeedKph = scalar, U16, 10, "kph", 0.01, 0.0
; temperatures
internalMcuTemperature = scalar,S08, 11, "deg C", 1, 0
#if CELSIUS #if CELSIUS
coolant = scalar, F32, 4, "deg C", 1, 0.0 coolant = scalar, S16, 12, "deg C", 0.01, 0.0
#else #else
coolant = scalar, F32, 4, "deg F", {9/5}, 17.77777 coolant = scalar, S16, 12, "deg F",{9/500}, 17.77777
#endif #endif
#if CELSIUS #if CELSIUS
intake = scalar, F32, 8, "deg C", 1, 0.0 intake = scalar, S16, 14, "deg C", 0.01, 0.0
#else #else
intake = scalar, F32, 8, "deg F", {9/5}, 17.77777 intake = scalar, S16, 14, "deg F",{9/500}, 17.77777
#endif #endif
TPSValue = scalar, F32, 12, "%", 1, 0 ; todo: aux1
MAFValue = scalar, F32, 16, "V", 1, 0 ; todo: aux2
AFRValue = scalar, F32, 20, "AFR", 1, 0.0
engineLoad = scalar, F32, 24, "%", 1, 0.0 ; Blend of MAP and TPS, depends on algorithm
VBatt = scalar, F32, 28, "V", 1, 0.0 ; throttle, pedal
TPSValue = scalar, U16, 20, "%", 0.01, 0
throttlePedalPosition = scalar,U16, 22, "%", 0.01, 0
tpsADC = scalar, U16, 24, "ADC", 1, 0.0;
; air flow/mass measurments
MAFValue = scalar, U16, 26, "V",0.001, 0
massAirFlowValue= scalar, U16, 28, "Kg/h", 0.01, 0
MAPValue = scalar, U16, 30, "kPa",{1/30}, 0.0
baroPressure = scalar, U16, 32, "kPa",{1/30}, 0.0
AFRValue = scalar, U16, 34, "AFR",0.001, 0.0
engineLoad = scalar, U16, 36, "%", 0.01, 0.0 ; Blend of MAP and TPS, depends on algorithm
; misc sensors
VBatt = scalar, U16, 38, "V",0.001, 0.0
oilPressure = scalar, U16, 40, "kPa",{1/30}, 0.0
vvtPosition = scalar, U16, 42, "deg", 0.02, 0
; 10 bit TPS ADC value (from 0 to 1023 in 5v scale) ; 10 bit TPS ADC value (from 0 to 1023 in 5v scale)
tpsADC = scalar, U16, 32, "ADC", 1, 0.0; ;tpsADC2 = scalar, U16, 44, "ADC", 1, 0.0;
tpsADC2 = scalar, U16, 34, "ADC", 1, 0.0;
baroPressure = scalar, F32, 36, "pres", 1, 0.0; ; fuel math
MAPValue = scalar, F32, 40, "MAP", 1, 0.0; chargeAirMass = scalar, U16, 44, "g",0.001, 0
; total fuel squirt duration (in MS) per engine cycle according to current CLT crankingFuelMs = scalar, U16, 46, "ms",{1/300}, 0.0
crankingFuelMs = scalar, F32, 44, "ms", 1, 0.0; currentTargetAfr= scalar, U16, 48, "ratio",0.001, 0
baseFuel = scalar, F32, 48, "ms", 1, 0 baseFuel = scalar, U16, 50, "ms",{1/300}, 0
tCharge = scalar, F32, 52, "T", 1, 0.0; fuelRunning = scalar, U16, 52, "ms",{1/300}, 0
ignitionAdvance = scalar, F32, 56, "deg", 1, 0.0; actualLastInjection=scalar,U16, 54, "ms",{1/300}, 0.0
sparkDwellValue = scalar, F32, 60, "ms", 1, 0.0; injectorDutyCycle=scalar, U08, 56, "%", 0.5, 0
; actual total Ms time per engine cycle with all corrections veValue = scalar, U08, 57, "ratio", 0.5, 0
actualLastInjection = scalar, F32, 64, "ms", 1, 0.0; injectionOffset = scalar, S16, 58, "deg", 0.02, 0
debugFloatField1 = scalar, F32, 68, "val", 1, 0.0; tCharge = scalar, U16, 60, "deg C", 0.01, 0.0
hasSdCard = bits, U32, 72, [0:0], "true", "false"; ; Corrections
isIgnitionEnabledIndicator=bits, U32, 72, [1:1], "true", "false"; injectorLagMs = scalar, U16, 62, "ms",{1/300}, 0.0
ind_injection_enabled=bits,U32, 72, [2:2], "true", "false"; iatCorrection = scalar, U16, 64, "%", 0.01, 0
isCylinderCleanupEnabled=bits, U32, 72, [3:3], "true", "false"; cltCorrection = scalar, U16, 66, "%", 0.01, 0
isCylinderCleanupActivated=bits,U32,72, [4:4], "true", "false"; baroCorrection = scalar, U16, 68, "%", 0.01, 0
ind_fuel_pump = bits, U32, 72, [5:5], "true", "false"; fuelPidCorrection=scalar, S16, 70, "ms",{1/300}, 0
ind_fan = bits, U32, 72, [6:6], "true", "false";
ind_o2_heater = bits, U32, 72, [7:7], "true", "false"; ; Wall model AE
ind_check_engine= bits, U32, 72, [8:8], "true", "false"; wallFuelAmount = scalar, U16, 72, "ms",{1/300}, 0
needBurn = bits, U32, 72, [9:9], "true", "false"; wallFuelCorrection=scalar, S16, 74, "ms",0.001, 0
ind_2nd_trigger_en=bits, U32, 72, [10:10], "true", "false";
clutchUpState =bits, U32, 72, [11:11], "true", "false"; ; TPS/load AE
clutchDownState =bits, U32, 72, [12:12], "true", "false"; engineLoadDelta = scalar, S16, 76, "value", 0.01, 0
knockEverIndicator=bits, U32, 72, [13:13], "true", "false"; deltaTps = scalar, S16, 78, "ratio", 0.01, 0
knockNowIndicator=bits, U32, 72, [14:14], "true", "false"; engineLoadAccelExtra=scalar,S16, 80, "value", 0.01, 0
brakePedalIndicator=bits, U32, 72, [15:15], "true", "false"; tpsAccelFuel = scalar, U16, 82, "ms",{1/300}, 0
toothLogReady =bits, U32, 72, [16:16], "true", "false";
acSwitchIndicator =bits, U32, 72, [17:17], "true", "false"; ; Ignition
vehicleSpeedKph = scalar, F32, 76, "kph", 1, 0.0; ignitionAdvance = scalar, U16, 84, "deg", 0.02, 0.0
sparkDwellValue = scalar, U16, 86, "ms",{1/300}, 0.0
ind_tps_error = bits, U32, 80, [0:0], "true", "false"; coilDutyCycle = scalar, U16, 88, "%", 0.01, 0
ind_clt_error = bits, U32, 80, [1:1], "true", "false";
ind_map_error = bits, U32, 80, [2:2], "true", "false"; ; Idle & ETB
ind_iat_error = bits, U32, 80, [3:3], "true", "false"; idleAirValvePosition=scalar,S16, 90, "%", 0.01, 0
ind_isTriggerError = bits, U32, 80, [5:5], "true", "false"; etbTarget = scalar, S16, 92, "%", 0.01, 0
ind_hasFatalError=bits, U32, 80, [6:6], "true", "false"; etb1DutyCycle = scalar, S16, 94, "%", 0.01, 0
ind_isWarnNow =bits, U32, 80, [7:7], "true", "false"; etb1Error = scalar, S16, 96, "%", 0.01, 0
firmwareTsVersion = scalar,U32, 84, "version_p", 1, 0
egt1 = scalar, S16, 88, "deg C", 1, 0 ; Fuel system
egt2 = scalar, S16, 90, "deg C", 1, 0 fuelTankLevel = scalar, S16, 98, "amount", 0.01, 0
egt3 = scalar, S16, 92, "deg C", 1, 0 fuelConsumptionPerHour=scalar,F32, 100, "kPa", 1, 0.0
egt4 = scalar, S16, 94, "deg C", 1, 0
egt5 = scalar, S16, 96, "deg C", 1, 0 ; Knock
egt6 = scalar, S16, 98, "deg C", 1, 0 knockCount = scalar, U32, 104,"counter", 1, 0
egt7 = scalar, S16, 100, "deg C", 1, 0 knockLevel = scalar, F32, 108, "Volts", 1, 0
egt8 = scalar, S16, 102, "deg C", 1, 0
rpmAcceleration = scalar, F32, 104, "dRpm", 1, 0 ; Mode, firmware, protocol, run time
massAirFlowValue= scalar, F32, 108, "Kg/h", 1, 0 timeSeconds = scalar, U32, 112, "sec", 1, 0.0
veValue = scalar, F32, 112, "ratio", 1, 0 engineMode = scalar, U32, 116, "em", 1, 0.0;
deltaTps = scalar, F32, 116, "ratio", 1, 0 firmwareVersion = scalar, U32, 120,"version_f", 1, 0
triggerErrorsCounter = scalar, U32,120, "counter", 1, 0 firmwareTsVersion=scalar, U32, 124,"version_p", 1, 0
engineLoadAccelExtra = scalar,F32, 124, "value", 1, 0
tpsAccelFuel = scalar, F32, 128, "ms", 1, 0 ; Errors
baroCorrection = scalar, F32, 132, "%", 1, 0 triggerErrorsCounter=scalar,U32, 128,"counter", 1, 0
throttlePedalPosition = scalar, F32, 136, "%", 1, 0 ; totalTriggerErrorCounter 132
injectorDutyCycle= scalar, F32, 140, "%", 1, 0 warningCounter = scalar, U16, 136, "count", 1, 0
knockCount = scalar, U32, 144, "counter", 1, 0 lastErrorCode = scalar, U16, 138, "error", 1, 0
fuelTankLevel = scalar, F32, 148, "amount", 1, 0 recentErrorCode0= scalar, U16, 140, "error", 1, 0
knockLevel = scalar, F32, 152, "Volts", 1, 0 recentErrorCode1= scalar, U16, 142, "error", 1, 0
; totalTriggerErrorCounter 156 recentErrorCode2= scalar, U16, 144, "error", 1, 0
wallFuelAmount = scalar, F32, 160, "ms", 1, 0 recentErrorCode3= scalar, U16, 146, "error", 1, 0
iatCorrection = scalar, F32, 164, "%", 1, 0 recentErrorCode4= scalar, U16, 148, "error", 1, 0
wallFuelCorrection = scalar, F32, 168, "ms", 1, 0 recentErrorCode5= scalar, U16, 150, "error", 1, 0
idleAirValvePosition = scalar, F32, 172, "percent", 1, 0 recentErrorCode6= scalar, U16, 152, "error", 1, 0
currentTargetAfr = scalar, F32, 176, "ratio", 1, 0 recentErrorCode7= scalar, U16, 154, "error", 1, 0
chargeAirMass = scalar, F32, 180, "g", 1, 0
cltCorrection = scalar, F32, 184, "%", 1, 0 ; Debug
fuelRunning = scalar, F32, 188, "g", 1, 0 debugFloatField1= scalar, F32, 156, "val", 1, 0.0
debugIntField1 = scalar, S32, 192, "val", 1, 0.0; debugFloatField2= scalar, F32, 160, "val", 1, 0.0
injectorLagMs = scalar, F32, 196, "ms", 1, 0.0; debugFloatField3= scalar, F32, 164, "val", 1, 0.0
debugFloatField2 = scalar, F32, 200, "val", 1, 0.0; debugFloatField4= scalar, F32, 168, "val", 1, 0.0
debugFloatField3 = scalar, F32, 204, "val", 1, 0.0; debugFloatField5= scalar, F32, 172, "val", 1, 0.0
debugFloatField4 = scalar, F32, 208, "val", 1, 0.0; debugFloatField6= scalar, F32, 176, "val", 1, 0.0
debugFloatField5 = scalar, F32, 212, "val", 1, 0.0; debugFloatField7= scalar, F32, 180, "val", 1, 0.0
debugIntField2 = scalar, S32, 216, "val", 1, 0.0; debugIntField1 = scalar, S32, 184, "val", 1, 0.0
debugIntField3 = scalar, S32, 220, "val", 1, 0.0; debugIntField2 = scalar, S32, 188, "val", 1, 0.0
timeSeconds = scalar, U32, 224, "sec", 1, 0.0; debugIntField3 = scalar, S32, 192, "val", 1, 0.0
engineLoadDelta = scalar,F32, 228, "value", 1, 0 debugIntField4 = scalar, S16, 196, "val", 1, 0.0
speedToRpmRatio = scalar,F32, 232, "value", 1, 0 debugIntField5 = scalar, S16, 198, "val", 1, 0.0
warningCounter = scalar,U16, 236, "count", 1, 0
; Accel
lastErrorCode = scalar,U16, 240, "error", 1, 0 accelerationX = scalar, S16, 200, "G", 0.01, 0
accelerationY = scalar, S16, 202, "G", 0.01, 0
internalMcuTemperature = scalar,F32, 244, "C", 1, 0
vvtPosition = scalar,F32, 248, "deg", 1, 0 ; egt
engineMode = scalar, U32, 252, "em", 1, 0.0; egt1 = scalar, S16, 204, "deg C", 1, 0
debugFloatField6 = scalar, F32, 256, "val", 1, 0.0; egt2 = scalar, S16, 206, "deg C", 1, 0
debugFloatField7 = scalar, F32, 260, "val", 1, 0.0; egt3 = scalar, S16, 208, "deg C", 1, 0
firmwareVersion = scalar,U32, 264, "version_f", 1, 0 egt4 = scalar, S16, 210, "deg C", 1, 0
fuelPidCorrection = scalar, F32, 268, "ms", 1, 0 egt5 = scalar, S16, 212, "deg C", 1, 0
coilDutyCycle = scalar, F32, 272, "perc", 1, 0 egt6 = scalar, S16, 214, "deg C", 1, 0
accelerationX = scalar, S16, 276, "G", 0.01, 0 egt7 = scalar, S16, 216, "deg C", 1, 0
accelerationY = scalar, S16, 278, "G", 0.01, 0 egt8 = scalar, S16, 218, "deg C", 1, 0
oilPressure = scalar, F32, 280, "kPa", 1, 0.0
fuelConsumptionPerHour=scalar, F32, 284, "kPa", 1, 0.0
injectionOffset = scalar, F32, 288, "deg", 1, 0;
debugIntField4 = scalar, S16, 292, "val", 1, 0.0;
debugIntField5 = scalar, S16, 294, "val", 1, 0.0;
recentErrorCode0 = scalar,U16, 296, "error", 1, 0
recentErrorCode1 = scalar,U16, 298, "error", 1, 0
recentErrorCode2 = scalar,U16, 300, "error", 1, 0
recentErrorCode3 = scalar,U16, 302, "error", 1, 0
recentErrorCode4 = scalar,U16, 304, "error", 1, 0
recentErrorCode5 = scalar,U16, 306, "error", 1, 0
recentErrorCode6 = scalar,U16, 308, "error", 1, 0
recentErrorCode7 = scalar,U16, 310, "error", 1, 0
etbTarget = scalar,F32, 312, "%", 1, 0
etb1DutyCycle = scalar,F32, 316, "%", 1, 0
etb1Error = scalar,F32, 320, "%", 1, 0
; ;