auto-sync

This commit is contained in:
rusEfi 2016-03-02 22:02:37 -05:00
parent 87111dc687
commit 9b56badbfd
5 changed files with 33 additions and 21 deletions

View File

@ -46,6 +46,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");
static LENameOrdinalPair leSelf(LE_METHOD_SELF, "self");
LENameOrdinalPair::LENameOrdinalPair(le_action_e action, const char *name) {
this->action = action;
@ -126,7 +127,7 @@ void LECalculator::push(le_action_e action, float value) {
/**
* @return true in case of error, false otherwise
*/
bool LECalculator::doJob(Engine *engine, LEElement *element) {
bool LECalculator::processElement(Engine *engine, LEElement *element) {
#if EFI_PROD_CODE || defined(__DOXYGEN__)
efiAssert(getRemainingStack(chThdSelf()) > 64, "FSIO logic", false);
#endif
@ -260,12 +261,12 @@ bool LECalculator::doJob(Engine *engine, LEElement *element) {
return false;
}
float LECalculator::getValue2(LEElement *element, Engine *engine) {
reset(element);
return getValue(engine);
float LECalculator::getValue2(float selfValue, LEElement *fistElementInList, Engine *engine) {
reset(fistElementInList);
return getValue(selfValue, engine);
}
float LECalculator::getValue(Engine *engine) {
float LECalculator::getValue(float selfValue, Engine *engine) {
if (first == NULL) {
warning(OBD_PCM_Processor_Fault, "no FSIO code");
return NAN;
@ -278,10 +279,14 @@ float LECalculator::getValue(Engine *engine) {
while (element != NULL) {
efiAssert(counter < 200, "FSIOcount", NAN); // just in case
bool isError = doJob(engine, element);
if (isError) {
// error already reported
return NAN;
if (element->action == LE_METHOD_SELF) {
push(element->action, selfValue);
} else {
bool isError = processElement(engine, element);
if (isError) {
// error already reported
return NAN;
}
}
element = element->next;
counter++;

View File

@ -30,6 +30,7 @@ typedef enum {
LE_METHOD_MAX = 13,
LE_METHOD_MIN = 14,
LE_METHOD_IF = 15,
LE_METHOD_SELF = 16,
LE_METHOD_RPM = 100,
LE_METHOD_COOLANT = 101,
@ -86,8 +87,8 @@ typedef FLStack<float, MAX_STACK_DEPTH> calc_stack_t;
class LECalculator {
public:
LECalculator();
float getValue(Engine *engine);
float getValue2(LEElement *element, Engine *engine);
float getValue(float selfValue, Engine *engine);
float getValue2(float selfValue, LEElement *fistElementInList, Engine *engine);
void add(LEElement *element);
void reset();
void reset(LEElement *element);
@ -96,7 +97,7 @@ public:
int currentCalculationLogPosition;
private:
void push(le_action_e action, float value);
bool doJob(Engine *engine, LEElement *element);
bool processElement(Engine *engine, LEElement *element);
float pop(le_action_e action);
LEElement *first;
calc_stack_t stack;

View File

@ -220,7 +220,7 @@ static void handleFsio(Engine *engine, int index) {
bool isPwmMode = boardConfiguration->fsioFrequency[index] != NO_PWM;
float fvalue = calc.getValue2(fsioLogics[index], engine);
float fvalue = calc.getValue2(engine->engineConfiguration2->fsioLastValue[index], fsioLogics[index], engine);
engine->engineConfiguration2->fsioLastValue[index] = fvalue;
if (isPwmMode) {
@ -260,7 +260,7 @@ static void setPinState(const char * msg, OutputPin *pin, LEElement *element, En
if (element == NULL) {
warning(OBD_PCM_Processor_Fault, "invalid expression for %s", msg);
} else {
int value = calc.getValue2(element, engine);
int value = calc.getValue2(pin->getLogicValue(), element, engine);
if (pin->isInitialized() && value != pin->getLogicValue()) {
if (isRunningBenchTest()) {
return; // let's not mess with bench testing
@ -417,7 +417,7 @@ static void eval(char *line, Engine *engine) {
if (e == NULL) {
scheduleMsg(logger, "parsing failed");
} else {
float result = evalCalc.getValue2(e, engine);
float result = evalCalc.getValue2(0, e, engine);
scheduleMsg(logger, "Eval result: %f", result);
}
#endif

View File

@ -275,5 +275,5 @@ int getRusEfiVersion(void) {
return 123; // this is here to make the compiler happy about the unused array
if (UNUSED_CCM_SIZE[0] * 0 != 0)
return 3211; // this is here to make the compiler happy about the unused array
return 20160227;
return 20160302;
}

View File

@ -84,14 +84,18 @@ static void testParsing(void) {
assertTrue(element == NULL);
}
static void testExpression(const char *line, float expected) {
static void testExpression2(float selfValue, const char *line, float expected) {
LEElement thepool[TEST_POOL_SIZE];
LEElementPool pool(thepool, TEST_POOL_SIZE);
LEElement * element = pool.parseExpression(line);
print("Parsing [%s]", line);
assertTrueM("Not NULL expected", element != NULL);
LECalculator c;
assertEqualsM(line, expected, c.getValue2(element, NULL));
assertEqualsM(line, expected, c.getValue2(selfValue, element, NULL));
}
static void testExpression(const char *line, float expected) {
testExpression2(0, line, expected);
}
void testLogicExpressions(void) {
@ -105,7 +109,7 @@ void testLogicExpressions(void) {
value1.init(LE_NUMERIC_VALUE, 123.0);
c.add(&value1);
assertEqualsM("123", 123.0, c.getValue(NULL));
assertEqualsM("123", 123.0, c.getValue(0, NULL));
LEElement value2;
value2.init(LE_NUMERIC_VALUE, 321.0);
@ -114,7 +118,7 @@ void testLogicExpressions(void) {
LEElement value3;
value3.init(LE_OPERATOR_AND);
c.add(&value3);
assertEqualsM("123 and 321", 1.0, c.getValue(NULL));
assertEqualsM("123 and 321", 1.0, c.getValue(0, NULL));
/**
* fuel_pump = (time_since_boot < 4 seconds) OR (rpm > 0)
@ -170,6 +174,8 @@ void testLogicExpressions(void) {
testExpression("100 200 1 if", 200);
testExpression("10 99 max", 99);
testExpression2(123, "10 self max", 123);
testExpression("fan NOT coolant 90 > AND fan coolant 85 > AND OR", 1);
{
LEElement thepool[TEST_POOL_SIZE];
@ -177,7 +183,7 @@ void testLogicExpressions(void) {
LEElement * element = pool.parseExpression("fan NOT coolant 90 > AND fan coolant 85 > AND OR");
assertTrueM("Not NULL expected", element != NULL);
LECalculator c;
assertEqualsM("that expression", 1, c.getValue2(element, NULL));
assertEqualsM("that expression", 1, c.getValue2(0, element, NULL));
assertEquals(12, c.currentCalculationLogPosition);
assertEquals(102, c.calcLogAction[0]);