auto-sync

This commit is contained in:
rusEfi 2014-10-03 16:03:00 -05:00
parent 64a4cbb1a2
commit f7c3f9da20
3 changed files with 65 additions and 6 deletions

View File

@ -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;

View File

@ -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;
};

View File

@ -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)