145 lines
4.8 KiB
C++
145 lines
4.8 KiB
C++
//
|
|
// Created by kifir on 12/2/24.
|
|
//
|
|
|
|
#include "pch.h"
|
|
|
|
#include "util/test_base.h"
|
|
|
|
namespace {
|
|
class NitrousConditionTest : public TestBase {
|
|
protected:
|
|
static constexpr switch_input_pin_e TEST_NITROUS_CONTROL_ARMING_PIN = Gpio::A13;
|
|
static constexpr int TEST_MIN_TPS = 34;
|
|
static constexpr uint8_t TEST_MIN_CLT = 51;
|
|
static constexpr int TEST_MAX_MAP = 45;
|
|
|
|
static constexpr float TEST_MAXIMUM_AFR = 12.3;
|
|
static constexpr float TEST_LAMBDA1 = TEST_MAXIMUM_AFR / STOICH_RATIO;
|
|
|
|
static constexpr uint16_t TEST_ACTIVATION_RPM = 239;
|
|
static constexpr uint16_t TEST_DEACTIVATION_RPM = 932;
|
|
static constexpr uint16_t TEST_DEACTIVATION_RPM_WINDOW = 17;
|
|
|
|
void SetUp() override;
|
|
|
|
void satisfyAllConditions();
|
|
private:
|
|
void armNitrousControl();
|
|
void satisfyTpsCondition();
|
|
void satisfyCltCondition();
|
|
void satisfyMapCondition();
|
|
void satisfyAfrCondition();
|
|
void satisfyRpmCondition();
|
|
};
|
|
|
|
void NitrousConditionTest::SetUp() {
|
|
TestBase::SetUp();
|
|
|
|
setUpEngineConfiguration(EngineConfig()
|
|
.setNitrousControlEnabled({ true })
|
|
.setNitrousControlArmingMethod({ DIGITAL_SWITCH_INPUT })
|
|
.setNitrousControlTriggerPin({ TEST_NITROUS_CONTROL_ARMING_PIN })
|
|
.setNitrousMinimumTps({ TEST_MIN_TPS })
|
|
.setNitrousMinimumClt({ TEST_MIN_CLT })
|
|
.setNitrousMaximumMap({ TEST_MAX_MAP })
|
|
.setNitrousMaximumAfr({ TEST_MAXIMUM_AFR })
|
|
.setNitrousActivationRpm({ TEST_ACTIVATION_RPM })
|
|
.setNitrousDeactivationRpm({ TEST_DEACTIVATION_RPM })
|
|
.setNitrousDeactivationRpmWindow({ TEST_DEACTIVATION_RPM_WINDOW })
|
|
);
|
|
|
|
satisfyAllConditions();
|
|
}
|
|
|
|
void NitrousConditionTest::satisfyAllConditions() {
|
|
armNitrousControl();
|
|
satisfyTpsCondition();
|
|
satisfyCltCondition();
|
|
satisfyMapCondition();
|
|
satisfyAfrCondition();
|
|
satisfyRpmCondition();
|
|
|
|
EXPECT_TRUE(engine->nitrousController.isNitrousRpmConditionSatisfied);
|
|
}
|
|
|
|
void NitrousConditionTest::armNitrousControl() {
|
|
setMockState(TEST_NITROUS_CONTROL_ARMING_PIN, true);
|
|
periodicFastCallback();
|
|
|
|
EXPECT_TRUE(engine->nitrousController.isArmed);
|
|
}
|
|
|
|
void NitrousConditionTest::satisfyTpsCondition() {
|
|
updateApp(TEST_MIN_TPS);
|
|
|
|
EXPECT_TRUE(engine->nitrousController.isTpsConditionSatisfied);
|
|
}
|
|
|
|
void NitrousConditionTest::satisfyCltCondition() {
|
|
updateClt(TEST_MIN_CLT);
|
|
|
|
EXPECT_TRUE(engine->nitrousController.isCltConditionSatisfied);
|
|
}
|
|
|
|
void NitrousConditionTest::satisfyMapCondition() {
|
|
updateMap(TEST_MAX_MAP);
|
|
|
|
EXPECT_TRUE(engine->nitrousController.isMapConditionSatisfied);
|
|
}
|
|
|
|
void NitrousConditionTest::satisfyAfrCondition() {
|
|
updateLambda1(TEST_LAMBDA1);
|
|
|
|
EXPECT_TRUE(engine->nitrousController.isAfrConditionSatisfied);
|
|
}
|
|
|
|
void NitrousConditionTest::satisfyRpmCondition() {
|
|
updateRpm(TEST_ACTIVATION_RPM);
|
|
|
|
EXPECT_TRUE(engine->nitrousController.isNitrousRpmConditionSatisfied);
|
|
}
|
|
|
|
TEST_F(NitrousConditionTest, checkWithoutArmedNitrousControl) {
|
|
setMockState(TEST_NITROUS_CONTROL_ARMING_PIN, false);
|
|
periodicFastCallback();
|
|
|
|
EXPECT_FALSE(engine->nitrousController.isArmed);
|
|
EXPECT_FALSE(engine->nitrousController.isNitrousConditionSatisfied);
|
|
}
|
|
|
|
TEST_F(NitrousConditionTest, checkWithoutSatisfiedTpsCondition) {
|
|
updateApp(TEST_MIN_TPS - EPS5D);
|
|
|
|
EXPECT_FALSE(engine->nitrousController.isTpsConditionSatisfied);
|
|
EXPECT_FALSE(engine->nitrousController.isNitrousConditionSatisfied);
|
|
}
|
|
|
|
TEST_F(NitrousConditionTest, checkWithoutSatisfiedCltCondition) {
|
|
updateClt(TEST_MIN_CLT - EPS5D);
|
|
|
|
EXPECT_FALSE(engine->nitrousController.isCltConditionSatisfied);
|
|
EXPECT_FALSE(engine->nitrousController.isNitrousConditionSatisfied);
|
|
}
|
|
|
|
TEST_F(NitrousConditionTest, checkWithoutSatisfiedMapCondition) {
|
|
updateMap(TEST_MAX_MAP + EPS5D);
|
|
|
|
EXPECT_FALSE(engine->nitrousController.isMapConditionSatisfied);
|
|
EXPECT_FALSE(engine->nitrousController.isNitrousConditionSatisfied);
|
|
}
|
|
|
|
TEST_F(NitrousConditionTest, checkWithoutSatisfiedAfrCondition) {
|
|
updateLambda1(TEST_LAMBDA1 + EPS5D);
|
|
|
|
EXPECT_FALSE(engine->nitrousController.isAfrConditionSatisfied);
|
|
EXPECT_FALSE(engine->nitrousController.isNitrousConditionSatisfied);
|
|
}
|
|
|
|
TEST_F(NitrousConditionTest, checkWithoutSatisfiedRpmCondition) {
|
|
updateRpm(TEST_ACTIVATION_RPM - EPS5D);
|
|
|
|
EXPECT_FALSE(engine->nitrousController.isNitrousRpmConditionSatisfied);
|
|
EXPECT_FALSE(engine->nitrousController.isNitrousConditionSatisfied);
|
|
}
|
|
} |