From 36047e7f3da06225a7e74377cf6d9693d2f751b4 Mon Sep 17 00:00:00 2001 From: rusefi Date: Sun, 9 Dec 2018 10:19:47 -0500 Subject: [PATCH] ETB bias curve by TPS --- ...ngine_configuration_generated_structures.h | 16 +++++++++++++--- firmware/controllers/algo/rusefi_generated.h | 9 +++++++-- firmware/integration/rusefi_config.txt | 8 +++++++- firmware/tunerstudio/rusefi.ini | 6 ++++-- .../models/src/com/rusefi/config/Fields.java | 9 ++++++--- java_tools/ConfigDefinition.jar | Bin 33015 -> 33635 bytes .../src/com/rusefi/TypesHelper.java | 15 +++++++++++---- 7 files changed, 48 insertions(+), 15 deletions(-) diff --git a/firmware/controllers/algo/engine_configuration_generated_structures.h b/firmware/controllers/algo/engine_configuration_generated_structures.h index 8c977556f8..a2e41a5d7f 100644 --- a/firmware/controllers/algo/engine_configuration_generated_structures.h +++ b/firmware/controllers/algo/engine_configuration_generated_structures.h @@ -1,4 +1,4 @@ -// this section was generated automatically by ConfigDefinition.jar based on rusefi_config.txt Thu Nov 29 23:21:24 EST 2018 +// this section was generated automatically by ConfigDefinition.jar based on rusefi_config.txt Sun Dec 09 10:18:27 EST 2018 // begin #ifndef ENGINE_CONFIGURATION_GENERATED_H_ #define ENGINE_CONFIGURATION_GENERATED_H_ @@ -2181,9 +2181,19 @@ typedef struct { */ tChargeMode_e tChargeMode; /** + * target TPS value, 0 to 100% * offset 4116 */ - int unusedEnd[591]; + uint8_t etbBiasBins[ETB_BIAS_CURVE_LENGTH]; + /** + * PWM bias, 0 to 100% + * offset 4124 + */ + float etbBiasValues[ETB_BIAS_CURVE_LENGTH]; + /** + * offset 4156 + */ + int unusedEnd[581]; /** total size 6480*/ } engine_configuration_s; @@ -2429,4 +2439,4 @@ typedef struct { #endif // end -// this section was generated automatically by ConfigDefinition.jar based on rusefi_config.txt Thu Nov 29 23:21:24 EST 2018 +// this section was generated automatically by ConfigDefinition.jar based on rusefi_config.txt Sun Dec 09 10:18:27 EST 2018 diff --git a/firmware/controllers/algo/rusefi_generated.h b/firmware/controllers/algo/rusefi_generated.h index f6c149f938..a93f6e3198 100644 --- a/firmware/controllers/algo/rusefi_generated.h +++ b/firmware/controllers/algo/rusefi_generated.h @@ -17,6 +17,7 @@ #define BLOCKING_FACTOR 400 #define FSIO_ANALOG_INPUT_COUNT 4 #define SERVO_COUNT 8 +#define ETB_BIAS_CURVE_LENGTH 8 #define TS_OUTPUT_SIZE 356 #define TS_FILE_VERSION 20171101 #define WARMUP_TARGET_AFR_SIZE 4 @@ -1586,8 +1587,12 @@ #define tChargeAirDecrLimit_offset_hex 100c #define tChargeMode_offset 4112 #define tChargeMode_offset_hex 1010 -#define unusedEnd_offset 4116 -#define unusedEnd_offset_hex 1014 +#define etbBiasBins_offset 4116 +#define etbBiasBins_offset_hex 1014 +#define etbBiasValues_offset 4124 +#define etbBiasValues_offset_hex 101c +#define unusedEnd_offset 4156 +#define unusedEnd_offset_hex 103c #define cltCrankingCorrBins_offset 6480 #define cltCrankingCorrBins_offset_hex 1950 #define cltCrankingCorr_offset 6512 diff --git a/firmware/integration/rusefi_config.txt b/firmware/integration/rusefi_config.txt index 691dff3223..6a8375e129 100644 --- a/firmware/integration/rusefi_config.txt +++ b/firmware/integration/rusefi_config.txt @@ -53,6 +53,8 @@ struct_no_prefix engine_configuration_s #define SERVO_COUNT 8 +#define ETB_BIAS_CURVE_LENGTH 8 + ! this is here so that rusEfi console can access it, too #define TS_OUTPUT_SIZE 356 @@ -924,7 +926,11 @@ float tChargeAirDecrLimit;;"tChange Decrement Limit, deg/sec", 1, 0, custom tChargeMode_e 4 bits, U32, @OFFSET@, [0:0], @@tChargeMode_e_enum@@ tChargeMode_e tChargeMode; - int[591] unusedEnd; + + uint8_t[ETB_BIAS_CURVE_LENGTH] etbBiasBins;target TPS value, 0 to 100%;"target TPS position", 1, 0.0, 0, 100.0, 0 + float[ETB_BIAS_CURVE_LENGTH] etbBiasValues;PWM bias, 0 to 100%;"ETB duty cycle bias", 1, 0.0, 0, 100.0, 2 + + int[581] unusedEnd; end_struct diff --git a/firmware/tunerstudio/rusefi.ini b/firmware/tunerstudio/rusefi.ini index 1c97db3904..9ccd36d183 100644 --- a/firmware/tunerstudio/rusefi.ini +++ b/firmware/tunerstudio/rusefi.ini @@ -63,7 +63,7 @@ enable2ndByteCanID = false ; see PAGE_0_SIZE in C source code ; CONFIG_DEFINITION_START -; this section was generated automatically by ConfigDefinition.jar based on rusefi_config.txt Thu Nov 29 23:22:22 EST 2018 +; this section was generated automatically by ConfigDefinition.jar based on rusefi_config.txt Sun Dec 09 10:18:27 EST 2018 pageSize = 20000 page = 1 @@ -795,7 +795,9 @@ page = 1 tChargeAirIncrLimit = scalar, F32, 4104, "tChange Increment Limit, deg/sec", 1, 0, 0.0, 100.0, 1 tChargeAirDecrLimit = scalar, F32, 4108, "tChange Decrement Limit, deg/sec", 1, 0, 0.0, 100.0, 1 tChargeMode = bits, U32, 4112, [0:0], "RPM+TPS (Default)", "Air Mass Interpolation" -;no TS info - skipping unusedEnd offset 4116 + etbBiasBins = array, U8, 4116, [8], "target TPS position", 1, 0.0, 0, 100.0, 0 + etbBiasValues = array, F32, 4124, [8], "ETB duty cycle bias", 1, 0.0, 0, 100.0, 2 +;no TS info - skipping unusedEnd offset 4156 cltCrankingCorrBins = array, F32, 6480, [8], "C", 1, 0, -100.0, 250.0, 2 cltCrankingCorr = array, F32, 6512, [8], "%", 1, 0, 0.0, 500.0, 2 idleAdvanceBins = array, F32, 6544, [8], "RPM", 1, 0, 0.0, 18000, 2 diff --git a/java_console/models/src/com/rusefi/config/Fields.java b/java_console/models/src/com/rusefi/config/Fields.java index 4e2a7efb99..596f1966c9 100644 --- a/java_console/models/src/com/rusefi/config/Fields.java +++ b/java_console/models/src/com/rusefi/config/Fields.java @@ -1,11 +1,12 @@ package com.rusefi.config; -// this file was generated automatically by ConfigDefinition.jar based on rusefi_config.txt Thu Nov 29 23:22:22 EST 2018 +// this file was generated automatically by ConfigDefinition.jar based on rusefi_config.txt Sun Dec 09 10:18:27 EST 2018 public class Fields { public static final int LE_COMMAND_LENGTH = 200; public static final int BLOCKING_FACTOR = 400; public static final int FSIO_ANALOG_INPUT_COUNT = 4; public static final int SERVO_COUNT = 8; + public static final int ETB_BIAS_CURVE_LENGTH = 8; public static final int TS_OUTPUT_SIZE = 356; public static final int TS_FILE_VERSION = 20171101; public static final int WARMUP_TARGET_AFR_SIZE = 4; @@ -1049,8 +1050,10 @@ public class Fields { public static final int tChargeAirDecrLimit_offset = 4108; public static final int tChargeMode_offset = 4112; public static final int tChargeMode_offset_hex = 1010; - public static final int unusedEnd_offset = 4116; - public static final int unusedEnd_offset_hex = 1014; + public static final int etbBiasBins_offset = 4116; + public static final int etbBiasBins_offset_hex = 1014; + public static final int etbBiasValues_offset = 4124; + public static final int unusedEnd_offset = 4156; public static final int cltCrankingCorrBins_offset = 6480; public static final int cltCrankingCorrBins_offset_hex = 1950; public static final int cltCrankingCorr_offset = 6512; diff --git a/java_tools/ConfigDefinition.jar b/java_tools/ConfigDefinition.jar index 7bfb01b0a237a5391d9593f36e68c432d5815513..78664eea51940bbcbf01d1dea368cea96b4d2fd5 100644 GIT binary patch delta 15356 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