diff --git a/firmware/controllers/algo/accel_enrichment.cpp b/firmware/controllers/algo/accel_enrichment.cpp index 8230be5935..6be902f8c7 100644 --- a/firmware/controllers/algo/accel_enrichment.cpp +++ b/firmware/controllers/algo/accel_enrichment.cpp @@ -63,24 +63,34 @@ floatms_t WallFuel::getWallFuel(int injectorIndex) { return wallFuel[injectorIndex]; } -float AccelEnrichmemnt::getMaxDelta(DECLARE_ENGINE_PARAMETER_F) { +int AccelEnrichmemnt::getMaxDeltaIndex(DECLARE_ENGINE_PARAMETER_F) { int len = minI(cb.getSize(), cb.getCount()); if (len < 2) return 0; - float maxValue = cb.elements[0] - cb.elements[len - 1]; -// int resultIndex = 0; + int ci = cb.currentIndex - 1; + float maxValue = cb.get(ci) - cb.get(ci - 1); + int resultIndex = ci; - for (int i = 1; i maxValue) { maxValue = v; -// resultIndex = i; + resultIndex = ci - i; } } + return resultIndex; +} + +float AccelEnrichmemnt::getMaxDelta(DECLARE_ENGINE_PARAMETER_F) { + int index = getMaxDeltaIndex(PASS_ENGINE_PARAMETER_F); + FuelSchedule *fs = engine->engineConfiguration2->injectionEvents; - return maxValue * fs->eventsCount; + return (cb.get(index) - (cb.get(index - 1))) * fs->eventsCount; } // todo: eliminate code duplication between these two methods! Some pointer magic would help. diff --git a/firmware/controllers/algo/accel_enrichment.h b/firmware/controllers/algo/accel_enrichment.h index 34001c8434..47859c44ea 100644 --- a/firmware/controllers/algo/accel_enrichment.h +++ b/firmware/controllers/algo/accel_enrichment.h @@ -27,6 +27,7 @@ public: * @return Extra fuel squirt duration for TPS acceleration */ floatms_t getTpsEnrichment(DECLARE_ENGINE_PARAMETER_F); + int getMaxDeltaIndex(DECLARE_ENGINE_PARAMETER_F); float getMaxDelta(DECLARE_ENGINE_PARAMETER_F); void onEngineCycle(DECLARE_ENGINE_PARAMETER_F); diff --git a/firmware/rusefi.cpp b/firmware/rusefi.cpp index f467e4d333..0533aac561 100644 --- a/firmware/rusefi.cpp +++ b/firmware/rusefi.cpp @@ -275,5 +275,5 @@ int getRusEfiVersion(void) { return 123; // this is here to make the compiler happy about the unused array if (UNUSED_CCM_SIZE[0] * 0 != 0) return 3211; // this is here to make the compiler happy about the unused array - return 20160303; + return 20160310; } diff --git a/firmware/util/cyclic_buffer.h b/firmware/util/cyclic_buffer.h index fe9ba90563..c22311f3e6 100644 --- a/firmware/util/cyclic_buffer.h +++ b/firmware/util/cyclic_buffer.h @@ -45,10 +45,10 @@ class cyclic_buffer int getCount(); void clear(); volatile T elements[CB_MAX_SIZE]; + volatile int currentIndex; private: void baseC(int size); - volatile int currentIndex; /** * number of elements added into this buffer, would be eventually bigger then size */ diff --git a/unit_tests/test_accel_enrichment.cpp b/unit_tests/test_accel_enrichment.cpp index eee38229f0..4086eab86f 100644 --- a/unit_tests/test_accel_enrichment.cpp +++ b/unit_tests/test_accel_enrichment.cpp @@ -28,16 +28,16 @@ void testAccelEnrichment(void) { engine->tpsAccelEnrichment.onNewValue(0 PASS_ENGINE_PARAMETER); assertEqualsM("maxDelta", 0, engine->tpsAccelEnrichment.getMaxDelta(PASS_ENGINE_PARAMETER_F)); engine->tpsAccelEnrichment.onNewValue(10 PASS_ENGINE_PARAMETER); - assertEqualsM("maxDelta", 40, engine->tpsAccelEnrichment.getMaxDelta(PASS_ENGINE_PARAMETER_F)); + assertEqualsM("maxDelta#1", 40, engine->tpsAccelEnrichment.getMaxDelta(PASS_ENGINE_PARAMETER_F)); engine->tpsAccelEnrichment.onNewValue(30 PASS_ENGINE_PARAMETER); - assertEqualsM("maxDelta", 80, engine->tpsAccelEnrichment.getMaxDelta(PASS_ENGINE_PARAMETER_F)); + assertEqualsM("maxDelta#2", 80, engine->tpsAccelEnrichment.getMaxDelta(PASS_ENGINE_PARAMETER_F)); engine->tpsAccelEnrichment.onNewValue(0 PASS_ENGINE_PARAMETER); - assertEqualsM("maxDelta", 80, engine->tpsAccelEnrichment.getMaxDelta(PASS_ENGINE_PARAMETER_F)); + assertEqualsM("maxDelta#3", 80, engine->tpsAccelEnrichment.getMaxDelta(PASS_ENGINE_PARAMETER_F)); engine->tpsAccelEnrichment.onNewValue(0 PASS_ENGINE_PARAMETER); - assertEqualsM("maxDelta", 80, engine->tpsAccelEnrichment.getMaxDelta(PASS_ENGINE_PARAMETER_F)); + assertEqualsM("maxDelta#4", 80, engine->tpsAccelEnrichment.getMaxDelta(PASS_ENGINE_PARAMETER_F)); engine->tpsAccelEnrichment.onNewValue(0 PASS_ENGINE_PARAMETER); - assertEqualsM("maxDelta", 120, engine->tpsAccelEnrichment.getMaxDelta(PASS_ENGINE_PARAMETER_F)); + assertEqualsM("maxDelta#5", 0, engine->tpsAccelEnrichment.getMaxDelta(PASS_ENGINE_PARAMETER_F)); engine->tpsAccelEnrichment.onNewValue(0 PASS_ENGINE_PARAMETER); assertEqualsM("maxDelta", 0, engine->tpsAccelEnrichment.getMaxDelta(PASS_ENGINE_PARAMETER_F)); }