rusefi/unit_tests/tests/ignition_injection/test_fuel_map.cpp

196 lines
8.4 KiB
C++
Raw Normal View History

2015-07-10 06:01:56 -07:00
/**
* @file test_fuel_map.cpp
*
* @date Nov 6, 2013
2020-01-07 21:02:40 -08:00
* @author Andrey Belomutskiy, (c) 2012-2020
2015-07-10 06:01:56 -07:00
*/
#include "pch.h"
2015-07-10 06:01:56 -07:00
#include "fuel_math.h"
#include "trigger_structure.h"
#include "trigger_decoder.h"
#include "advance_map.h"
2020-07-23 01:24:02 -07:00
using ::testing::FloatNear;
2015-07-10 06:01:56 -07:00
2019-01-14 12:31:56 -08:00
TEST(misc, testFuelMap) {
2015-07-10 06:01:56 -07:00
printf("Setting up FORD_ASPIRE_1996\r\n");
2019-01-19 17:42:29 -08:00
WITH_ENGINE_TEST_HELPER(FORD_ASPIRE_1996);
2015-07-10 06:01:56 -07:00
for (int i = 0; i < VBAT_INJECTOR_CURVE_SIZE; i++) {
CONFIG(injector.battLagCorrBins[i]) = i;
CONFIG(injector.battLagCorr[i]) = 0.5 + 2 * i;
2015-07-10 06:01:56 -07:00
}
2017-05-15 20:28:49 -07:00
eth.engine.updateSlowSensors(PASS_ENGINE_PARAMETER_SIGNATURE);
2015-07-10 06:01:56 -07:00
Sensor::setMockValue(SensorType::Clt, 36.605f);
Sensor::setMockValue(SensorType::Iat, 30.0f);
2015-07-10 06:01:56 -07:00
// because all the correction tables are zero
printf("*************************************************** getRunningFuel 1\r\n");
2017-05-15 20:28:49 -07:00
eth.engine.periodicFastCallback(PASS_ENGINE_PARAMETER_SIGNATURE);
2020-07-31 12:43:56 -07:00
ASSERT_NEAR(5.3679, getRunningFuel(5 PASS_ENGINE_PARAMETER_SUFFIX), EPS4D) << "base fuel";
2015-07-10 06:01:56 -07:00
printf("*************************************************** setting IAT table\r\n");
for (int i = 0; i < IAT_CURVE_SIZE; i++) {
eth.engine.config->iatFuelCorrBins[i] = i * 10;
2015-07-10 06:01:56 -07:00
eth.engine.config->iatFuelCorr[i] = 2 * i;
}
eth.engine.config->iatFuelCorr[0] = 2;
printf("*************************************************** setting CLT table\r\n");
for (int i = 0; i < CLT_CURVE_SIZE; i++) {
eth.engine.config->cltFuelCorrBins[i] = i * 10;
eth.engine.config->cltFuelCorr[i] = i;
2015-07-10 06:01:56 -07:00
}
2016-07-24 20:02:52 -07:00
Sensor::setMockValue(SensorType::Clt, 70.0f);
Sensor::setMockValue(SensorType::Iat, 30.0f);
setFlatInjectorLag(0 PASS_CONFIG_PARAMETER_SUFFIX);
2015-07-10 06:01:56 -07:00
float iatCorrection = getIatFuelCorrection(PASS_ENGINE_PARAMETER_SIGNATURE);
ASSERT_EQ( 6, iatCorrection) << "IAT";
2017-05-15 20:28:49 -07:00
float cltCorrection = getCltFuelCorrection(PASS_ENGINE_PARAMETER_SIGNATURE);
ASSERT_EQ( 7, cltCorrection) << "CLT";
2015-07-10 06:01:56 -07:00
engineConfiguration->mafAdcChannel = EFI_ADC_10;
engine->engineState.mockAdcState.setMockVoltage(EFI_ADC_10, 5 PASS_ENGINE_PARAMETER_SUFFIX);
2015-07-10 06:01:56 -07:00
// 1005 * 2 for IAT correction
printf("*************************************************** getRunningFuel 2\r\n");
2017-05-15 20:28:49 -07:00
eth.engine.periodicFastCallback(PASS_ENGINE_PARAMETER_SIGNATURE);
// Check that runningFuel corrects appropriately
EXPECT_EQ( 42, getRunningFuel(1 PASS_ENGINE_PARAMETER_SUFFIX)) << "v1";
EXPECT_EQ( 84, getRunningFuel(2 PASS_ENGINE_PARAMETER_SUFFIX)) << "v1";
2015-07-10 06:01:56 -07:00
engine->engineState.mockAdcState.setMockVoltage(EFI_ADC_10, 0 PASS_ENGINE_PARAMETER_SUFFIX);
2015-07-10 06:01:56 -07:00
engineConfiguration->cranking.baseFuel = 4000;
2015-07-10 06:01:56 -07:00
2020-06-18 05:54:02 -07:00
// Should use 20 degree correction in case of failed sensor
Sensor::resetMockValue(SensorType::Clt);
EXPECT_NEAR(12.4, getCrankingFuel3(2, 0 PASS_ENGINE_PARAMETER_SUFFIX), EPS4D);
2020-06-18 05:54:02 -07:00
Sensor::setMockValue(SensorType::Clt, 0);
EXPECT_NEAR(7.7333, getCrankingFuel3(2, 4 PASS_ENGINE_PARAMETER_SUFFIX), EPS4D);
2020-06-18 05:54:02 -07:00
Sensor::setMockValue(SensorType::Clt, 8);
EXPECT_NEAR(7, getCrankingFuel3(2, 15 PASS_ENGINE_PARAMETER_SUFFIX), EPS4D);
2020-06-18 05:54:02 -07:00
Sensor::setMockValue(SensorType::Clt, 70);
EXPECT_NEAR(8, getCrankingFuel3(2, 0 PASS_ENGINE_PARAMETER_SUFFIX), EPS4D);
2020-06-18 05:54:02 -07:00
Sensor::setMockValue(SensorType::Clt, 70);
EXPECT_NEAR(4, getCrankingFuel3(2, 50 PASS_ENGINE_PARAMETER_SUFFIX), EPS4D);
2015-07-10 06:01:56 -07:00
}
static void confgiureFordAspireTriggerWaveform(TriggerWaveform * s) {
s->initialize(FOUR_STROKE_CAM_SENSOR);
2015-07-10 06:01:56 -07:00
2018-12-25 07:35:22 -08:00
s->addEvent720(53.747, T_SECONDARY, TV_RISE);
s->addEvent720(121.90, T_SECONDARY, TV_FALL);
s->addEvent720(232.76, T_SECONDARY, TV_RISE);
s->addEvent720(300.54, T_SECONDARY, TV_FALL);
s->addEvent720(360, T_PRIMARY, TV_RISE);
2015-10-31 13:02:10 -07:00
2018-12-25 07:35:22 -08:00
s->addEvent720(409.8412, T_SECONDARY, TV_RISE);
s->addEvent720(478.6505, T_SECONDARY, TV_FALL);
s->addEvent720(588.045, T_SECONDARY, TV_RISE);
s->addEvent720(657.03, T_SECONDARY, TV_FALL);
s->addEvent720(720, T_PRIMARY, TV_FALL);
2015-07-10 06:01:56 -07:00
ASSERT_FLOAT_EQ(53.747 / 720, s->wave->getSwitchTime(0));
ASSERT_EQ( 1, s->wave->getChannelState(1, 0)) << "@0";
ASSERT_EQ( 1, s->wave->getChannelState(1, 0)) << "@0";
2015-07-10 06:01:56 -07:00
ASSERT_EQ( 0, s->wave->getChannelState(0, 1)) << "@1";
ASSERT_EQ( 0, s->wave->getChannelState(1, 1)) << "@1";
2015-07-10 06:01:56 -07:00
ASSERT_EQ( 0, s->wave->getChannelState(0, 2)) << "@2";
ASSERT_EQ( 1, s->wave->getChannelState(1, 2)) << "@2";
2015-07-10 06:01:56 -07:00
ASSERT_EQ( 0, s->wave->getChannelState(0, 3)) << "@3";
ASSERT_EQ( 0, s->wave->getChannelState(1, 3)) << "@3";
2015-07-10 06:01:56 -07:00
ASSERT_EQ( 1, s->wave->getChannelState(0, 4)) << "@4";
ASSERT_EQ( 1, s->wave->getChannelState(1, 5)) << "@5";
ASSERT_EQ( 0, s->wave->getChannelState(1, 8)) << "@8";
ASSERT_FLOAT_EQ(121.90 / 720, s->wave->getSwitchTime(1));
ASSERT_FLOAT_EQ(657.03 / 720, s->wave->getSwitchTime(8));
2015-07-10 06:01:56 -07:00
ASSERT_EQ( 0, s->wave->findAngleMatch(53.747 / 720.0)) << "expecting 0";
assertEqualsM("expecting not found", -1, s->wave->findAngleMatch(53 / 720.0));
ASSERT_EQ(7, s->wave->findAngleMatch(588.045 / 720.0));
2015-07-10 06:01:56 -07:00
ASSERT_EQ( 0, s->wave->findInsertionAngle(23.747 / 720.0)) << "expecting 0";
ASSERT_EQ( 1, s->wave->findInsertionAngle(63.747 / 720.0)) << "expecting 1";
2015-07-10 06:01:56 -07:00
}
2019-01-14 12:31:56 -08:00
TEST(misc, testAngleResolver) {
2015-07-10 06:01:56 -07:00
printf("*************************************************** testAngleResolver\r\n");
2019-01-19 17:42:29 -08:00
WITH_ENGINE_TEST_HELPER(FORD_ASPIRE_1996);
2015-07-10 06:01:56 -07:00
engineConfiguration->globalTriggerAngleOffset = 175;
2016-12-18 09:03:48 -08:00
TriggerWaveform * ts = &engine->triggerCentral.triggerShape;
2020-08-24 21:59:07 -07:00
TriggerFormDetails *triggerFormDetails = &engine->triggerCentral.triggerFormDetails;
engine->initializeTriggerWaveform(PASS_ENGINE_PARAMETER_SIGNATURE);
2015-07-10 06:01:56 -07:00
assertEqualsM("index 2", 52.76, triggerFormDetails->eventAngles[3]); // this angle is relation to synch point
assertEqualsM("time 2", 0.3233, ts->wave->getSwitchTime(2));
assertEqualsM("index 5", 412.76, triggerFormDetails->eventAngles[6]);
assertEqualsM("time 5", 0.5733, ts->wave->getSwitchTime(5));
2015-07-10 06:01:56 -07:00
ASSERT_EQ(4, ts->getTriggerWaveformSynchPointIndex());
2015-07-10 06:01:56 -07:00
2019-01-14 15:38:20 -08:00
ASSERT_EQ( 10, ts->getSize()) << "shape size";
2015-07-10 06:01:56 -07:00
2016-11-30 19:06:43 -08:00
event_trigger_position_s injectionStart;
2015-07-10 06:01:56 -07:00
printf("*************************************************** testAngleResolver 0\r\n");
2020-08-24 21:59:07 -07:00
findTriggerPosition(&ENGINE(triggerCentral.triggerShape), &ENGINE(triggerCentral.triggerFormDetails),&injectionStart, -122, engineConfiguration->globalTriggerAngleOffset);
2019-10-07 21:54:19 -07:00
ASSERT_EQ( 2, injectionStart.triggerEventIndex) << "eventIndex@0";
ASSERT_NEAR(0.24, injectionStart.angleOffsetFromTriggerEvent, EPS5D);
2015-07-10 06:01:56 -07:00
printf("*************************************************** testAngleResolver 0.1\r\n");
2020-08-24 21:59:07 -07:00
findTriggerPosition(&ENGINE(triggerCentral.triggerShape), &ENGINE(triggerCentral.triggerFormDetails),&injectionStart, -80, engineConfiguration->globalTriggerAngleOffset);
2019-10-07 21:54:19 -07:00
ASSERT_EQ( 2, injectionStart.triggerEventIndex) << "eventIndex@0";
ASSERT_FLOAT_EQ(42.24, injectionStart.angleOffsetFromTriggerEvent);
2015-07-10 06:01:56 -07:00
printf("*************************************************** testAngleResolver 0.2\r\n");
2020-08-24 21:59:07 -07:00
findTriggerPosition(&ENGINE(triggerCentral.triggerShape), &ENGINE(triggerCentral.triggerFormDetails),&injectionStart, -54, engineConfiguration->globalTriggerAngleOffset);
2019-10-07 21:54:19 -07:00
ASSERT_EQ( 2, injectionStart.triggerEventIndex) << "eventIndex@0";
ASSERT_FLOAT_EQ(68.2400, injectionStart.angleOffsetFromTriggerEvent);
2015-07-10 06:01:56 -07:00
printf("*************************************************** testAngleResolver 0.3\r\n");
2020-08-24 21:59:07 -07:00
findTriggerPosition(&ENGINE(triggerCentral.triggerShape), &ENGINE(triggerCentral.triggerFormDetails),&injectionStart, -53, engineConfiguration->globalTriggerAngleOffset);
2019-10-07 21:54:19 -07:00
ASSERT_EQ(2, injectionStart.triggerEventIndex);
ASSERT_FLOAT_EQ(69.24, injectionStart.angleOffsetFromTriggerEvent);
2015-07-10 06:01:56 -07:00
printf("*************************************************** testAngleResolver 1\r\n");
2020-08-24 21:59:07 -07:00
findTriggerPosition(&ENGINE(triggerCentral.triggerShape), &ENGINE(triggerCentral.triggerFormDetails),&injectionStart, 0, engineConfiguration->globalTriggerAngleOffset);
2019-10-07 21:54:19 -07:00
ASSERT_EQ(2, injectionStart.triggerEventIndex);
ASSERT_FLOAT_EQ(122.24, injectionStart.angleOffsetFromTriggerEvent);
2015-07-10 06:01:56 -07:00
printf("*************************************************** testAngleResolver 2\r\n");
2020-08-24 21:59:07 -07:00
findTriggerPosition(&ENGINE(triggerCentral.triggerShape), &ENGINE(triggerCentral.triggerFormDetails),&injectionStart, 56, engineConfiguration->globalTriggerAngleOffset);
2019-10-07 21:54:19 -07:00
ASSERT_EQ(2, injectionStart.triggerEventIndex);
ASSERT_FLOAT_EQ(178.24, injectionStart.angleOffsetFromTriggerEvent);
2015-07-10 06:01:56 -07:00
TriggerWaveform t;
confgiureFordAspireTriggerWaveform(&t);
2015-07-10 06:01:56 -07:00
}
2019-01-14 12:31:56 -08:00
TEST(misc, testPinHelper) {
2015-07-10 06:01:56 -07:00
printf("*************************************************** testPinHelper\r\n");
2019-01-14 15:00:59 -08:00
ASSERT_EQ(0, getElectricalValue(0, OM_DEFAULT));
ASSERT_EQ(1, getElectricalValue(1, OM_DEFAULT));
2015-07-10 06:01:56 -07:00
2019-01-14 15:00:59 -08:00
ASSERT_EQ(0, getElectricalValue(1, OM_INVERTED));
ASSERT_EQ(1, getElectricalValue(0, OM_INVERTED));
2015-07-10 06:01:56 -07:00
}