diff --git a/java_tools/ConfigDefinition.jar b/java_tools/ConfigDefinition.jar index 41463f10a2..cf4b70afd9 100644 Binary files a/java_tools/ConfigDefinition.jar and b/java_tools/ConfigDefinition.jar differ diff --git a/java_tools/configuration_definition/src/test/java/com/rusefi/test/VariableRegistryTest.java b/java_tools/configuration_definition/src/test/java/com/rusefi/test/VariableRegistryTest.java index b58e134adc..411cf6b59c 100644 --- a/java_tools/configuration_definition/src/test/java/com/rusefi/test/VariableRegistryTest.java +++ b/java_tools/configuration_definition/src/test/java/com/rusefi/test/VariableRegistryTest.java @@ -3,6 +3,9 @@ package com.rusefi.test; import com.rusefi.VariableRegistry; import org.junit.Test; +import java.util.HashMap; +import java.util.Map; + import static com.rusefi.VariableRegistry.*; import static org.junit.Assert.assertEquals; @@ -55,4 +58,14 @@ public class VariableRegistryTest { assertEquals("1", registry.get("key_int")); assertEquals("1", registry.get("key_int" + _HEX_SUFFIX)); } + + @Test + public void testHumanSorted() { + Map input = new HashMap<>(); + input.put(0, "NONE"); + input.put(1, "A"); + input.put(2, "Z"); + input.put(3, "N"); + assertEquals("0=\"NONE\",1=\"A\",3=\"N\",2=\"Z\"", VariableRegistry.getString(input)); + } } diff --git a/java_tools/enum_to_string/src/main/java/com/rusefi/VariableRegistry.java b/java_tools/enum_to_string/src/main/java/com/rusefi/VariableRegistry.java index f3714419c4..2f4e6f1734 100644 --- a/java_tools/enum_to_string/src/main/java/com/rusefi/VariableRegistry.java +++ b/java_tools/enum_to_string/src/main/java/com/rusefi/VariableRegistry.java @@ -2,12 +2,14 @@ package com.rusefi; import com.devexperts.logging.Logging; import com.rusefi.enum_reader.Value; +import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; import java.io.BufferedReader; import java.io.FileReader; import java.io.IOException; import java.io.Reader; +import java.util.Comparator; import java.util.HashMap; import java.util.Map; import java.util.TreeMap; @@ -90,12 +92,9 @@ public class VariableRegistry { * @return value>name map for specified enum name. */ @Nullable - public TreeMap resolveEnumValues(EnumsReader enumsReader, String enumName) { + private TreeMap resolveEnumValues(@NotNull EnumsReader.EnumState stringValueMap) { TreeMap valueNameById = new TreeMap<>(); - EnumsReader.EnumState stringValueMap = enumsReader.getEnums().get(enumName); - if (stringValueMap == null) - return null; for (Value value : stringValueMap.values()) { if (value.isForceSize()) continue; @@ -113,21 +112,44 @@ public class VariableRegistry { return valueNameById; } + private static void appendCommaIfNeeded(StringBuilder sb) { + if (sb.length() > 0) + sb.append(","); + } + public String getEnumOptionsForTunerStudio(EnumsReader enumsReader, String enumName) { - TreeMap valueNameById = resolveEnumValues(enumsReader, enumName); + EnumsReader.EnumState stringValueMap = enumsReader.getEnums().get(enumName); + if (stringValueMap == null) + return null; + + TreeMap valueNameById = resolveEnumValues(stringValueMap); if (valueNameById == null) return null; - int maxValue = valueNameById.lastKey(); + return getString(valueNameById); + } + + private static String quote(String string) { + return "\"" + string + "\""; + } + + @NotNull + public static String getString(Map valueNameById) { + TreeMap humanDropDownSorted = new TreeMap<>((o1, o2) -> { + if (o1.intValue() == o2) + return 0; + if (o1.intValue() == 0) + return -1; // "None" always go first + if (o2.intValue()==0) + return 1; + return valueNameById.get(o1).compareTo(valueNameById.get(o2)); + }); + humanDropDownSorted.putAll(valueNameById); StringBuilder sb = new StringBuilder(); - // todo: TS enum key-value form #4232 - for (int i = 0; i <= maxValue; i++) { - if (sb.length() > 0) - sb.append(", "); - - String value = valueNameById.getOrDefault(i, INVALID); - sb.append("\"" + value + "\""); + for (Map.Entry e : humanDropDownSorted.entrySet()) { + appendCommaIfNeeded(sb); + sb.append(e.getKey() + "=" + quote(e.getValue())); } return sb.toString(); }