mirror of https://github.com/rusefi/rusefi.git
Staged injection support; use two sets of injectors on the same engine #5247
two injection models for two stages
This commit is contained in:
parent
76623cec81
commit
1f64950e33
|
@ -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<>
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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);
|
||||
|
|
|
@ -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 */
|
||||
{
|
||||
|
|
|
@ -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) {
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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;
|
||||
|
|
|
@ -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;
|
||||
|
||||
|
|
|
@ -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";
|
||||
|
||||
|
|
Loading…
Reference in New Issue