Staged injection support; use two sets of injectors on the same engine #5247

two injection models for two stages
This commit is contained in:
Matthew Kennedy 2024-01-07 20:41:52 -05:00 committed by rusefillc
parent 76623cec81
commit 1f64950e33
9 changed files with 23 additions and 22 deletions

View File

@ -59,7 +59,7 @@ const antilag_system_state_s* getLiveData(size_t) {
template<>
const injector_model_s* getLiveData(size_t) {
return &engine->module<InjectorModel>().unmock();
return &engine->module<InjectorModelPrimary>().unmock();
}
template<>

View File

@ -128,7 +128,8 @@ public:
#endif // EFI_ENGINE_CONTROL
type_list<
Mockable<InjectorModel>,
Mockable<InjectorModelPrimary>,
Mockable<InjectorModelSecondary>,
#if EFI_IDLE_CONTROL
Mockable<IdleController>,
#endif // EFI_IDLE_CONTROL

View File

@ -96,7 +96,7 @@ void EngineState::periodicFastCallback() {
warning(ObdCode::CUSTOM_SLOW_NOT_INVOKED, "Slow not invoked yet");
}
efitick_t nowNt = getTimeNowNt();
if (engine->rpmCalculator.isCranking()) {
crankingTimer.reset(nowNt);
}
@ -142,7 +142,7 @@ void EngineState::periodicFastCallback() {
auto clResult = fuelClosedLoopCorrection();
// Store the pre-wall wetting injection duration for scheduling purposes only, not the actual injection duration
engine->engineState.injectionDuration = engine->module<InjectorModel>()->getInjectionDuration(untrimmedInjectionMass);
engine->engineState.injectionDuration = engine->module<InjectorModelPrimary>()->getInjectionDuration(untrimmedInjectionMass);
float fuelLoad = getFuelingLoad();
injectionOffset = getInjectionOffset(rpm, fuelLoad);

View File

@ -186,7 +186,7 @@ static float getBaseFuelMass(int rpm) {
engine->fuelComputer.normalizedCylinderFilling = normalizedCylinderFilling;
engine->engineState.fuelingLoad = airmass.EngineLoadPercent;
engine->engineState.ignitionLoad = engine->fuelComputer.getLoadOverride(airmass.EngineLoadPercent, engineConfiguration->ignOverrideMode);
auto gramPerCycle = airmass.CylinderAirmass * engineConfiguration->cylindersCount;
auto gramPerMs = rpm == 0 ? 0 : gramPerCycle / getEngineCycleDuration(rpm);
@ -200,7 +200,7 @@ static float getBaseFuelMass(int rpm) {
engine->engineState.baseFuel = baseFuelMass;
if (cisnan(baseFuelMass)) {
// todo: we should not have this here but https://github.com/rusefi/rusefi/issues/1690
// todo: we should not have this here but https://github.com/rusefi/rusefi/issues/1690
return 0;
}
@ -315,7 +315,7 @@ float getInjectionMass(int rpm) {
float injectionFuelMass = cycleFuelMass * durationMultiplier;
// Prepare injector flow rate & deadtime
engine->module<InjectorModel>()->prepare();
engine->module<InjectorModelPrimary>()->prepare();
floatms_t tpsAccelEnrich = engine->tpsAccelEnrichment.getTpsEnrichment();
efiAssert(ObdCode::CUSTOM_ERR_ASSERT, !cisnan(tpsAccelEnrich), "NaN tpsAccelEnrich", 0);
@ -324,7 +324,7 @@ float getInjectionMass(int rpm) {
// For legacy reasons, the TPS accel table is in units of milliseconds, so we have to convert BACK to mass
float tpsAccelPerInjection = durationMultiplier * tpsAccelEnrich;
float tpsFuelMass = engine->module<InjectorModel>()->getFuelMassForDuration(tpsAccelPerInjection);
float tpsFuelMass = engine->module<InjectorModelPrimary>()->getFuelMassForDuration(tpsAccelPerInjection);
return injectionFuelMass + tpsFuelMass;
}
@ -344,7 +344,7 @@ void initFuelMap() {
*/
float getCltFuelCorrection() {
const auto clt = Sensor::get(SensorType::Clt);
if (!clt)
return 1; // this error should be already reported somewhere else, let's just handle it
@ -400,7 +400,7 @@ percent_t getFuelALSCorrection(int rpm) {
config->alsFuelAdjustmentLoadBins, throttleIntent,
config->alsFuelAdjustmentrpmBins, rpm
);
return AlsFuelAdd;
return AlsFuelAdd;
} else
#endif /* EFI_ANTILAG_SYSTEM */
{

View File

@ -78,7 +78,7 @@ void InjectionEvent::onTriggerTooth(int rpm, efitick_t nowNt, float currentPhase
// Perform wall wetting adjustment on fuel mass, not duration, so that
// it's correct during fuel pressure (injector flow) or battery voltage (deadtime) transients
injectionMassGrams = wallFuel.adjust(injectionMassGrams);
const floatms_t injectionDuration = engine->module<InjectorModel>()->getInjectionDuration(injectionMassGrams);
const floatms_t injectionDuration = engine->module<InjectorModelPrimary>()->getInjectionDuration(injectionMassGrams);
#if EFI_PRINTF_FUEL_DETAILS
if (printFuelDebug) {

View File

@ -20,7 +20,7 @@ floatms_t PrimeController::getPrimeDuration() const {
0.001f * // convert milligram to gram
interpolate2d(clt.Value, engineConfiguration->primeBins, engineConfiguration->primeValues);
return engine->module<InjectorModel>()->getInjectionDuration(primeMass);
return engine->module<InjectorModelPrimary>()->getInjectionDuration(primeMass);
}
// Check if the engine is not stopped or cylinder cleanup is activated

View File

@ -48,7 +48,7 @@ TEST(priming, duration) {
EngineTestHelper eth(engine_type_e::TEST_ENGINE);
MockInjectorModel2 injectorModel;
engine->module<InjectorModel>().set(&injectorModel);
engine->module<InjectorModelPrimary>().set(&injectorModel);
for (size_t i = 0; i < efi::size(engineConfiguration->primeBins); i++) {
engineConfiguration->primeBins[i] = i * 10;

View File

@ -22,7 +22,7 @@ TEST(injectionScheduling, InjectionIsScheduled) {
// Injection duration of 20ms
MockInjectorModel2 im;
EXPECT_CALL(im, getInjectionDuration(_)).WillOnce(Return(20.0f));
engine->module<InjectorModel>().set(&im);
engine->module<InjectorModelPrimary>().set(&im);
engine->rpmCalculator.oneDegreeUs = 100;
@ -62,7 +62,7 @@ TEST(injectionScheduling, InjectionIsScheduledBeforeWraparound) {
// Injection duration of 20ms
MockInjectorModel2 im;
EXPECT_CALL(im, getInjectionDuration(_)).WillOnce(Return(20.0f));
engine->module<InjectorModel>().set(&im);
engine->module<InjectorModelPrimary>().set(&im);
engine->rpmCalculator.oneDegreeUs = 100;
@ -101,7 +101,7 @@ TEST(injectionScheduling, InjectionIsScheduledAfterWraparound) {
// Injection duration of 20ms
MockInjectorModel2 im;
EXPECT_CALL(im, getInjectionDuration(_)).WillOnce(Return(20.0f));
engine->module<InjectorModel>().set(&im);
engine->module<InjectorModelPrimary>().set(&im);
engine->rpmCalculator.oneDegreeUs = 100;
@ -140,7 +140,7 @@ TEST(injectionScheduling, InjectionNotScheduled) {
// Expect no calls to injector model
StrictMock<MockInjectorModel2> im;
engine->module<InjectorModel>().set(&im);
engine->module<InjectorModelPrimary>().set(&im);
engine->rpmCalculator.oneDegreeUs = 100;

View File

@ -513,7 +513,7 @@ static void setTestBug299(EngineTestHelper *eth) {
ASSERT_EQ( 1, engine->fuelComputer.running.intakeTemperatureCoefficient) << "iatC";
ASSERT_EQ( 1, engine->fuelComputer.running.coolantTemperatureCoefficient) << "cltC";
ASSERT_EQ( 0, engine->module<InjectorModel>()->getDeadtime()) << "lag";
ASSERT_EQ( 0, engine->module<InjectorModelPrimary>()->getDeadtime()) << "lag";
ASSERT_EQ( 3000, round(Sensor::getOrZero(SensorType::Rpm))) << "setTestBug299: RPM";
@ -553,7 +553,7 @@ void doTestFuelSchedulerBug299smallAndMedium(int startUpDelayMs) {
// Injection duration of 12.5ms
MockInjectorModel2 im;
EXPECT_CALL(im, getInjectionDuration(_)).WillRepeatedly(Return(12.5f));
engine->module<InjectorModel>().set(&im);
engine->module<InjectorModelPrimary>().set(&im);
assertEqualsM("duty for maf=3", 62.5, getInjectorDutyCycle(round(Sensor::getOrZero(SensorType::Rpm))));
@ -713,7 +713,7 @@ void doTestFuelSchedulerBug299smallAndMedium(int startUpDelayMs) {
// Injection duration of 17.5ms
MockInjectorModel2 im2;
EXPECT_CALL(im2, getInjectionDuration(_)).WillRepeatedly(Return(17.5f));
engine->module<InjectorModel>().set(&im2);
engine->module<InjectorModelPrimary>().set(&im2);
// duty cycle above 75% is a special use-case because 'special' fuel event overlappes the next normal event in batch mode
assertEqualsM("duty for maf=3", 87.5, getInjectorDutyCycle(round(Sensor::getOrZero(SensorType::Rpm))));
@ -907,7 +907,7 @@ TEST(big, testFuelSchedulerBug299smallAndLarge) {
// Injection duration of 17.5ms
MockInjectorModel2 im;
EXPECT_CALL(im, getInjectionDuration(_)).WillRepeatedly(Return(17.5f));
engine->module<InjectorModel>().set(&im);
engine->module<InjectorModelPrimary>().set(&im);
assertEqualsM("Lduty for maf=3", 87.5, getInjectorDutyCycle(round(Sensor::getOrZero(SensorType::Rpm))));
@ -974,7 +974,7 @@ TEST(big, testFuelSchedulerBug299smallAndLarge) {
engine->engineState.injectionDuration = 2.0f;
MockInjectorModel2 im2;
EXPECT_CALL(im2, getInjectionDuration(_)).WillRepeatedly(Return(2.0f));
engine->module<InjectorModel>().set(&im2);
engine->module<InjectorModelPrimary>().set(&im2);
ASSERT_EQ( 10, getInjectorDutyCycle(round(Sensor::getOrZero(SensorType::Rpm)))) << "Lduty for maf=3";