From d6f74ca7b46de17537d737fe50c7d24c7a071dc1 Mon Sep 17 00:00:00 2001 From: rusEfi Date: Fri, 3 Oct 2014 17:03:01 -0500 Subject: [PATCH] auto-sync --- firmware/controllers/core/fl_stack.h | 5 ++++ .../controllers/core/logic_expression.cpp | 17 +++++++++++++ firmware/controllers/core/logic_expression.h | 20 ++++++++++++++- unit_tests/test_logic_expression.cpp | 25 +++++++++++++++++++ unit_tests/test_util.cpp | 1 + 5 files changed, 67 insertions(+), 1 deletion(-) diff --git a/firmware/controllers/core/fl_stack.h b/firmware/controllers/core/fl_stack.h index dd7722f80c..dd66e41743 100644 --- a/firmware/controllers/core/fl_stack.h +++ b/firmware/controllers/core/fl_stack.h @@ -16,6 +16,7 @@ public: void push(T value); void reset(); T pop(); + T get(int index); int size(); bool isEmpty(); private: @@ -48,6 +49,10 @@ T FLStack::pop() { return values[--index]; } +template +T FLStack::get(int index) { + return values[index]; +} template int FLStack::size() { diff --git a/firmware/controllers/core/logic_expression.cpp b/firmware/controllers/core/logic_expression.cpp index edd847910e..bd83110e72 100644 --- a/firmware/controllers/core/logic_expression.cpp +++ b/firmware/controllers/core/logic_expression.cpp @@ -28,7 +28,12 @@ void LEElement::init(le_action_e action, float fValue) { } LECalculator::LECalculator() { + reset(); +} + +void LECalculator::reset() { first = NULL; + stack.reset(); } static bool float2bool(float v) { @@ -114,3 +119,15 @@ void LECalculator::add(LEElement *element) { last->next = element; } } + +LEElementPool::LEElementPool() { + reset(); +} + +void LEElementPool::reset() { + index = 0; +} + +LEElement *LEElementPool::next() { + return &pool[index++]; +} diff --git a/firmware/controllers/core/logic_expression.h b/firmware/controllers/core/logic_expression.h index a3e34cd4a9..b26d8c5725 100644 --- a/firmware/controllers/core/logic_expression.h +++ b/firmware/controllers/core/logic_expression.h @@ -21,6 +21,11 @@ typedef enum { LE_OPERATOR_AND, LE_OPERATOR_OR, + LE_METHOD_RPM, + LE_METHOD_COOLANT, + LE_METHOD_FAN, + LE_METHOD_TIME_SINCE_BOOT, + Force_4b_le_action = ENUM_SIZE_HACK, } le_action_e; @@ -38,6 +43,18 @@ public: LEElement *next; }; +#define LE_ELEMENT_POOL_SIZE 64 + +class LEElementPool { +public: + LEElementPool(); + LEElement pool[LE_ELEMENT_POOL_SIZE]; + LEElement *next(); + void reset(); +private: + int index; +}; + #define MAX_STACK_DEPTH 32 @@ -46,10 +63,11 @@ public: LECalculator(); float getValue(); void add(LEElement *element); - LEElement *first; + void reset(); private: void doJob(LEElement *element); + LEElement *first; FLStack stack; }; diff --git a/unit_tests/test_logic_expression.cpp b/unit_tests/test_logic_expression.cpp index fadb55d3b6..87f3348062 100644 --- a/unit_tests/test_logic_expression.cpp +++ b/unit_tests/test_logic_expression.cpp @@ -37,6 +37,31 @@ void testLogicExpressions(void) { * fuel_pump = time_since_boot 4 less rpm 0 more OR */ + c.reset(); + + LEElementPool pool; + LEElement *e = pool.next(); + e->init(LE_METHOD_TIME_SINCE_BOOT); + + e = pool.next(); + e->init(LE_NUMERIC_VALUE, 4); + + e = pool.next(); + e->init(LE_OPERATOR_LESS); + + e = pool.next(); + e->init(LE_METHOD_RPM); + + e = pool.next(); + e->init(LE_NUMERIC_VALUE, 0); + + e = pool.next(); + e->init(LE_OPERATOR_MORE); + + e = pool.next(); + e->init(LE_OPERATOR_OR); + + /** * fan = (not fan && coolant > 90) OR (fan && coolant > 85) * fan = fan NOT coolant 90 AND more fan coolant 85 more AND OR diff --git a/unit_tests/test_util.cpp b/unit_tests/test_util.cpp index 5ce7c8b4a8..102a6a95d2 100644 --- a/unit_tests/test_util.cpp +++ b/unit_tests/test_util.cpp @@ -319,6 +319,7 @@ void testFLStack(void) { int v = stack.pop(); assertEquals(234, v); assertEquals(1, stack.size()); + assertEquals(123, stack.get(0)); v = stack.pop(); assertEquals(123, v);