diff --git a/java_console/io/build.gradle b/java_console/io/build.gradle index 1dc3da1bab..02838ea6b9 100644 --- a/java_console/io/build.gradle +++ b/java_console/io/build.gradle @@ -26,6 +26,8 @@ dependencies { implementation global_libs.json implementation ts_plugin_libs.httpclient + testImplementation project(':config_definition') + // junit 4.13 does not mix well with httpclient :( testImplementation group: 'junit', name: 'junit', version: '4.8.2' testFixturesImplementation global_libs.mockito diff --git a/java_console/io/src/test/java/com/rusefi/tune/LoadOlderTuneTest.java b/java_console/io/src/test/java/com/rusefi/tune/LoadOlderTuneTest.java index e930be7a98..4fb8dfcee2 100644 --- a/java_console/io/src/test/java/com/rusefi/tune/LoadOlderTuneTest.java +++ b/java_console/io/src/test/java/com/rusefi/tune/LoadOlderTuneTest.java @@ -2,13 +2,20 @@ package com.rusefi.tune; import com.opensr5.ini.DialogModel; import com.opensr5.ini.IniFileModel; +import com.rusefi.*; import com.rusefi.core.preferences.storage.Node; import com.rusefi.tools.tune.TuneTools; +import com.rusefi.output.ConfigStructure; import com.rusefi.tune.xml.Constant; import com.rusefi.tune.xml.Msq; import com.rusefi.tune.xml.Page; import org.junit.Test; +import java.nio.file.Files; +import java.nio.file.Paths; +import java.util.List; + +import static com.rusefi.VariableRegistry.unquote; import static com.rusefi.tune.TuneReadWriteTest.SRC_TEST_RESOURCES; import static com.rusefi.tune.TuneReadWriteTest.TEST_INI; import static org.junit.Assert.assertEquals; @@ -26,6 +33,13 @@ public class LoadOlderTuneTest { IniFileModel ini = new IniFileModel().readIniFile(TEST_INI); assertFalse(ini.fieldsInUiOrder.isEmpty()); + List options = Files.readAllLines(Paths.get("../../" + ConfigDefinition.CONFIG_PATH)); + String[] totalArgs = options.toArray(new String[0]); + + RootHolder.ROOT = "../../firmware/"; + ReaderStateImpl state = new ReaderStateImpl(); + ConfigDefinition.doJob(totalArgs, state); + StringBuilder sb = new StringBuilder(); for (DialogModel.Field f : ini.fieldsInUiOrder) { String name = f.getKey(); @@ -38,15 +52,55 @@ public class LoadOlderTuneTest { boolean isSameValue = simplerSpaces(defaultValue.getValue()).equals(simplerSpaces(customValue.getValue())); if (!isSameValue) { - if (!Node.isNumeric(customValue.getValue())) { - // todo: smarter logic for enums + ConfigStructure s = state.getStructures().get("engine_configuration_s"); + System.out.println(s); + ConfigField cf = s.getTsFieldByName(name); + if (cf == null) { + System.out.println("Not found " + name); continue; } - sb.append("\tengineConfiguration->" + customValue.getName() + " = " + customValue.getValue() + ";\n"); + + if (cf.getType().equals("boolean")) { + // todo + continue; + } + + + if (!Node.isNumeric(customValue.getValue())) { + // todo: smarter logic for enums + + String type = cf.getType(); + if (isHardwareEnum(type)) { + continue; + } + EnumsReader.EnumState sourceCodeEnum = state.getEnumsReader().getEnums().get(type); + if (sourceCodeEnum == null) { + System.out.println("No info for " + type); + continue; + } + String customEnum = state.getTsCustomLine().get(type); + + int ordinal; + try { + ordinal = TuneTools.resolveEnumByName(customEnum, unquote(customValue.getValue())); + } catch (IllegalStateException e) { + System.out.println("Looks like things were renamed: " + customValue.getValue() + " not found in " + customEnum); + continue; + } + + System.out.println(cf + " " + sourceCodeEnum + " " + customEnum + " " + ordinal); + + String sourceCodeValue = sourceCodeEnum.findByValue(ordinal); + sb.append(TuneTools.getAssignmentCode(customValue.getName(), sourceCodeValue)); + + continue; + } + sb.append(TuneTools.getAssignmentCode(customValue.getName(), customValue.getValue())); } } - assertEquals("\tengineConfiguration->cylindersCount = 4;\n" + + assertEquals("\tengineConfiguration->ignitionMode = IM_ONE_COIL;\n" + + "\tengineConfiguration->cylindersCount = 4;\n" + "\tengineConfiguration->tps1SecondaryMin = 0.0;\n" + "\tengineConfiguration->tps1SecondaryMax = 1000.0;\n" + "\tengineConfiguration->tps2SecondaryMin = 0.0;\n" + @@ -55,8 +109,18 @@ public class LoadOlderTuneTest { "\tengineConfiguration->mc33_hvolt = 0.0;\n" + "\tengineConfiguration->mc33_i_boost = 0.0;\n" + "\tengineConfiguration->mc33_i_peak = 0.0;\n" + - "\tengineConfiguration->mc33_i_hold = 0.0;\n" + - "\tengineConfiguration->mc33_t_max_boost = 0.", sb.substring(0, 500)); + "\tengineConfiguration->mc33_i_hold ", sb.substring(0, 500)); + } + + private static boolean isHardwareEnum(String type) { + switch (type) { + case "output_pin_e": + case "brain_input_pin_e": + case "adc_channel_e": + case "Gpio": + return true; + } + return false; } private static Object simplerSpaces(String value) { diff --git a/java_console/io/src/test/resources/frankenso/test-CurrentTune.msq b/java_console/io/src/test/resources/frankenso/test-CurrentTune.msq index 799820ffc2..b0d47610cf 100644 --- a/java_console/io/src/test/resources/frankenso/test-CurrentTune.msq +++ b/java_console/io/src/test/resources/frankenso/test-CurrentTune.msq @@ -183,7 +183,7 @@ "Sequential" 0.0 0.0 -"One coil" +"Single coil" 0.0 "dynamic" 50.0 diff --git a/java_console/io/src/test/resources/frankenso/test-mainController.ini b/java_console/io/src/test/resources/frankenso/test-mainController.ini index 624c9b19bd..87751d7865 100644 --- a/java_console/io/src/test/resources/frankenso/test-mainController.ini +++ b/java_console/io/src/test/resources/frankenso/test-mainController.ini @@ -184,7 +184,7 @@ page = 1 injectionMode = bits, U32, 428, [0:7], "Simultaneous", "Sequential", "Batch", "Single Point" extraInjectionOffset = scalar, F32, 432, "deg", 1, 0.0, -720, 720, 2 crankingTimingAngle = scalar, F32, 436, "deg", 1, 0.0, -360, 360, 2 - ignitionMode = bits, U32, 440, [0:7], "One coil", "Individual Coils", "Wasted", "Two distributors" + ignitionMode = bits, U32, 440, [0:7], "Single coil", "Individual Coils", "Wasted", "Two distributors" ignitionOffset = scalar, F32, 444, "RPM", 1, 0, 0, 3000.0, 0 timingMode = bits, U32, 448 [0:0], "dynamic", "fixed" fixedModeTiming = scalar, F32, 452, "RPM", 1, 0, 0, 3000.0, 0 diff --git a/java_console/models/src/main/java/com/rusefi/tools/tune/TuneTools.java b/java_console/models/src/main/java/com/rusefi/tools/tune/TuneTools.java index 71174f52a0..d91b43b11e 100644 --- a/java_console/models/src/main/java/com/rusefi/tools/tune/TuneTools.java +++ b/java_console/models/src/main/java/com/rusefi/tools/tune/TuneTools.java @@ -1,5 +1,7 @@ package com.rusefi.tools.tune; +import org.jetbrains.annotations.NotNull; + public class TuneTools { private static String quote(String string) { return "\"" + string + "\""; @@ -16,4 +18,9 @@ public class TuneTools { } throw new IllegalStateException("Enum name [" + key + "] not found in " + tsCustomLine); } + + @NotNull + public static String getAssignmentCode(String name, String value) { + return "\tengineConfiguration->" + name + " = " + value + ";\n"; + } } 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 10207159f7..e6deff63c8 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 @@ -32,6 +32,7 @@ public class ConfigDefinition { private static final String KEY_SIGNATURE_DESTINATION = "-signature_destination"; private static final String KEY_ZERO_INIT = "-initialize_to_zero"; private static final String KEY_BOARD_NAME = "-board"; + public static final String CONFIG_PATH = "java_tools/configuration_definition/src/main/resources/config_definition.options"; /** * This flag controls if we assign default zero value (useful while generating structures used for class inheritance) * versus not assigning default zero value like we need for non-class headers @@ -41,7 +42,7 @@ public class ConfigDefinition { public static void main(String[] args) { try { - List options = Files.readAllLines(Paths.get("../java_tools/configuration_definition/src/main/resources/config_definition.options")); + List options = Files.readAllLines(Paths.get("../" + CONFIG_PATH)); options.addAll(Arrays.asList(args)); String[] totalArgs = options.toArray(new String[0]); if (totalArgs.length < 2) { @@ -63,7 +64,7 @@ public class ConfigDefinition { } } - private static void doJob(String[] args, ReaderStateImpl state) throws IOException { + public static void doJob(String[] args, ReaderStateImpl state) throws IOException { SystemOut.println(ConfigDefinition.class + " Invoked with " + Arrays.toString(args)); String tsInputFileFolder = null; @@ -146,7 +147,7 @@ public class ConfigDefinition { case EnumToString.KEY_ENUM_INPUT_FILE: { String enumInputFile = args[i + 1]; enumInputFiles.add(enumInputFile); - state.read(new FileReader(enumInputFile)); + state.read(new FileReader(RootHolder.ROOT + enumInputFile)); } break; case "-ts_output_name": diff --git a/java_tools/configuration_definition/src/main/java/com/rusefi/output/ConfigStructureImpl.java b/java_tools/configuration_definition/src/main/java/com/rusefi/output/ConfigStructureImpl.java index 975da6cfaa..46970630ee 100644 --- a/java_tools/configuration_definition/src/main/java/com/rusefi/output/ConfigStructureImpl.java +++ b/java_tools/configuration_definition/src/main/java/com/rusefi/output/ConfigStructureImpl.java @@ -3,10 +3,7 @@ package com.rusefi.output; import com.rusefi.*; import com.rusefi.parse.TypesHelper; -import java.util.ArrayList; -import java.util.HashSet; -import java.util.List; -import java.util.Set; +import java.util.*; import static com.rusefi.ConfigFieldImpl.BOOLEAN_T; @@ -26,6 +23,8 @@ public class ConfigStructureImpl implements ConfigStructure { private final List cFields = new ArrayList<>(); private final List tsFields = new ArrayList<>(); + private final Map tsFieldsMap = new TreeMap<>(); + private int totalSize; private final BitState readingBitState = new BitState(); @@ -88,7 +87,7 @@ public class ConfigStructureImpl implements ConfigStructure { public void addBoth(ConfigFieldImpl cf) { addC(cf); - tsFields.add(cf); + addTs(cf); } public void addC(ConfigFieldImpl cf) { @@ -107,6 +106,12 @@ public class ConfigStructureImpl implements ConfigStructure { public void addTs(ConfigFieldImpl cf) { tsFields.add(cf); + tsFieldsMap.put(cf.getName(), cf); + } + + @Override + public ConfigField getTsFieldByName(String name) { + return tsFieldsMap.get(name); } public void addBitPadding(ReaderStateImpl readerState) { diff --git a/java_tools/configuration_definition/src/main/java/com/rusefi/pinout/PinoutLogic.java b/java_tools/configuration_definition/src/main/java/com/rusefi/pinout/PinoutLogic.java index d9fb888daf..3c4643a5f1 100644 --- a/java_tools/configuration_definition/src/main/java/com/rusefi/pinout/PinoutLogic.java +++ b/java_tools/configuration_definition/src/main/java/com/rusefi/pinout/PinoutLogic.java @@ -97,7 +97,7 @@ public class PinoutLogic { for (int i = 0; i < values.size(); i++) { appendCommaIfNeeded(simpleForm); - String key = findKey(enumList, i); + String key = enumList.findByValue(i); String value = values.get(i); if (i == 0) { @@ -123,17 +123,6 @@ public class PinoutLogic { sb.append(","); } - private static String findKey(EnumsReader.EnumState enumList, int i) { - String key = ""; - for (Map.Entry entry : enumList.entrySet()) { - if (entry.getValue().getIntValue() == i) { - key = entry.getKey(); - break; - } - } - return key; - } - @SuppressWarnings("unchecked") private void readMetaInfo(File yamlFile, Reader reader) { Yaml yaml = new Yaml(); diff --git a/java_tools/configuration_definition_base/src/main/java/com/rusefi/output/ConfigStructure.java b/java_tools/configuration_definition_base/src/main/java/com/rusefi/output/ConfigStructure.java index 05ccc0fd58..1094553e16 100644 --- a/java_tools/configuration_definition_base/src/main/java/com/rusefi/output/ConfigStructure.java +++ b/java_tools/configuration_definition_base/src/main/java/com/rusefi/output/ConfigStructure.java @@ -9,6 +9,8 @@ public interface ConfigStructure { String getName(); + ConfigField getTsFieldByName(String name); + int getTotalSize(); List getTsFields(); diff --git a/java_tools/enum_to_string/src/main/java/com/rusefi/EnumsReader.java b/java_tools/enum_to_string/src/main/java/com/rusefi/EnumsReader.java index 53a98df2a3..3e2c8c07d0 100644 --- a/java_tools/enum_to_string/src/main/java/com/rusefi/EnumsReader.java +++ b/java_tools/enum_to_string/src/main/java/com/rusefi/EnumsReader.java @@ -155,6 +155,17 @@ public class EnumsReader { this.isEnumClass = isEnumClass; } + public String findByValue(int i) { + String key = ""; + for (Map.Entry entry : entrySet()) { + if (entry.getValue().getIntValue() == i) { + key = entry.getKey(); + break; + } + } + return key; + } + public Collection values() { return values.values(); }