SD card log fields list should be auto-generated #3985

This commit is contained in:
rusefillc 2022-10-09 21:39:20 -04:00
parent 060849c364
commit d16582c6c7
3 changed files with 98 additions and 1 deletions

View File

@ -4,6 +4,7 @@ import com.devexperts.logging.Logging;
import com.opensr5.ini.field.EnumIniField; import com.opensr5.ini.field.EnumIniField;
import com.rusefi.core.Pair; import com.rusefi.core.Pair;
import com.rusefi.output.ConfigStructure; import com.rusefi.output.ConfigStructure;
import com.rusefi.output.DataLogConsumer;
import com.rusefi.output.JavaFieldsConsumer; import com.rusefi.output.JavaFieldsConsumer;
import java.util.Arrays; import java.util.Arrays;
@ -397,7 +398,10 @@ public class ConfigField {
return isFromIterate; return isFromIterate;
} }
// todo: find more usages for this method? /**
* todo: find more usages for this method?
* @see DataLogConsumer.getComment
*/
public String getCommentOrName() { public String getCommentOrName() {
if (comment == null || comment.trim().isEmpty()) if (comment == null || comment.trim().isEmpty())
return quote(name); return quote(name);

View File

@ -0,0 +1,56 @@
package com.rusefi.output;
import static com.rusefi.output.JavaSensorsConsumer.quote;
import com.rusefi.ConfigField;
import com.rusefi.ReaderState;
import java.io.IOException;
public class SdCardFieldsConsumer implements ConfigurationConsumer {
private final StringBuilder body = new StringBuilder();
private final String outputFileName;
public SdCardFieldsConsumer(String outputFileName) {
this.outputFileName = outputFileName;
}
@Override
public void startFile() {
ConfigurationConsumer.super.startFile();
}
@Override
public void endFile() throws IOException {
ConfigurationConsumer.super.endFile();
}
@Override
public void handleEndStruct(ReaderState state, ConfigStructure structure) throws IOException {
if (state.stack.isEmpty()) {
PerFieldWithStructuresIterator iterator = new PerFieldWithStructuresIterator(state, structure.tsFields, "",
this::processOutput, ".");
iterator.loop();
String content = iterator.getContent();
body.append(content);
}
}
private String processOutput(ReaderState readerState, ConfigField configField, String prefix) {
return "\t{engine->outputChannels." + configField.getName() +
", "
+ DataLogConsumer.getComment(prefix, configField, readerState.variableRegistry) +
", " +
quote(configField.getUnits()) +
", " +
configField.getDigits() +
"},\n";
}
public String getBody() {
return body.toString();
}
}

View File

@ -0,0 +1,37 @@
package com.rusefi.test;
import static org.junit.Assert.assertEquals;
import com.rusefi.ReaderState;
import com.rusefi.output.SdCardFieldsConsumer;
import org.junit.Test;
public class SdCardFieldsGeneratorTest {
@Test
public void outputs() {
String test = "struct_no_prefix output_channels_s\n" +
"uint16_t autoscale RPMValue;@@GAUGE_NAME_RPM@@;\"RPM\",1, 0, 0, 8000, 0\n" +
"\n" +
"uint16_t rpmAcceleration;dRPM;\"RPM/s\",1, 0, 0, 5, 0\n" +
"\n" +
"\tuint16_t autoscale speedToRpmRatio;@@GAUGE_NAME_GEAR_RATIO@@;\"value\",{1/@@PACK_MULT_PERCENT@@}, 0, 0, 0, 0\n" +
"\tint8_t autoscale internalMcuTemperature;@@GAUGE_NAME_CPU_TEMP@@;\"deg C\",1, 0, 0, 0, 0\n" +
"end_struct";
ReaderState state = new ReaderState();
state.variableRegistry.register("PACK_MULT_PERCENT", 100);
state.variableRegistry.register("GAUGE_NAME_RPM", "\"hello\"");
state.variableRegistry.register("GAUGE_NAME_GEAR_RATIO", "ra");
state.variableRegistry.register("GAUGE_NAME_CPU_TEMP", "te");
SdCardFieldsConsumer consumer = new SdCardFieldsConsumer(null);
state.readBufferedReader(test, consumer);
assertEquals("\t{engine->outputChannels.RPMValue, \"hello\", \"RPM\", 0},\n" +
"\t{engine->outputChannels.rpmAcceleration, \"dRPM\", \"RPM/s\", 0},\n" +
"\t{engine->outputChannels.speedToRpmRatio, \"ra\", \"value\", 0},\n" +
"\t{engine->outputChannels.internalMcuTemperature, \"te\", \"deg C\", 0},\n" +
"\t{engine->outputChannels.alignmentFill_at_7, \"need 4 byte alignment\", \"units\", 0},\n", consumer.getBody());
}
}