From f31c58bdf1b19b9010e327908f26536c93a9f306 Mon Sep 17 00:00:00 2001 From: rusEfi Date: Thu, 4 Dec 2014 20:03:12 -0600 Subject: [PATCH] auto-sync --- firmware/controllers/core/logic_expression.cpp | 9 +++++++++ firmware/controllers/core/logic_expression.h | 1 + unit_tests/test_logic_expression.cpp | 3 +-- 3 files changed, 11 insertions(+), 2 deletions(-) diff --git a/firmware/controllers/core/logic_expression.cpp b/firmware/controllers/core/logic_expression.cpp index 0ea718cb0f..7aa13bdf08 100644 --- a/firmware/controllers/core/logic_expression.cpp +++ b/firmware/controllers/core/logic_expression.cpp @@ -40,6 +40,7 @@ static LENameOrdinalPair leLessOrEquals(LE_OPERATOR_LESS_OR_EQUAL, "<="); static LENameOrdinalPair leMax(LE_METHOD_MAX, "max"); static LENameOrdinalPair leMin(LE_METHOD_MIN, "min"); +static LENameOrdinalPair leIf(LE_METHOD_IF, "if"); #define LE_EVAL_POOL_SIZE 32 @@ -205,6 +206,14 @@ void LECalculator::doJob(Engine *engine, LEElement *element) { stack.push(v1 >= v2); } break; + case LE_METHOD_IF: { + // elements on stack are in reverse order + float vFalse = pop(LE_METHOD_IF); + float vTrue = pop(LE_METHOD_IF); + float vCond = pop(LE_METHOD_IF); + stack.push(vCond != 0 ? vTrue : vFalse); + } + break; case LE_METHOD_MAX: { float v2 = pop(LE_METHOD_MAX); float v1 = pop(LE_METHOD_MAX); diff --git a/firmware/controllers/core/logic_expression.h b/firmware/controllers/core/logic_expression.h index b185a0373b..3c5022fedc 100644 --- a/firmware/controllers/core/logic_expression.h +++ b/firmware/controllers/core/logic_expression.h @@ -29,6 +29,7 @@ typedef enum { LE_OPERATOR_DIVISION = 12, LE_METHOD_MAX = 13, LE_METHOD_MIN = 14, + LE_METHOD_IF = 15, LE_METHOD_RPM = 100, LE_METHOD_COOLANT = 101, diff --git a/unit_tests/test_logic_expression.cpp b/unit_tests/test_logic_expression.cpp index 043f21698d..814c84f443 100644 --- a/unit_tests/test_logic_expression.cpp +++ b/unit_tests/test_logic_expression.cpp @@ -167,10 +167,9 @@ void testLogicExpressions(void) { testExpression("coolant 90 >", 1); testExpression("fan not coolant 90 > and", 1); - + testExpression("100 200 1 if", 200); testExpression("10 99 max", 99); - testExpression("fan NOT coolant 90 > AND fan coolant 85 > AND OR", 1); mockRpm = 900;