From 30ddb4fd2264423dfeaaddf01523cf152feaafb2 Mon Sep 17 00:00:00 2001 From: rusefillc Date: Sun, 28 Nov 2021 14:10:13 -0500 Subject: [PATCH] automation around outputs section #197 datalog toolset --- firmware/console/binary/output_channels.txt | 37 ++++++++-------- .../console/binary/ts_outputs_generated.h | 22 +++++++++- firmware/gen_output_channels.sh | 2 +- firmware/tunerstudio/rusefi.input | 40 +++++++++++------- java_tools/ConfigDefinition.jar | Bin 3555319 -> 3555465 bytes .../com/rusefi/output/DataLogConsumer.java | 7 ++- .../java/com/rusefi/test/OutputsTest.java | 7 +-- 7 files changed, 74 insertions(+), 41 deletions(-) diff --git a/firmware/console/binary/output_channels.txt b/firmware/console/binary/output_channels.txt index a89f030282..e6db63e8ab 100644 --- a/firmware/console/binary/output_channels.txt +++ b/firmware/console/binary/output_channels.txt @@ -34,38 +34,39 @@ bit isTps2Error; bit isIdleClosedLoop; bit isIdleCoasting; -uint16_t autoscale RPMValue;;"RPM",1, 0, 0, 0, 0 -uint16_t rpmAcceleration;;"RPM/s",1, 0, 0, 0, 0 +uint16_t autoscale RPMValue;@@GAUGE_NAME_RPM@@;"RPM",1, 0, 0, 0, 0 - uint16_t autoscale speedToRpmRatio;;"value",{1/@@PACK_MULT_PERCENT@@}, 0, 0, 0, 0 - uint8_t autoscale vehicleSpeedKph;;"kph",1, 0, 0, 0, 0 - uint8_t autoscale internalMcuTemperature;;"deg C",1, 0, 0, 0, 0 +uint16_t rpmAcceleration;dRPM;"RPM/s",1, 0, 0, 0, 0 - uint16_t autoscale coolant;;"deg C",{1/@@PACK_MULT_TEMPERATURE@@}, 0, 0, 0, 0 - uint16_t autoscale intake;;"deg C",{1/@@PACK_MULT_TEMPERATURE@@}, 0, 0, 0, 0 + uint16_t autoscale speedToRpmRatio;s2rpm;"value",{1/@@PACK_MULT_PERCENT@@}, 0, 0, 0, 0 + uint8_t autoscale vehicleSpeedKph;@@GAUGE_NAME_VVS@@;"kph",1, 0, 0, 0, 0 + uint8_t autoscale internalMcuTemperature;@@GAUGE_NAME_CPU_TEMP@@;"deg C",1, 0, 0, 0, 0 + + uint16_t autoscale coolant;@@GAUGE_NAME_CLT@@;"deg C",{1/@@PACK_MULT_TEMPERATURE@@}, 0, 0, 0, 0 + uint16_t autoscale intake;@@GAUGE_NAME_IAT@@;"deg C",{1/@@PACK_MULT_TEMPERATURE@@}, 0, 0, 0, 0 uint16_t autoscale auxTemp1;;"deg C",{1/@@PACK_MULT_TEMPERATURE@@}, 0, 0, 0, 0 uint16_t autoscale auxTemp2;;"deg C",{1/@@PACK_MULT_TEMPERATURE@@}, 0, 0, 0, 0 - uint16_t autoscale TPSValue;;"%",{1/@@PACK_MULT_PERCENT@@}, 0, 0, 0, 0 - uint16_t autoscale throttlePedalPosition;;"%",{1/@@PACK_MULT_PERCENT@@}, 0, 0, 0, 0 + uint16_t autoscale TPSValue;@@GAUGE_NAME_TPS@@;"%",{1/@@PACK_MULT_PERCENT@@}, 0, 0, 0, 0 + uint16_t autoscale throttlePedalPosition;@@GAUGE_NAME_THROTTLE_PEDAL@@;"%",{1/@@PACK_MULT_PERCENT@@}, 0, 0, 0, 0 uint16_t tpsADC;;"ADC", 1, 0, 0, 0, 0 - uint16_t autoscale MAFValue;;"V",{1/@@PACK_MULT_VOLTAGE@@}, 0, 0, 0, 0 + uint16_t autoscale MAFValue;@@GAUGE_NAME_MAF@@;"V",{1/@@PACK_MULT_VOLTAGE@@}, 0, 0, 0, 0 - uint16_t autoscale massAirFlowValue;;"Kg/h",{1/@@PACK_MULT_MASS_FLOW@@}, 0, 0, 0, 0 - uint16_t autoscale MAPValue;;"kPa",{1/@@PACK_MULT_PRESSURE@@}, 0, 0, 0, 0 + uint16_t autoscale massAirFlowValue;@@GAUGE_NAME_AIR_FLOW@@;"Kg/h",{1/@@PACK_MULT_MASS_FLOW@@}, 0, 0, 0, 0 + uint16_t autoscale MAPValue;@@GAUGE_NAME_MAP@@;"kPa",{1/@@PACK_MULT_PRESSURE@@}, 0, 0, 0, 0 uint16_t autoscale baroPressure;;"kPa",{1/@@PACK_MULT_PRESSURE@@}, 0, 0, 0, 0 - uint16_t autoscale lambdaValue;;"",{1/@@PACK_MULT_LAMBDA@@}, 0, 0, 0, 0 + uint16_t autoscale lambdaValue;@@GAUGE_NAME_LAMBDA@@;"",{1/@@PACK_MULT_LAMBDA@@}, 0, 0, 0, 0 uint8_t autoscale knockRetard;;"deg",{1/10}, 0, 0, 0, 0 uint8_t unused37;;"",1, 0, 0, 0, 0 - uint16_t autoscale VBatt;;"V",{1/@@PACK_MULT_VOLTAGE@@}, 0, 0, 0, 0 + uint16_t autoscale VBatt;@@GAUGE_NAME_VBAT@@;"V",{1/@@PACK_MULT_VOLTAGE@@}, 0, 0, 0, 0 - uint16_t autoscale oilPressure;;"kPa",{1/@@PACK_MULT_PRESSURE@@}, 0, 0, 0, 0 - uint16_t autoscale vvtPositionB1I;;"deg",{1/@@PACK_MULT_ANGLE@@}, 0, 0, 0, 0 + uint16_t autoscale oilPressure;@@GAUGE_NAME_OIL_PRESSURE@@;"kPa",{1/@@PACK_MULT_PRESSURE@@}, 0, 0, 0, 0 + uint16_t autoscale vvtPositionB1I;@@GAUGE_NAME_VVT_B1I@@;"deg",{1/@@PACK_MULT_ANGLE@@}, 0, 0, 0, 0 uint16_t autoscale chargeAirMass;;"g",{1/1000}, 0, 0, 0, 0 uint16_t autoscale crankingFuelMs;airmass in mg, 0-65 grams;"ms",{1/@@PACK_MULT_FUEL_MASS@@}, 0, 0, 0, 0 @@ -121,9 +122,9 @@ uint16_t rpmAcceleration;;"RPM/s",1, 0, 0, 0, 0 float autoscale knockLevel;;"Volts", 1, 0, 0, 0, 0 ! integration magic: TS requires exact 'seconds' name - uint32_t autoscale seconds;;"sec", 1, 0, 0, 0, 0 + uint32_t autoscale seconds;@@GAUGE_NAME_UPTIME@@;"sec", 1, 0, 0, 0, 0 uint32_t autoscale engineMode;;"em", 1, 0, 0, 0, 0 - uint32_t autoscale firmwareVersion;;"version_f", 1, 0, 0, 0, 0 + uint32_t autoscale firmwareVersion;@@GAUGE_NAME_VERSION@@;"version_f", 1, 0, 0, 0, 0 ! todo: this not needed in light of TS_SIGNATURE but rusEFI console still uses it. Need to migrate ! rusEFI console from TS_FILE_VERSION to TS_SIGNATURE :( diff --git a/firmware/console/binary/ts_outputs_generated.h b/firmware/console/binary/ts_outputs_generated.h index 113d32cb41..8e820f7010 100644 --- a/firmware/console/binary/ts_outputs_generated.h +++ b/firmware/console/binary/ts_outputs_generated.h @@ -1,4 +1,4 @@ -// this section was generated automatically by rusEFI tool ConfigDefinition.jar based on (unknown script) console/binary/output_channels.txt Sat Nov 27 19:22:57 EST 2021 +// this section was generated automatically by rusEFI tool ConfigDefinition.jar based on (unknown script) console/binary/output_channels.txt Sun Nov 28 14:09:25 EST 2021 // by class com.rusefi.output.CHeaderConsumer // begin #pragma once @@ -102,36 +102,43 @@ struct ts_outputs_s { offset 0 bit 31 */ bool isIdleCoasting : 1 {}; /** + * @@GAUGE_NAME_RPM@@ RPM * offset 4 */ scaled_channel RPMValue = (uint16_t)0; /** + * dRPM RPM/s * offset 6 */ uint16_t rpmAcceleration = (uint16_t)0; /** + * s2rpm value * offset 8 */ scaled_channel speedToRpmRatio = (uint16_t)0; /** + * @@GAUGE_NAME_VVS@@ kph * offset 10 */ scaled_channel vehicleSpeedKph = (uint8_t)0; /** + * @@GAUGE_NAME_CPU_TEMP@@ deg C * offset 11 */ scaled_channel internalMcuTemperature = (uint8_t)0; /** + * @@GAUGE_NAME_CLT@@ deg C * offset 12 */ scaled_channel coolant = (uint16_t)0; /** + * @@GAUGE_NAME_IAT@@ deg C * offset 14 */ @@ -147,11 +154,13 @@ struct ts_outputs_s { */ scaled_channel auxTemp2 = (uint16_t)0; /** + * @@GAUGE_NAME_TPS@@ % * offset 20 */ scaled_channel TPSValue = (uint16_t)0; /** + * @@GAUGE_NAME_THROTTLE_PEDAL@@ % * offset 22 */ @@ -162,16 +171,19 @@ struct ts_outputs_s { */ uint16_t tpsADC = (uint16_t)0; /** + * @@GAUGE_NAME_MAF@@ V * offset 26 */ scaled_channel MAFValue = (uint16_t)0; /** + * @@GAUGE_NAME_AIR_FLOW@@ Kg/h * offset 28 */ scaled_channel massAirFlowValue = (uint16_t)0; /** + * @@GAUGE_NAME_MAP@@ kPa * offset 30 */ @@ -182,6 +194,7 @@ struct ts_outputs_s { */ scaled_channel baroPressure = (uint16_t)0; /** + * @@GAUGE_NAME_LAMBDA@@ * offset 34 */ scaled_channel lambdaValue = (uint16_t)0; @@ -195,16 +208,19 @@ struct ts_outputs_s { */ uint8_t unused37 = (uint8_t)0; /** + * @@GAUGE_NAME_VBAT@@ V * offset 38 */ scaled_channel VBatt = (uint16_t)0; /** + * @@GAUGE_NAME_OIL_PRESSURE@@ kPa * offset 40 */ scaled_channel oilPressure = (uint16_t)0; /** + * @@GAUGE_NAME_VVT_B1I@@ deg * offset 42 */ @@ -383,6 +399,7 @@ struct ts_outputs_s { */ scaled_channel knockLevel = (float)0; /** + * @@GAUGE_NAME_UPTIME@@ sec * offset 112 */ @@ -393,6 +410,7 @@ struct ts_outputs_s { */ scaled_channel engineMode = (uint32_t)0; /** + * @@GAUGE_NAME_VERSION@@ version_f * offset 120 */ @@ -723,4 +741,4 @@ struct ts_outputs_s { }; // end -// this section was generated automatically by rusEFI tool ConfigDefinition.jar based on (unknown script) console/binary/output_channels.txt Sat Nov 27 19:22:57 EST 2021 +// this section was generated automatically by rusEFI tool ConfigDefinition.jar based on (unknown script) console/binary/output_channels.txt Sun Nov 28 14:09:25 EST 2021 diff --git a/firmware/gen_output_channels.sh b/firmware/gen_output_channels.sh index bd9f12a58b..68c0385008 100755 --- a/firmware/gen_output_channels.sh +++ b/firmware/gen_output_channels.sh @@ -9,7 +9,7 @@ java -DSystemOut.name=logs/gen_output_channels \ -cache_zip_file tunerstudio/generated/cache.zip \ -prepend integration/rusefi_config.txt \ -definition console/binary/output_channels.txt \ - -ts_outputs_section console/binary/output_channels.ini \ + -ts_outputs_section console/binary/ \ -cache . \ -with_c_defines false \ -c_destination console/binary/ts_outputs_generated.h \ No newline at end of file diff --git a/firmware/tunerstudio/rusefi.input b/firmware/tunerstudio/rusefi.input index 30ad649282..0b39ed256d 100644 --- a/firmware/tunerstudio/rusefi.input +++ b/firmware/tunerstudio/rusefi.input @@ -1277,31 +1277,41 @@ gaugeCategory = DynoView ; Channel Label Type Format entry = time, @@GAUGE_NAME_TIME@@, float, "%.3f" entry = seconds, @@GAUGE_NAME_UPTIME@@, float, "%.3f" - entry = RPMValue, @@GAUGE_NAME_RPM@@, int, "%d" - entry = firmwareVersion, @@GAUGE_NAME_VERSION@@, int, "%d" - entry = coolant, @@GAUGE_NAME_CLT@@, float, "%.2f" - entry = intake, @@GAUGE_NAME_IAT@@, float, "%.2f" - entry = oilPressure, @@GAUGE_NAME_OIL_PRESSURE@@,float, "%.1f" - entry = TPSValue, @@GAUGE_NAME_TPS@@, float, "%.2f" + +entry = RPMValue, "RPM", int, "%d" +entry = rpmAcceleration, "dRPM", int, "%d" +entry = speedToRpmRatio, "s2rpm", float, "%.3f" +entry = vehicleSpeedKph, "Vehicle Speed", int, "%d" +entry = internalMcuTemperature, "CPU Temperature", int, "%d" +entry = coolant, "CLT", float, "%.3f" +entry = intake, "IAT", float, "%.3f" +entry = auxTemp1, "auxTemp1", float, "%.3f" +entry = auxTemp2, "auxTemp2", float, "%.3f" +entry = TPSValue, "TPS", float, "%.3f" +entry = throttlePedalPosition, "Throttle pedal position", float, "%.3f" +entry = tpsADC, "tpsADC", int, "%d" +entry = MAFValue, "MAF", float, "%.3f" +entry = massAirFlowValue, "massAirFlowValue", float, "%.3f" +entry = MAPValue, "MAP", float, "%.3f" +entry = baroPressure, "baroPressure", float, "%.3f" +entry = lambdaValue, "Lambda", float, "%.3f" +entry = knockRetard, "knockRetard", float, "%.3f" +entry = VBatt, "VBatt", float, "%.3f" +entry = oilPressure, "Oil Pressure", float, "%.3f" +entry = vvtPositionB1I, "VVT: bank 1 intake", float, "%.3f" entry = TPS2Value, @@GAUGE_NAME_TPS2@@, float, "%.2f" - entry = MAFValue, @@GAUGE_NAME_MAF@@, float, "%.2f" - entry = MAPValue, @@GAUGE_NAME_MAP@@, float, "%.1f" entry = AFRValue, @@GAUGE_NAME_AFR@@, float, "%.2f" entry = AFRValue2, @@GAUGE_NAME_AFR2@@, float, "%.2f" - entry = lambdaValue, @@GAUGE_NAME_LAMBDA@@, float, "%.2f" entry = lambdaValue2, @@GAUGE_NAME_LAMBDA2@@, float, "%.2f" - entry = VBatt, @@GAUGE_NAME_VBAT@@, float, "%.2f" entry = fuelingLoad, @@GAUGE_NAME_FUEL_LOAD@@, float, "%.1f" entry = ignitionLoad, @@GAUGE_NAME_IGNITION_LOAD@@, float, "%.1f" entry = ignitionAdvance, @@GAUGE_NAME_TIMING_ADVANCE@@, float, "%.2f" entry = knockLevel, @@GAUGE_NAME_KNOCK_LEVEL@@, float, "%.2f" - entry = vehicleSpeedKph, @@GAUGE_NAME_VVS@@, float, "%.2f" + entry = firmwareVersion, @@GAUGE_NAME_VERSION@@, int, "%d" entry = turboSpeed, @@GAUGE_NAME_TURBO_SPEED@@ int, "%d" entry = speedToRpmRatio, "s2rpm", float, "%.3f" - entry = rpmAcceleration, "dRPM", int, "%d" entry = massAirFlowValue,@@GAUGE_NAME_AIR_FLOW@@, float, "%.3f" entry = chargeAirMass, @@GAUGE_NAME_AIR_MASS@@, float, "%.3f" - entry = throttlePedalPosition, @@GAUGE_NAME_THROTTLE_PEDAL@@, float, "%.3f" entry = wastegatePositionSensor, @@GAUGE_NAME_WG_POSITION@@, float, "%.3f" entry = totalTriggerErrorCounter, @@GAUGE_NAME_TRG_ERR@@,int, "%d" entry = idleAirValvePosition, @@GAUGE_NAME_IAC@@, float, "%.3f" @@ -1350,7 +1360,6 @@ gaugeCategory = DynoView entry = sparkDwellValue, @@GAUGE_COIL_DWELL_TIME@@, float,"%.3f" - entry = vvtPositionB1I, @@GAUGE_NAME_VVT_B1I@@, float, "%.1f" entry = vvtPositionB1E, @@GAUGE_NAME_VVT_B1E@@, float, "%.1f" entry = vvtPositionB2I, @@GAUGE_NAME_VVT_B2I@@, float, "%.1f" entry = vvtPositionB2E, @@GAUGE_NAME_VVT_B2E@@, float, "%.1f" @@ -1389,8 +1398,7 @@ gaugeCategory = DynoView entry = recentErrorCode6, "error 6",int,"%d", { !enableLogErrorList } entry = recentErrorCode7, "error 7",int,"%d", { !enableLogErrorList } entry = recentErrorCode8, "error 8",int,"%d", { !enableLogErrorList } - entry = internalMcuTemperature, @@GAUGE_NAME_CPU_TEMP@@,float,"%.2f" - + entry = tCharge, "tCharge",float,"%.3f" entry = clutchUpState, @@INDICATOR_NAME_CLUTCH_UP@@,int,"%d" diff --git a/java_tools/ConfigDefinition.jar b/java_tools/ConfigDefinition.jar index 7e40aca3fd9921471b67f28067389dbb6ac2ceb8..5c20883a5e1d5ba77fd514effec28d4eaf652d99 100644 GIT binary patch delta 39864 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

)wuz@+t8~P?GLe_p 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 diff --git a/java_tools/configuration_definition/src/main/java/com/rusefi/output/DataLogConsumer.java b/java_tools/configuration_definition/src/main/java/com/rusefi/output/DataLogConsumer.java index 846646d1a0..cfee656007 100644 --- a/java_tools/configuration_definition/src/main/java/com/rusefi/output/DataLogConsumer.java +++ b/java_tools/configuration_definition/src/main/java/com/rusefi/output/DataLogConsumer.java @@ -55,6 +55,8 @@ public class DataLogConsumer implements ConfigurationConsumer { } private String handle(ConfigField configField) { + if (configField.getName().contains("unused")) + return ""; if (configField.isBit()) { return ""; } @@ -75,7 +77,10 @@ public class DataLogConsumer implements ConfigurationConsumer { } String comment = state.variableRegistry.applyVariables(configField.getComment()); - if (comment.isEmpty() || comment.charAt(0) != '"') + if (comment.isEmpty()) + comment = configField.getName(); + + if (comment.charAt(0) != '"') comment = quote(comment); return "entry = " + configField.getName() + ", " + comment + ", " + typeString + "\n"; diff --git a/java_tools/configuration_definition/src/main/java/com/rusefi/test/OutputsTest.java b/java_tools/configuration_definition/src/main/java/com/rusefi/test/OutputsTest.java index e611b4a98b..17cee94411 100644 --- a/java_tools/configuration_definition/src/main/java/com/rusefi/test/OutputsTest.java +++ b/java_tools/configuration_definition/src/main/java/com/rusefi/test/OutputsTest.java @@ -69,9 +69,10 @@ public class OutputsTest { String test = "struct total\n" + "float afr_type;PID dTime;\"ms\", 1, 0, 0, 3000, 0\n" + "uint16_t autoscale speedToRpmRatio;s2rpm;\"value\",{1/@@PACK_MULT_PERCENT@@}, 0, 0, 0, 0\n" + - "uint8_t afr_typet;PID dTime;\"ms\", 1, 0, 0, 3000, 0\n" + + "uint8_t afr_typet;;\"ms\", 1, 0, 0, 3000, 0\n" + "uint8_t autoscale vehicleSpeedKph;;\"kph\",1, 0, 0, 0, 0\n" + "bit isForcedInduction;Does the vehicle have a turbo or supercharger?\n" + + "\tuint8_t unused37;;\"\",1, 0, 0, 0, 0\n" + "bit enableFan1WithAc;+Turn on this fan when AC is on.\n" + "end_struct\n"; ReaderState state = new ReaderState(); @@ -82,8 +83,8 @@ public class OutputsTest { state.readBufferedReader(reader, Collections.singletonList(dataLogConsumer)); assertEquals("entry = afr_type, \"PID dTime\", float, \"%.3f\"\n" + "entry = speedToRpmRatio, \"s2rpm\", float, \"%.3f\"\n" + - "entry = afr_typet, \"PID dTime\", int, \"%d\"\n" + - "entry = vehicleSpeedKph, \"\", int, \"%d\"\n", new String(dataLogConsumer.getTsWriter().toCharArray())); + "entry = afr_typet, \"afr_typet\", int, \"%d\"\n" + + "entry = vehicleSpeedKph, \"vehicleSpeedKph\", int, \"%d\"\n", new String(dataLogConsumer.getTsWriter().toCharArray())); } }