add test_ignition_angle_advance #5611

This commit is contained in:
kifir 2024-05-27 22:45:59 +03:00 committed by rusefillc
parent aeb30232f2
commit 68ba4ed096
2 changed files with 287 additions and 0 deletions

View File

@ -0,0 +1,286 @@
//
// Created by kifir on 5/27/24.
//
// Tests for functionality decscribed in https://github.com/rusefi/rusefi/issues/5611
//
#include "pch.h"
constexpr float TEST_IGNITION_650 = 15.3f;
constexpr float TEST_IGNITION_800 = 15.4f;
constexpr float TEST_IGNITION_1100 = 15.5f;
constexpr float TEST_IGNITION_1400 = 15.6f;
constexpr float TEST_IGNITION_1700 = 15.7f;
constexpr float TEST_IGNITION_2000 = 15.8f;
constexpr float TEST_IGNITION_2300 = 15.9f;
constexpr float TEST_IGNITION_2600 = 16.0f;
constexpr float TEST_IGNITION_2900 = 16.1f;
constexpr float TEST_IGNITION_3200 = 16.2f;
constexpr float TEST_IGNITION_3500 = 16.3f;
constexpr float TEST_IGNITION_3800 = 16.4f;
constexpr float TEST_IGNITION_4100 = 16.5f;
constexpr float TEST_IGNITION_4400 = 16.6f;
constexpr float TEST_IGNITION_4700 = 16.7f;
constexpr float TEST_IGNITION_7000 = 16.8f;
constexpr int TEST_LAUNCH_RPM = 3800;
constexpr int TEST_LAUNCH_RPM_WINDOW = 1800;
constexpr int TEST_SMOOTH_RETARD_END_RPM = 900;
constexpr int TEST_SMOOTH_RETARD_RPM_WINDOW_START = TEST_LAUNCH_RPM - TEST_LAUNCH_RPM_WINDOW;
constexpr int TEST_SMOOTH_RETARD_RPM_WINDOW_END = TEST_LAUNCH_RPM - TEST_SMOOTH_RETARD_END_RPM;
constexpr int TEST_SMOOTH_RETARD_RPM_WINDOW = TEST_SMOOTH_RETARD_RPM_WINDOW_END - TEST_SMOOTH_RETARD_RPM_WINDOW_START;
constexpr float TEST_LAUNCH_TIMING_RETARD = 17.0f;
static void setUpTestParameters() {
for (int loadIdx = 0; loadIdx < IGN_LOAD_COUNT; loadIdx++) {
config->ignitionTable[loadIdx][0] = TEST_IGNITION_650;
config->ignitionTable[loadIdx][1] = TEST_IGNITION_800;
config->ignitionTable[loadIdx][2] = TEST_IGNITION_1100;
config->ignitionTable[loadIdx][3] = TEST_IGNITION_1400;
config->ignitionTable[loadIdx][4] = TEST_IGNITION_1700;
config->ignitionTable[loadIdx][5] = TEST_IGNITION_2000;
config->ignitionTable[loadIdx][6] = TEST_IGNITION_2300;
config->ignitionTable[loadIdx][7] = TEST_IGNITION_2600;
config->ignitionTable[loadIdx][8] = TEST_IGNITION_2900;
config->ignitionTable[loadIdx][9] = TEST_IGNITION_3200;
config->ignitionTable[loadIdx][10] = TEST_IGNITION_3500;
config->ignitionTable[loadIdx][11] = TEST_IGNITION_3800;
config->ignitionTable[loadIdx][12] = TEST_IGNITION_4100;
config->ignitionTable[loadIdx][13] = TEST_IGNITION_4400;
config->ignitionTable[loadIdx][14] = TEST_IGNITION_4700;
config->ignitionTable[loadIdx][15] = TEST_IGNITION_7000;
}
engineConfiguration->launchControlEnabled = true;
engineConfiguration->launchRpm = TEST_LAUNCH_RPM;
engineConfiguration->launchRpmWindow = TEST_LAUNCH_RPM_WINDOW;
engineConfiguration->smoothRetardEndRpm = TEST_SMOOTH_RETARD_END_RPM;
engineConfiguration->launchSparkCutEnable = true;
engineConfiguration->launchTimingRetard = TEST_LAUNCH_TIMING_RETARD;
}
static float getTestAdvance(const float rpm) {
return getAdvance(rpm, 500.0f); // we don't care of load in this test
}
static void updateRpm(const int rpm) {
Sensor::setMockValue(SensorType::Rpm, rpm);
// run the ignition math
engine->periodicFastCallback();
EXPECT_EQ(
engine->launchController.isSmoothRetardCondition,
(TEST_SMOOTH_RETARD_RPM_WINDOW_START <= rpm) && (rpm <= TEST_SMOOTH_RETARD_RPM_WINDOW_END)
);
}
TEST(ignitionAngleAdvance, withoutLaunchRetard) {
EngineTestHelper eth(engine_type_e::TEST_ENGINE);
setUpTestParameters();
ASSERT_FALSE(engineConfiguration->enableLaunchRetard);
ASSERT_FALSE(engineConfiguration->launchSmoothRetard);
ASSERT_FALSE(engine->launchController.isSmoothRetardCondition);
updateRpm(650);
EXPECT_NEAR(TEST_IGNITION_650, engine->ignitionState.baseIgnitionAdvance, EPS5D);
updateRpm(800);
EXPECT_NEAR(TEST_IGNITION_800, engine->ignitionState.baseIgnitionAdvance, EPS5D);
updateRpm(1100);
EXPECT_NEAR(TEST_IGNITION_1100, engine->ignitionState.baseIgnitionAdvance, EPS5D);
updateRpm(1400);
EXPECT_NEAR(TEST_IGNITION_1400, engine->ignitionState.baseIgnitionAdvance, EPS5D);
updateRpm(1700);
EXPECT_NEAR(TEST_IGNITION_1700, engine->ignitionState.baseIgnitionAdvance, EPS5D);
EXPECT_FALSE(engine->launchController.isSmoothRetardCondition);
updateRpm(2000);
/* We've entered smooth retard RPM window: */
EXPECT_NEAR(TEST_IGNITION_2000, engine->ignitionState.baseIgnitionAdvance, EPS5D);
EXPECT_TRUE(engine->launchController.isSmoothRetardCondition);
updateRpm(2300);
EXPECT_NEAR(TEST_IGNITION_2300, engine->ignitionState.baseIgnitionAdvance, EPS5D);
updateRpm(2600);
EXPECT_NEAR(TEST_IGNITION_2600, engine->ignitionState.baseIgnitionAdvance, EPS5D);
updateRpm(2900);
EXPECT_NEAR(TEST_IGNITION_2900, engine->ignitionState.baseIgnitionAdvance, EPS5D);
EXPECT_TRUE(engine->launchController.isSmoothRetardCondition);
updateRpm(3200);
/* We've left smooth retard RPM window: */
EXPECT_NEAR(TEST_IGNITION_3200, engine->ignitionState.baseIgnitionAdvance, EPS5D);
EXPECT_FALSE(engine->launchController.isSmoothRetardCondition);
updateRpm(3500);
EXPECT_NEAR(TEST_IGNITION_3500, engine->ignitionState.baseIgnitionAdvance, EPS5D);
updateRpm(3800);
/* We've reached TEST_LAUNCH_RPM: */
EXPECT_NEAR(TEST_IGNITION_3800, engine->ignitionState.baseIgnitionAdvance, EPS5D);
updateRpm(4100);
EXPECT_NEAR(TEST_IGNITION_4100, engine->ignitionState.baseIgnitionAdvance, EPS5D);
updateRpm(4400);
EXPECT_NEAR(TEST_IGNITION_4400, engine->ignitionState.baseIgnitionAdvance, EPS5D);
updateRpm(4700);
EXPECT_NEAR(TEST_IGNITION_4700, engine->ignitionState.baseIgnitionAdvance, EPS5D);
updateRpm(7000);
EXPECT_NEAR(TEST_IGNITION_7000, engine->ignitionState.baseIgnitionAdvance, EPS5D);
EXPECT_FALSE(engine->launchController.isSmoothRetardCondition);
}
TEST(ignitionAngleAdvance, launchRetardWithoutSmooth) {
EngineTestHelper eth(engine_type_e::TEST_ENGINE);
setUpTestParameters();
engineConfiguration->enableLaunchRetard = true;
ASSERT_FALSE(engineConfiguration->launchSmoothRetard);
updateRpm(650);
EXPECT_NEAR(TEST_IGNITION_650, engine->ignitionState.baseIgnitionAdvance, EPS5D);
EXPECT_FALSE(engine->launchController.isSmoothRetardCondition);
updateRpm(800);
EXPECT_NEAR(TEST_IGNITION_800, engine->ignitionState.baseIgnitionAdvance, EPS5D);
updateRpm(1100);
EXPECT_NEAR(TEST_IGNITION_1100, engine->ignitionState.baseIgnitionAdvance, EPS5D);
updateRpm(1400);
EXPECT_NEAR(TEST_IGNITION_1400, engine->ignitionState.baseIgnitionAdvance, EPS5D);
updateRpm(1700);
EXPECT_NEAR(TEST_IGNITION_1700, engine->ignitionState.baseIgnitionAdvance, EPS5D);
EXPECT_FALSE(engine->launchController.isSmoothRetardCondition);
updateRpm(2000);
/* We've entered smooth retard RPM window: */
EXPECT_NEAR(TEST_IGNITION_2000, engine->ignitionState.baseIgnitionAdvance, EPS5D);
EXPECT_TRUE(engine->launchController.isSmoothRetardCondition);
updateRpm(2300);
EXPECT_NEAR(TEST_LAUNCH_TIMING_RETARD, engine->ignitionState.baseIgnitionAdvance, EPS5D);
updateRpm(2600);
EXPECT_NEAR(TEST_LAUNCH_TIMING_RETARD, engine->ignitionState.baseIgnitionAdvance, EPS5D);
updateRpm(2900);
EXPECT_NEAR(TEST_LAUNCH_TIMING_RETARD, engine->ignitionState.baseIgnitionAdvance, EPS5D);
EXPECT_TRUE(engine->launchController.isSmoothRetardCondition);
updateRpm(3200);
/* We've left smooth retard RPM window: */
EXPECT_NEAR(TEST_LAUNCH_TIMING_RETARD, engine->ignitionState.baseIgnitionAdvance, EPS5D);
EXPECT_FALSE(engine->launchController.isSmoothRetardCondition);
updateRpm(3500);
EXPECT_NEAR(TEST_IGNITION_3500, engine->ignitionState.baseIgnitionAdvance, EPS5D);
updateRpm(3800);
/* We've reached TEST_LAUNCH_RPM: */
EXPECT_NEAR(TEST_IGNITION_3800, engine->ignitionState.baseIgnitionAdvance, EPS5D);
updateRpm(4100);
EXPECT_NEAR(TEST_IGNITION_4100, engine->ignitionState.baseIgnitionAdvance, EPS5D);
updateRpm(4400);
EXPECT_NEAR(TEST_IGNITION_4400, engine->ignitionState.baseIgnitionAdvance, EPS5D);
updateRpm(4700);
EXPECT_NEAR(TEST_IGNITION_4700, engine->ignitionState.baseIgnitionAdvance, EPS5D);
updateRpm(7000);
EXPECT_NEAR(TEST_IGNITION_7000, engine->ignitionState.baseIgnitionAdvance, EPS5D);
EXPECT_FALSE(engine->launchController.isSmoothRetardCondition);
}
TEST(ignitionAngleAdvance, launchSmoothRetard) {
EngineTestHelper eth(engine_type_e::TEST_ENGINE);
setUpTestParameters();
engineConfiguration->enableLaunchRetard = true;
engineConfiguration->launchSmoothRetard = true;
updateRpm(650);
EXPECT_NEAR(TEST_IGNITION_650, engine->ignitionState.baseIgnitionAdvance, EPS5D);
EXPECT_FALSE(engine->launchController.isSmoothRetardCondition);
updateRpm(800);
EXPECT_NEAR(TEST_IGNITION_800, engine->ignitionState.baseIgnitionAdvance, EPS5D);
updateRpm(1100);
EXPECT_NEAR(TEST_IGNITION_1100, engine->ignitionState.baseIgnitionAdvance, EPS5D);
updateRpm(1400);
EXPECT_NEAR(TEST_IGNITION_1400, engine->ignitionState.baseIgnitionAdvance, EPS5D);
updateRpm(1700);
EXPECT_NEAR(TEST_IGNITION_1700, engine->ignitionState.baseIgnitionAdvance, EPS5D);
EXPECT_FALSE(engine->launchController.isSmoothRetardCondition);
updateRpm(2000);
/* We've entered smooth retard RPM window: */
EXPECT_NEAR(TEST_IGNITION_2000, engine->ignitionState.baseIgnitionAdvance, EPS5D);
EXPECT_TRUE(engine->launchController.isSmoothRetardCondition);
updateRpm(2300);
EXPECT_NEAR(
TEST_IGNITION_2300
+ (2300.0f - TEST_SMOOTH_RETARD_RPM_WINDOW_START) * (TEST_LAUNCH_TIMING_RETARD - TEST_IGNITION_2300)
/ TEST_SMOOTH_RETARD_RPM_WINDOW,
engine->ignitionState.baseIgnitionAdvance,
EPS2D //TODO: check if this precision loss is expected
);
updateRpm(2600);
EXPECT_NEAR(
TEST_IGNITION_2600
+ (2600.0f - TEST_SMOOTH_RETARD_RPM_WINDOW_START) * (TEST_LAUNCH_TIMING_RETARD - TEST_IGNITION_2600)
/ TEST_SMOOTH_RETARD_RPM_WINDOW,
engine->ignitionState.baseIgnitionAdvance,
EPS2D //TODO: check if this precision loss is expected
);
updateRpm(2900);
EXPECT_NEAR(TEST_LAUNCH_TIMING_RETARD, engine->ignitionState.baseIgnitionAdvance, EPS5D);
EXPECT_TRUE(engine->launchController.isSmoothRetardCondition);
updateRpm(3200);
/* We've left smooth retard RPM window: */
EXPECT_NEAR(TEST_LAUNCH_TIMING_RETARD, engine->ignitionState.baseIgnitionAdvance, EPS5D);
EXPECT_FALSE(engine->launchController.isSmoothRetardCondition);
updateRpm(3500);
EXPECT_NEAR(TEST_IGNITION_3500, engine->ignitionState.baseIgnitionAdvance, EPS5D);
updateRpm(3800);
/* We've reached TEST_LAUNCH_RPM: */
EXPECT_NEAR(TEST_IGNITION_3800, engine->ignitionState.baseIgnitionAdvance, EPS5D);
updateRpm(4100);
EXPECT_NEAR(TEST_IGNITION_4100, engine->ignitionState.baseIgnitionAdvance, EPS5D);
updateRpm(4400);
EXPECT_NEAR(TEST_IGNITION_4400, engine->ignitionState.baseIgnitionAdvance, EPS5D);
updateRpm(4700);
EXPECT_NEAR(TEST_IGNITION_4700, engine->ignitionState.baseIgnitionAdvance, EPS5D);
updateRpm(7000);
EXPECT_NEAR(TEST_IGNITION_7000, engine->ignitionState.baseIgnitionAdvance, EPS5D);
EXPECT_FALSE(engine->launchController.isSmoothRetardCondition);
}

View File

@ -46,6 +46,7 @@ TESTS_SRC_CPP = \
tests/ignition_injection/test_odd_firing_engine.cpp \
tests/launch/test_target_skip_ratio.cpp \
tests/launch/test_rpm_condition.cpp \
tests/launch/test_ignition_angle_advance.cpp \
tests/lua/test_lua_basic.cpp \
tests/lua/test_lookup.cpp \
tests/lua/test_lua_e38.cpp \