Implement `isNitrousConditionSatisfied` #6783

This commit is contained in:
kifir 2024-12-02 20:39:11 +02:00 committed by kifir23917
parent 31c67cc751
commit c1eb9dbae1
4 changed files with 153 additions and 0 deletions

View File

@ -6,5 +6,6 @@ bit isCltConditionSatisfied
bit isMapConditionSatisfied bit isMapConditionSatisfied
bit isAfrConditionSatisfied bit isAfrConditionSatisfied
bit isNitrousRpmConditionSatisfied bit isNitrousRpmConditionSatisfied
bit isNitrousConditionSatisfied
end_struct end_struct

View File

@ -15,6 +15,12 @@ void NitrousController::update() {
updateMapConditionSatisfied(); updateMapConditionSatisfied();
updateAfrConditionSatisfied(); updateAfrConditionSatisfied();
updateRpmConditionSatisfied(); updateRpmConditionSatisfied();
isNitrousConditionSatisfied = (
isArmed && isTpsConditionSatisfied && isCltConditionSatisfied && isMapConditionSatisfied
&& isAfrConditionSatisfied && isNitrousRpmConditionSatisfied
);
} else {
isNitrousConditionSatisfied = false;
} }
} }

View File

@ -0,0 +1,145 @@
//
// 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);
}
}

View File

@ -77,6 +77,7 @@ TESTS_SRC_CPP = \
tests/nitrous_control/test_nitrous_map_condition.cpp \ tests/nitrous_control/test_nitrous_map_condition.cpp \
tests/nitrous_control/test_nitrous_afr_condition.cpp \ tests/nitrous_control/test_nitrous_afr_condition.cpp \
tests/nitrous_control/test_nitrous_rpm_condition.cpp \ tests/nitrous_control/test_nitrous_rpm_condition.cpp \
tests/nitrous_control/test_nitrous_condition.cpp \
tests/test_fft.cpp \ tests/test_fft.cpp \
tests/lua/test_lua_basic.cpp \ tests/lua/test_lua_basic.cpp \
tests/lua/test_bit_range_msb.cpp \ tests/lua/test_bit_range_msb.cpp \