From 1bbe5877166eb3f0757a7ff65001533207edc611 Mon Sep 17 00:00:00 2001 From: rusefillc Date: Sun, 28 Nov 2021 14:40:03 -0500 Subject: [PATCH] automation around outputs section #197 datalog toolset --- firmware/console/binary/output_channels.txt | 36 +++++++++--------- .../console/binary/ts_outputs_generated.h | 22 ++++++++++- firmware/tunerstudio/rusefi.input | 31 ++++++++------- java_tools/ConfigDefinition.jar | Bin 3555465 -> 3555915 bytes .../com/rusefi/output/DataLogConsumer.java | 3 ++ .../java/com/rusefi/test/OutputsTest.java | 5 ++- 6 files changed, 60 insertions(+), 37 deletions(-) diff --git a/firmware/console/binary/output_channels.txt b/firmware/console/binary/output_channels.txt index e6db63e8ab..e9516700e5 100644 --- a/firmware/console/binary/output_channels.txt +++ b/firmware/console/binary/output_channels.txt @@ -68,28 +68,28 @@ uint16_t rpmAcceleration;dRPM;"RPM/s",1, 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 + uint16_t autoscale chargeAirMass;@@GAUGE_NAME_AIR_MASS@@;"g",{1/1000}, 0, 0, 0, 0 + uint16_t autoscale crankingFuelMs;crankingFuelMs\nairmass in mg, 0-65 grams;"ms",{1/@@PACK_MULT_FUEL_MASS@@}, 0, 0, 0, 0 - uint16_t autoscale currentTargetAfr;;"ratio",{1/@@PACK_MULT_AFR@@}, 0, 0, 0, 0 - uint16_t autoscale baseFuel;This is the raw value we take from the fuel map or base fuel algorithm, before the corrections;"mg",{1/@@PACK_MULT_FUEL_MASS@@}, 0, 0, 0, 0 + uint16_t autoscale currentTargetAfr;@@GAUGE_NAME_TARGET_AFR@@;"ratio",{1/@@PACK_MULT_AFR@@}, 0, 0, 0, 0 + uint16_t autoscale baseFuel;@@GAUGE_NAME_FUEL_BASE@@\nThis is the raw value we take from the fuel map or base fuel algorithm, before the corrections;"mg",{1/@@PACK_MULT_FUEL_MASS@@}, 0, 0, 0, 0 - uint16_t autoscale fuelRunning;Total fuel with CLT IAT and TPS acceleration without injector lag corrections per cycle, as pulse per cycle;"mg",{1/@@PACK_MULT_FUEL_MASS@@}, 0, 0, 0, 0 - uint16_t autoscale actualLastInjection;Actual last injection time - including all compensation and injection mode;"ms",{1/@@PACK_MULT_MS@@}, 0, 0, 0, 0 + uint16_t autoscale fuelRunning;@@GAUGE_NAME_FUEL_RUNNING@@\nTotal fuel with CLT IAT and TPS acceleration without injector lag corrections per cycle, as pulse per cycle;"mg",{1/@@PACK_MULT_FUEL_MASS@@}, 0, 0, 0, 0 + uint16_t autoscale actualLastInjection;@@GAUGE_NAME_FUEL_LAST_INJECTION@@\nActual last injection time - including all compensation and injection mode;"ms",{1/@@PACK_MULT_MS@@}, 0, 0, 0, 0 - uint8_t autoscale injectorDutyCycle;;"%",{1/2}, 0, 0, 0, 0 - uint8_t autoscale veValue;;"ratio",{1/2}, 0, 0, 0, 0 + uint8_t autoscale injectorDutyCycle;@@GAUGE_NAME_FUEL_INJ_DUTY@@;"%",{1/2}, 0, 0, 0, 0 + uint8_t autoscale veValue;@@GAUGE_NAME_FUEL_VE@@;"ratio",{1/2}, 0, 0, 0, 0 uint16_t autoscale injectionOffset;;"deg",{1/@@PACK_MULT_ANGLE@@}, 0, 0, 0, 0 uint16_t autoscale tCharge;;"deg C",{1/@@PACK_MULT_TEMPERATURE@@}, 0, 0, 0, 0 ! Corrections - uint16_t autoscale injectorLagMs;;"ms",{1/@@PACK_MULT_MS@@}, 0, 0, 0, 0 - uint16_t autoscale iatCorrection;;"%",{1/@@PACK_MULT_PERCENT@@}, 0, 0, 0, 0 - uint16_t autoscale cltCorrection;;"%",{1/@@PACK_MULT_PERCENT@@}, 0, 0, 0, 0 - uint16_t autoscale baroCorrection;;"%",{1/@@PACK_MULT_PERCENT@@}, 0, 0, 0, 0 - uint16_t autoscale currentEnginePhase;;"deg",1, 0, 0, 0, 0 + uint16_t autoscale injectorLagMs;@@GAUGE_NAME_INJECTOR_LAG@@;"ms",{1/@@PACK_MULT_MS@@}, 0, 0, 0, 0 + uint16_t autoscale iatCorrection;@@GAUGE_NAME_FUEL_IAT_CORR@@;"%",{1/@@PACK_MULT_PERCENT@@}, 0, 0, 0, 0 + uint16_t autoscale cltCorrection;@@GAUGE_NAME_FUEL_CLT_CORR@@;"%",{1/@@PACK_MULT_PERCENT@@}, 0, 0, 0, 0 + uint16_t autoscale baroCorrection;@@GAUGE_NAME_FUEL_BARO_CORR@@;"%",{1/@@PACK_MULT_PERCENT@@}, 0, 0, 0, 0 + uint16_t autoscale currentEnginePhase;"Engine Phase";"deg",1, 0, 0, 0, 0 ! Wall model AE uint16_t autoscale wallFuelAmount;;"mg",{1/@@PACK_MULT_FUEL_MASS@@}, 0, 0, 0, 0 uint16_t autoscale wallFuelCorrection;;"mg",{1/@@PACK_MULT_FUEL_MASS@@}, 0, 0, 0, 0 @@ -180,7 +180,7 @@ uint16_t rpmAcceleration;dRPM;"RPM/s",1, 0, 0, 0, 0 uint16_t[EGT_CHANNEL_COUNT iterate] egt;;"deg C", 1, 0, 0, 0, 0 - uint16_t autoscale TPS2Value;;"%",{1/@@PACK_MULT_PERCENT@@}, 0, 0, 0, 0 + uint16_t autoscale TPS2Value;@@GAUGE_NAME_TPS2@@;"%",{1/@@PACK_MULT_PERCENT@@}, 0, 0, 0, 0 uint16_t autoscale rawTps1Primary;;"V",{1/@@PACK_MULT_VOLTAGE@@}, 0, 0, 0, 0 uint16_t autoscale rawPpsPrimary;;"V",{1/@@PACK_MULT_VOLTAGE@@}, 0, 0, 0, 0 @@ -212,12 +212,12 @@ uint16_t rpmAcceleration;dRPM;"RPM/s",1, 0, 0, 0, 0 uint16_t autoscale highFuelPressure;;"bar",{1/@@PACK_MULT_HIGH_PRESSURE@@}, 0, 0, 0, 0 uint16_t autoscale targetLambda;;"",{1/@@PACK_MULT_LAMBDA@@}, 0, 0, 0, 0 - uint16_t autoscale AFRValue;;"AFR",{1/@@PACK_MULT_AFR@@}, 0, 0, 0, 0 + uint16_t autoscale AFRValue;@@GAUGE_NAME_AFR@@;"AFR",{1/@@PACK_MULT_AFR@@}, 0, 0, 0, 0 - uint16_t autoscale VssAcceleration;;"m/s2",{1/@@PACK_MULT_MS@@}, 0, 0, 0, 0 - uint16_t autoscale lambdaValue2;;"",{1/@@PACK_MULT_LAMBDA@@}, 0, 0, 0, 0 + uint16_t autoscale VssAcceleration;"Vss Accel";"m/s2",{1/@@PACK_MULT_MS@@}, 0, 0, 0, 0 + uint16_t autoscale lambdaValue2;@@GAUGE_NAME_LAMBDA2@@;"",{1/@@PACK_MULT_LAMBDA@@}, 0, 0, 0, 0 - uint16_t autoscale AFRValue2;;"AFR",{1/@@PACK_MULT_AFR@@}, 0, 0, 0, 0 + uint16_t autoscale AFRValue2;@@GAUGE_NAME_AFR2@@;"AFR",{1/@@PACK_MULT_AFR@@}, 0, 0, 0, 0 uint16_t autoscale vvtPositionB1E;;"deg",{1/@@PACK_MULT_ANGLE@@}, 0, 0, 0, 0 uint16_t autoscale vvtPositionB2I;;"deg",{1/@@PACK_MULT_ANGLE@@}, 0, 0, 0, 0 uint16_t autoscale vvtPositionB2E;;"deg",{1/@@PACK_MULT_ANGLE@@}, 0, 0, 0, 0 diff --git a/firmware/console/binary/ts_outputs_generated.h b/firmware/console/binary/ts_outputs_generated.h index 8e820f7010..239ef880ba 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 Sun Nov 28 14:09:25 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:39:28 EST 2021 // by class com.rusefi.output.CHeaderConsumer // begin #pragma once @@ -226,45 +226,53 @@ struct ts_outputs_s { */ scaled_channel vvtPositionB1I = (uint16_t)0; /** + * @@GAUGE_NAME_AIR_MASS@@ g * offset 44 */ scaled_channel chargeAirMass = (uint16_t)0; /** + * crankingFuelMs * airmass in mg, 0-65 grams ms * offset 46 */ scaled_channel crankingFuelMs = (uint16_t)0; /** + * @@GAUGE_NAME_TARGET_AFR@@ ratio * offset 48 */ scaled_channel currentTargetAfr = (uint16_t)0; /** + * @@GAUGE_NAME_FUEL_BASE@@ * This is the raw value we take from the fuel map or base fuel algorithm, before the corrections mg * offset 50 */ scaled_channel baseFuel = (uint16_t)0; /** + * @@GAUGE_NAME_FUEL_RUNNING@@ * Total fuel with CLT IAT and TPS acceleration without injector lag corrections per cycle, as pulse per cycle mg * offset 52 */ scaled_channel fuelRunning = (uint16_t)0; /** + * @@GAUGE_NAME_FUEL_LAST_INJECTION@@ * Actual last injection time - including all compensation and injection mode ms * offset 54 */ scaled_channel actualLastInjection = (uint16_t)0; /** + * @@GAUGE_NAME_FUEL_INJ_DUTY@@ % * offset 56 */ scaled_channel injectorDutyCycle = (uint8_t)0; /** + * @@GAUGE_NAME_FUEL_VE@@ ratio * offset 57 */ @@ -280,26 +288,31 @@ struct ts_outputs_s { */ scaled_channel tCharge = (uint16_t)0; /** + * @@GAUGE_NAME_INJECTOR_LAG@@ ms * offset 62 */ scaled_channel injectorLagMs = (uint16_t)0; /** + * @@GAUGE_NAME_FUEL_IAT_CORR@@ % * offset 64 */ scaled_channel iatCorrection = (uint16_t)0; /** + * @@GAUGE_NAME_FUEL_CLT_CORR@@ % * offset 66 */ scaled_channel cltCorrection = (uint16_t)0; /** + * @@GAUGE_NAME_FUEL_BARO_CORR@@ % * offset 68 */ scaled_channel baroCorrection = (uint16_t)0; /** + * "Engine Phase" deg * offset 70 */ @@ -546,6 +559,7 @@ struct ts_outputs_s { */ uint16_t egt[EGT_CHANNEL_COUNT]; /** + * @@GAUGE_NAME_TPS2@@ % * offset 232 */ @@ -653,20 +667,24 @@ struct ts_outputs_s { */ scaled_channel targetLambda = (uint16_t)0; /** + * @@GAUGE_NAME_AFR@@ AFR * offset 282 */ scaled_channel AFRValue = (uint16_t)0; /** + * "Vss Accel" m/s2 * offset 284 */ scaled_channel VssAcceleration = (uint16_t)0; /** + * @@GAUGE_NAME_LAMBDA2@@ * offset 286 */ scaled_channel lambdaValue2 = (uint16_t)0; /** + * @@GAUGE_NAME_AFR2@@ AFR * offset 288 */ @@ -741,4 +759,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 Sun Nov 28 14:09:25 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:39:28 EST 2021 diff --git a/firmware/tunerstudio/rusefi.input b/firmware/tunerstudio/rusefi.input index 0b39ed256d..4ef681feee 100644 --- a/firmware/tunerstudio/rusefi.input +++ b/firmware/tunerstudio/rusefi.input @@ -1299,6 +1299,20 @@ 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 = chargeAirMass, "air mass", float, "%.3f" +entry = crankingFuelMs, "crankingFuelMs", float, "%.3f" +entry = currentTargetAfr, "fuel: target AFR", float, "%.3f" +entry = baseFuel, "fuel: base mass", float, "%.3f" +entry = fuelRunning, "fuel: running", float, "%.3f" +entry = actualLastInjection, "fuel: Last injection", float, "%.3f" +entry = injectorDutyCycle, "fuel: injector duty cycle", float, "%.3f" +entry = veValue, "fuel: VE", float, "%.3f" +entry = injectionOffset, "injectionOffset", float, "%.3f" +entry = tCharge, "tCharge", float, "%.3f" +entry = iatCorrection, "fuel: IAT correction", float, "%.3f" +entry = cltCorrection, "fuel: CLT correction", float, "%.3f" +entry = baroCorrection, "fuel: Barometric pressure correction", float, "%.3f" +entry = currentEnginePhase, "Engine Phase", int, "%d" entry = TPS2Value, @@GAUGE_NAME_TPS2@@, float, "%.2f" entry = AFRValue, @@GAUGE_NAME_AFR@@, float, "%.2f" entry = AFRValue2, @@GAUGE_NAME_AFR2@@, float, "%.2f" @@ -1311,7 +1325,6 @@ entry = vvtPositionB1I, "VVT: bank 1 intake", float, "%.3f" entry = turboSpeed, @@GAUGE_NAME_TURBO_SPEED@@ int, "%d" entry = speedToRpmRatio, "s2rpm", float, "%.3f" entry = massAirFlowValue,@@GAUGE_NAME_AIR_FLOW@@, float, "%.3f" - entry = chargeAirMass, @@GAUGE_NAME_AIR_MASS@@, 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" @@ -1320,16 +1333,10 @@ entry = vvtPositionB1I, "VVT: bank 1 intake", float, "%.3f" entry = highFuelPressure, @@GAUGE_NAME_FUEL_PRESSURE_HIGH@@, float, "%.3f" ; entry = rawHighFuelPressure, @@GAUGE_NAME_RAW_FUEL_PRESSURE_HIGH@@, float, "%.3f" - entry = injectorLagMs, @@GAUGE_NAME_INJECTOR_LAG@@, float, "%.3f" - entry = fuelRunning, @@GAUGE_NAME_FUEL_RUNNING@@, float, "%.3f" - entry = actualLastInjection, @@GAUGE_NAME_FUEL_LAST_INJECTION@@, float, "%.3f" - entry = baseFuel, @@GAUGE_NAME_FUEL_BASE@@, float, "%.2f" + entry = injectorLagMs, , float, "%.3f" entry = fuelPidCorrection1,@@GAUGE_NAME_FUEL_TRIM@@, float, "%.2f" entry = fuelPidCorrection2,@@GAUGE_NAME_FUEL_TRIM_2@@, float, "%.2f" - entry = veValue, @@GAUGE_NAME_FUEL_VE@@, float, "%.3f" - entry = injectorDutyCycle,@@GAUGE_NAME_FUEL_INJ_DUTY@@,float,"%.3f" entry = coilDutyCycle, @@GAUGE_NAME_DWELL_DUTY@@, float,"%.3f" - entry = currentTargetAfr,@@GAUGE_NAME_TARGET_AFR@@, float,"%.3f" entry = targetLambda, @@GAUGE_NAME_TARGET_LAMBDA@@, float,"%.4f" entry = totalFuelConsumption, @@GAUGE_NAME_FUEL_CONSUMPTION@@, int, "%d" entry = fuelFlowRate, @@GAUGE_NAME_FUEL_FLOW@@, float, "%.2f" @@ -1354,10 +1361,6 @@ entry = vvtPositionB1I, "VVT: bank 1 intake", float, "%.3f" entry = wallFuelCorrection,@@GAUGE_NAME_FUEL_WALL_CORRECTION@@, float, "%.3f" entry = wallFuelAmount, @@GAUGE_NAME_FUEL_WALL_AMOUNT@@, float, "%.3f" - entry = baroCorrection, @@GAUGE_NAME_FUEL_BARO_CORR@@,float,"%.3f" - entry = iatCorrection, @@GAUGE_NAME_FUEL_IAT_CORR@@, float, "%.3f" - entry = cltCorrection, @@GAUGE_NAME_FUEL_CLT_CORR@@, float,"%.3f" - entry = sparkDwellValue, @@GAUGE_COIL_DWELL_TIME@@, float,"%.3f" entry = vvtPositionB1E, @@GAUGE_NAME_VVT_B1E@@, float, "%.1f" @@ -1367,7 +1370,6 @@ entry = vvtPositionB1I, "VVT: bank 1 intake", float, "%.3f" entry = vvtTargets2, @@GAUGE_NAME_VVT_TARGET_B1E@@, int, "%d" entry = vvtTargets3, @@GAUGE_NAME_VVT_TARGET_B2I@@, int, "%d" entry = vvtTargets4, @@GAUGE_NAME_VVT_TARGET_B2E@@, int, "%d" - entry = injectionOffset, "injOffset" , float, "%.2F" ; is there a way to log parameter? entry = debugMode, "debugMode",int,"%d" entry = debugFloatField1, {bitStringValue( debugFieldF1List, debugMode )},float,"%.4f", { !enableLogDebugChannels } @@ -1399,8 +1401,6 @@ entry = vvtPositionB1I, "VVT: bank 1 intake", float, "%.3f" entry = recentErrorCode7, "error 7",int,"%d", { !enableLogErrorList } entry = recentErrorCode8, "error 8",int,"%d", { !enableLogErrorList } - entry = tCharge, "tCharge",float,"%.3f" - entry = clutchUpState, @@INDICATOR_NAME_CLUTCH_UP@@,int,"%d" entry = clutchDownState, @@INDICATOR_NAME_CLUTCH_DOWN@@,int,"%d" entry = brakePedalState, @@INDICATOR_NAME_BRAKE_DOWN@@,int,"%d" @@ -1428,7 +1428,6 @@ entry = vvtPositionB1I, "VVT: bank 1 intake", float, "%.3f" entry = VssAcceleration, "Vss Accel", float, "%.3f" entry = flexPercent, @@GAUGE_NAME_FLEX@@, int, "%d" - entry = currentEnginePhase, "Engine Phase", int, "%d" [Menu] diff --git a/java_tools/ConfigDefinition.jar b/java_tools/ConfigDefinition.jar index 5c20883a5e1d5ba77fd514effec28d4eaf652d99..2eb3cac24900354d289e37895cfcf4399b2fc722 100644 GIT binary patch delta 40927 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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 cfee656007..418952f3eb 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 @@ -77,6 +77,9 @@ public class DataLogConsumer implements ConfigurationConsumer { } String comment = state.variableRegistry.applyVariables(configField.getComment()); + String[] comments = comment.split("\\\\n"); + comment = comments[0]; + if (comment.isEmpty()) comment = configField.getName(); 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 17cee94411..4e40f80604 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 @@ -67,6 +67,7 @@ public class OutputsTest { @Test public void generateDataLog() throws IOException { String test = "struct total\n" + + "\tuint16_t autoscale baseFuel;@@GAUGE_NAME_FUEL_BASE@@\\nThis is the raw value we take from the fuel map or base fuel algorithm, before the corrections;\"mg\",{1/@@PACK_MULT_PERCENT@@}, 0, 0, 0, 0\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;;\"ms\", 1, 0, 0, 3000, 0\n" + @@ -77,11 +78,13 @@ public class OutputsTest { "end_struct\n"; ReaderState state = new ReaderState(); state.variableRegistry.register("PACK_MULT_PERCENT", 100); + state.variableRegistry.register("GAUGE_NAME_FUEL_BASE", "hello"); BufferedReader reader = new BufferedReader(new StringReader(test)); DataLogConsumer dataLogConsumer = new DataLogConsumer(null, state); state.readBufferedReader(reader, Collections.singletonList(dataLogConsumer)); - assertEquals("entry = afr_type, \"PID dTime\", float, \"%.3f\"\n" + + assertEquals("entry = baseFuel, \"hello\", float, \"%.3f\"\n" + + "entry = afr_type, \"PID dTime\", float, \"%.3f\"\n" + "entry = speedToRpmRatio, \"s2rpm\", float, \"%.3f\"\n" + "entry = afr_typet, \"afr_typet\", int, \"%d\"\n" + "entry = vehicleSpeedKph, \"vehicleSpeedKph\", int, \"%d\"\n", new String(dataLogConsumer.getTsWriter().toCharArray()));