rusEFI
The most advanced open source ECU
Loading...
Searching...
No Matches
Public Types | Public Member Functions | Data Fields | Private Member Functions | Static Private Member Functions | Private Attributes
HpfpController Class Reference

#include <high_pressure_fuel_pump.h>

Inheritance diagram for HpfpController:
Inheritance graph
[legend]
Collaboration diagram for HpfpController:
Collaboration graph
[legend]

Public Types

using interface_t = HpfpController
 

Public Member Functions

void onFastCallback () final
 
- Public Member Functions inherited from EngineModule
virtual void onConfigurationChange (engine_configuration_s const *)
 
virtual void onSlowCallback ()
 
virtual void onIgnitionStateChanged (bool)
 
virtual bool needsDelayedShutoff ()
 

Data Fields

angle_t m_deadangle = 0
 Computed solenoid deadtime in degrees.
 
- Data Fields inherited from high_pressure_fuel_pump_s
angle_t m_requested_pump = (angle_t)0
 
float fuel_requested_percent = (float)0
 
float fuel_requested_percent_pi = (float)0
 
bool noValve: 1 {}
 
bool angleAboveMin: 1 {}
 
bool isHpfpActive: 1 {}
 
bool HpfpValveState: 1 {}
 
bool unusedBit_7_4: 1 {}
 
bool unusedBit_7_5: 1 {}
 
bool unusedBit_7_6: 1 {}
 
bool unusedBit_7_7: 1 {}
 
bool unusedBit_7_8: 1 {}
 
bool unusedBit_7_9: 1 {}
 
bool unusedBit_7_10: 1 {}
 
bool unusedBit_7_11: 1 {}
 
bool unusedBit_7_12: 1 {}
 
bool unusedBit_7_13: 1 {}
 
bool unusedBit_7_14: 1 {}
 
bool unusedBit_7_15: 1 {}
 
bool unusedBit_7_16: 1 {}
 
bool unusedBit_7_17: 1 {}
 
bool unusedBit_7_18: 1 {}
 
bool unusedBit_7_19: 1 {}
 
bool unusedBit_7_20: 1 {}
 
bool unusedBit_7_21: 1 {}
 
bool unusedBit_7_22: 1 {}
 
bool unusedBit_7_23: 1 {}
 
bool unusedBit_7_24: 1 {}
 
bool unusedBit_7_25: 1 {}
 
bool unusedBit_7_26: 1 {}
 
bool unusedBit_7_27: 1 {}
 
bool unusedBit_7_28: 1 {}
 
bool unusedBit_7_29: 1 {}
 
bool unusedBit_7_30: 1 {}
 
bool unusedBit_7_31: 1 {}
 
float m_pressureTarget_kPa = (float)0
 
angle_t nextLobe = (angle_t)0
 
float di_nextStart = (float)0
 
float HpfdActivationPhase = (float)0
 
float HpfdDeactivationPhase = (float)0
 

Private Member Functions

void scheduleNextCycle ()
 

Static Private Member Functions

static void pinTurnOn (HpfpController *self)
 
static void pinTurnOff (HpfpController *self)
 

Private Attributes

AngleBasedEvent m_event
 
HpfpQuantity m_quantity
 
HpfpLobe m_lobe
 
volatile bool m_running = false
 Whether events are being scheduled or not.
 

Detailed Description

Definition at line 82 of file high_pressure_fuel_pump.h.

Member Typedef Documentation

◆ interface_t

Definition at line 85 of file high_pressure_fuel_pump.h.

Member Function Documentation

◆ onFastCallback()

void HpfpController::onFastCallback ( )
finalvirtual

Reimplemented from EngineModule.

Definition at line 156 of file high_pressure_fuel_pump.cpp.

156 {
157 // Pressure current/target calculation
159
160 isHpfpActive = !(rpm < rpm_spinning_cutoff ||
161 !isGdiEngine() ||
164 // What conditions can we not handle?
165 if (!isHpfpActive) {
168 m_deadangle = 0;
169 } else {
170#if EFI_PROD_CODE && EFI_SHAFT_POSITION_INPUT
171 criticalAssertVoid(engine->triggerCentral.triggerShape.getSize() > engineConfiguration->hpfpCamLobes * 6, "Too few trigger tooth for this number of HPFP lobes");
172#endif // EFI_PROD_CODE
173 // Convert deadtime from ms to degrees based on current RPM
174 float deadtime_ms = interpolate2d(
175 Sensor::get(SensorType::BatteryVoltage).value_or(VBAT_FALLBACK_VALUE),
178 m_deadangle = deadtime_ms * rpm * (360.f / 60.f / 1000.f);
179
180 // We set deadtime first, then pump, in case pump used to be 0. Pump is what
181 // determines whether we do anything or not.
183
184 if (!m_running) {
185 m_running = true;
187 }
188 }
189}
TriggerCentral triggerCentral
Definition engine.h:305
RegisteredNamedOutputPin hpfpValve
Definition efi_gpio.h:80
volatile bool m_running
Whether events are being scheduled or not.
angle_t m_deadangle
Computed solenoid deadtime in degrees.
angle_t pumpAngleFuel(float rpm, HpfpController *model)
bool isInitialized() const
Definition efi_gpio.cpp:545
virtual SensorResult get() const =0
static float getOrZero(SensorType type)
Definition sensor.h:83
TriggerWaveform triggerShape
size_t getSize() const
EnginePins enginePins
Definition efi_gpio.cpp:24
static Engine *const engine
Definition engine.h:390
static constexpr persistent_config_s * config
static constexpr engine_configuration_s * engineConfiguration
bool isGdiEngine()
scaled_channel< uint16_t, 1000, 1 > hpfpDeadtimeMS[HPFP_DEADTIME_SIZE]
Here is the call graph for this function:

◆ pinTurnOff()

void HpfpController::pinTurnOff ( HpfpController self)
staticprivate

Definition at line 206 of file high_pressure_fuel_pump.cpp.

206 {
207 enginePins.hpfpValve.setLow(HPFP_CONTROLLER);
208 self->HpfpValveState = false;
210
211 self->scheduleNextCycle();
212}
virtual void setLow(const char *msg)
Definition efi_gpio.cpp:450
expected< float > getCurrentEnginePhase(efitick_t nowNt) const
efitick_t getTimeNowNt()
Definition efitime.cpp:19
TriggerCentral * getTriggerCentral()
Definition engine.cpp:593

Referenced by scheduleNextCycle().

Here is the call graph for this function:
Here is the caller graph for this function:

◆ pinTurnOn()

void HpfpController::pinTurnOn ( HpfpController self)
staticprivate

Definition at line 193 of file high_pressure_fuel_pump.cpp.

193 {
194 enginePins.hpfpValve.setHigh(HPFP_CONTROLLER);
195 self->HpfpValveState = true;
197
198 // By scheduling the close after we already open, we don't have to worry if the engine
199 // stops, the valve will be turned off in a certain amount of time regardless.
203 { pinTurnOff, self });
204}
AngleBasedEvent m_event
virtual void setHigh(const char *msg)
Definition efi_gpio.cpp:428
efitick_t scheduleByAngle(scheduling_s *timer, efitick_t nowNt, angle_t angle, action_s action)
scheduling_s eventScheduling
efitick_t getMomentNt() const
Definition scheduler.h:64

Referenced by scheduleNextCycle().

Here is the call graph for this function:
Here is the caller graph for this function:

◆ scheduleNextCycle()

void HpfpController::scheduleNextCycle ( )
private

We are good to use just one m_event instance because new events are scheduled when we turn off valve.

Definition at line 214 of file high_pressure_fuel_pump.cpp.

214 {
216 if (noValve) {
217 m_running = false;
218 return;
219 }
220
221 angle_t lobeAngle = m_lobe.findNextLobe();
222 //TODO: integrate livedata into HpfpLobe
224 angle_t angle_requested = m_requested_pump;
225
227 if (angleAboveMin) {
228 // TODO: som manuals suggest also substracting peak time (converted to angle)
229 di_nextStart = lobeAngle - angle_requested - m_deadangle;
231
232
233 /**
234 * We are good to use just one m_event instance because new events are scheduled when we turn off valve.
235 */
236 engine->module<TriggerScheduler>()->schedule(
237 "hpfp",
238 &m_event,
240 { pinTurnOn, this });
241
242 // Off will be scheduled after turning the valve on
243 } else {
244 wrapAngle(lobeAngle, "lobe", ObdCode::CUSTOM_ERR_6557);
245 // Schedule this, even if we aren't opening the valve this time, since this
246 // will schedule the next lobe.
247 // todo: would it have been cleaner to schedule 'scheduleNextCycle' directly?
248 engine->module<TriggerScheduler>()->schedule(
249 HPFP_CONTROLLER,
250 &m_event, lobeAngle,
251 { pinTurnOff, this });
252 }
253}
constexpr auto & module()
Definition engine.h:193
static void pinTurnOff(HpfpController *self)
static void pinTurnOn(HpfpController *self)
uint8_t m_lobe_index
0-based index of the last lobe returned
angle_t findNextLobe()
Calculate the angle (after crank TDC) for the top of the next lobe.
@ CUSTOM_ERR_6557
float angle_t
void wrapAngle(angle_t &angle, const char *msg, ObdCode code)

Referenced by onFastCallback(), and pinTurnOff().

Here is the call graph for this function:
Here is the caller graph for this function:

Field Documentation

◆ m_deadangle

angle_t HpfpController::m_deadangle = 0

Computed solenoid deadtime in degrees.

Definition at line 88 of file high_pressure_fuel_pump.h.

Referenced by onFastCallback(), pinTurnOn(), scheduleNextCycle(), and LimpManager::updateState().

◆ m_event

AngleBasedEvent HpfpController::m_event
private

Definition at line 93 of file high_pressure_fuel_pump.h.

Referenced by pinTurnOn(), and scheduleNextCycle().

◆ m_lobe

HpfpLobe HpfpController::m_lobe
private

Definition at line 96 of file high_pressure_fuel_pump.h.

Referenced by scheduleNextCycle().

◆ m_quantity

HpfpQuantity HpfpController::m_quantity
private

Definition at line 95 of file high_pressure_fuel_pump.h.

Referenced by onFastCallback().

◆ m_running

volatile bool HpfpController::m_running = false
private

Whether events are being scheduled or not.

Definition at line 98 of file high_pressure_fuel_pump.h.

Referenced by onFastCallback(), and scheduleNextCycle().


The documentation for this class was generated from the following files: