Implement `Ignition Retard` setting #6783

This commit is contained in:
kifir 2024-12-06 15:05:52 +02:00 committed by kifir23917
parent d2c90a9199
commit 80a7b4c436
13 changed files with 104 additions and 4 deletions

View File

@ -123,6 +123,11 @@ angle_t getRunningAdvance(float rpm, float engineLoad) {
) {
return engineConfiguration->torqueReductionIgnitionRetard;
}
if (engineConfiguration->nitrousControlEnabled
&& engine->module<NitrousController>()->isNitrousConditionSatisfied
) {
advanceAngle -= engineConfiguration->nitrousIgnitionRetard;
}
#endif /* EFI_LAUNCH_CONTROL */
return advanceAngle;

View File

@ -67,4 +67,5 @@ namespace engine_configuration_defaults {
constexpr uint16_t NITROUS_DEACTIVATION_RPM = 7000;
constexpr uint16_t NITROUS_DEACTIVATION_RPM_WINDOW = 500;
constexpr int8_t NITROUS_FUEL_ADDER_PERCENT = 0;
constexpr float NITROUS_IGNITION_RETARD = 0.0f;
}

View File

@ -1802,8 +1802,8 @@ uint8_t autoscale knockFuelTrim;Fuel trim when knock, max 30%;"%", 1, 0, 0, 30,
pin_output_mode_e nitrousRelayPinMode;
int8_t nitrousFuelAdderPercent;;"%", 1, 0, 0, 100, 0
#define END_OF_CALIBRATION_PADDING 72
float nitrousIgnitionRetard;Retard timing to remove from actual final timing (after all corrections) due to additional air.;"deg", 1, 0, -180, 180, 2
#define END_OF_CALIBRATION_PADDING 68
uint8_t[END_OF_CALIBRATION_PADDING] unusedOftenChangesDuringFirmwareUpdate;;"units", 1, 0, 0, 1, 0
! end of engine_configuration_s

View File

@ -4999,6 +4999,7 @@ dialog = tcuControls, "Transmission Settings"
field = "Dectivation RPM", nitrousDeactivationRpm
field = "Dectivation RPM Window", nitrousDeactivationRpmWindow
field = "Fuel Adder", nitrousFuelAdderPercent
field = "Ignition Retard", nitrousIgnitionRetard
dialog = NitrousControlSettingsDialog, "", yAxis
field = "Enable Nitrous Control", nitrousControlEnabled

View File

@ -6,7 +6,10 @@
#include "nitrous_test_base.h"
void NitrousTestBase::setUpTestConfiguration(const std::optional<int8_t> nitrousFuelAdderPercent) {
void NitrousTestBase::setUpTestConfiguration(
const std::optional<int8_t> nitrousFuelAdderPercent,
const std::optional<float> nitrousIgnitionRetard
) {
setUpEngineConfiguration(EngineConfig()
.setNitrousControlEnabled({ true })
.setNitrousControlArmingMethod({ DIGITAL_SWITCH_INPUT })
@ -19,6 +22,7 @@ void NitrousTestBase::setUpTestConfiguration(const std::optional<int8_t> nitrous
.setNitrousDeactivationRpm({ TEST_DEACTIVATION_RPM })
.setNitrousDeactivationRpmWindow({ TEST_DEACTIVATION_RPM_WINDOW })
.setNitrousFuelAdderPercent(nitrousFuelAdderPercent)
.setNitrousIgnitionRetard(nitrousIgnitionRetard)
);
}

View File

@ -20,7 +20,10 @@ protected:
static constexpr uint16_t TEST_DEACTIVATION_RPM = 932;
static constexpr uint16_t TEST_DEACTIVATION_RPM_WINDOW = 17;
void setUpTestConfiguration(std::optional<int8_t> nitrousFuelAdderPercent = {});
void setUpTestConfiguration(
std::optional<int8_t> nitrousFuelAdderPercent = {},
std::optional<float> nitrousIgnitionRetard = {}
);
void armNitrousControl();
void satisfyTpsCondition();

View File

@ -0,0 +1,64 @@
//
// Created by kifir on 12/6/24.
//
#include "pch.h"
#include "nitrous_test_base.h"
namespace {
class NitrousIgnitionRetardTest : public NitrousTestBase {
protected:
static constexpr float EXPECTED_BASE_IGNITION_ADVANCE = 10.5f;
static constexpr float TEST_NITROUS_IGNITION_RETARD = 1.78f;
void checkBaseIgnitionAdvance(float expectedBaseIgnitionAdvance, const char* context);
};
void NitrousIgnitionRetardTest::checkBaseIgnitionAdvance(
const float expectedBaseIgnitionAdvance,
const char* const context
) {
periodicFastCallback();
EXPECT_NEAR(expectedBaseIgnitionAdvance, engine->ignitionState.baseIgnitionAdvance, EPS5D) << context;
}
TEST_F(NitrousIgnitionRetardTest, checkDefaultIgnitionRetardCorrection) {
setUpTestConfiguration();
checkBaseIgnitionAdvance(EXPECTED_BASE_IGNITION_ADVANCE, "Default");
activateNitrousControl();
checkBaseIgnitionAdvance(EXPECTED_BASE_IGNITION_ADVANCE, "All conditions are satisfied");
deactivateNitrousControl();
checkBaseIgnitionAdvance(EXPECTED_BASE_IGNITION_ADVANCE, "No conditions are satisfied");
}
TEST_F(NitrousIgnitionRetardTest, checkZeroIgnitionRetardCorrection) {
setUpTestConfiguration(/* nitrousFuelAdderPercent = */ {}, /* nitrousIgnitionRetard = */ { 0.0f });
checkBaseIgnitionAdvance(EXPECTED_BASE_IGNITION_ADVANCE, "Default");
activateNitrousControl();
checkBaseIgnitionAdvance(EXPECTED_BASE_IGNITION_ADVANCE, "All conditions are satisfied");
deactivateNitrousControl();
checkBaseIgnitionAdvance(EXPECTED_BASE_IGNITION_ADVANCE, "No conditions are satisfied");
}
TEST_F(NitrousIgnitionRetardTest, checkIgnitionRetardCorrection) {
setUpTestConfiguration(
/* nitrousFuelAdderPercent = */ {},
/* nitrousIgnitionRetard = */ { TEST_NITROUS_IGNITION_RETARD }
);
checkBaseIgnitionAdvance(EXPECTED_BASE_IGNITION_ADVANCE, "Default");
activateNitrousControl();
checkBaseIgnitionAdvance(
EXPECTED_BASE_IGNITION_ADVANCE - TEST_NITROUS_IGNITION_RETARD,
"All conditions are satisfied"
);
deactivateNitrousControl();
checkBaseIgnitionAdvance(EXPECTED_BASE_IGNITION_ADVANCE, "No conditions are satisfied");
}
}

View File

@ -80,6 +80,7 @@ TESTS_SRC_CPP = \
tests/nitrous_control/test_nitrous_rpm_condition.cpp \
tests/nitrous_control/test_nitrous_condition.cpp \
tests/nitrous_control/test_nitrous_fuel_adder.cpp \
tests/nitrous_control/test_nitrous_ignition_retard.cpp \
tests/test_fft.cpp \
tests/lua/test_lua_basic.cpp \
tests/lua/test_bit_range_msb.cpp \

View File

@ -258,3 +258,8 @@ EngineConfig EngineConfig::setNitrousFuelAdderPercent(const std::optional<int8_t
m_nitrousFuelAdderPercent = value;
return *this;
}
EngineConfig EngineConfig::setNitrousIgnitionRetard(const std::optional<float> value) {
m_nitrousIgnitionRetard = value;
return *this;
}

View File

@ -77,6 +77,7 @@ public:
std::optional<uint16_t> getNitrousDeactivationRpm() const { return m_nitrousDeactivationRpm; }
std::optional<uint16_t> getNitrousDeactivationRpmWindow() const { return m_nitrousDeactivationRpmWindow; }
std::optional<int8_t> getNitrousFuelAdderPercent() const { return m_nitrousFuelAdderPercent; }
std::optional<float> getNitrousIgnitionRetard() const { return m_nitrousIgnitionRetard; }
// We do not core about performance in tests, but we want to use builder-like style, so setters return new instance
// of configuration:
@ -143,6 +144,7 @@ public:
EngineConfig setNitrousDeactivationRpm(std::optional<uint16_t> value);
EngineConfig setNitrousDeactivationRpmWindow(std::optional<uint16_t> value);
EngineConfig setNitrousFuelAdderPercent(std::optional<int8_t> value);
EngineConfig setNitrousIgnitionRetard(std::optional<float> value);
private:
// Launch Control
std::optional<switch_input_pin_e> m_launchActivatePin;
@ -206,4 +208,5 @@ private:
std::optional<uint16_t> m_nitrousDeactivationRpm;
std::optional<uint16_t> m_nitrousDeactivationRpmWindow;
std::optional<int8_t> m_nitrousFuelAdderPercent;
std::optional<float> m_nitrousIgnitionRetard;
};

View File

@ -99,6 +99,7 @@ void TestBase::setUpEngineConfiguration(const EngineConfig& config) {
getTestEngineConfiguration().configureNitrousFuelAdderPercent(
config.getNitrousFuelAdderPercent()
);
getTestEngineConfiguration().configureNitrousIgnitionRetard(config.getNitrousIgnitionRetard());
}
void TestBase::periodicFastCallback() {

View File

@ -567,6 +567,17 @@ void TestEngineConfiguration::configureNitrousFuelAdderPercent(const std::option
}
}
void TestEngineConfiguration::configureNitrousIgnitionRetard(const std::optional<float> nitrousIgnitionRetard) {
if (nitrousIgnitionRetard.has_value()) {
engineConfiguration->nitrousIgnitionRetard = nitrousIgnitionRetard.value();
} else {
ASSERT_EQ(
engineConfiguration->nitrousIgnitionRetard,
engine_configuration_defaults::NITROUS_IGNITION_RETARD
); // check default value
}
}
TestEngineConfiguration::TestEngineConfiguration() {
}

View File

@ -80,6 +80,7 @@ public:
void configureNitrousDeactivationRpm(std::optional<uint16_t> nitrousDeactivationRpm);
void configureNitrousDeactivationRpmWindow(std::optional<uint16_t> nitrousDeactivationRpmWindow);
void configureNitrousFuelAdderPercent(std::optional<int8_t> nitrousFuelAdderPercent);
void configureNitrousIgnitionRetard(std::optional<float> nitrousIgnitionRetard);
private:
TestEngineConfiguration();
static TestEngineConfiguration instance;