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 resetQuantity ()
 
void onFastCallback () final
 
- Public Member Functions inherited from EngineModule
virtual void initNoConfiguration ()
 
virtual void setDefaultConfiguration ()
 
virtual void onConfigurationChange (engine_configuration_s const *)
 
virtual void onSlowCallback ()
 
virtual void onEngineStop ()
 
virtual void onIgnitionStateChanged (bool)
 
virtual bool needsDelayedShutoff ()
 
virtual void onEnginePhase (float, efitick_t, angle_t, angle_t)
 

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
 
float hpfp_p_control_percent = (float)0
 
float hpfp_i_control_percent = (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 71 of file high_pressure_fuel_pump.h.

Member Typedef Documentation

◆ interface_t

Definition at line 74 of file high_pressure_fuel_pump.h.

Member Function Documentation

◆ onFastCallback()

void HpfpController::onFastCallback ( )
finalvirtual

Reimplemented from EngineModule.

Definition at line 153 of file high_pressure_fuel_pump.cpp.

153 {
154 // Pressure current/target calculation
156
157 isHpfpActive = !(rpm < rpm_spinning_cutoff ||
158 !isGdiEngine() ||
161 // What conditions can we not handle?
162 if (!isHpfpActive) {
165 m_deadangle = 0;
166 } else {
167#if EFI_PROD_CODE && EFI_SHAFT_POSITION_INPUT
168 criticalAssertVoid(engine->triggerCentral.triggerShape.getSize() > engineConfiguration->hpfpCamLobes * 6, "Too few trigger tooth for this number of HPFP lobes");
169#endif // EFI_PROD_CODE
170 // Convert deadtime from ms to degrees based on current RPM
171 float deadtime_ms = interpolate2d(
172 Sensor::get(SensorType::BatteryVoltage).value_or(VBAT_FALLBACK_VALUE),
175 m_deadangle = deadtime_ms * rpm * (360.f / 60.f / 1000.f);
176
177 // We set deadtime first, then pump, in case pump used to be 0. Pump is what
178 // determines whether we do anything or not.
180
181 if (!m_running) {
182 m_running = true;
184 }
185 }
186}
TriggerCentral triggerCentral
Definition engine.h:318
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:559
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 EngineAccessor engine
Definition engine.h:413
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 210 of file high_pressure_fuel_pump.cpp.

210 {
211 enginePins.hpfpValve.setLow(HPFP_CONTROLLER);
212 self->HpfpValveState = false;
214
215 self->scheduleNextCycle();
216}
virtual void setLow(const char *msg)
Definition efi_gpio.cpp:464
expected< float > getCurrentEnginePhase(efitick_t nowNt) const
efitick_t getTimeNowNt()
Definition efitime.cpp:19
TriggerCentral * getTriggerCentral()
Definition engine.cpp:590
Here is the call graph for this function:

◆ pinTurnOn()

void HpfpController::pinTurnOn ( HpfpController self)
staticprivate

Definition at line 190 of file high_pressure_fuel_pump.cpp.

190 {
191 enginePins.hpfpValve.setHigh(HPFP_CONTROLLER);
192 self->HpfpValveState = true;
194
195 // By scheduling the close after we already open, we don't have to worry if the engine
196 // stops, the valve will be turned off in a certain amount of time regardless.
197 //
198 // We do not need precise control of valve _duration_ since
199 // For the solenoid type pump, the pump has a certain volume. You can activate the solenoid to request that the pump start pressurizing.
200 // Once it reaches a certain pressure, it is effectively self running and won't unlatch until the pump reaches the top.
201 // Since the solenoid latches itself, you don't have to keep it activated for the whole lobe. You just need to activate it until it latches and then let it do the rest of the work.
202 // see also https://rusefi.com/forum/viewtopic.php?f=5&t=2192
203
207 action_s::make<pinTurnOff>( self ));
208}
AngleBasedEvent m_event
virtual void setHigh(const char *msg)
Definition efi_gpio.cpp:442
efitick_t scheduleByAngle(scheduling_s *timer, efitick_t nowNt, angle_t angle, action_s const &action)
scheduling_s eventScheduling
efitick_t getMomentNt() const
Definition scheduler.h:270
Here is the call graph for this function:

◆ resetQuantity()

void HpfpController::resetQuantity ( )
inline

Reset internal state due to a stopped engine.

Definition at line 79 of file high_pressure_fuel_pump.h.

Referenced by onFastCallback().

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 218 of file high_pressure_fuel_pump.cpp.

218 {
220 if (noValve) {
221 m_running = false;
222 return;
223 }
224
225 angle_t lobeAngle = m_lobe.findNextLobe();
226 //TODO: integrate livedata into HpfpLobe
228 angle_t angle_requested = m_requested_pump;
229
231 if (angleAboveMin) {
232 // TODO: some manuals suggest also substracting peak time (converted to angle)
233 di_nextStart = lobeAngle - angle_requested - m_deadangle;
235
236
237 /**
238 * We are good to use just one m_event instance because new events are scheduled when we turn off valve.
239 */
240 engine->module<TriggerScheduler>()->schedule(
241 "hpfp",
242 &m_event,
244 action_s::make<pinTurnOn>( this ));
245
246 // Off will be scheduled after turning the valve on
247 } else {
248 wrapAngle(lobeAngle, "lobe", ObdCode::CUSTOM_ERR_6557);
249 // Schedule this, even if we aren't opening the valve this time, since this
250 // will schedule the next lobe.
251 // todo: schedule only 'scheduleNextCycle' directly since we do not need output control part of the logic here!
252 engine->module<TriggerScheduler>()->schedule(
253 HPFP_CONTROLLER,
254 &m_event, lobeAngle,
255 action_s::make<pinTurnOff>( this ));
256 }
257}
constexpr auto & module()
Definition engine.h:200
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 85 of file high_pressure_fuel_pump.h.

Referenced by onFastCallback(), pinTurnOn(), and scheduleNextCycle().

◆ m_event

AngleBasedEvent HpfpController::m_event
private

Definition at line 90 of file high_pressure_fuel_pump.h.

Referenced by pinTurnOn(), and scheduleNextCycle().

◆ m_lobe

HpfpLobe HpfpController::m_lobe
private

Definition at line 93 of file high_pressure_fuel_pump.h.

Referenced by scheduleNextCycle().

◆ m_quantity

HpfpQuantity HpfpController::m_quantity
private

Definition at line 92 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 95 of file high_pressure_fuel_pump.h.

Referenced by onFastCallback(), and scheduleNextCycle().


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