require TPS values to be different (#2017)

* require values to be different

* fix not

* oops

* missed another spot

* test negative cases too

* resets

* test no sensor case

Co-authored-by: Matthew Kennedy <makenne@microsoft.com>
This commit is contained in:
Matthew Kennedy 2020-12-05 23:41:49 -06:00 committed by GitHub
parent ffae0cd335
commit 2d9be1077b
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
3 changed files with 66 additions and 10 deletions

View File

@ -12,6 +12,10 @@ public:
void showInfo(Logging* logger, float testRawValue) const override;
float getDivideInput() const {
return m_divideInput;
}
private:
// Linear equation parameters for equation of form
// y = ax + b

View File

@ -39,12 +39,25 @@ LinearFunc idlePosFunc(PACK_MULT_VOLTAGE);
FunctionalSensor wastegateSens(SensorType::WastegatePosition, MS2NT(10));
FunctionalSensor idlePosSens(SensorType::IdlePosition, MS2NT(10));
static void configureTps(LinearFunc& func, float closed, float open, float min, float max) {
static bool configureTps(LinearFunc& func, float closed, float open, float min, float max, const char* msg) {
float scaledClosed = closed / func.getDivideInput();
float scaledOpen = open / func.getDivideInput();
float split = absF(scaledOpen - scaledClosed);
// If the voltage for closed vs. open is very near, something is wrong with your calibration
if (split < 0.5f) {
firmwareError(OBD_Throttle_Position_Sensor_Circuit_Malfunction, "Sensor \"%s\" problem: open/closed calibration values are too close together. Please check your wiring!", msg);
return false;
}
func.configure(
closed, 0,
open, 100,
min, max
);
return true;
}
static bool initTpsFunc(LinearFunc& func, FunctionalSensor& sensor, adc_channel_e channel, float closed, float open, float min, float max) {
@ -53,7 +66,10 @@ static bool initTpsFunc(LinearFunc& func, FunctionalSensor& sensor, adc_channel_
return false;
}
configureTps(func, closed, open, min, max);
// If the configuration was invalid, don't continues to configure the sensor
if (!configureTps(func, closed, open, min, max, sensor.getSensorName())) {
return false;
}
sensor.setFunction(func);
@ -110,14 +126,14 @@ void reconfigureTps(DECLARE_CONFIG_PARAMETER_SIGNATURE) {
float min = CONFIG(tpsErrorDetectionTooLow);
float max = CONFIG(tpsErrorDetectionTooHigh);
configureTps(tpsFunc1p, CONFIG(tpsMin), CONFIG(tpsMax), min, max);
configureTps(tpsFunc1s, CONFIG(tps1SecondaryMin), CONFIG(tps1SecondaryMax), min, max);
configureTps(tpsFunc2p, CONFIG(tps2Min), CONFIG(tps2Max), min, max);
configureTps(tpsFunc2s, CONFIG(tps2SecondaryMin), CONFIG(tps2SecondaryMax), min, max);
configureTps(tpsFunc1p, CONFIG(tpsMin), CONFIG(tpsMax), min, max, tpsSens1p.getSensorName());
configureTps(tpsFunc1s, CONFIG(tps1SecondaryMin), CONFIG(tps1SecondaryMax), min, max, tpsSens1s.getSensorName());
configureTps(tpsFunc2p, CONFIG(tps2Min), CONFIG(tps2Max), min, max, tpsSens2p.getSensorName());
configureTps(tpsFunc2s, CONFIG(tps2SecondaryMin), CONFIG(tps2SecondaryMax), min, max, tpsSens2s.getSensorName());
configureTps(pedalFuncPrimary, CONFIG(throttlePedalUpVoltage), CONFIG(throttlePedalWOTVoltage), min, max);
configureTps(pedalFuncSecondary, CONFIG(throttlePedalSecondaryUpVoltage), CONFIG(throttlePedalSecondaryWOTVoltage), min, max);
configureTps(pedalFuncPrimary, CONFIG(throttlePedalUpVoltage), CONFIG(throttlePedalWOTVoltage), min, max, pedalSensorPrimary.getSensorName());
configureTps(pedalFuncSecondary, CONFIG(throttlePedalSecondaryUpVoltage), CONFIG(throttlePedalSecondaryWOTVoltage), min, max, pedalSensorSecondary.getSensorName());
configureTps(wastegateFunc, CONFIG(wastegatePositionMin), CONFIG(wastegatePositionMax), min, max);
configureTps(idlePosFunc, CONFIG(idlePositionMin), CONFIG(idlePositionMax), min, max);
configureTps(wastegateFunc, CONFIG(wastegatePositionMin), CONFIG(wastegatePositionMax), min, max, wastegateSens.getSensorName());
configureTps(idlePosFunc, CONFIG(idlePositionMin), CONFIG(idlePositionMax), min, max, idlePosSens.getSensorName());
}

View File

@ -51,6 +51,42 @@ TEST(SensorInit, Tps) {
EXPECT_NEAR(50.0f, Sensor::get(SensorType::Tps1).value_or(-1), EPS2D);
}
TEST(SensorInit, TpsValuesTooClose) {
WITH_ENGINE_TEST_HELPER(TEST_ENGINE);
// Should fail, 0.49 volts apart
CONFIG(tpsMin) = 200; // 1.00 volt
CONFIG(tpsMax) = 298; // 1.49 volts
EXPECT_FATAL_ERROR(initTps(PASS_CONFIG_PARAMETER_SIGNATURE));
Sensor::resetRegistry();
// Should fail, -0.49 volts apart
CONFIG(tpsMin) = 298; // 1.49 volt
CONFIG(tpsMax) = 200; // 1.00 volts
EXPECT_FATAL_ERROR(initTps(PASS_CONFIG_PARAMETER_SIGNATURE));
Sensor::resetRegistry();
// Should succeed, 0.51 volts apart
CONFIG(tpsMin) = 200; // 1.00 volt
CONFIG(tpsMax) = 302; // 1.51 volts
EXPECT_NO_FATAL_ERROR(initTps(PASS_CONFIG_PARAMETER_SIGNATURE));
Sensor::resetRegistry();
// Should succeed, -0.51 volts apart
CONFIG(tpsMin) = 302; // 1.51 volt
CONFIG(tpsMax) = 200; // 1.00 volts
EXPECT_NO_FATAL_ERROR(initTps(PASS_CONFIG_PARAMETER_SIGNATURE));
Sensor::resetRegistry();
// With no pin, it should be ok that they are the same
// Should succeed, -0.51 volts apart
CONFIG(tps1_1AdcChannel) = ADC_CHANNEL_NONE;
CONFIG(tpsMin) = 200; // 1.00 volt
CONFIG(tpsMax) = 200; // 1.00 volts
EXPECT_NO_FATAL_ERROR(initTps(PASS_CONFIG_PARAMETER_SIGNATURE));
Sensor::resetRegistry();
}
TEST(SensorInit, Pedal) {
WITH_ENGINE_TEST_HELPER(TEST_ENGINE);