From 5b638d3a870995cd8cdb515cade98ef7a58d91c7 Mon Sep 17 00:00:00 2001 From: GitHub build-firmware Action Date: Wed, 30 Dec 2020 13:37:55 +0000 Subject: [PATCH] Auto-generated configs and docs --- ...ngine_configuration_generated_structures.h | 5 +- .../controllers/algo/rusefi_generated.h | 6 +- ...ngine_configuration_generated_structures.h | 5 +- .../controllers/algo/rusefi_generated.h | 6 +- ...ngine_configuration_generated_structures.h | 5 +- .../generated/fsio_enums_generated.def | 2 +- .../controllers/generated/fsio_getters.def | 2 +- firmware/controllers/generated/fsio_names.def | 2 +- .../controllers/generated/fsio_strings.def | 2 +- .../controllers/generated/rusefi_generated.h | 6 +- .../controllers/generated/signature_all.h | 6 +- .../generated/signature_frankenso_na6.h | 6 +- .../generated/signature_hellen_cypress.h | 6 +- .../controllers/generated/signature_kin.h | 6 +- .../controllers/generated/signature_mre_f4.h | 6 +- .../controllers/generated/signature_mre_f7.h | 6 +- .../generated/signature_prometheus_405.h | 6 +- .../generated/signature_prometheus_469.h | 6 +- .../generated/signature_proteus_f4.h | 6 +- .../generated/signature_proteus_f7.h | 6 +- firmware/tunerstudio/generated/cache.zip | Bin 981425 -> 981505 bytes firmware/tunerstudio/generated/rusefi.ini | 94 ++++++++++-------- .../generated/rusefi_frankenso_na6.ini | 94 ++++++++++-------- .../generated/rusefi_hellen_cypress.ini | 94 ++++++++++-------- .../tunerstudio/generated/rusefi_kinetis.ini | 94 ++++++++++-------- .../tunerstudio/generated/rusefi_mre_f4.ini | 94 ++++++++++-------- .../tunerstudio/generated/rusefi_mre_f7.ini | 94 ++++++++++-------- .../generated/rusefi_prometheus_405.ini | 94 ++++++++++-------- .../generated/rusefi_prometheus_469.ini | 94 ++++++++++-------- .../generated/rusefi_proteus_f4.ini | 94 ++++++++++-------- .../generated/rusefi_proteus_f7.ini | 94 ++++++++++-------- .../com/rusefi/config/generated/Fields.java | 4 +- java_console/rusefi.xml | 2 +- 33 files changed, 555 insertions(+), 492 deletions(-) diff --git a/firmware/config/boards/hellen/cypress/config/controllers/algo/engine_configuration_generated_structures.h b/firmware/config/boards/hellen/cypress/config/controllers/algo/engine_configuration_generated_structures.h index 942eb83996..62adfbdcad 100644 --- a/firmware/config/boards/hellen/cypress/config/controllers/algo/engine_configuration_generated_structures.h +++ b/firmware/config/boards/hellen/cypress/config/controllers/algo/engine_configuration_generated_structures.h @@ -1,4 +1,4 @@ -// this section was generated automatically by rusEfi tool ConfigDefinition.jar based on hellen_cypress_gen_config.bat integration/rusefi_config.txt Thu Dec 24 12:33:03 UTC 2020 +// this section was generated automatically by rusEfi tool ConfigDefinition.jar based on hellen_cypress_gen_config.bat integration/rusefi_config.txt Wed Dec 30 13:37:33 UTC 2020 // by class com.rusefi.output.CHeaderConsumer // begin #pragma once @@ -1596,6 +1596,7 @@ struct engine_configuration_s { */ int mapMinBufferLength; /** + * Below this throttle position, the engine is considered idling. * offset 816 */ int16_t idlePidDeactivationTpsThreshold; @@ -3782,4 +3783,4 @@ struct persistent_config_s { typedef struct persistent_config_s persistent_config_s; // end -// this section was generated automatically by rusEfi tool ConfigDefinition.jar based on hellen_cypress_gen_config.bat integration/rusefi_config.txt Thu Dec 24 12:33:03 UTC 2020 +// this section was generated automatically by rusEfi tool ConfigDefinition.jar based on hellen_cypress_gen_config.bat integration/rusefi_config.txt Wed Dec 30 13:37:33 UTC 2020 diff --git a/firmware/config/boards/hellen/cypress/config/controllers/algo/rusefi_generated.h b/firmware/config/boards/hellen/cypress/config/controllers/algo/rusefi_generated.h index 2599118c06..fb1ff90aad 100644 --- a/firmware/config/boards/hellen/cypress/config/controllers/algo/rusefi_generated.h +++ b/firmware/config/boards/hellen/cypress/config/controllers/algo/rusefi_generated.h @@ -1226,8 +1226,8 @@ #define showHumanReadableWarning_offset 976 #define showSdCardWarning_offset 76 #define SIGNATURE_BOARD hellen_cypress -#define SIGNATURE_DATE 2020.12.24 -#define SIGNATURE_HASH 140549664 +#define SIGNATURE_DATE 2020.12.30 +#define SIGNATURE_HASH 1738189114 #define silentTriggerError_offset 1464 #define slowAdcAlpha_offset 2088 #define sparkDwellRpmBins_offset 332 @@ -1558,7 +1558,7 @@ #define ts_show_spi true #define ts_show_trigger_comparator false #define ts_show_tunerstudio_port true -#define TS_SIGNATURE "rusEFI 2020.12.24.hellen_cypress.140549664" +#define TS_SIGNATURE "rusEFI 2020.12.30.hellen_cypress.1738189114" #define TS_SINGLE_WRITE_COMMAND 'W' #define TS_SINGLE_WRITE_COMMAND_char W #define TS_TEST_COMMAND 't' // 0x74 diff --git a/firmware/config/boards/kinetis/config/controllers/algo/engine_configuration_generated_structures.h b/firmware/config/boards/kinetis/config/controllers/algo/engine_configuration_generated_structures.h index 1e81ba0a73..b7637350c7 100644 --- a/firmware/config/boards/kinetis/config/controllers/algo/engine_configuration_generated_structures.h +++ b/firmware/config/boards/kinetis/config/controllers/algo/engine_configuration_generated_structures.h @@ -1,4 +1,4 @@ -// this section was generated automatically by rusEfi tool ConfigDefinition.jar based on kinetis_gen_config.bat integration/rusefi_config.txt Thu Dec 24 12:33:01 UTC 2020 +// this section was generated automatically by rusEfi tool ConfigDefinition.jar based on kinetis_gen_config.bat integration/rusefi_config.txt Wed Dec 30 13:37:29 UTC 2020 // by class com.rusefi.output.CHeaderConsumer // begin #pragma once @@ -1596,6 +1596,7 @@ struct engine_configuration_s { */ int mapMinBufferLength; /** + * Below this throttle position, the engine is considered idling. * offset 816 */ int16_t idlePidDeactivationTpsThreshold; @@ -3782,4 +3783,4 @@ struct persistent_config_s { typedef struct persistent_config_s persistent_config_s; // end -// this section was generated automatically by rusEfi tool ConfigDefinition.jar based on kinetis_gen_config.bat integration/rusefi_config.txt Thu Dec 24 12:33:01 UTC 2020 +// this section was generated automatically by rusEfi tool ConfigDefinition.jar based on kinetis_gen_config.bat integration/rusefi_config.txt Wed Dec 30 13:37:29 UTC 2020 diff --git a/firmware/config/boards/kinetis/config/controllers/algo/rusefi_generated.h b/firmware/config/boards/kinetis/config/controllers/algo/rusefi_generated.h index 182ca85bea..472f274056 100644 --- a/firmware/config/boards/kinetis/config/controllers/algo/rusefi_generated.h +++ b/firmware/config/boards/kinetis/config/controllers/algo/rusefi_generated.h @@ -1226,8 +1226,8 @@ #define showHumanReadableWarning_offset 976 #define showSdCardWarning_offset 76 #define SIGNATURE_BOARD kin -#define SIGNATURE_DATE 2020.12.24 -#define SIGNATURE_HASH 1501340890 +#define SIGNATURE_DATE 2020.12.30 +#define SIGNATURE_HASH 914789312 #define silentTriggerError_offset 1464 #define slowAdcAlpha_offset 2088 #define sparkDwellRpmBins_offset 332 @@ -1558,7 +1558,7 @@ #define ts_show_spi true #define ts_show_trigger_comparator true #define ts_show_tunerstudio_port true -#define TS_SIGNATURE "rusEFI 2020.12.24.kin.1501340890" +#define TS_SIGNATURE "rusEFI 2020.12.30.kin.914789312" #define TS_SINGLE_WRITE_COMMAND 'W' #define TS_SINGLE_WRITE_COMMAND_char W #define TS_TEST_COMMAND 't' // 0x74 diff --git a/firmware/controllers/generated/engine_configuration_generated_structures.h b/firmware/controllers/generated/engine_configuration_generated_structures.h index 6208087b86..74805c0fe3 100644 --- a/firmware/controllers/generated/engine_configuration_generated_structures.h +++ b/firmware/controllers/generated/engine_configuration_generated_structures.h @@ -1,4 +1,4 @@ -// this section was generated automatically by rusEfi tool ConfigDefinition.jar based on gen_config.sh integration/rusefi_config.txt Thu Dec 24 12:32:41 UTC 2020 +// this section was generated automatically by rusEfi tool ConfigDefinition.jar based on gen_config.sh integration/rusefi_config.txt Wed Dec 30 13:37:13 UTC 2020 // by class com.rusefi.output.CHeaderConsumer // begin #pragma once @@ -1596,6 +1596,7 @@ struct engine_configuration_s { */ int mapMinBufferLength; /** + * Below this throttle position, the engine is considered idling. * offset 816 */ int16_t idlePidDeactivationTpsThreshold; @@ -3782,4 +3783,4 @@ struct persistent_config_s { typedef struct persistent_config_s persistent_config_s; // end -// this section was generated automatically by rusEfi tool ConfigDefinition.jar based on gen_config.sh integration/rusefi_config.txt Thu Dec 24 12:32:41 UTC 2020 +// this section was generated automatically by rusEfi tool ConfigDefinition.jar based on gen_config.sh integration/rusefi_config.txt Wed Dec 30 13:37:13 UTC 2020 diff --git a/firmware/controllers/generated/fsio_enums_generated.def b/firmware/controllers/generated/fsio_enums_generated.def index e181293c3d..5594958c63 100644 --- a/firmware/controllers/generated/fsio_enums_generated.def +++ b/firmware/controllers/generated/fsio_enums_generated.def @@ -1,4 +1,4 @@ -// this file was generated automatically by rusEfi tool ConfigDefinition.jar based on gen_config.sh integration/rusefi_config.txt Thu Dec 24 12:32:41 UTC 2020 +// this file was generated automatically by rusEfi tool ConfigDefinition.jar based on gen_config.sh integration/rusefi_config.txt Wed Dec 30 13:37:13 UTC 2020 // by class com.rusefi.output.FileFsioSettingsConsumer FSIO_SETTING_FANONTEMPERATURE = 1000, diff --git a/firmware/controllers/generated/fsio_getters.def b/firmware/controllers/generated/fsio_getters.def index 5815cf3a9d..ea08227e0d 100644 --- a/firmware/controllers/generated/fsio_getters.def +++ b/firmware/controllers/generated/fsio_getters.def @@ -1,4 +1,4 @@ -// this file was generated automatically by rusEfi tool ConfigDefinition.jar based on gen_config.sh integration/rusefi_config.txt Thu Dec 24 12:32:41 UTC 2020 +// this file was generated automatically by rusEfi tool ConfigDefinition.jar based on gen_config.sh integration/rusefi_config.txt Wed Dec 30 13:37:13 UTC 2020 // by class com.rusefi.output.FileFsioSettingsConsumer case FSIO_SETTING_FANONTEMPERATURE: diff --git a/firmware/controllers/generated/fsio_names.def b/firmware/controllers/generated/fsio_names.def index 5c4e2c5357..2683e09324 100644 --- a/firmware/controllers/generated/fsio_names.def +++ b/firmware/controllers/generated/fsio_names.def @@ -1,4 +1,4 @@ -// this file was generated automatically by rusEfi tool ConfigDefinition.jar based on gen_config.sh integration/rusefi_config.txt Thu Dec 24 12:32:41 UTC 2020 +// this file was generated automatically by rusEfi tool ConfigDefinition.jar based on gen_config.sh integration/rusefi_config.txt Wed Dec 30 13:37:13 UTC 2020 // by class com.rusefi.output.FileFsioSettingsConsumer static LENameOrdinalPair lefanOnTemperature(FSIO_SETTING_FANONTEMPERATURE, "cfg_fanOnTemperature"); diff --git a/firmware/controllers/generated/fsio_strings.def b/firmware/controllers/generated/fsio_strings.def index 77de84eedb..28de736a75 100644 --- a/firmware/controllers/generated/fsio_strings.def +++ b/firmware/controllers/generated/fsio_strings.def @@ -1,4 +1,4 @@ -// this file was generated automatically by rusEfi tool ConfigDefinition.jar based on gen_config.sh integration/rusefi_config.txt Thu Dec 24 12:32:41 UTC 2020 +// this file was generated automatically by rusEfi tool ConfigDefinition.jar based on gen_config.sh integration/rusefi_config.txt Wed Dec 30 13:37:13 UTC 2020 // by class com.rusefi.output.FileFsioSettingsConsumer case FSIO_SETTING_FANONTEMPERATURE: diff --git a/firmware/controllers/generated/rusefi_generated.h b/firmware/controllers/generated/rusefi_generated.h index f02d9e6db5..67ad520555 100644 --- a/firmware/controllers/generated/rusefi_generated.h +++ b/firmware/controllers/generated/rusefi_generated.h @@ -1226,8 +1226,8 @@ #define showHumanReadableWarning_offset 976 #define showSdCardWarning_offset 76 #define SIGNATURE_BOARD all -#define SIGNATURE_DATE 2020.12.24 -#define SIGNATURE_HASH 3247519971 +#define SIGNATURE_DATE 2020.12.30 +#define SIGNATURE_HASH 2926252025 #define silentTriggerError_offset 1464 #define slowAdcAlpha_offset 2088 #define sparkDwellRpmBins_offset 332 @@ -1558,7 +1558,7 @@ #define ts_show_spi true #define ts_show_trigger_comparator false #define ts_show_tunerstudio_port true -#define TS_SIGNATURE "rusEFI 2020.12.24.all.3247519971" +#define TS_SIGNATURE "rusEFI 2020.12.30.all.2926252025" #define TS_SINGLE_WRITE_COMMAND 'W' #define TS_SINGLE_WRITE_COMMAND_char W #define TS_TEST_COMMAND 't' // 0x74 diff --git a/firmware/controllers/generated/signature_all.h b/firmware/controllers/generated/signature_all.h index 5e0f8851a5..f55f78b93e 100644 --- a/firmware/controllers/generated/signature_all.h +++ b/firmware/controllers/generated/signature_all.h @@ -3,6 +3,6 @@ // #define SIGNATURE_BOARD all -#define SIGNATURE_DATE 2020.12.26 -#define SIGNATURE_HASH 267210507 -#define TS_SIGNATURE "rusEFI 2020.12.26.all.267210507" +#define SIGNATURE_DATE 2020.12.30 +#define SIGNATURE_HASH 2926252025 +#define TS_SIGNATURE "rusEFI 2020.12.30.all.2926252025" diff --git a/firmware/controllers/generated/signature_frankenso_na6.h b/firmware/controllers/generated/signature_frankenso_na6.h index c7b798f76a..8be47649d6 100644 --- a/firmware/controllers/generated/signature_frankenso_na6.h +++ b/firmware/controllers/generated/signature_frankenso_na6.h @@ -3,6 +3,6 @@ // #define SIGNATURE_BOARD frankenso_na6 -#define SIGNATURE_DATE 2020.12.26 -#define SIGNATURE_HASH 2577268464 -#define TS_SIGNATURE "rusEFI 2020.12.26.frankenso_na6.2577268464" +#define SIGNATURE_DATE 2020.12.30 +#define SIGNATURE_HASH 941342210 +#define TS_SIGNATURE "rusEFI 2020.12.30.frankenso_na6.941342210" diff --git a/firmware/controllers/generated/signature_hellen_cypress.h b/firmware/controllers/generated/signature_hellen_cypress.h index cca275d6e7..e8e8939ec2 100644 --- a/firmware/controllers/generated/signature_hellen_cypress.h +++ b/firmware/controllers/generated/signature_hellen_cypress.h @@ -3,6 +3,6 @@ // #define SIGNATURE_BOARD hellen_cypress -#define SIGNATURE_DATE 2020.12.26 -#define SIGNATURE_HASH 3323783624 -#define TS_SIGNATURE "rusEFI 2020.12.26.hellen_cypress.3323783624" +#define SIGNATURE_DATE 2020.12.30 +#define SIGNATURE_HASH 1738189114 +#define TS_SIGNATURE "rusEFI 2020.12.30.hellen_cypress.1738189114" diff --git a/firmware/controllers/generated/signature_kin.h b/firmware/controllers/generated/signature_kin.h index c1ddc2bfe6..5a5f58f58a 100644 --- a/firmware/controllers/generated/signature_kin.h +++ b/firmware/controllers/generated/signature_kin.h @@ -3,6 +3,6 @@ // #define SIGNATURE_BOARD kin -#define SIGNATURE_DATE 2020.12.26 -#define SIGNATURE_HASH 2533413682 -#define TS_SIGNATURE "rusEFI 2020.12.26.kin.2533413682" +#define SIGNATURE_DATE 2020.12.30 +#define SIGNATURE_HASH 914789312 +#define TS_SIGNATURE "rusEFI 2020.12.30.kin.914789312" diff --git a/firmware/controllers/generated/signature_mre_f4.h b/firmware/controllers/generated/signature_mre_f4.h index ece5831ba8..1849fdfb52 100644 --- a/firmware/controllers/generated/signature_mre_f4.h +++ b/firmware/controllers/generated/signature_mre_f4.h @@ -3,6 +3,6 @@ // #define SIGNATURE_BOARD mre_f4 -#define SIGNATURE_DATE 2020.12.26 -#define SIGNATURE_HASH 406688114 -#define TS_SIGNATURE "rusEFI 2020.12.26.mre_f4.406688114" +#define SIGNATURE_DATE 2020.12.30 +#define SIGNATURE_HASH 3116093824 +#define TS_SIGNATURE "rusEFI 2020.12.30.mre_f4.3116093824" diff --git a/firmware/controllers/generated/signature_mre_f7.h b/firmware/controllers/generated/signature_mre_f7.h index 8325770c3f..a5da4d48cc 100644 --- a/firmware/controllers/generated/signature_mre_f7.h +++ b/firmware/controllers/generated/signature_mre_f7.h @@ -3,6 +3,6 @@ // #define SIGNATURE_BOARD mre_f7 -#define SIGNATURE_DATE 2020.12.26 -#define SIGNATURE_HASH 406688114 -#define TS_SIGNATURE "rusEFI 2020.12.26.mre_f7.406688114" +#define SIGNATURE_DATE 2020.12.30 +#define SIGNATURE_HASH 3116093824 +#define TS_SIGNATURE "rusEFI 2020.12.30.mre_f7.3116093824" diff --git a/firmware/controllers/generated/signature_prometheus_405.h b/firmware/controllers/generated/signature_prometheus_405.h index 6172b83271..8fc2972a90 100644 --- a/firmware/controllers/generated/signature_prometheus_405.h +++ b/firmware/controllers/generated/signature_prometheus_405.h @@ -3,6 +3,6 @@ // #define SIGNATURE_BOARD prometheus_405 -#define SIGNATURE_DATE 2020.12.26 -#define SIGNATURE_HASH 1295337818 -#define TS_SIGNATURE "rusEFI 2020.12.26.prometheus_405.1295337818" +#define SIGNATURE_DATE 2020.12.30 +#define SIGNATURE_HASH 3971156392 +#define TS_SIGNATURE "rusEFI 2020.12.30.prometheus_405.3971156392" diff --git a/firmware/controllers/generated/signature_prometheus_469.h b/firmware/controllers/generated/signature_prometheus_469.h index e57426daa6..b5c7e2217c 100644 --- a/firmware/controllers/generated/signature_prometheus_469.h +++ b/firmware/controllers/generated/signature_prometheus_469.h @@ -3,6 +3,6 @@ // #define SIGNATURE_BOARD prometheus_469 -#define SIGNATURE_DATE 2020.12.26 -#define SIGNATURE_HASH 1295337818 -#define TS_SIGNATURE "rusEFI 2020.12.26.prometheus_469.1295337818" +#define SIGNATURE_DATE 2020.12.30 +#define SIGNATURE_HASH 3971156392 +#define TS_SIGNATURE "rusEFI 2020.12.30.prometheus_469.3971156392" diff --git a/firmware/controllers/generated/signature_proteus_f4.h b/firmware/controllers/generated/signature_proteus_f4.h index cf7dc6955c..0befaabfc4 100644 --- a/firmware/controllers/generated/signature_proteus_f4.h +++ b/firmware/controllers/generated/signature_proteus_f4.h @@ -3,6 +3,6 @@ // #define SIGNATURE_BOARD proteus_f4 -#define SIGNATURE_DATE 2020.12.26 -#define SIGNATURE_HASH 3326543317 -#define TS_SIGNATURE "rusEFI 2020.12.26.proteus_f4.3326543317" +#define SIGNATURE_DATE 2020.12.30 +#define SIGNATURE_HASH 1740719399 +#define TS_SIGNATURE "rusEFI 2020.12.30.proteus_f4.1740719399" diff --git a/firmware/controllers/generated/signature_proteus_f7.h b/firmware/controllers/generated/signature_proteus_f7.h index 5e171da64f..419e387bcd 100644 --- a/firmware/controllers/generated/signature_proteus_f7.h +++ b/firmware/controllers/generated/signature_proteus_f7.h @@ -3,6 +3,6 @@ // #define SIGNATURE_BOARD proteus_f7 -#define SIGNATURE_DATE 2020.12.26 -#define SIGNATURE_HASH 3326543317 -#define TS_SIGNATURE "rusEFI 2020.12.26.proteus_f7.3326543317" +#define SIGNATURE_DATE 2020.12.30 +#define SIGNATURE_HASH 1740719399 +#define TS_SIGNATURE "rusEFI 2020.12.30.proteus_f7.1740719399" diff --git a/firmware/tunerstudio/generated/cache.zip b/firmware/tunerstudio/generated/cache.zip index 78fce356158b02c951c5d793867cebec9cdc30c0..1bb361c081d893ce1cff3d036b73723af8aabe5a 100644 GIT binary patch delta 324717 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 Settings dialog = fanSetting, "Fan Settings" diff --git a/firmware/tunerstudio/generated/rusefi_frankenso_na6.ini b/firmware/tunerstudio/generated/rusefi_frankenso_na6.ini index 09d0aba13f..0f5b9cf3a7 100644 --- a/firmware/tunerstudio/generated/rusefi_frankenso_na6.ini +++ b/firmware/tunerstudio/generated/rusefi_frankenso_na6.ini @@ -33,12 +33,12 @@ enable2ndByteCanID = false [MegaTune] ; https://rusefi.com/forum/viewtopic.php?p=36201#p36201 - signature = "rusEFI 2020.12.26.frankenso_na6.2577268464" + signature = "rusEFI 2020.12.30.frankenso_na6.941342210" [TunerStudio] queryCommand = "S" versionInfo = "V" ; firmwave version for title bar. - signature = "rusEFI 2020.12.26.frankenso_na6.2577268464" ; signature is expected to be 7 or more characters. + signature = "rusEFI 2020.12.30.frankenso_na6.941342210" ; signature is expected to be 7 or more characters. [Constants] ; new packet serial format with CRC @@ -77,7 +77,7 @@ enable2ndByteCanID = false ; see PAGE_0_SIZE in C source code ; CONFIG_DEFINITION_START -; this section was generated automatically by rusEfi tool ConfigDefinition.jar based on gen_config.sh integration/rusefi_config.txt Sat Dec 26 21:17:43 UTC 2020 +; this section was generated automatically by rusEfi tool ConfigDefinition.jar based on gen_config.sh integration/rusefi_config.txt Wed Dec 30 13:37:19 UTC 2020 pageSize = 20000 page = 1 @@ -1336,6 +1336,7 @@ page = 1 acIdleExtraMin = "Additional idle PID minValue while A/C is active" acFanPin = "Optional Radiator Fan used with A/C" sdCardPeriodMs = "SD card logging period, in milliseconds" + idlePidDeactivationTpsThreshold = "Below this throttle position, the engine is considered idling." triggerErrorPin = "This pin is used for debugging - snap a logic analyzer on it and see if it's ever high" cdmInputPin = "Saab Combustion Detection Module knock signal input pin\nalso known as Saab Ion Sensing Module" sensorChartMode = "rusEfi console Sensor Sniffer mode" @@ -2796,16 +2797,16 @@ menuDialog = main menu = "&Idle" subMenu = idleSettings, "Idle settings" subMenu = idlehw, "Idle hardware" - subMenu = std_separator - subMenu = cltIdleRPMCurve, "Target RPM", 0, {idleMode == 0} + subMenu = std_separator + subMenu = cltIdleRPMCurve, "Target RPM" + subMenu = cltIdleCurve, "CLT multiplier" + subMenu = std_separator + subMenu = idleTimingPidCorrDialog, "Closed-loop idle timing" subMenu = iacPidMultTbl, "IAC PID Multiplier", 0, {idleMode == 0 && useIacPidMultTable == 1} + subMenu = iacCoastingCurve, "Coasting IAC Position for Auto-Idle", 0, {useIacTableForCoasting == 1} subMenu = std_separator subMenu = idleVeCurve, "VE", 0, {useSeparateVeForIdle == 1} subMenu = idleAdvanceCurve, "Ignition advance", 0, {useSeparateAdvanceForIdle == 1} - subMenu = std_separator - subMenu = idleTimingPidCorrDialog, "Closed-loop idle timing" - subMenu = cltIdleCurve, "CLT multiplier" - subMenu = iacCoastingCurve, "Coasting IAC Position for Auto-Idle", 0, {useIacTableForCoasting == 1} menu = "&Advanced" subMenu = boostDialog, "Boost Control" @@ -3879,11 +3880,11 @@ cmd_set_engine_type_default = "Z\x00\x31\x00\x00" field = "!ECU reboot needed to apply these settings" field = "Use Stepper", useStepperIdle field = "Double Solenoid Mode", isDoubleSolenoidIdle + field = "Use electronic throttle for idle", useETBforIdleControl, { throttlePedalPositionAdcChannel != 0 } + field = "Electronic throttle idle range", etbIdleThrottleRange, { useETBforIdleControl == 1 } panel = idleHwType - dialog = idlePidSettings, "PID IAC Control" - field = "#See Idle Target RPM Curve" - field = "use Cic Pid", useCicPidForIdle + dialog = idlePidSettings, "Closed Loop Idle" field = "P-factor", idleRpmPid_pFactor field = "I-factor", idleRpmPid_iFactor field = "derivativeFilterLoss", idle_derivativeFilterLoss @@ -3896,43 +3897,48 @@ cmd_set_engine_type_default = "Z\x00\x31\x00\x00" field = "Max", idleRpmPid_maxValue field = "iTerm Min", idlerpmpid_iTermMin field = "iTerm Max", idlerpmpid_iTermMax - field = "RPM dead zone to deactivate IAC pid", idlePidRpmDeadZone - field = "RPM upper limit to deactivate IAC pid",idlePidRpmUpperLimit field = "PID Extra for low RPM", pidExtraForLowRpm - field = "Use IAC PID Multiplier Table", useIacPidMultTable - - - dialog = idleSettings, "", yAxis - field = "Idle IAC control mode", idleMode - field = useInstantRpmForIdle, useInstantRpmForIdle - field = "use ETB for idle", useETBforIdleControl, { throttlePedalPositionAdcChannel != 0 } - field = "ETB Idle range", etbIdleThrottleRange, {useETBforIdleControl == 1} - field = "Use separate Ignition Table for idle", useSeparateAdvanceForIdle - field = "Use separate VE Table for idle", useSeparateVeForIdle - field = "Use separate IAC Table For Coasting", useIacTableForCoasting, {idleMode == 0} field = idleIncrementalPidCic, idleIncrementalPidCic - field = "TPS deactivation threshold", idlePidDeactivationTpsThreshold + field = "use Cic Pid", useCicPidForIdle + field = "Use IAC PID Multiplier Table", useIacPidMultTable + + dialog = idleGating, "Idle Detection Thresholds" + field = "TPS threshold", idlePidDeactivationTpsThreshold + field = "RPM upper limit", idlePidRpmUpperLimit + field = "RPM dead zone", idlePidRpmDeadZone + + dialog = idleExtra, "Extra Idle Features" + field = "Extra idle air if throttle pressed", iacByTpsTaper + field = "Use idle ignition table", useSeparateAdvanceForIdle + field = "Use idle VE table", useSeparateVeForIdle + field = "Use coasting idle table", useIacTableForCoasting, {idleMode == 0} + field = useInstantRpmForIdle, useInstantRpmForIdle + field = "Detailed status in console", isVerboseIAC + + dialog = idleSettings, "", yAxis + field = "Idle control mode", idleMode + + field = "! Solenoid idle control requires above zero RPM" + slider = "Open loop idle position", manIdlePosition, horizontal + field = "" + + panel = idleGating, "" panel = idlePidSettings, { idleMode == 0} - field = "Extra IAC if Throttle Pressed", iacByTpsTaper; - field = "Detailed status in console", isVerboseIAC - field = "#See Warmup idle multiplier" - field = "! Solenoid Idle control requires above zero RPM" - slider = "Manual IAC Position", manIdlePosition, horizontal + panel = idleExtra dialog = idleTimingPidCorrDialog, "", yAxis - field = "!This timing correction mode is Alpha Version" - field = "Use Auto-PID ignition advance control", useIdleTimingPidControl - field = "#See Idle Target RPM Curve" - field = "P-factor", idleTimingPid_pFactor, {useIdleTimingPidControl == 1} - field = "I-factor", idleTimingPid_iFactor, {useIdleTimingPidControl == 1} - field = "D-factor", idleTimingPid_dFactor, {useIdleTimingPidControl == 1} - field = "Offset", idleTimingPid_offset, {useIdleTimingPidControl == 1} - field = "Min Delta", idleTimingPid_minValue, {useIdleTimingPidControl == 1} - field = "Max Delta", idleTimingPid_maxValue, {useIdleTimingPidControl == 1} - field = "#See RPM dead zone to deactivate IAC pid" - field = "RPM working zone for timing pid", idleTimingPidWorkZone, {useIdleTimingPidControl == 1} - field = "RPM working zone falloff", idlePidFalloffDeltaRpm, {useIdleTimingPidControl == 1} - field = "RPM dead zone to deactivate timing pid", idleTimingPidDeadZone, {useIdleTimingPidControl == 1} + field = "" + field = "Enable closed loop idle ignition timing", useIdleTimingPidControl + field = "" + field = "#Gain is in degrees advance per rpm away from target" + field = "#A good starting point is 0.1 = 10 deg per 100 rpm" + field = "Proportional gain", idleTimingPid_pFactor, {useIdleTimingPidControl == 1} + field = "Derivative gain", idleTimingPid_dFactor, {useIdleTimingPidControl == 1} + field = "" + field = "Min adjustment (retard)", idleTimingPid_minValue, {useIdleTimingPidControl == 1} + field = "Max adjustment (advance)", idleTimingPid_maxValue, {useIdleTimingPidControl == 1} + field = "" + field = "#Use debug mode 'Timing' to view idle timing adjustment" ; Engine->Fan Settings dialog = fanSetting, "Fan Settings" diff --git a/firmware/tunerstudio/generated/rusefi_hellen_cypress.ini b/firmware/tunerstudio/generated/rusefi_hellen_cypress.ini index f061731920..2b32f661dc 100644 --- a/firmware/tunerstudio/generated/rusefi_hellen_cypress.ini +++ b/firmware/tunerstudio/generated/rusefi_hellen_cypress.ini @@ -33,12 +33,12 @@ enable2ndByteCanID = false [MegaTune] ; https://rusefi.com/forum/viewtopic.php?p=36201#p36201 - signature = "rusEFI 2020.12.26.hellen_cypress.3323783624" + signature = "rusEFI 2020.12.30.hellen_cypress.1738189114" [TunerStudio] queryCommand = "S" versionInfo = "V" ; firmwave version for title bar. - signature = "rusEFI 2020.12.26.hellen_cypress.3323783624" ; signature is expected to be 7 or more characters. + signature = "rusEFI 2020.12.30.hellen_cypress.1738189114" ; signature is expected to be 7 or more characters. [Constants] ; new packet serial format with CRC @@ -77,7 +77,7 @@ enable2ndByteCanID = false ; see PAGE_0_SIZE in C source code ; CONFIG_DEFINITION_START -; this section was generated automatically by rusEfi tool ConfigDefinition.jar based on hellen_cypress_gen_config.bat integration/rusefi_config.txt Sat Dec 26 21:18:00 UTC 2020 +; this section was generated automatically by rusEfi tool ConfigDefinition.jar based on hellen_cypress_gen_config.bat integration/rusefi_config.txt Wed Dec 30 13:37:33 UTC 2020 pageSize = 20000 page = 1 @@ -1336,6 +1336,7 @@ page = 1 acIdleExtraMin = "Additional idle PID minValue while A/C is active" acFanPin = "Optional Radiator Fan used with A/C" sdCardPeriodMs = "SD card logging period, in milliseconds" + idlePidDeactivationTpsThreshold = "Below this throttle position, the engine is considered idling." triggerErrorPin = "This pin is used for debugging - snap a logic analyzer on it and see if it's ever high" cdmInputPin = "Saab Combustion Detection Module knock signal input pin\nalso known as Saab Ion Sensing Module" sensorChartMode = "rusEfi console Sensor Sniffer mode" @@ -2796,16 +2797,16 @@ menuDialog = main menu = "&Idle" subMenu = idleSettings, "Idle settings" subMenu = idlehw, "Idle hardware" - subMenu = std_separator - subMenu = cltIdleRPMCurve, "Target RPM", 0, {idleMode == 0} + subMenu = std_separator + subMenu = cltIdleRPMCurve, "Target RPM" + subMenu = cltIdleCurve, "CLT multiplier" + subMenu = std_separator + subMenu = idleTimingPidCorrDialog, "Closed-loop idle timing" subMenu = iacPidMultTbl, "IAC PID Multiplier", 0, {idleMode == 0 && useIacPidMultTable == 1} + subMenu = iacCoastingCurve, "Coasting IAC Position for Auto-Idle", 0, {useIacTableForCoasting == 1} subMenu = std_separator subMenu = idleVeCurve, "VE", 0, {useSeparateVeForIdle == 1} subMenu = idleAdvanceCurve, "Ignition advance", 0, {useSeparateAdvanceForIdle == 1} - subMenu = std_separator - subMenu = idleTimingPidCorrDialog, "Closed-loop idle timing" - subMenu = cltIdleCurve, "CLT multiplier" - subMenu = iacCoastingCurve, "Coasting IAC Position for Auto-Idle", 0, {useIacTableForCoasting == 1} menu = "&Advanced" subMenu = boostDialog, "Boost Control" @@ -3879,11 +3880,11 @@ cmd_set_engine_type_default = "Z\x00\x31\x00\x00" field = "!ECU reboot needed to apply these settings" field = "Use Stepper", useStepperIdle field = "Double Solenoid Mode", isDoubleSolenoidIdle + field = "Use electronic throttle for idle", useETBforIdleControl, { throttlePedalPositionAdcChannel != 0 } + field = "Electronic throttle idle range", etbIdleThrottleRange, { useETBforIdleControl == 1 } panel = idleHwType - dialog = idlePidSettings, "PID IAC Control" - field = "#See Idle Target RPM Curve" - field = "use Cic Pid", useCicPidForIdle + dialog = idlePidSettings, "Closed Loop Idle" field = "P-factor", idleRpmPid_pFactor field = "I-factor", idleRpmPid_iFactor field = "derivativeFilterLoss", idle_derivativeFilterLoss @@ -3896,43 +3897,48 @@ cmd_set_engine_type_default = "Z\x00\x31\x00\x00" field = "Max", idleRpmPid_maxValue field = "iTerm Min", idlerpmpid_iTermMin field = "iTerm Max", idlerpmpid_iTermMax - field = "RPM dead zone to deactivate IAC pid", idlePidRpmDeadZone - field = "RPM upper limit to deactivate IAC pid",idlePidRpmUpperLimit field = "PID Extra for low RPM", pidExtraForLowRpm - field = "Use IAC PID Multiplier Table", useIacPidMultTable - - - dialog = idleSettings, "", yAxis - field = "Idle IAC control mode", idleMode - field = useInstantRpmForIdle, useInstantRpmForIdle - field = "use ETB for idle", useETBforIdleControl, { throttlePedalPositionAdcChannel != 0 } - field = "ETB Idle range", etbIdleThrottleRange, {useETBforIdleControl == 1} - field = "Use separate Ignition Table for idle", useSeparateAdvanceForIdle - field = "Use separate VE Table for idle", useSeparateVeForIdle - field = "Use separate IAC Table For Coasting", useIacTableForCoasting, {idleMode == 0} field = idleIncrementalPidCic, idleIncrementalPidCic - field = "TPS deactivation threshold", idlePidDeactivationTpsThreshold + field = "use Cic Pid", useCicPidForIdle + field = "Use IAC PID Multiplier Table", useIacPidMultTable + + dialog = idleGating, "Idle Detection Thresholds" + field = "TPS threshold", idlePidDeactivationTpsThreshold + field = "RPM upper limit", idlePidRpmUpperLimit + field = "RPM dead zone", idlePidRpmDeadZone + + dialog = idleExtra, "Extra Idle Features" + field = "Extra idle air if throttle pressed", iacByTpsTaper + field = "Use idle ignition table", useSeparateAdvanceForIdle + field = "Use idle VE table", useSeparateVeForIdle + field = "Use coasting idle table", useIacTableForCoasting, {idleMode == 0} + field = useInstantRpmForIdle, useInstantRpmForIdle + field = "Detailed status in console", isVerboseIAC + + dialog = idleSettings, "", yAxis + field = "Idle control mode", idleMode + + field = "! Solenoid idle control requires above zero RPM" + slider = "Open loop idle position", manIdlePosition, horizontal + field = "" + + panel = idleGating, "" panel = idlePidSettings, { idleMode == 0} - field = "Extra IAC if Throttle Pressed", iacByTpsTaper; - field = "Detailed status in console", isVerboseIAC - field = "#See Warmup idle multiplier" - field = "! Solenoid Idle control requires above zero RPM" - slider = "Manual IAC Position", manIdlePosition, horizontal + panel = idleExtra dialog = idleTimingPidCorrDialog, "", yAxis - field = "!This timing correction mode is Alpha Version" - field = "Use Auto-PID ignition advance control", useIdleTimingPidControl - field = "#See Idle Target RPM Curve" - field = "P-factor", idleTimingPid_pFactor, {useIdleTimingPidControl == 1} - field = "I-factor", idleTimingPid_iFactor, {useIdleTimingPidControl == 1} - field = "D-factor", idleTimingPid_dFactor, {useIdleTimingPidControl == 1} - field = "Offset", idleTimingPid_offset, {useIdleTimingPidControl == 1} - field = "Min Delta", idleTimingPid_minValue, {useIdleTimingPidControl == 1} - field = "Max Delta", idleTimingPid_maxValue, {useIdleTimingPidControl == 1} - field = "#See RPM dead zone to deactivate IAC pid" - field = "RPM working zone for timing pid", idleTimingPidWorkZone, {useIdleTimingPidControl == 1} - field = "RPM working zone falloff", idlePidFalloffDeltaRpm, {useIdleTimingPidControl == 1} - field = "RPM dead zone to deactivate timing pid", idleTimingPidDeadZone, {useIdleTimingPidControl == 1} + field = "" + field = "Enable closed loop idle ignition timing", useIdleTimingPidControl + field = "" + field = "#Gain is in degrees advance per rpm away from target" + field = "#A good starting point is 0.1 = 10 deg per 100 rpm" + field = "Proportional gain", idleTimingPid_pFactor, {useIdleTimingPidControl == 1} + field = "Derivative gain", idleTimingPid_dFactor, {useIdleTimingPidControl == 1} + field = "" + field = "Min adjustment (retard)", idleTimingPid_minValue, {useIdleTimingPidControl == 1} + field = "Max adjustment (advance)", idleTimingPid_maxValue, {useIdleTimingPidControl == 1} + field = "" + field = "#Use debug mode 'Timing' to view idle timing adjustment" ; Engine->Fan Settings dialog = fanSetting, "Fan Settings" diff --git a/firmware/tunerstudio/generated/rusefi_kinetis.ini b/firmware/tunerstudio/generated/rusefi_kinetis.ini index b0bd27c91d..26ee43583e 100644 --- a/firmware/tunerstudio/generated/rusefi_kinetis.ini +++ b/firmware/tunerstudio/generated/rusefi_kinetis.ini @@ -33,12 +33,12 @@ enable2ndByteCanID = false [MegaTune] ; https://rusefi.com/forum/viewtopic.php?p=36201#p36201 - signature = "rusEFI 2020.12.26.kin.2533413682" + signature = "rusEFI 2020.12.30.kin.914789312" [TunerStudio] queryCommand = "S" versionInfo = "V" ; firmwave version for title bar. - signature = "rusEFI 2020.12.26.kin.2533413682" ; signature is expected to be 7 or more characters. + signature = "rusEFI 2020.12.30.kin.914789312" ; signature is expected to be 7 or more characters. [Constants] ; new packet serial format with CRC @@ -77,7 +77,7 @@ enable2ndByteCanID = false ; see PAGE_0_SIZE in C source code ; CONFIG_DEFINITION_START -; this section was generated automatically by rusEfi tool ConfigDefinition.jar based on kinetis_gen_config.bat integration/rusefi_config.txt Sat Dec 26 21:17:51 UTC 2020 +; this section was generated automatically by rusEfi tool ConfigDefinition.jar based on kinetis_gen_config.bat integration/rusefi_config.txt Wed Dec 30 13:37:29 UTC 2020 pageSize = 20000 page = 1 @@ -1336,6 +1336,7 @@ page = 1 acIdleExtraMin = "Additional idle PID minValue while A/C is active" acFanPin = "Optional Radiator Fan used with A/C" sdCardPeriodMs = "SD card logging period, in milliseconds" + idlePidDeactivationTpsThreshold = "Below this throttle position, the engine is considered idling." triggerErrorPin = "This pin is used for debugging - snap a logic analyzer on it and see if it's ever high" cdmInputPin = "Saab Combustion Detection Module knock signal input pin\nalso known as Saab Ion Sensing Module" sensorChartMode = "rusEfi console Sensor Sniffer mode" @@ -2796,16 +2797,16 @@ menuDialog = main menu = "&Idle" subMenu = idleSettings, "Idle settings" subMenu = idlehw, "Idle hardware" - subMenu = std_separator - subMenu = cltIdleRPMCurve, "Target RPM", 0, {idleMode == 0} + subMenu = std_separator + subMenu = cltIdleRPMCurve, "Target RPM" + subMenu = cltIdleCurve, "CLT multiplier" + subMenu = std_separator + subMenu = idleTimingPidCorrDialog, "Closed-loop idle timing" subMenu = iacPidMultTbl, "IAC PID Multiplier", 0, {idleMode == 0 && useIacPidMultTable == 1} + subMenu = iacCoastingCurve, "Coasting IAC Position for Auto-Idle", 0, {useIacTableForCoasting == 1} subMenu = std_separator subMenu = idleVeCurve, "VE", 0, {useSeparateVeForIdle == 1} subMenu = idleAdvanceCurve, "Ignition advance", 0, {useSeparateAdvanceForIdle == 1} - subMenu = std_separator - subMenu = idleTimingPidCorrDialog, "Closed-loop idle timing" - subMenu = cltIdleCurve, "CLT multiplier" - subMenu = iacCoastingCurve, "Coasting IAC Position for Auto-Idle", 0, {useIacTableForCoasting == 1} menu = "&Advanced" subMenu = boostDialog, "Boost Control" @@ -3880,11 +3881,11 @@ cmd_set_engine_type_default = "Z\x00\x31\x00\x00" field = "!ECU reboot needed to apply these settings" field = "Use Stepper", useStepperIdle field = "Double Solenoid Mode", isDoubleSolenoidIdle + field = "Use electronic throttle for idle", useETBforIdleControl, { throttlePedalPositionAdcChannel != 0 } + field = "Electronic throttle idle range", etbIdleThrottleRange, { useETBforIdleControl == 1 } panel = idleHwType - dialog = idlePidSettings, "PID IAC Control" - field = "#See Idle Target RPM Curve" - field = "use Cic Pid", useCicPidForIdle + dialog = idlePidSettings, "Closed Loop Idle" field = "P-factor", idleRpmPid_pFactor field = "I-factor", idleRpmPid_iFactor field = "derivativeFilterLoss", idle_derivativeFilterLoss @@ -3897,43 +3898,48 @@ cmd_set_engine_type_default = "Z\x00\x31\x00\x00" field = "Max", idleRpmPid_maxValue field = "iTerm Min", idlerpmpid_iTermMin field = "iTerm Max", idlerpmpid_iTermMax - field = "RPM dead zone to deactivate IAC pid", idlePidRpmDeadZone - field = "RPM upper limit to deactivate IAC pid",idlePidRpmUpperLimit field = "PID Extra for low RPM", pidExtraForLowRpm - field = "Use IAC PID Multiplier Table", useIacPidMultTable - - - dialog = idleSettings, "", yAxis - field = "Idle IAC control mode", idleMode - field = useInstantRpmForIdle, useInstantRpmForIdle - field = "use ETB for idle", useETBforIdleControl, { throttlePedalPositionAdcChannel != 0 } - field = "ETB Idle range", etbIdleThrottleRange, {useETBforIdleControl == 1} - field = "Use separate Ignition Table for idle", useSeparateAdvanceForIdle - field = "Use separate VE Table for idle", useSeparateVeForIdle - field = "Use separate IAC Table For Coasting", useIacTableForCoasting, {idleMode == 0} field = idleIncrementalPidCic, idleIncrementalPidCic - field = "TPS deactivation threshold", idlePidDeactivationTpsThreshold + field = "use Cic Pid", useCicPidForIdle + field = "Use IAC PID Multiplier Table", useIacPidMultTable + + dialog = idleGating, "Idle Detection Thresholds" + field = "TPS threshold", idlePidDeactivationTpsThreshold + field = "RPM upper limit", idlePidRpmUpperLimit + field = "RPM dead zone", idlePidRpmDeadZone + + dialog = idleExtra, "Extra Idle Features" + field = "Extra idle air if throttle pressed", iacByTpsTaper + field = "Use idle ignition table", useSeparateAdvanceForIdle + field = "Use idle VE table", useSeparateVeForIdle + field = "Use coasting idle table", useIacTableForCoasting, {idleMode == 0} + field = useInstantRpmForIdle, useInstantRpmForIdle + field = "Detailed status in console", isVerboseIAC + + dialog = idleSettings, "", yAxis + field = "Idle control mode", idleMode + + field = "! Solenoid idle control requires above zero RPM" + slider = "Open loop idle position", manIdlePosition, horizontal + field = "" + + panel = idleGating, "" panel = idlePidSettings, { idleMode == 0} - field = "Extra IAC if Throttle Pressed", iacByTpsTaper; - field = "Detailed status in console", isVerboseIAC - field = "#See Warmup idle multiplier" - field = "! Solenoid Idle control requires above zero RPM" - slider = "Manual IAC Position", manIdlePosition, horizontal + panel = idleExtra dialog = idleTimingPidCorrDialog, "", yAxis - field = "!This timing correction mode is Alpha Version" - field = "Use Auto-PID ignition advance control", useIdleTimingPidControl - field = "#See Idle Target RPM Curve" - field = "P-factor", idleTimingPid_pFactor, {useIdleTimingPidControl == 1} - field = "I-factor", idleTimingPid_iFactor, {useIdleTimingPidControl == 1} - field = "D-factor", idleTimingPid_dFactor, {useIdleTimingPidControl == 1} - field = "Offset", idleTimingPid_offset, {useIdleTimingPidControl == 1} - field = "Min Delta", idleTimingPid_minValue, {useIdleTimingPidControl == 1} - field = "Max Delta", idleTimingPid_maxValue, {useIdleTimingPidControl == 1} - field = "#See RPM dead zone to deactivate IAC pid" - field = "RPM working zone for timing pid", idleTimingPidWorkZone, {useIdleTimingPidControl == 1} - field = "RPM working zone falloff", idlePidFalloffDeltaRpm, {useIdleTimingPidControl == 1} - field = "RPM dead zone to deactivate timing pid", idleTimingPidDeadZone, {useIdleTimingPidControl == 1} + field = "" + field = "Enable closed loop idle ignition timing", useIdleTimingPidControl + field = "" + field = "#Gain is in degrees advance per rpm away from target" + field = "#A good starting point is 0.1 = 10 deg per 100 rpm" + field = "Proportional gain", idleTimingPid_pFactor, {useIdleTimingPidControl == 1} + field = "Derivative gain", idleTimingPid_dFactor, {useIdleTimingPidControl == 1} + field = "" + field = "Min adjustment (retard)", idleTimingPid_minValue, {useIdleTimingPidControl == 1} + field = "Max adjustment (advance)", idleTimingPid_maxValue, {useIdleTimingPidControl == 1} + field = "" + field = "#Use debug mode 'Timing' to view idle timing adjustment" ; Engine->Fan Settings dialog = fanSetting, "Fan Settings" diff --git a/firmware/tunerstudio/generated/rusefi_mre_f4.ini b/firmware/tunerstudio/generated/rusefi_mre_f4.ini index e521d8cdda..4ce372741b 100644 --- a/firmware/tunerstudio/generated/rusefi_mre_f4.ini +++ b/firmware/tunerstudio/generated/rusefi_mre_f4.ini @@ -33,12 +33,12 @@ enable2ndByteCanID = false [MegaTune] ; https://rusefi.com/forum/viewtopic.php?p=36201#p36201 - signature = "rusEFI 2020.12.26.mre_f4.406688114" + signature = "rusEFI 2020.12.30.mre_f4.3116093824" [TunerStudio] queryCommand = "S" versionInfo = "V" ; firmwave version for title bar. - signature = "rusEFI 2020.12.26.mre_f4.406688114" ; signature is expected to be 7 or more characters. + signature = "rusEFI 2020.12.30.mre_f4.3116093824" ; signature is expected to be 7 or more characters. [Constants] ; new packet serial format with CRC @@ -77,7 +77,7 @@ enable2ndByteCanID = false ; see PAGE_0_SIZE in C source code ; CONFIG_DEFINITION_START -; this section was generated automatically by rusEfi tool ConfigDefinition.jar based on gen_config.sh integration/rusefi_config.txt Sat Dec 26 21:17:41 UTC 2020 +; this section was generated automatically by rusEfi tool ConfigDefinition.jar based on gen_config.sh integration/rusefi_config.txt Wed Dec 30 13:37:17 UTC 2020 pageSize = 20000 page = 1 @@ -1336,6 +1336,7 @@ page = 1 acIdleExtraMin = "Additional idle PID minValue while A/C is active" acFanPin = "Optional Radiator Fan used with A/C" sdCardPeriodMs = "SD card logging period, in milliseconds" + idlePidDeactivationTpsThreshold = "Below this throttle position, the engine is considered idling." triggerErrorPin = "This pin is used for debugging - snap a logic analyzer on it and see if it's ever high" cdmInputPin = "Saab Combustion Detection Module knock signal input pin\nalso known as Saab Ion Sensing Module" sensorChartMode = "rusEfi console Sensor Sniffer mode" @@ -2796,16 +2797,16 @@ menuDialog = main menu = "&Idle" subMenu = idleSettings, "Idle settings" subMenu = idlehw, "Idle hardware" - subMenu = std_separator - subMenu = cltIdleRPMCurve, "Target RPM", 0, {idleMode == 0} + subMenu = std_separator + subMenu = cltIdleRPMCurve, "Target RPM" + subMenu = cltIdleCurve, "CLT multiplier" + subMenu = std_separator + subMenu = idleTimingPidCorrDialog, "Closed-loop idle timing" subMenu = iacPidMultTbl, "IAC PID Multiplier", 0, {idleMode == 0 && useIacPidMultTable == 1} + subMenu = iacCoastingCurve, "Coasting IAC Position for Auto-Idle", 0, {useIacTableForCoasting == 1} subMenu = std_separator subMenu = idleVeCurve, "VE", 0, {useSeparateVeForIdle == 1} subMenu = idleAdvanceCurve, "Ignition advance", 0, {useSeparateAdvanceForIdle == 1} - subMenu = std_separator - subMenu = idleTimingPidCorrDialog, "Closed-loop idle timing" - subMenu = cltIdleCurve, "CLT multiplier" - subMenu = iacCoastingCurve, "Coasting IAC Position for Auto-Idle", 0, {useIacTableForCoasting == 1} menu = "&Advanced" subMenu = boostDialog, "Boost Control" @@ -3863,11 +3864,11 @@ cmd_set_engine_type_default = "Z\x00\x31\x00\x00" field = "!ECU reboot needed to apply these settings" field = "Use Stepper", useStepperIdle field = "Double Solenoid Mode", isDoubleSolenoidIdle + field = "Use electronic throttle for idle", useETBforIdleControl, { throttlePedalPositionAdcChannel != 0 } + field = "Electronic throttle idle range", etbIdleThrottleRange, { useETBforIdleControl == 1 } panel = idleHwType - dialog = idlePidSettings, "PID IAC Control" - field = "#See Idle Target RPM Curve" - field = "use Cic Pid", useCicPidForIdle + dialog = idlePidSettings, "Closed Loop Idle" field = "P-factor", idleRpmPid_pFactor field = "I-factor", idleRpmPid_iFactor field = "derivativeFilterLoss", idle_derivativeFilterLoss @@ -3880,43 +3881,48 @@ cmd_set_engine_type_default = "Z\x00\x31\x00\x00" field = "Max", idleRpmPid_maxValue field = "iTerm Min", idlerpmpid_iTermMin field = "iTerm Max", idlerpmpid_iTermMax - field = "RPM dead zone to deactivate IAC pid", idlePidRpmDeadZone - field = "RPM upper limit to deactivate IAC pid",idlePidRpmUpperLimit field = "PID Extra for low RPM", pidExtraForLowRpm - field = "Use IAC PID Multiplier Table", useIacPidMultTable - - - dialog = idleSettings, "", yAxis - field = "Idle IAC control mode", idleMode - field = useInstantRpmForIdle, useInstantRpmForIdle - field = "use ETB for idle", useETBforIdleControl, { throttlePedalPositionAdcChannel != 0 } - field = "ETB Idle range", etbIdleThrottleRange, {useETBforIdleControl == 1} - field = "Use separate Ignition Table for idle", useSeparateAdvanceForIdle - field = "Use separate VE Table for idle", useSeparateVeForIdle - field = "Use separate IAC Table For Coasting", useIacTableForCoasting, {idleMode == 0} field = idleIncrementalPidCic, idleIncrementalPidCic - field = "TPS deactivation threshold", idlePidDeactivationTpsThreshold + field = "use Cic Pid", useCicPidForIdle + field = "Use IAC PID Multiplier Table", useIacPidMultTable + + dialog = idleGating, "Idle Detection Thresholds" + field = "TPS threshold", idlePidDeactivationTpsThreshold + field = "RPM upper limit", idlePidRpmUpperLimit + field = "RPM dead zone", idlePidRpmDeadZone + + dialog = idleExtra, "Extra Idle Features" + field = "Extra idle air if throttle pressed", iacByTpsTaper + field = "Use idle ignition table", useSeparateAdvanceForIdle + field = "Use idle VE table", useSeparateVeForIdle + field = "Use coasting idle table", useIacTableForCoasting, {idleMode == 0} + field = useInstantRpmForIdle, useInstantRpmForIdle + field = "Detailed status in console", isVerboseIAC + + dialog = idleSettings, "", yAxis + field = "Idle control mode", idleMode + + field = "! Solenoid idle control requires above zero RPM" + slider = "Open loop idle position", manIdlePosition, horizontal + field = "" + + panel = idleGating, "" panel = idlePidSettings, { idleMode == 0} - field = "Extra IAC if Throttle Pressed", iacByTpsTaper; - field = "Detailed status in console", isVerboseIAC - field = "#See Warmup idle multiplier" - field = "! Solenoid Idle control requires above zero RPM" - slider = "Manual IAC Position", manIdlePosition, horizontal + panel = idleExtra dialog = idleTimingPidCorrDialog, "", yAxis - field = "!This timing correction mode is Alpha Version" - field = "Use Auto-PID ignition advance control", useIdleTimingPidControl - field = "#See Idle Target RPM Curve" - field = "P-factor", idleTimingPid_pFactor, {useIdleTimingPidControl == 1} - field = "I-factor", idleTimingPid_iFactor, {useIdleTimingPidControl == 1} - field = "D-factor", idleTimingPid_dFactor, {useIdleTimingPidControl == 1} - field = "Offset", idleTimingPid_offset, {useIdleTimingPidControl == 1} - field = "Min Delta", idleTimingPid_minValue, {useIdleTimingPidControl == 1} - field = "Max Delta", idleTimingPid_maxValue, {useIdleTimingPidControl == 1} - field = "#See RPM dead zone to deactivate IAC pid" - field = "RPM working zone for timing pid", idleTimingPidWorkZone, {useIdleTimingPidControl == 1} - field = "RPM working zone falloff", idlePidFalloffDeltaRpm, {useIdleTimingPidControl == 1} - field = "RPM dead zone to deactivate timing pid", idleTimingPidDeadZone, {useIdleTimingPidControl == 1} + field = "" + field = "Enable closed loop idle ignition timing", useIdleTimingPidControl + field = "" + field = "#Gain is in degrees advance per rpm away from target" + field = "#A good starting point is 0.1 = 10 deg per 100 rpm" + field = "Proportional gain", idleTimingPid_pFactor, {useIdleTimingPidControl == 1} + field = "Derivative gain", idleTimingPid_dFactor, {useIdleTimingPidControl == 1} + field = "" + field = "Min adjustment (retard)", idleTimingPid_minValue, {useIdleTimingPidControl == 1} + field = "Max adjustment (advance)", idleTimingPid_maxValue, {useIdleTimingPidControl == 1} + field = "" + field = "#Use debug mode 'Timing' to view idle timing adjustment" ; Engine->Fan Settings dialog = fanSetting, "Fan Settings" diff --git a/firmware/tunerstudio/generated/rusefi_mre_f7.ini b/firmware/tunerstudio/generated/rusefi_mre_f7.ini index 7c168e524d..7bd15d8223 100644 --- a/firmware/tunerstudio/generated/rusefi_mre_f7.ini +++ b/firmware/tunerstudio/generated/rusefi_mre_f7.ini @@ -33,12 +33,12 @@ enable2ndByteCanID = false [MegaTune] ; https://rusefi.com/forum/viewtopic.php?p=36201#p36201 - signature = "rusEFI 2020.12.26.mre_f7.406688114" + signature = "rusEFI 2020.12.30.mre_f7.3116093824" [TunerStudio] queryCommand = "S" versionInfo = "V" ; firmwave version for title bar. - signature = "rusEFI 2020.12.26.mre_f7.406688114" ; signature is expected to be 7 or more characters. + signature = "rusEFI 2020.12.30.mre_f7.3116093824" ; signature is expected to be 7 or more characters. [Constants] ; new packet serial format with CRC @@ -77,7 +77,7 @@ enable2ndByteCanID = false ; see PAGE_0_SIZE in C source code ; CONFIG_DEFINITION_START -; this section was generated automatically by rusEfi tool ConfigDefinition.jar based on gen_config.sh integration/rusefi_config.txt Sat Dec 26 21:17:39 UTC 2020 +; this section was generated automatically by rusEfi tool ConfigDefinition.jar based on gen_config.sh integration/rusefi_config.txt Wed Dec 30 13:37:15 UTC 2020 pageSize = 20000 page = 1 @@ -1336,6 +1336,7 @@ page = 1 acIdleExtraMin = "Additional idle PID minValue while A/C is active" acFanPin = "Optional Radiator Fan used with A/C" sdCardPeriodMs = "SD card logging period, in milliseconds" + idlePidDeactivationTpsThreshold = "Below this throttle position, the engine is considered idling." triggerErrorPin = "This pin is used for debugging - snap a logic analyzer on it and see if it's ever high" cdmInputPin = "Saab Combustion Detection Module knock signal input pin\nalso known as Saab Ion Sensing Module" sensorChartMode = "rusEfi console Sensor Sniffer mode" @@ -2796,16 +2797,16 @@ menuDialog = main menu = "&Idle" subMenu = idleSettings, "Idle settings" subMenu = idlehw, "Idle hardware" - subMenu = std_separator - subMenu = cltIdleRPMCurve, "Target RPM", 0, {idleMode == 0} + subMenu = std_separator + subMenu = cltIdleRPMCurve, "Target RPM" + subMenu = cltIdleCurve, "CLT multiplier" + subMenu = std_separator + subMenu = idleTimingPidCorrDialog, "Closed-loop idle timing" subMenu = iacPidMultTbl, "IAC PID Multiplier", 0, {idleMode == 0 && useIacPidMultTable == 1} + subMenu = iacCoastingCurve, "Coasting IAC Position for Auto-Idle", 0, {useIacTableForCoasting == 1} subMenu = std_separator subMenu = idleVeCurve, "VE", 0, {useSeparateVeForIdle == 1} subMenu = idleAdvanceCurve, "Ignition advance", 0, {useSeparateAdvanceForIdle == 1} - subMenu = std_separator - subMenu = idleTimingPidCorrDialog, "Closed-loop idle timing" - subMenu = cltIdleCurve, "CLT multiplier" - subMenu = iacCoastingCurve, "Coasting IAC Position for Auto-Idle", 0, {useIacTableForCoasting == 1} menu = "&Advanced" subMenu = boostDialog, "Boost Control" @@ -3863,11 +3864,11 @@ cmd_set_engine_type_default = "Z\x00\x31\x00\x00" field = "!ECU reboot needed to apply these settings" field = "Use Stepper", useStepperIdle field = "Double Solenoid Mode", isDoubleSolenoidIdle + field = "Use electronic throttle for idle", useETBforIdleControl, { throttlePedalPositionAdcChannel != 0 } + field = "Electronic throttle idle range", etbIdleThrottleRange, { useETBforIdleControl == 1 } panel = idleHwType - dialog = idlePidSettings, "PID IAC Control" - field = "#See Idle Target RPM Curve" - field = "use Cic Pid", useCicPidForIdle + dialog = idlePidSettings, "Closed Loop Idle" field = "P-factor", idleRpmPid_pFactor field = "I-factor", idleRpmPid_iFactor field = "derivativeFilterLoss", idle_derivativeFilterLoss @@ -3880,43 +3881,48 @@ cmd_set_engine_type_default = "Z\x00\x31\x00\x00" field = "Max", idleRpmPid_maxValue field = "iTerm Min", idlerpmpid_iTermMin field = "iTerm Max", idlerpmpid_iTermMax - field = "RPM dead zone to deactivate IAC pid", idlePidRpmDeadZone - field = "RPM upper limit to deactivate IAC pid",idlePidRpmUpperLimit field = "PID Extra for low RPM", pidExtraForLowRpm - field = "Use IAC PID Multiplier Table", useIacPidMultTable - - - dialog = idleSettings, "", yAxis - field = "Idle IAC control mode", idleMode - field = useInstantRpmForIdle, useInstantRpmForIdle - field = "use ETB for idle", useETBforIdleControl, { throttlePedalPositionAdcChannel != 0 } - field = "ETB Idle range", etbIdleThrottleRange, {useETBforIdleControl == 1} - field = "Use separate Ignition Table for idle", useSeparateAdvanceForIdle - field = "Use separate VE Table for idle", useSeparateVeForIdle - field = "Use separate IAC Table For Coasting", useIacTableForCoasting, {idleMode == 0} field = idleIncrementalPidCic, idleIncrementalPidCic - field = "TPS deactivation threshold", idlePidDeactivationTpsThreshold + field = "use Cic Pid", useCicPidForIdle + field = "Use IAC PID Multiplier Table", useIacPidMultTable + + dialog = idleGating, "Idle Detection Thresholds" + field = "TPS threshold", idlePidDeactivationTpsThreshold + field = "RPM upper limit", idlePidRpmUpperLimit + field = "RPM dead zone", idlePidRpmDeadZone + + dialog = idleExtra, "Extra Idle Features" + field = "Extra idle air if throttle pressed", iacByTpsTaper + field = "Use idle ignition table", useSeparateAdvanceForIdle + field = "Use idle VE table", useSeparateVeForIdle + field = "Use coasting idle table", useIacTableForCoasting, {idleMode == 0} + field = useInstantRpmForIdle, useInstantRpmForIdle + field = "Detailed status in console", isVerboseIAC + + dialog = idleSettings, "", yAxis + field = "Idle control mode", idleMode + + field = "! Solenoid idle control requires above zero RPM" + slider = "Open loop idle position", manIdlePosition, horizontal + field = "" + + panel = idleGating, "" panel = idlePidSettings, { idleMode == 0} - field = "Extra IAC if Throttle Pressed", iacByTpsTaper; - field = "Detailed status in console", isVerboseIAC - field = "#See Warmup idle multiplier" - field = "! Solenoid Idle control requires above zero RPM" - slider = "Manual IAC Position", manIdlePosition, horizontal + panel = idleExtra dialog = idleTimingPidCorrDialog, "", yAxis - field = "!This timing correction mode is Alpha Version" - field = "Use Auto-PID ignition advance control", useIdleTimingPidControl - field = "#See Idle Target RPM Curve" - field = "P-factor", idleTimingPid_pFactor, {useIdleTimingPidControl == 1} - field = "I-factor", idleTimingPid_iFactor, {useIdleTimingPidControl == 1} - field = "D-factor", idleTimingPid_dFactor, {useIdleTimingPidControl == 1} - field = "Offset", idleTimingPid_offset, {useIdleTimingPidControl == 1} - field = "Min Delta", idleTimingPid_minValue, {useIdleTimingPidControl == 1} - field = "Max Delta", idleTimingPid_maxValue, {useIdleTimingPidControl == 1} - field = "#See RPM dead zone to deactivate IAC pid" - field = "RPM working zone for timing pid", idleTimingPidWorkZone, {useIdleTimingPidControl == 1} - field = "RPM working zone falloff", idlePidFalloffDeltaRpm, {useIdleTimingPidControl == 1} - field = "RPM dead zone to deactivate timing pid", idleTimingPidDeadZone, {useIdleTimingPidControl == 1} + field = "" + field = "Enable closed loop idle ignition timing", useIdleTimingPidControl + field = "" + field = "#Gain is in degrees advance per rpm away from target" + field = "#A good starting point is 0.1 = 10 deg per 100 rpm" + field = "Proportional gain", idleTimingPid_pFactor, {useIdleTimingPidControl == 1} + field = "Derivative gain", idleTimingPid_dFactor, {useIdleTimingPidControl == 1} + field = "" + field = "Min adjustment (retard)", idleTimingPid_minValue, {useIdleTimingPidControl == 1} + field = "Max adjustment (advance)", idleTimingPid_maxValue, {useIdleTimingPidControl == 1} + field = "" + field = "#Use debug mode 'Timing' to view idle timing adjustment" ; Engine->Fan Settings dialog = fanSetting, "Fan Settings" diff --git a/firmware/tunerstudio/generated/rusefi_prometheus_405.ini b/firmware/tunerstudio/generated/rusefi_prometheus_405.ini index 8dd83cf55f..c3ad843c32 100644 --- a/firmware/tunerstudio/generated/rusefi_prometheus_405.ini +++ b/firmware/tunerstudio/generated/rusefi_prometheus_405.ini @@ -33,12 +33,12 @@ enable2ndByteCanID = false [MegaTune] ; https://rusefi.com/forum/viewtopic.php?p=36201#p36201 - signature = "rusEFI 2020.12.26.prometheus_405.1295337818" + signature = "rusEFI 2020.12.30.prometheus_405.3971156392" [TunerStudio] queryCommand = "S" versionInfo = "V" ; firmwave version for title bar. - signature = "rusEFI 2020.12.26.prometheus_405.1295337818" ; signature is expected to be 7 or more characters. + signature = "rusEFI 2020.12.30.prometheus_405.3971156392" ; signature is expected to be 7 or more characters. [Constants] ; new packet serial format with CRC @@ -77,7 +77,7 @@ enable2ndByteCanID = false ; see PAGE_0_SIZE in C source code ; CONFIG_DEFINITION_START -; this section was generated automatically by rusEfi tool ConfigDefinition.jar based on gen_config.sh integration/rusefi_config.txt Sat Dec 26 21:17:46 UTC 2020 +; this section was generated automatically by rusEfi tool ConfigDefinition.jar based on gen_config.sh integration/rusefi_config.txt Wed Dec 30 13:37:23 UTC 2020 pageSize = 20000 page = 1 @@ -1336,6 +1336,7 @@ page = 1 acIdleExtraMin = "Additional idle PID minValue while A/C is active" acFanPin = "Optional Radiator Fan used with A/C" sdCardPeriodMs = "SD card logging period, in milliseconds" + idlePidDeactivationTpsThreshold = "Below this throttle position, the engine is considered idling." triggerErrorPin = "This pin is used for debugging - snap a logic analyzer on it and see if it's ever high" cdmInputPin = "Saab Combustion Detection Module knock signal input pin\nalso known as Saab Ion Sensing Module" sensorChartMode = "rusEfi console Sensor Sniffer mode" @@ -2796,16 +2797,16 @@ menuDialog = main menu = "&Idle" subMenu = idleSettings, "Idle settings" subMenu = idlehw, "Idle hardware" - subMenu = std_separator - subMenu = cltIdleRPMCurve, "Target RPM", 0, {idleMode == 0} + subMenu = std_separator + subMenu = cltIdleRPMCurve, "Target RPM" + subMenu = cltIdleCurve, "CLT multiplier" + subMenu = std_separator + subMenu = idleTimingPidCorrDialog, "Closed-loop idle timing" subMenu = iacPidMultTbl, "IAC PID Multiplier", 0, {idleMode == 0 && useIacPidMultTable == 1} + subMenu = iacCoastingCurve, "Coasting IAC Position for Auto-Idle", 0, {useIacTableForCoasting == 1} subMenu = std_separator subMenu = idleVeCurve, "VE", 0, {useSeparateVeForIdle == 1} subMenu = idleAdvanceCurve, "Ignition advance", 0, {useSeparateAdvanceForIdle == 1} - subMenu = std_separator - subMenu = idleTimingPidCorrDialog, "Closed-loop idle timing" - subMenu = cltIdleCurve, "CLT multiplier" - subMenu = iacCoastingCurve, "Coasting IAC Position for Auto-Idle", 0, {useIacTableForCoasting == 1} menu = "&Advanced" subMenu = boostDialog, "Boost Control" @@ -3875,11 +3876,11 @@ cmd_set_engine_type_default = "Z\x00\x31\x00\x00" field = "!ECU reboot needed to apply these settings" field = "Use Stepper", useStepperIdle field = "Double Solenoid Mode", isDoubleSolenoidIdle + field = "Use electronic throttle for idle", useETBforIdleControl, { throttlePedalPositionAdcChannel != 0 } + field = "Electronic throttle idle range", etbIdleThrottleRange, { useETBforIdleControl == 1 } panel = idleHwType - dialog = idlePidSettings, "PID IAC Control" - field = "#See Idle Target RPM Curve" - field = "use Cic Pid", useCicPidForIdle + dialog = idlePidSettings, "Closed Loop Idle" field = "P-factor", idleRpmPid_pFactor field = "I-factor", idleRpmPid_iFactor field = "derivativeFilterLoss", idle_derivativeFilterLoss @@ -3892,43 +3893,48 @@ cmd_set_engine_type_default = "Z\x00\x31\x00\x00" field = "Max", idleRpmPid_maxValue field = "iTerm Min", idlerpmpid_iTermMin field = "iTerm Max", idlerpmpid_iTermMax - field = "RPM dead zone to deactivate IAC pid", idlePidRpmDeadZone - field = "RPM upper limit to deactivate IAC pid",idlePidRpmUpperLimit field = "PID Extra for low RPM", pidExtraForLowRpm - field = "Use IAC PID Multiplier Table", useIacPidMultTable - - - dialog = idleSettings, "", yAxis - field = "Idle IAC control mode", idleMode - field = useInstantRpmForIdle, useInstantRpmForIdle - field = "use ETB for idle", useETBforIdleControl, { throttlePedalPositionAdcChannel != 0 } - field = "ETB Idle range", etbIdleThrottleRange, {useETBforIdleControl == 1} - field = "Use separate Ignition Table for idle", useSeparateAdvanceForIdle - field = "Use separate VE Table for idle", useSeparateVeForIdle - field = "Use separate IAC Table For Coasting", useIacTableForCoasting, {idleMode == 0} field = idleIncrementalPidCic, idleIncrementalPidCic - field = "TPS deactivation threshold", idlePidDeactivationTpsThreshold + field = "use Cic Pid", useCicPidForIdle + field = "Use IAC PID Multiplier Table", useIacPidMultTable + + dialog = idleGating, "Idle Detection Thresholds" + field = "TPS threshold", idlePidDeactivationTpsThreshold + field = "RPM upper limit", idlePidRpmUpperLimit + field = "RPM dead zone", idlePidRpmDeadZone + + dialog = idleExtra, "Extra Idle Features" + field = "Extra idle air if throttle pressed", iacByTpsTaper + field = "Use idle ignition table", useSeparateAdvanceForIdle + field = "Use idle VE table", useSeparateVeForIdle + field = "Use coasting idle table", useIacTableForCoasting, {idleMode == 0} + field = useInstantRpmForIdle, useInstantRpmForIdle + field = "Detailed status in console", isVerboseIAC + + dialog = idleSettings, "", yAxis + field = "Idle control mode", idleMode + + field = "! Solenoid idle control requires above zero RPM" + slider = "Open loop idle position", manIdlePosition, horizontal + field = "" + + panel = idleGating, "" panel = idlePidSettings, { idleMode == 0} - field = "Extra IAC if Throttle Pressed", iacByTpsTaper; - field = "Detailed status in console", isVerboseIAC - field = "#See Warmup idle multiplier" - field = "! Solenoid Idle control requires above zero RPM" - slider = "Manual IAC Position", manIdlePosition, horizontal + panel = idleExtra dialog = idleTimingPidCorrDialog, "", yAxis - field = "!This timing correction mode is Alpha Version" - field = "Use Auto-PID ignition advance control", useIdleTimingPidControl - field = "#See Idle Target RPM Curve" - field = "P-factor", idleTimingPid_pFactor, {useIdleTimingPidControl == 1} - field = "I-factor", idleTimingPid_iFactor, {useIdleTimingPidControl == 1} - field = "D-factor", idleTimingPid_dFactor, {useIdleTimingPidControl == 1} - field = "Offset", idleTimingPid_offset, {useIdleTimingPidControl == 1} - field = "Min Delta", idleTimingPid_minValue, {useIdleTimingPidControl == 1} - field = "Max Delta", idleTimingPid_maxValue, {useIdleTimingPidControl == 1} - field = "#See RPM dead zone to deactivate IAC pid" - field = "RPM working zone for timing pid", idleTimingPidWorkZone, {useIdleTimingPidControl == 1} - field = "RPM working zone falloff", idlePidFalloffDeltaRpm, {useIdleTimingPidControl == 1} - field = "RPM dead zone to deactivate timing pid", idleTimingPidDeadZone, {useIdleTimingPidControl == 1} + field = "" + field = "Enable closed loop idle ignition timing", useIdleTimingPidControl + field = "" + field = "#Gain is in degrees advance per rpm away from target" + field = "#A good starting point is 0.1 = 10 deg per 100 rpm" + field = "Proportional gain", idleTimingPid_pFactor, {useIdleTimingPidControl == 1} + field = "Derivative gain", idleTimingPid_dFactor, {useIdleTimingPidControl == 1} + field = "" + field = "Min adjustment (retard)", idleTimingPid_minValue, {useIdleTimingPidControl == 1} + field = "Max adjustment (advance)", idleTimingPid_maxValue, {useIdleTimingPidControl == 1} + field = "" + field = "#Use debug mode 'Timing' to view idle timing adjustment" ; Engine->Fan Settings dialog = fanSetting, "Fan Settings" diff --git a/firmware/tunerstudio/generated/rusefi_prometheus_469.ini b/firmware/tunerstudio/generated/rusefi_prometheus_469.ini index 4e106b5f66..1d51e0e6bc 100644 --- a/firmware/tunerstudio/generated/rusefi_prometheus_469.ini +++ b/firmware/tunerstudio/generated/rusefi_prometheus_469.ini @@ -33,12 +33,12 @@ enable2ndByteCanID = false [MegaTune] ; https://rusefi.com/forum/viewtopic.php?p=36201#p36201 - signature = "rusEFI 2020.12.26.prometheus_469.1295337818" + signature = "rusEFI 2020.12.30.prometheus_469.3971156392" [TunerStudio] queryCommand = "S" versionInfo = "V" ; firmwave version for title bar. - signature = "rusEFI 2020.12.26.prometheus_469.1295337818" ; signature is expected to be 7 or more characters. + signature = "rusEFI 2020.12.30.prometheus_469.3971156392" ; signature is expected to be 7 or more characters. [Constants] ; new packet serial format with CRC @@ -77,7 +77,7 @@ enable2ndByteCanID = false ; see PAGE_0_SIZE in C source code ; CONFIG_DEFINITION_START -; this section was generated automatically by rusEfi tool ConfigDefinition.jar based on gen_config.sh integration/rusefi_config.txt Sat Dec 26 21:17:44 UTC 2020 +; this section was generated automatically by rusEfi tool ConfigDefinition.jar based on gen_config.sh integration/rusefi_config.txt Wed Dec 30 13:37:21 UTC 2020 pageSize = 20000 page = 1 @@ -1336,6 +1336,7 @@ page = 1 acIdleExtraMin = "Additional idle PID minValue while A/C is active" acFanPin = "Optional Radiator Fan used with A/C" sdCardPeriodMs = "SD card logging period, in milliseconds" + idlePidDeactivationTpsThreshold = "Below this throttle position, the engine is considered idling." triggerErrorPin = "This pin is used for debugging - snap a logic analyzer on it and see if it's ever high" cdmInputPin = "Saab Combustion Detection Module knock signal input pin\nalso known as Saab Ion Sensing Module" sensorChartMode = "rusEfi console Sensor Sniffer mode" @@ -2796,16 +2797,16 @@ menuDialog = main menu = "&Idle" subMenu = idleSettings, "Idle settings" subMenu = idlehw, "Idle hardware" - subMenu = std_separator - subMenu = cltIdleRPMCurve, "Target RPM", 0, {idleMode == 0} + subMenu = std_separator + subMenu = cltIdleRPMCurve, "Target RPM" + subMenu = cltIdleCurve, "CLT multiplier" + subMenu = std_separator + subMenu = idleTimingPidCorrDialog, "Closed-loop idle timing" subMenu = iacPidMultTbl, "IAC PID Multiplier", 0, {idleMode == 0 && useIacPidMultTable == 1} + subMenu = iacCoastingCurve, "Coasting IAC Position for Auto-Idle", 0, {useIacTableForCoasting == 1} subMenu = std_separator subMenu = idleVeCurve, "VE", 0, {useSeparateVeForIdle == 1} subMenu = idleAdvanceCurve, "Ignition advance", 0, {useSeparateAdvanceForIdle == 1} - subMenu = std_separator - subMenu = idleTimingPidCorrDialog, "Closed-loop idle timing" - subMenu = cltIdleCurve, "CLT multiplier" - subMenu = iacCoastingCurve, "Coasting IAC Position for Auto-Idle", 0, {useIacTableForCoasting == 1} menu = "&Advanced" subMenu = boostDialog, "Boost Control" @@ -3875,11 +3876,11 @@ cmd_set_engine_type_default = "Z\x00\x31\x00\x00" field = "!ECU reboot needed to apply these settings" field = "Use Stepper", useStepperIdle field = "Double Solenoid Mode", isDoubleSolenoidIdle + field = "Use electronic throttle for idle", useETBforIdleControl, { throttlePedalPositionAdcChannel != 0 } + field = "Electronic throttle idle range", etbIdleThrottleRange, { useETBforIdleControl == 1 } panel = idleHwType - dialog = idlePidSettings, "PID IAC Control" - field = "#See Idle Target RPM Curve" - field = "use Cic Pid", useCicPidForIdle + dialog = idlePidSettings, "Closed Loop Idle" field = "P-factor", idleRpmPid_pFactor field = "I-factor", idleRpmPid_iFactor field = "derivativeFilterLoss", idle_derivativeFilterLoss @@ -3892,43 +3893,48 @@ cmd_set_engine_type_default = "Z\x00\x31\x00\x00" field = "Max", idleRpmPid_maxValue field = "iTerm Min", idlerpmpid_iTermMin field = "iTerm Max", idlerpmpid_iTermMax - field = "RPM dead zone to deactivate IAC pid", idlePidRpmDeadZone - field = "RPM upper limit to deactivate IAC pid",idlePidRpmUpperLimit field = "PID Extra for low RPM", pidExtraForLowRpm - field = "Use IAC PID Multiplier Table", useIacPidMultTable - - - dialog = idleSettings, "", yAxis - field = "Idle IAC control mode", idleMode - field = useInstantRpmForIdle, useInstantRpmForIdle - field = "use ETB for idle", useETBforIdleControl, { throttlePedalPositionAdcChannel != 0 } - field = "ETB Idle range", etbIdleThrottleRange, {useETBforIdleControl == 1} - field = "Use separate Ignition Table for idle", useSeparateAdvanceForIdle - field = "Use separate VE Table for idle", useSeparateVeForIdle - field = "Use separate IAC Table For Coasting", useIacTableForCoasting, {idleMode == 0} field = idleIncrementalPidCic, idleIncrementalPidCic - field = "TPS deactivation threshold", idlePidDeactivationTpsThreshold + field = "use Cic Pid", useCicPidForIdle + field = "Use IAC PID Multiplier Table", useIacPidMultTable + + dialog = idleGating, "Idle Detection Thresholds" + field = "TPS threshold", idlePidDeactivationTpsThreshold + field = "RPM upper limit", idlePidRpmUpperLimit + field = "RPM dead zone", idlePidRpmDeadZone + + dialog = idleExtra, "Extra Idle Features" + field = "Extra idle air if throttle pressed", iacByTpsTaper + field = "Use idle ignition table", useSeparateAdvanceForIdle + field = "Use idle VE table", useSeparateVeForIdle + field = "Use coasting idle table", useIacTableForCoasting, {idleMode == 0} + field = useInstantRpmForIdle, useInstantRpmForIdle + field = "Detailed status in console", isVerboseIAC + + dialog = idleSettings, "", yAxis + field = "Idle control mode", idleMode + + field = "! Solenoid idle control requires above zero RPM" + slider = "Open loop idle position", manIdlePosition, horizontal + field = "" + + panel = idleGating, "" panel = idlePidSettings, { idleMode == 0} - field = "Extra IAC if Throttle Pressed", iacByTpsTaper; - field = "Detailed status in console", isVerboseIAC - field = "#See Warmup idle multiplier" - field = "! Solenoid Idle control requires above zero RPM" - slider = "Manual IAC Position", manIdlePosition, horizontal + panel = idleExtra dialog = idleTimingPidCorrDialog, "", yAxis - field = "!This timing correction mode is Alpha Version" - field = "Use Auto-PID ignition advance control", useIdleTimingPidControl - field = "#See Idle Target RPM Curve" - field = "P-factor", idleTimingPid_pFactor, {useIdleTimingPidControl == 1} - field = "I-factor", idleTimingPid_iFactor, {useIdleTimingPidControl == 1} - field = "D-factor", idleTimingPid_dFactor, {useIdleTimingPidControl == 1} - field = "Offset", idleTimingPid_offset, {useIdleTimingPidControl == 1} - field = "Min Delta", idleTimingPid_minValue, {useIdleTimingPidControl == 1} - field = "Max Delta", idleTimingPid_maxValue, {useIdleTimingPidControl == 1} - field = "#See RPM dead zone to deactivate IAC pid" - field = "RPM working zone for timing pid", idleTimingPidWorkZone, {useIdleTimingPidControl == 1} - field = "RPM working zone falloff", idlePidFalloffDeltaRpm, {useIdleTimingPidControl == 1} - field = "RPM dead zone to deactivate timing pid", idleTimingPidDeadZone, {useIdleTimingPidControl == 1} + field = "" + field = "Enable closed loop idle ignition timing", useIdleTimingPidControl + field = "" + field = "#Gain is in degrees advance per rpm away from target" + field = "#A good starting point is 0.1 = 10 deg per 100 rpm" + field = "Proportional gain", idleTimingPid_pFactor, {useIdleTimingPidControl == 1} + field = "Derivative gain", idleTimingPid_dFactor, {useIdleTimingPidControl == 1} + field = "" + field = "Min adjustment (retard)", idleTimingPid_minValue, {useIdleTimingPidControl == 1} + field = "Max adjustment (advance)", idleTimingPid_maxValue, {useIdleTimingPidControl == 1} + field = "" + field = "#Use debug mode 'Timing' to view idle timing adjustment" ; Engine->Fan Settings dialog = fanSetting, "Fan Settings" diff --git a/firmware/tunerstudio/generated/rusefi_proteus_f4.ini b/firmware/tunerstudio/generated/rusefi_proteus_f4.ini index ca8a88b4ee..34eef91b6b 100644 --- a/firmware/tunerstudio/generated/rusefi_proteus_f4.ini +++ b/firmware/tunerstudio/generated/rusefi_proteus_f4.ini @@ -33,12 +33,12 @@ enable2ndByteCanID = false [MegaTune] ; https://rusefi.com/forum/viewtopic.php?p=36201#p36201 - signature = "rusEFI 2020.12.26.proteus_f4.3326543317" + signature = "rusEFI 2020.12.30.proteus_f4.1740719399" [TunerStudio] queryCommand = "S" versionInfo = "V" ; firmwave version for title bar. - signature = "rusEFI 2020.12.26.proteus_f4.3326543317" ; signature is expected to be 7 or more characters. + signature = "rusEFI 2020.12.30.proteus_f4.1740719399" ; signature is expected to be 7 or more characters. [Constants] ; new packet serial format with CRC @@ -77,7 +77,7 @@ enable2ndByteCanID = false ; see PAGE_0_SIZE in C source code ; CONFIG_DEFINITION_START -; this section was generated automatically by rusEfi tool ConfigDefinition.jar based on gen_config.sh integration/rusefi_config.txt Sat Dec 26 21:17:49 UTC 2020 +; this section was generated automatically by rusEfi tool ConfigDefinition.jar based on gen_config.sh integration/rusefi_config.txt Wed Dec 30 13:37:27 UTC 2020 pageSize = 20000 page = 1 @@ -1336,6 +1336,7 @@ page = 1 acIdleExtraMin = "Additional idle PID minValue while A/C is active" acFanPin = "Optional Radiator Fan used with A/C" sdCardPeriodMs = "SD card logging period, in milliseconds" + idlePidDeactivationTpsThreshold = "Below this throttle position, the engine is considered idling." triggerErrorPin = "This pin is used for debugging - snap a logic analyzer on it and see if it's ever high" cdmInputPin = "Saab Combustion Detection Module knock signal input pin\nalso known as Saab Ion Sensing Module" sensorChartMode = "rusEfi console Sensor Sniffer mode" @@ -2796,16 +2797,16 @@ menuDialog = main menu = "&Idle" subMenu = idleSettings, "Idle settings" subMenu = idlehw, "Idle hardware" - subMenu = std_separator - subMenu = cltIdleRPMCurve, "Target RPM", 0, {idleMode == 0} + subMenu = std_separator + subMenu = cltIdleRPMCurve, "Target RPM" + subMenu = cltIdleCurve, "CLT multiplier" + subMenu = std_separator + subMenu = idleTimingPidCorrDialog, "Closed-loop idle timing" subMenu = iacPidMultTbl, "IAC PID Multiplier", 0, {idleMode == 0 && useIacPidMultTable == 1} + subMenu = iacCoastingCurve, "Coasting IAC Position for Auto-Idle", 0, {useIacTableForCoasting == 1} subMenu = std_separator subMenu = idleVeCurve, "VE", 0, {useSeparateVeForIdle == 1} subMenu = idleAdvanceCurve, "Ignition advance", 0, {useSeparateAdvanceForIdle == 1} - subMenu = std_separator - subMenu = idleTimingPidCorrDialog, "Closed-loop idle timing" - subMenu = cltIdleCurve, "CLT multiplier" - subMenu = iacCoastingCurve, "Coasting IAC Position for Auto-Idle", 0, {useIacTableForCoasting == 1} menu = "&Advanced" subMenu = boostDialog, "Boost Control" @@ -3856,11 +3857,11 @@ cmd_set_engine_type_default = "Z\x00\x31\x00\x00" field = "!ECU reboot needed to apply these settings" field = "Use Stepper", useStepperIdle field = "Double Solenoid Mode", isDoubleSolenoidIdle + field = "Use electronic throttle for idle", useETBforIdleControl, { throttlePedalPositionAdcChannel != 0 } + field = "Electronic throttle idle range", etbIdleThrottleRange, { useETBforIdleControl == 1 } panel = idleHwType - dialog = idlePidSettings, "PID IAC Control" - field = "#See Idle Target RPM Curve" - field = "use Cic Pid", useCicPidForIdle + dialog = idlePidSettings, "Closed Loop Idle" field = "P-factor", idleRpmPid_pFactor field = "I-factor", idleRpmPid_iFactor field = "derivativeFilterLoss", idle_derivativeFilterLoss @@ -3873,43 +3874,48 @@ cmd_set_engine_type_default = "Z\x00\x31\x00\x00" field = "Max", idleRpmPid_maxValue field = "iTerm Min", idlerpmpid_iTermMin field = "iTerm Max", idlerpmpid_iTermMax - field = "RPM dead zone to deactivate IAC pid", idlePidRpmDeadZone - field = "RPM upper limit to deactivate IAC pid",idlePidRpmUpperLimit field = "PID Extra for low RPM", pidExtraForLowRpm - field = "Use IAC PID Multiplier Table", useIacPidMultTable - - - dialog = idleSettings, "", yAxis - field = "Idle IAC control mode", idleMode - field = useInstantRpmForIdle, useInstantRpmForIdle - field = "use ETB for idle", useETBforIdleControl, { throttlePedalPositionAdcChannel != 0 } - field = "ETB Idle range", etbIdleThrottleRange, {useETBforIdleControl == 1} - field = "Use separate Ignition Table for idle", useSeparateAdvanceForIdle - field = "Use separate VE Table for idle", useSeparateVeForIdle - field = "Use separate IAC Table For Coasting", useIacTableForCoasting, {idleMode == 0} field = idleIncrementalPidCic, idleIncrementalPidCic - field = "TPS deactivation threshold", idlePidDeactivationTpsThreshold + field = "use Cic Pid", useCicPidForIdle + field = "Use IAC PID Multiplier Table", useIacPidMultTable + + dialog = idleGating, "Idle Detection Thresholds" + field = "TPS threshold", idlePidDeactivationTpsThreshold + field = "RPM upper limit", idlePidRpmUpperLimit + field = "RPM dead zone", idlePidRpmDeadZone + + dialog = idleExtra, "Extra Idle Features" + field = "Extra idle air if throttle pressed", iacByTpsTaper + field = "Use idle ignition table", useSeparateAdvanceForIdle + field = "Use idle VE table", useSeparateVeForIdle + field = "Use coasting idle table", useIacTableForCoasting, {idleMode == 0} + field = useInstantRpmForIdle, useInstantRpmForIdle + field = "Detailed status in console", isVerboseIAC + + dialog = idleSettings, "", yAxis + field = "Idle control mode", idleMode + + field = "! Solenoid idle control requires above zero RPM" + slider = "Open loop idle position", manIdlePosition, horizontal + field = "" + + panel = idleGating, "" panel = idlePidSettings, { idleMode == 0} - field = "Extra IAC if Throttle Pressed", iacByTpsTaper; - field = "Detailed status in console", isVerboseIAC - field = "#See Warmup idle multiplier" - field = "! Solenoid Idle control requires above zero RPM" - slider = "Manual IAC Position", manIdlePosition, horizontal + panel = idleExtra dialog = idleTimingPidCorrDialog, "", yAxis - field = "!This timing correction mode is Alpha Version" - field = "Use Auto-PID ignition advance control", useIdleTimingPidControl - field = "#See Idle Target RPM Curve" - field = "P-factor", idleTimingPid_pFactor, {useIdleTimingPidControl == 1} - field = "I-factor", idleTimingPid_iFactor, {useIdleTimingPidControl == 1} - field = "D-factor", idleTimingPid_dFactor, {useIdleTimingPidControl == 1} - field = "Offset", idleTimingPid_offset, {useIdleTimingPidControl == 1} - field = "Min Delta", idleTimingPid_minValue, {useIdleTimingPidControl == 1} - field = "Max Delta", idleTimingPid_maxValue, {useIdleTimingPidControl == 1} - field = "#See RPM dead zone to deactivate IAC pid" - field = "RPM working zone for timing pid", idleTimingPidWorkZone, {useIdleTimingPidControl == 1} - field = "RPM working zone falloff", idlePidFalloffDeltaRpm, {useIdleTimingPidControl == 1} - field = "RPM dead zone to deactivate timing pid", idleTimingPidDeadZone, {useIdleTimingPidControl == 1} + field = "" + field = "Enable closed loop idle ignition timing", useIdleTimingPidControl + field = "" + field = "#Gain is in degrees advance per rpm away from target" + field = "#A good starting point is 0.1 = 10 deg per 100 rpm" + field = "Proportional gain", idleTimingPid_pFactor, {useIdleTimingPidControl == 1} + field = "Derivative gain", idleTimingPid_dFactor, {useIdleTimingPidControl == 1} + field = "" + field = "Min adjustment (retard)", idleTimingPid_minValue, {useIdleTimingPidControl == 1} + field = "Max adjustment (advance)", idleTimingPid_maxValue, {useIdleTimingPidControl == 1} + field = "" + field = "#Use debug mode 'Timing' to view idle timing adjustment" ; Engine->Fan Settings dialog = fanSetting, "Fan Settings" diff --git a/firmware/tunerstudio/generated/rusefi_proteus_f7.ini b/firmware/tunerstudio/generated/rusefi_proteus_f7.ini index e30cecb1e0..9242c2cdd6 100644 --- a/firmware/tunerstudio/generated/rusefi_proteus_f7.ini +++ b/firmware/tunerstudio/generated/rusefi_proteus_f7.ini @@ -33,12 +33,12 @@ enable2ndByteCanID = false [MegaTune] ; https://rusefi.com/forum/viewtopic.php?p=36201#p36201 - signature = "rusEFI 2020.12.26.proteus_f7.3326543317" + signature = "rusEFI 2020.12.30.proteus_f7.1740719399" [TunerStudio] queryCommand = "S" versionInfo = "V" ; firmwave version for title bar. - signature = "rusEFI 2020.12.26.proteus_f7.3326543317" ; signature is expected to be 7 or more characters. + signature = "rusEFI 2020.12.30.proteus_f7.1740719399" ; signature is expected to be 7 or more characters. [Constants] ; new packet serial format with CRC @@ -77,7 +77,7 @@ enable2ndByteCanID = false ; see PAGE_0_SIZE in C source code ; CONFIG_DEFINITION_START -; this section was generated automatically by rusEfi tool ConfigDefinition.jar based on gen_config.sh integration/rusefi_config.txt Sat Dec 26 21:17:48 UTC 2020 +; this section was generated automatically by rusEfi tool ConfigDefinition.jar based on gen_config.sh integration/rusefi_config.txt Wed Dec 30 13:37:25 UTC 2020 pageSize = 20000 page = 1 @@ -1336,6 +1336,7 @@ page = 1 acIdleExtraMin = "Additional idle PID minValue while A/C is active" acFanPin = "Optional Radiator Fan used with A/C" sdCardPeriodMs = "SD card logging period, in milliseconds" + idlePidDeactivationTpsThreshold = "Below this throttle position, the engine is considered idling." triggerErrorPin = "This pin is used for debugging - snap a logic analyzer on it and see if it's ever high" cdmInputPin = "Saab Combustion Detection Module knock signal input pin\nalso known as Saab Ion Sensing Module" sensorChartMode = "rusEfi console Sensor Sniffer mode" @@ -2796,16 +2797,16 @@ menuDialog = main menu = "&Idle" subMenu = idleSettings, "Idle settings" subMenu = idlehw, "Idle hardware" - subMenu = std_separator - subMenu = cltIdleRPMCurve, "Target RPM", 0, {idleMode == 0} + subMenu = std_separator + subMenu = cltIdleRPMCurve, "Target RPM" + subMenu = cltIdleCurve, "CLT multiplier" + subMenu = std_separator + subMenu = idleTimingPidCorrDialog, "Closed-loop idle timing" subMenu = iacPidMultTbl, "IAC PID Multiplier", 0, {idleMode == 0 && useIacPidMultTable == 1} + subMenu = iacCoastingCurve, "Coasting IAC Position for Auto-Idle", 0, {useIacTableForCoasting == 1} subMenu = std_separator subMenu = idleVeCurve, "VE", 0, {useSeparateVeForIdle == 1} subMenu = idleAdvanceCurve, "Ignition advance", 0, {useSeparateAdvanceForIdle == 1} - subMenu = std_separator - subMenu = idleTimingPidCorrDialog, "Closed-loop idle timing" - subMenu = cltIdleCurve, "CLT multiplier" - subMenu = iacCoastingCurve, "Coasting IAC Position for Auto-Idle", 0, {useIacTableForCoasting == 1} menu = "&Advanced" subMenu = boostDialog, "Boost Control" @@ -3856,11 +3857,11 @@ cmd_set_engine_type_default = "Z\x00\x31\x00\x00" field = "!ECU reboot needed to apply these settings" field = "Use Stepper", useStepperIdle field = "Double Solenoid Mode", isDoubleSolenoidIdle + field = "Use electronic throttle for idle", useETBforIdleControl, { throttlePedalPositionAdcChannel != 0 } + field = "Electronic throttle idle range", etbIdleThrottleRange, { useETBforIdleControl == 1 } panel = idleHwType - dialog = idlePidSettings, "PID IAC Control" - field = "#See Idle Target RPM Curve" - field = "use Cic Pid", useCicPidForIdle + dialog = idlePidSettings, "Closed Loop Idle" field = "P-factor", idleRpmPid_pFactor field = "I-factor", idleRpmPid_iFactor field = "derivativeFilterLoss", idle_derivativeFilterLoss @@ -3873,43 +3874,48 @@ cmd_set_engine_type_default = "Z\x00\x31\x00\x00" field = "Max", idleRpmPid_maxValue field = "iTerm Min", idlerpmpid_iTermMin field = "iTerm Max", idlerpmpid_iTermMax - field = "RPM dead zone to deactivate IAC pid", idlePidRpmDeadZone - field = "RPM upper limit to deactivate IAC pid",idlePidRpmUpperLimit field = "PID Extra for low RPM", pidExtraForLowRpm - field = "Use IAC PID Multiplier Table", useIacPidMultTable - - - dialog = idleSettings, "", yAxis - field = "Idle IAC control mode", idleMode - field = useInstantRpmForIdle, useInstantRpmForIdle - field = "use ETB for idle", useETBforIdleControl, { throttlePedalPositionAdcChannel != 0 } - field = "ETB Idle range", etbIdleThrottleRange, {useETBforIdleControl == 1} - field = "Use separate Ignition Table for idle", useSeparateAdvanceForIdle - field = "Use separate VE Table for idle", useSeparateVeForIdle - field = "Use separate IAC Table For Coasting", useIacTableForCoasting, {idleMode == 0} field = idleIncrementalPidCic, idleIncrementalPidCic - field = "TPS deactivation threshold", idlePidDeactivationTpsThreshold + field = "use Cic Pid", useCicPidForIdle + field = "Use IAC PID Multiplier Table", useIacPidMultTable + + dialog = idleGating, "Idle Detection Thresholds" + field = "TPS threshold", idlePidDeactivationTpsThreshold + field = "RPM upper limit", idlePidRpmUpperLimit + field = "RPM dead zone", idlePidRpmDeadZone + + dialog = idleExtra, "Extra Idle Features" + field = "Extra idle air if throttle pressed", iacByTpsTaper + field = "Use idle ignition table", useSeparateAdvanceForIdle + field = "Use idle VE table", useSeparateVeForIdle + field = "Use coasting idle table", useIacTableForCoasting, {idleMode == 0} + field = useInstantRpmForIdle, useInstantRpmForIdle + field = "Detailed status in console", isVerboseIAC + + dialog = idleSettings, "", yAxis + field = "Idle control mode", idleMode + + field = "! Solenoid idle control requires above zero RPM" + slider = "Open loop idle position", manIdlePosition, horizontal + field = "" + + panel = idleGating, "" panel = idlePidSettings, { idleMode == 0} - field = "Extra IAC if Throttle Pressed", iacByTpsTaper; - field = "Detailed status in console", isVerboseIAC - field = "#See Warmup idle multiplier" - field = "! Solenoid Idle control requires above zero RPM" - slider = "Manual IAC Position", manIdlePosition, horizontal + panel = idleExtra dialog = idleTimingPidCorrDialog, "", yAxis - field = "!This timing correction mode is Alpha Version" - field = "Use Auto-PID ignition advance control", useIdleTimingPidControl - field = "#See Idle Target RPM Curve" - field = "P-factor", idleTimingPid_pFactor, {useIdleTimingPidControl == 1} - field = "I-factor", idleTimingPid_iFactor, {useIdleTimingPidControl == 1} - field = "D-factor", idleTimingPid_dFactor, {useIdleTimingPidControl == 1} - field = "Offset", idleTimingPid_offset, {useIdleTimingPidControl == 1} - field = "Min Delta", idleTimingPid_minValue, {useIdleTimingPidControl == 1} - field = "Max Delta", idleTimingPid_maxValue, {useIdleTimingPidControl == 1} - field = "#See RPM dead zone to deactivate IAC pid" - field = "RPM working zone for timing pid", idleTimingPidWorkZone, {useIdleTimingPidControl == 1} - field = "RPM working zone falloff", idlePidFalloffDeltaRpm, {useIdleTimingPidControl == 1} - field = "RPM dead zone to deactivate timing pid", idleTimingPidDeadZone, {useIdleTimingPidControl == 1} + field = "" + field = "Enable closed loop idle ignition timing", useIdleTimingPidControl + field = "" + field = "#Gain is in degrees advance per rpm away from target" + field = "#A good starting point is 0.1 = 10 deg per 100 rpm" + field = "Proportional gain", idleTimingPid_pFactor, {useIdleTimingPidControl == 1} + field = "Derivative gain", idleTimingPid_dFactor, {useIdleTimingPidControl == 1} + field = "" + field = "Min adjustment (retard)", idleTimingPid_minValue, {useIdleTimingPidControl == 1} + field = "Max adjustment (advance)", idleTimingPid_maxValue, {useIdleTimingPidControl == 1} + field = "" + field = "#Use debug mode 'Timing' to view idle timing adjustment" ; Engine->Fan Settings dialog = fanSetting, "Fan Settings" diff --git a/java_console/models/src/main/java/com/rusefi/config/generated/Fields.java b/java_console/models/src/main/java/com/rusefi/config/generated/Fields.java index 2983fdb26f..783ec1b45c 100644 --- a/java_console/models/src/main/java/com/rusefi/config/generated/Fields.java +++ b/java_console/models/src/main/java/com/rusefi/config/generated/Fields.java @@ -1,6 +1,6 @@ package com.rusefi.config.generated; -// this file was generated automatically by rusEfi tool ConfigDefinition.jar based on gen_config.sh integration/rusefi_config.txt Thu Dec 24 12:32:41 UTC 2020 +// this file was generated automatically by rusEfi tool ConfigDefinition.jar based on gen_config.sh integration/rusefi_config.txt Wed Dec 30 13:37:13 UTC 2020 // by class com.rusefi.output.FileJavaFieldsConsumer import com.rusefi.config.*; @@ -1461,7 +1461,7 @@ public class Fields { public static final char TS_SD_R_COMMAND = 'r'; public static final char TS_SD_W_COMMAND = 'w'; public static final char TS_SET_LOGGER_SWITCH = 'l'; - public static final String TS_SIGNATURE = "rusEFI 2020.12.24.all.3247519971"; + public static final String TS_SIGNATURE = "rusEFI 2020.12.30.all.2926252025"; public static final char TS_SINGLE_WRITE_COMMAND = 'W'; public static final int TT_TT_1_16 = 50; public static final int TT_TT_2JZ_1_12 = 29; diff --git a/java_console/rusefi.xml b/java_console/rusefi.xml index e73b37ecca..133ebf3803 100644 --- a/java_console/rusefi.xml +++ b/java_console/rusefi.xml @@ -1,6 +1,6 @@ - +