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 645cc4b9ea..776f04b6f2 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 @@ -218,6 +218,11 @@ public class ConfigDefinition { */ if (tsOutputsDestination != null) { + /** + * we have one JVM instance produce output section based on model fragments, and then + * we have '-readfile OUTPUTS_SECTION' in one of .sh files in order to template rusefi.input + * Same with '-readfile DATALOG_SECTION' + */ state.destinations.add(new OutputsSectionConsumer(tsOutputsDestination + File.separator + "generated/output_channels.ini", state)); state.destinations.add(new DataLogConsumer(tsOutputsDestination + File.separator + "generated/data_logs.ini")); state.destinations.add(new GaugeConsumer(tsOutputsDestination + File.separator + "generated/gauges.ini", state)); 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 8b7937ea36..683d665673 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,7 @@ public class OutputsSectionConsumer implements ConfigurationConsumer { private final String tsOutputsSectionFileName; private final TsOutput tsOutput; private final ReaderState state; - private final CharArrayWriter tsWriter = new CharArrayWriter(); + private final StringBuilder tsWriter = new StringBuilder(); public OutputsSectionConsumer(String tsOutputsSectionFileName, ReaderState state) { this.tsOutputsSectionFileName = tsOutputsSectionFileName; @@ -19,8 +19,8 @@ public class OutputsSectionConsumer implements ConfigurationConsumer { this.state = state; } - public CharArrayWriter getTsWriter() { - return tsWriter; + public String getContent() { + return tsWriter.toString(); } @Override @@ -32,7 +32,7 @@ public class OutputsSectionConsumer implements ConfigurationConsumer { if (tsOutputsSectionFileName != null) { FileWriter fos = new FileWriter(tsOutputsSectionFileName); - fos.write(tsWriter.toCharArray()); + fos.write(tsWriter.toString()); fos.close(); } } 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 685590518f..eec5dad144 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 @@ -6,7 +6,6 @@ import com.rusefi.ReaderState; import com.rusefi.TypesHelper; import java.io.IOException; -import java.io.Writer; import static com.rusefi.ToolUtil.EOL; @@ -28,15 +27,15 @@ public class TsOutput { return settingContextHelp; } - private int writeTunerStudio(FieldIterator it, String prefix, Writer tsHeader, int tsPosition) throws IOException { + private int writeTunerStudio(FieldIterator it, String prefix, Appendable tsHeader, int tsPosition) throws IOException { ConfigField configField = it.cf; ConfigField next = it.next; int bitIndex = it.bitState.get(); String nameWithPrefix = prefix + configField.getName(); if (configField.isDirective() && configField.getComment() != null) { - tsHeader.write(configField.getComment()); - tsHeader.write(EOL); + tsHeader.append(configField.getComment()); + tsHeader.append(EOL); return tsPosition; } @@ -52,13 +51,13 @@ public class TsOutput { } if (configField.isBit()) { - tsHeader.write(nameWithPrefix + " = bits, U32,"); - tsHeader.write(" " + tsPosition + ", ["); - tsHeader.write(bitIndex + ":" + bitIndex); - tsHeader.write("]"); + tsHeader.append(nameWithPrefix + " = bits, U32,"); + tsHeader.append(" " + tsPosition + ", ["); + tsHeader.append(bitIndex + ":" + bitIndex); + tsHeader.append("]"); if (isConstantsSection) - tsHeader.write(", \"" + configField.getFalseName() + "\", \"" + configField.getTrueName() + "\""); - tsHeader.write(EOL); + tsHeader.append(", \"" + configField.getFalseName() + "\", \"" + configField.getTrueName() + "\""); + tsHeader.append(EOL); tsPosition += configField.getSize(next); return tsPosition; @@ -71,46 +70,46 @@ public class TsOutput { } bits = bits.replaceAll("@OFFSET@", "" + tsPosition); - tsHeader.write(nameWithPrefix + " = " + bits); + tsHeader.append(nameWithPrefix + " = " + bits); if (!configField.getName().equals(next.getName())) tsPosition += configField.getState().tsCustomSize.get(configField.getType()); } else if (configField.getTsInfo() == null) { throw new IllegalArgumentException("Need TS info for " + configField.getName() + " at " + prefix); } else if (configField.getArraySizes().length == 0) { - tsHeader.write(nameWithPrefix + " = scalar, "); - tsHeader.write(TypesHelper.convertToTs(configField.getType()) + ","); - tsHeader.write(" " + tsPosition + ","); - tsHeader.write(" " + handleTsInfo(configField.getTsInfo(), 1)); + tsHeader.append(nameWithPrefix + " = scalar, "); + tsHeader.append(TypesHelper.convertToTs(configField.getType()) + ","); + tsHeader.append(" " + tsPosition + ","); + tsHeader.append(" " + handleTsInfo(configField.getTsInfo(), 1)); if (!configField.getName().equals(next.getName())) tsPosition += configField.getSize(next); } else if (configField.getSize(next) == 0) { // write nothing for empty array // TS does not like those } else { - tsHeader.write(nameWithPrefix + " = array, "); - tsHeader.write(TypesHelper.convertToTs(configField.getType()) + ","); - tsHeader.write(" " + tsPosition + ","); - tsHeader.write(" ["); + tsHeader.append(nameWithPrefix + " = array, "); + tsHeader.append(TypesHelper.convertToTs(configField.getType()) + ","); + tsHeader.append(" " + tsPosition + ","); + tsHeader.append(" ["); boolean first = true; for (int size : configField.getArraySizes()) { if (first) { first = false; } else { - tsHeader.write("x"); + tsHeader.append("x"); } - tsHeader.write(Integer.toString(size)); + tsHeader.append(Integer.toString(size)); } - tsHeader.write("], " + handleTsInfo(configField.getTsInfo(), 1)); + tsHeader.append("], " + handleTsInfo(configField.getTsInfo(), 1)); if (!configField.getName().equals(next.getName())) tsPosition += configField.getSize(next); } - tsHeader.write(EOL); + tsHeader.append(EOL); return tsPosition; } - protected int writeTunerStudio(ConfigStructure configStructure, String prefix, Writer tsHeader, int tsPosition) throws IOException { + protected int writeTunerStudio(ConfigStructure configStructure, String prefix, Appendable tsHeader, int tsPosition) throws IOException { FieldIterator iterator = new FieldIterator(configStructure.tsFields); for (int i = 0; i < configStructure.tsFields.size(); i++) { iterator.start(i); 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 7eb90ac7a0..867591be78 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 @@ -6,8 +6,6 @@ import com.rusefi.output.*; import org.junit.Test; import java.io.IOException; -import java.util.Arrays; -import java.util.Collections; import static org.junit.Assert.assertEquals; @@ -60,7 +58,7 @@ 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.getTsWriter().toCharArray())); + "alignmentFill_at_9 = array, U08, 9, [3], \"units\", 1, 0\n", new String(tsProjectConsumer.getContent())); }