From d9c3eba4707774f3ca182be7b2b3ed4d90403f61 Mon Sep 17 00:00:00 2001 From: rusefi Date: Thu, 27 Jun 2019 06:47:13 -0400 Subject: [PATCH] Annotations in C++ code to produce formulas in rusEfi console #807 --- firmware/controllers/core/common_headers.h | 1 + firmware/controllers/sensors/tps.cpp | 7 +- .../com/rusefi/ldmp/generated/TpsMeta.java | 6 +- .../com/rusefi/ui/livedocs/LiveDocPanel.java | 2 +- java_tools/ConfigDefinition.jar | Bin 107177 -> 110941 bytes .../com/rusefi/ldmp/LiveDocsMetaParser.java | 69 ++++++++++++------ .../src/com/rusefi/ldmp/MetaInfo.java | 17 +++++ .../ldmp/test/LiveDocsMetaParserTest.java | 35 +++++---- 8 files changed, 95 insertions(+), 42 deletions(-) create mode 100644 java_tools/configuration_definition/src/com/rusefi/ldmp/MetaInfo.java diff --git a/firmware/controllers/core/common_headers.h b/firmware/controllers/core/common_headers.h index dbdfa40778..034e738c4c 100644 --- a/firmware/controllers/core/common_headers.h +++ b/firmware/controllers/core/common_headers.h @@ -37,6 +37,7 @@ // we use this 'DISPLAY' macro if value is not used by C++ in current context #define DISPLAY(x) +#define DISPLAY_TAG(x) #define DISPLAY_TEXT(x) #define DISPLAY_SENSOR(x) {} #define DISPLAY_IF(x) x diff --git a/firmware/controllers/sensors/tps.cpp b/firmware/controllers/sensors/tps.cpp index 499c3860d6..d9ca44fe96 100644 --- a/firmware/controllers/sensors/tps.cpp +++ b/firmware/controllers/sensors/tps.cpp @@ -79,6 +79,8 @@ float getTpsRateOfChange(void) { * */ percent_t getTpsValue(int adc DECLARE_ENGINE_PARAMETER_SUFFIX) { + DISPLAY_TAG(TPS_SECTION); + DISPLAY_TEXT(Analog_MCU_reads); engine->engineState.currentTpsAdc = adc; #if !EFI_UNIT_TEST @@ -197,7 +199,10 @@ percent_t getPedalPosition(DECLARE_ENGINE_PARAMETER_SIGNATURE) { if (mockPedalPosition != MOCK_UNDEFINED) { return mockPedalPosition; } - float voltage = getVoltageDivided("pPS", engineConfiguration->throttlePedalPositionAdcChannel); + DISPLAY_TAG(PEGAL_SECTION); + DISPLAY_TEXT(Analog_MCU_reads); + + float voltage = getVoltageDivided("pPS", CONFIG(DISPLAY_CONFIG(throttlePedalPositionAdcChannel))); float result = interpolateMsg("pedal", engineConfiguration->throttlePedalUpVoltage, 0, engineConfiguration->throttlePedalWOTVoltage, 100, voltage); // this would put the value into the 0-100 range diff --git a/java_console/ui/src/com/rusefi/ldmp/generated/TpsMeta.java b/java_console/ui/src/com/rusefi/ldmp/generated/TpsMeta.java index d0bfcb005f..8d4eb185c6 100644 --- a/java_console/ui/src/com/rusefi/ldmp/generated/TpsMeta.java +++ b/java_console/ui/src/com/rusefi/ldmp/generated/TpsMeta.java @@ -3,7 +3,11 @@ package com.rusefi.ldmp.generated; import com.rusefi.ldmp.*; public class TpsMeta { - public static final Request[] CONTENT = new Request[]{ + public static final Request[] PEGAL_SECTION = new Request[]{ + new TextRequest("Analog_MCU_reads"), + new ConfigRequest("throttlePedalPositionAdcChannel"), + }; + public static final Request[] TPS_SECTION = new Request[]{ new TextRequest("Analog_MCU_reads"), new FieldRequest("tpsVoltageMCU"), new TextRequest("Volts"), diff --git a/java_console/ui/src/com/rusefi/ui/livedocs/LiveDocPanel.java b/java_console/ui/src/com/rusefi/ui/livedocs/LiveDocPanel.java index 055b5f0265..721ff8469d 100644 --- a/java_console/ui/src/com/rusefi/ui/livedocs/LiveDocPanel.java +++ b/java_console/ui/src/com/rusefi/ui/livedocs/LiveDocPanel.java @@ -172,7 +172,7 @@ public class LiveDocPanel { ThermistorState.VALUES, ThermistorsMeta.CONTENT)); liveDocs.add(getPanel("Throttle Position Sensor", "", Fields.LDS_ENGINE_STATE_INDEX, - EngineState.VALUES, TpsMeta.CONTENT)); + EngineState.VALUES, TpsMeta.TPS_SECTION)); liveDocs.add(getPanel("tCharge", "", Fields.LDS_ENGINE_STATE_INDEX, EngineState.VALUES, SpeedDensityMeta.CONTENT)); diff --git a/java_tools/ConfigDefinition.jar b/java_tools/ConfigDefinition.jar index 89761f28381d29a3df18cf248a811a86f8b97db9..aed2aaa406762cb2ece4ede942a2a7f8b5967e48 100644 GIT binary patch delta 19682 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 a2VY4Z9^oGw8vL2b{@j;ziGPX<0sjTH*?Twu delta 16042 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 diff --git a/java_tools/configuration_definition/src/com/rusefi/ldmp/LiveDocsMetaParser.java b/java_tools/configuration_definition/src/com/rusefi/ldmp/LiveDocsMetaParser.java index dac4e70652..7ca5b87f0a 100644 --- a/java_tools/configuration_definition/src/com/rusefi/ldmp/LiveDocsMetaParser.java +++ b/java_tools/configuration_definition/src/com/rusefi/ldmp/LiveDocsMetaParser.java @@ -14,6 +14,7 @@ import java.util.stream.Stream; import static com.rusefi.ConfigDefinition.EOL; public class LiveDocsMetaParser { + private static final String DISPLAY_TAG = "DISPLAY_TAG"; private static final String DISPLAY_CONFIG = "DISPLAY_CONFIG"; private static final String DISPLAY_FIELD = "DISPLAY_FIELD"; private static final String DISPLAY_TEXT = "DISPLAY_TEXT"; @@ -34,49 +35,62 @@ public class LiveDocsMetaParser { throw new IllegalArgumentException("Two arguments expected but " + Arrays.toString(args)); String fileName = args[0]; String destinationPath = args[1]; - SystemOut.println(fileName); - if (!new File(fileName).exists()) - throw new IllegalStateException("Not found " + fileName); - String content = readLineByLine(fileName); - List r = parse(content); - SystemOut.println(r); + MetaInfo metaInfo = getMetaFromFile(fileName); + SystemOut.println(metaInfo); String className = getClassName(fileName); - String javaCode = generateJavaCode(r, className); + String javaCode = generateJavaCode(metaInfo, className); FileWriter fw = new FileWriter(destinationPath + "java_console/ui/src/com/rusefi/ldmp/generated/" + className + ".java"); fw.write(javaCode); fw.close(); } - public static List parse(String string) { + private static MetaInfo getMetaFromFile(String fileName) throws IOException { + SystemOut.println(fileName); + if (!new File(fileName).exists()) + throw new IllegalStateException("Not found " + fileName); + String content = readLineByLine(fileName); + return parse(content); + } + + public static MetaInfo parse(String string) { Stack> stack = new Stack<>(); - List result = new ArrayList<>(); + + MetaInfo meta = new MetaInfo(); + + List result = meta.start("CONTENT"); string = string.replaceAll("[()>.]", " "); SystemOut.println(string); Scanner s = new Scanner(string); while (s.hasNext()) { String token = s.next(); //SystemOut.println(token); - if (DISPLAY_CONFIG.equals(token)) { + if (DISPLAY_CONFIG.equalsIgnoreCase(token)) { if (s.hasNext()) { String config = s.next(); SystemOut.println("REQ CONF " + config); result.add(new ConfigRequest(config)); } - } else if (DISPLAY_TEXT.equals(token)) { + } else if (DISPLAY_TEXT.equalsIgnoreCase(token)) { if (s.hasNext()) { String config = s.next(); SystemOut.println("REQ TEXT " + config); result.add(new TextRequest(config)); } - } else if (DISPLAY_FIELD.equals(token)) { + } else if (DISPLAY_TAG.equalsIgnoreCase(token)) { + if (s.hasNext()) { + String tag = s.next(); + SystemOut.println("REQ TAG " + tag); + result = meta.start(tag); + } + } else if (DISPLAY_FIELD.equalsIgnoreCase(token)) { if (s.hasNext()) { String config = s.next(); SystemOut.println("REQ FIELD " + config); result.add(new FieldRequest(config)); } - } else if (DISPLAY_IF.equals(token)) { + } else if (DISPLAY_IF.equalsIgnoreCase(token)) { if (s.hasNext()) { stack.push(result); @@ -90,7 +104,7 @@ public class LiveDocsMetaParser { result = ifRequest.trueBlock; } - } else if (DISPLAY_ELSE.equals(token)) { + } else if (DISPLAY_ELSE.equalsIgnoreCase(token)) { if (stack.isEmpty()) throw new IllegalStateException("No IF statement on stack"); List onStack = stack.peek(); @@ -102,12 +116,12 @@ public class LiveDocsMetaParser { IfRequest ifRequest = (IfRequest) request; result = ifRequest.falseBlock; - } else if (DISPLAY_ENDIF.equals(token)) { + } else if (DISPLAY_ENDIF.equalsIgnoreCase(token)) { if (stack.isEmpty()) throw new IllegalStateException("No IF statement on stack"); result = stack.pop(); - } else if (DISPLAY_SENSOR.equals(token)) { + } else if (DISPLAY_SENSOR.equalsIgnoreCase(token)) { if (s.hasNext()) { String config = s.next(); SystemOut.println("REQ SENSOR " + config); @@ -118,19 +132,28 @@ public class LiveDocsMetaParser { if (!stack.isEmpty()) throw new IllegalStateException("Unfinished"); - return result; + return meta; } - public static String generateJavaCode(List r, String className) { + public static String generateJavaCode(MetaInfo r, String className) { StringBuilder java = new StringBuilder("package com.rusefi.ldmp.generated;" + EOL + EOL + "import com.rusefi.ldmp.*;" + EOL + EOL + - "public class " + className + " {" + EOL + - "\tpublic static final Request[] CONTENT = new Request[]{" + EOL); + "public class " + className + " {" + EOL + ); - java.append(Request.printList(r)); - java.append("\t};" + EOL + - "}"); + for (Map.Entry> e : r.map.entrySet()) { + List list = e.getValue(); + if (list.isEmpty()) + continue; + java.append("\tpublic static final Request[] " + + e.getKey() + + " = new Request[]{" + EOL); + java.append(Request.printList(list)); + java.append("\t};" + EOL); + } + + java.append("}"); return java.toString(); } diff --git a/java_tools/configuration_definition/src/com/rusefi/ldmp/MetaInfo.java b/java_tools/configuration_definition/src/com/rusefi/ldmp/MetaInfo.java new file mode 100644 index 0000000000..7d772aef7a --- /dev/null +++ b/java_tools/configuration_definition/src/com/rusefi/ldmp/MetaInfo.java @@ -0,0 +1,17 @@ +package com.rusefi.ldmp; + +import java.util.*; + +public class MetaInfo { + public Map> map = new TreeMap<>(); + + + public List start(String content) { + map.putIfAbsent(content, new ArrayList<>()); + return map.get(content); + } + + public List first() { + return map.values().iterator().next(); + } +} diff --git a/java_tools/configuration_definition/src/com/rusefi/ldmp/test/LiveDocsMetaParserTest.java b/java_tools/configuration_definition/src/com/rusefi/ldmp/test/LiveDocsMetaParserTest.java index 057e7ca8b4..221afb7874 100644 --- a/java_tools/configuration_definition/src/com/rusefi/ldmp/test/LiveDocsMetaParserTest.java +++ b/java_tools/configuration_definition/src/com/rusefi/ldmp/test/LiveDocsMetaParserTest.java @@ -16,34 +16,34 @@ public class LiveDocsMetaParserTest { @Test public void parseConfigElements() { - List r = LiveDocsMetaParser.parse("\t\t// TCHARGE_MODE_RPM_TPS\n" + + MetaInfo r = LiveDocsMetaParser.parse("\t\t// TCHARGE_MODE_RPM_TPS\n" + "\t\tfloat minRpmKcurrentTPS = interpolateMsg(\"minRpm\", tpMin, DISPLAY_CONFIG(tChargeMinRpmMinTps), tpMax,\n" + "\t\t\t\t/***display*/CONFIG(tChargeMinRpmMaxTps), tps);\n" + "\t\tfloat maxRpmKcurrentTPS = interpolateMsg(\"maxRpm\", tpMin, DISPLAY_CONFIG(tChargeMaxRpmMinTps), tpMax,\n" + "\t\t\t\tDISPLAY_CONFIG(tChargeMaxRpmMaxTps), tps);\n" + "\n" + "\t\tengine->engineState.Tcharge_coff = interpolateMsg(\"Kcurr\", rpmMin, minRpmKcurrentTPS, rpmMax, maxRpmKcurrentTPS, rpm);\n"); - assertEquals(3, r.size()); - assertEquals(new ConfigRequest("tChargeMinRpmMinTps"), r.get(0)); + assertEquals(3, r.first().size()); + assertEquals(new ConfigRequest("tChargeMinRpmMinTps"), r.first().get(0)); } @Test public void parseField() { - List r = LiveDocsMetaParser.parse("\tDISPLAY_TEXT(Analog_MCU_reads);\n" + + MetaInfo r = LiveDocsMetaParser.parse("\tDISPLAY_TEXT(Analog_MCU_reads);\n" + "\tengine->engineState.DISPLAY_FIELD(currentTpsAdc) = adc;\n" + "\tDISPLAY_TEXT(ADC_which_equals);\n"); - assertEquals(3, r.size()); + assertEquals(3, r.first().size()); } @Test public void parseDisplayConfig() { - List r = LiveDocsMetaParser.parse("\t\t// DISPLAY_TEXT(interpolate(\")\n" + + MetaInfo r = LiveDocsMetaParser.parse("\t\t// DISPLAY_TEXT(interpolate(\")\n" + "+\t\tDISPLAY_SENSOR(RPM) DISPLAY_TEXT(TCHARGE_MODE_RPM_TPS)\n" + "\t\tfloat minRpmKcurrentTPS = interpolateMsg(\"minRpm\", tpMin, DISPLAY_CONFIG(tChargeMinRpmMinTps), tpMax,\n"); - assertEquals(4, r.size()); + assertEquals(4, r.first().size()); // implementation has eaten the bracket :( - assertEquals(new TextRequest("interpolate"), r.get(0)); - assertEquals(new SensorRequest("RPM"), r.get(1)); + assertEquals(new TextRequest("interpolate"), r.first().get(0)); + assertEquals(new SensorRequest("RPM"), r.first().get(1)); String javaCode = LiveDocsMetaParser.generateJavaCode(r, "xx"); assertEquals("package com.rusefi.ldmp.generated;\n" + @@ -63,21 +63,24 @@ public class LiveDocsMetaParserTest { @Test public void testField() { - List r = LiveDocsMetaParser.parse("tm->DISPLAY_FIELD(voltageMCU) = getVoltage(\"term\", config->adcChannel);"); - assertEquals(1, r.size()); - assertEquals(new FieldRequest("voltageMCU"), r.get(0)); + MetaInfo r = LiveDocsMetaParser.parse("tm->DISPLAY_FIELD(voltageMCU) = getVoltage(\"term\", config->adcChannel);\n" + + "DISPLAY_tag(tag) DISPLAY_FIELD(voltageMCU2)"); + assertEquals(1, r.first().size()); + assertEquals(new FieldRequest("voltageMCU"), r.first().get(0)); + + assertEquals(2, r.map.size()); } @Test public void parseIf() { - List r = LiveDocsMetaParser.parse("\tDISPLAY_IF(cond)\t// DISPLAY_TEXT(\"interpolate(\")\n" + + MetaInfo r = LiveDocsMetaParser.parse("\tDisPLAY_IF(cond)\t// DISPLAY_TEXT(\"interpolate(\")\n" + "+\t\tDISPLAY_SENSOR(RPM)" + - "/* DISPLAY_ELSE */ DISPLAY_TEXT(\"TCHARGE_MODE_RPM_TPS\")\n" + + "/* DISPLAY_ElsE */ DISPLAY_TEXT(\"TCHARGE_MODE_RPM_TPS\")\n" + "\t\tfloat minRpmKcurrentTPS = interpolateMsg(\"minRpm\", tpMin, DISPLAY_CONFIG(tChargeMinRpmMinTps), tpMax,\n" + "/* DISPLAY_ENDIF */"); - assertEquals(1, r.size()); - IfRequest ifRequest = (IfRequest) r.get(0); + assertEquals(1, r.first().size()); + IfRequest ifRequest = (IfRequest) r.first().get(0); List trueBlock = ifRequest.trueBlock; assertEquals(2, trueBlock.size()); assertEquals(new SensorRequest("RPM"), trueBlock.get(1));