diff --git a/firmware/controllers/algo/antilag_system.cpp b/firmware/controllers/algo/antilag_system.cpp index de9ad91550..0807516b2e 100644 --- a/firmware/controllers/algo/antilag_system.cpp +++ b/firmware/controllers/algo/antilag_system.cpp @@ -13,6 +13,7 @@ #include "advance_map.h" #include "engine_state.h" #include "advance_map.h" +#include "fuel_math.h" bool AntilagSystemBase::isInsideALSSwitchCondition() { isALSSwitchActivated = engineConfiguration->antiLagActivationMode == SWITCH_INPUT_ANTILAG; @@ -32,15 +33,11 @@ bool AntilagSystemBase::isInsideALSSwitchCondition() { } } -bool AntilagSystemBase::isALSMinRPMCondition() const { - int rpm = Sensor::getOrZero(SensorType::Rpm); - +bool AntilagSystemBase::isALSMinRPMCondition(int rpm) const { return engineConfiguration->ALSMinRPM < rpm; } -bool AntilagSystemBase::isALSMaxRPMCondition() const { - int rpm = Sensor::getOrZero(SensorType::Rpm); - +bool AntilagSystemBase::isALSMaxRPMCondition(int rpm) const { return engineConfiguration->ALSMaxRPM > rpm; } @@ -62,10 +59,11 @@ bool AntilagSystemBase::isALSMaxThrottleIntentCondition() const { return engineConfiguration->ALSMaxTPS > throttleIntent; } -bool AntilagSystemBase::isAntilagConditionMet() { +bool AntilagSystemBase::isAntilagConditionMet(int rpm) { - ALSMinRPMCondition = isALSMinRPMCondition(); - ALSMaxRPMCondition = isALSMaxRPMCondition(); + + ALSMinRPMCondition = isALSMinRPMCondition(rpm); + ALSMaxRPMCondition = isALSMaxRPMCondition(rpm); ALSMinCLTCondition = isALSMinCLTCondition(); ALSMaxCLTCondition = isALSMaxCLTCondition(); ALSMaxThrottleIntentCondition = isALSMaxThrottleIntentCondition(); @@ -80,7 +78,12 @@ bool AntilagSystemBase::isAntilagConditionMet() { } void AntilagSystemBase::update() { - isAntilagCondition = engineConfiguration->antiLagEnabled && isAntilagConditionMet(); + int rpm = Sensor::getOrZero(SensorType::Rpm); + isAntilagCondition = engineConfiguration->antiLagEnabled && isAntilagConditionMet(rpm); + +#if EFI_ANTILAG_SYSTEM + fuelALSCorrection = getFuelALSCorrection(rpm); +#endif // EFI_ANTILAG_SYSTEM } #endif /* EFI_ANTILAG_SYSTEM */ diff --git a/firmware/controllers/algo/antilag_system.h b/firmware/controllers/algo/antilag_system.h index 4048c18a5c..179ec50174 100644 --- a/firmware/controllers/algo/antilag_system.h +++ b/firmware/controllers/algo/antilag_system.h @@ -16,12 +16,12 @@ class AntilagSystemBase : public antilag_system_state_s { public: void update(); - bool isALSMinRPMCondition() const; - bool isALSMaxRPMCondition() const; + bool isALSMinRPMCondition(int rpm) const; + bool isALSMaxRPMCondition(int rpm) const; bool isALSMinCLTCondition() const; bool isALSMaxCLTCondition() const; bool isALSMaxThrottleIntentCondition() const; bool isInsideALSSwitchCondition(); /* enabled and all conditions above */ - bool isAntilagConditionMet(); + bool isAntilagConditionMet(int rpm); }; diff --git a/firmware/controllers/algo/fuel_math.cpp b/firmware/controllers/algo/fuel_math.cpp index f709f9cd81..58911e59a1 100644 --- a/firmware/controllers/algo/fuel_math.cpp +++ b/firmware/controllers/algo/fuel_math.cpp @@ -130,7 +130,7 @@ float getRunningFuel(float baseFuel) { float runningFuel = baseFuel * baroCorrection * iatCorrection * cltCorrection * postCrankingFuelCorrection; #if EFI_ANTILAG_SYSTEM - runningFuel *= (1 + engine->antilagController.fuelALSCorrection); + runningFuel *= (1 + engine->antilagController.fuelALSCorrection / 100); #endif /* EFI_ANTILAG_SYSTEM */ #if EFI_LAUNCH_CONTROL @@ -395,21 +395,20 @@ float getBaroCorrection() { } } -auto tps = Sensor::get(SensorType::Tps1); - auto rpm = Sensor::get(SensorType::Rpm); -float getfuelALSCorrection(int rpm, float engineLoad) { +percent_t getFuelALSCorrection(int rpm) { #if EFI_ANTILAG_SYSTEM if (engine->antilagController.isAntilagCondition) { + float throttleIntent = Sensor::getOrZero(SensorType::DriverThrottleIntent); auto AlsFuelAdd = interpolate3d( config->ALSFuelAdjustment, - config->alsFuelAdjustmentLoadBins, tps.Value, + config->alsFuelAdjustmentLoadBins, throttleIntent, config->alsFuelAdjustmentrpmBins, rpm ); return AlsFuelAdd; } else #endif /* EFI_ANTILAG_SYSTEM */ { - return 1; + return 0; } } diff --git a/firmware/controllers/algo/fuel_math.h b/firmware/controllers/algo/fuel_math.h index 472e2187fa..f2cb597be9 100644 --- a/firmware/controllers/algo/fuel_math.h +++ b/firmware/controllers/algo/fuel_math.h @@ -17,7 +17,7 @@ void initFuelMap(); float getRunningFuel(float baseFuel); float getBaroCorrection(); -float getfuelALSCorrection(int rpm, float engineLoad); +percent_t getFuelALSCorrection(int rpm); int getNumberOfInjections(injection_mode_e mode); angle_t getInjectionOffset(float rpm, float load); float getIatFuelCorrection(); diff --git a/unit_tests/tests/actuators/test_antilag.cpp b/unit_tests/tests/actuators/test_antilag.cpp index 0497587020..7d53ed7bd7 100644 --- a/unit_tests/tests/actuators/test_antilag.cpp +++ b/unit_tests/tests/actuators/test_antilag.cpp @@ -1,24 +1,36 @@ #include "pch.h" +#include "fuel_math.h" TEST(Actuators, AntiLag) { EngineTestHelper eth(TEST_ENGINE); engineConfiguration->antiLagEnabled = true; + setTable(config->ALSFuelAdjustment, 50 /* percent */); Sensor::setMockValue(SensorType::Clt, 70); + Sensor::setMockValue(SensorType::Rpm, 1000); + Sensor::setMockValue(SensorType::Tps1, 1); + Sensor::setMockValue(SensorType::AcceleratorPedal, 1); engineConfiguration->antiLagActivationMode = SWITCH_INPUT_ANTILAG; engine->periodicFastCallback(); + float fuelWithCorrections = 1.01; + ASSERT_NEAR(fuelWithCorrections, getRunningFuel(1), EPS4D); // in unit tests we pretend that physical swiych is always OFF ASSERT_EQ(0, engine->antilagController.ALSSwitchCondition); + ASSERT_EQ(0.0, engine->antilagController.fuelALSCorrection); engineConfiguration->antiLagActivationMode = ALWAYS_ON_ANTILAG; engine->periodicFastCallback(); ASSERT_EQ(1, engine->antilagController.ALSSwitchCondition); + ASSERT_NEAR(50, engine->antilagController.fuelALSCorrection, EPS4D); + ASSERT_EQ(1, engine->antilagController.ALSMinRPMCondition); + ASSERT_EQ(1, engine->antilagController.ALSMaxRPMCondition); ASSERT_EQ(1, engine->antilagController.ALSMinCLTCondition); ASSERT_EQ(1, engine->antilagController.ALSMaxCLTCondition); + ASSERT_EQ(1, engine->antilagController.ALSMaxThrottleIntentCondition); - // todo: let's have this 'true' - ASSERT_EQ(0, engine->antilagController.isAntilagCondition); + ASSERT_EQ(1, engine->antilagController.isAntilagCondition); + ASSERT_NEAR(1.5 * fuelWithCorrections, getRunningFuel(1), EPS4D); }