auto-sync
This commit is contained in:
parent
64a4cbb1a2
commit
f7c3f9da20
|
@ -31,23 +31,78 @@ LECalculator::LECalculator() {
|
|||
first = NULL;
|
||||
}
|
||||
|
||||
static bool float2bool(float v) {
|
||||
return v != 0;
|
||||
}
|
||||
|
||||
void LECalculator::doJob(LEElement *element) {
|
||||
switch (element->action) {
|
||||
|
||||
case LE_NUMERIC_VALUE:
|
||||
stack.push(element->fValue);
|
||||
break;
|
||||
case LE_OPERATOR_AND: {
|
||||
float v1 = stack.pop();
|
||||
float v2 = stack.pop();
|
||||
|
||||
stack.push(float2bool(v1) && float2bool(v2));
|
||||
}
|
||||
break;
|
||||
case LE_OPERATOR_OR: {
|
||||
float v1 = stack.pop();
|
||||
float v2 = stack.pop();
|
||||
|
||||
stack.push(float2bool(v1) || float2bool(v2));
|
||||
}
|
||||
break;
|
||||
case LE_OPERATOR_LESS: {
|
||||
float v1 = stack.pop();
|
||||
float v2 = stack.pop();
|
||||
|
||||
stack.push(v1 < v2);
|
||||
}
|
||||
break;
|
||||
case LE_OPERATOR_MORE: {
|
||||
float v1 = stack.pop();
|
||||
float v2 = stack.pop();
|
||||
|
||||
stack.push(v1 > v2);
|
||||
}
|
||||
break;
|
||||
case LE_OPERATOR_LESS_OR_EQUAL: {
|
||||
float v1 = stack.pop();
|
||||
float v2 = stack.pop();
|
||||
|
||||
stack.push(v1 <= v2);
|
||||
}
|
||||
break;
|
||||
case LE_OPERATOR_MORE_OR_EQUAL: {
|
||||
float v1 = stack.pop();
|
||||
float v2 = stack.pop();
|
||||
|
||||
stack.push(v1 >= v2);
|
||||
}
|
||||
break;
|
||||
default:
|
||||
firmwareError("Not implemented: %d", element->action);
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
float LECalculator::getValue() {
|
||||
LEElement *element = first;
|
||||
|
||||
stack.reset();
|
||||
|
||||
while(element != NULL) {
|
||||
|
||||
stack.push(element->fValue);
|
||||
|
||||
|
||||
while (element != NULL) {
|
||||
doJob(element);
|
||||
element = element->next;
|
||||
}
|
||||
|
||||
return stack.pop();
|
||||
}
|
||||
|
||||
|
||||
void LECalculator::add(LEElement *element) {
|
||||
if (first == NULL) {
|
||||
first = element;
|
||||
|
|
|
@ -16,6 +16,8 @@ typedef enum {
|
|||
LE_NUMERIC_VALUE,
|
||||
LE_OPERATOR_LESS,
|
||||
LE_OPERATOR_MORE,
|
||||
LE_OPERATOR_LESS_OR_EQUAL,
|
||||
LE_OPERATOR_MORE_OR_EQUAL,
|
||||
LE_OPERATOR_AND,
|
||||
LE_OPERATOR_OR,
|
||||
|
||||
|
@ -47,6 +49,7 @@ public:
|
|||
LEElement *first;
|
||||
|
||||
private:
|
||||
void doJob(LEElement *element);
|
||||
FLStack<float, MAX_STACK_DEPTH> stack;
|
||||
};
|
||||
|
||||
|
|
|
@ -30,6 +30,7 @@ void testLogicExpressions(void) {
|
|||
LEElement value3;
|
||||
value3.init(LE_OPERATOR_AND);
|
||||
c.add(&value3);
|
||||
assertEqualsM("123 and 321", 1.0, c.getValue());
|
||||
|
||||
/**
|
||||
* fuel_pump = (time_since_boot < 4 seconds) OR (rpm > 0)
|
||||
|
|
Loading…
Reference in New Issue