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