diff --git a/java_tools/ConfigDefinition.jar b/java_tools/ConfigDefinition.jar index ca7bf9e0a5..c6d0e89232 100644 Binary files a/java_tools/ConfigDefinition.jar and b/java_tools/ConfigDefinition.jar differ diff --git a/java_tools/configuration_definition/src/main/java/com/rusefi/ConfigDefinition.java b/java_tools/configuration_definition/src/main/java/com/rusefi/ConfigDefinition.java index 776f04b6f2..b288c2e9a3 100644 --- a/java_tools/configuration_definition/src/main/java/com/rusefi/ConfigDefinition.java +++ b/java_tools/configuration_definition/src/main/java/com/rusefi/ConfigDefinition.java @@ -228,8 +228,7 @@ public class ConfigDefinition { state.destinations.add(new GaugeConsumer(tsOutputsDestination + File.separator + "generated/gauges.ini", state)); } if (tsInputFileFolder != null) { - CharArrayWriter tsWriter = new CharArrayWriter(); - state.destinations.add(new TSProjectConsumer(tsWriter, tsInputFileFolder, state)); + state.destinations.add(new TSProjectConsumer(tsInputFileFolder, state)); VariableRegistry tmpRegistry = new VariableRegistry(); // store the CRC32 as a built-in variable diff --git a/java_tools/configuration_definition/src/main/java/com/rusefi/output/OutputsSectionConsumer.java b/java_tools/configuration_definition/src/main/java/com/rusefi/output/OutputsSectionConsumer.java index 14b7d61335..551320946c 100644 --- a/java_tools/configuration_definition/src/main/java/com/rusefi/output/OutputsSectionConsumer.java +++ b/java_tools/configuration_definition/src/main/java/com/rusefi/output/OutputsSectionConsumer.java @@ -11,7 +11,6 @@ public class OutputsSectionConsumer implements ConfigurationConsumer { private final String tsOutputsSectionFileName; private final TsOutput tsOutput; private final ReaderState state; - private final StringBuilder tsWriter = new StringBuilder(); public OutputsSectionConsumer(String tsOutputsSectionFileName, ReaderState state) { this.tsOutputsSectionFileName = tsOutputsSectionFileName; @@ -20,7 +19,7 @@ public class OutputsSectionConsumer implements ConfigurationConsumer { } public String getContent() { - return tsWriter.toString(); + return tsOutput.getContent(); } @Override @@ -28,11 +27,11 @@ public class OutputsSectionConsumer implements ConfigurationConsumer { System.out.println("handleEndStruct"); if (state.stack.isEmpty()) { - tsOutput.writeFields(structure, "", tsWriter, 0); + tsOutput.writeFields(structure, "", 0); if (tsOutputsSectionFileName != null) { FileWriter fos = new FileWriter(tsOutputsSectionFileName); - fos.write(tsWriter.toString()); + fos.write(tsOutput.getContent()); fos.close(); } } diff --git a/java_tools/configuration_definition/src/main/java/com/rusefi/output/TSProjectConsumer.java b/java_tools/configuration_definition/src/main/java/com/rusefi/output/TSProjectConsumer.java index 1ed981da91..07d261a02d 100644 --- a/java_tools/configuration_definition/src/main/java/com/rusefi/output/TSProjectConsumer.java +++ b/java_tools/configuration_definition/src/main/java/com/rusefi/output/TSProjectConsumer.java @@ -21,14 +21,12 @@ public class TSProjectConsumer implements ConfigurationConsumer { public static final String SETTING_CONTEXT_HELP_END = "SettingContextHelpEnd"; public static final String SETTING_CONTEXT_HELP = "SettingContextHelp"; - private final CharArrayWriter tsWriter; private final String tsPath; private final ReaderState state; private int totalTsSize; private final TsOutput tsOutput; - public TSProjectConsumer(CharArrayWriter tsWriter, String tsPath, ReaderState state) { - this.tsWriter = tsWriter; + public TSProjectConsumer(String tsPath, ReaderState state) { this.tsPath = tsPath; tsOutput = new TsOutput(state, true); this.state = state; @@ -142,16 +140,19 @@ public class TSProjectConsumer implements ConfigurationConsumer { @Override public void endFile() throws IOException { - writeTunerStudioFile(tsPath, tsWriter.toString()); + writeTunerStudioFile(tsPath, getContent()); } @Override public void handleEndStruct(ReaderState readerState, ConfigStructure structure) throws IOException { state.variableRegistry.register(structure.name + "_size", structure.getTotalSize()); if (state.stack.isEmpty()) { - totalTsSize = tsOutput.writeFields(structure, "", tsWriter, 0); - tsWriter.write("; total TS size = " + totalTsSize + EOL); + totalTsSize = tsOutput.writeFields(structure, "", 0); state.variableRegistry.register("TOTAL_CONFIG_SIZE", totalTsSize); } } + + public String getContent() { + return tsOutput.getContent(); + } } diff --git a/java_tools/configuration_definition/src/main/java/com/rusefi/output/TsOutput.java b/java_tools/configuration_definition/src/main/java/com/rusefi/output/TsOutput.java index a04bcc7c98..dd2e65e5b4 100644 --- a/java_tools/configuration_definition/src/main/java/com/rusefi/output/TsOutput.java +++ b/java_tools/configuration_definition/src/main/java/com/rusefi/output/TsOutput.java @@ -13,21 +13,27 @@ import static com.rusefi.ToolUtil.EOL; * Same code is used to generate [Constants] and [OutputChannels] bodies, with just one flag controlling the minor * difference in behaviours */ +@SuppressWarnings({"StringConcatenationInsideStringBufferAppend", "DanglingJavadoc"}) public class TsOutput { private final StringBuilder settingContextHelp = new StringBuilder(); private final ReaderState state; private final boolean isConstantsSection; + private final StringBuilder tsHeader = new StringBuilder(); public TsOutput(ReaderState state, boolean longForm) { this.state = state; this.isConstantsSection = longForm; } + public String getContent() { + return tsHeader.toString(); + } + public StringBuilder getSettingContextHelp() { return settingContextHelp; } - private int writeOneField(FieldIterator it, String prefix, Appendable tsHeader, int tsPosition) throws IOException { + private int writeOneField(FieldIterator it, String prefix, int tsPosition) throws IOException { ConfigField configField = it.cf; ConfigField next = it.next; int bitIndex = it.bitState.get(); @@ -47,7 +53,7 @@ public class TsOutput { if (cs != null) { String extraPrefix = cs.withPrefix ? configField.getName() + "_" : ""; - return writeFields(cs, prefix + extraPrefix, tsHeader, tsPosition); + return writeFields(cs, prefix + extraPrefix, tsPosition); } if (configField.isBit()) { @@ -98,7 +104,7 @@ public class TsOutput { } else { tsHeader.append("x"); } - tsHeader.append(Integer.toString(size)); + tsHeader.append(size); } tsHeader.append("], " + handleTsInfo(configField.getTsInfo(), 1)); @@ -109,15 +115,19 @@ public class TsOutput { return tsPosition; } - protected int writeFields(ConfigStructure configStructure, String prefix, Appendable tsHeader, int tsPosition) throws IOException { + protected int writeFields(ConfigStructure configStructure, String prefix, int tsPosition) throws IOException { FieldIterator iterator = new FieldIterator(configStructure.tsFields); for (int i = 0; i < configStructure.tsFields.size(); i++) { iterator.start(i); - tsPosition = writeOneField(iterator, prefix, tsHeader, tsPosition); + tsPosition = writeOneField(iterator, prefix, tsPosition); iterator.end(); } + if (prefix.isEmpty()) { + // empty prefix means top level + tsHeader.append("; total TS size = " + tsPosition + EOL); + } return tsPosition; } diff --git a/java_tools/configuration_definition/src/test/java/com/rusefi/test/BitParsingTest.java b/java_tools/configuration_definition/src/test/java/com/rusefi/test/BitParsingTest.java index de6642bac2..30d927e8b4 100644 --- a/java_tools/configuration_definition/src/test/java/com/rusefi/test/BitParsingTest.java +++ b/java_tools/configuration_definition/src/test/java/com/rusefi/test/BitParsingTest.java @@ -24,7 +24,7 @@ public class BitParsingTest { StringWriter sw = new StringWriter(); - TSProjectConsumer javaFieldsConsumer = new TSProjectConsumer(new CharArrayWriter(), "", state) { + TSProjectConsumer javaFieldsConsumer = new TSProjectConsumer("", state) { @Override protected void writeTunerStudioFile(String tsPath, String fieldsSection) throws IOException { writeContent(fieldsSection, new TsFileContent("", ""), createOutput(sw)); diff --git a/java_tools/configuration_definition/src/test/java/com/rusefi/test/ConfigFieldParserTest.java b/java_tools/configuration_definition/src/test/java/com/rusefi/test/ConfigFieldParserTest.java index 2174c2aed2..8b584f3534 100644 --- a/java_tools/configuration_definition/src/test/java/com/rusefi/test/ConfigFieldParserTest.java +++ b/java_tools/configuration_definition/src/test/java/com/rusefi/test/ConfigFieldParserTest.java @@ -10,10 +10,7 @@ import com.rusefi.output.JavaFieldsConsumer; import com.rusefi.output.TSProjectConsumer; import org.junit.Test; -import java.io.CharArrayWriter; import java.io.IOException; -import java.util.Arrays; -import java.util.Collections; import static org.junit.Assert.*; @@ -58,12 +55,11 @@ public class ConfigFieldParserTest { "end_struct\n"; ReaderState state = new ReaderState(); - CharArrayWriter writer = new CharArrayWriter(); - TestTSProjectConsumer tsProjectConsumer = new TestTSProjectConsumer(writer, "", state); + TestTSProjectConsumer tsProjectConsumer = new TestTSProjectConsumer("", state); state.readBufferedReader(test, tsProjectConsumer); assertEquals("afr_type = scalar, F32, 0, \"ms\", 1, 0, 0, 3000, 0\n" + "afr_typet = scalar, F32, 4, \"ms\", 1, 0, 0, 3000, 0\n" + - "; total TS size = 8\n", new String(writer.toCharArray())); + "; total TS size = 8\n", tsProjectConsumer.getContent()); } @Test(expected = IllegalStateException.class) @@ -89,11 +85,10 @@ public class ConfigFieldParserTest { "end_struct\n"; ReaderState state = new ReaderState(); - CharArrayWriter writer = new CharArrayWriter(); - TestTSProjectConsumer tsProjectConsumer = new TestTSProjectConsumer(writer, "", state); + TestTSProjectConsumer tsProjectConsumer = new TestTSProjectConsumer("", state); state.readBufferedReader(test, (tsProjectConsumer)); assertEquals("afr_type = bits, S32, 0, [0:1], \"BPSX\", \"Innovate\", \"14Point7\", \"INVALID\"\n" + - "; total TS size = 4\n", new String(writer.toCharArray())); + "; total TS size = 4\n", tsProjectConsumer.getContent()); } @Test @@ -162,16 +157,15 @@ public class ConfigFieldParserTest { "end_struct\n" + ""; - CharArrayWriter writer = new CharArrayWriter(); ReaderState state = new ReaderState(); - TSProjectConsumer tsProjectConsumer = new TestTSProjectConsumer(writer, "", state); + TSProjectConsumer tsProjectConsumer = new TestTSProjectConsumer("", state); state.readBufferedReader(test, (tsProjectConsumer)); assertEquals("periodMs = scalar, S16, 0, \"ms\", 0.1, 0, 0, 3000, 0\n" + "periodMs2 = scalar, S16, 2, \"ms\", 1, 0, 0, 3000, 0\n" + "afrTable = array, U08, 4, [4x4],\"deg\", 0.1, 0, 0, 25.0, 1\n" + - "; total TS size = 20\n", new String(writer.toCharArray())); + "; total TS size = 20\n", tsProjectConsumer.getContent()); } @Test @@ -376,8 +370,7 @@ public class ConfigFieldParserTest { "end_struct\n"; ReaderState state = new ReaderState(); - CharArrayWriter writer = new CharArrayWriter(); - TestTSProjectConsumer tsProjectConsumer = new TestTSProjectConsumer(writer, "", state); + TestTSProjectConsumer tsProjectConsumer = new TestTSProjectConsumer("", state); state.readBufferedReader(test, (tsProjectConsumer)); assertEquals("pid_afr_type = scalar, F32, 0, \"ms\", 1, 0, 0, 3000, 0\n" + "pid_afr_typet = scalar, F32, 4, \"ms\", 1, 0, 0, 3000, 0\n" + @@ -413,7 +406,7 @@ public class ConfigFieldParserTest { "pid_unusedBit_4_29 = bits, U32, 8, [29:29], \"false\", \"true\"\n" + "pid_unusedBit_4_30 = bits, U32, 8, [30:30], \"false\", \"true\"\n" + "pid_unusedBit_4_31 = bits, U32, 8, [31:31], \"false\", \"true\"\n" + - "; total TS size = 12\n", new String(writer.toCharArray())); + "; total TS size = 12\n", tsProjectConsumer.getContent()); assertEquals( "\tpid_afr_type = \"PID dTime\"\n" + "\tpid_afr_typet = \"PID dTime\"\n" + diff --git a/java_tools/configuration_definition/src/test/java/com/rusefi/test/OutputsTest.java b/java_tools/configuration_definition/src/test/java/com/rusefi/test/OutputsTest.java index 867591be78..126857663d 100644 --- a/java_tools/configuration_definition/src/test/java/com/rusefi/test/OutputsTest.java +++ b/java_tools/configuration_definition/src/test/java/com/rusefi/test/OutputsTest.java @@ -58,7 +58,8 @@ public class OutputsTest { "unusedBit_4_29 = bits, U32, 5, [29:29]\n" + "unusedBit_4_30 = bits, U32, 5, [30:30]\n" + "unusedBit_4_31 = bits, U32, 5, [31:31]\n" + - "alignmentFill_at_9 = array, U08, 9, [3], \"units\", 1, 0\n", new String(tsProjectConsumer.getContent())); + "alignmentFill_at_9 = array, U08, 9, [3], \"units\", 1, 0\n" + + "; total TS size = 12\n", tsProjectConsumer.getContent()); } diff --git a/java_tools/configuration_definition/src/test/java/com/rusefi/test/TSProjectConsumerTest.java b/java_tools/configuration_definition/src/test/java/com/rusefi/test/TSProjectConsumerTest.java index 8a165f39cf..d8ecf69f03 100644 --- a/java_tools/configuration_definition/src/test/java/com/rusefi/test/TSProjectConsumerTest.java +++ b/java_tools/configuration_definition/src/test/java/com/rusefi/test/TSProjectConsumerTest.java @@ -8,7 +8,6 @@ import org.junit.Test; import java.io.CharArrayWriter; import java.io.IOException; -import java.util.Arrays; import static org.junit.Assert.assertEquals; @@ -41,9 +40,8 @@ public class TSProjectConsumerTest { "end_struct\n" + ""; - CharArrayWriter writer = new CharArrayWriter(); ReaderState state = new ReaderState(); - TSProjectConsumer tsProjectConsumer = new TestTSProjectConsumer(writer, "", state); + TSProjectConsumer tsProjectConsumer = new TestTSProjectConsumer("", state); JavaFieldsConsumer javaFieldsConsumer = new TestJavaFieldsConsumer(state); @@ -62,7 +60,7 @@ public class TSProjectConsumerTest { "afrTable = array, U08, 2, [4x4],\"deg\", 0.1, 0, 0, 25.0, 1\n" + "#endif\n" + "periodMs = scalar, S16, 18, \"ms\", 0.1, 0, 0, 3000, 0\n" + - "; total TS size = 20\n", new String(writer.toCharArray())); + "; total TS size = 20\n", tsProjectConsumer.getContent()); assertEquals("\tpublic static final Field PERIODMS2 = Field.create(\"PERIODMS2\", 0, FieldType.INT16).setScale(1.0);\n" + "\tpublic static final Field AFRTABLE = Field.create(\"AFRTABLE\", 2, FieldType.INT).setScale(1.0);\n" + diff --git a/java_tools/configuration_definition/src/test/java/com/rusefi/test/TestTSProjectConsumer.java b/java_tools/configuration_definition/src/test/java/com/rusefi/test/TestTSProjectConsumer.java index 236fcdd4f2..0f06680b1b 100644 --- a/java_tools/configuration_definition/src/test/java/com/rusefi/test/TestTSProjectConsumer.java +++ b/java_tools/configuration_definition/src/test/java/com/rusefi/test/TestTSProjectConsumer.java @@ -6,8 +6,8 @@ import com.rusefi.output.TSProjectConsumer; import java.io.CharArrayWriter; public class TestTSProjectConsumer extends TSProjectConsumer { - public TestTSProjectConsumer(CharArrayWriter writer, String tsPath, ReaderState state) { - super(writer, tsPath, state); + public TestTSProjectConsumer(String tsPath, ReaderState state) { + super(tsPath, state); } @Override