automation around outputs section #197

datalog toolset
This commit is contained in:
rusefillc 2021-11-28 13:57:56 -05:00
parent 99716d83a9
commit 8674a8b830
7 changed files with 82 additions and 23 deletions

Binary file not shown.

View File

@ -30,7 +30,7 @@ import java.util.zip.CRC32;
@SuppressWarnings("StringConcatenationInsideStringBufferAppend")
public class ConfigDefinition {
private static final String SIGNATURE_HASH = "SIGNATURE_HASH";
private static String TS_OUTPUTS_SECTION = null;
private static String TS_OUTPUTS_DESTINATION = null;
public static String MESSAGE;
private static final String ROM_RAIDER_XML_TEMPLATE = "rusefi_template.xml";
@ -132,7 +132,7 @@ public class ConfigDefinition {
tsInputFileFolder = args[i + 1];
break;
case "-ts_outputs_section":
TS_OUTPUTS_SECTION = args[i + 1];
TS_OUTPUTS_DESTINATION = args[i + 1];
break;
case KEY_C_DESTINATION:
destCHeaderFileName = args[i + 1];
@ -285,9 +285,9 @@ public class ConfigDefinition {
BufferedReader definitionReader = new BufferedReader(new InputStreamReader(new FileInputStream(definitionInputFile), IoUtils.CHARSET.name()));
List<ConfigurationConsumer> destinations = new ArrayList<>();
if (TS_OUTPUTS_SECTION != null) {
destinations.add(new OutputsSectionConsumer(TS_OUTPUTS_SECTION, state));
destinations.add(new DataLogConsumer(state));
if (TS_OUTPUTS_DESTINATION != null) {
destinations.add(new OutputsSectionConsumer(TS_OUTPUTS_DESTINATION + File.separator + "output_channels.ini", state));
destinations.add(new DataLogConsumer(TS_OUTPUTS_DESTINATION + File.separator + "data_logs.ini", state));
}
if (tsInputFileFolder != null && needToUpdateTsFiles) {
CharArrayWriter tsWriter = new CharArrayWriter();

View File

@ -41,7 +41,7 @@ public class ConfigField {
private final String tsInfo;
private final boolean isIterate;
private final ReaderState state;
private boolean fsioVisible;
private final boolean fsioVisible;
private final boolean hasAutoscale;
private final String individualName;
private final int indexWithinArray;

View File

@ -8,7 +8,7 @@ public abstract class BaseCHeaderConsumer implements ConfigurationConsumer {
private static final String BOOLEAN_TYPE = "bool";
private final StringBuilder content = new StringBuilder();
public static String getHeaderText(ConfigField configField, int currentOffset, int bitIndex) {
private static String getHeaderText(ConfigField configField, int currentOffset, int bitIndex) {
if (configField.isBit()) {
String comment = "\t/**" + EOL + ConfigDefinition.packComment(configField.getCommentContent(), "\t") + "\toffset " + currentOffset + " bit " + bitIndex + " */" + EOL;
return comment + "\t" + BOOLEAN_TYPE + " " + configField.getName() + " : 1 {};" + EOL;

View File

@ -1,13 +1,22 @@
package com.rusefi.output;
import com.rusefi.ConfigField;
import com.rusefi.ReaderState;
import com.rusefi.TypesHelper;
import java.io.CharArrayWriter;
import java.io.FileWriter;
import java.io.IOException;
public class DataLogConsumer implements ConfigurationConsumer {
private final ReaderState state;
import static org.abego.treelayout.internal.util.java.lang.string.StringUtil.quote;
public DataLogConsumer(ReaderState state) {
public class DataLogConsumer implements ConfigurationConsumer {
private final String fileName;
private final ReaderState state;
private final CharArrayWriter tsWriter = new CharArrayWriter();
public DataLogConsumer(String fileName, ReaderState state) {
this.fileName = fileName;
this.state = state;
}
@ -27,6 +36,52 @@ public class DataLogConsumer implements ConfigurationConsumer {
public void handleEndStruct(ConfigStructure structure) throws IOException {
if (state.stack.isEmpty()) {
FieldIterator iterator = new FieldIterator(structure.tsFields);
for (int i = 0; i < structure.tsFields.size(); i++) {
iterator.start(i);
tsWriter.append(handle(iterator.cf));
iterator.end();
}
}
if (fileName != null) {
FileWriter fw = new FileWriter(fileName);
fw.write(tsWriter.toCharArray());
fw.close();
}
}
private String handle(ConfigField configField) {
if (configField.isBit()) {
return "";
}
if (configField.isArray()) {
return "";
}
// entry = seconds, @@GAUGE_NAME_UPTIME@@,
// entry = RPMValue, @@GAUGE_NAME_RPM@@,
String typeString;
String autoscaleSpec = configField.autoscaleSpec();
if (TypesHelper.isFloat(configField.getType()) || (autoscaleSpec != null && !autoscaleSpec.equals("1, 1"))) {
typeString = "float, \"%.3f\"";
} else {
typeString = "int, \"%d\"";
}
String comment = state.variableRegistry.applyVariables(configField.getComment());
if (comment.isEmpty() || comment.charAt(0) != '"')
comment = quote(comment);
return "entry = " + configField.getName() + ", " + comment + ", " + typeString + "\n";
}
public CharArrayWriter getTsWriter() {
return tsWriter;
}
}

View File

@ -1,11 +1,12 @@
package com.rusefi.output;
import com.opensr5.ini.field.IniField;
import com.rusefi.*;
import com.rusefi.ConfigField;
import com.rusefi.ReaderState;
import com.rusefi.TypesHelper;
import java.io.IOException;
import java.io.Writer;
import java.util.List;
import static com.rusefi.ToolUtil.EOL;
@ -100,10 +101,9 @@ public class TsOutput {
}
protected int writeTunerStudio(ConfigStructure configStructure, String prefix, Writer tsHeader, int tsPosition) throws IOException {
List<ConfigField> tsFields = configStructure.tsFields;
FieldIterator iterator = new FieldIterator(tsFields);
FieldIterator iterator = new FieldIterator(configStructure.tsFields);
int prevTsPosition = tsPosition;
for (int i = 0; i < tsFields.size(); i++) {
for (int i = 0; i < configStructure.tsFields.size(); i++) {
iterator.start(i);
// if duplicate names, use previous position

View File

@ -1,18 +1,15 @@
package com.rusefi.test;
import com.rusefi.ReaderState;
import com.rusefi.output.ConfigurationConsumer;
import com.rusefi.output.DataLogConsumer;
import com.rusefi.output.OutputsSectionConsumer;
import org.junit.Assert;
import org.junit.Test;
import java.io.BufferedReader;
import java.io.CharArrayWriter;
import java.io.IOException;
import java.io.StringReader;
import java.io.*;
import java.util.Collections;
import static org.junit.Assert.assertEquals;
public class OutputsTest {
@Test
public void generateSomething() throws IOException {
@ -29,7 +26,7 @@ public class OutputsTest {
state.readBufferedReader(reader, Collections.singletonList(tsProjectConsumer));
Assert.assertEquals("afr_type = scalar, F32, 0, \"ms\", 1, 0\n" +
assertEquals("afr_type = scalar, F32, 0, \"ms\", 1, 0\n" +
"afr_typet = scalar, U08, 4, \"ms\", 1, 0\n" +
"isForcedInduction = bits, U32, 5, [0:0]\n" +
"enableFan1WithAc = bits, U32, 5, [1:1]\n" +
@ -71,15 +68,22 @@ public class OutputsTest {
public void generateDataLog() throws IOException {
String test = "struct total\n" +
"float afr_type;PID dTime;\"ms\", 1, 0, 0, 3000, 0\n" +
"uint16_t autoscale speedToRpmRatio;s2rpm;\"value\",{1/@@PACK_MULT_PERCENT@@}, 0, 0, 0, 0\n" +
"uint8_t afr_typet;PID dTime;\"ms\", 1, 0, 0, 3000, 0\n" +
"uint8_t autoscale vehicleSpeedKph;;\"kph\",1, 0, 0, 0, 0\n" +
"bit isForcedInduction;Does the vehicle have a turbo or supercharger?\n" +
"bit enableFan1WithAc;+Turn on this fan when AC is on.\n" +
"end_struct\n";
ReaderState state = new ReaderState();
state.variableRegistry.register("PACK_MULT_PERCENT", 100);
BufferedReader reader = new BufferedReader(new StringReader(test));
DataLogConsumer dataLogConsumer = new DataLogConsumer(state);
DataLogConsumer dataLogConsumer = new DataLogConsumer(null, state);
state.readBufferedReader(reader, Collections.singletonList(dataLogConsumer));
assertEquals("entry = afr_type, \"PID dTime\", float, \"%.3f\"\n" +
"entry = speedToRpmRatio, \"s2rpm\", float, \"%.3f\"\n" +
"entry = afr_typet, \"PID dTime\", int, \"%d\"\n" +
"entry = vehicleSpeedKph, \"\", int, \"%d\"\n", new String(dataLogConsumer.getTsWriter().toCharArray()));
}
}