diff --git a/firmware/controllers/algo/engine_configuration_generated_structures.h b/firmware/controllers/algo/engine_configuration_generated_structures.h index 6baef44590..2af89d28a8 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 Wed Dec 06 18:45:34 EST 2017 +// this section was generated automatically by ConfigDefinition.jar based on rusefi_config.txt Mon Dec 11 11:22:10 EST 2017 // begin #ifndef ENGINE_CONFIGURATION_GENERATED_H_ #define ENGINE_CONFIGURATION_GENERATED_H_ @@ -1314,7 +1314,7 @@ typedef struct { bool overrideCrankingIacSetting : 1; /** offset 1484 bit 7 */ - bool anotherUnusedBit2 : 1; + bool useSeparateAdvanceForIdle : 1; /** offset 1484 bit 8 */ bool isTunerStudioEnabled : 1; @@ -1323,7 +1323,7 @@ typedef struct { bool isWaveAnalyzerEnabled : 1; /** offset 1484 bit 10 */ - bool anotherUnusedBit212 : 1; + bool useSeparateVeForIdle : 1; /** * enable trigger_details offset 1484 bit 11 */ @@ -1987,8 +1987,8 @@ typedef struct { /** * offset 3304 */ - int unusedEnd[842]; - /** total size 6672*/ + int unusedEnd[794]; + /** total size 6480*/ } engine_configuration_s; typedef struct { @@ -1996,6 +1996,36 @@ typedef struct { * offset 0 */ engine_configuration_s engineConfiguration; + /** + * CLT-based cranking position multiplier for simple manual idle controller + * offset 6480 + */ + float cltCrankingCorrBins[CLT_CRANKING_CURVE_SIZE]; + /** + * CLT-based cranking position multiplier for simple manual idle controller + * offset 6512 + */ + float cltCrankingCorr[CLT_CRANKING_CURVE_SIZE]; + /** + * Optional timing advance table for Idle (see useSeparateAdvanceForIdle) + * offset 6544 + */ + float idleAdvanceBins[IDLE_ADVANCE_CURVE_SIZE]; + /** + * Optional timing advance table for Idle (see useSeparateAdvanceForIdle) + * offset 6576 + */ + float idleAdvance[IDLE_ADVANCE_CURVE_SIZE]; + /** + * Optional VE table for Idle (see useSeparateVEForIdle) + * offset 6608 + */ + float idleVeBins[IDLE_VE_CURVE_SIZE]; + /** + * Optional VE table for Idle (see useSeparateVEForIdle) + * offset 6640 + */ + float idleVe[IDLE_VE_CURVE_SIZE]; /** * offset 6672 */ @@ -2203,4 +2233,4 @@ typedef struct { #endif // end -// this section was generated automatically by ConfigDefinition.jar based on rusefi_config.txt Wed Dec 06 18:45:34 EST 2017 +// this section was generated automatically by ConfigDefinition.jar based on rusefi_config.txt Mon Dec 11 11:22:10 EST 2017 diff --git a/firmware/controllers/algo/rusefi_generated.h b/firmware/controllers/algo/rusefi_generated.h index 029c9d7620..e686941871 100644 --- a/firmware/controllers/algo/rusefi_generated.h +++ b/firmware/controllers/algo/rusefi_generated.h @@ -24,8 +24,11 @@ #define NARROW_BAND_WIDE_BAND_CONVERSION_SIZE 8 #define CLT_CURVE_SIZE 16 #define CRANKING_CLT_IDLE_CURVE_SIZE 8 +#define CLT_CRANKING_CURVE_SIZE 8 +#define IDLE_ADVANCE_CURVE_SIZE 8 #define ENGINE_NOISE_CURVE_SIZE 8 #define CLT_TIMING_CURVE_SIZE 8 +#define IDLE_VE_CURVE_SIZE 8 #define AUX_DIGITAL_VALVE_COUNT 2 #define IAT_CURVE_SIZE 16 #define VBAT_INJECTOR_CURVE_SIZE 8 @@ -895,14 +898,14 @@ #define isMapAveragingEnabled_offset_hex 5cc #define overrideCrankingIacSetting_offset 1484 #define overrideCrankingIacSetting_offset_hex 5cc -#define anotherUnusedBit2_offset 1484 -#define anotherUnusedBit2_offset_hex 5cc +#define useSeparateAdvanceForIdle_offset 1484 +#define useSeparateAdvanceForIdle_offset_hex 5cc #define isTunerStudioEnabled_offset 1484 #define isTunerStudioEnabled_offset_hex 5cc #define isWaveAnalyzerEnabled_offset 1484 #define isWaveAnalyzerEnabled_offset_hex 5cc -#define anotherUnusedBit212_offset 1484 -#define anotherUnusedBit212_offset_hex 5cc +#define useSeparateVeForIdle_offset 1484 +#define useSeparateVeForIdle_offset_hex 5cc #define isPrintTriggerSynchDetails_offset 1484 #define isPrintTriggerSynchDetails_offset_hex 5cc #define isManualSpinningMode_offset 1484 @@ -1471,6 +1474,18 @@ #define fsioCurve4_offset_hex cc8 #define unusedEnd_offset 3304 #define unusedEnd_offset_hex ce8 +#define cltCrankingCorrBins_offset 6480 +#define cltCrankingCorrBins_offset_hex 1950 +#define cltCrankingCorr_offset 6512 +#define cltCrankingCorr_offset_hex 1970 +#define idleAdvanceBins_offset 6544 +#define idleAdvanceBins_offset_hex 1990 +#define idleAdvance_offset 6576 +#define idleAdvance_offset_hex 19b0 +#define idleVeBins_offset 6608 +#define idleVeBins_offset_hex 19d0 +#define idleVe_offset 6640 +#define idleVe_offset_hex 19f0 #define fsioFormulas1_offset 6672 #define fsioFormulas1_offset_hex 1a10 #define fsioFormulas2_offset 6872 diff --git a/firmware/controllers/math/pid.cpp b/firmware/controllers/math/pid.cpp index ea48165da2..c5ddae1867 100644 --- a/firmware/controllers/math/pid.cpp +++ b/firmware/controllers/math/pid.cpp @@ -56,7 +56,7 @@ float Pid::getValue(float target, float input, float dTime) { if (iTerm > pid->maxValue) iTerm = pid->maxValue; - // this is kind of a hack. a proper fix would be having separate additional settings 'maxIValue' and 'minIValye' + // this is kind of a hack. a proper fix would be having separate additional settings 'maxIValue' and 'minIValue' if (iTerm < -pid->maxValue) iTerm = -pid->maxValue; diff --git a/firmware/integration/rusefi_config.txt b/firmware/integration/rusefi_config.txt index 7c15b543a2..7dfb084ceb 100644 --- a/firmware/integration/rusefi_config.txt +++ b/firmware/integration/rusefi_config.txt @@ -68,9 +68,12 @@ struct_no_prefix engine_configuration_s #define CLT_CURVE_SIZE 16 #define CRANKING_CLT_IDLE_CURVE_SIZE 8 +#define CLT_CRANKING_CURVE_SIZE 8 +#define IDLE_ADVANCE_CURVE_SIZE 8 #define ENGINE_NOISE_CURVE_SIZE 8 #define CLT_TIMING_CURVE_SIZE 8 +#define IDLE_VE_CURVE_SIZE 8 #define AUX_DIGITAL_VALVE_COUNT 2 @@ -650,10 +653,10 @@ custom idle_mode_e 4 bits, U32, @OFFSET@, [0:0], "false", "true" bit needSecondTriggerInputDeprecated bit isMapAveragingEnabled bit overrideCrankingIacSetting - bit anotherUnusedBit2 + bit useSeparateAdvanceForIdle bit isTunerStudioEnabled bit isWaveAnalyzerEnabled - bit anotherUnusedBit212 + bit useSeparateVeForIdle bit isPrintTriggerSynchDetails;+enable trigger_details bit isManualSpinningMode;Usually if we have no trigger events that means engine is stopped\nUnless we are troubleshooting and spinning the engine by hand - this case a longer\ndelay is needed bit twoWireBatchInjection;+This is needed if batched injection and individual injector wiring\nenable two_wire_batch_injection @@ -857,13 +860,21 @@ spi_device_e accelerometerSpiDevice; float[FSIO_CURVE_8] fsioCurve3;;"y", 1, 0, -999, 1000.0, 3 float[FSIO_CURVE_8] fsioCurve4Bins;;"x", 1, 0, -999, 1000.0, 3 float[FSIO_CURVE_8] fsioCurve4;;"y", 1, 0, -999, 1000.0, 3 - int[842] unusedEnd; + int[794] unusedEnd; end_struct engine_configuration_s engineConfiguration; +float[CLT_CRANKING_CURVE_SIZE] cltCrankingCorrBins;CLT-based cranking position multiplier for simple manual idle controller;"C", 1, 0, -100.0, 250.0, 2 +float[CLT_CRANKING_CURVE_SIZE] cltCrankingCorr ;CLT-based cranking position multiplier for simple manual idle controller;"%", 1, 0, 0.0, 500.0, 2 + +float[IDLE_ADVANCE_CURVE_SIZE] idleAdvanceBins;Optional timing advance table for Idle (see useSeparateAdvanceForIdle);"RPM", 1, 0, 0.0, 18000, 2 +float[IDLE_ADVANCE_CURVE_SIZE] idleAdvance ;Optional timing advance table for Idle (see useSeparateAdvanceForIdle);"deg", 1, 0, -20, 90, 2 +float[IDLE_VE_CURVE_SIZE] idleVeBins;Optional VE table for Idle (see useSeparateVEForIdle);"RPM", 1, 0, 0.0, 18000, 2 +float[IDLE_VE_CURVE_SIZE] idleVe; Optional VE table for Idle (see useSeparateVEForIdle);,"%", 1, 0, 0, 999.0, 2 + le_formula_t[FSIO_COMMAND_COUNT iterate] fsioFormulas; le_formula_t timingMultiplier; le_formula_t timingAdditive; diff --git a/firmware/tunerstudio/rusefi.ini b/firmware/tunerstudio/rusefi.ini index dad3854520..554414fc8b 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 Wed Dec 06 18:45:34 EST 2017 +; this section was generated automatically by ConfigDefinition.jar based on rusefi_config.txt Mon Dec 11 11:22:10 EST 2017 pageSize = 20000 page = 1 @@ -468,10 +468,10 @@ page = 1 needSecondTriggerInputDeprecated= bits, U32, 1484, [4:4], "false", "true" isMapAveragingEnabled = bits, U32, 1484, [5:5], "false", "true" overrideCrankingIacSetting= bits, U32, 1484, [6:6], "false", "true" - anotherUnusedBit2 = bits, U32, 1484, [7:7], "false", "true" + useSeparateAdvanceForIdle= bits, U32, 1484, [7:7], "false", "true" isTunerStudioEnabled = bits, U32, 1484, [8:8], "false", "true" isWaveAnalyzerEnabled = bits, U32, 1484, [9:9], "false", "true" - anotherUnusedBit212 = bits, U32, 1484, [10:10], "false", "true" + useSeparateVeForIdle = bits, U32, 1484, [10:10], "false", "true" isPrintTriggerSynchDetails= bits, U32, 1484, [11:11], "false", "true" isManualSpinningMode = bits, U32, 1484, [12:12], "false", "true" twoWireBatchInjection = bits, U32, 1484, [13:13], "false", "true" @@ -741,6 +741,12 @@ page = 1 fsioCurve4Bins = array, F32, 3240, [8], "x", 1, 0, -999, 1000.0, 3 fsioCurve4 = array, F32, 3272, [8], "y", 1, 0, -999, 1000.0, 3 ;skipping unusedEnd offset 3304 + 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 + idleAdvance = array, F32, 6576, [8], "deg", 1, 0, -20, 90, 2 + idleVeBins = array, F32, 6608, [8], "RPM", 1, 0, 0.0, 18000, 2 + idleVe = array, F32, 6640, [8], ,"%", 1, 0, 0, 999.0, 2 fsioFormulas1 = string, ASCII, 6672, 200 fsioFormulas2 = string, ASCII, 6872, 200 fsioFormulas3 = string, ASCII, 7072, 200 diff --git a/java_console/models/src/com/rusefi/config/Fields.java b/java_console/models/src/com/rusefi/config/Fields.java index 0376715ca7..c979acec35 100644 --- a/java_console/models/src/com/rusefi/config/Fields.java +++ b/java_console/models/src/com/rusefi/config/Fields.java @@ -1,6 +1,6 @@ package com.rusefi.config; -// this file was generated automatically by ConfigDefinition.jar based on rusefi_config.txt Sun Dec 03 07:45:31 EST 2017 +// this file was generated automatically by ConfigDefinition.jar based on rusefi_config.txt Mon Dec 11 11:22:10 EST 2017 public class Fields { public static final int LE_COMMAND_LENGTH = 200; public static final int BLOCKING_FACTOR = 400; @@ -12,8 +12,12 @@ public class Fields { public static final int MAP_WINDOW_SIZE = 8; public static final int NARROW_BAND_WIDE_BAND_CONVERSION_SIZE = 8; public static final int CLT_CURVE_SIZE = 16; + public static final int CRANKING_CLT_IDLE_CURVE_SIZE = 8; + public static final int CLT_CRANKING_CURVE_SIZE = 8; + public static final int IDLE_ADVANCE_CURVE_SIZE = 8; public static final int ENGINE_NOISE_CURVE_SIZE = 8; public static final int CLT_TIMING_CURVE_SIZE = 8; + public static final int IDLE_VE_CURVE_SIZE = 8; public static final int AUX_DIGITAL_VALVE_COUNT = 2; public static final int IAT_CURVE_SIZE = 16; public static final int VBAT_INJECTOR_CURVE_SIZE = 8; @@ -613,11 +617,11 @@ public class Fields { public static final int secondTriggerChannelEnabled_offset = 1484; public static final int needSecondTriggerInputDeprecated_offset = 1484; public static final int isMapAveragingEnabled_offset = 1484; - public static final int anotherUnusedBit1_offset = 1484; - public static final int anotherUnusedBit2_offset = 1484; + public static final int overrideCrankingIacSetting_offset = 1484; + public static final int useSeparateAdvanceForIdle_offset = 1484; public static final int isTunerStudioEnabled_offset = 1484; public static final int isWaveAnalyzerEnabled_offset = 1484; - public static final int anotherUnusedBit212_offset = 1484; + public static final int useSeparateVeForIdle_offset = 1484; public static final int isPrintTriggerSynchDetails_offset = 1484; public static final int isManualSpinningMode_offset = 1484; public static final int twoWireBatchInjection_offset = 1484; @@ -984,6 +988,15 @@ public class Fields { public static final int fsioCurve4Bins_offset = 3240; public static final int fsioCurve4_offset = 3272; public static final int unusedEnd_offset = 3304; + public static final int cltCrankingCorrBins_offset = 6480; + public static final int cltCrankingCorrBins_offset_hex = 1950; + public static final int cltCrankingCorr_offset = 6512; + public static final int cltCrankingCorr_offset_hex = 1970; + public static final int idleAdvanceBins_offset = 6544; + public static final int idleAdvanceBins_offset_hex = 1990; + public static final int idleAdvance_offset = 6576; + public static final int idleVeBins_offset = 6608; + public static final int idleVe_offset = 6640; public static final int fsioFormulas1_offset = 6672; public static final int fsioFormulas2_offset = 6872; public static final int fsioFormulas3_offset = 7072; @@ -1509,11 +1522,11 @@ public class Fields { public static final Field SECONDTRIGGERCHANNELENABLED = Field.create("SECONDTRIGGERCHANNELENABLED", 1484, FieldType.BIT, 3); public static final Field NEEDSECONDTRIGGERINPUTDEPRECATED = Field.create("NEEDSECONDTRIGGERINPUTDEPRECATED", 1484, FieldType.BIT, 4); public static final Field ISMAPAVERAGINGENABLED = Field.create("ISMAPAVERAGINGENABLED", 1484, FieldType.BIT, 5); - public static final Field ANOTHERUNUSEDBIT1 = Field.create("ANOTHERUNUSEDBIT1", 1484, FieldType.BIT, 6); - public static final Field ANOTHERUNUSEDBIT2 = Field.create("ANOTHERUNUSEDBIT2", 1484, FieldType.BIT, 7); + public static final Field OVERRIDECRANKINGIACSETTING = Field.create("OVERRIDECRANKINGIACSETTING", 1484, FieldType.BIT, 6); + public static final Field USESEPARATEADVANCEFORIDLE = Field.create("USESEPARATEADVANCEFORIDLE", 1484, FieldType.BIT, 7); public static final Field ISTUNERSTUDIOENABLED = Field.create("ISTUNERSTUDIOENABLED", 1484, FieldType.BIT, 8); public static final Field ISWAVEANALYZERENABLED = Field.create("ISWAVEANALYZERENABLED", 1484, FieldType.BIT, 9); - public static final Field ANOTHERUNUSEDBIT212 = Field.create("ANOTHERUNUSEDBIT212", 1484, FieldType.BIT, 10); + public static final Field USESEPARATEVEFORIDLE = Field.create("USESEPARATEVEFORIDLE", 1484, FieldType.BIT, 10); public static final Field ISPRINTTRIGGERSYNCHDETAILS = Field.create("ISPRINTTRIGGERSYNCHDETAILS", 1484, FieldType.BIT, 11); public static final Field ISMANUALSPINNINGMODE = Field.create("ISMANUALSPINNINGMODE", 1484, FieldType.BIT, 12); public static final Field TWOWIREBATCHINJECTION = Field.create("TWOWIREBATCHINJECTION", 1484, FieldType.BIT, 13); diff --git a/java_tools/ConfigDefinition.jar b/java_tools/ConfigDefinition.jar index d911cee33c..f3fd107e99 100644 Binary files a/java_tools/ConfigDefinition.jar and b/java_tools/ConfigDefinition.jar differ diff --git a/java_tools/configuration_definition/src/com/rusefi/ConfigDefinition.java b/java_tools/configuration_definition/src/com/rusefi/ConfigDefinition.java index 954d39e71f..85d3b878cd 100644 --- a/java_tools/configuration_definition/src/com/rusefi/ConfigDefinition.java +++ b/java_tools/configuration_definition/src/com/rusefi/ConfigDefinition.java @@ -120,7 +120,7 @@ public class ConfigDefinition { String line; while ((line = fr.readLine()) != null) { - line = VariableRegistry.INSTANCE.processLine(line); + line = VariableRegistry.INSTANCE.applyVariables(line); fw.write(line + ConfigDefinition.EOL); } fw.close(); @@ -149,7 +149,7 @@ public class ConfigDefinition { prefix.append(line + ConfigDefinition.EOL); if (isAfterEndTag) - postfix.append(VariableRegistry.INSTANCE.processLine(line) + ConfigDefinition.EOL); + postfix.append(VariableRegistry.INSTANCE.applyVariables(line) + ConfigDefinition.EOL); } r.close(); return new TsFileContent(prefix.toString(), postfix.toString()); @@ -206,7 +206,7 @@ public class ConfigDefinition { String customSize = line.substring(0, index); String tunerStudioLine = line.substring(index).trim(); - tunerStudioLine = VariableRegistry.INSTANCE.processLine(tunerStudioLine); + tunerStudioLine = VariableRegistry.INSTANCE.applyVariables(tunerStudioLine); int size; try { size = Integer.parseInt(customSize); diff --git a/java_tools/configuration_definition/src/com/rusefi/ConfigField.java b/java_tools/configuration_definition/src/com/rusefi/ConfigField.java index bc4c7ea050..10e69d1ecb 100644 --- a/java_tools/configuration_definition/src/com/rusefi/ConfigField.java +++ b/java_tools/configuration_definition/src/com/rusefi/ConfigField.java @@ -17,7 +17,7 @@ import static com.rusefi.ConfigDefinition.EOL; * 1/15/15 */ public class ConfigField { - public static final ConfigField VOID = new ConfigField(null, null, false, null, null, 1, null, false); + public static final ConfigField VOID = new ConfigField("", null, false, null, null, 1, null, false); private static final String typePattern = "([\\w\\d_]+)(\\[([\\w\\d]+)(\\s([\\w\\d]+))?\\])?"; private static final String namePattern = "[[\\w\\d\\s_]]+"; @@ -51,6 +51,9 @@ public class ConfigField { public ConfigField(String name, String comment, boolean isBit, String arraySizeAsText, String type, int arraySize, String tsInfo, boolean isIterate) { + if (name == null) + throw new NullPointerException(comment + " " + isBit + " " + type); + assertNoWhitespaces(name); this.name = name; this.comment = comment; this.isBit = isBit; @@ -66,6 +69,11 @@ public class ConfigField { this.isIterate = isIterate; } + public static void assertNoWhitespaces(String name) { + if (name.contains(" ") || name.contains("\t")) + throw new IllegalArgumentException("Invalid name: " + name); + } + /** * @see ConfigDefinitionTest#testParseLine() */ @@ -74,7 +82,7 @@ public class ConfigField { if (!matcher.matches()) return null; - String name = matcher.group(6); + String name = matcher.group(6).trim(); String comment = matcher.group(8); String type = matcher.group(1); int arraySize; diff --git a/java_tools/configuration_definition/src/com/rusefi/VariableRegistry.java b/java_tools/configuration_definition/src/com/rusefi/VariableRegistry.java index fd711748a2..3e3f0d7eca 100644 --- a/java_tools/configuration_definition/src/com/rusefi/VariableRegistry.java +++ b/java_tools/configuration_definition/src/com/rusefi/VariableRegistry.java @@ -30,7 +30,11 @@ public class VariableRegistry extends TreeMap { super(String.CASE_INSENSITIVE_ORDER); } - public String processLine(String line) { + /** + * This methos replaces variables references like @@var@@ with actual values + * An exception is thrown if we do not have such variable + */ + public String applyVariables(String line) { Matcher m; while ((m = VAR.matcher(line)).find()) { String key = m.group(2); diff --git a/java_tools/configuration_definition/src/com/rusefi/test/VariableRegistryTest.java b/java_tools/configuration_definition/src/com/rusefi/test/VariableRegistryTest.java index 294f14631a..ace45193d0 100644 --- a/java_tools/configuration_definition/src/com/rusefi/test/VariableRegistryTest.java +++ b/java_tools/configuration_definition/src/com/rusefi/test/VariableRegistryTest.java @@ -15,9 +15,9 @@ public class VariableRegistryTest { VariableRegistry.INSTANCE.register("var", 256); - assertEquals("256", VariableRegistry.INSTANCE.processLine("@@var@@")); - assertEquals("ab256", VariableRegistry.INSTANCE.processLine("ab@@var@@")); - assertEquals("ab256cd", VariableRegistry.INSTANCE.processLine("ab@@var@@cd")); - assertEquals("aa256qwe100fff", VariableRegistry.INSTANCE.processLine("aa@@var@@qwe@@var_hex@@fff")); + assertEquals("256", VariableRegistry.INSTANCE.applyVariables("@@var@@")); + assertEquals("ab256", VariableRegistry.INSTANCE.applyVariables("ab@@var@@")); + assertEquals("ab256cd", VariableRegistry.INSTANCE.applyVariables("ab@@var@@cd")); + assertEquals("aa256qwe100fff", VariableRegistry.INSTANCE.applyVariables("aa@@var@@qwe@@var_hex@@fff")); } }