From 8e5e6b9e3f9122419317f2a0d38a812abc42f211 Mon Sep 17 00:00:00 2001 From: rusEfi Date: Thu, 10 Mar 2016 00:04:40 -0500 Subject: [PATCH] auto-sync --- .../controllers/algo/accel_enrichment.cpp | 37 +++++++++++-------- firmware/controllers/algo/accel_enrichment.h | 2 +- firmware/util/cyclic_buffer.h | 11 +++--- unit_tests/test_accel_enrichment.cpp | 6 ++- unit_tests/test_util.cpp | 2 +- 5 files changed, 33 insertions(+), 25 deletions(-) diff --git a/firmware/controllers/algo/accel_enrichment.cpp b/firmware/controllers/algo/accel_enrichment.cpp index 648397a366..fb6eb40a24 100644 --- a/firmware/controllers/algo/accel_enrichment.cpp +++ b/firmware/controllers/algo/accel_enrichment.cpp @@ -63,15 +63,29 @@ floatms_t WallFuel::getWallFuel(int injectorIndex) { return wallFuel[injectorIndex]; } -float AccelEnrichmemnt::getMaxDelta() { - if (cb.getCount() == 0) - return 0; // no recent data - return cb.maxValue(cb.getSize()); +float AccelEnrichmemnt::getMaxDelta(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; + + for (int i = 1; i maxValue) { + maxValue = v; + resultIndex = i; + } + } + + FuelSchedule *fs = engine->engineConfiguration2->injectionEvents; + return maxValue * fs->eventsCount; } // todo: eliminate code duplication between these two methods! Some pointer magic would help. floatms_t AccelEnrichmemnt::getTpsEnrichment(DECLARE_ENGINE_PARAMETER_F) { - float d = getMaxDelta(); + float d = getMaxDelta(PASS_ENGINE_PARAMETER_F); if (d > engineConfiguration->tpsAccelEnrichmentThreshold) { return d * engineConfiguration->tpsAccelEnrichmentMultiplier; } @@ -82,7 +96,7 @@ floatms_t AccelEnrichmemnt::getTpsEnrichment(DECLARE_ENGINE_PARAMETER_F) { } float AccelEnrichmemnt::getEngineLoadEnrichment(DECLARE_ENGINE_PARAMETER_F) { - float d = getMaxDelta(); + float d = getMaxDelta(PASS_ENGINE_PARAMETER_F); if (d > engineConfiguration->engineLoadAccelEnrichmentThreshold) { return d * engineConfiguration->engineLoadAccelEnrichmentMultiplier; } @@ -102,16 +116,7 @@ void AccelEnrichmemnt::setLength(int length) { } void AccelEnrichmemnt::onNewValue(float currentValue DECLARE_ENGINE_PARAMETER_S) { - if (!cisnan(previousValue)) { - /** - * this could be negative, zero or positive - */ - float delta = currentValue - previousValue; - FuelSchedule *fs = engine->engineConfiguration2->injectionEvents; - cb.add(delta * fs->eventsCount); - } - - previousValue = currentValue; + cb.add(currentValue); } void AccelEnrichmemnt::onEngineCycleTps(DECLARE_ENGINE_PARAMETER_F) { diff --git a/firmware/controllers/algo/accel_enrichment.h b/firmware/controllers/algo/accel_enrichment.h index fdc449d8a9..34001c8434 100644 --- a/firmware/controllers/algo/accel_enrichment.h +++ b/firmware/controllers/algo/accel_enrichment.h @@ -27,7 +27,7 @@ public: * @return Extra fuel squirt duration for TPS acceleration */ floatms_t getTpsEnrichment(DECLARE_ENGINE_PARAMETER_F); - float getMaxDelta(); + float getMaxDelta(DECLARE_ENGINE_PARAMETER_F); void onEngineCycle(DECLARE_ENGINE_PARAMETER_F); void onEngineCycleTps(DECLARE_ENGINE_PARAMETER_F); diff --git a/firmware/util/cyclic_buffer.h b/firmware/util/cyclic_buffer.h index 5073805c3a..fe9ba90563 100644 --- a/firmware/util/cyclic_buffer.h +++ b/firmware/util/cyclic_buffer.h @@ -44,10 +44,10 @@ class cyclic_buffer int getSize(); int getCount(); void clear(); + volatile T elements[CB_MAX_SIZE]; private: void baseC(int size); - volatile T elements[CB_MAX_SIZE]; volatile int currentIndex; /** * number of elements added into this buffer, would be eventually bigger then size @@ -101,11 +101,12 @@ cyclic_buffer::~cyclic_buffer() { template void cyclic_buffer::add(T value) { + elements[currentIndex] = value; + ++currentIndex; if (currentIndex == size) { currentIndex = 0; } - elements[currentIndex] = value; ++count; } @@ -146,7 +147,7 @@ T cyclic_buffer::maxValue(int length) { int ci = currentIndex; // local copy to increase thread-safety T result = -BUFFER_MAX_VALUE; // todo: better min value? for (int i = 0; i < length; ++i) { - int index = ci - i; + int index = ci - i - 1; while (index < 0) { index += size; } @@ -166,7 +167,7 @@ T cyclic_buffer::minValue(int length) { int ci = currentIndex; // local copy to increase thread-safety T result = +BUFFER_MAX_VALUE; // todo: better max value? for (int i = 0; i < length; ++i) { - int index = ci - i; + int index = ci - i - 1; while (index < 0) { index += size; } @@ -188,7 +189,7 @@ T cyclic_buffer::sum(int length) { T result = 0; for (int i = 0; i < length; ++i) { - int index = ci - i; + int index = ci - i - 1; while (index < 0) { index += size; } diff --git a/unit_tests/test_accel_enrichment.cpp b/unit_tests/test_accel_enrichment.cpp index a6a108e820..1203117367 100644 --- a/unit_tests/test_accel_enrichment.cpp +++ b/unit_tests/test_accel_enrichment.cpp @@ -26,13 +26,15 @@ void testAccelEnrichment(void) { engine->tpsAccelEnrichment.setLength(4); 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)); engine->tpsAccelEnrichment.onNewValue(30 PASS_ENGINE_PARAMETER); - assertEqualsM("maxDelta", 80, engine->tpsAccelEnrichment.getMaxDelta()); + assertEqualsM("maxDelta", 80, engine->tpsAccelEnrichment.getMaxDelta(PASS_ENGINE_PARAMETER_F)); engine->tpsAccelEnrichment.onNewValue(0 PASS_ENGINE_PARAMETER); engine->tpsAccelEnrichment.onNewValue(0 PASS_ENGINE_PARAMETER); engine->tpsAccelEnrichment.onNewValue(0 PASS_ENGINE_PARAMETER); engine->tpsAccelEnrichment.onNewValue(0 PASS_ENGINE_PARAMETER); - assertEqualsM("maxDelta", 0, engine->tpsAccelEnrichment.getMaxDelta()); + assertEqualsM("maxDelta", 0, engine->tpsAccelEnrichment.getMaxDelta(PASS_ENGINE_PARAMETER_F)); } diff --git a/unit_tests/test_util.cpp b/unit_tests/test_util.cpp index 3a087998d1..80bf128736 100644 --- a/unit_tests/test_util.cpp +++ b/unit_tests/test_util.cpp @@ -82,7 +82,7 @@ void testCyclicBuffer(void) { assertEquals(4, sb.maxValue(3)); assertEquals(4, sb.maxValue(113)); - assertEquals(2, sb.minValue(3)); + assertEqualsM("minValue(3)", 2, sb.minValue(3)); assertEquals(1, sb.minValue(113)); }