From 9176d0be3ed428d88b499991ff1608e5203aeece Mon Sep 17 00:00:00 2001 From: rusEfi Date: Tue, 28 Apr 2015 21:11:49 -0400 Subject: [PATCH] auto-sync --- firmware/controllers/algo/engine.h | 3 ++ firmware/controllers/engine_controller.cpp | 40 ++++++++++++++++------ firmware/controllers/engine_controller.h | 4 +-- firmware/rusefi.cpp | 2 +- 4 files changed, 35 insertions(+), 14 deletions(-) diff --git a/firmware/controllers/algo/engine.h b/firmware/controllers/algo/engine.h index af748b9e5f..034446e334 100644 --- a/firmware/controllers/algo/engine.h +++ b/firmware/controllers/algo/engine.h @@ -83,6 +83,9 @@ public: */ float iat; float clt; + + angle_t mapAveragingStart; + angle_t mapAveragingDuration; }; class RpmCalculator; diff --git a/firmware/controllers/engine_controller.cpp b/firmware/controllers/engine_controller.cpp index ea163c364b..57956ff65e 100644 --- a/firmware/controllers/engine_controller.cpp +++ b/firmware/controllers/engine_controller.cpp @@ -81,7 +81,8 @@ board_configuration_s *boardConfiguration = &persistentState.persistentConfigura * CH_FREQUENCY is the number of system ticks in a second */ -static VirtualTimer periodicTimer; +static VirtualTimer periodicSlowTimer; +static VirtualTimer periodicFastTimer; static LoggingWithStorage logger("Engine Controller"); @@ -203,18 +204,34 @@ static void cylinderCleanupControl(Engine *engine) { static LocalVersionHolder versionForConfigurationListeners; -static void periodicCallback(Engine *engine); +static void periodicSlowCallback(Engine *engine); -static void scheduleNextInvocation(void) { +static void scheduleNextSlowInvocation(void) { // schedule next invocation int period = boardConfiguration->generalPeriodicThreadPeriod; if (period == 0) period = 50; // this might happen while resetting config - chVTSetAny(&periodicTimer, period * TICKS_IN_MS, (vtfunc_t) &periodicCallback, engine); - + chVTSetAny(&periodicSlowTimer, period * TICKS_IN_MS, (vtfunc_t) &periodicSlowCallback, engine); } -static void periodicCallback(Engine *engine) { +static void periodicFastCallback(DECLARE_ENGINE_PARAMETER_F) { + int rpm = engine->rpmCalculator.rpmValue; + + if (isValidRpm(rpm)) { + MAP_sensor_config_s * c = &engineConfiguration->map; + + + engine->engineState.mapAveragingStart = interpolate2d(rpm, c->samplingAngleBins, c->samplingAngle, MAP_ANGLE_SIZE); + engine->engineState.mapAveragingDuration = interpolate2d(rpm, c->samplingWindowBins, c->samplingWindow, MAP_WINDOW_SIZE); + } else { + engine->engineState.mapAveragingStart = NAN; + engine->engineState.mapAveragingDuration = NAN; + } + + chVTSetAny(&periodicFastTimer, 20 * TICKS_IN_MS, (vtfunc_t) &periodicFastCallback, engine); +} + +static void periodicSlowCallback(Engine *engine) { efiAssertVoid(getRemainingStack(chThdSelf()) > 64, "lowStckOnEv"); #if EFI_PROD_CODE /** @@ -253,11 +270,12 @@ static void periodicCallback(Engine *engine) { cylinderCleanupControl(engine); - scheduleNextInvocation(); + scheduleNextSlowInvocation(); } -void initPeriodicEvents(Engine *engine) { - scheduleNextInvocation(); +void initPeriodicEvents(DECLARE_ENGINE_PARAMETER_F) { + scheduleNextSlowInvocation(); + periodicFastCallback(PASS_ENGINE_PARAMETER_F); } char * getPinNameByAdcChannel(adc_channel_e hwChannel, char *buffer) { @@ -457,7 +475,7 @@ static void getKnockInfo(void) { scheduleMsg(&logger, "knock now=%s/ever=%s", boolToString(engine->knockNow), boolToString(engine->knockEver)); } -void initEngineContoller(Logging *sharedLogger, Engine *engine) { +void initEngineContoller(Logging *sharedLogger DECLARE_ENGINE_PARAMETER_S) { if (hasFirmwareError()) { return; } @@ -496,7 +514,7 @@ void initEngineContoller(Logging *sharedLogger, Engine *engine) { #endif // multiple issues with this initMapAdjusterThread(); - initPeriodicEvents(engine); + initPeriodicEvents(PASS_ENGINE_PARAMETER_F); chThdCreateStatic(csThreadStack, sizeof(csThreadStack), LOWPRIO, (tfunc_t) csThread, NULL); diff --git a/firmware/controllers/engine_controller.h b/firmware/controllers/engine_controller.h index ab5307845b..3935be8908 100644 --- a/firmware/controllers/engine_controller.h +++ b/firmware/controllers/engine_controller.h @@ -16,7 +16,7 @@ char * getPinNameByAdcChannel(adc_channel_e hwChannel, char *buffer); void initConfigActions(void); -void initPeriodicEvents(Engine *engine); -void initEngineContoller(Logging *sharedLogger, Engine *engine); +void initPeriodicEvents(DECLARE_ENGINE_PARAMETER_F); +void initEngineContoller(Logging *sharedLogger DECLARE_ENGINE_PARAMETER_S); #endif /* ENGINE_STATUS_H_ */ diff --git a/firmware/rusefi.cpp b/firmware/rusefi.cpp index b994ed2770..350b2c415d 100644 --- a/firmware/rusefi.cpp +++ b/firmware/rusefi.cpp @@ -215,7 +215,7 @@ void runRusEfi(void) { * Now let's initialize actual engine control logic * todo: should we initialize some? most? controllers before hardware? */ - initEngineContoller(&sharedLogger, engine); + initEngineContoller(&sharedLogger PASS_ENGINE_PARAMETER_F); #if EFI_PERF_METRICS || defined(__DOXYGEN__) initTimePerfActions(&sharedLogger);