implement `Minimum CLT` setting #6783

This commit is contained in:
kifir 2024-11-28 21:26:58 +02:00 committed by kifir23917
parent 19003c22d2
commit 67d0923a29
14 changed files with 134 additions and 2 deletions

View File

@ -60,4 +60,5 @@ namespace engine_configuration_defaults {
constexpr float NITROUS_LUA_GAUGE_ARMING_VALUE = 0.0f; constexpr float NITROUS_LUA_GAUGE_ARMING_VALUE = 0.0f;
constexpr int NITROUS_MINIMUM_TPS = 0; constexpr int NITROUS_MINIMUM_TPS = 0;
constexpr uint8_t NITROUS_MINIMUM_CLT = 0;
} }

View File

@ -2,5 +2,6 @@ struct_no_prefix nitrous_control_state_s
bit isArmed bit isArmed
bit isTpsConditionSatisfied bit isTpsConditionSatisfied
bit isCltConditionSatisfied
end_struct end_struct

View File

@ -11,6 +11,7 @@ void NitrousController::update() {
if (engineConfiguration->nitrousControlEnabled) { if (engineConfiguration->nitrousControlEnabled) {
updateArmingState(); updateArmingState();
updateTpsConditionSatisfied(); updateTpsConditionSatisfied();
updateCltConditionSatisfied();
} }
} }
@ -40,6 +41,15 @@ void NitrousController::updateTpsConditionSatisfied() {
} }
} }
void NitrousController::updateCltConditionSatisfied() {
const expected<float> clt = Sensor::get(SensorType::Clt);
if (engineConfiguration->nitrousMinimumClt != 0) {
isCltConditionSatisfied = clt.Valid && (engineConfiguration->nitrousMinimumClt <= clt.Value);
} else {
isCltConditionSatisfied = true;
}
}
bool NitrousController::checkTriggerPinState() const { bool NitrousController::checkTriggerPinState() const {
bool result = false; bool result = false;
#if !EFI_SIMULATOR #if !EFI_SIMULATOR

View File

@ -12,6 +12,7 @@ public:
private: private:
void updateArmingState(); void updateArmingState();
void updateTpsConditionSatisfied(); void updateTpsConditionSatisfied();
void updateCltConditionSatisfied();
bool checkTriggerPinState() const; bool checkTriggerPinState() const;
bool checkLuaGauge() const; bool checkLuaGauge() const;

View File

@ -1785,8 +1785,9 @@ uint8_t autoscale knockFuelTrim;Fuel trim when knock, max 30%;"%", 1, 0, 0, 30,
float nitrousLuaGaugeArmingValue;;"", 1, 0, -30000, 30000, 3 float nitrousLuaGaugeArmingValue;;"", 1, 0, -30000, 30000, 3
int nitrousMinimumTps;;"", 1, 0, 0, 20000, 0 int nitrousMinimumTps;;"", 1, 0, 0, 20000, 0
uint8_t nitrousMinimumClt;;"deg C", 1, 0, 0, @@CLT_UPPER_LIMIT@@, 0
#define END_OF_CALIBRATION_PADDING 90 #define END_OF_CALIBRATION_PADDING 89
uint8_t[END_OF_CALIBRATION_PADDING] unusedOftenChangesDuringFirmwareUpdate;;"units", 1, 0, 0, 1, 0 uint8_t[END_OF_CALIBRATION_PADDING] unusedOftenChangesDuringFirmwareUpdate;;"units", 1, 0, 0, 1, 0
! end of engine_configuration_s ! end of engine_configuration_s

View File

@ -4991,6 +4991,7 @@ dialog = tcuControls, "Transmission Settings"
dialog = NitrousControlSettings, "Settings" dialog = NitrousControlSettings, "Settings"
field = "Minimum TPS", nitrousMinimumTps field = "Minimum TPS", nitrousMinimumTps
field = "Minimum CLT", nitrousMinimumClt
dialog = NitrousControlSettingsDialog, "", yAxis dialog = NitrousControlSettingsDialog, "", yAxis
field = "Enable Nitrous Control", nitrousControlEnabled field = "Enable Nitrous Control", nitrousControlEnabled

View File

@ -0,0 +1,91 @@
//
// Created by kifir on 11/28/24.
//
#include "pch.h"
#include "util/test_base.h"
namespace {
struct CltConditionTestData {
const std::optional<float> clt;
const bool expectedCltCondition;
const char* const context;
};
class NitrousCltConditionTest : public TestBase {
protected:
static constexpr uint8_t TEST_CLT = 51;
void checkCltCondition(const std::vector<CltConditionTestData>& testData);
};
void NitrousCltConditionTest::checkCltCondition(const std::vector<CltConditionTestData>& testData) {
for (const CltConditionTestData& item: testData) {
updateClt(item.clt);
EXPECT_EQ(engine->nitrousController.isCltConditionSatisfied, item.expectedCltCondition) << item.context;
}
}
TEST_F(NitrousCltConditionTest, checkDefault) {
checkCltCondition({
{ {}, false, "default" },
{ { 0 }, false, "0.0" },
{ { TEST_CLT - EPS5D }, false, "TEST_CLT - EPS5D" },
{ { TEST_CLT }, false, "TEST_CLT" },
{ { TEST_CLT + EPS5D }, false, "TEST_CLT + EPS5D" },
});
}
TEST_F(NitrousCltConditionTest, checkDefaultWithDisabledNitrousControl) {
setUpEngineConfiguration(EngineConfig().setNitrousControlEnabled({ false }));
checkCltCondition({
{ {}, false, "default" },
{ { 0.0f }, false, "0.0" },
{ { TEST_CLT - EPS5D }, false, "TEST_CLT - EPS5D" },
{ { TEST_CLT }, false, "TEST_CLT" },
{ { TEST_CLT + EPS5D }, false, "TEST_CLT + EPS5D" },
});
}
TEST_F(NitrousCltConditionTest, checkDefaultWithEnabledNitrousControl) {
setUpEngineConfiguration(EngineConfig().setNitrousControlEnabled({ true }));
checkCltCondition({
{ {}, true, "default" },
{ { 0.0f }, true, "0.0" },
{ { TEST_CLT - EPS5D }, true, "TEST_CLT - EPS5D" },
{ { TEST_CLT }, true, "TEST_CLT" },
{ { TEST_CLT + EPS5D }, true, "TEST_CLT + EPS5D" },
});
}
TEST_F(NitrousCltConditionTest, checkZeroMinimumClt) {
setUpEngineConfiguration(
EngineConfig()
.setNitrousControlEnabled({ true })
.setNitrousMinimumClt(0)
);
checkCltCondition({
{ {}, true, "default" },
{ { 0.0f }, true, "0.0" },
{ { TEST_CLT - EPS5D }, true, "TEST_CLT - EPS5D" },
{ { TEST_CLT }, true, "TEST_CLT" },
{ { TEST_CLT + EPS5D }, true, "TEST_CLT + EPS5D" },
});
}
TEST_F(NitrousCltConditionTest, checkMinimumClt) {
setUpEngineConfiguration(
EngineConfig()
.setNitrousControlEnabled({ true })
.setNitrousMinimumClt({ TEST_CLT })
);
checkCltCondition({
{ {}, false, "default" },
{ { 0.0f }, false, "0.0" },
{ { TEST_CLT - EPS5D }, false, "TEST_CLT - EPS5D" },
{ { TEST_CLT }, true, "TEST_CLT" },
{ { TEST_CLT + EPS5D }, true, "TEST_CLT + EPS5D" },
});
}
}

View File

@ -73,6 +73,7 @@ TESTS_SRC_CPP = \
tests/shift_torque_reduction/test_shift_torque_reduction_angle_advance.cpp \ tests/shift_torque_reduction/test_shift_torque_reduction_angle_advance.cpp \
tests/nitrous_control/test_nitrous_arming.cpp \ tests/nitrous_control/test_nitrous_arming.cpp \
tests/nitrous_control/test_nitrous_tps_condition.cpp \ tests/nitrous_control/test_nitrous_tps_condition.cpp \
tests/nitrous_control/test_nitrous_clt_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 \

View File

@ -223,3 +223,8 @@ EngineConfig EngineConfig::setNitrousMinimumTps(const std::optional<int> value)
m_nitrousMinimumTps = value; m_nitrousMinimumTps = value;
return *this; return *this;
} }
EngineConfig EngineConfig::setNitrousMinimumClt(const std::optional<uint8_t> value) {
m_nitrousMinimumClt = value;
return *this;
}

View File

@ -70,6 +70,7 @@ public:
std::optional<float> getNitrousLuaGaugeArmingValue() const { return m_nitrousLuaGaugeArmingValue; } std::optional<float> getNitrousLuaGaugeArmingValue() const { return m_nitrousLuaGaugeArmingValue; }
std::optional<int> getNitrousMinimumTps() const { return m_nitrousMinimumTps; } std::optional<int> getNitrousMinimumTps() const { return m_nitrousMinimumTps; }
std::optional<uint8_t> getNitrousMinimumClt() const { return m_nitrousMinimumClt; }
// We do not core about performance in tests, but we want to use builder-like style, so setters return new instance // We do not core about performance in tests, but we want to use builder-like style, so setters return new instance
// of configuration: // of configuration:
@ -129,6 +130,7 @@ public:
EngineConfig setNitrousLuaGaugeArmingValue(std::optional<float> value); EngineConfig setNitrousLuaGaugeArmingValue(std::optional<float> value);
EngineConfig setNitrousMinimumTps(std::optional<int> value); EngineConfig setNitrousMinimumTps(std::optional<int> value);
EngineConfig setNitrousMinimumClt(std::optional<uint8_t> value);
private: private:
// Launch Control // Launch Control
std::optional<switch_input_pin_e> m_launchActivatePin; std::optional<switch_input_pin_e> m_launchActivatePin;
@ -184,6 +186,6 @@ private:
std::optional<lua_gauge_meaning_e> m_nitrousLuaGaugeMeaning; std::optional<lua_gauge_meaning_e> m_nitrousLuaGaugeMeaning;
std::optional<float> m_nitrousLuaGaugeArmingValue; std::optional<float> m_nitrousLuaGaugeArmingValue;
std::optional<float> m_nitrousMinimumTps; std::optional<int> m_nitrousMinimumTps;
std::optional<uint8_t> m_nitrousMinimumClt; std::optional<uint8_t> m_nitrousMinimumClt;
}; };

View File

@ -88,6 +88,7 @@ void TestBase::setUpEngineConfiguration(const EngineConfig& config) {
getTestEngineConfiguration().configureNitrousLuaGaugeArmingValue(config.getNitrousLuaGaugeArmingValue()); getTestEngineConfiguration().configureNitrousLuaGaugeArmingValue(config.getNitrousLuaGaugeArmingValue());
getTestEngineConfiguration().configureNitrousMinimumTps(config.getNitrousMinimumTps()); getTestEngineConfiguration().configureNitrousMinimumTps(config.getNitrousMinimumTps());
getTestEngineConfiguration().configureNitrousMinimumClt(config.getNitrousMinimumClt());
} }
void TestBase::periodicFastCallback() { void TestBase::periodicFastCallback() {
@ -108,6 +109,10 @@ void TestBase::updateApp(const std::optional<float> app) {
updateSensor(SensorType::DriverThrottleIntent, app); updateSensor(SensorType::DriverThrottleIntent, app);
} }
void TestBase::updateClt(const std::optional<float> clt) {
updateSensor(SensorType::Clt, clt);
}
void TestBase::updateSensor(const SensorType sensor, const std::optional<float> sensorReading) { void TestBase::updateSensor(const SensorType sensor, const std::optional<float> sensorReading) {
if (sensorReading.has_value()) { if (sensorReading.has_value()) {
Sensor::setMockValue(sensor, sensorReading.value()); Sensor::setMockValue(sensor, sensorReading.value());

View File

@ -25,6 +25,7 @@ protected:
void updateRpm(float rpm); void updateRpm(float rpm);
void updateApp(std::optional<float> app); void updateApp(std::optional<float> app);
void updateClt(std::optional<float> clt);
template<typename ModuleType> ModuleType& getModule(); template<typename ModuleType> ModuleType& getModule();
private: private:

View File

@ -488,6 +488,17 @@ void TestEngineConfiguration::configureNitrousMinimumTps(const std::optional<int
} }
} }
void TestEngineConfiguration::configureNitrousMinimumClt(const std::optional<uint8_t> nitrousMinimumClt) {
if (nitrousMinimumClt.has_value()) {
engineConfiguration->nitrousMinimumClt = nitrousMinimumClt.value();
} else {
ASSERT_EQ(
engineConfiguration->nitrousMinimumClt,
engine_configuration_defaults::NITROUS_MINIMUM_CLT
); // check default value
}
}
TestEngineConfiguration::TestEngineConfiguration() { TestEngineConfiguration::TestEngineConfiguration() {
} }

View File

@ -73,6 +73,7 @@ public:
void configureNitrousLuaGaugeArmingValue(std::optional<float> luaGaugeArmingValue); void configureNitrousLuaGaugeArmingValue(std::optional<float> luaGaugeArmingValue);
void configureNitrousMinimumTps(std::optional<int> nitrousMinimumTps); void configureNitrousMinimumTps(std::optional<int> nitrousMinimumTps);
void configureNitrousMinimumClt(std::optional<uint8_t> nitrousMinimumClt);
private: private:
TestEngineConfiguration(); TestEngineConfiguration();
static TestEngineConfiguration instance; static TestEngineConfiguration instance;