test coverage for antilag #4920

fuel correction bugfix & test
This commit is contained in:
Andrey 2022-12-31 14:48:09 -05:00
parent db09833774
commit c8b998a911
5 changed files with 36 additions and 22 deletions

View File

@ -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 */

View File

@ -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);
};

View File

@ -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;
}
}

View File

@ -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();

View File

@ -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);
}