rusefi-1/firmware/controllers/engine_cycle/high_pressure_fuel_pump.cpp

83 lines
1.8 KiB
C++

/*
* @file high_pressure_fuel_pump.cpp
*
*
* todo: there is some similarity with aux_valves.cpp and even map_averaging.cpp maybe reduce code duplication?
*
* @date Nov 5, 2020
* @author Andrey Belomutskiy, (c) 2012-2020
*/
#include "pch.h"
#include "high_pressure_fuel_pump.h"
#include "spark_logic.h"
#if EFI_HPFP
#define LOBE_COUNT 3
class HpfpActor {
public:
angle_t extra;
int phaseIndex;
AngleBasedEvent open;
AngleBasedEvent close;
DECLARE_ENGINE_PTR;
};
static HpfpActor actors[LOBE_COUNT];
static void plainPinTurnOff(RegisteredNamedOutputPin *output) {
output->setLow();
}
void hpfpPlainPinTurnOn(HpfpActor *current);
static void scheduleNextCycle(HpfpActor *actor) {
#if EFI_UNIT_TEST
Engine *engine = actor->engine;
EXPAND_Engine;
#endif /* EFI_UNIT_TEST */
scheduleOrQueue(&actor->open,
TRIGGER_EVENT_UNDEFINED, getTimeNowNt(), actor->extra + CONFIG(tempHpfpStart),
{hpfpPlainPinTurnOn, actor }
PASS_ENGINE_PARAMETER_SUFFIX
);
scheduleOrQueue(&actor->close,
TRIGGER_EVENT_UNDEFINED, getTimeNowNt(),
actor->extra + CONFIG(tempHpfpStart) + CONFIG(tempHpfpDuration),
{ plainPinTurnOff, &enginePins.hpfpValve }
PASS_ENGINE_PARAMETER_SUFFIX
);
}
void hpfpPlainPinTurnOn(HpfpActor *current) {
RegisteredNamedOutputPin *output = &enginePins.hpfpValve;
int highPressureKpa = Sensor::get(SensorType::FuelPressureHigh).Value;
// very basic control strategy
if (highPressureKpa < BAR2KPA(50)) {
output->setHigh();
}
scheduleNextCycle(current);
}
void initHPFP(DECLARE_ENGINE_PARAMETER_SIGNATURE) {
if (!isBrainPinValid(engineConfiguration->hpfpValvePin)) {
return;
}
for (int i = 0; i < LOBE_COUNT; i++) {
HpfpActor *actor = &actors[i];
INJECT_ENGINE_REFERENCE(actor);
actor->extra = 720 / LOBE_COUNT * i;
scheduleNextCycle(actor);
}
}
#endif // EFI_HPFP