From 0fe292a6acbacab5190f864ee3a9211a3c97932b Mon Sep 17 00:00:00 2001 From: rusEfi Date: Wed, 30 Nov 2016 19:01:43 -0500 Subject: [PATCH] auto-sync --- firmware/controllers/algo/engine.h | 2 +- firmware/controllers/algo/event_registry.cpp | 2 +- firmware/controllers/algo/event_registry.h | 2 +- firmware/controllers/math/engine_math.cpp | 13 ++++++------- .../controllers/trigger/main_trigger_callback.cpp | 8 ++++---- unit_tests/test_trigger_decoder.cpp | 2 +- 6 files changed, 14 insertions(+), 15 deletions(-) diff --git a/firmware/controllers/algo/engine.h b/firmware/controllers/algo/engine.h index e5a36cb636..20d356724a 100644 --- a/firmware/controllers/algo/engine.h +++ b/firmware/controllers/algo/engine.h @@ -58,7 +58,7 @@ public: int eventsCount; private: void clear(); - void registerInjectionEvent(int injectorIndex, float angle, angle_t injectionDuration, bool isSimultanious DECLARE_ENGINE_PARAMETER_S); + void registerInjectionEvent(InjectorOutputPin *output, InjectorOutputPin *secondOutput, float angle, angle_t injectionDuration, bool isSimultanious DECLARE_ENGINE_PARAMETER_S); }; /** diff --git a/firmware/controllers/algo/event_registry.cpp b/firmware/controllers/algo/event_registry.cpp index 7db0bb94b2..e7ddf0f52c 100644 --- a/firmware/controllers/algo/event_registry.cpp +++ b/firmware/controllers/algo/event_registry.cpp @@ -27,7 +27,7 @@ InjectionEvent::InjectionEvent() { isSimultanious = false; isOverlapping = false; - output = NULL; + memset(outputs, 0, sizeof(outputs)); } event_trigger_position_s::event_trigger_position_s() { diff --git a/firmware/controllers/algo/event_registry.h b/firmware/controllers/algo/event_registry.h index 5000c0a32c..25777972e0 100644 --- a/firmware/controllers/algo/event_registry.h +++ b/firmware/controllers/algo/event_registry.h @@ -37,7 +37,7 @@ public: * It's more efficient to handle all injectors together if that's the case */ bool isSimultanious; - InjectorOutputPin *output; + InjectorOutputPin *outputs[MAX_WIRES_COUNT]; bool isOverlapping; event_trigger_position_s injectionStart; diff --git a/firmware/controllers/math/engine_math.cpp b/firmware/controllers/math/engine_math.cpp index 9e7dc9631e..52591630c7 100644 --- a/firmware/controllers/math/engine_math.cpp +++ b/firmware/controllers/math/engine_math.cpp @@ -93,10 +93,9 @@ void setSingleCoilDwell(engine_configuration_s *engineConfiguration) { #if EFI_ENGINE_CONTROL || defined(__DOXYGEN__) -void FuelSchedule::registerInjectionEvent(int injectorIndex, float angle, angle_t injectionDuration, +void FuelSchedule::registerInjectionEvent(InjectorOutputPin *output, InjectorOutputPin *secondOutput, float angle, angle_t injectionDuration, bool isSimultanious DECLARE_ENGINE_PARAMETER_S) { - InjectorOutputPin *output = &enginePins.injectors[injectorIndex]; if (!isSimultanious && !isPinAssigned(output)) { // todo: extract method for this index math @@ -111,7 +110,7 @@ void FuelSchedule::registerInjectionEvent(int injectorIndex, float angle, angle_ fixAngle(angle); ev->isOverlapping = angle < 720 && (angle + injectionDuration) > 720; - ev->output = output; + ev->outputs[0] = output; ev->isSimultanious = isSimultanious; @@ -168,7 +167,7 @@ void FuelSchedule::addFuelEvents(injection_mode_e mode DECLARE_ENGINE_PARAMETER_ int index = getCylinderId(engineConfiguration->specs.firingOrder, i) - 1; float angle = baseAngle + ENGINE(engineCycle) * i / CONFIG(specs.cylindersCount); - registerInjectionEvent(index, angle, injectionDuration, false PASS_ENGINE_PARAMETER); + registerInjectionEvent(&enginePins.injectors[index], NULL, angle, injectionDuration, false PASS_ENGINE_PARAMETER); } break; case IM_SIMULTANEOUS: @@ -180,7 +179,7 @@ void FuelSchedule::addFuelEvents(injection_mode_e mode DECLARE_ENGINE_PARAMETER_ * We do not need injector pin here because we will control all injectors * simultaneously */ - registerInjectionEvent(0, angle, injectionDuration, true PASS_ENGINE_PARAMETER); + registerInjectionEvent(&enginePins.injectors[0], NULL, angle, injectionDuration, true PASS_ENGINE_PARAMETER); } break; case IM_BATCH: @@ -188,7 +187,7 @@ void FuelSchedule::addFuelEvents(injection_mode_e mode DECLARE_ENGINE_PARAMETER_ int index = i % (engineConfiguration->specs.cylindersCount / 2); float angle = baseAngle + i * ENGINE(engineCycle) / CONFIG(specs.cylindersCount); - registerInjectionEvent(index, angle, injectionDuration, false PASS_ENGINE_PARAMETER); + registerInjectionEvent(&enginePins.injectors[index], NULL, angle, injectionDuration, false PASS_ENGINE_PARAMETER); if (CONFIG(twoWireBatchInjection)) { @@ -196,7 +195,7 @@ void FuelSchedule::addFuelEvents(injection_mode_e mode DECLARE_ENGINE_PARAMETER_ * also fire the 2nd half of the injectors so that we can implement a batch mode on individual wires */ index = index + (CONFIG(specs.cylindersCount) / 2); - registerInjectionEvent(index, angle, injectionDuration, false PASS_ENGINE_PARAMETER); + registerInjectionEvent(&enginePins.injectors[index], NULL, angle, injectionDuration, false PASS_ENGINE_PARAMETER); } } break; diff --git a/firmware/controllers/trigger/main_trigger_callback.cpp b/firmware/controllers/trigger/main_trigger_callback.cpp index 254bda02c8..4fc4c71dde 100644 --- a/firmware/controllers/trigger/main_trigger_callback.cpp +++ b/firmware/controllers/trigger/main_trigger_callback.cpp @@ -237,7 +237,7 @@ static ALWAYS_INLINE void handleFuelInjectionEvent(int injEventIndex, InjectionE * wetting coefficient works the same way for any injection mode, or is something * x2 or /2? */ - const floatms_t injectionDuration = ENGINE(wallFuel).adjust(event->output->injectorIndex, ENGINE(fuelMs) PASS_ENGINE_PARAMETER); + const floatms_t injectionDuration = ENGINE(wallFuel).adjust(event->outputs[0]->injectorIndex, ENGINE(fuelMs) PASS_ENGINE_PARAMETER); #if EFI_PRINTF_FUEL_DETAILS || defined(__DOXYGEN__) printf("fuel fuelMs=%f adjusted=%f\t\n", ENGINE(fuelMs), injectionDuration); #endif /*EFI_PRINTF_FUEL_DETAILS */ @@ -309,14 +309,14 @@ static ALWAYS_INLINE void handleFuelInjectionEvent(int injEventIndex, InjectionE // we are in this branch of code only in case of NOT IM_SIMULTANEOUS injection // we are ignoring low RPM in order not to handle "engine was stopped to engine now running" transition if (rpm > 2 * engineConfiguration->cranking.rpm) { - const char *outputName = event->output->name; + const char *outputName = event->outputs[0]->name; if (prevOutputName == outputName) { warning(CUSTOM_OBD_SKIPPED_FUEL, "looks like skipped fuel event %d %s", getRevolutionCounter(), outputName); } prevOutputName = outputName; } - scheduleFuelInjection(rpm, signal, getTimeNowUs(), injectionStartDelayUs, MS2US(injectionDuration), event->output PASS_ENGINE_PARAMETER); + scheduleFuelInjection(rpm, signal, getTimeNowUs(), injectionStartDelayUs, MS2US(injectionDuration), event->outputs[0] PASS_ENGINE_PARAMETER); } } @@ -360,7 +360,7 @@ static void handleFuelScheduleOverlap(InjectionEventList *injectionEvents DECLAR if (!engine->engineConfiguration2->wasOverlapping[injEventIndex] && event->isOverlapping) { // we are here if new fuel schedule is crossing engine cycle boundary with this event - InjectorOutputPin *output = event->output; + InjectorOutputPin *output = event->outputs[0]; // todo: recalc fuel? account for wetting? floatms_t injectionDuration = ENGINE(fuelMs); diff --git a/unit_tests/test_trigger_decoder.cpp b/unit_tests/test_trigger_decoder.cpp index ce8cdf8ac7..92115b69f7 100644 --- a/unit_tests/test_trigger_decoder.cpp +++ b/unit_tests/test_trigger_decoder.cpp @@ -600,7 +600,7 @@ void assertInjectorDownEvent(const char *msg, int eventIndex, efitime_t momentX, } static void assertInjectionEvent(const char *msg, InjectionEvent *ev, int injectorIndex, int eventIndex, angle_t angleOffset, bool isOverlapping) { - assertEqualsM4(msg, "inj index", injectorIndex, ev->output->injectorIndex); + assertEqualsM4(msg, "inj index", injectorIndex, ev->outputs[0]->injectorIndex); assertEqualsM4(msg, " event index", eventIndex, ev->injectionStart.eventIndex); assertEqualsM4(msg, " event offset", angleOffset, ev->injectionStart.angleOffset); assertTrueM("is overlapping", isOverlapping == ev->isOverlapping);