diff --git a/firmware/config/boards/hellen/cypress/config/controllers/algo/auto_generated_enums.cpp b/firmware/config/boards/hellen/cypress/config/controllers/algo/auto_generated_enums.cpp index c1ffa3b24f..8bf495b93f 100644 --- a/firmware/config/boards/hellen/cypress/config/controllers/algo/auto_generated_enums.cpp +++ b/firmware/config/boards/hellen/cypress/config/controllers/algo/auto_generated_enums.cpp @@ -941,6 +941,8 @@ case PROMETHEUS_DEFAULTS: return "PROMETHEUS_DEFAULTS"; case PROTEUS_DEFAULTS: return "PROTEUS_DEFAULTS"; +case PROTEUS_ANALOG_PWM_TEST: + return "PROTEUS_ANALOG_PWM_TEST"; case PROTEUS_MIATA_NB2: return "PROTEUS_MIATA_NB2"; case PROTEUS_QC_TEST_BOARD: diff --git a/firmware/config/boards/kinetis/config/controllers/algo/auto_generated_enums.cpp b/firmware/config/boards/kinetis/config/controllers/algo/auto_generated_enums.cpp index 9361c78972..83a82a49ae 100644 --- a/firmware/config/boards/kinetis/config/controllers/algo/auto_generated_enums.cpp +++ b/firmware/config/boards/kinetis/config/controllers/algo/auto_generated_enums.cpp @@ -737,6 +737,8 @@ case PROMETHEUS_DEFAULTS: return "PROMETHEUS_DEFAULTS"; case PROTEUS_DEFAULTS: return "PROTEUS_DEFAULTS"; +case PROTEUS_ANALOG_PWM_TEST: + return "PROTEUS_ANALOG_PWM_TEST"; case PROTEUS_MIATA_NB2: return "PROTEUS_MIATA_NB2"; case PROTEUS_QC_TEST_BOARD: diff --git a/firmware/config/engines/test_engine.cpp b/firmware/config/engines/test_engine.cpp index 6f2702cb83..69d31cf818 100644 --- a/firmware/config/engines/test_engine.cpp +++ b/firmware/config/engines/test_engine.cpp @@ -99,3 +99,23 @@ void setTestEngineIssue366rise(DECLARE_CONFIG_PARAMETER_SIGNATURE) { engineConfiguration->useOnlyRisingEdgeForTrigger = true; } #endif /* EFI_UNIT_TEST */ + +#ifdef HARDWARE_CI +void setProteusAnalogPwmTest(DECLARE_CONFIG_PARAMETER_SIGNATURE) { + // lowest cpu trigger possible + engineConfiguration->trigger.type = TT_ONE; + + // Disable trigger stim + engineConfiguration->triggerSimulatorPins[0] = GPIO_UNASSIGNED; + engineConfiguration->triggerSimulatorPins[1] = GPIO_UNASSIGNED; + engineConfiguration->triggerSimulatorPins[2] = GPIO_UNASSIGNED; + + // The idle control pin is connected to the default TPS input, analog volt 2 + engineConfiguration->idle.solenoidPin = GPIOG_4; + engineConfiguration->idle.solenoidFrequency = 5000; + + // Test range is 20% to 80% + engineConfiguration->tpsMin = 200; + engineConfiguration->tpsMax = 800; +} +#endif diff --git a/firmware/config/engines/test_engine.h b/firmware/config/engines/test_engine.h index 1d5e0334a0..7e1042074a 100644 --- a/firmware/config/engines/test_engine.h +++ b/firmware/config/engines/test_engine.h @@ -14,4 +14,4 @@ void setTestVVTEngineConfiguration(DECLARE_CONFIG_PARAMETER_SIGNATURE); void setTestEngineIssue366both(DECLARE_CONFIG_PARAMETER_SIGNATURE); void setTestEngineIssue366rise(DECLARE_CONFIG_PARAMETER_SIGNATURE); - +void setProteusAnalogPwmTest(DECLARE_CONFIG_PARAMETER_SIGNATURE); diff --git a/firmware/controllers/actuators/idle_thread.cpp b/firmware/controllers/actuators/idle_thread.cpp index dd8746aef2..1e91e583e6 100644 --- a/firmware/controllers/actuators/idle_thread.cpp +++ b/firmware/controllers/actuators/idle_thread.cpp @@ -441,7 +441,12 @@ static percent_t automaticIdleController(float tpsPos, float rpm, int targetRpm, } float IdleController::getIdlePosition() { - efiAssert(OBD_PCM_Processor_Fault, engineConfiguration != NULL, "engineConfiguration pointer", 0); + // Simplify hardware CI: we borrow the idle valve controller as a PWM source for various stimulation tasks + // The logic in this function is solidly unit tested, so it's not necessary to re-test the particulars on real hardware. + #ifdef HARDWARE_CI + return CONFIG(manIdlePosition); + #endif + /* * Here we have idle logic thread - actual stepper movement is implemented in a separate * working thread, diff --git a/firmware/controllers/algo/auto_generated_enums.cpp b/firmware/controllers/algo/auto_generated_enums.cpp index 1c80b05d3b..a8fc620dcf 100644 --- a/firmware/controllers/algo/auto_generated_enums.cpp +++ b/firmware/controllers/algo/auto_generated_enums.cpp @@ -915,6 +915,8 @@ case PROMETHEUS_DEFAULTS: return "PROMETHEUS_DEFAULTS"; case PROTEUS_DEFAULTS: return "PROTEUS_DEFAULTS"; +case PROTEUS_ANALOG_PWM_TEST: + return "PROTEUS_ANALOG_PWM_TEST"; case PROTEUS_MIATA_NB2: return "PROTEUS_MIATA_NB2"; case PROTEUS_QC_TEST_BOARD: diff --git a/firmware/controllers/algo/engine_configuration.cpp b/firmware/controllers/algo/engine_configuration.cpp index 272d8c3d3b..5b82a1f9e7 100644 --- a/firmware/controllers/algo/engine_configuration.cpp +++ b/firmware/controllers/algo/engine_configuration.cpp @@ -1230,6 +1230,11 @@ void resetConfigurationExt(Logging * logger, configuration_callback_t boardCallb case PROTEUS_MIATA_NB2: setMiataNB2_ProteusEngineConfiguration(PASS_CONFIG_PARAMETER_SIGNATURE); break; +#ifdef HARDWARE_CI + case PROTEUS_ANALOG_PWM_TEST: + setProteusAnalogPwmTest(PASS_CONFIG_PARAMETER_SIGNATURE); + break; +#endif // HARDWARE_CI #endif // HW_PROTEUS #if HW_HELLEN case HELLEN_NB2: diff --git a/firmware/controllers/algo/rusefi_enums.h b/firmware/controllers/algo/rusefi_enums.h index 95199485bf..c36432a9ec 100644 --- a/firmware/controllers/algo/rusefi_enums.h +++ b/firmware/controllers/algo/rusefi_enums.h @@ -176,6 +176,8 @@ typedef enum { PROTEUS_DEFAULTS = 61, + PROTEUS_ANALOG_PWM_TEST = ET_PROTEUS_ANALOG_PWM_TEST, + VW_B6 = ET_VW_B6, BMW_M73_PROTEUS = ET_PROTEUS_BMW_M73, diff --git a/firmware/integration/rusefi_config.txt b/firmware/integration/rusefi_config.txt index c138140361..125bd7bc8e 100644 --- a/firmware/integration/rusefi_config.txt +++ b/firmware/integration/rusefi_config.txt @@ -479,6 +479,7 @@ end_struct #define ET_MIATA_TCU_PROTEUS 1 #define ET_CITROEN_TU3JP 65 #define ET_PROTEUS_QC_TEST_BOARD 42 +#define ET_PROTEUS_ANALOG_PWM_TEST 106 custom engine_type_e 4 bits, S32, @OFFSET@, [0:6], @@engine_type_e_auto_enum@@ diff --git a/java_console/autotest/src/com/rusefi/proteus/ProteusAnalogTest.java b/java_console/autotest/src/com/rusefi/proteus/ProteusAnalogTest.java index 0a4795643f..6f60dd16c4 100644 --- a/java_console/autotest/src/com/rusefi/proteus/ProteusAnalogTest.java +++ b/java_console/autotest/src/com/rusefi/proteus/ProteusAnalogTest.java @@ -5,8 +5,17 @@ import com.rusefi.core.Sensor; import com.rusefi.core.SensorCentral; import org.junit.Test; +import static com.rusefi.config.generated.Fields.*; +import static com.rusefi.IoUtil.*; +import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertTrue; +/* + This test requires a particular hardware setup connected to a Proteus board. + - External power supplied to the 12v_IGN pin, nominal 12 volts (but 11-13 will work, see testVbatt). + Go buy some cheapie $8 12v power supply, cut the barrel jack off, and crimp pins on. + - A jumper wire from Ignition output 10 to Analog volt 2 (TPS, see testTpsAnalogInput) + */ public class ProteusAnalogTest extends RusefiTestBase { @Test public void testVbatt() { @@ -16,4 +25,37 @@ public class ProteusAnalogTest extends RusefiTestBase { assertTrue(vbatt > 11); assertTrue(vbatt < 13); } + + void setIdlePositionAndAssertTps(int idle, int expectedTps) { + ecu.sendCommand("set idle_position " + idle); + + // wait a sec for sensors to update + sleepSeconds(1); + + double actualTps = SensorCentral.getInstance().getValue(Sensor.TPS); + + // Accept up to 2% error - the PWM is a bit noisy, but it should be at least close + assertEquals(expectedTps, actualTps, 2); + } + + @Test + public void testTpsAnalogInput() { + ecu.setEngineType(ET_PROTEUS_ANALOG_PWM_TEST); // proteus analog input PWM tester + ecu.changeRpm(1000); + // engine has to be spinning for idle valve to work + ecu.sendCommand(getEnableCommand(CMD_SELF_STIMULATION)); + + // 0% duty -> failed TPS (voltage too low) + setIdlePositionAndAssertTps(2, 0); + + // These should all be valid points + setIdlePositionAndAssertTps(20, 0); + setIdlePositionAndAssertTps(35, 25); + setIdlePositionAndAssertTps(50, 50); + setIdlePositionAndAssertTps(65, 75); + setIdlePositionAndAssertTps(80, 100); + + // 100% duty -> failed TPS (voltage too high) + setIdlePositionAndAssertTps(98, 0); + } } 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 e7e7fc23f5..9fec4ced8a 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 Tue Feb 02 14:16:48 UTC 2021 +// this file was generated automatically by rusEfi tool ConfigDefinition.jar based on gen_config.sh integration/rusefi_config.txt Wed Feb 03 10:46:27 PST 2021 // by class com.rusefi.output.FileJavaFieldsConsumer import com.rusefi.config.*; @@ -422,6 +422,7 @@ public class Fields { public static final int ET_MRE_NEW_TEST_BOARD = 31; public static final int ET_MRE_OLD_TEST_BOARD = 30; public static final int ET_MRE_SUBARU_EJ18 = 37; + public static final int ET_PROTEUS_ANALOG_PWM_TEST = 106; public static final int ET_PROTEUS_BMW_M73 = 63; public static final int ET_PROTEUS_MIATA_NB2 = 67; public static final int ET_PROTEUS_QC_TEST_BOARD = 42; @@ -1208,7 +1209,7 @@ public class Fields { public static final int servoOutputPins8_offset = 3147; public static final int showHumanReadableWarning_offset = 976; public static final int showSdCardWarning_offset = 76; - public static final int SIGNATURE_HASH = 937064025; + public static final int SIGNATURE_HASH = 920683779; public static final int silentTriggerError_offset = 1464; public static final int slowAdcAlpha_offset = 2088; public static final int sparkDwellRpmBins_offset = 332; @@ -1492,7 +1493,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 2021.02.02.all.937064025"; + public static final String TS_SIGNATURE = "rusEFI 2021.02.03.all.920683779"; 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;