only:enum list syntax

This commit is contained in:
Andrey 2023-11-25 18:49:17 -05:00
parent 653c692b9b
commit 2e797ae525
4 changed files with 40 additions and 10 deletions

View File

@ -22,6 +22,8 @@ public class IniFileModel {
private static final String FIELD_TYPE_ARRAY = "array";
private static final String FIELD_TYPE_BITS = "bits";
public Map<String, List<String>> defines = new TreeMap<>();
private static IniFileModel INSTANCE;
private String dialogId;
private String dialogUiName;
@ -112,6 +114,10 @@ public class IniFileModel {
String rawText = line.getRawText();
try {
LinkedList<String> list = new LinkedList<>(Arrays.asList(line.getTokens()));
if (!list.isEmpty() && list.get(0).equals("#define")) {
defines.put(list.get(1), list.subList(2, list.size() - 1));
return;
}
if (!list.isEmpty() && list.get(0).equals(SECTION_PAGE)) {
isInsidePageDefinition = true;
@ -236,7 +242,7 @@ public class IniFileModel {
registerField(ArrayIniField.parse(list));
break;
case FIELD_TYPE_BITS:
registerField(EnumIniField.parse(list, line));
registerField(EnumIniField.parse(list, line, this));
break;
default:
throw new IllegalStateException("Unexpected " + list);

View File

@ -1,6 +1,7 @@
package com.opensr5.ini.field;
import com.opensr5.ConfigurationImage;
import com.opensr5.ini.IniFileModel;
import com.opensr5.ini.IniFileReader;
import com.opensr5.ini.RawIniFile;
import com.rusefi.config.FieldType;
@ -112,7 +113,7 @@ public class EnumIniField extends IniField {
return ordinal;
}
public static EnumIniField parse(LinkedList<String> list, RawIniFile.Line line) {
public static EnumIniField parse(LinkedList<String> list, RawIniFile.Line line, IniFileModel iniFileModel) {
String name = list.get(0);
FieldType type = FieldType.parseTs(list.get(2));
int offset = Integer.parseInt(list.get(3));
@ -122,7 +123,7 @@ public class EnumIniField extends IniField {
int bitPosition = parseBitRange.getBitPosition();
int bitSize0 = parseBitRange.getBitSize0();
EnumKeyValueMap enums = EnumKeyValueMap.valueOf(line.getRawText());
EnumKeyValueMap enums = EnumKeyValueMap.valueOf(line.getRawText(), iniFileModel);
return new EnumIniField(name, offset, type, enums, bitPosition, bitSize0);
}
@ -166,7 +167,7 @@ public class EnumIniField extends IniField {
this.keyValues = keyValues;
}
public static EnumKeyValueMap valueOf(String rawText) {
public static EnumKeyValueMap valueOf(String rawText, IniFileModel iniFileModel) {
Map<Integer, String> keyValues = new TreeMap<>();
int interestingIndex = EnumIniField.ordinalIndexOf(rawText, ",", 4);
@ -183,8 +184,16 @@ public class EnumIniField extends IniField {
} else {
for (int i = 0; i < tokens.length - offset; i++) {
keyValues.put(i, tokens[i + offset]);
String firstValue = tokens[offset];
if (firstValue.trim().startsWith("$")) {
List<String> elements = iniFileModel.defines.get(firstValue.substring(1));
for (int i = 0; i < elements.size(); i++) {
keyValues.put(i, elements.get(i));
}
} else {
for (int i = 0; i < tokens.length - offset; i++) {
keyValues.put(i, tokens[i + offset]);
}
}
}

View File

@ -3,8 +3,6 @@ package com.opensr5.ini.test;
import com.opensr5.ini.field.EnumIniField;
import org.junit.Test;
import java.util.regex.Pattern;
import static org.junit.Assert.assertEquals;
public class IniEnumDecoderTest {
@ -12,7 +10,7 @@ public class IniEnumDecoderTest {
public void testKeyValueSyntax() {
String line = "engineType = bits, S32, 0, [0:6], 0=\"DEFAULT_FRANKENSO\",97=\"ALPHAX_8CHAN_SBC\",24=\"BMW_M73_M\",50=\"BMW_M73_MRE\",51=\"BMW_M73_MRE_SLAVE\",35=\"CAMARO_4\",65=\"CITROEN_TU3JP\",38=\"DISCOVERY_PDM\",2=\"DODGE_NEON_1995\",46=\"DODGE_NEON_2003_CRANK\",64=\"DODGE_RAM\",61=\"EEPROM_BENCH_ENGINE\",58=\"ETB_BENCH_ENGINE\",3=\"FORD_ASPIRE_1996\",11=\"FORD_COYOTE\",14=\"FORD_ESCORT_GT\",7=\"FORD_INLINE_6_1995\",40=\"FRANKENSO_BMW_M73_F\",47=\"FRANKENSO_MAZDA_MIATA_2003\",56=\"FRANKENSO_MAZDA_MIATA_NA8\",41=\"FRANKENSO_MIATA_NA6_MAP\",49=\"FRANKENSO_QA_ENGINE\",8=\"GY6_139QMB\",33=\"HELLEN72_ETB\",84=\"HELLEN_121_NISSAN_4_CYL\",72=\"HELLEN_121_NISSAN_6_CYL\",85=\"HELLEN_121_NISSAN_8_CYL\",87=\"HELLEN_121_NISSAN_ALMERA_N16\",71=\"HELLEN_121_VAG_4_CYL\",77=\"HELLEN_121_VAG_5_CYL\",81=\"HELLEN_121_VAG_8_CYL\",78=\"HELLEN_121_VAG_V6_CYL\",79=\"HELLEN_121_VAG_VR6_CYL\",36=\"HELLEN_128_MERCEDES_4_CYL\",88=\"HELLEN_128_MERCEDES_6_CYL\",89=\"HELLEN_128_MERCEDES_8_CYL\",75=\"HELLEN_134_BMW\",82=\"HELLEN_154_HYUNDAI_COUPE_BK1\",95=\"HELLEN_154_HYUNDAI_COUPE_BK2\",76=\"HELLEN_154_VAG\",73=\"HELLEN_55_BMW\",74=\"HELLEN_88_BMW\",34=\"HELLEN_NA6\",10=\"HELLEN_NA8_96\",80=\"HELLEN_NA94\",83=\"HELLEN_NB1\",94=\"HELLEN_NB1_36\",69=\"HELLEN_NB2\",86=\"HELLEN_NB2_36\",43=\"HONDA_600\",60=\"L9779_BENCH_ENGINE\",55=\"MAZDA_MIATA_2003_BOARD_TEST\",54=\"MAZDA_MIATA_2003_NA_RAIL\",21=\"MIATA_1996\",1=\"MIATA_PROTEUS_TCU\",99=\"MINIMAL_PINS\",12=\"MITSUBISHI_3A92\",16=\"MITSUBISHI_4G93\",31=\"MRE_BOARD_NEW_TEST\",23=\"MRE_BODY_CONTROL\",68=\"MRE_M111\",20=\"MRE_MIATA_94_MAP\",66=\"MRE_MIATA_NA6_MAP\",4=\"MRE_SECONDARY_CAN\",37=\"MRE_SUBARU_EJ18\",62=\"MRE_VW_B6\",5=\"NISSAN_PRIMERA\",30=\"PROTEUS_ANALOG_PWM_TEST\",63=\"PROTEUS_BMW_M73\",9=\"PROTEUS_E65_6H_MAN_IN_THE_MIDDLE\",27=\"PROTEUS_GM_LS_4\",6=\"PROTEUS_HARLEY\",90=\"PROTEUS_HONDA_K\",91=\"PROTEUS_HONDA_OBD2A\",104=\"PROTEUS_HYUNDAI_PB\",25=\"PROTEUS_LUA_DEMO\",17=\"PROTEUS_M111\",67=\"PROTEUS_MIATA_NB2\",93=\"PROTEUS_N73\",103=\"PROTEUS_NISSAN_VQ35\",42=\"PROTEUS_QC_TEST_BOARD\",98=\"PROTEUS_SBC\",92=\"PROTEUS_VAG_80_18T\",39=\"PROTEUS_VW_B6\",29=\"SACHS\",70=\"SUBARUEG33_DEFAULTS\",22=\"SUBARU_2003_WRX\",100=\"TEST_100\",101=\"TEST_101\",102=\"TEST_102\",18=\"TEST_33816\",28=\"TEST_CRANK_ENGINE\",48=\"TEST_DC_WASTEGATE_DISCOVERY\",26=\"TEST_ENGINE\",45=\"TEST_ENGINE_VVT\",52=\"TEST_ISSUE_366_BOTH\",53=\"TEST_ISSUE_366_RISE\",19=\"TEST_ROTARY\",59=\"TLE8888_BENCH_ENGINE\",13=\"TOYOTA_1NZ_FE\",44=\"TOYOTA_2JZ_GTE_VVTi\",15=\"UNUSED_15\",57=\"UNUSED_57\",32=\"VW_ABA\",96=\"WASTEGATE_PROTEUS_TEST\"";
EnumIniField.EnumKeyValueMap m = EnumIniField.EnumKeyValueMap.valueOf(line);
EnumIniField.EnumKeyValueMap m = EnumIniField.EnumKeyValueMap.valueOf(line, null);
assertEquals(105, m.size());
assertEquals("DEFAULT_FRANKENSO", m.get(0));
@ -25,7 +23,7 @@ public class IniEnumDecoderTest {
@Test
public void testArraySyntax() {
String line = "engineType = bits, S32, 0, [0:6], \"DEFAULT_FRANKENSO\",\"ALPHAX_8CHAN_SBC\"";
EnumIniField.EnumKeyValueMap m = EnumIniField.EnumKeyValueMap.valueOf(line);
EnumIniField.EnumKeyValueMap m = EnumIniField.EnumKeyValueMap.valueOf(line, null);
assertEquals(2, m.size());
assertEquals("DEFAULT_FRANKENSO", m.get(0));

View File

@ -157,6 +157,23 @@ public class IniFileReaderTest {
assertEquals(2, model.allIniFields.size());
}
@Test
public void testEnumListFields() {
String string = "#define gpio_list=\"NONE\", \"INVALID\", \"PA0\", \"PA1\", \"PA2\", \"PA3\", \"PA4\"\n" +
"page = 1\n" +
"[Constants]\n" +
"primingSquirtDurationMs\t\t\t= scalar, F32,\t96,\t\"*C\", 1, 0, -40, 200, 1\n" +
"\tiat_adcChannel\t\t\t\t = bits, U08, 312, [0:7] $gpio_list\n";
RawIniFile lines = IniFileReader.read(new ByteArrayInputStream(string.getBytes()));
IniFileModel model = new IniFileModel().readIniFile(lines);
assertEquals(1, model.defines.size());
EnumIniField field = (EnumIniField) model.allIniFields.get("iat_adcChannel");
assertEquals(6, field.getEnums().size());
assertEquals(2, model.allIniFields.size());
}
@Test
public void testSetBits() {
assertEquals(0xFE, EnumIniField.setBitRange(0xFF, 0, 0, 1));