separating engine from not engine
This commit is contained in:
parent
19c410387d
commit
6264358a61
|
@ -6,7 +6,7 @@
|
||||||
* express myself in C/C++. I am open for suggestions :)
|
* express myself in C/C++. I am open for suggestions :)
|
||||||
*
|
*
|
||||||
* @date May 21, 2014
|
* @date May 21, 2014
|
||||||
* @author Andrey Belomutskiy, (c) 2012-2018
|
* @author Andrey Belomutskiy, (c) 2012-2019
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#include "global.h"
|
#include "global.h"
|
||||||
|
@ -32,11 +32,9 @@
|
||||||
|
|
||||||
static TriggerState initState CCM_OPTIONAL;
|
static TriggerState initState CCM_OPTIONAL;
|
||||||
|
|
||||||
static LoggingWithStorage logger("engine");
|
LoggingWithStorage engineLogger("engine");
|
||||||
|
|
||||||
extern fuel_Map3D_t veMap;
|
|
||||||
extern afr_Map3D_t afrMap;
|
|
||||||
|
|
||||||
|
// todo: in this file it would be better not to have complete 'EXTERN_ENGINE'
|
||||||
EXTERN_ENGINE
|
EXTERN_ENGINE
|
||||||
;
|
;
|
||||||
|
|
||||||
|
@ -44,22 +42,6 @@ EXTERN_ENGINE
|
||||||
extern TunerStudioOutputChannels tsOutputChannels;
|
extern TunerStudioOutputChannels tsOutputChannels;
|
||||||
#endif /* EFI_TUNER_STUDIO */
|
#endif /* EFI_TUNER_STUDIO */
|
||||||
|
|
||||||
MockAdcState::MockAdcState() {
|
|
||||||
memset(hasMockAdc, 0, sizeof(hasMockAdc));
|
|
||||||
}
|
|
||||||
|
|
||||||
#if EFI_ENABLE_MOCK_ADC || EFI_SIMULATOR
|
|
||||||
void MockAdcState::setMockVoltage(int hwChannel, float voltage) {
|
|
||||||
scheduleMsg(&logger, "fake voltage: channel %d value %.2f", hwChannel, voltage);
|
|
||||||
|
|
||||||
fakeAdcValues[hwChannel] = voltsToAdc(voltage);
|
|
||||||
hasMockAdc[hwChannel] = true;
|
|
||||||
}
|
|
||||||
#endif /* EFI_ENABLE_MOCK_ADC */
|
|
||||||
|
|
||||||
int MockAdcState::getMockAdcValue(int hwChannel) {
|
|
||||||
return fakeAdcValues[hwChannel];
|
|
||||||
}
|
|
||||||
|
|
||||||
void Engine::initializeTriggerShape(Logging *logger DECLARE_ENGINE_PARAMETER_SUFFIX) {
|
void Engine::initializeTriggerShape(Logging *logger DECLARE_ENGINE_PARAMETER_SUFFIX) {
|
||||||
#if !EFI_UNIT_TEST
|
#if !EFI_UNIT_TEST
|
||||||
|
@ -135,19 +117,6 @@ Engine::Engine(persistent_config_s *config) {
|
||||||
reset();
|
reset();
|
||||||
}
|
}
|
||||||
|
|
||||||
Accelerometer::Accelerometer() {
|
|
||||||
x = y = z = 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
SensorsState::SensorsState() {
|
|
||||||
reset();
|
|
||||||
}
|
|
||||||
|
|
||||||
void SensorsState::reset() {
|
|
||||||
fuelTankGauge = vBatt = 0;
|
|
||||||
iat = clt = NAN;
|
|
||||||
}
|
|
||||||
|
|
||||||
void Engine::reset() {
|
void Engine::reset() {
|
||||||
withError = isEngineChartEnabled = false;
|
withError = isEngineChartEnabled = false;
|
||||||
etbAutoTune = false;
|
etbAutoTune = false;
|
||||||
|
@ -191,179 +160,6 @@ void Engine::reset() {
|
||||||
engineConfigurationPtr = NULL;
|
engineConfigurationPtr = NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
FuelConsumptionState::FuelConsumptionState() {
|
|
||||||
perSecondConsumption = perSecondAccumulator = 0;
|
|
||||||
perMinuteConsumption = perMinuteAccumulator = 0;
|
|
||||||
accumulatedSecondPrevNt = accumulatedMinutePrevNt = getTimeNowNt();
|
|
||||||
}
|
|
||||||
|
|
||||||
void FuelConsumptionState::addData(float durationMs) {
|
|
||||||
if (durationMs > 0.0f) {
|
|
||||||
perSecondAccumulator += durationMs;
|
|
||||||
perMinuteAccumulator += durationMs;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
void FuelConsumptionState::update(efitick_t nowNt DECLARE_ENGINE_PARAMETER_SUFFIX) {
|
|
||||||
efitick_t deltaNt = nowNt - accumulatedSecondPrevNt;
|
|
||||||
if (deltaNt >= US2NT(US_PER_SECOND_LL)) {
|
|
||||||
perSecondConsumption = getFuelRate(perSecondAccumulator, deltaNt PASS_ENGINE_PARAMETER_SUFFIX);
|
|
||||||
perSecondAccumulator = 0;
|
|
||||||
accumulatedSecondPrevNt = nowNt;
|
|
||||||
}
|
|
||||||
|
|
||||||
deltaNt = nowNt - accumulatedMinutePrevNt;
|
|
||||||
if (deltaNt >= US2NT(US_PER_SECOND_LL * 60)) {
|
|
||||||
perMinuteConsumption = getFuelRate(perMinuteAccumulator, deltaNt PASS_ENGINE_PARAMETER_SUFFIX);
|
|
||||||
perMinuteAccumulator = 0;
|
|
||||||
accumulatedMinutePrevNt = nowNt;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
TransmissionState::TransmissionState() {
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
EngineState::EngineState() {
|
|
||||||
dwellAngle = NAN;
|
|
||||||
engineNoiseHipLevel = 0;
|
|
||||||
injectorLag = 0;
|
|
||||||
warningCounter = 0;
|
|
||||||
lastErrorCode = 0;
|
|
||||||
crankingTime = 0;
|
|
||||||
timeSinceCranking = 0;
|
|
||||||
vssEventCounter = 0;
|
|
||||||
targetAFR = 0;
|
|
||||||
tpsAccelEnrich = 0;
|
|
||||||
tCharge = tChargeK = 0;
|
|
||||||
timeSinceLastTChargeK = getTimeNowNt();
|
|
||||||
airFlow = 0;
|
|
||||||
cltTimingCorrection = 0;
|
|
||||||
runningFuel = baseFuel = currentVE = 0;
|
|
||||||
timeOfPreviousWarning = -10;
|
|
||||||
baseTableFuel = iatFuelCorrection = 0;
|
|
||||||
fuelPidCorrection = 0;
|
|
||||||
cltFuelCorrection = postCrankingFuelCorrection = 0;
|
|
||||||
warmupTargetAfr = airMass = 0;
|
|
||||||
baroCorrection = timingAdvance = 0;
|
|
||||||
sparkDwell = mapAveragingDuration = 0;
|
|
||||||
totalLoggedBytes = injectionOffset = 0;
|
|
||||||
auxValveStart = auxValveEnd = 0;
|
|
||||||
fuelCutoffCorrection = 0;
|
|
||||||
coastingFuelCutStartTime = 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
void EngineState::updateSlowSensors(DECLARE_ENGINE_PARAMETER_SIGNATURE) {
|
|
||||||
engine->sensors.iat = getIntakeAirTemperature(PASS_ENGINE_PARAMETER_SIGNATURE);
|
|
||||||
engine->sensors.clt = getCoolantTemperature(PASS_ENGINE_PARAMETER_SIGNATURE);
|
|
||||||
engine->sensors.oilPressure = getOilPressure(PASS_ENGINE_PARAMETER_SIGNATURE);
|
|
||||||
|
|
||||||
warmupTargetAfr = interpolate2d("warm", engine->sensors.clt, engineConfiguration->warmupTargetAfrBins,
|
|
||||||
engineConfiguration->warmupTargetAfr, WARMUP_TARGET_AFR_SIZE);
|
|
||||||
}
|
|
||||||
|
|
||||||
void EngineState::periodicFastCallback(DECLARE_ENGINE_PARAMETER_SIGNATURE) {
|
|
||||||
efitick_t nowNt = getTimeNowNt();
|
|
||||||
if (ENGINE(rpmCalculator).isCranking(PASS_ENGINE_PARAMETER_SIGNATURE)) {
|
|
||||||
crankingTime = nowNt;
|
|
||||||
timeSinceCranking = 0.0f;
|
|
||||||
} else {
|
|
||||||
timeSinceCranking = nowNt - crankingTime;
|
|
||||||
}
|
|
||||||
updateAuxValves(PASS_ENGINE_PARAMETER_SIGNATURE);
|
|
||||||
|
|
||||||
int rpm = ENGINE(rpmCalculator).getRpm(PASS_ENGINE_PARAMETER_SIGNATURE);
|
|
||||||
sparkDwell = getSparkDwell(rpm PASS_ENGINE_PARAMETER_SUFFIX);
|
|
||||||
dwellAngle = cisnan(rpm) ? NAN : sparkDwell / getOneDegreeTimeMs(rpm);
|
|
||||||
if (hasAfrSensor(PASS_ENGINE_PARAMETER_SIGNATURE)) {
|
|
||||||
engine->sensors.currentAfr = getAfr(PASS_ENGINE_PARAMETER_SIGNATURE);
|
|
||||||
}
|
|
||||||
|
|
||||||
// todo: move this into slow callback, no reason for IAT corr to be here
|
|
||||||
iatFuelCorrection = getIatFuelCorrection(engine->sensors.iat PASS_ENGINE_PARAMETER_SUFFIX);
|
|
||||||
// todo: move this into slow callback, no reason for CLT corr to be here
|
|
||||||
if (boardConfiguration->useWarmupPidAfr && engine->sensors.clt < engineConfiguration->warmupAfrThreshold) {
|
|
||||||
if (rpm < 200) {
|
|
||||||
cltFuelCorrection = 1;
|
|
||||||
warmupAfrPid.reset();
|
|
||||||
} else {
|
|
||||||
cltFuelCorrection = warmupAfrPid.getValue(warmupTargetAfr, engine->sensors.currentAfr, 1);
|
|
||||||
}
|
|
||||||
if (engineConfiguration->debugMode == DBG_WARMUP_ENRICH) {
|
|
||||||
#if EFI_TUNER_STUDIO || defined(__DOXYGEN__)
|
|
||||||
tsOutputChannels.debugFloatField1 = warmupTargetAfr;
|
|
||||||
warmupAfrPid.postState(&tsOutputChannels);
|
|
||||||
#endif /* EFI_TUNER_STUDIO */
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
cltFuelCorrection = getCltFuelCorrection(PASS_ENGINE_PARAMETER_SIGNATURE);
|
|
||||||
}
|
|
||||||
|
|
||||||
// update fuel consumption states
|
|
||||||
fuelConsumption.update(nowNt PASS_ENGINE_PARAMETER_SUFFIX);
|
|
||||||
|
|
||||||
// Fuel cut-off isn't just 0 or 1, it can be tapered
|
|
||||||
fuelCutoffCorrection = getFuelCutOffCorrection(nowNt, rpm PASS_ENGINE_PARAMETER_SUFFIX);
|
|
||||||
|
|
||||||
// post-cranking fuel enrichment.
|
|
||||||
// for compatibility reasons, apply only if the factor is greater than zero (0.01 margin used)
|
|
||||||
if (engineConfiguration->postCrankingFactor > 0.01f) {
|
|
||||||
// convert to microsecs and then to seconds
|
|
||||||
float timeSinceCrankingInSecs = NT2US(timeSinceCranking) / 1000000.0f;
|
|
||||||
// use interpolation for correction taper
|
|
||||||
postCrankingFuelCorrection = interpolateClamped(0.0f, engineConfiguration->postCrankingFactor,
|
|
||||||
engineConfiguration->postCrankingDurationSec, 1.0f, timeSinceCrankingInSecs);
|
|
||||||
} else {
|
|
||||||
postCrankingFuelCorrection = 1.0f;
|
|
||||||
}
|
|
||||||
|
|
||||||
cltTimingCorrection = getCltTimingCorrection(PASS_ENGINE_PARAMETER_SIGNATURE);
|
|
||||||
|
|
||||||
engineNoiseHipLevel = interpolate2d("knock", rpm, engineConfiguration->knockNoiseRpmBins,
|
|
||||||
engineConfiguration->knockNoise, ENGINE_NOISE_CURVE_SIZE);
|
|
||||||
|
|
||||||
baroCorrection = getBaroCorrection(PASS_ENGINE_PARAMETER_SIGNATURE);
|
|
||||||
|
|
||||||
injectionOffset = getInjectionOffset(rpm PASS_ENGINE_PARAMETER_SUFFIX);
|
|
||||||
float engineLoad = getEngineLoadT(PASS_ENGINE_PARAMETER_SIGNATURE);
|
|
||||||
timingAdvance = getAdvance(rpm, engineLoad PASS_ENGINE_PARAMETER_SUFFIX);
|
|
||||||
|
|
||||||
if (engineConfiguration->fuelAlgorithm == LM_SPEED_DENSITY) {
|
|
||||||
float tps = getTPS(PASS_ENGINE_PARAMETER_SIGNATURE);
|
|
||||||
updateTChargeK(rpm, tps PASS_ENGINE_PARAMETER_SUFFIX);
|
|
||||||
float map = getMap();
|
|
||||||
|
|
||||||
/**
|
|
||||||
* *0.01 because of https://sourceforge.net/p/rusefi/tickets/153/
|
|
||||||
*/
|
|
||||||
float rawVe = veMap.getValue(rpm, map);
|
|
||||||
// get VE from the separate table for Idle
|
|
||||||
if (CONFIG(useSeparateVeForIdle)) {
|
|
||||||
float idleVe = interpolate2d("idleVe", rpm, config->idleVeBins, config->idleVe, IDLE_VE_CURVE_SIZE);
|
|
||||||
// interpolate between idle table and normal (running) table using TPS threshold
|
|
||||||
rawVe = interpolateClamped(0.0f, idleVe, boardConfiguration->idlePidDeactivationTpsThreshold, rawVe, tps);
|
|
||||||
}
|
|
||||||
currentVE = baroCorrection * rawVe * 0.01;
|
|
||||||
targetAFR = afrMap.getValue(rpm, map);
|
|
||||||
} else {
|
|
||||||
baseTableFuel = getBaseTableFuel(rpm, engineLoad);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
void EngineState::updateTChargeK(int rpm, float tps DECLARE_ENGINE_PARAMETER_SUFFIX) {
|
|
||||||
float coolantC = ENGINE(sensors.clt);
|
|
||||||
float intakeC = ENGINE(sensors.iat);
|
|
||||||
float newTCharge = getTCharge(rpm, tps, coolantC, intakeC PASS_ENGINE_PARAMETER_SUFFIX);
|
|
||||||
// convert to microsecs and then to seconds
|
|
||||||
efitick_t curTime = getTimeNowNt();
|
|
||||||
float secsPassed = (float)NT2US(curTime - timeSinceLastTChargeK) / 1000000.0f;
|
|
||||||
if (!cisnan(newTCharge)) {
|
|
||||||
// control the rate of change or just fill with the initial value
|
|
||||||
tCharge = (tChargeK == 0) ? newTCharge : limitRateOfChange(newTCharge, tCharge, CONFIG(tChargeAirIncrLimit), CONFIG(tChargeAirDecrLimit), secsPassed);
|
|
||||||
tChargeK = convertCelsiusToKelvin(tCharge);
|
|
||||||
timeSinceLastTChargeK = curTime;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Here we have a bunch of stuff which should invoked after configuration change
|
* Here we have a bunch of stuff which should invoked after configuration change
|
||||||
|
@ -398,7 +194,7 @@ void Engine::setConfig(persistent_config_s *config) {
|
||||||
}
|
}
|
||||||
|
|
||||||
void Engine::printKnockState(void) {
|
void Engine::printKnockState(void) {
|
||||||
scheduleMsg(&logger, "knock now=%s/ever=%s", boolToString(knockNow), boolToString(knockEver));
|
scheduleMsg(&engineLogger, "knock now=%s/ever=%s", boolToString(knockNow), boolToString(knockEver));
|
||||||
}
|
}
|
||||||
|
|
||||||
void Engine::knockLogic(float knockVolts) {
|
void Engine::knockLogic(float knockVolts) {
|
||||||
|
@ -458,8 +254,8 @@ void Engine::watchdog() {
|
||||||
isSpinning = false;
|
isSpinning = false;
|
||||||
ignitionEvents.isReady = false;
|
ignitionEvents.isReady = false;
|
||||||
#if EFI_PROD_CODE || EFI_SIMULATOR || defined(__DOXYGEN__)
|
#if EFI_PROD_CODE || EFI_SIMULATOR || defined(__DOXYGEN__)
|
||||||
scheduleMsg(&logger, "engine has STOPPED");
|
scheduleMsg(&engineLogger, "engine has STOPPED");
|
||||||
scheduleMsg(&logger, "templog engine has STOPPED [%x][%x] [%x][%x] %d",
|
scheduleMsg(&engineLogger, "templog engine has STOPPED [%x][%x] [%x][%x] %d",
|
||||||
(int)(nowNt >> 32), (int)nowNt,
|
(int)(nowNt >> 32), (int)nowNt,
|
||||||
(int)(lastTriggerToothEventTimeNt >> 32), (int)lastTriggerToothEventTimeNt,
|
(int)(lastTriggerToothEventTimeNt >> 32), (int)lastTriggerToothEventTimeNt,
|
||||||
(int)timeSinceLastTriggerEvent
|
(int)timeSinceLastTriggerEvent
|
||||||
|
@ -519,39 +315,3 @@ void Engine::periodicFastCallback(DECLARE_ENGINE_PARAMETER_SIGNATURE) {
|
||||||
engine->m.fuelCalcTime = GET_TIMESTAMP() - engine->m.beforeFuelCalc;
|
engine->m.fuelCalcTime = GET_TIMESTAMP() - engine->m.beforeFuelCalc;
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
StartupFuelPumping::StartupFuelPumping() {
|
|
||||||
isTpsAbove50 = false;
|
|
||||||
pumpsCounter = 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
void StartupFuelPumping::setPumpsCounter(int newValue) {
|
|
||||||
if (pumpsCounter != newValue) {
|
|
||||||
pumpsCounter = newValue;
|
|
||||||
|
|
||||||
if (pumpsCounter == PUMPS_TO_PRIME) {
|
|
||||||
scheduleMsg(&logger, "let's squirt prime pulse %.2f", pumpsCounter);
|
|
||||||
pumpsCounter = 0;
|
|
||||||
} else {
|
|
||||||
scheduleMsg(&logger, "setPumpsCounter %d", pumpsCounter);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
void StartupFuelPumping::update(DECLARE_ENGINE_PARAMETER_SIGNATURE) {
|
|
||||||
if (engine->rpmCalculator.getRpm(PASS_ENGINE_PARAMETER_SIGNATURE) == 0) {
|
|
||||||
bool isTpsAbove50 = getTPS(PASS_ENGINE_PARAMETER_SIGNATURE) >= 50;
|
|
||||||
|
|
||||||
if (this->isTpsAbove50 != isTpsAbove50) {
|
|
||||||
setPumpsCounter(pumpsCounter + 1);
|
|
||||||
}
|
|
||||||
|
|
||||||
} else {
|
|
||||||
/**
|
|
||||||
* Engine is not stopped - not priming pumping mode
|
|
||||||
*/
|
|
||||||
setPumpsCounter(0);
|
|
||||||
isTpsAbove50 = false;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
|
@ -0,0 +1,273 @@
|
||||||
|
/*
|
||||||
|
* engine2.cpp
|
||||||
|
*
|
||||||
|
* @date Jan 5, 2019
|
||||||
|
* @author Andrey Belomutskiy, (c) 2012-2019
|
||||||
|
*/
|
||||||
|
|
||||||
|
// todo: move this code to more proper locations
|
||||||
|
|
||||||
|
#include "engine.h"
|
||||||
|
#include "thermistors.h"
|
||||||
|
#include "speed_density.h"
|
||||||
|
#include "allsensors.h"
|
||||||
|
#include "fuel_math.h"
|
||||||
|
#include "engine_math.h"
|
||||||
|
#include "advance_map.h"
|
||||||
|
#include "aux_valves.h"
|
||||||
|
|
||||||
|
extern fuel_Map3D_t veMap;
|
||||||
|
extern afr_Map3D_t afrMap;
|
||||||
|
|
||||||
|
EXTERN_ENGINE
|
||||||
|
;
|
||||||
|
|
||||||
|
// this does not look exactly right
|
||||||
|
extern LoggingWithStorage engineLogger;
|
||||||
|
|
||||||
|
#if EFI_TUNER_STUDIO || defined(__DOXYGEN__)
|
||||||
|
extern TunerStudioOutputChannels tsOutputChannels;
|
||||||
|
#endif /* EFI_TUNER_STUDIO */
|
||||||
|
|
||||||
|
|
||||||
|
MockAdcState::MockAdcState() {
|
||||||
|
memset(hasMockAdc, 0, sizeof(hasMockAdc));
|
||||||
|
}
|
||||||
|
|
||||||
|
#if EFI_ENABLE_MOCK_ADC || EFI_SIMULATOR
|
||||||
|
void MockAdcState::setMockVoltage(int hwChannel, float voltage) {
|
||||||
|
scheduleMsg(&engineLogger, "fake voltage: channel %d value %.2f", hwChannel, voltage);
|
||||||
|
|
||||||
|
fakeAdcValues[hwChannel] = voltsToAdc(voltage);
|
||||||
|
hasMockAdc[hwChannel] = true;
|
||||||
|
}
|
||||||
|
#endif /* EFI_ENABLE_MOCK_ADC */
|
||||||
|
|
||||||
|
FuelConsumptionState::FuelConsumptionState() {
|
||||||
|
perSecondConsumption = perSecondAccumulator = 0;
|
||||||
|
perMinuteConsumption = perMinuteAccumulator = 0;
|
||||||
|
accumulatedSecondPrevNt = accumulatedMinutePrevNt = getTimeNowNt();
|
||||||
|
}
|
||||||
|
|
||||||
|
void FuelConsumptionState::addData(float durationMs) {
|
||||||
|
if (durationMs > 0.0f) {
|
||||||
|
perSecondAccumulator += durationMs;
|
||||||
|
perMinuteAccumulator += durationMs;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void FuelConsumptionState::update(efitick_t nowNt DECLARE_ENGINE_PARAMETER_SUFFIX) {
|
||||||
|
efitick_t deltaNt = nowNt - accumulatedSecondPrevNt;
|
||||||
|
if (deltaNt >= US2NT(US_PER_SECOND_LL)) {
|
||||||
|
perSecondConsumption = getFuelRate(perSecondAccumulator, deltaNt PASS_ENGINE_PARAMETER_SUFFIX);
|
||||||
|
perSecondAccumulator = 0;
|
||||||
|
accumulatedSecondPrevNt = nowNt;
|
||||||
|
}
|
||||||
|
|
||||||
|
deltaNt = nowNt - accumulatedMinutePrevNt;
|
||||||
|
if (deltaNt >= US2NT(US_PER_SECOND_LL * 60)) {
|
||||||
|
perMinuteConsumption = getFuelRate(perMinuteAccumulator, deltaNt PASS_ENGINE_PARAMETER_SUFFIX);
|
||||||
|
perMinuteAccumulator = 0;
|
||||||
|
accumulatedMinutePrevNt = nowNt;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
TransmissionState::TransmissionState() {
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
EngineState::EngineState() {
|
||||||
|
dwellAngle = NAN;
|
||||||
|
engineNoiseHipLevel = 0;
|
||||||
|
injectorLag = 0;
|
||||||
|
warningCounter = 0;
|
||||||
|
lastErrorCode = 0;
|
||||||
|
crankingTime = 0;
|
||||||
|
timeSinceCranking = 0;
|
||||||
|
vssEventCounter = 0;
|
||||||
|
targetAFR = 0;
|
||||||
|
tpsAccelEnrich = 0;
|
||||||
|
tCharge = tChargeK = 0;
|
||||||
|
timeSinceLastTChargeK = getTimeNowNt();
|
||||||
|
airFlow = 0;
|
||||||
|
cltTimingCorrection = 0;
|
||||||
|
runningFuel = baseFuel = currentVE = 0;
|
||||||
|
timeOfPreviousWarning = -10;
|
||||||
|
baseTableFuel = iatFuelCorrection = 0;
|
||||||
|
fuelPidCorrection = 0;
|
||||||
|
cltFuelCorrection = postCrankingFuelCorrection = 0;
|
||||||
|
warmupTargetAfr = airMass = 0;
|
||||||
|
baroCorrection = timingAdvance = 0;
|
||||||
|
sparkDwell = mapAveragingDuration = 0;
|
||||||
|
totalLoggedBytes = injectionOffset = 0;
|
||||||
|
auxValveStart = auxValveEnd = 0;
|
||||||
|
fuelCutoffCorrection = 0;
|
||||||
|
coastingFuelCutStartTime = 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
void EngineState::updateSlowSensors(DECLARE_ENGINE_PARAMETER_SIGNATURE) {
|
||||||
|
engine->sensors.iat = getIntakeAirTemperature(PASS_ENGINE_PARAMETER_SIGNATURE);
|
||||||
|
engine->sensors.clt = getCoolantTemperature(PASS_ENGINE_PARAMETER_SIGNATURE);
|
||||||
|
engine->sensors.oilPressure = getOilPressure(PASS_ENGINE_PARAMETER_SIGNATURE);
|
||||||
|
|
||||||
|
warmupTargetAfr = interpolate2d("warm", engine->sensors.clt, engineConfiguration->warmupTargetAfrBins,
|
||||||
|
engineConfiguration->warmupTargetAfr, WARMUP_TARGET_AFR_SIZE);
|
||||||
|
}
|
||||||
|
|
||||||
|
void EngineState::periodicFastCallback(DECLARE_ENGINE_PARAMETER_SIGNATURE) {
|
||||||
|
efitick_t nowNt = getTimeNowNt();
|
||||||
|
if (ENGINE(rpmCalculator).isCranking(PASS_ENGINE_PARAMETER_SIGNATURE)) {
|
||||||
|
crankingTime = nowNt;
|
||||||
|
timeSinceCranking = 0.0f;
|
||||||
|
} else {
|
||||||
|
timeSinceCranking = nowNt - crankingTime;
|
||||||
|
}
|
||||||
|
updateAuxValves(PASS_ENGINE_PARAMETER_SIGNATURE);
|
||||||
|
|
||||||
|
int rpm = ENGINE(rpmCalculator).getRpm(PASS_ENGINE_PARAMETER_SIGNATURE);
|
||||||
|
sparkDwell = getSparkDwell(rpm PASS_ENGINE_PARAMETER_SUFFIX);
|
||||||
|
dwellAngle = cisnan(rpm) ? NAN : sparkDwell / getOneDegreeTimeMs(rpm);
|
||||||
|
if (hasAfrSensor(PASS_ENGINE_PARAMETER_SIGNATURE)) {
|
||||||
|
engine->sensors.currentAfr = getAfr(PASS_ENGINE_PARAMETER_SIGNATURE);
|
||||||
|
}
|
||||||
|
|
||||||
|
// todo: move this into slow callback, no reason for IAT corr to be here
|
||||||
|
iatFuelCorrection = getIatFuelCorrection(engine->sensors.iat PASS_ENGINE_PARAMETER_SUFFIX);
|
||||||
|
// todo: move this into slow callback, no reason for CLT corr to be here
|
||||||
|
if (boardConfiguration->useWarmupPidAfr && engine->sensors.clt < engineConfiguration->warmupAfrThreshold) {
|
||||||
|
if (rpm < 200) {
|
||||||
|
cltFuelCorrection = 1;
|
||||||
|
warmupAfrPid.reset();
|
||||||
|
} else {
|
||||||
|
cltFuelCorrection = warmupAfrPid.getValue(warmupTargetAfr, engine->sensors.currentAfr, 1);
|
||||||
|
}
|
||||||
|
if (engineConfiguration->debugMode == DBG_WARMUP_ENRICH) {
|
||||||
|
#if EFI_TUNER_STUDIO || defined(__DOXYGEN__)
|
||||||
|
tsOutputChannels.debugFloatField1 = warmupTargetAfr;
|
||||||
|
warmupAfrPid.postState(&tsOutputChannels);
|
||||||
|
#endif /* EFI_TUNER_STUDIO */
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
cltFuelCorrection = getCltFuelCorrection(PASS_ENGINE_PARAMETER_SIGNATURE);
|
||||||
|
}
|
||||||
|
|
||||||
|
// update fuel consumption states
|
||||||
|
fuelConsumption.update(nowNt PASS_ENGINE_PARAMETER_SUFFIX);
|
||||||
|
|
||||||
|
// Fuel cut-off isn't just 0 or 1, it can be tapered
|
||||||
|
fuelCutoffCorrection = getFuelCutOffCorrection(nowNt, rpm PASS_ENGINE_PARAMETER_SUFFIX);
|
||||||
|
|
||||||
|
// post-cranking fuel enrichment.
|
||||||
|
// for compatibility reasons, apply only if the factor is greater than zero (0.01 margin used)
|
||||||
|
if (engineConfiguration->postCrankingFactor > 0.01f) {
|
||||||
|
// convert to microsecs and then to seconds
|
||||||
|
float timeSinceCrankingInSecs = NT2US(timeSinceCranking) / 1000000.0f;
|
||||||
|
// use interpolation for correction taper
|
||||||
|
postCrankingFuelCorrection = interpolateClamped(0.0f, engineConfiguration->postCrankingFactor,
|
||||||
|
engineConfiguration->postCrankingDurationSec, 1.0f, timeSinceCrankingInSecs);
|
||||||
|
} else {
|
||||||
|
postCrankingFuelCorrection = 1.0f;
|
||||||
|
}
|
||||||
|
|
||||||
|
cltTimingCorrection = getCltTimingCorrection(PASS_ENGINE_PARAMETER_SIGNATURE);
|
||||||
|
|
||||||
|
engineNoiseHipLevel = interpolate2d("knock", rpm, engineConfiguration->knockNoiseRpmBins,
|
||||||
|
engineConfiguration->knockNoise, ENGINE_NOISE_CURVE_SIZE);
|
||||||
|
|
||||||
|
baroCorrection = getBaroCorrection(PASS_ENGINE_PARAMETER_SIGNATURE);
|
||||||
|
|
||||||
|
injectionOffset = getInjectionOffset(rpm PASS_ENGINE_PARAMETER_SUFFIX);
|
||||||
|
float engineLoad = getEngineLoadT(PASS_ENGINE_PARAMETER_SIGNATURE);
|
||||||
|
timingAdvance = getAdvance(rpm, engineLoad PASS_ENGINE_PARAMETER_SUFFIX);
|
||||||
|
|
||||||
|
if (engineConfiguration->fuelAlgorithm == LM_SPEED_DENSITY) {
|
||||||
|
float tps = getTPS(PASS_ENGINE_PARAMETER_SIGNATURE);
|
||||||
|
updateTChargeK(rpm, tps PASS_ENGINE_PARAMETER_SUFFIX);
|
||||||
|
float map = getMap();
|
||||||
|
|
||||||
|
/**
|
||||||
|
* *0.01 because of https://sourceforge.net/p/rusefi/tickets/153/
|
||||||
|
*/
|
||||||
|
float rawVe = veMap.getValue(rpm, map);
|
||||||
|
// get VE from the separate table for Idle
|
||||||
|
if (CONFIG(useSeparateVeForIdle)) {
|
||||||
|
float idleVe = interpolate2d("idleVe", rpm, config->idleVeBins, config->idleVe, IDLE_VE_CURVE_SIZE);
|
||||||
|
// interpolate between idle table and normal (running) table using TPS threshold
|
||||||
|
rawVe = interpolateClamped(0.0f, idleVe, boardConfiguration->idlePidDeactivationTpsThreshold, rawVe, tps);
|
||||||
|
}
|
||||||
|
currentVE = baroCorrection * rawVe * 0.01;
|
||||||
|
targetAFR = afrMap.getValue(rpm, map);
|
||||||
|
} else {
|
||||||
|
baseTableFuel = getBaseTableFuel(rpm, engineLoad);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void EngineState::updateTChargeK(int rpm, float tps DECLARE_ENGINE_PARAMETER_SUFFIX) {
|
||||||
|
float coolantC = ENGINE(sensors.clt);
|
||||||
|
float intakeC = ENGINE(sensors.iat);
|
||||||
|
float newTCharge = getTCharge(rpm, tps, coolantC, intakeC PASS_ENGINE_PARAMETER_SUFFIX);
|
||||||
|
// convert to microsecs and then to seconds
|
||||||
|
efitick_t curTime = getTimeNowNt();
|
||||||
|
float secsPassed = (float)NT2US(curTime - timeSinceLastTChargeK) / 1000000.0f;
|
||||||
|
if (!cisnan(newTCharge)) {
|
||||||
|
// control the rate of change or just fill with the initial value
|
||||||
|
tCharge = (tChargeK == 0) ? newTCharge : limitRateOfChange(newTCharge, tCharge, CONFIG(tChargeAirIncrLimit), CONFIG(tChargeAirDecrLimit), secsPassed);
|
||||||
|
tChargeK = convertCelsiusToKelvin(tCharge);
|
||||||
|
timeSinceLastTChargeK = curTime;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
SensorsState::SensorsState() {
|
||||||
|
reset();
|
||||||
|
}
|
||||||
|
|
||||||
|
int MockAdcState::getMockAdcValue(int hwChannel) {
|
||||||
|
return fakeAdcValues[hwChannel];
|
||||||
|
}
|
||||||
|
|
||||||
|
Accelerometer::Accelerometer() {
|
||||||
|
x = y = z = 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
void SensorsState::reset() {
|
||||||
|
fuelTankGauge = vBatt = 0;
|
||||||
|
iat = clt = NAN;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
StartupFuelPumping::StartupFuelPumping() {
|
||||||
|
isTpsAbove50 = false;
|
||||||
|
pumpsCounter = 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
void StartupFuelPumping::setPumpsCounter(int newValue) {
|
||||||
|
if (pumpsCounter != newValue) {
|
||||||
|
pumpsCounter = newValue;
|
||||||
|
|
||||||
|
if (pumpsCounter == PUMPS_TO_PRIME) {
|
||||||
|
scheduleMsg(&engineLogger, "let's squirt prime pulse %.2f", pumpsCounter);
|
||||||
|
pumpsCounter = 0;
|
||||||
|
} else {
|
||||||
|
scheduleMsg(&engineLogger, "setPumpsCounter %d", pumpsCounter);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void StartupFuelPumping::update(DECLARE_ENGINE_PARAMETER_SIGNATURE) {
|
||||||
|
if (engine->rpmCalculator.getRpm(PASS_ENGINE_PARAMETER_SIGNATURE) == 0) {
|
||||||
|
bool isTpsAbove50 = getTPS(PASS_ENGINE_PARAMETER_SIGNATURE) >= 50;
|
||||||
|
|
||||||
|
if (this->isTpsAbove50 != isTpsAbove50) {
|
||||||
|
setPumpsCounter(pumpsCounter + 1);
|
||||||
|
}
|
||||||
|
|
||||||
|
} else {
|
||||||
|
/**
|
||||||
|
* Engine is not stopped - not priming pumping mode
|
||||||
|
*/
|
||||||
|
setPumpsCounter(0);
|
||||||
|
isTpsAbove50 = false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue