diff --git a/firmware/console/binary/tunerstudio.cpp b/firmware/console/binary/tunerstudio.cpp index d4806e21c1..158ad1121a 100644 --- a/firmware/console/binary/tunerstudio.cpp +++ b/firmware/console/binary/tunerstudio.cpp @@ -263,10 +263,14 @@ static const void * getStructAddr(int structId) { case LDS_TRIGGER_STATE_INDEX: return static_cast(&engine->triggerCentral); #if EFI_ELECTRONIC_THROTTLE_BODY - case LDS_ETB_STATE_INDEX: + case LDS_ETB_PID_STATE_INDEX: return static_cast(&etbPid); #endif /* EFI_ELECTRONIC_THROTTLE_BODY */ +#ifndef EFI_IDLE_CONTROL + // todo case LDS_IDLE_PID_STATE_INDEX: +#endif /* EFI_IDLE_CONTROL */ + default: return NULL; } diff --git a/firmware/controllers/actuators/electronic_throttle.cpp b/firmware/controllers/actuators/electronic_throttle.cpp index 0ca1be3531..47472b5488 100644 --- a/firmware/controllers/actuators/electronic_throttle.cpp +++ b/firmware/controllers/actuators/electronic_throttle.cpp @@ -256,6 +256,7 @@ class EtbController : public PeriodicTimerController { etbPid.showPidStatus(&logger, "ETB"); } + DISPLAY_STATE(Engine) DISPLAY(DISPLAY_IF(hasEtbPedalPositionSensor)) DISPLAY_TEXT(Electronic_Throttle); DISPLAY_SENSOR(TPS) @@ -265,6 +266,7 @@ DISPLAY(DISPLAY_IF(hasEtbPedalPositionSensor)) DISPLAY_SENSOR(PPS); DISPLAY_TEXT(eol); + DISPLAY_STATE(ETB_pid) DISPLAY_TEXT(Output); DISPLAY(DISPLAY_FIELD(output)); DISPLAY_TEXT(iTerm); diff --git a/firmware/controllers/algo/accel_enrichment.cpp b/firmware/controllers/algo/accel_enrichment.cpp index 3879272c70..c2eb5e94e9 100644 --- a/firmware/controllers/algo/accel_enrichment.cpp +++ b/firmware/controllers/algo/accel_enrichment.cpp @@ -94,6 +94,7 @@ floatms_t WallFuel::adjust(int injectorIndex, floatms_t desiredFuel DECLARE_ENGI // if tau is really small, we get div/0. // you probably meant to disable wwae. + DISPLAY_STATE(wall_fuel) float tau = CONFIG(DISPLAY_CONFIG(wwaeTau)); if (tau < 0.01f) { return desiredFuel; diff --git a/firmware/controllers/algo/fuel_math.cpp b/firmware/controllers/algo/fuel_math.cpp index 9b1349ef7a..a807bb0d62 100644 --- a/firmware/controllers/algo/fuel_math.cpp +++ b/firmware/controllers/algo/fuel_math.cpp @@ -41,6 +41,8 @@ extern baroCorr_Map3D_t baroCorrMap; #if EFI_ENGINE_CONTROL +DISPLAY_STATE(Engine) + DISPLAY(DISPLAY_IF(isCrankingState)) floatms_t getCrankingFuel3(float coolantTemperature, uint32_t revolutionCounterSinceStart DECLARE_ENGINE_PARAMETER_SUFFIX) { // these magic constants are in Celsius diff --git a/firmware/controllers/generated/engine_state_generated.h b/firmware/controllers/generated/engine_state_generated.h index 7df51b7b08..cf1681c37b 100644 --- a/firmware/controllers/generated/engine_state_generated.h +++ b/firmware/controllers/generated/engine_state_generated.h @@ -1,44 +1,9 @@ -// this section was generated automatically by rusEfi tool ConfigDefinition.jar based on integration/engine_state.txt Sat Aug 31 11:02:25 EDT 2019 +// this section was generated automatically by rusEfi tool ConfigDefinition.jar based on integration/engine_state.txt Sun Sep 01 11:57:51 EDT 2019 // by class com.rusefi.output.CHeaderConsumer // begin #ifndef CONTROLLERS_GENERATED_ENGINE_STATE_GENERATED_H #define CONTROLLERS_GENERATED_ENGINE_STATE_GENERATED_H #include "rusefi_types.h" -// start of pid_state_s -struct pid_state_s { - /** - * offset 0 - */ - float iTerm = (float)0; - /** - * we are remembering this only for debugging purposes - * offset 4 - */ - float dTerm = (float)0; - /** - * only used for logging - * offset 8 - */ - float target = (float)0; - /** - * only used for logging - * offset 12 - */ - float input = (float)0; - /** - * only used for logging - * offset 16 - */ - float output = (float)0; - /** - * offset 20 - */ - float errorAmplificationCoef = (float)0; - /** total size 24*/ -}; - -typedef struct pid_state_s pid_state_s; - // start of speed_density_s struct speed_density_s { /** @@ -248,4 +213,4 @@ typedef struct engine_state2_s engine_state2_s; #endif // end -// this section was generated automatically by rusEfi tool ConfigDefinition.jar based on integration/engine_state.txt Sat Aug 31 11:02:25 EDT 2019 +// this section was generated automatically by rusEfi tool ConfigDefinition.jar based on integration/engine_state.txt Sun Sep 01 11:57:51 EDT 2019 diff --git a/firmware/controllers/generated/pid_state_generated.h b/firmware/controllers/generated/pid_state_generated.h new file mode 100644 index 0000000000..4654539cad --- /dev/null +++ b/firmware/controllers/generated/pid_state_generated.h @@ -0,0 +1,44 @@ +// this section was generated automatically by rusEfi tool ConfigDefinition.jar based on integration/pid_state.txt Sun Sep 01 11:57:50 EDT 2019 +// by class com.rusefi.output.CHeaderConsumer +// begin +#ifndef CONTROLLERS_GENERATED_PID_STATE_GENERATED_H +#define CONTROLLERS_GENERATED_PID_STATE_GENERATED_H +#include "rusefi_types.h" +// start of pid_state_s +struct pid_state_s { + /** + * offset 0 + */ + float iTerm = (float)0; + /** + * we are remembering this only for debugging purposes + * offset 4 + */ + float dTerm = (float)0; + /** + * only used for logging + * offset 8 + */ + float target = (float)0; + /** + * only used for logging + * offset 12 + */ + float input = (float)0; + /** + * only used for logging + * offset 16 + */ + float output = (float)0; + /** + * offset 20 + */ + float errorAmplificationCoef = (float)0; + /** total size 24*/ +}; + +typedef struct pid_state_s pid_state_s; + +#endif +// end +// this section was generated automatically by rusEfi tool ConfigDefinition.jar based on integration/pid_state.txt Sun Sep 01 11:57:50 EDT 2019 diff --git a/firmware/controllers/generated/rusefi_generated.h b/firmware/controllers/generated/rusefi_generated.h index 6c44e741ff..2acbddf87b 100644 --- a/firmware/controllers/generated/rusefi_generated.h +++ b/firmware/controllers/generated/rusefi_generated.h @@ -1330,9 +1330,10 @@ #define lcdThreadPeriodMs_offset_hex 2d0 #define LDS_CLT_STATE_INDEX 0 #define LDS_ENGINE_STATE_INDEX 3 -#define LDS_ETB_STATE_INDEX 7 +#define LDS_ETB_PID_STATE_INDEX 7 #define LDS_FUEL_TRIM_STATE_INDEX 4 #define LDS_IAT_STATE_INDEX 1 +#define LDS_IDLE_PID_STATE_INDEX 8 #define LDS_SPEED_DENSITY_STATE_INDEX 2 #define LDS_TPS_TPS_ENEICHMENT_STATE_INDEX 5 #define LDS_TRIGGER_STATE_INDEX 6 diff --git a/firmware/controllers/math/speed_density.cpp b/firmware/controllers/math/speed_density.cpp index ce6d2796f7..93acab4129 100644 --- a/firmware/controllers/math/speed_density.cpp +++ b/firmware/controllers/math/speed_density.cpp @@ -40,6 +40,7 @@ temperature_t getTCharge(int rpm, float tps, float coolantTemp, float airTemp DE return coolantTemp; } + DISPLAY_STATE(Engine) if ((engine->engineState.sd.DISPLAY_IF(isTChargeAirModel) = (CONFIG(tChargeMode) == TCHARGE_MODE_AIR_INTERP))) { const floatms_t gramsPerMsToKgPerHour = (3600.0f * 1000.0f) / 1000.0f; diff --git a/firmware/controllers/sensors/tps.cpp b/firmware/controllers/sensors/tps.cpp index 9106fd7b55..21430133ef 100644 --- a/firmware/controllers/sensors/tps.cpp +++ b/firmware/controllers/sensors/tps.cpp @@ -79,6 +79,7 @@ float getTpsRateOfChange(void) { * */ percent_t getTpsValue(int adc DECLARE_ENGINE_PARAMETER_SUFFIX) { + DISPLAY_STATE(Engine) DISPLAY_TAG(TPS_SECTION); DISPLAY_SENSOR(TPS) DISPLAY_TEXT(EOL) diff --git a/firmware/integration/engine_state.txt b/firmware/integration/engine_state.txt index b876fd9cf7..1e213a4e56 100644 --- a/firmware/integration/engine_state.txt +++ b/firmware/integration/engine_state.txt @@ -1,14 +1,4 @@ -struct_no_prefix pid_state_s - float iTerm; - float dTerm;we are remembering this only for debugging purposes - float target;only used for logging - float input;only used for logging - float output;only used for logging - float errorAmplificationCoef; - - -end_struct struct_no_prefix engine_state2_s diff --git a/firmware/integration/rusefi_config.txt b/firmware/integration/rusefi_config.txt index 5f42701b92..786fd5c9ae 100644 --- a/firmware/integration/rusefi_config.txt +++ b/firmware/integration/rusefi_config.txt @@ -1155,7 +1155,8 @@ end_struct #define LDS_FUEL_TRIM_STATE_INDEX 4 #define LDS_TPS_TPS_ENEICHMENT_STATE_INDEX 5 #define LDS_TRIGGER_STATE_INDEX 6 -#define LDS_ETB_STATE_INDEX 7 +#define LDS_ETB_PID_STATE_INDEX 7 +#define LDS_IDLE_PID_STATE_INDEX 8 diff --git a/firmware/util/math/pid.h b/firmware/util/math/pid.h index c151766b22..7c46320594 100644 --- a/firmware/util/math/pid.h +++ b/firmware/util/math/pid.h @@ -11,6 +11,7 @@ #include "global.h" #include "engine_configuration_generated_structures.h" #include "engine_state_generated.h" +#include "pid_state_generated.h" #if EFI_PROD_CODE || EFI_SIMULATOR #include "tunerstudio_configuration.h" diff --git a/java_console/io/src/com/rusefi/ui/livedocs/LiveDocHolder.java b/java_console/io/src/com/rusefi/ui/livedocs/LiveDocHolder.java index d48f7008ae..9254fd6672 100644 --- a/java_console/io/src/com/rusefi/ui/livedocs/LiveDocHolder.java +++ b/java_console/io/src/com/rusefi/ui/livedocs/LiveDocHolder.java @@ -6,11 +6,11 @@ import com.rusefi.config.Field; import java.util.List; public abstract class LiveDocHolder { - private final int id; + private final StateId id; private final List actions; private final Field[] values; - public LiveDocHolder(int id, List actions, Field[] values) { + public LiveDocHolder(StateId id, List actions, Field[] values) { this.id = id; this.actions = actions; this.values = values; @@ -23,7 +23,7 @@ public abstract class LiveDocHolder { public abstract boolean isVisible(); - public Integer getId() { + public StateId getId() { return id; } diff --git a/java_console/io/src/com/rusefi/ui/livedocs/LiveDocsRegistry.java b/java_console/io/src/com/rusefi/ui/livedocs/LiveDocsRegistry.java index 97d2459f9a..590cee06f2 100644 --- a/java_console/io/src/com/rusefi/ui/livedocs/LiveDocsRegistry.java +++ b/java_console/io/src/com/rusefi/ui/livedocs/LiveDocsRegistry.java @@ -1,12 +1,9 @@ package com.rusefi.ui.livedocs; import com.rusefi.binaryprotocol.BinaryProtocol; -import com.rusefi.config.generated.Fields; import java.util.ArrayList; -import java.util.HashMap; import java.util.List; -import java.util.Map; import static com.rusefi.binaryprotocol.BinaryProtocolCommands.COMMAND_GET_STRUCT; import static com.rusefi.binaryprotocol.BinaryProtocolCommands.RESPONSE_OK; @@ -26,28 +23,32 @@ public enum LiveDocsRegistry { } public void refresh(BinaryProtocol binaryProtocol) { - for (LiveDocHolder h : liveDocs) { - boolean visible = h.isVisible(); - System.out.println(h + ": is_visible=" + visible); + for (LiveDocHolder holder : liveDocs) { + boolean visible = holder.isVisible(); + System.out.println(holder + ": is_visible=" + visible); if (visible) { - int liveDocRequestId = h.getId(); - int size = h.getStructSize(); - - byte packet[] = new byte[5]; - packet[0] = COMMAND_GET_STRUCT; - putShort(packet, 1, swap16(liveDocRequestId)); // offset - putShort(packet, 3, swap16(size)); - - byte[] responseWithCode = binaryProtocol.executeCommand(packet, "get LiveDoc", false); - if (responseWithCode == null || responseWithCode.length != (size + 1) || responseWithCode[0] != RESPONSE_OK) - continue; - - byte [] response = new byte[size]; - - System.arraycopy(responseWithCode, 1, response, 0, size); - - h.update(binaryProtocol, response); + refresh(binaryProtocol, holder); } } } + + private void refresh(BinaryProtocol binaryProtocol, LiveDocHolder holder) { + int liveDocRequestId = holder.getId().getId(); + int size = holder.getStructSize(); + + byte packet[] = new byte[5]; + packet[0] = COMMAND_GET_STRUCT; + putShort(packet, 1, swap16(liveDocRequestId)); // offset + putShort(packet, 3, swap16(size)); + + byte[] responseWithCode = binaryProtocol.executeCommand(packet, "get LiveDoc", false); + if (responseWithCode == null || responseWithCode.length != (size + 1) || responseWithCode[0] != RESPONSE_OK) + return; + + byte[] response = new byte[size]; + + System.arraycopy(responseWithCode, 1, response, 0, size); + + holder.update(binaryProtocol, response); + } } diff --git a/java_console/io/src/com/rusefi/ui/livedocs/StateId.java b/java_console/io/src/com/rusefi/ui/livedocs/StateId.java new file mode 100644 index 0000000000..66015c8210 --- /dev/null +++ b/java_console/io/src/com/rusefi/ui/livedocs/StateId.java @@ -0,0 +1,40 @@ +package com.rusefi.ui.livedocs; + +import java.util.Objects; + +/** + * Type-safe unique structure identifier + *

+ * (c) Andrey Belomutskiy 2013-2019 + */ +public class StateId { + private final int id; + + public StateId(int id) { + this.id = id; + } + + public int getId() { + return id; + } + + @Override + public String toString() { + return "StateId{" + + "id=" + id + + '}'; + } + + @Override + public boolean equals(Object o) { + if (this == o) return true; + if (o == null || getClass() != o.getClass()) return false; + StateId stateId = (StateId) o; + return id == stateId.id; + } + + @Override + public int hashCode() { + return Objects.hash(id); + } +} diff --git a/java_console/models/src/com/rusefi/config/Field.java b/java_console/models/src/com/rusefi/config/Field.java index a7ed4664d3..eca0f4f4ca 100644 --- a/java_console/models/src/com/rusefi/config/Field.java +++ b/java_console/models/src/com/rusefi/config/Field.java @@ -64,7 +64,7 @@ public class Field { return f; } } - throw new IllegalStateException("No field " + fieldName); + throw new IllegalStateException("No field: " + fieldName); } public static int getStructureSize(Field[] values) { diff --git a/java_console/models/src/com/rusefi/config/generated/EngineState.java b/java_console/models/src/com/rusefi/config/generated/EngineState.java index c46c9d3c03..5168b7fb00 100644 --- a/java_console/models/src/com/rusefi/config/generated/EngineState.java +++ b/java_console/models/src/com/rusefi/config/generated/EngineState.java @@ -1,17 +1,11 @@ package com.rusefi.config.generated; -// this file was generated automatically by rusEfi tool ConfigDefinition.jar based on integration/engine_state.txt Sat Aug 31 11:02:25 EDT 2019 +// this file was generated automatically by rusEfi tool ConfigDefinition.jar based on integration/engine_state.txt Sun Sep 01 11:57:51 EDT 2019 // by class com.rusefi.output.JavaFieldsConsumer import com.rusefi.config.*; public class EngineState { - public static final Field ITERM = Field.create("ITERM", 0, FieldType.FLOAT); - public static final Field DTERM = Field.create("DTERM", 4, FieldType.FLOAT); - public static final Field TARGET = Field.create("TARGET", 8, FieldType.FLOAT); - public static final Field INPUT = Field.create("INPUT", 12, FieldType.FLOAT); - public static final Field OUTPUT = Field.create("OUTPUT", 16, FieldType.FLOAT); - public static final Field ERRORAMPLIFICATIONCOEF = Field.create("ERRORAMPLIFICATIONCOEF", 20, FieldType.FLOAT); public static final Field ISTCHARGEAIRMODEL = Field.create("ISTCHARGEAIRMODEL", 0, FieldType.BIT, 0); public static final Field AIRMASSINONECYLINDER = Field.create("AIRMASSINONECYLINDER", 4, FieldType.FLOAT); public static final Field TCHARGE = Field.create("TCHARGE", 8, FieldType.FLOAT); @@ -48,12 +42,6 @@ public class EngineState { public static final Field RUNNING_BASEFUEL = Field.create("RUNNING_BASEFUEL", 128, FieldType.FLOAT); public static final Field RUNNING_FUEL = Field.create("RUNNING_FUEL", 132, FieldType.FLOAT); public static final Field[] VALUES = { - ITERM, - DTERM, - TARGET, - INPUT, - OUTPUT, - ERRORAMPLIFICATIONCOEF, ISTCHARGEAIRMODEL, AIRMASSINONECYLINDER, TCHARGE, diff --git a/java_console/models/src/com/rusefi/config/generated/Fields.java b/java_console/models/src/com/rusefi/config/generated/Fields.java index cc0ee52cce..b1cea5bcc3 100644 --- a/java_console/models/src/com/rusefi/config/generated/Fields.java +++ b/java_console/models/src/com/rusefi/config/generated/Fields.java @@ -1,6 +1,6 @@ package com.rusefi.config.generated; -// this file was generated automatically by rusEfi tool ConfigDefinition.jar based on integration\rusefi_config.txt Sat Aug 31 23:31:57 EDT 2019 +// this file was generated automatically by rusEfi tool ConfigDefinition.jar based on integration\rusefi_config.txt Sun Sep 01 12:45:18 EDT 2019 // by class com.rusefi.output.JavaFieldsConsumer import com.rusefi.config.*; @@ -873,9 +873,10 @@ public class Fields { public static final int lcdThreadPeriodMs_offset = 720; public static final int LDS_CLT_STATE_INDEX = 0; public static final int LDS_ENGINE_STATE_INDEX = 3; - public static final int LDS_ETB_STATE_INDEX = 7; + public static final int LDS_ETB_PID_STATE_INDEX = 7; public static final int LDS_FUEL_TRIM_STATE_INDEX = 4; public static final int LDS_IAT_STATE_INDEX = 1; + public static final int LDS_IDLE_PID_STATE_INDEX = 8; public static final int LDS_SPEED_DENSITY_STATE_INDEX = 2; public static final int LDS_TPS_TPS_ENEICHMENT_STATE_INDEX = 5; public static final int LDS_TRIGGER_STATE_INDEX = 6; diff --git a/java_console/models/src/com/rusefi/config/generated/PidState.java b/java_console/models/src/com/rusefi/config/generated/PidState.java new file mode 100644 index 0000000000..6545de1ef4 --- /dev/null +++ b/java_console/models/src/com/rusefi/config/generated/PidState.java @@ -0,0 +1,23 @@ +package com.rusefi.config.generated; + +// this file was generated automatically by rusEfi tool ConfigDefinition.jar based on integration/pid_state.txt Sun Sep 01 11:57:50 EDT 2019 + +// by class com.rusefi.output.JavaFieldsConsumer +import com.rusefi.config.*; + +public class PidState { + public static final Field ITERM = Field.create("ITERM", 0, FieldType.FLOAT); + public static final Field DTERM = Field.create("DTERM", 4, FieldType.FLOAT); + public static final Field TARGET = Field.create("TARGET", 8, FieldType.FLOAT); + public static final Field INPUT = Field.create("INPUT", 12, FieldType.FLOAT); + public static final Field OUTPUT = Field.create("OUTPUT", 16, FieldType.FLOAT); + public static final Field ERRORAMPLIFICATIONCOEF = Field.create("ERRORAMPLIFICATIONCOEF", 20, FieldType.FLOAT); + public static final Field[] VALUES = { + ITERM, + DTERM, + TARGET, + INPUT, + OUTPUT, + ERRORAMPLIFICATIONCOEF, + }; +} diff --git a/java_console/models/src/com/rusefi/config/generated/ThermistorState.java b/java_console/models/src/com/rusefi/config/generated/ThermistorState.java index 0b45c84412..ce5005102a 100644 --- a/java_console/models/src/com/rusefi/config/generated/ThermistorState.java +++ b/java_console/models/src/com/rusefi/config/generated/ThermistorState.java @@ -1,6 +1,6 @@ package com.rusefi.config.generated; -// this file was generated automatically by rusEfi tool ConfigDefinition.jar based on integration/thermistor.txt Sat Jul 20 12:28:04 EDT 2019 +// this file was generated automatically by rusEfi tool ConfigDefinition.jar based on integration/thermistor_state.txt Sat Jul 20 12:28:04 EDT 2019 // by class com.rusefi.output.JavaFieldsConsumer import com.rusefi.config.*; diff --git a/java_console/models/src/com/rusefi/config/generated/TriggerState.java b/java_console/models/src/com/rusefi/config/generated/TriggerState.java index f66aa6e84b..644ec2367a 100644 --- a/java_console/models/src/com/rusefi/config/generated/TriggerState.java +++ b/java_console/models/src/com/rusefi/config/generated/TriggerState.java @@ -1,6 +1,6 @@ package com.rusefi.config.generated; -// this file was generated automatically by rusEfi tool ConfigDefinition.jar based on integration/trigger.txt Sat Jul 20 12:28:04 EDT 2019 +// this file was generated automatically by rusEfi tool ConfigDefinition.jar based on integration/trigger_state.txt Sat Jul 20 12:28:04 EDT 2019 // by class com.rusefi.output.JavaFieldsConsumer import com.rusefi.config.*; diff --git a/java_console/models/src/com/rusefi/config/generated/WallFuelState.java b/java_console/models/src/com/rusefi/config/generated/WallFuelState.java index dcf6e09894..47c0751af2 100644 --- a/java_console/models/src/com/rusefi/config/generated/WallFuelState.java +++ b/java_console/models/src/com/rusefi/config/generated/WallFuelState.java @@ -1,6 +1,6 @@ package com.rusefi.config.generated; -// this file was generated automatically by rusEfi tool ConfigDefinition.jar based on integration/wall_fuel.txt Sat Jul 20 12:28:05 EDT 2019 +// this file was generated automatically by rusEfi tool ConfigDefinition.jar based on integration/wall_fuel_state.txt Sat Jul 20 12:28:05 EDT 2019 // by class com.rusefi.output.JavaFieldsConsumer import com.rusefi.config.*; diff --git a/java_console/ui/src/com/rusefi/ldmp/StateDictionary.java b/java_console/ui/src/com/rusefi/ldmp/StateDictionary.java new file mode 100644 index 0000000000..d247ba2c0e --- /dev/null +++ b/java_console/ui/src/com/rusefi/ldmp/StateDictionary.java @@ -0,0 +1,50 @@ +package com.rusefi.ldmp; + +import com.rusefi.config.Field; +import com.rusefi.config.generated.EngineState; +import com.rusefi.config.generated.Fields; +import com.rusefi.config.generated.PidState; +import com.rusefi.config.generated.TriggerState; + +import java.util.HashMap; +import java.util.Map; +import java.util.Objects; + +public enum StateDictionary { + INSTANCE; + + private Map map = new HashMap<>(); + + StateDictionary() { + register(Fields.LDS_ETB_PID_STATE_INDEX, PidState.VALUES); + register(Fields.LDS_TRIGGER_STATE_INDEX, TriggerState.VALUES); + register(Fields.LDS_ENGINE_STATE_INDEX, EngineState.VALUES); + } + + private void register(int ldsIndex, Field[] values) { + map.put(ldsIndex, values); + } + + public Field[] getValue(String state) { + String indexFieldName = "LDS_" + state.toUpperCase() + "_STATE_INDEX"; + java.lang.reflect.Field field = null; + try { + field = Fields.class.getField(indexFieldName); + } catch (NoSuchFieldException e) { + throw new IllegalStateException(e); + } + Objects.requireNonNull(field, "Field " + indexFieldName); + int indexValue; + try { + indexValue = (int) field.get(null); + } catch (IllegalAccessException e) { + throw new IllegalStateException(e); + } + Field[] result = map.get(indexValue); + if (result == null) { + throw new IllegalStateException("Nothing for " + indexFieldName + "/" + indexValue); + } + return result; + } + +} diff --git a/java_console/ui/src/com/rusefi/ldmp/generated/AccelEnrichmentMeta.java b/java_console/ui/src/com/rusefi/ldmp/generated/AccelEnrichmentMeta.java index 01115db4a9..5581740e38 100644 --- a/java_console/ui/src/com/rusefi/ldmp/generated/AccelEnrichmentMeta.java +++ b/java_console/ui/src/com/rusefi/ldmp/generated/AccelEnrichmentMeta.java @@ -7,9 +7,9 @@ public class AccelEnrichmentMeta { new ConfigRequest("wwaeTau"), new ConfigRequest("wwaeBeta"), new TextRequest("Current_Wall_Fuel_Film"), - new FieldRequest("","wallFuel"), + new FieldRequest("wall_fuel", "wallFuel"), new TextRequest("Fuel"), - new FieldRequest("","wallFuelCorrection"), + new FieldRequest("wall_fuel", "wallFuelCorrection"), new TextRequest("ms"), }; } \ No newline at end of file diff --git a/java_console/ui/src/com/rusefi/ldmp/generated/ElectronicThrottleMeta.java b/java_console/ui/src/com/rusefi/ldmp/generated/ElectronicThrottleMeta.java index 55d0d5b9dd..58e8519aba 100644 --- a/java_console/ui/src/com/rusefi/ldmp/generated/ElectronicThrottleMeta.java +++ b/java_console/ui/src/com/rusefi/ldmp/generated/ElectronicThrottleMeta.java @@ -4,17 +4,18 @@ import com.rusefi.ldmp.*; public class ElectronicThrottleMeta { public static final Request[] CONTENT = new Request[]{ - new IfRequest("hasEtbPedalPositionSensor", + new IfRequest("Engine", "hasEtbPedalPositionSensor", new Request[]{ + new TextRequest("Electronic_Throttle"), new SensorRequest("TPS"), new TextRequest("eol"), new TextRequest("Pedal"), new SensorRequest("PPS"), new TextRequest("eol"), new TextRequest("Output"), - new FieldRequest("","output"), + new FieldRequest("ETB_pid", "output"), new TextRequest("iTerm"), - new FieldRequest("","iTerm"), + new FieldRequest("ETB_pid", "iTerm"), new TextRequest("eol"), new TextRequest("Settings"), new ConfigRequest("ETB_PFACTOR"), diff --git a/java_console/ui/src/com/rusefi/ldmp/generated/FuelMathMeta.java b/java_console/ui/src/com/rusefi/ldmp/generated/FuelMathMeta.java index a358e7a706..f79e2dbc3b 100644 --- a/java_console/ui/src/com/rusefi/ldmp/generated/FuelMathMeta.java +++ b/java_console/ui/src/com/rusefi/ldmp/generated/FuelMathMeta.java @@ -4,43 +4,43 @@ import com.rusefi.ldmp.*; public class FuelMathMeta { public static final Request[] CONTENT = new Request[]{ - new IfRequest("isCrankingState", + new IfRequest("Engine", "isCrankingState", new Request[]{ new TextRequest("Duration_coef"), - new FieldRequest("","cranking_durationCoefficient"), + new FieldRequest("Engine", "cranking_durationCoefficient"), new TextRequest("eol"), new TextRequest("Coolant_coef"), - new FieldRequest("","cranking_coolantTemperatureCoefficient"), + new FieldRequest("Engine", "cranking_coolantTemperatureCoefficient"), new SensorRequest("CLT"), new TextRequest("eol"), new TextRequest("TPS_coef"), - new FieldRequest("","cranking_tpsCoefficient"), + new FieldRequest("Engine", "cranking_tpsCoefficient"), new SensorRequest("TPS"), new TextRequest("eol"), new TextRequest("Cranking_fuel"), - new FieldRequest("","cranking_fuel"), + new FieldRequest("Engine", "cranking_fuel"), }, new Request[]{ new TextRequest("Base_fuel"), - new FieldRequest("","running_baseFuel"), + new FieldRequest("Engine", "running_baseFuel"), new TextRequest("eol"), new TextRequest("Intake_coef"), - new FieldRequest("","running_intakeTemperatureCoefficient"), + new FieldRequest("Engine", "running_intakeTemperatureCoefficient"), new SensorRequest("IAT"), new TextRequest("eol"), new TextRequest("Coolant_coef"), - new FieldRequest("","running_coolantTemperatureCoefficient"), + new FieldRequest("Engine", "running_coolantTemperatureCoefficient"), new SensorRequest("CLT"), new TextRequest("eol"), new TextRequest("Post_cranking_coef"), - new FieldRequest("","running_postCrankingFuelCorrection"), + new FieldRequest("Engine", "running_postCrankingFuelCorrection"), new TextRequest("eol"), new TextRequest("eol"), new TextRequest("Running_fuel"), - new FieldRequest("","running_fuel"), + new FieldRequest("Engine", "running_fuel"), new TextRequest("eol"), new TextRequest("Injector_lag"), - new FieldRequest("","running_injectorLag"), + new FieldRequest("Engine", "running_injectorLag"), new SensorRequest("VBATT"), }), }; diff --git a/java_console/ui/src/com/rusefi/ldmp/generated/IdleThreadMeta.java b/java_console/ui/src/com/rusefi/ldmp/generated/IdleThreadMeta.java index c552d00268..d131135121 100644 --- a/java_console/ui/src/com/rusefi/ldmp/generated/IdleThreadMeta.java +++ b/java_console/ui/src/com/rusefi/ldmp/generated/IdleThreadMeta.java @@ -5,18 +5,18 @@ import com.rusefi.ldmp.*; public class IdleThreadMeta { public static final Request[] CONTENT = new Request[]{ new TextRequest("Idle_State"), - new FieldRequest("Engine","idleState"), + new FieldRequest("Engine", "idleState"), new TextRequest("EOL"), new TextRequest("Base_Position"), - new FieldRequest("Engine","baseIdlePosition"), + new FieldRequest("Engine", "baseIdlePosition"), new TextRequest("Position_with_Adjustments"), - new FieldRequest("Engine","currentIdlePosition"), + new FieldRequest("Engine", "currentIdlePosition"), new TextRequest("EOL"), new TextRequest("EOL"), new SensorRequest("TPS"), new TextRequest("EOL"), new TextRequest("Throttle_Up_State"), - new FieldRequest("Engine","throttlePedalUpState"), + new FieldRequest("Engine", "throttlePedalUpState"), new ConfigRequest("throttlePedalUpPin"), }; } \ No newline at end of file diff --git a/java_console/ui/src/com/rusefi/ldmp/generated/SpeedDensityMeta.java b/java_console/ui/src/com/rusefi/ldmp/generated/SpeedDensityMeta.java index 096e8fbdd7..2331a1fddd 100644 --- a/java_console/ui/src/com/rusefi/ldmp/generated/SpeedDensityMeta.java +++ b/java_console/ui/src/com/rusefi/ldmp/generated/SpeedDensityMeta.java @@ -4,10 +4,10 @@ import com.rusefi.ldmp.*; public class SpeedDensityMeta { public static final Request[] CONTENT = new Request[]{ - new IfRequest("isTChargeAirModel", + new IfRequest("Engine", "isTChargeAirModel", new Request[]{ new TextRequest("interpolate_Air_Flow"), - new FieldRequest("","airFlow"), + new FieldRequest("Engine", "airFlow"), new TextRequest("Between"), new ConfigRequest("tChargeAirCoefMin"), new ConfigRequest("tChargeAirFlowMax"), diff --git a/java_console/ui/src/com/rusefi/ldmp/generated/ThermistorsMeta.java b/java_console/ui/src/com/rusefi/ldmp/generated/ThermistorsMeta.java index a23be8c0f7..f26cc565cd 100644 --- a/java_console/ui/src/com/rusefi/ldmp/generated/ThermistorsMeta.java +++ b/java_console/ui/src/com/rusefi/ldmp/generated/ThermistorsMeta.java @@ -5,16 +5,16 @@ import com.rusefi.ldmp.*; public class ThermistorsMeta { public static final Request[] CONTENT = new Request[]{ new TextRequest("Analog_MCU_reads"), - new FieldRequest("","voltageMCU"), + new FieldRequest("", "voltageMCU"), new TextRequest("from_pin"), new ConfigRequest("adcChannel"), new TextRequest("EOL"), new TextRequest("Analog_ECU_reads"), - new FieldRequest("","voltageBoard"), + new FieldRequest("", "voltageBoard"), new TextRequest("Rdivider"), new ConfigRequest("analogInputDividerCoefficient"), new TextRequest("EOL"), new TextRequest("Measured_resistance"), - new FieldRequest("","resistance"), + new FieldRequest("", "resistance"), }; } \ No newline at end of file diff --git a/java_console/ui/src/com/rusefi/ldmp/generated/TpsMeta.java b/java_console/ui/src/com/rusefi/ldmp/generated/TpsMeta.java index cfd4d53d56..bc11b74d19 100644 --- a/java_console/ui/src/com/rusefi/ldmp/generated/TpsMeta.java +++ b/java_console/ui/src/com/rusefi/ldmp/generated/TpsMeta.java @@ -11,18 +11,18 @@ public class TpsMeta { new SensorRequest("TPS"), new TextRequest("EOL"), new TextRequest("Analog_MCU_reads"), - new FieldRequest("","tpsVoltageMCU"), + new FieldRequest("Engine", "tpsVoltageMCU"), new TextRequest("Volts"), new TextRequest("from_pin"), new ConfigRequest("tps1_1AdcChannel"), new TextRequest("EOL"), new TextRequest("Analog_ECU_reads"), - new FieldRequest("","tpsVoltageBoard"), + new FieldRequest("Engine", "tpsVoltageBoard"), new TextRequest("Rdivider"), new ConfigRequest("analogInputDividerCoefficient"), new TextRequest("EOL"), new TextRequest("Current_ADC"), - new FieldRequest("","currentTpsAdc"), + new FieldRequest("Engine", "currentTpsAdc"), new TextRequest("interpolate_between"), new ConfigRequest("tpsMax"), new TextRequest("and"), diff --git a/java_console/ui/src/com/rusefi/ldmp/generated/TriggerDecoderMeta.java b/java_console/ui/src/com/rusefi/ldmp/generated/TriggerDecoderMeta.java index f4112a55e9..fc3f35a773 100644 --- a/java_console/ui/src/com/rusefi/ldmp/generated/TriggerDecoderMeta.java +++ b/java_console/ui/src/com/rusefi/ldmp/generated/TriggerDecoderMeta.java @@ -6,14 +6,14 @@ public class TriggerDecoderMeta { public static final Request[] CONTENT = new Request[]{ new ConfigRequest("TRIGGERINPUTPINS1"), new TextRequest("Trigger_1_Fall"), - new FieldRequest("Trigger","HWEVENTCOUNTERS1"), + new FieldRequest("Trigger", "HWEVENTCOUNTERS1"), new TextRequest("Rise"), - new FieldRequest("Trigger","HWEVENTCOUNTERS2"), + new FieldRequest("Trigger", "HWEVENTCOUNTERS2"), new TextRequest("EOL"), new ConfigRequest("TRIGGERINPUTPINS2"), new TextRequest("Trigger_2_Fall"), - new FieldRequest("Trigger","HWEVENTCOUNTERS3"), + new FieldRequest("Trigger", "HWEVENTCOUNTERS3"), new TextRequest("Rise"), - new FieldRequest("Trigger","HWEVENTCOUNTERS4"), + new FieldRequest("Trigger", "HWEVENTCOUNTERS4"), }; } \ No newline at end of file diff --git a/java_console/ui/src/com/rusefi/ui/livedocs/ActionPanel.java b/java_console/ui/src/com/rusefi/ui/livedocs/ActionPanel.java index d95f395a1d..82b2d84d9c 100644 --- a/java_console/ui/src/com/rusefi/ui/livedocs/ActionPanel.java +++ b/java_console/ui/src/com/rusefi/ui/livedocs/ActionPanel.java @@ -7,6 +7,12 @@ import java.awt.*; import java.util.ArrayList; import java.util.List; +/** + * Multi-line horizontal flow panel. + * + * + * (c) Andrey Belomutskiy 2013-2019 + */ public class ActionPanel { List actionsList = new ArrayList<>(); private final JPanel panel = new JPanel(new MigLayout()); @@ -16,11 +22,6 @@ public class ActionPanel { panel.setBorder(BorderFactory.createTitledBorder(title)); } - public ActionPanel(JPanel result, List combined) { - panel.add(result); - actionsList.addAll(combined); - } - public JPanel getPanel() { return panel; } @@ -30,15 +31,15 @@ public class ActionPanel { currentLinePanel = null; } + public void addControl(JComponent component) { + initIfNeeded(); + currentLinePanel.add(component); + } + private void initIfNeeded() { if (currentLinePanel == null) { currentLinePanel = new JPanel(new FlowLayout(FlowLayout.CENTER, 5, 0)); panel.add(currentLinePanel, "wrap"); } } - - public void addControl(JComponent component) { - initIfNeeded(); - currentLinePanel.add(component); - } } diff --git a/java_console/ui/src/com/rusefi/ui/livedocs/IfConditionPanel.java b/java_console/ui/src/com/rusefi/ui/livedocs/IfConditionPanel.java new file mode 100644 index 0000000000..e4bb504c00 --- /dev/null +++ b/java_console/ui/src/com/rusefi/ui/livedocs/IfConditionPanel.java @@ -0,0 +1,30 @@ +package com.rusefi.ui.livedocs; + +import net.miginfocom.swing.MigLayout; + +import javax.swing.*; +import java.util.ArrayList; +import java.util.List; + +/** + * (c) Andrey Belomutskiy 2013-2019 + */ +public class IfConditionPanel { + private final List actionsList = new ArrayList<>(); + private final JPanel panel = new JPanel(new MigLayout()); + + public IfConditionPanel(JPanel result, List combined) { + // todo: do we really need this proxy panel or can we just use parameter value? + panel.add(result); + // todo: do we really need this list or can we just use parameter value? + actionsList.addAll(combined); + } + + public List getActionsList() { + return actionsList; + } + + public JPanel getPanel() { + return panel; + } +} diff --git a/java_console/ui/src/com/rusefi/ui/livedocs/LiveDocPanel.java b/java_console/ui/src/com/rusefi/ui/livedocs/LiveDocPanel.java index 236d69f515..a6eb137ae9 100644 --- a/java_console/ui/src/com/rusefi/ui/livedocs/LiveDocPanel.java +++ b/java_console/ui/src/com/rusefi/ui/livedocs/LiveDocPanel.java @@ -38,7 +38,8 @@ public class LiveDocPanel { private static final int LIVE_DATA_PRECISION = 2; @NotNull - static JPanel createPanel(String title, String settingsInstancePrefix, final int id, Field[] values, Request[] content) { + static JPanel createPanel(String title, String settingsInstancePrefix, final int integerId, Field[] values, Request[] content) { + StateId id = new StateId(integerId); ActionPanel ap = createComponents(title, content, values, settingsInstancePrefix); JPanel panel = ap.getPanel(); @@ -73,7 +74,7 @@ public class LiveDocPanel { } } else if (r instanceof FieldRequest) { FieldRequest request = (FieldRequest) r; - Field field = Field.findField(values, "", request.getField()); + Field field = getField(values, request); JLabel label = new JLabel("*"); label.setIcon(UiUtils.loadIcon("livedocs/variable.png")); label.setToolTipText("Variable " + field.getName()); @@ -127,9 +128,9 @@ public class LiveDocPanel { } else if (r instanceof IfRequest) { IfRequest request = (IfRequest) r; - ActionPanel panel = createIfRequestPanel(request, values); + IfConditionPanel panel = createIfRequestPanel(request, values); - result.actionsList.addAll(panel.actionsList); + result.actionsList.addAll(panel.getActionsList()); result.addControl(panel.getPanel()); } else { @@ -139,6 +140,16 @@ public class LiveDocPanel { return result; } + private static Field getField(Field[] defaultContext, FieldRequest request) { + Field[] context; + if (request.getStateContext().isEmpty()) { + context = defaultContext; + } else { + context = StateDictionary.INSTANCE.getValue(request.getStateContext()); + } + return Field.findField(context, "", request.getField()); + } + private static String getTooltipText(String configurationFieldName) { DialogModel.Field dialogField = IniFileModel.getInstance().getField(configurationFieldName); if (dialogField == null) { @@ -147,7 +158,7 @@ public class LiveDocPanel { return "Configuration " + dialogField.getUiName() + " (" + configurationFieldName + ")"; } - private static ActionPanel createIfRequestPanel(IfRequest request, Field[] values) { + private static IfConditionPanel createIfRequestPanel(IfRequest request, Field[] values) { Field conditionField = Field.findField(values, "", request.getVariable()); @@ -187,7 +198,7 @@ public class LiveDocPanel { } }); - return new ActionPanel(result, combined); + return new IfConditionPanel(result, combined); } @NotNull @@ -204,7 +215,7 @@ public class LiveDocPanel { EngineState.VALUES, IdleThreadMeta.CONTENT), CONSTRAINTS); // todo: fix the defect - we request ETB structure but decode it as EngineState - liveDocs.add(createPanel("ETB", "", Fields.LDS_ETB_STATE_INDEX, + liveDocs.add(createPanel("ETB", "", Fields.LDS_ETB_PID_STATE_INDEX, EngineState.VALUES, ElectronicThrottleMeta.CONTENT), CONSTRAINTS); return liveDocs; diff --git a/java_console/ui/src/com/rusefi/ui/livedocs/test/LiveDocPanelTest.java b/java_console/ui/src/com/rusefi/ui/livedocs/test/LiveDocPanelTest.java new file mode 100644 index 0000000000..f6de5d008d --- /dev/null +++ b/java_console/ui/src/com/rusefi/ui/livedocs/test/LiveDocPanelTest.java @@ -0,0 +1,27 @@ +package com.rusefi.ui.livedocs.test; + +import com.rusefi.config.generated.Fields; +import com.rusefi.ui.livedocs.LiveDocPanel; +import org.junit.Test; + +import java.lang.reflect.Field; + +import static org.junit.Assert.assertNotNull; + +public class LiveDocPanelTest { + @Test + public void testFindField() throws NoSuchFieldException { + Field reflectField = Fields.class.getField("LDS_CLT_STATE_INDEX"); + assertNotNull(reflectField); + } + + @Test + public void testValidDocumentationMetaInfo() { + assertNotNull(LiveDocPanel.createLiveDocumentationPanel()); + } + + @Test + public void testValidSensorsMetaInfo() { + assertNotNull(LiveDocPanel.createSensorsLiveDataPanel()); + } +} diff --git a/java_tools/configuration_definition/src/com/rusefi/ldmp/FieldRequest.java b/java_tools/configuration_definition/src/com/rusefi/ldmp/FieldRequest.java index 999e9465eb..9f7195b4a7 100644 --- a/java_tools/configuration_definition/src/com/rusefi/ldmp/FieldRequest.java +++ b/java_tools/configuration_definition/src/com/rusefi/ldmp/FieldRequest.java @@ -4,6 +4,9 @@ import java.util.Objects; import static com.rusefi.ConfigDefinition.EOL; +/** + * (c) Andrey Belomutskiy 2013-2019 + */ public class FieldRequest extends Request { private final String stateContext; private final String field; @@ -13,6 +16,10 @@ public class FieldRequest extends Request { this.field = field; } + public String getStateContext() { + return stateContext; + } + public String getField() { return field; } @@ -43,7 +50,7 @@ public class FieldRequest extends Request { public String getGeneratedJavaCode() { return GLOBAL_PREFIX + "new " + getClass().getSimpleName() + "(" + quoteString(stateContext) - + "," + + ", " + quoteString(field) + ")," + EOL; } diff --git a/java_tools/configuration_definition/src/com/rusefi/ldmp/IfRequest.java b/java_tools/configuration_definition/src/com/rusefi/ldmp/IfRequest.java index 84c483a73b..f0286d5051 100644 --- a/java_tools/configuration_definition/src/com/rusefi/ldmp/IfRequest.java +++ b/java_tools/configuration_definition/src/com/rusefi/ldmp/IfRequest.java @@ -7,16 +7,18 @@ import java.util.List; import static com.rusefi.ConfigDefinition.EOL; public class IfRequest extends Request { + private final String stateContext; private final String variable; public List trueBlock = new ArrayList<>(); public List falseBlock = new ArrayList<>(); - public IfRequest(String variable) { + public IfRequest(String stateContext, String variable) { + this.stateContext = stateContext; this.variable = variable; } - public IfRequest(String variable, Request[] trueBlock, Request[] falseBlock) { - this(variable); + public IfRequest(String stateContext, String variable, Request[] trueBlock, Request[] falseBlock) { + this(stateContext, variable); this.trueBlock.addAll(Arrays.asList(trueBlock)); this.falseBlock.addAll(Arrays.asList(falseBlock)); } @@ -40,7 +42,11 @@ public class IfRequest extends Request { Request.GLOBAL_PREFIX = Request.GLOBAL_PREFIX + "\t"; - result += "new IfRequest(" + quoteString(variable) + "," + EOL + + result += "new IfRequest(" + + quoteString(stateContext) + + ", " + + quoteString(variable) + + "," + EOL + Request.GLOBAL_PREFIX + "new Request[]{" + EOL + Request.getGeneratedJavaCode(trueBlock) + "}," + EOL + diff --git a/java_tools/configuration_definition/src/com/rusefi/ldmp/LiveDocsMetaParser.java b/java_tools/configuration_definition/src/com/rusefi/ldmp/LiveDocsMetaParser.java index adf1d383b4..c6a56d97a7 100644 --- a/java_tools/configuration_definition/src/com/rusefi/ldmp/LiveDocsMetaParser.java +++ b/java_tools/configuration_definition/src/com/rusefi/ldmp/LiveDocsMetaParser.java @@ -87,7 +87,7 @@ public class LiveDocsMetaParser { } else if (DISPLAY_TEXT.equalsIgnoreCase(token)) { if (s.hasNext()) { String config = s.next(); - SystemOut.println("REQ TEXT " + config); + SystemOut.println("Display test " + config); result.add(new TextRequest(config)); } } else if (DISPLAY_TAG.equalsIgnoreCase(token)) { @@ -103,21 +103,19 @@ public class LiveDocsMetaParser { } } else if (DISPLAY_FIELD.equalsIgnoreCase(token)) { if (s.hasNext()) { - String config = prefix + s.next(); - SystemOut.println("REQ FIELD " + config); - result.add(new FieldRequest(meta.getStateContext(), config)); + String fieldName = prefix + s.next(); + SystemOut.println("REQ FIELD " + fieldName); + result.add(new FieldRequest(meta.getStateContext(), fieldName)); prefix.setLength(0); } } else if (DISPLAY_IF.equalsIgnoreCase(token)) { if (s.hasNext()) { stack.push(result); - String variable = s.next(); + String conditionVariable = s.next(); - - String config = s.next(); - SystemOut.println("REQ TEXT " + config); - IfRequest ifRequest = new IfRequest(variable); + SystemOut.println("if Condition " + conditionVariable); + IfRequest ifRequest = new IfRequest(meta.getStateContext(), conditionVariable); result.add(ifRequest); result = ifRequest.trueBlock; diff --git a/java_tools/configuration_definition/src/com/rusefi/ldmp/MetaInfo.java b/java_tools/configuration_definition/src/com/rusefi/ldmp/MetaInfo.java index e140ca5729..0eaf0789cb 100644 --- a/java_tools/configuration_definition/src/com/rusefi/ldmp/MetaInfo.java +++ b/java_tools/configuration_definition/src/com/rusefi/ldmp/MetaInfo.java @@ -16,8 +16,11 @@ public class MetaInfo { } public String getStateContext() { - if (stateStack.isEmpty()) - return ""; // state context not defined, java code would have to explicitly provide that information + if (stateStack.isEmpty()) { + // state context not defined, java code would have to explicitly provide that information + // this is used if code does not know context, for instance thermistor code does not know if CLT or IAT usage + return ""; + } return stateStack.peek(); } } diff --git a/java_tools/configuration_definition/src/com/rusefi/ldmp/Request.java b/java_tools/configuration_definition/src/com/rusefi/ldmp/Request.java index db93ee2611..07a16004d2 100644 --- a/java_tools/configuration_definition/src/com/rusefi/ldmp/Request.java +++ b/java_tools/configuration_definition/src/com/rusefi/ldmp/Request.java @@ -4,6 +4,9 @@ import java.util.List; import static com.rusefi.ConfigDefinition.EOL; +/** + * (c) Andrey Belomutskiy 2013-2019 + */ public abstract class Request { static String GLOBAL_PREFIX = "\t\t\t";