diff --git a/firmware/controllers/algo/engine.cpp b/firmware/controllers/algo/engine.cpp index 0f873c755e..1e55e60032 100644 --- a/firmware/controllers/algo/engine.cpp +++ b/firmware/controllers/algo/engine.cpp @@ -192,9 +192,9 @@ void Engine::updateTriggerWaveform() { } #if ANALOG_HW_CHECK_MODE -static void assertCloseTo(const char * msg, float actual, float expected) { - if (actual < 0.75 * expected || actual > 1.25 * expected) { - firmwareError(OBD_PCM_Processor_Fault, "%s analog input validation failed %f vs %f", msg, actual, expected); +static void assertCloseTo(const char * msg, float actual, float expected, float lowRatio, float highRatio) { + if (actual < lowRatio * expected || actual > highRatio * expected) { + firmwareError(OBD_PCM_Processor_Fault, "%s validation failed actual=%f vs expected=%f", msg, actual, expected); } } #endif // ANALOG_HW_CHECK_MODE @@ -249,8 +249,13 @@ void Engine::periodicSlowCallback() { #if ANALOG_HW_CHECK_MODE efiAssertVoid(OBD_PCM_Processor_Fault, isAdcChannelValid(engineConfiguration->clt.adcChannel), "No CLT setting"); efitimesec_t secondsNow = getTimeNowSeconds(); + +#if ! HW_CHECK_ALWAYS_STIMULATE + fail("HW_CHECK_ALWAYS_STIMULATE required to have self-stimulation") +#endif + if (secondsNow > 2 && secondsNow < 180) { - assertCloseTo("RPM", Sensor::get(SensorType::Rpm).Value, HW_CHECK_RPM); + assertCloseTo("RPM", Sensor::get(SensorType::Rpm).Value, HW_CHECK_RPM, 0.9, 1.1); } else if (!hasFirmwareError() && secondsNow > 180) { static bool isHappyTest = false; if (!isHappyTest) { @@ -259,10 +264,11 @@ void Engine::periodicSlowCallback() { isHappyTest = true; } } - assertCloseTo("clt", Sensor::get(SensorType::Clt).Value, 49.3); - assertCloseTo("iat", Sensor::get(SensorType::Iat).Value, 73.2); - assertCloseTo("aut1", Sensor::get(SensorType::AuxTemp1).Value, 13.8); - assertCloseTo("aut2", Sensor::get(SensorType::AuxTemp2).Value, 6.2); + assertCloseTo("clt", Sensor::get(SensorType::Clt).Value, 49.3, 0.75, 1.25); + assertCloseTo("iat", Sensor::get(SensorType::Iat).Value, 73.2, 0.75, 1.25); + assertCloseTo("aut1", Sensor::get(SensorType::AuxTemp1).Value, 13.8, 0.75, 1.25); + // huh? why such a wide gap? smaller resistor delta causes large temperature delta on the left side of the curve? + assertCloseTo("aut2", Sensor::get(SensorType::AuxTemp2).Value, 6.2, 0.75, 2); #endif // ANALOG_HW_CHECK_MODE }