diff --git a/java_tools/ConfigDefinition.jar b/java_tools/ConfigDefinition.jar index d74f194ca1..1c75fb2ac7 100644 Binary files a/java_tools/ConfigDefinition.jar and b/java_tools/ConfigDefinition.jar differ diff --git a/java_tools/configuration_definition/src/com/rusefi/ConfigDefinition.java b/java_tools/configuration_definition/src/com/rusefi/ConfigDefinition.java index 67354c0b48..e5abd1027b 100644 --- a/java_tools/configuration_definition/src/com/rusefi/ConfigDefinition.java +++ b/java_tools/configuration_definition/src/com/rusefi/ConfigDefinition.java @@ -31,8 +31,6 @@ public class ConfigDefinition { private static int totalTsSize; public static Map structures = new HashMap<>(); - public static Map tsCustomLine = new HashMap<>(); - public static Map tsCustomSize = new HashMap<>(); public static StringBuilder settingContextHelp = new StringBuilder(); public static void main(String[] args) throws IOException { @@ -182,21 +180,7 @@ public class ConfigDefinition { } else if (line.startsWith(END_STRUCT)) { handleEndStruct(state, cHeader, tsHeader, javaFieldsWriter); } else if (line.startsWith(BIT)) { - line = line.substring(BIT.length() + 1).trim(); - - String bitName; - String comment; - if (!line.contains(";")) { - bitName = line; - comment = ""; - } else { - int index = line.indexOf(";"); - bitName = line.substring(0, index); - comment = line.substring(index + 1); - } - - ConfigField bitField = new ConfigField(bitName, comment, true, null, null, 0, null, false); - state.stack.peek().addBoth(bitField); + handleBitLine(state, line); } else if (startsWithToken(line, CUSTOM)) { line = line.substring(CUSTOM.length() + 1).trim(); @@ -214,11 +198,17 @@ public class ConfigDefinition { } catch (NumberFormatException e) { throw new IllegalStateException("Size in " + line); } - tsCustomSize.put(name, size); - tsCustomLine.put(name, tunerStudioLine); + state.tsCustomSize.put(name, size); + state.tsCustomLine.put(name, tunerStudioLine); + } else if (startsWithToken(line, DEFINE)) { + /** + * for example + * #define CLT_CURVE_SIZE 16 + */ + processDefine(line.substring(DEFINE.length()).trim()); } else { - processLine(state, line); + processField(state, line); } } cHeader.write("#endif" + EOL); @@ -226,6 +216,24 @@ public class ConfigDefinition { cHeader.write(message); } + private static void handleBitLine(ReaderState state, String line) { + line = line.substring(BIT.length() + 1).trim(); + + String bitName; + String comment; + if (!line.contains(";")) { + bitName = line; + comment = ""; + } else { + int index = line.indexOf(";"); + bitName = line.substring(0, index); + comment = line.substring(index + 1); + } + + ConfigField bitField = new ConfigField(state, bitName, comment, true, null, null, 0, null, false); + state.stack.peek().addBoth(bitField); + } + private static boolean startsWithToken(String line, String token) { return line.startsWith(token + " ") || line.startsWith(token + "\t"); } @@ -251,14 +259,14 @@ public class ConfigDefinition { throw new IllegalStateException("Unexpected end_struct"); ConfigStructure structure = state.stack.pop(); System.out.println("Ending structure " + structure.getName()); - structure.addAlignmentFill(); + structure.addAlignmentFill(state); ConfigDefinition.structures.put(structure.getName(), structure); structure.headerWrite(cHeader); if (state.stack.isEmpty()) { - totalTsSize = structure.writeTunerStudio("", tsHeader, 0); + totalTsSize = structure.writeTunerStudio(state,"", tsHeader, 0); tsHeader.write("; total TS size = " + totalTsSize + EOL); VariableRegistry.INSTANCE.register("TOTAL_CONFIG_SIZE", totalTsSize); @@ -266,17 +274,9 @@ public class ConfigDefinition { } } - private static void processLine(ReaderState state, String line) { - /** - * for example - * #define CLT_CURVE_SIZE 16 - */ - if (startsWithToken(line, DEFINE)) { - processDefine(line.substring(DEFINE.length()).trim()); - return; - } + private static void processField(ReaderState state, String line) { - ConfigField cf = ConfigField.parse(line); + ConfigField cf = ConfigField.parse(state, line); if (cf == null) throw new IllegalStateException("Cannot parse line [" + line + "]"); @@ -287,7 +287,7 @@ public class ConfigDefinition { if (cf.isIterate) { structure.addC(cf); for (int i = 1; i <= cf.arraySize; i++) { - ConfigField element = new ConfigField(cf.name + i, cf.comment, false, null, + ConfigField element = new ConfigField(state,cf.name + i, cf.comment, false, null, cf.type, 1, cf.tsInfo, false); structure.addTs(element); } diff --git a/java_tools/configuration_definition/src/com/rusefi/ConfigField.java b/java_tools/configuration_definition/src/com/rusefi/ConfigField.java index 15ee8858a6..b3e01fd131 100644 --- a/java_tools/configuration_definition/src/com/rusefi/ConfigField.java +++ b/java_tools/configuration_definition/src/com/rusefi/ConfigField.java @@ -17,7 +17,7 @@ import static com.rusefi.ConfigDefinition.EOL; * 1/15/15 */ public class ConfigField { - public static final ConfigField VOID = new ConfigField("", null, false, null, null, 1, null, false); + public static final ConfigField VOID = new ConfigField(null, "", null, false, null, null, 1, null, false); private static final String typePattern = "([\\w\\d_]+)(\\[([\\w\\d]+)(\\s([\\w\\d]+))?\\])?"; private static final String namePattern = "[[\\w\\d\\s_]]+"; @@ -49,7 +49,7 @@ public class ConfigField { */ public final boolean isIterate; - public ConfigField(String name, String comment, boolean isBit, String arraySizeAsText, String type, + public ConfigField(ReaderState state, String name, String comment, boolean isBit, String arraySizeAsText, String type, int arraySize, String tsInfo, boolean isIterate) { if (name == null) throw new NullPointerException(comment + " " + isBit + " " + type); @@ -59,11 +59,7 @@ public class ConfigField { this.isBit = isBit; this.arraySizeAsText = arraySizeAsText; this.type = type; - if (type == null) { - elementSize = 0; - } else { - elementSize = TypesHelper.getElementSize(type); - } + elementSize = TypesHelper.getElementSize(state, type); this.arraySize = arraySize; this.tsInfo = tsInfo; this.isIterate = isIterate; @@ -77,7 +73,7 @@ public class ConfigField { /** * @see ConfigDefinitionTest#testParseLine() */ - public static ConfigField parse(String line) { + public static ConfigField parse(ReaderState state, String line) { Matcher matcher = FIELD.matcher(line); if (!matcher.matches()) return null; @@ -97,7 +93,7 @@ public class ConfigField { String tsInfo = matcher.group(10); boolean isIterate = "iterate".equalsIgnoreCase(matcher.group(5)); - ConfigField field = new ConfigField(name, comment, false, arraySizeAsText, type, arraySize, + ConfigField field = new ConfigField(state, name, comment, false, arraySizeAsText, type, arraySize, tsInfo, isIterate); System.out.println("type " + type); System.out.println("name " + name); @@ -141,7 +137,7 @@ public class ConfigField { '}'; } - public int writeTunerStudio(String prefix, Writer tsHeader, int tsPosition, ConfigField next, int bitIndex) throws IOException { + public int writeTunerStudio(ReaderState state, String prefix, Writer tsHeader, int tsPosition, ConfigField next, int bitIndex) throws IOException { String nameWithPrefix = prefix + name; VariableRegistry.INSTANCE.register(nameWithPrefix + "_offset", tsPosition); @@ -149,7 +145,7 @@ public class ConfigField { ConfigStructure cs = ConfigDefinition.structures.get(type); if (cs != null) { String extraPrefix = cs.withPrefix ? name + "_" : ""; - return cs.writeTunerStudio(prefix + extraPrefix, tsHeader, tsPosition); + return cs.writeTunerStudio(state, prefix + extraPrefix, tsHeader, tsPosition); } if (isBit) { @@ -164,10 +160,10 @@ public class ConfigField { return tsPosition; } - if (ConfigDefinition.tsCustomLine.containsKey(type)) { - String bits = ConfigDefinition.tsCustomLine.get(type); + if (state.tsCustomLine.containsKey(type)) { + String bits = state.tsCustomLine.get(type); tsHeader.write("\t" + addTabsUpTo(nameWithPrefix, LENGTH)); - int size = ConfigDefinition.tsCustomSize.get(type); + int size = state.tsCustomSize.get(type); // tsHeader.headerWrite("\t" + size + ","); // tsHeader.headerWrite("\t" + tsPosition + ","); bits = bits.replaceAll("@OFFSET@", "" + tsPosition); diff --git a/java_tools/configuration_definition/src/com/rusefi/ConfigStructure.java b/java_tools/configuration_definition/src/com/rusefi/ConfigStructure.java index 887925a806..7106736fec 100644 --- a/java_tools/configuration_definition/src/com/rusefi/ConfigStructure.java +++ b/java_tools/configuration_definition/src/com/rusefi/ConfigStructure.java @@ -37,7 +37,7 @@ public class ConfigStructure { return name; } - public void addAlignmentFill() { + public void addAlignmentFill(ReaderState state) { bitState.reset(); /** * we make alignment decision based on C fields since we expect interation and non-iteration fields @@ -53,7 +53,7 @@ public class ConfigStructure { int fillSize = totalSize % 4 == 0 ? 0 : 4 - (totalSize % 4); if (fillSize != 0) { - ConfigField fill = new ConfigField("alignmentFill", "need 4 byte alignment", false, + ConfigField fill = new ConfigField(state, "alignmentFill", "need 4 byte alignment", false, "" + fillSize, UINT8_T, fillSize, null, false); addBoth(fill); @@ -86,12 +86,12 @@ public class ConfigStructure { cHeader.write("} " + name + ";" + ConfigDefinition.EOL + ConfigDefinition.EOL); } - public int writeTunerStudio(String prefix, Writer tsHeader, int tsPosition) throws IOException { + public int writeTunerStudio(ReaderState state, String prefix, Writer tsHeader, int tsPosition) throws IOException { FieldIterator fieldIterator = new FieldIterator(); for (int i = 0; i < tsFields.size(); i++) { ConfigField next = i == tsFields.size() - 1 ? ConfigField.VOID : tsFields.get(i + 1); ConfigField cf = tsFields.get(i); - tsPosition = cf.writeTunerStudio(prefix, tsHeader, tsPosition, next, fieldIterator.bitState.get()); + tsPosition = cf.writeTunerStudio(state, prefix, tsHeader, tsPosition, next, fieldIterator.bitState.get()); fieldIterator.bitState.incrementBitIndex(cf, next); } diff --git a/java_tools/configuration_definition/src/com/rusefi/ReaderState.java b/java_tools/configuration_definition/src/com/rusefi/ReaderState.java index c68a789cbb..51907d04cc 100644 --- a/java_tools/configuration_definition/src/com/rusefi/ReaderState.java +++ b/java_tools/configuration_definition/src/com/rusefi/ReaderState.java @@ -1,13 +1,17 @@ package com.rusefi; +import java.util.HashMap; +import java.util.Map; import java.util.Stack; /** * (c) Andrey Belomutskiy * 12/19/18 */ -class ReaderState { +public class ReaderState { Stack stack = new Stack<>(); + public Map tsCustomSize = new HashMap<>(); + public Map tsCustomLine = new HashMap<>(); public void ensureEmptyAfterProcessing() { if (!this.stack.isEmpty()) diff --git a/java_tools/configuration_definition/src/com/rusefi/TypesHelper.java b/java_tools/configuration_definition/src/com/rusefi/TypesHelper.java index 8de108a59d..9086c4d13a 100644 --- a/java_tools/configuration_definition/src/com/rusefi/TypesHelper.java +++ b/java_tools/configuration_definition/src/com/rusefi/TypesHelper.java @@ -9,13 +9,13 @@ import static com.rusefi.ConfigStructure.UINT_16_T; */ public class TypesHelper { - public static int getElementSize(String type) { + public static int getElementSize(ReaderState state, String type) { if (type == null) - throw new NullPointerException("type"); + return 0; if (ConfigDefinition.structures.containsKey(type)) return ConfigDefinition.structures.get(type).totalSize; - if (ConfigDefinition.tsCustomSize.containsKey(type)) - return ConfigDefinition.tsCustomSize.get(type); + if (state != null && state.tsCustomSize.containsKey(type)) + return state.tsCustomSize.get(type); if (type.equals(UINT8_T)) return 1; if (type.equals(INT_16_T) || type.equals(UINT_16_T)) { diff --git a/java_tools/configuration_definition/src/com/rusefi/test/ConfigDefinitionTest.java b/java_tools/configuration_definition/src/com/rusefi/test/ConfigDefinitionTest.java index 5f7184823c..5bb8ca5474 100644 --- a/java_tools/configuration_definition/src/com/rusefi/test/ConfigDefinitionTest.java +++ b/java_tools/configuration_definition/src/com/rusefi/test/ConfigDefinitionTest.java @@ -2,6 +2,7 @@ package com.rusefi.test; import com.rusefi.ConfigDefinition; import com.rusefi.ConfigField; +import com.rusefi.ReaderState; import org.junit.Test; import static org.junit.Assert.*; @@ -21,8 +22,9 @@ public class ConfigDefinitionTest { @Test public void testByteArray() { + ReaderState state = new ReaderState(); { - ConfigField cf = ConfigField.parse("uint8_t[8] field"); + ConfigField cf = ConfigField.parse(state, "uint8_t[8] field"); assertEquals(cf.type, "uint8_t"); assertEquals(cf.arraySize, 8); assertEquals(cf.getSize(null), 8); @@ -33,44 +35,45 @@ public class ConfigDefinitionTest { @Test public void testParseLine() { - assertNull(ConfigField.parse("int")); + ReaderState state = new ReaderState(); + assertNull(ConfigField.parse(state, "int")); { - ConfigField cf = ConfigField.parse("int field"); + ConfigField cf = ConfigField.parse(state, "int field"); assertEquals(cf.type, "int"); assertEquals("Name", cf.name, "field"); } { - ConfigField cf = ConfigField.parse("int_4 fie4_ld"); + ConfigField cf = ConfigField.parse(state, "int_4 fie4_ld"); assertEquals(cf.type, "int_4"); assertEquals(cf.name, "fie4_ld"); } { - ConfigField cf = ConfigField.parse("int_8 fi_eld;comm_;ts"); + ConfigField cf = ConfigField.parse(state, "int_8 fi_eld;comm_;ts"); assertEquals(cf.type, "int_8"); assertEquals(cf.name, "fi_eld"); assertEquals("Comment", cf.comment, "comm_"); assertEquals(cf.tsInfo, "ts"); } { - ConfigField cf = ConfigField.parse("int[3 iterate] field"); + ConfigField cf = ConfigField.parse(state, "int[3 iterate] field"); assertEquals(cf.type, "int"); assertEquals(cf.arraySize, 3); assertTrue("isIterate", cf.isIterate); } { - ConfigField cf = ConfigField.parse("int16_t crankingRpm;This,. value controls what RPM values we consider 'cranking' (any RPM below 'crankingRpm')\\nAnything above 'crankingRpm' would be 'running'"); + ConfigField cf = ConfigField.parse(state, "int16_t crankingRpm;This,. value controls what RPM values we consider 'cranking' (any RPM below 'crankingRpm')\\nAnything above 'crankingRpm' would be 'running'"); assertEquals(cf.name, "crankingRpm"); assertEquals(cf.arraySize, 1); assertEquals(cf.type, "int16_t"); } { - ConfigField cf = ConfigField.parse("MAP_sensor_config_s map"); + ConfigField cf = ConfigField.parse(state, "MAP_sensor_config_s map"); assertEquals(cf.name, "map"); assertEquals(cf.arraySize, 1); assertEquals(cf.type, "MAP_sensor_config_s"); } { - ConfigField cf = ConfigField.parse("MAP_sensor_config_s map;@see hasMapSensor\\n@see isMapAveragingEnabled"); + ConfigField cf = ConfigField.parse(state, "MAP_sensor_config_s map;@see hasMapSensor\\n@see isMapAveragingEnabled"); assertEquals(cf.name, "map"); assertEquals(cf.arraySize, 1); assertEquals(cf.type, "MAP_sensor_config_s");