rusefi-full/firmware/controllers/algo/accel_enrichment.cpp

184 lines
5.1 KiB
C++

/**
* @file accel_enrichment.cpp
* @brief Acceleration enrichment calculator
*
* @date Apr 21, 2014
* @author Dmitry Sidin
* @author Andrey Belomutskiy, (c) 2012-2015
*/
#include "main.h"
#include "trigger_central.h"
#include "accel_enrichment.h"
#include "engine_state.h"
#include "engine_math.h"
#include "signal_executor.h"
EXTERN_ENGINE
;
//#if EFI_PROD_CODE
//static THD_WORKING_AREA(aeThreadStack, UTILITY_THREAD_STACK_SIZE);
//#endif
static Logging *logger;
void AccelEnrichmemnt::updateDiffEnrichment(engine_configuration_s *engineConfiguration, float engineLoad) {
// for (int i = 3; i == 1; i--)
// array[i] = array[i - 1];
//
// array[0] = engineLoad;
//
// diffEnrichment = ((3 * (array[0] - array[1]) + (array[2] - array[3])) / 4)
// * (engineConfiguration->diffLoadEnrichmentCoef);
}
//float AccelEnrichmemnt::getDiffEnrichment() {
// return diffEnrichment;
//}
floatms_t AccelEnrichmemnt::getTpsEnrichment(DECLARE_ENGINE_PARAMETER_F) {
float d = cb.maxValue(cb.getSize());
if (d > engineConfiguration->tpsAccelEnrichmentThreshold) {
return d * engineConfiguration->tpsAccelEnrichmentMultiplier;
}
return 0;
}
float AccelEnrichmemnt::getMapEnrichment(DECLARE_ENGINE_PARAMETER_F) {
float d = cb.maxValue(cb.getSize());
if (d > engineConfiguration->mapAccelEnrichmentThreshold) {
return d * engineConfiguration->mapAccelEnrichmentMultiplier;
}
// if (d < engineConfiguration->deaccelEnrichmentThreshold) {
// return d * engineConfiguration->deaccelEnrichmentMultiplier;
// }
return 0;
}
void AccelEnrichmemnt::reset() {
delta = 0;
currentValue = NAN;
}
void AccelEnrichmemnt::onNewValue(float currentValue DECLARE_ENGINE_PARAMETER_S) {
if (!cisnan(this->currentValue)) {
delta = currentValue - this->currentValue;
FuelSchedule *fs = &engine->engineConfiguration2->injectionEvents;
cb.add(delta * fs->eventsCount);
}
this->currentValue = currentValue;
}
void AccelEnrichmemnt::onEngineCycleTps(DECLARE_ENGINE_PARAMETER_F) {
onNewValue(getTPS(PASS_ENGINE_PARAMETER_F) PASS_ENGINE_PARAMETER);
}
void AccelEnrichmemnt::onEngineCycle(DECLARE_ENGINE_PARAMETER_F) {
onNewValue(getEngineLoadT(PASS_ENGINE_PARAMETER_F) PASS_ENGINE_PARAMETER);
}
AccelEnrichmemnt::AccelEnrichmemnt() {
reset();
cb.setSize(4);
}
//#if EFI_PROD_CODE
//
//static msg_t DiffEnrichmentThread(int param) {
// chRegSetThreadName("Diff Enrichment");
// while (TRUE) {
// instance.updateDiffEnrichment(engineConfiguration, getEngineLoadT(PASS_ENGINE_PARAMETER));
// chThdSleepMilliseconds(100);
// }
//#if defined __GNUC__
// return -1;
//#endif
//}
//void initDiffEnrichment(void) {
// chThdCreateStatic(aeThreadStack, sizeof(aeThreadStack), LOWPRIO, (tfunc_t) DiffEnrichmentThread, NULL);
//}
//#endif
#if ! EFI_UNIT_TEST || defined(__DOXYGEN__)
static void accelInfo() {
// scheduleMsg(logger, "MAP accel length=%d", mapInstance.cb.getSize());
scheduleMsg(logger, "MAP accel th=%f/mult=%f", engineConfiguration->mapAccelEnrichmentThreshold, engineConfiguration->mapAccelEnrichmentMultiplier);
scheduleMsg(logger, "MAP decel th=%f/mult=%f", engineConfiguration->decelEnrichmentThreshold, engineConfiguration->decelEnrichmentMultiplier);
// scheduleMsg(logger, "TPS accel length=%d", tpsInstance.cb.getSize());
scheduleMsg(logger, "TPS accel th=%f/mult=%f", engineConfiguration->tpsAccelEnrichmentThreshold, engineConfiguration->tpsAccelEnrichmentMultiplier);
}
static void setMapAccelThr(float value) {
engineConfiguration->mapAccelEnrichmentThreshold = value;
accelInfo();
}
static void setMapAccelMult(float value) {
engineConfiguration->mapAccelEnrichmentMultiplier = value;
accelInfo();
}
static void setTpsAccelThr(float value) {
engineConfiguration->tpsAccelEnrichmentThreshold = value;
accelInfo();
}
static void setTpsAccelMult(float value) {
engineConfiguration->tpsAccelEnrichmentMultiplier = value;
accelInfo();
}
static void setDecelThr(float value) {
engineConfiguration->decelEnrichmentThreshold = value;
accelInfo();
}
static void setDecelMult(float value) {
engineConfiguration->decelEnrichmentMultiplier = value;
accelInfo();
}
static void setTpsAccelLen(int len) {
if (len < 1) {
scheduleMsg(logger, "Length shoold be positive");
return;
}
engine->tpsAccelEnrichment.cb.setSize(len);
accelInfo();
}
static void setMapAccelLen(int len) {
if (len < 1) {
scheduleMsg(logger, "Length shoold be positive");
return;
}
engine->mapAccelEnrichment.cb.setSize(len);
accelInfo();
}
void initAccelEnrichment(Logging *sharedLogger) {
logger = sharedLogger;
addConsoleActionI("set_tps_accel_len", setTpsAccelLen);
addConsoleActionF("set_tps_accel_threshold", setTpsAccelThr);
addConsoleActionF("set_tps_ccel_multiplier", setTpsAccelMult);
addConsoleActionI("set_map_accel_len", setMapAccelLen);
addConsoleActionF("set_map_accel_threshold", setMapAccelThr);
addConsoleActionF("set_map_ccel_multiplier", setMapAccelMult);
addConsoleActionF("set_decel_threshold", setDecelThr);
addConsoleActionF("set_decel_multiplier", setDecelMult);
addConsoleAction("accelinfo", accelInfo);
setMapAccelLen(engineConfiguration->mapAccelLength);
setTpsAccelLen(engineConfiguration->tpsAccelLength);
}
#endif /* ! EFI_UNIT_TEST */