From 48da721c49e12b4d06493e40e8a2eadf55dc01ff Mon Sep 17 00:00:00 2001 From: Matthew Kennedy Date: Tue, 21 Sep 2021 17:40:20 -0700 Subject: [PATCH] dead knock code (#3255) * more unification * hip stub * comment * guard * channel idx * include * hip * move in to engine * hip9011 * dead stuff * dead * fsio * lcd * more dead --- .../boards/prometheus/board_configuration.cpp | 1 - .../subaru_eg33/board_configuration.cpp | 3 -- firmware/config/engines/mazda_626.cpp | 2 -- firmware/console/binary/tunerstudio_outputs.h | 4 +-- firmware/console/status_loop.cpp | 6 ---- firmware/controllers/algo/engine.cpp | 32 ------------------- firmware/controllers/algo/engine.h | 23 ------------- .../controllers/algo/engine_configuration.cpp | 3 -- firmware/controllers/core/fsio_core.cpp | 2 -- firmware/controllers/core/fsio_core.h | 1 - firmware/controllers/core/fsio_impl.cpp | 1 - firmware/controllers/engine_controller.cpp | 13 -------- .../engine_cycle/main_trigger_callback.cpp | 8 ----- .../controllers/gauges/lcd_controller.cpp | 5 --- firmware/controllers/gauges/lcd_menu_tree.h | 1 - firmware/controllers/settings.cpp | 2 -- firmware/hw_layer/sensors/hip9011.cpp | 22 ------------- firmware/integration/rusefi_config.txt | 6 ++-- firmware/tunerstudio/rusefi.input | 8 ----- 19 files changed, 5 insertions(+), 138 deletions(-) diff --git a/firmware/config/boards/prometheus/board_configuration.cpp b/firmware/config/boards/prometheus/board_configuration.cpp index 2717be565a..648f63c2e7 100644 --- a/firmware/config/boards/prometheus/board_configuration.cpp +++ b/firmware/config/boards/prometheus/board_configuration.cpp @@ -193,7 +193,6 @@ void setBoardDefaultConfiguration(void) { engineConfiguration->triggerSimulatorPinModes[0] = OM_DEFAULT; // not used - engineConfiguration->externalKnockSenseAdc = EFI_ADC_NONE; engineConfiguration->displayMode = DM_NONE; engineConfiguration->HD44780_rs = GPIO_UNASSIGNED; engineConfiguration->HD44780_e = GPIO_UNASSIGNED; diff --git a/firmware/config/boards/subaru_eg33/board_configuration.cpp b/firmware/config/boards/subaru_eg33/board_configuration.cpp index ecea000663..1d9ffc3504 100644 --- a/firmware/config/boards/subaru_eg33/board_configuration.cpp +++ b/firmware/config/boards/subaru_eg33/board_configuration.cpp @@ -159,7 +159,6 @@ void setBoardDefaultConfiguration(void) { //setFsio(0, (GPIOB_1), STARTER_RELAY_LOGIC PASS_CONFIG_PARAMETER_SUFFIX); /* not used */ - engineConfiguration->externalKnockSenseAdc = EFI_ADC_NONE; engineConfiguration->displayMode = DM_NONE; engineConfiguration->HD44780_rs = GPIO_UNASSIGNED; engineConfiguration->HD44780_e = GPIO_UNASSIGNED; @@ -210,9 +209,7 @@ void setBoardDefaultConfiguration(void) { engineConfiguration->hip9011PrescalerAndSDO = (0x6 << 1); //HIP_16MHZ_PRESCALER; engineConfiguration->hip9011Gain = 1.0; engineConfiguration->knockBandCustom = 0.0; - engineConfiguration->knockVThreshold = 4.0; engineConfiguration->cylinderBore = 96.9; - engineConfiguration->maxKnockSubDeg = 20.0; /* Cylinder to knock bank mapping */ engineConfiguration->knockBankCyl1 = 0; diff --git a/firmware/config/engines/mazda_626.cpp b/firmware/config/engines/mazda_626.cpp index 229387d045..222f1a6bcd 100644 --- a/firmware/config/engines/mazda_626.cpp +++ b/firmware/config/engines/mazda_626.cpp @@ -90,8 +90,6 @@ void setMazda626EngineConfiguration(DECLARE_CONFIG_PARAMETER_SIGNATURE) { // setFsio(0, GPIOE_6, "1" PASS_CONFIG_PARAMETER_SUFFIX); //#endif - engineConfiguration->externalKnockSenseAdc = EFI_ADC_4; - engineConfiguration->triggerInputPins[1] = GPIO_UNASSIGNED; engineConfiguration->camInputs[0] = GPIOA_5; } diff --git a/firmware/console/binary/tunerstudio_outputs.h b/firmware/console/binary/tunerstudio_outputs.h index b95f45c1dc..a9bb60339d 100644 --- a/firmware/console/binary/tunerstudio_outputs.h +++ b/firmware/console/binary/tunerstudio_outputs.h @@ -62,8 +62,8 @@ struct TunerStudioOutputChannels { unsigned int unusedBit10 : 1; // bit 10 unsigned int clutchUpState : 1; // bit 11 unsigned int clutchDownState : 1; // bit 12 - unsigned int knockEverIndicator : 1; // bit 13 - unsigned int knockNowIndicator : 1; // bit 14 + unsigned int unusedb13 : 1; // bit 13 + unsigned int unusedb14 : 1; // bit 14 unsigned int brakePedalState : 1; // bit 15. 0 - not pressed, 1 = pressed unsigned int toothLogReady : 1; // bit 16 unsigned int acSwitchState : 1; // bit 17. 0 - not pressed, 1 = pressed diff --git a/firmware/console/status_loop.cpp b/firmware/console/status_loop.cpp index 14cdeb97de..02036cc30e 100644 --- a/firmware/console/status_loop.cpp +++ b/firmware/console/status_loop.cpp @@ -626,9 +626,6 @@ void updateTunerStudioState(TunerStudioOutputChannels *tsOutputChannels DECLARE_ tsOutputChannels->VssAcceleration = getDynoviewAcceleration(PASS_ENGINE_PARAMETER_SIGNATURE); #endif - //tsOutputChannels->knockCount = engine->knockCount; - //tsOutputChannels->knockLevel = engine->knockVolts; - #if HW_CHECK_MODE tsOutputChannels->hasCriticalError = 1; #else @@ -704,9 +701,6 @@ void updateTunerStudioState(TunerStudioOutputChannels *tsOutputChannels DECLARE_ tsOutputChannels->recentErrorCodes[i] = engine->engineState.warnings.recentWarnings.get(i); } - tsOutputChannels->knockNowIndicator = engine->knockCount > 0; - tsOutputChannels->knockEverIndicator = engine->knockEver; - tsOutputChannels->clutchUpState = engine->clutchUpState; tsOutputChannels->clutchDownState = engine->clutchDownState; tsOutputChannels->brakePedalState = engine->brakePedalState; diff --git a/firmware/controllers/algo/engine.cpp b/firmware/controllers/algo/engine.cpp index 4efafaefe2..bf31916840 100644 --- a/firmware/controllers/algo/engine.cpp +++ b/firmware/controllers/algo/engine.cpp @@ -477,38 +477,6 @@ void Engine::setConfig(DECLARE_ENGINE_PARAMETER_SIGNATURE) { injectEngineReferences(); } -void Engine::printKnockState(void) { - efiPrintf("knock now=%s/ever=%s", boolToString(knockNow), boolToString(knockEver)); -} - -void Engine::knockLogic(float knockVolts DECLARE_ENGINE_PARAMETER_SUFFIX) { - this->knockVolts = knockVolts; - knockNow = knockVolts > engineConfiguration->knockVThreshold; - /** - * KnockCount is directly proportional to the degrees of ignition - * advance removed - * ex: degrees to subtract = knockCount; - */ - - /** - * TODO use knockLevel as a factor for amount of ignition advance - * to remove - * Perhaps allow the user to set a multiplier - * ex: degrees to subtract = knockCount + (knockLevel * X) - * X = user configurable multiplier - */ - if (knockNow) { - knockEver = true; - timeOfLastKnockEvent = getTimeNowUs(); - if (knockCount < engineConfiguration->maxKnockSubDeg) - knockCount++; - } else if (knockCount >= 1) { - knockCount--; - } else { - knockCount = 0; - } -} - void Engine::watchdog() { #if EFI_ENGINE_CONTROL if (isRunningPwmTest) diff --git a/firmware/controllers/algo/engine.h b/firmware/controllers/algo/engine.h index 8d9d5a6bed..e5d7d5c34a 100644 --- a/firmware/controllers/algo/engine.h +++ b/firmware/controllers/algo/engine.h @@ -289,26 +289,6 @@ public: FsioState fsioState; - /** - * Are we experiencing knock right now? - */ - bool knockNow = false; - /** - * Have we experienced knock since engine was started? - */ - bool knockEver = false; - /** - * KnockCount is directly proportional to the degrees of ignition - * advance removed - */ - int knockCount = 0; - - float knockVolts = 0; - - bool knockDebug = false; - - efitimeus_t timeOfLastKnockEvent = 0; - /** * are we running any kind of functional test? this affect * some areas @@ -391,9 +371,6 @@ public: // onKnockSenseCompleted is the callback from the knock sense driver to report a sensed knock level bool onKnockSenseCompleted(uint8_t cylinderIndex, float levelDbv, efitick_t lastKnockTime); - void knockLogic(float knockVolts DECLARE_ENGINE_PARAMETER_SUFFIX); - void printKnockState(void); - AirmassModelBase* mockAirmassModel = nullptr; LimpManager limpManager; diff --git a/firmware/controllers/algo/engine_configuration.cpp b/firmware/controllers/algo/engine_configuration.cpp index e2a5cb22cd..5f21c1e1df 100644 --- a/firmware/controllers/algo/engine_configuration.cpp +++ b/firmware/controllers/algo/engine_configuration.cpp @@ -437,9 +437,6 @@ static void setHip9011FrankensoPinout(DECLARE_ENGINE_PARAMETER_SIGNATURE) { #endif /* EFI_PROD_CODE */ engineConfiguration->hip9011Gain = 1; - engineConfiguration->knockVThreshold = 4; - engineConfiguration->maxKnockSubDeg = 20; - if (!CONFIG(useTpicAdvancedMode)) { engineConfiguration->hipOutputChannel = EFI_ADC_10; // PC0 diff --git a/firmware/controllers/core/fsio_core.cpp b/firmware/controllers/core/fsio_core.cpp index cfcb4738ea..6c52a139b8 100644 --- a/firmware/controllers/core/fsio_core.cpp +++ b/firmware/controllers/core/fsio_core.cpp @@ -233,8 +233,6 @@ FsioResult LECalculator::processElement(const LEElement *element DECLARE_ENGINE_ int sensorIdx = static_cast(SensorType::Aux1) + index; return Sensor::get(static_cast(sensorIdx)); } - case LE_METHOD_KNOCK: - return ENGINE(knockCount); case LE_UNDEFINED: warning(CUSTOM_UNKNOWN_FSIO, "FSIO undefined action"); return unexpected; diff --git a/firmware/controllers/core/fsio_core.h b/firmware/controllers/core/fsio_core.h index 4e83c23426..fbc7a4c36b 100644 --- a/firmware/controllers/core/fsio_core.h +++ b/firmware/controllers/core/fsio_core.h @@ -40,7 +40,6 @@ typedef enum { LE_METHOD_VBATT = 109, LE_METHOD_AC_TOGGLE = 110, LE_METHOD_TIME_SINCE_AC_TOGGLE = 111, - LE_METHOD_KNOCK = 112, LE_METHOD_FSIO_TABLE = 113, LE_METHOD_SELF = 114, LE_METHOD_MAP = 115, diff --git a/firmware/controllers/core/fsio_impl.cpp b/firmware/controllers/core/fsio_impl.cpp index 24d9aa5877..daf20f1d91 100644 --- a/firmware/controllers/core/fsio_impl.cpp +++ b/firmware/controllers/core/fsio_impl.cpp @@ -60,7 +60,6 @@ static LENameOrdinalPair leFsioSetting(LE_METHOD_FSIO_SETTING, FSIO_METHOD_FSIO_ static LENameOrdinalPair leFsioTable(LE_METHOD_FSIO_TABLE, FSIO_METHOD_FSIO_TABLE); static LENameOrdinalPair leFsioAnalogInput(LE_METHOD_FSIO_ANALOG_INPUT, FSIO_METHOD_FSIO_ANALOG_INPUT); static LENameOrdinalPair leFsioDigitalInput(LE_METHOD_FSIO_DIGITAL_INPUT, FSIO_METHOD_FSIO_DIGITAL_INPUT); -static LENameOrdinalPair leKnock(LE_METHOD_KNOCK, "knock"); static LENameOrdinalPair leIntakeVVT(LE_METHOD_INTAKE_VVT, "ivvt"); static LENameOrdinalPair leExhaustVVT(LE_METHOD_EXHAUST_VVT, "evvt"); static LENameOrdinalPair leCrankingRpm(LE_METHOD_CRANKING_RPM, "cranking_rpm"); diff --git a/firmware/controllers/engine_controller.cpp b/firmware/controllers/engine_controller.cpp index a5148f78d3..ac390ce8ef 100644 --- a/firmware/controllers/engine_controller.cpp +++ b/firmware/controllers/engine_controller.cpp @@ -331,7 +331,6 @@ static void printAnalogInfo(void) { printAnalogChannelInfo("AFR", engineConfiguration->afr.hwChannel); printAnalogChannelInfo("MAP", engineConfiguration->map.sensor.hwChannel); printAnalogChannelInfo("BARO", engineConfiguration->baroSensor.hwChannel); - printAnalogChannelInfo("extKno", engineConfiguration->externalKnockSenseAdc); printAnalogChannelInfo("OilP", engineConfiguration->oilPressure.hwChannel); @@ -498,14 +497,6 @@ static void initConfigActions(void) { addConsoleActionI("get_byte", getByte); addConsoleActionII("get_bit", getBit); } - -// todo: move this logic somewhere else? -static void getKnockInfo(void) { - adc_channel_e hwChannel = engineConfiguration->externalKnockSenseAdc; - efiPrintf("externalKnockSenseAdc on ADC", getPinNameByAdcChannel("knock", hwChannel, pinNameBuffer)); - - engine->printKnockState(); -} #endif /* EFI_UNIT_TEST */ // this method is used by real firmware and simulator and unit test @@ -762,10 +753,6 @@ void initEngineContoller(DECLARE_ENGINE_PARAMETER_SUFFIX) { initEgoAveraging(PASS_ENGINE_PARAMETER_SIGNATURE); - if (isAdcChannelValid(engineConfiguration->externalKnockSenseAdc)) { - addConsoleAction("knockinfo", getKnockInfo); - } - #if EFI_PROD_CODE addConsoleAction("reset_accel", resetAccel); #endif /* EFI_PROD_CODE */ diff --git a/firmware/controllers/engine_cycle/main_trigger_callback.cpp b/firmware/controllers/engine_cycle/main_trigger_callback.cpp index a63217c8da..cbcee6276a 100644 --- a/firmware/controllers/engine_cycle/main_trigger_callback.cpp +++ b/firmware/controllers/engine_cycle/main_trigger_callback.cpp @@ -437,14 +437,6 @@ void mainTriggerCallback(uint32_t trgEventIndex, efitick_t edgeTimestamp DECLARE } } - if (trgEventIndex == 0) { - if (isAdcChannelValid(CONFIG(externalKnockSenseAdc))) { - float externalKnockValue = getVoltageDivided("knock", engineConfiguration->externalKnockSenseAdc PASS_ENGINE_PARAMETER_SUFFIX); - engine->knockLogic(externalKnockValue PASS_ENGINE_PARAMETER_SUFFIX); - } - } - - /** * For fuel we schedule start of injection based on trigger angle, and then inject for * specified duration of time diff --git a/firmware/controllers/gauges/lcd_controller.cpp b/firmware/controllers/gauges/lcd_controller.cpp index cea4e1e350..844477dbb5 100644 --- a/firmware/controllers/gauges/lcd_controller.cpp +++ b/firmware/controllers/gauges/lcd_controller.cpp @@ -64,7 +64,6 @@ static MenuItem miAfr(&miSensors, LL_AFR); static MenuItem miBaro(&miSensors, LL_BARO); static MenuItem miMapV(&miSensors, LL_MAF_V); static MenuItem miMapKgHr(&miSensors, LL_MAF_KG_HR); -static MenuItem miKnock(&miSensors, LL_KNOCK); static MenuItem miStopEngine(&miBench, "stop engine", scheduleStopEngine); static MenuItem miTestFan(&miBench, "test fan", fanBench); @@ -195,10 +194,6 @@ static void showLine(lcd_line_e line, int /*screenY*/) { case LL_VBATT: lcdPrintf("Battery %.2fv", Sensor::get(SensorType::BatteryVoltage).value_or(0)); return; - case LL_KNOCK: - getPinNameByAdcChannel("hip", engineConfiguration->hipOutputChannel, buffer); - lcdPrintf("Knock %s %.2fv", buffer, engine->knockVolts); - return; #if EFI_ANALOG_SENSORS case LL_BARO: diff --git a/firmware/controllers/gauges/lcd_menu_tree.h b/firmware/controllers/gauges/lcd_menu_tree.h index f0b3fcb2c2..b975467357 100644 --- a/firmware/controllers/gauges/lcd_menu_tree.h +++ b/firmware/controllers/gauges/lcd_menu_tree.h @@ -31,7 +31,6 @@ typedef enum { LL_MAF_KG_HR, LL_EGO, LL_BARO, - LL_KNOCK, LL_FUEL_BASE, LL_FUEL_TOTAL, diff --git a/firmware/controllers/settings.cpp b/firmware/controllers/settings.cpp index d307e9f737..2da2c1a1ed 100644 --- a/firmware/controllers/settings.cpp +++ b/firmware/controllers/settings.cpp @@ -784,8 +784,6 @@ static void enableOrDisable(const char *param, bool isEnabled) { engineConfiguration->isVerboseAlternator = isEnabled; } else if (strEqualCaseInsensitive(param, "tpic_advanced_mode")) { engineConfiguration->useTpicAdvancedMode = isEnabled; - } else if (strEqualCaseInsensitive(param, "knockdebug")) { - engine->knockDebug = isEnabled; } else if (strEqualCaseInsensitive(param, "altcontrol")) { engineConfiguration->isAlternatorControlEnabled = isEnabled; } else if (strEqualCaseInsensitive(param, "sd")) { diff --git a/firmware/hw_layer/sensors/hip9011.cpp b/firmware/hw_layer/sensors/hip9011.cpp index 458d8ef84b..74108194de 100644 --- a/firmware/hw_layer/sensors/hip9011.cpp +++ b/firmware/hw_layer/sensors/hip9011.cpp @@ -500,9 +500,6 @@ static msg_t hipThread(void *arg) { /* Check for correct cylinder/input */ if (correctCylinder) { - /* report */ - engine->knockLogic(knockVolts); - // TODO: convert knock level to dBv engine->onKnockSenseCompleted(instance.cylinderNumber, knockVolts, instance.knockSampleTimestamp); @@ -619,11 +616,6 @@ static void showHipInfo(void) { efiPrintf(" PaSDO=0x%x", instance.prescaler); - efiPrintf(" knockVThreshold=%.2f knockCount=%d maxKnockSubDeg=%.2f", - engineConfiguration->knockVThreshold, - engine->knockCount, - engineConfiguration->maxKnockSubDeg); - efiPrintf(" IntHold %s (mode 0x%x)", hwPortname(CONFIG(hip9011IntHoldPin)), CONFIG(hip9011IntHoldPinMode)); @@ -662,18 +654,6 @@ static void showHipInfo(void) { normalizedValueMax[i]); normalizedValueMax[i] = 0.0; } - - engine->printKnockState(); -} - -static void setMaxKnockSubDeg(int value) { - engineConfiguration->maxKnockSubDeg = value; - showHipInfo(); -} - -static void setKnockThresh(float value) { - engineConfiguration->knockVThreshold = value; - showHipInfo(); } static void setPrescalerAndSDO(int value) { @@ -695,8 +675,6 @@ static void hip_addconsoleActions(void) { addConsoleActionF("set_gain", setHipGain); addConsoleActionF("set_band", setHipBand); addConsoleActionI("set_hip_prescalerandsdo", setPrescalerAndSDO); - addConsoleActionF("set_knock_threshold", setKnockThresh); - addConsoleActionI("set_max_knock_sub_deg", setMaxKnockSubDeg); } #endif /* EFI_HIP_9011_DEBUG */ diff --git a/firmware/integration/rusefi_config.txt b/firmware/integration/rusefi_config.txt index 8debf6b230..17afeb6c28 100644 --- a/firmware/integration/rusefi_config.txt +++ b/firmware/integration/rusefi_config.txt @@ -729,7 +729,7 @@ custom spi_device_e 1 bits, U08, @OFFSET@, [0:2], "Off", "SPI1", "SPI2", "SPI3", float globalFuelCorrection;set global_fuel_correction X;"coef", 1, 0, 0, 1000, 2 float adcVcc;;"volts", 1, 0, 0, 6, 3 - float maxKnockSubDeg;maximum total number of degrees to subtract from ignition advance\nwhen knocking;"Deg", 1, 0, 0, 100, 0 + float unused552;;"Deg", 1, 0, 0, 100, 0 brain_input_pin_e[CAM_INPUTS_COUNT iterate] camInputs;+Camshaft input could be used either just for engine phase detection if your trigger shape does not include cam sensor as 'primary' channel, or it could be used for Variable Valve timing on one of the camshafts. uint8_t[CAM_INPUTS_COUNT_padding] camInputsPadding;; @@ -1211,7 +1211,7 @@ bit unused_1484_bit_31 float idleStepperReactionTime;;"ms", 1, 0, 1, 300, 0 - float knockVThreshold;;"V", 1, 0, 1, 5, 2 + float unused1512;;"", 1, 0, 1, 5, 2 pin_input_mode_e[FSIO_COMMAND_COUNT iterate] fsioInputModes; uint8_t[10] unusedFsioInputs;;"", 1, 0, 0, 255, 0 @@ -1475,7 +1475,7 @@ tle8888_mode_e tle8888mode; brain_input_pin_e flexSensorPin;+Continental/GM flex fuel sensor, 50-150hz type; brain_pin_e test557pin pin_output_mode_e stepperDirectionPinMode; - adc_channel_e externalKnockSenseAdc; + uint8_t unused3103;;"",1,0,0,1,0 output_pin_e stepperEnablePin; brain_pin_e tle8888_cs; pin_output_mode_e tle8888_csPinMode; diff --git a/firmware/tunerstudio/rusefi.input b/firmware/tunerstudio/rusefi.input index 297090af73..ad4a916235 100644 --- a/firmware/tunerstudio/rusefi.input +++ b/firmware/tunerstudio/rusefi.input @@ -188,8 +188,6 @@ enable2ndByteCanID = false needBurn = bits, U32, 0, [9:9], "true", "false"; clutchUpState =bits, U32, 0, [11:11], "true", "false"; clutchDownState =bits, U32, 0, [12:12], "true", "false"; - knockEverIndicator=bits, U32, 0, [13:13], "true", "false"; - knockNowIndicator=bits, U32, 0, [14:14], "true", "false"; brakePedalIndicator=bits, U32, 0, [15:15], "true", "false"; toothLogReady =bits, U32, 0, [16:16], "true", "false"; acSwitchState =bits, U32, 0, [17:17], "true", "false"; @@ -1222,10 +1220,6 @@ gaugeCategory = DynoView ; not implemented ; indicator = { ind_map_error}, "map", "map error", white, black, red, black - - indicator = { knockEverIndicator }, "", "Knock recently", white, black, red, black - indicator = { knockNowIndicator }, "no knock", "Knock NOW", white, black, red, black - indicator = { sd_present }, "no SD card", "SD card OK", white, black, green, black indicator = { sd_logging_internal }, "SD logging", "SD logging", white, black, green, black indicator = { sd_msd }, "SD USB", "SD USB", white, black, green, black @@ -2419,7 +2413,6 @@ cmd_set_engine_type_default = "@@TS_IO_TEST_COMMAND_char@@\x00\x31\x00\x00" field = "TLE 8888 spi", tle8888spiDevice @@if_ts_show_spi field = "AUX Serial TX", auxSerialTxPin field = "AUX Serial RX", auxSerialRxPin - field = "External Knock", externalKnockSenseAdc field = "Start/Stop Button", startStopButtonPin field = "Upshift Pin", tcuUpshiftButtonPin field = "Downshift Pin", tcuDownshiftButtonPin @@ -2817,7 +2810,6 @@ cmd_set_engine_type_default = "@@TS_IO_TEST_COMMAND_char@@\x00\x31\x00\x00" ; Engine->hip9011 Settings dialog = hipFunction, "HIP9011 Settings (knock decoder)" field = "Enabled", isHip9011Enabled - field = "Threshold", knockVThreshold, {isHip9011Enabled == 1} field = "!ECU reboot needed to apply these settings" field = "IntHold pin (hip9011 input)", hip9011IntHoldPin, {isHip9011Enabled == 1} field = "IntHold pin (hip9011 input) mode", hip9011IntHoldPinMode, {isHip9011Enabled == 1}