mirror of https://github.com/rusefi/rusefi.git
only:EPIC: Improve toolset for default tune canned tune generation #4871
This commit is contained in:
parent
815598b6be
commit
e2f81b1a3c
|
@ -103,9 +103,9 @@ public class TS2C {
|
||||||
|
|
||||||
@NotNull
|
@NotNull
|
||||||
public static String getTableCSourceCode2(String msqFileName, String tableName, IniFileModel model, CurveData xRpmCurve, CurveData yLoadBins) throws IOException {
|
public static String getTableCSourceCode2(String msqFileName, String tableName, IniFileModel model, CurveData xRpmCurve, CurveData yLoadBins) throws IOException {
|
||||||
float[][] table = TableData.readTable(msqFileName, tableName, model);
|
TableData table = TableData.readTable(msqFileName, tableName, model);
|
||||||
|
|
||||||
return getTableCSourceCode(tableName, yLoadBins, xRpmCurve, table);
|
return getTableCSourceCode(tableName, yLoadBins, xRpmCurve, table.floats);
|
||||||
}
|
}
|
||||||
|
|
||||||
private static String getTableCSourceCode(String tableName, CurveData loadBins, CurveData rpmBins, float[][] table) {
|
private static String getTableCSourceCode(String tableName, CurveData loadBins, CurveData rpmBins, float[][] table) {
|
||||||
|
@ -131,6 +131,13 @@ public class TS2C {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public static void writePlainTable(int rows, int columns, StringBuilder sb, ValueSource valueSource) {
|
||||||
|
for (int row = 0; row < rows; row++) {
|
||||||
|
String line = writePlainTableLine(valueSource, row, columns);
|
||||||
|
sb.append(line);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @param fileName text file to open
|
* @param fileName text file to open
|
||||||
* @param magicStringKey magic string content to scroll to
|
* @param magicStringKey magic string content to scroll to
|
||||||
|
@ -152,6 +159,17 @@ public class TS2C {
|
||||||
return br;
|
return br;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private static String writePlainTableLine(ValueSource valueSource, int loadIndex, int loadSize) {
|
||||||
|
StringBuilder sb = new StringBuilder("{");
|
||||||
|
|
||||||
|
for (int rpmIndex = 0; rpmIndex < loadSize; rpmIndex++) {
|
||||||
|
sb.append(String.format("%3.3f", valueSource.getValue(loadIndex, rpmIndex)) + ",\t");
|
||||||
|
}
|
||||||
|
sb.append("},\n");
|
||||||
|
|
||||||
|
return sb.toString();
|
||||||
|
}
|
||||||
|
|
||||||
private static String writeTableLine(CurveData loadBins, CurveData rpmBins, ValueSource valueSource, int loadIndex) {
|
private static String writeTableLine(CurveData loadBins, CurveData rpmBins, ValueSource valueSource, int loadIndex) {
|
||||||
StringBuilder sb = new StringBuilder("{");
|
StringBuilder sb = new StringBuilder("{");
|
||||||
|
|
||||||
|
@ -175,8 +193,8 @@ public class TS2C {
|
||||||
return x;
|
return x;
|
||||||
}
|
}
|
||||||
|
|
||||||
interface ValueSource {
|
public interface ValueSource {
|
||||||
float getValue(int loadIndex, int rpmIndex);
|
float getValue(int rowIndex, int columnIndex);
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -10,21 +10,31 @@ import java.io.Reader;
|
||||||
import java.util.Arrays;
|
import java.util.Arrays;
|
||||||
import java.util.function.Function;
|
import java.util.function.Function;
|
||||||
|
|
||||||
public class TableData {
|
public class TableData implements HoHo {
|
||||||
@NotNull
|
private final int rows;
|
||||||
public static float[][] readTable(String msqFileName, String tableName, IniFileModel model) throws IOException {
|
private final int columns;
|
||||||
ArrayIniField field = (ArrayIniField) model.allIniFields.get(tableName);
|
public final float[][] floats;
|
||||||
|
private final String tableName;
|
||||||
|
|
||||||
if (field.getRows() != field.getCols())
|
public TableData(int rows, int columns, float[][] floats, String tableName) {
|
||||||
throw new UnsupportedOperationException("Not square table not supported yet");
|
this.rows = rows;
|
||||||
// todo: replace with loadCount & rpmCount
|
this.columns = columns;
|
||||||
int rows = field.getRows();
|
this.floats = floats;
|
||||||
|
this.tableName = tableName;
|
||||||
return readTable(msqFileName, tableName, rows, TS2C.fileFactory, field.getCols());
|
|
||||||
}
|
}
|
||||||
|
|
||||||
@NotNull
|
@NotNull
|
||||||
public static float[][] readTable(String msqFileName, String tableName, int rows, Function<String, Reader> factory, int columns) throws IOException {
|
public static TableData readTable(String msqFileName, String tableName, IniFileModel model) throws IOException {
|
||||||
|
ArrayIniField field = (ArrayIniField) model.allIniFields.get(tableName);
|
||||||
|
|
||||||
|
int rows = field.getRows();
|
||||||
|
|
||||||
|
int columns = field.getCols();
|
||||||
|
return readTable(msqFileName, tableName, rows, TS2C.fileFactory, columns);
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
public static TableData readTable(String msqFileName, String tableName, int rows, Function<String, Reader> factory, int columns) throws IOException {
|
||||||
float[][] table = new float[rows][];
|
float[][] table = new float[rows][];
|
||||||
for (int rowIndex = 0; rowIndex < rows; rowIndex++) {
|
for (int rowIndex = 0; rowIndex < rows; rowIndex++) {
|
||||||
table[rowIndex] = new float[columns];
|
table[rowIndex] = new float[columns];
|
||||||
|
@ -32,7 +42,7 @@ public class TableData {
|
||||||
|
|
||||||
BufferedReader reader = TS2C.readAndScroll(msqFileName, tableName, factory);
|
BufferedReader reader = TS2C.readAndScroll(msqFileName, tableName, factory);
|
||||||
readTable(table, reader, rows, columns);
|
readTable(table, reader, rows, columns);
|
||||||
return table;
|
return new TableData(rows, columns, table, tableName);
|
||||||
}
|
}
|
||||||
|
|
||||||
private static void readTable(float[][] table, BufferedReader r, int rows, int columns) throws IOException {
|
private static void readTable(float[][] table, BufferedReader r, int rows, int columns) throws IOException {
|
||||||
|
@ -62,4 +72,39 @@ public class TableData {
|
||||||
rowIndex++;
|
rowIndex++;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public String getCTable() {
|
||||||
|
StringBuilder output = new StringBuilder();
|
||||||
|
TS2C.writePlainTable(rows, columns, output, (loadIndex, rpmIndex) -> floats[loadIndex][rpmIndex]);
|
||||||
|
return output.toString();
|
||||||
|
}
|
||||||
|
|
||||||
|
private String getCannedMethod() {
|
||||||
|
return "canned" + tableName + "()";
|
||||||
|
}
|
||||||
|
|
||||||
|
private String getCannedName() {
|
||||||
|
return "hardCoded" + tableName;
|
||||||
|
}
|
||||||
|
|
||||||
|
@NotNull
|
||||||
|
public String getCsourceCode() {
|
||||||
|
return "static const float " +
|
||||||
|
getCannedName() + "[" + rows + "][" + columns + "] = {\n" +
|
||||||
|
getCTable() +
|
||||||
|
"};\n";
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public String getCsourceMethod(String reference) {
|
||||||
|
return "static void " + getCannedMethod() + " {\n"
|
||||||
|
+ "\t" + getCsourceCode() +
|
||||||
|
"\tcopyTable(" + reference + tableName + ", " + getCannedName() + ");\n" +
|
||||||
|
"}\n\n";
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public String getCinvokeMethod() {
|
||||||
|
return "\t" + getCannedMethod() + ";\n";
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -180,16 +180,6 @@ public class TuneCanTool {
|
||||||
}
|
}
|
||||||
|
|
||||||
if (cf.isArray()) {
|
if (cf.isArray()) {
|
||||||
if (cf.getArraySizes().length == 2) {
|
|
||||||
float[][] tableData = TableData.readTable(currentTuneFileName, name, ini);
|
|
||||||
System.out.printf(" " + name);
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
|
|
||||||
CurveData data = CurveData.valueOf(currentTuneFileName, name, ini);
|
|
||||||
if (data == null)
|
|
||||||
continue;
|
|
||||||
|
|
||||||
String parentReference;
|
String parentReference;
|
||||||
if (cf.getParent().getName().equals("engine_configuration_s")) {
|
if (cf.getParent().getName().equals("engine_configuration_s")) {
|
||||||
parentReference = "engineConfiguration->";
|
parentReference = "engineConfiguration->";
|
||||||
|
@ -202,6 +192,21 @@ public class TuneCanTool {
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
if (cf.getArraySizes().length == 2) {
|
||||||
|
TableData tableData = TableData.readTable(currentTuneFileName, name, ini);
|
||||||
|
System.out.printf(" " + name);
|
||||||
|
|
||||||
|
methods.append(tableData.getCsourceMethod(parentReference));
|
||||||
|
invokeMethods.append(tableData.getCinvokeMethod());
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
CurveData data = CurveData.valueOf(currentTuneFileName, name, ini);
|
||||||
|
if (data == null)
|
||||||
|
continue;
|
||||||
|
|
||||||
|
|
||||||
methods.append(data.getCsourceMethod(parentReference));
|
methods.append(data.getCsourceMethod(parentReference));
|
||||||
invokeMethods.append(data.getCinvokeMethod());
|
invokeMethods.append(data.getCinvokeMethod());
|
||||||
|
|
||||||
|
|
|
@ -1,5 +1,6 @@
|
||||||
package com.rusefi.tune;
|
package com.rusefi.tune;
|
||||||
|
|
||||||
|
import com.rusefi.tools.tune.TS2C;
|
||||||
import com.rusefi.tools.tune.TableData;
|
import com.rusefi.tools.tune.TableData;
|
||||||
import org.junit.jupiter.api.Test;
|
import org.junit.jupiter.api.Test;
|
||||||
|
|
||||||
|
@ -12,8 +13,7 @@ import static org.junit.Assert.assertEquals;
|
||||||
public class TableDataTest {
|
public class TableDataTest {
|
||||||
@Test
|
@Test
|
||||||
public void read() throws IOException {
|
public void read() throws IOException {
|
||||||
|
String input = "<constant cols=\"10\" digits=\"0\" name=\"scriptTable4\" rows=\"8\" units=\"value\">\n" +
|
||||||
String s = "<constant cols=\"10\" digits=\"0\" name=\"scriptTable4\" rows=\"8\" units=\"value\">\n" +
|
|
||||||
" 0.0 0.0 0.0 333 0.0 0.0 0.0 0.0 0.0 0.0 \n" +
|
" 0.0 0.0 0.0 333 0.0 0.0 0.0 0.0 0.0 0.0 \n" +
|
||||||
" 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 \n" +
|
" 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 \n" +
|
||||||
" 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 \n" +
|
" 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 \n" +
|
||||||
|
@ -21,12 +21,35 @@ public class TableDataTest {
|
||||||
" 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 \n" +
|
" 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 \n" +
|
||||||
" 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 \n" +
|
" 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 \n" +
|
||||||
" 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 \n" +
|
" 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 \n" +
|
||||||
" 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 \n" +
|
" 771 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 777 \n" +
|
||||||
" </constant>\n";
|
" </constant>\n";
|
||||||
|
|
||||||
Reader r = new StringReader(s);
|
Reader r = new StringReader(input);
|
||||||
float[][] data = TableData.readTable("x", "scriptTable4", 8, s1 -> r, 10);
|
TableData data = TableData.readTable("x", "scriptTable4", 8, s1 -> r, 10);
|
||||||
|
|
||||||
assertEquals(333, (int)data[0][3]);
|
assertEquals(333, (int) data.floats[0][3]);
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
assertEquals("{0.000,\t0.000,\t0.000,\t333.000,\t0.000,\t0.000,\t0.000,\t0.000,\t0.000,\t0.000,\t},\n" +
|
||||||
|
"{0.000,\t0.000,\t0.000,\t0.000,\t0.000,\t0.000,\t0.000,\t0.000,\t0.000,\t0.000,\t},\n" +
|
||||||
|
"{0.000,\t0.000,\t0.000,\t0.000,\t0.000,\t0.000,\t0.000,\t0.000,\t0.000,\t0.000,\t},\n" +
|
||||||
|
"{444.000,\t0.000,\t0.000,\t0.000,\t0.000,\t0.000,\t0.000,\t0.000,\t0.000,\t0.000,\t},\n" +
|
||||||
|
"{0.000,\t0.000,\t0.000,\t0.000,\t0.000,\t0.000,\t0.000,\t0.000,\t0.000,\t0.000,\t},\n" +
|
||||||
|
"{0.000,\t0.000,\t0.000,\t0.000,\t0.000,\t0.000,\t0.000,\t0.000,\t0.000,\t0.000,\t},\n" +
|
||||||
|
"{0.000,\t0.000,\t0.000,\t0.000,\t0.000,\t0.000,\t0.000,\t0.000,\t0.000,\t0.000,\t},\n" +
|
||||||
|
"{771.000,\t0.000,\t0.000,\t0.000,\t0.000,\t0.000,\t0.000,\t0.000,\t0.000,\t777.000,\t},\n", data.getCTable());
|
||||||
|
|
||||||
|
|
||||||
|
assertEquals("static const float hardCodedscriptTable4[8][10] = {\n" +
|
||||||
|
"{0.000,\t0.000,\t0.000,\t333.000,\t0.000,\t0.000,\t0.000,\t0.000,\t0.000,\t0.000,\t},\n" +
|
||||||
|
"{0.000,\t0.000,\t0.000,\t0.000,\t0.000,\t0.000,\t0.000,\t0.000,\t0.000,\t0.000,\t},\n" +
|
||||||
|
"{0.000,\t0.000,\t0.000,\t0.000,\t0.000,\t0.000,\t0.000,\t0.000,\t0.000,\t0.000,\t},\n" +
|
||||||
|
"{444.000,\t0.000,\t0.000,\t0.000,\t0.000,\t0.000,\t0.000,\t0.000,\t0.000,\t0.000,\t},\n" +
|
||||||
|
"{0.000,\t0.000,\t0.000,\t0.000,\t0.000,\t0.000,\t0.000,\t0.000,\t0.000,\t0.000,\t},\n" +
|
||||||
|
"{0.000,\t0.000,\t0.000,\t0.000,\t0.000,\t0.000,\t0.000,\t0.000,\t0.000,\t0.000,\t},\n" +
|
||||||
|
"{0.000,\t0.000,\t0.000,\t0.000,\t0.000,\t0.000,\t0.000,\t0.000,\t0.000,\t0.000,\t},\n" +
|
||||||
|
"{771.000,\t0.000,\t0.000,\t0.000,\t0.000,\t0.000,\t0.000,\t0.000,\t0.000,\t777.000,\t},\n" +
|
||||||
|
"};\n", data.getCsourceCode());
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue