From fa6f230ab96e0916a6a012f80ccbc8c4aa2dadef Mon Sep 17 00:00:00 2001 From: rusEfi Date: Thu, 12 Feb 2015 15:04:27 -0600 Subject: [PATCH] auto-sync --- firmware/controllers/algo/engine.h | 8 ++++++++ firmware/controllers/algo/signal_executor.cpp | 14 +++++++------- firmware/controllers/algo/signal_executor.h | 2 +- .../trigger/main_trigger_callback.cpp | 17 +++++++++-------- 4 files changed, 25 insertions(+), 16 deletions(-) diff --git a/firmware/controllers/algo/engine.h b/firmware/controllers/algo/engine.h index 977e34bd13..320f2084e7 100644 --- a/firmware/controllers/algo/engine.h +++ b/firmware/controllers/algo/engine.h @@ -106,6 +106,9 @@ typedef struct { uint32_t beforeAdvance; uint32_t advanceTime; + + uint32_t beforeFuelCalc; + uint32_t fuelCalcTime; } monitoring_timestamps_s; class Engine { @@ -124,6 +127,11 @@ public: Thermistor iat; Thermistor clt; + /** + * Fuel injection duration for current engine cycle + */ + float fuelMs; + /** * ignition dwell duration as crankshaft angle */ diff --git a/firmware/controllers/algo/signal_executor.cpp b/firmware/controllers/algo/signal_executor.cpp index 383e2ab3c5..66cbdf2774 100644 --- a/firmware/controllers/algo/signal_executor.cpp +++ b/firmware/controllers/algo/signal_executor.cpp @@ -118,14 +118,14 @@ int getRevolutionCounter(void); * @param dwell the number of ticks of output duration * */ -void scheduleOutput(OutputSignal *signal, efitimeus_t nowUs, float delayMs, float durationMs) { +void scheduleOutput(OutputSignal *signal, efitimeus_t nowUs, float delayUs, float durationUs) { #if EFI_GPIO - if (durationMs < 0) { - firmwareError("duration cannot be negative: %d", durationMs); + if (durationUs < 0) { + firmwareError("duration cannot be negative: %d", durationUs); return; } - if (cisnan(durationMs)) { - firmwareError("NaN in scheduleOutput", durationMs); + if (cisnan(durationUs)) { + firmwareError("NaN in scheduleOutput", durationUs); return; } @@ -134,7 +134,7 @@ void scheduleOutput(OutputSignal *signal, efitimeus_t nowUs, float delayMs, floa scheduling_s * sUp = &signal->signalTimerUp[index]; scheduling_s * sDown = &signal->signalTimerDown[index]; - scheduleByTime("out up", sUp, nowUs + (int) MS2US(delayMs), (schfunc_t) &turnPinHigh, signal->output); - scheduleByTime("out down", sDown, nowUs + (int) MS2US(delayMs + durationMs), (schfunc_t) &turnPinLow, signal->output); + scheduleByTime("out up", sUp, nowUs + (int) delayUs, (schfunc_t) &turnPinHigh, signal->output); + scheduleByTime("out down", sDown, nowUs + (int) (delayUs + durationUs), (schfunc_t) &turnPinLow, signal->output); #endif } diff --git a/firmware/controllers/algo/signal_executor.h b/firmware/controllers/algo/signal_executor.h index 36eb7ce89c..a7a6cb854b 100644 --- a/firmware/controllers/algo/signal_executor.h +++ b/firmware/controllers/algo/signal_executor.h @@ -39,7 +39,7 @@ struct OutputSignal_struct { scheduling_s signalTimerDown[2]; }; -void scheduleOutput(OutputSignal *signal, efitimeus_t nowUs, float delayMs, float durationMs); +void scheduleOutput(OutputSignal *signal, efitimeus_t nowUs, float delayUs, float durationUs); void initSignalExecutor(void); void scheduleByAngle(int rpm, scheduling_s *timer, angle_t angle, schfunc_t callback, void *param); diff --git a/firmware/controllers/trigger/main_trigger_callback.cpp b/firmware/controllers/trigger/main_trigger_callback.cpp index 363ec6c28e..e7fbf51fac 100644 --- a/firmware/controllers/trigger/main_trigger_callback.cpp +++ b/firmware/controllers/trigger/main_trigger_callback.cpp @@ -100,10 +100,7 @@ static void endSimultaniousInjection(Engine *engine) { } static ALWAYS_INLINE void handleFuelInjectionEvent(InjectionEvent *event, int rpm DECLARE_ENGINE_PARAMETER_S) { - /** - * todo: we do not really need to calculate fuel for each individual cylinder - */ - float fuelMs = getFuelMs(rpm PASS_ENGINE_PARAMETER) * engineConfiguration->globalFuelCorrection; + float fuelMs = ENGINE(fuelMs); if (cisnan(fuelMs)) { warning(OBD_PCM_Processor_Fault, "NaN injection pulse"); return; @@ -116,7 +113,7 @@ static ALWAYS_INLINE void handleFuelInjectionEvent(InjectionEvent *event, int rp if (engine->isCylinderCleanupMode) return; - float delayMs = getOneDegreeTimeMs(rpm) * event->position.angleOffset; + float delayUs = ENGINE(rpmCalculator.oneDegreeUs) * event->position.angleOffset; if (event->isSimultanious) { if (fuelMs < 0) { @@ -138,11 +135,11 @@ static ALWAYS_INLINE void handleFuelInjectionEvent(InjectionEvent *event, int rp scheduling_s * sUp = &signal->signalTimerUp[index]; scheduling_s * sDown = &signal->signalTimerDown[index]; - scheduleTask("out up", sUp, (int) MS2US(delayMs), (schfunc_t) &startSimultaniousInjection, engine); - scheduleTask("out down", sDown, (int) MS2US(delayMs) + MS2US(fuelMs), (schfunc_t) &endSimultaniousInjection, engine); + scheduleTask("out up", sUp, (int) delayUs, (schfunc_t) &startSimultaniousInjection, engine); + scheduleTask("out down", sDown, (int) delayUs + MS2US(fuelMs), (schfunc_t) &endSimultaniousInjection, engine); } else { - scheduleOutput(event->actuator, getTimeNowUs(), delayMs, fuelMs); + scheduleOutput(event->actuator, getTimeNowUs(), delayUs, MS2US(fuelMs)); } } @@ -348,6 +345,10 @@ void mainTriggerCallback(trigger_event_e ckpSignalType, uint32_t eventIndex DECL } if (eventIndex == 0) { + engine->m.beforeFuelCalc = GET_TIMESTAMP(); + ENGINE(fuelMs) = getFuelMs(rpm PASS_ENGINE_PARAMETER) * engineConfiguration->globalFuelCorrection; + engine->m.fuelCalcTime = GET_TIMESTAMP() - engine->m.beforeFuelCalc; + engine->m.beforeIgnitionSch = GET_TIMESTAMP(); /**