diff --git a/firmware/controllers/core/logic_expression.cpp b/firmware/controllers/core/logic_expression.cpp index 8bbb459c1a..0ea718cb0f 100644 --- a/firmware/controllers/core/logic_expression.cpp +++ b/firmware/controllers/core/logic_expression.cpp @@ -38,6 +38,9 @@ static LENameOrdinalPair leMoreOrEqual(LE_OPERATOR_MORE_OR_EQUAL, ">="); static LENameOrdinalPair leLess(LE_OPERATOR_LESS, "<"); static LENameOrdinalPair leLessOrEquals(LE_OPERATOR_LESS_OR_EQUAL, "<="); +static LENameOrdinalPair leMax(LE_METHOD_MAX, "max"); +static LENameOrdinalPair leMin(LE_METHOD_MIN, "min"); + #define LE_EVAL_POOL_SIZE 32 #if EFI_PROD_CODE || EFI_SIMULATOR @@ -202,6 +205,19 @@ void LECalculator::doJob(Engine *engine, LEElement *element) { stack.push(v1 >= v2); } break; + case LE_METHOD_MAX: { + float v2 = pop(LE_METHOD_MAX); + float v1 = pop(LE_METHOD_MAX); + stack.push(maxF(v1, v2)); + } + break; + case LE_METHOD_MIN: { + float v2 = pop(LE_METHOD_MIN); + float v1 = pop(LE_METHOD_MIN); + stack.push(minF(v1, v2)); + } + break; + case LE_UNDEFINED: firmwareError("Undefined not expected here"); break; diff --git a/firmware/controllers/core/logic_expression.h b/firmware/controllers/core/logic_expression.h index b8d840c0fb..b185a0373b 100644 --- a/firmware/controllers/core/logic_expression.h +++ b/firmware/controllers/core/logic_expression.h @@ -27,6 +27,8 @@ typedef enum { LE_OPERATOR_SUBSTRACTION = 10, LE_OPERATOR_MULTIPLICATION = 11, LE_OPERATOR_DIVISION = 12, + LE_METHOD_MAX = 13, + LE_METHOD_MIN = 14, LE_METHOD_RPM = 100, LE_METHOD_COOLANT = 101, diff --git a/firmware/controllers/engine_controller.cpp b/firmware/controllers/engine_controller.cpp index 90adcc99b5..4ac610e412 100644 --- a/firmware/controllers/engine_controller.cpp +++ b/firmware/controllers/engine_controller.cpp @@ -470,7 +470,7 @@ void initEngineContoller(Engine *engine) { } } - addConsoleActionSSP("set_user_out", (VoidCharPtrCharPtrVoidPtr) setUserOutput, engine); + addConsoleActionSSP("set_fsio", (VoidCharPtrCharPtrVoidPtr) setUserOutput, engine); addConsoleActionSS("set_float", (VoidCharPtrCharPtr) setFloat); addConsoleActionSS("set_int", (VoidCharPtrCharPtr) setInt); addConsoleActionI("get_float", getFloat); diff --git a/firmware/util/efilib.cpp b/firmware/util/efilib.cpp index af2ebde246..01d2d45c09 100644 --- a/firmware/util/efilib.cpp +++ b/firmware/util/efilib.cpp @@ -42,6 +42,10 @@ float maxF(float i1, float i2) { return i1 > i2 ? i1 : i2; } +float minF(float i1, float i2) { + return i1 < i2 ? i1 : i2; +} + uint32_t efiStrlen(const char *param) { register const char *s; for (s = param; *s; ++s) diff --git a/firmware/util/efilib.h b/firmware/util/efilib.h index 85dcc76ee4..15b3c63348 100644 --- a/firmware/util/efilib.h +++ b/firmware/util/efilib.h @@ -51,6 +51,7 @@ float efiRound(float value, float precision); int maxI(int i1, int i2); int minI(int i1, int i2); float maxF(float i1, float i2); +float minF(float i1, float i2); char* itoa10(char *p, int num); bool isSameF(float v1, float v2); diff --git a/unit_tests/test_logic_expression.cpp b/unit_tests/test_logic_expression.cpp index 123cffc94d..043f21698d 100644 --- a/unit_tests/test_logic_expression.cpp +++ b/unit_tests/test_logic_expression.cpp @@ -168,6 +168,9 @@ void testLogicExpressions(void) { testExpression("fan not coolant 90 > and", 1); + testExpression("10 99 max", 99); + + testExpression("fan NOT coolant 90 > AND fan coolant 85 > AND OR", 1); mockRpm = 900;