mirror of https://github.com/rusefi/rusefi.git
129 lines
5.3 KiB
Java
129 lines
5.3 KiB
Java
package com.rusefi.output;
|
|
|
|
import com.opensr5.ini.IniFileModel;
|
|
import com.rusefi.*;
|
|
import com.rusefi.parse.TypesHelper;
|
|
|
|
import java.io.IOException;
|
|
import java.util.HashSet;
|
|
import java.util.Set;
|
|
|
|
import static com.rusefi.ToolUtil.EOL;
|
|
|
|
public abstract class JavaFieldsConsumer implements ConfigurationConsumer {
|
|
protected final Set<String> existingJavaEnums = new HashSet<>();
|
|
|
|
private final StringBuilder content = new StringBuilder();
|
|
protected final StringBuffer allFields = new StringBuffer();
|
|
protected final ReaderState state;
|
|
private final int baseOffset;
|
|
|
|
public JavaFieldsConsumer(ReaderState state, int baseOffset) {
|
|
this.state = state;
|
|
this.baseOffset = baseOffset;
|
|
}
|
|
|
|
public String getContent() {
|
|
return content.toString();
|
|
}
|
|
|
|
private void writeJavaFieldName(String nameWithPrefix, int tsPosition) {
|
|
allFields.append("\t" + nameWithPrefix.toUpperCase() + "," + EOL);
|
|
|
|
content.append("\tpublic static final Field ");
|
|
content.append(nameWithPrefix.toUpperCase());
|
|
content.append(" = Field.create(\"" + nameWithPrefix.toUpperCase() + "\", "
|
|
+ tsPosition + ", ");
|
|
}
|
|
|
|
public static String getJavaType(int elementSize) {
|
|
if (elementSize == 1) {
|
|
return ("FieldType.INT8");
|
|
} else if (elementSize == 2) {
|
|
return "FieldType.INT16";
|
|
} else {
|
|
return "FieldType.INT";
|
|
}
|
|
}
|
|
|
|
private boolean isStringField(ConfigField configField) {
|
|
String custom = state.getTsCustomLine().get(configField.getTypeName());
|
|
return custom != null && custom.toLowerCase().startsWith(IniFileModel.FIELD_TYPE_STRING);
|
|
}
|
|
|
|
@Override
|
|
public void handleEndStruct(ReaderState readerState, ConfigStructure structure) throws IOException {
|
|
FieldsStrategy fieldsStrategy = new FieldsStrategy() {
|
|
protected int writeOneField(FieldIterator iterator, String prefix, int tsPosition) {
|
|
ConfigField prev = iterator.getPrev();
|
|
ConfigField configField = iterator.cf;
|
|
ConfigField next = iterator.next;
|
|
int bitIndex = iterator.bitState.get();
|
|
|
|
if (configField.isDirective())
|
|
return tsPosition;
|
|
// skip duplicate names which happens in case of conditional compilation
|
|
if (configField.getName().equals(prev.getName())) {
|
|
return tsPosition;
|
|
}
|
|
ConfigStructure cs = configField.getStructureType();
|
|
if (cs != null) {
|
|
String extraPrefix = cs.isWithPrefix() ? configField.getName() + "_" : "";
|
|
return writeFields(cs.getTsFields(), prefix + extraPrefix, tsPosition);
|
|
}
|
|
|
|
String nameWithPrefix = prefix + configField.getName();
|
|
|
|
if (configField.isBit()) {
|
|
if (!configField.getName().startsWith(ConfigStructure.UNUSED_ANYTHING_PREFIX)) {
|
|
writeJavaFieldName(nameWithPrefix, tsPosition);
|
|
content.append("FieldType.BIT, " + bitIndex + ")" + terminateField());
|
|
}
|
|
tsPosition += configField.getSize(next);
|
|
return tsPosition;
|
|
}
|
|
|
|
if (TypesHelper.isFloat(configField.getTypeName())) {
|
|
writeJavaFieldName(nameWithPrefix, tsPosition);
|
|
content.append("FieldType.FLOAT)" + terminateField());
|
|
} else {
|
|
String enumOptions = state.getVariableRegistry().get(configField.getTypeName() + VariableRegistry.ARRAY_FORMAT_ENUM);
|
|
if (enumOptions == null)
|
|
enumOptions = state.getVariableRegistry().get(configField.getTypeName() + VariableRegistry.KEY_VALUE_FORMAT_ENUM);
|
|
|
|
if (enumOptions != null && !existingJavaEnums.contains(configField.getTypeName())) {
|
|
existingJavaEnums.add(configField.getTypeName());
|
|
content.append("\tpublic static final String[] " + configField.getTypeName() + " = {" + enumOptions + "};" + EOL);
|
|
}
|
|
|
|
|
|
writeJavaFieldName(nameWithPrefix, tsPosition);
|
|
if (isStringField(configField)) {
|
|
String custom = state.getTsCustomLine().get(configField.getTypeName());
|
|
String[] tokens = custom.split(",");
|
|
String stringSize = tokens[3].trim();
|
|
content.append(stringSize + ", FieldType.STRING");
|
|
} else {
|
|
content.append(getJavaType(configField.getElementSize()));
|
|
}
|
|
if (enumOptions != null) {
|
|
content.append(", " + configField.getTypeName());
|
|
}
|
|
content.append(")" + ".setScale(" + configField.autoscaleSpecNumber() + ")" +
|
|
terminateField());
|
|
}
|
|
|
|
tsPosition += configField.getSize(next);
|
|
|
|
return tsPosition;
|
|
}
|
|
};
|
|
fieldsStrategy.run(state, structure, 0);
|
|
}
|
|
|
|
private String terminateField() {
|
|
return ".setBaseOffset(" + baseOffset + ")" +
|
|
";" + EOL;
|
|
}
|
|
}
|