From 5854cbb75e723e3d382d328a5a7d26d25581b786 Mon Sep 17 00:00:00 2001 From: rusefillc Date: Tue, 14 Dec 2021 16:04:18 -0500 Subject: [PATCH] Lua to read tsOutputs #3376 --- java_tools/ConfigDefinition.jar | Bin 3584319 -> 3585167 bytes .../rusefi/output/GetConfigValueConsumer.java | 47 ++++++++++++++---- .../java/com/rusefi/test/OutputsTest.java | 12 +++-- 3 files changed, 47 insertions(+), 12 deletions(-) diff --git a/java_tools/ConfigDefinition.jar b/java_tools/ConfigDefinition.jar index f51fbac6f93ca7c00bd92d562fd3b251c57e014b..763302cefa4b6f3709c54e19302ef79e337ad3f5 100644 GIT binary patch delta 46170 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 Wdlv{=zWH8ofH_$P6t_WWf&T}~nXYR9 diff --git a/java_tools/configuration_definition/src/main/java/com/rusefi/output/GetConfigValueConsumer.java b/java_tools/configuration_definition/src/main/java/com/rusefi/output/GetConfigValueConsumer.java index 818dd2db92..629d5a880d 100644 --- a/java_tools/configuration_definition/src/main/java/com/rusefi/output/GetConfigValueConsumer.java +++ b/java_tools/configuration_definition/src/main/java/com/rusefi/output/GetConfigValueConsumer.java @@ -3,6 +3,7 @@ package com.rusefi.output; import com.rusefi.ConfigField; import com.rusefi.ReaderState; import com.rusefi.TypesHelper; +import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; import java.io.FileWriter; @@ -15,7 +16,13 @@ import static com.rusefi.output.DataLogConsumer.UNUSED; public class GetConfigValueConsumer extends AbstractConfigurationConsumer { public static final String CONFIG_ENGINE_CONFIGURATION = "config->engineConfiguration."; public static final String ENGINE_CONFIGURATION = "engineConfiguration."; - private final StringBuilder content = new StringBuilder(); + public static final String FILE_HEADER = "#include \"pch.h\"\n"; + public static final String GET_METHOD_HEADER = "float getConfigValueByName(const char *name) {\n"; + public static final String GET_METHOD_FOOTER = "\treturn EFI_ERROR_CODE;\n" + "}\n"; + public static final String SET_METHOD_HEADER = "void setConfigValueByName(const char *name, float value) {\n"; + public static final String SET_METHOD_FOOTER = "}\n"; + private final StringBuilder getterBody = new StringBuilder(); + private final StringBuilder setterBody = new StringBuilder(); private final String outputFIleName; public GetConfigValueConsumer(String outputFIleName) { @@ -42,15 +49,11 @@ public class GetConfigValueConsumer extends AbstractConfigurationConsumer { @Override public void startFile() { - content.append("#include \"pch.h\"\n"); - content.append("float getConfigValueByName(const char *name) {\n"); } @Override public void endFile() throws IOException { - content.append("\treturn EFI_ERROR_CODE;\n"); - content.append("}\n"); - writeStringToFile(outputFIleName, content.toString()); + writeStringToFile(outputFIleName, getContent()); } private String process(ReaderState readerState, ConfigField cf, String prefix) { @@ -66,17 +69,43 @@ public class GetConfigValueConsumer extends AbstractConfigurationConsumer { String userName = prefix + cf.getName(); if (userName.startsWith(ENGINE_CONFIGURATION)) userName = userName.substring(ENGINE_CONFIGURATION.length()); - content.append("\tif (strEqualCaseInsensitive(name, \"" + userName + "\"))\n"); String javaName = "config->" + prefix; if (javaName.startsWith(CONFIG_ENGINE_CONFIGURATION)) javaName = "engineConfiguration->" + javaName.substring(CONFIG_ENGINE_CONFIGURATION.length()); - content.append("\t\treturn " + javaName + cf.getName() + ";\n"); + getterBody.append(getCompareName(userName)); + getterBody.append("\t\treturn " + javaName + cf.getName() + ";\n"); + + if (TypesHelper.isFloat(cf.getType())) { + setterBody.append(getCompareName(userName)); + setterBody.append("\t{\n" + "\t\t" + javaName + cf.getName() + " = value;\n" + + "\t\treturn;\n\t}\n"); + } + + return ""; } + @NotNull + private String getCompareName(String userName) { + return "\tif (strEqualCaseInsensitive(name, \"" + userName + "\"))\n"; + } + + public String getGetterForUnitTest() { + return FILE_HEADER + + GET_METHOD_HEADER + getterBody + GET_METHOD_FOOTER; + } + + public String getSetterBody() { + return setterBody.toString(); + } + public String getContent() { - return content.toString(); + return FILE_HEADER + + GET_METHOD_HEADER + getterBody + GET_METHOD_FOOTER + + + SET_METHOD_HEADER + setterBody + SET_METHOD_FOOTER + ; } } diff --git a/java_tools/configuration_definition/src/main/java/com/rusefi/test/OutputsTest.java b/java_tools/configuration_definition/src/main/java/com/rusefi/test/OutputsTest.java index f19cf40f2f..cd35980c63 100644 --- a/java_tools/configuration_definition/src/main/java/com/rusefi/test/OutputsTest.java +++ b/java_tools/configuration_definition/src/main/java/com/rusefi/test/OutputsTest.java @@ -132,7 +132,7 @@ public class OutputsTest { assertEquals("#include \"pch.h\"\n" + "float getConfigValueByName(const char *name) {\n" + "\treturn EFI_ERROR_CODE;\n" + - "}\n", getConfigValueConsumer.getContent()); + "}\n", getConfigValueConsumer.getGetterForUnitTest()); } @Test @@ -152,6 +152,12 @@ public class OutputsTest { GetConfigValueConsumer getConfigValueConsumer = new GetConfigValueConsumer(null); state.readBufferedReader(test, Collections.singletonList(getConfigValueConsumer)); + assertEquals("\tif (strEqualCaseInsensitive(name, \"iat.config.tempC_1\"))\n" + + "\t{\n" + + "\t\tconfig->iat.config.tempC_1 = value;\n" + + "\t\treturn;\n" + + "\t}\n", getConfigValueConsumer.getSetterBody()); + assertEquals("#include \"pch.h\"\n" + "float getConfigValueByName(const char *name) {\n" + "\tif (strEqualCaseInsensitive(name, \"iat.config.tempC_1\"))\n" + @@ -159,7 +165,7 @@ public class OutputsTest { "\tif (strEqualCaseInsensitive(name, \"iat.adcChannel\"))\n" + "\t\treturn config->iat.adcChannel;\n" + "\treturn EFI_ERROR_CODE;\n" + - "}\n", getConfigValueConsumer.getContent()); + "}\n", getConfigValueConsumer.getGetterForUnitTest()); } @Test @@ -242,7 +248,7 @@ public class OutputsTest { "\tif (strEqualCaseInsensitive(name, \"vehicleSpeedKph\"))\n" + "\t\treturn config->vehicleSpeedKph;\n" + "\treturn EFI_ERROR_CODE;\n" + - "}\n", getConfigValueConsumer.getContent()); + "}\n", getConfigValueConsumer.getGetterForUnitTest()); }