rusEFI
The most advanced open source ECU
Loading...
Searching...
No Matches
Public Member Functions | Private Member Functions | Static Private Member Functions
PrimeController Class Reference

#include <prime_injection.h>

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

Public Member Functions

void onIgnitionStateChanged (bool ignitionOn) override
 
void onSlowCallback () override
 
floatms_t getPrimeDuration () const
 
void onPrimeStart ()
 
void onPrimeEnd ()
 
bool isPriming () const
 
- Public Member Functions inherited from EngineModule
virtual void initNoConfiguration ()
 
virtual void setDefaultConfiguration ()
 
virtual void onConfigurationChange (engine_configuration_s const *)
 
virtual void onFastCallback ()
 
virtual void onEngineStop ()
 
virtual bool needsDelayedShutoff ()
 
virtual void onEnginePhase (float, efitick_t, angle_t, angle_t)
 

Private Member Functions

uint32_t getKeyCycleCounter () const
 
void setKeyCycleCounter (uint32_t count)
 

Static Private Member Functions

static void onPrimeStartAdapter (PrimeController *instance)
 
static void onPrimeEndAdapter (PrimeController *instance)
 

Additional Inherited Members

- Data Fields inherited from prime_injection_s
bool m_isPriming: 1 {}
 
bool unusedBit_1_1: 1 {}
 
bool unusedBit_1_2: 1 {}
 
bool unusedBit_1_3: 1 {}
 
bool unusedBit_1_4: 1 {}
 
bool unusedBit_1_5: 1 {}
 
bool unusedBit_1_6: 1 {}
 
bool unusedBit_1_7: 1 {}
 
bool unusedBit_1_8: 1 {}
 
bool unusedBit_1_9: 1 {}
 
bool unusedBit_1_10: 1 {}
 
bool unusedBit_1_11: 1 {}
 
bool unusedBit_1_12: 1 {}
 
bool unusedBit_1_13: 1 {}
 
bool unusedBit_1_14: 1 {}
 
bool unusedBit_1_15: 1 {}
 
bool unusedBit_1_16: 1 {}
 
bool unusedBit_1_17: 1 {}
 
bool unusedBit_1_18: 1 {}
 
bool unusedBit_1_19: 1 {}
 
bool unusedBit_1_20: 1 {}
 
bool unusedBit_1_21: 1 {}
 
bool unusedBit_1_22: 1 {}
 
bool unusedBit_1_23: 1 {}
 
bool unusedBit_1_24: 1 {}
 
bool unusedBit_1_25: 1 {}
 
bool unusedBit_1_26: 1 {}
 
bool unusedBit_1_27: 1 {}
 
bool unusedBit_1_28: 1 {}
 
bool unusedBit_1_29: 1 {}
 
bool unusedBit_1_30: 1 {}
 
bool unusedBit_1_31: 1 {}
 

Detailed Description

Definition at line 13 of file prime_injection.h.

Member Function Documentation

◆ getKeyCycleCounter()

uint32_t PrimeController::getKeyCycleCounter ( ) const
private

Definition at line 85 of file prime_injection.cpp.

85 {
86#if EFI_BACKUP_SRAM
88#else // not EFI_BACKUP_SRAM
89 return 0;
90#endif // EFI_BACKUP_SRAM
91}
uint32_t backupRamLoad(backup_ram_e idx)

Referenced by onIgnitionStateChanged().

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

◆ getPrimeDuration()

floatms_t PrimeController::getPrimeDuration ( ) const

Definition at line 14 of file prime_injection.cpp.

14 {
16
17 // If the coolant sensor is dead, skip the prime. The engine will still start fine, but may take a little longer.
18 if (!clt) {
19 return 0;
20 }
21
22 auto primeMass =
23 0.001f * // convert milligram to gram
25
26 efiPrintf("Priming pulse mass: %.4f g", primeMass);
27
28 return engine->module<InjectorModelPrimary>()->getInjectionDuration(primeMass);
29}
constexpr auto & module()
Definition engine.h:200
virtual SensorResult get() const =0
static EngineAccessor engine
Definition engine.h:413
static constexpr engine_configuration_s * engineConfiguration
static CCM_OPTIONAL FunctionalSensor clt(SensorType::Clt, MS2NT(10))
scaled_channel< int16_t, 1, 1 > primeBins[PRIME_CURVE_COUNT]
scaled_channel< uint8_t, 1, 5 > primeValues[PRIME_CURVE_COUNT]

Referenced by onPrimeStart().

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

◆ isPriming()

bool PrimeController::isPriming ( ) const
inline

Definition at line 23 of file prime_injection.h.

23 {
24 return m_isPriming;
25 }

◆ onIgnitionStateChanged()

void PrimeController::onIgnitionStateChanged ( bool  ignitionOn)
overridevirtual

Reimplemented from EngineModule.

Definition at line 42 of file prime_injection.cpp.

42 {
43 if (!ignitionOn) {
44 // don't prime on ignition-off
45 return;
46 }
47
48 // First, we need a protection against 'fake' ignition switch on and off (i.e. no engine started), to avoid repeated prime pulses.
49 // So we check and update the ignition switch counter in non-volatile backup-RAM
50 uint32_t ignSwitchCounter = getKeyCycleCounter();
51
52 // if we're just toying with the ignition switch, give it another chance eventually...
53 if (ignSwitchCounter > 10) {
54 ignSwitchCounter = 0;
55 }
56
57 // If we're going to skip this pulse, then save the counter as 0.
58 // That's because we'll definitely need the prime pulse next time (either due to the cylinder cleanup or the engine spinning)
60 ignSwitchCounter = -1;
61 }
62
63 // start prime injection if this is a 'fresh start'
64 if (ignSwitchCounter == 0) {
65 // Give sensors long enough to wake up before priming
66 constexpr float minimumPrimeDelayMs = 100;
67 int32_t primeDelayNt = assertFloatFitsInto32BitsAndCast("primingDelay", MSF2NT(engineConfiguration->primingDelay * 1000 + minimumPrimeDelayMs));
68
69 auto startTime = getTimeNowNt() + primeDelayNt;
70 getScheduler()->schedule("primingDelay", nullptr, startTime, action_s::make<onPrimeStartAdapter>( this ));
71 } else {
72 efiPrintf("Skipped priming pulse since ignSwitchCounter = %lu", ignSwitchCounter);
73 }
74
75 // we'll reset it later when the engine starts
76 setKeyCycleCounter(ignSwitchCounter + 1);
77}
void setKeyCycleCounter(uint32_t count)
uint32_t getKeyCycleCounter() const
efitick_t getTimeNowNt()
Definition efitime.cpp:19
constexpr int32_t assertFloatFitsInto32BitsAndCast(const char *msg, float value)
Definition efitime.h:82
Scheduler * getScheduler()
Definition engine.cpp:585
static bool isPrimeInjectionPulseSkipped()
virtual void schedule(const char *msg, scheduling_s *scheduling, efitick_t targetTime, action_s const &action)=0
Schedule an action to be executed in the future.
Here is the call graph for this function:

◆ onPrimeEnd()

void PrimeController::onPrimeEnd ( )

Definition at line 118 of file prime_injection.cpp.

118 {
120
121 m_isPriming = false;
122}
void endSimultaneousInjectionOnlyTogglePins()
Here is the call graph for this function:

◆ onPrimeEndAdapter()

static void PrimeController::onPrimeEndAdapter ( PrimeController instance)
inlinestaticprivate

Definition at line 33 of file prime_injection.h.

33 {
34 instance->onPrimeEnd();
35 }
static BenchController instance

◆ onPrimeStart()

void PrimeController::onPrimeStart ( )

Definition at line 93 of file prime_injection.cpp.

93 {
94 auto durationMs = getPrimeDuration();
95
96 // Don't prime a zero-duration pulse
97 if (durationMs <= 0) {
98 efiPrintf("Skipped zero-duration priming pulse.");
99 return;
100 }
101#if EFI_PROD_CODE
102 if (durationMs >= TOO_FAR_INTO_FUTURE_MS) {
103 criticalError("Priming duration too long %dms", durationMs);
104 }
105#endif
106
107 efiPrintf("Firing priming pulse of %.2f ms", durationMs);
109
110 auto endTime = sumTickAndFloat(getTimeNowNt(), MSF2NT(durationMs));
111
112 // Open all injectors, schedule closing later
113 m_isPriming = true;
115 getScheduler()->schedule("onPrimeStart", nullptr, endTime, action_s::make<onPrimeEndAdapter>( this ));
116}
TunerStudioOutputChannels outputChannels
Definition engine.h:109
floatms_t getPrimeDuration() const
efitick_t sumTickAndFloat(efitick_t ticks, float extra)
Definition efitime.h:90
void startSimultaneousInjection()
Here is the call graph for this function:

◆ onPrimeStartAdapter()

static void PrimeController::onPrimeStartAdapter ( PrimeController instance)
inlinestaticprivate

Definition at line 29 of file prime_injection.h.

29 {
30 instance->onPrimeStart();
31 }

◆ onSlowCallback()

void PrimeController::onSlowCallback ( )
overridevirtual

Reimplemented from EngineModule.

Definition at line 124 of file prime_injection.cpp.

124 {
125 if (!getEngineRotationState()->isStopped()) {
126#if EFI_BACKUP_SRAM
128#endif /* EFI_BACKUP_SRAM */
129 }
130}
void backupRamSave(backup_ram_e idx, uint32_t value)
EngineRotationState * getEngineRotationState()
Definition engine.cpp:573
Here is the call graph for this function:

◆ setKeyCycleCounter()

void PrimeController::setKeyCycleCounter ( uint32_t  count)
private

Definition at line 79 of file prime_injection.cpp.

79 {
80#if EFI_BACKUP_SRAM
82#endif // EFI_BACKUP_SRAM
83}
uint16_t count
Definition tunerstudio.h:1

Referenced by onIgnitionStateChanged().

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

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