fome-fw/firmware/controllers/algo/airmass/airmass.cpp

37 lines
1.2 KiB
C++
Raw Normal View History

#include "pch.h"
2020-07-23 01:12:38 -07:00
#include "airmass.h"
#include "idle_thread.h"
2021-05-14 04:17:22 -07:00
AirmassVeModelBase::AirmassVeModelBase(const ValueProvider3D& veTable) : m_veTable(&veTable) {}
2020-07-23 01:12:38 -07:00
2021-05-14 04:17:22 -07:00
float AirmassVeModelBase::getVeLoadAxis(float passedLoad) const {
switch(CONFIG(veOverrideMode)) {
case VE_None: return passedLoad;
2021-10-05 16:59:07 -07:00
case VE_MAP: return Sensor::getOrZero(SensorType::Map);
case VE_TPS: return Sensor::getOrZero(SensorType::Tps1);
default: return 0;
}
}
2021-05-14 04:17:22 -07:00
float AirmassVeModelBase::getVe(int rpm, float load) const {
2020-07-23 01:12:38 -07:00
efiAssert(OBD_PCM_Processor_Fault, m_veTable != nullptr, "VE table null", 0);
// Override the load value if necessary
load = getVeLoadAxis(load);
float ve = m_veTable->getValue(rpm, load);
auto tps = Sensor::get(SensorType::Tps1);
// get VE from the separate table for Idle if idling
if (isIdlingOrTaper() && tps && CONFIG(useSeparateVeForIdle)) {
float idleVe = interpolate2d(rpm, config->idleVeBins, config->idleVe);
// interpolate between idle table and normal (running) table using TPS threshold
ve = interpolateClamped(0.0f, idleVe, CONFIG(idlePidDeactivationTpsThreshold), ve, tps.Value);
}
ENGINE(engineState.currentVe) = ve;
ENGINE(engineState.currentVeLoad) = load;
return ve * 0.01f;
2020-07-23 01:12:38 -07:00
}