lambda monitor wiring

This commit is contained in:
Matthew Kennedy 2023-06-29 02:49:50 -04:00 committed by rusefillc
parent 6ed73a948a
commit 12cad99136
5 changed files with 34 additions and 7 deletions

View File

@ -49,6 +49,7 @@
#include "prime_injection.h"
#include "throttle_model.h"
#include "gc_generic.h"
#include "lambda_monitor.h"
#ifndef EFI_UNIT_TEST
#error EFI_UNIT_TEST must be defined!
@ -187,6 +188,8 @@ public:
BoostController boostController;
#endif // EFI_BOOST_CONTROL
LambdaMonitor lambdaMonitor;
IgnitionState ignitionState;
void resetLua();

View File

@ -164,6 +164,7 @@ void EngineState::periodicFastCallback() {
float fuelLoad = getFuelingLoad();
injectionOffset = getInjectionOffset(rpm, fuelLoad);
engine->lambdaMonitor.update(rpm, fuelLoad);
float ignitionLoad = getIgnitionLoad();
float baseAdvance = getAdvance(rpm, ignitionLoad) * engine->ignitionState.luaTimingMult + engine->ignitionState.luaTimingAdd;

View File

@ -80,6 +80,10 @@ void LimpManager::updateState(int rpm, efitick_t nowNt) {
}
}
if (engine->lambdaMonitor.isCut()) {
allowFuel.clear(ClearReason::LambdaProtection);
}
#if EFI_SHAFT_POSITION_INPUT
if (noFiringUntilVvtSync(engineConfiguration->vvtMode[0])
&& !engine->triggerCentral.triggerState.hasSynchronizedPhase()) {

View File

@ -12,21 +12,29 @@ float LambdaMonitor::getMaxAllowedLambda(float rpm, float load) const {
);
}
bool LambdaMonitorBase::isCut() const {
return m_isCut;
}
void LambdaMonitorBase::update(float rpm, float load) {
if (isCurrentlyGood(rpm, load)) {
m_timeSinceGoodLambda.reset();
}
float timeout = engineConfiguration->lambdaProtectionTimeout;
if (m_timeSinceGoodLambda.hasElapsedSec(engineConfiguration->lambdaProtectionTimeout)) {
// Things have been bad long enough, cut!
m_isCut = true;
}
if (m_timeSinceGoodLambda.hasElapsedSec(timeout)) {
// Things have been bad long enough, respond!
// TODO
if (m_isCut) {
// If things are back to normal, cancel the cut and force a reset
if (restoreConditionsMet(rpm, load)) {
m_isCut = false;
m_timeSinceGoodLambda.reset();
}
}
}
bool LambdaMonitorBase::isCurrentlyGood(float rpm, float load) const {
// Lambda is always good if disabled
if (!engineConfiguration->lambdaProtectionEnable) {
@ -77,3 +85,9 @@ bool LambdaMonitorBase::isCurrentlyGood(float rpm, float load) const {
// All checks failed, lambda is currently bad.
return false;
}
bool LambdaMonitorBase::restoreConditionsMet(float rpm, float load) const {
// TODO #75
return true;
}

View File

@ -2,6 +2,7 @@
struct LambdaMonitorBase {
void update(float rpm, float load);
bool isCut() const;
protected:
// Returns whether lambda checking should happen at all
@ -12,9 +13,13 @@ protected:
bool isCurrentlyGood(float rpm, float load) const;
virtual float getMaxAllowedLambda(float rpm, float load) const = 0;
// Determine whether fuel should be restored after a cut occurs
// Returns true if OK to leave the "cut" state
bool restoreConditionsMet(float rpm, float load) const;
private:
Timer m_timeSinceGoodLambda;
bool m_isCut = false;
};
class LambdaMonitor : public LambdaMonitorBase {