rusefi/unit_tests/tests/test_knock.cpp

87 lines
2.1 KiB
C++

#include "pch.h"
#include "knock_logic.h"
struct MockKnockController : public KnockControllerBase {
float getKnockThreshold() const override {
// Knock threshold of 20dBv
return 20;
}
float getMaximumRetard() const override {
// Maximum 8 degrees retarded
return 8;
}
};
TEST(Knock, Retards) {
EngineTestHelper eth(engine_type_e::TEST_ENGINE);
// Aggression of 10%
engineConfiguration->knockRetardAggression = 10;
MockKnockController dut;
dut.onFastCallback();
// No retard unless we knock
ASSERT_FLOAT_EQ(dut.getKnockRetard(), 0);
// Send some weak knocks, should yield no response
for (size_t i = 0; i < 10; i++) {
dut.onKnockSenseCompleted(0, 10, 0, 0);
}
EXPECT_FLOAT_EQ(dut.getKnockRetard(), 0);
// Send a strong knock!
dut.onKnockSenseCompleted(0, 30, 0, 0);
// Should retard 10% of the distance between current timing and "maximum"
EXPECT_FLOAT_EQ(dut.getKnockRetard(), 2);
// Send tons of strong knocks, make sure we don't go over the configured limit
for (size_t i = 0; i < 100; i++) {
dut.onKnockSenseCompleted(0, 30, 0, 0);
}
EXPECT_FLOAT_EQ(dut.getKnockRetard(), 8);
}
TEST(Knock, Reapply) {
EngineTestHelper eth(engine_type_e::TEST_ENGINE);
MockKnockController dut;
dut.onFastCallback();
// Aggression of 10%
engineConfiguration->knockRetardAggression = 10;
// Apply 1 degree/second
engineConfiguration->knockRetardReapplyRate = 1;
// Send a strong knock!
dut.onKnockSenseCompleted(0, 30, 0, 0);
// Should retard 10% of the distance between current timing and "maximum"
EXPECT_FLOAT_EQ(dut.getKnockRetard(), 2);
constexpr auto fastPeriodSec = FAST_CALLBACK_PERIOD_MS / 1000.0f;
// call the fast callback, should reapply 1 degree * callback period
dut.onFastCallback();
EXPECT_FLOAT_EQ(dut.getKnockRetard(), 2 - 1.0f * fastPeriodSec);
// 10 updates total
for (size_t i = 0; i < 9; i++) {
dut.onFastCallback();
}
EXPECT_FLOAT_EQ(dut.getKnockRetard(), 2 - 10 * 1.0f * fastPeriodSec);
// Spend a long time without knock
for (size_t i = 0; i < 1000; i++) {
dut.onFastCallback();
}
// Should have no knock retard
EXPECT_FLOAT_EQ(dut.getKnockRetard(), 0);
}