autoscale scale into java fields

This commit is contained in:
rusefillc 2022-04-04 21:35:09 -04:00
parent 6ae10a4c63
commit 65a4d92f31
7 changed files with 67 additions and 39 deletions

Binary file not shown.

View File

@ -1,8 +1,8 @@
package com.rusefi;
import com.devexperts.logging.Logging;
import com.rusefi.core.Pair;
import com.rusefi.output.JavaFieldsConsumer;
import com.rusefi.util.SystemOut;
import com.rusefi.test.ConfigFieldParserTest;
import java.util.Arrays;
@ -248,6 +248,10 @@ public class ConfigField {
return isIterate;
}
public boolean isHasAutoscale() {
return hasAutoscale;
}
public ReaderState getState() {
return state;
}
@ -261,6 +265,20 @@ public class ConfigField {
}
public String autoscaleSpec() {
Pair<Integer, Integer> pair = autoscaleSpecPair();
if (pair == null)
return null;
return pair.first + ", " + pair.second;
}
public double autoscaleSpecNumber() {
Pair<Integer, Integer> pair = autoscaleSpecPair();
if (pair == null)
return 1;
return 1.0 * pair.second / pair.first;
}
public Pair<Integer, Integer> autoscaleSpecPair() {
if (!hasAutoscale) {
return null;
}
@ -295,10 +313,10 @@ public class ConfigField {
double accuracy = Math.abs((factor2 / factor) - 1.);
if (accuracy > 0.0000001) {
// Don't want to deal with exception propogation; this should adequately not compile
return "$*@#$* Cannot accurately represent autoscale for " + tokens[1];
throw new IllegalStateException("$*@#$* Cannot accurately represent autoscale for " + tokens[1]);
}
return mul + ", " + div;
return new Pair<>(mul, div);
}
private String[] getTokens() {

View File

@ -273,7 +273,7 @@ public class ReaderState {
structure.addC(cf);
for (int i = 1; i <= cf.getArraySizes()[0]; i++) {
ConfigField element = new ConfigField(state, cf.getName() + i, cf.getComment(), null,
cf.getType(), new int[0], cf.getTsInfo(), false, false, false, null, null);
cf.getType(), new int[0], cf.getTsInfo(), false, false, cf.isHasAutoscale(), null, null);
element.isFromIterate(true);
structure.addTs(element);
}

View File

@ -27,7 +27,7 @@ public abstract class JavaFieldsConsumer implements ConfigurationConsumer {
return javaFieldsWriter.toString();
}
private void writeJavaFieldName(String nameWithPrefix, int tsPosition) throws IOException {
private void writeJavaFieldName(String nameWithPrefix, int tsPosition, double scale) throws IOException {
javaFieldsWriter.write("\tpublic static final Field ");
allFields.append("\t" + nameWithPrefix.toUpperCase() + "," + EOL);
javaFieldsWriter.write(nameWithPrefix.toUpperCase());
@ -64,14 +64,14 @@ public abstract class JavaFieldsConsumer implements ConfigurationConsumer {
String nameWithPrefix = prefix + configField.getName();
if (configField.isBit()) {
writeJavaFieldName(nameWithPrefix, tsPosition);
writeJavaFieldName(nameWithPrefix, tsPosition, 1);
javaFieldsWriter.append("FieldType.BIT, " + bitIndex + ");" + EOL);
tsPosition += configField.getSize(next);
return tsPosition;
}
if (TypesHelper.isFloat(configField.getType())) {
writeJavaFieldName(nameWithPrefix, tsPosition);
writeJavaFieldName(nameWithPrefix, tsPosition, configField.autoscaleSpecNumber());
javaFieldsWriter.write("FieldType.FLOAT);" + EOL);
} else {
String enumOptions = state.variableRegistry.get(configField.getType() + VariableRegistry.ENUM_SUFFIX);
@ -82,7 +82,7 @@ public abstract class JavaFieldsConsumer implements ConfigurationConsumer {
}
writeJavaFieldName(nameWithPrefix, tsPosition);
writeJavaFieldName(nameWithPrefix, tsPosition, configField.autoscaleSpecNumber());
if (isStringField(configField)) {
String custom = state.tsCustomLine.get(configField.getType());
String[] tokens = custom.split(",");
@ -98,7 +98,8 @@ public abstract class JavaFieldsConsumer implements ConfigurationConsumer {
if (enumOptions != null) {
javaFieldsWriter.write(", " + configField.getType());
}
javaFieldsWriter.write(");" + EOL);
javaFieldsWriter.write(")" + ".setScale(" + configField.autoscaleSpecNumber() + ")" +
";" + EOL);
}
tsPosition += configField.getSize(next);

View File

@ -57,7 +57,7 @@ public class ConfigFieldParserIssue1057Test {
"\tpublic static final Field UNUSEDBIT_1_29 = Field.create(\"UNUSEDBIT_1_29\", 0, FieldType.BIT, 29);\n" +
"\tpublic static final Field UNUSEDBIT_1_30 = Field.create(\"UNUSEDBIT_1_30\", 0, FieldType.BIT, 30);\n" +
"\tpublic static final Field UNUSEDBIT_1_31 = Field.create(\"UNUSEDBIT_1_31\", 0, FieldType.BIT, 31);\n" +
"\tpublic static final Field FIELDNAME = Field.create(\"FIELDNAME\", 4, FieldType.INT);\n",
"\tpublic static final Field FIELDNAME = Field.create(\"FIELDNAME\", 4, FieldType.INT).setScale(1.0);\n",
javaFieldsConsumer.getJavaFieldsWriter());
}
}

View File

@ -1,13 +1,17 @@
package com.rusefi.test;
import com.rusefi.*;
import com.rusefi.output.*;
import com.rusefi.ConfigField;
import com.rusefi.ReaderState;
import com.rusefi.TypesHelper;
import com.rusefi.VariableRegistry;
import com.rusefi.output.BaseCHeaderConsumer;
import com.rusefi.output.ConfigStructure;
import com.rusefi.output.JavaFieldsConsumer;
import com.rusefi.output.TSProjectConsumer;
import org.junit.Test;
import java.io.BufferedReader;
import java.io.CharArrayWriter;
import java.io.IOException;
import java.io.StringReader;
import java.util.Arrays;
import java.util.Collections;
@ -184,9 +188,9 @@ public class ConfigFieldParserTest {
JavaFieldsConsumer javaFieldsConsumer = new TestJavaFieldsConsumer(state);
state.readBufferedReader(test, Collections.singletonList(javaFieldsConsumer));
assertEquals("\tpublic static final Field VAR = Field.create(\"VAR\", 0, 120, FieldType.STRING);\n" +
"\tpublic static final Field PERIODMS = Field.create(\"PERIODMS\", 120, FieldType.INT16);\n" +
"\tpublic static final Field ALIGNMENTFILL_AT_122 = Field.create(\"ALIGNMENTFILL_AT_122\", 122, FieldType.INT8);\n",
assertEquals("\tpublic static final Field VAR = Field.create(\"VAR\", 0, 120, FieldType.STRING).setScale(1.0);\n" +
"\tpublic static final Field PERIODMS = Field.create(\"PERIODMS\", 120, FieldType.INT16).setScale(1.0);\n" +
"\tpublic static final Field ALIGNMENTFILL_AT_122 = Field.create(\"ALIGNMENTFILL_AT_122\", 122, FieldType.INT8).setScale(1.0);\n",
javaFieldsConsumer.getJavaFieldsWriter());
}
@ -252,22 +256,22 @@ public class ConfigFieldParserTest {
state.readBufferedReader(test, Collections.singletonList(javaFieldsConsumer));
assertEquals("\tpublic static final Field OFFSET = Field.create(\"OFFSET\", 0, FieldType.INT16);\n" +
"\tpublic static final Field PERIODMS = Field.create(\"PERIODMS\", 2, FieldType.INT16);\n" +
"\tpublic static final Field MINVALUE = Field.create(\"MINVALUE\", 4, FieldType.INT16);\n" +
"\tpublic static final Field ALIGNMENTFILL_AT_6 = Field.create(\"ALIGNMENTFILL_AT_6\", 6, FieldType.INT8);\n" +
"\tpublic static final Field ALTERNATORCONTROL_OFFSET = Field.create(\"ALTERNATORCONTROL_OFFSET\", 0, FieldType.INT16);\n" +
"\tpublic static final Field ALTERNATORCONTROL_PERIODMS = Field.create(\"ALTERNATORCONTROL_PERIODMS\", 2, FieldType.INT16);\n" +
"\tpublic static final Field ALTERNATORCONTROL_MINVALUE = Field.create(\"ALTERNATORCONTROL_MINVALUE\", 4, FieldType.INT16);\n" +
"\tpublic static final Field ALTERNATORCONTROL_ALIGNMENTFILL_AT_6 = Field.create(\"ALTERNATORCONTROL_ALIGNMENTFILL_AT_6\", 6, FieldType.INT8);\n" +
"\tpublic static final Field ETB1_OFFSET = Field.create(\"ETB1_OFFSET\", 8, FieldType.INT16);\n" +
"\tpublic static final Field ETB1_PERIODMS = Field.create(\"ETB1_PERIODMS\", 10, FieldType.INT16);\n" +
"\tpublic static final Field ETB1_MINVALUE = Field.create(\"ETB1_MINVALUE\", 12, FieldType.INT16);\n" +
"\tpublic static final Field ETB1_ALIGNMENTFILL_AT_6 = Field.create(\"ETB1_ALIGNMENTFILL_AT_6\", 14, FieldType.INT8);\n" +
"\tpublic static final Field ETB2_OFFSET = Field.create(\"ETB2_OFFSET\", 16, FieldType.INT16);\n" +
"\tpublic static final Field ETB2_PERIODMS = Field.create(\"ETB2_PERIODMS\", 18, FieldType.INT16);\n" +
"\tpublic static final Field ETB2_MINVALUE = Field.create(\"ETB2_MINVALUE\", 20, FieldType.INT16);\n" +
"\tpublic static final Field ETB2_ALIGNMENTFILL_AT_6 = Field.create(\"ETB2_ALIGNMENTFILL_AT_6\", 22, FieldType.INT8);\n",
assertEquals("\tpublic static final Field OFFSET = Field.create(\"OFFSET\", 0, FieldType.INT16).setScale(1.0);\n" +
"\tpublic static final Field PERIODMS = Field.create(\"PERIODMS\", 2, FieldType.INT16).setScale(1.0);\n" +
"\tpublic static final Field MINVALUE = Field.create(\"MINVALUE\", 4, FieldType.INT16).setScale(1.0);\n" +
"\tpublic static final Field ALIGNMENTFILL_AT_6 = Field.create(\"ALIGNMENTFILL_AT_6\", 6, FieldType.INT8).setScale(1.0);\n" +
"\tpublic static final Field ALTERNATORCONTROL_OFFSET = Field.create(\"ALTERNATORCONTROL_OFFSET\", 0, FieldType.INT16).setScale(1.0);\n" +
"\tpublic static final Field ALTERNATORCONTROL_PERIODMS = Field.create(\"ALTERNATORCONTROL_PERIODMS\", 2, FieldType.INT16).setScale(1.0);\n" +
"\tpublic static final Field ALTERNATORCONTROL_MINVALUE = Field.create(\"ALTERNATORCONTROL_MINVALUE\", 4, FieldType.INT16).setScale(1.0);\n" +
"\tpublic static final Field ALTERNATORCONTROL_ALIGNMENTFILL_AT_6 = Field.create(\"ALTERNATORCONTROL_ALIGNMENTFILL_AT_6\", 6, FieldType.INT8).setScale(1.0);\n" +
"\tpublic static final Field ETB1_OFFSET = Field.create(\"ETB1_OFFSET\", 8, FieldType.INT16).setScale(1.0);\n" +
"\tpublic static final Field ETB1_PERIODMS = Field.create(\"ETB1_PERIODMS\", 10, FieldType.INT16).setScale(1.0);\n" +
"\tpublic static final Field ETB1_MINVALUE = Field.create(\"ETB1_MINVALUE\", 12, FieldType.INT16).setScale(1.0);\n" +
"\tpublic static final Field ETB1_ALIGNMENTFILL_AT_6 = Field.create(\"ETB1_ALIGNMENTFILL_AT_6\", 14, FieldType.INT8).setScale(1.0);\n" +
"\tpublic static final Field ETB2_OFFSET = Field.create(\"ETB2_OFFSET\", 16, FieldType.INT16).setScale(1.0);\n" +
"\tpublic static final Field ETB2_PERIODMS = Field.create(\"ETB2_PERIODMS\", 18, FieldType.INT16).setScale(1.0);\n" +
"\tpublic static final Field ETB2_MINVALUE = Field.create(\"ETB2_MINVALUE\", 20, FieldType.INT16).setScale(1.0);\n" +
"\tpublic static final Field ETB2_ALIGNMENTFILL_AT_6 = Field.create(\"ETB2_ALIGNMENTFILL_AT_6\", 22, FieldType.INT8).setScale(1.0);\n",
javaFieldsConsumer.getJavaFieldsWriter());
}
}
@ -276,17 +280,22 @@ public class ConfigFieldParserTest {
public void testArrayOfOne() throws IOException {
String test = "struct pid_s\n" +
"#define ERROR_BUFFER_SIZE 1\n" +
"int[ERROR_BUFFER_SIZE iterate] field\n" +
"int[ERROR_BUFFER_SIZE iterate] autoscale field;;\"ratio\", 0.01, 0, 0, 650, 0\n" +
"end_struct\n" +
"";
BaseCHeaderConsumer consumer = new BaseCHeaderConsumer();
new ReaderState().readBufferedReader(test, Collections.singletonList(consumer));
ReaderState state = new ReaderState();
JavaFieldsConsumer javaFieldsConsumer = new TestJavaFieldsConsumer(state);
state.readBufferedReader(test, Arrays.asList(consumer, javaFieldsConsumer));
assertEquals("\tpublic static final Field FIELD1 = Field.create(\"FIELD1\", 0, FieldType.INT).setScale(0.01);\n",
javaFieldsConsumer.getJavaFieldsWriter());
assertEquals("// start of pid_s\n" +
"struct pid_s {\n" +
"\t/**\n" +
"\tratio\n" +
"\t * offset 0\n" +
"\t */\n" +
"\tint field[ERROR_BUFFER_SIZE];\n" +
"\tscaled_channel<int, 100, 1> field[ERROR_BUFFER_SIZE];\n" +
"\t/** total size 4*/\n" +
"};\n" +
"\n", consumer.getContent().toString());

View File

@ -64,9 +64,9 @@ public class TSProjectConsumerTest {
"periodMs = scalar, S16, 18, \"ms\", 0.1, 0, 0, 3000, 0\n" +
"; total TS size = 20\n", new String(writer.toCharArray()));
assertEquals("\tpublic static final Field PERIODMS2 = Field.create(\"PERIODMS2\", 0, FieldType.INT16);\n" +
"\tpublic static final Field AFRTABLE = Field.create(\"AFRTABLE\", 2, FieldType.INT);\n" +
"\tpublic static final Field PERIODMS = Field.create(\"PERIODMS\", 18, FieldType.INT16);\n",
assertEquals("\tpublic static final Field PERIODMS2 = Field.create(\"PERIODMS2\", 0, FieldType.INT16).setScale(1.0);\n" +
"\tpublic static final Field AFRTABLE = Field.create(\"AFRTABLE\", 2, FieldType.INT).setScale(1.0);\n" +
"\tpublic static final Field PERIODMS = Field.create(\"PERIODMS\", 18, FieldType.INT16).setScale(1.0);\n",
javaFieldsConsumer.getJavaFieldsWriter());