Не нашел подходящего раздела. Решил опубликовать здесь. Все таки пишу под ARM.
я хочу выполнять разные задачи в камне. скажем включи вентилятор после 17:00 если температура больше 30* C и выключи его после 22:00 или если температура упала ниже 27* C.
я бы мог записать в терминале.
Код:
|
time ›= 17:00 AND temp › 30 out1 = 1
time ›= 22:00 OR temp ‹ 27 out1 = 0 |
это легко распарсить в структуру и потом проверить .
Код:
|
{
float *variable;
float limit;
uint32_t compare; //0 = '==', 1 = '›', 2 = '‹', 3 = '›=', 4 = '‹=', 5 = '!='
uint32_t logicGate; //0=none, 1=or, 2=and
};
Struct sTaskParam taskParam[4]; |
и потом заполнить (это псевдо код чтоб не усложнять. в реале немного подругому.)
Код:
|
taskParam[0].variable =time;
taskParam[0].compare = “›=”;
taskParam[0].limit =17.00;
taskParam[0].logicGate = and;
taskParam[1].variable =temperature;
taskParam[1].compare = “›=”;
taskParam[1].limit =30;
taskParam[1].logicGate = none;
taskParam[2].variable = time;
taskParam[2].limit = 22.00;
taskParam[2].compare = “›=”;
taskParam[2].logicGate = or;
taskParam[3].variable =temperature;
taskParam[3].limit =27;
taskParam[3].compare = “‹=”;
taskParam[3].logicGate = none; |
и потом для условия time ›= 17:00 AND temp › 30 out1 = 1
Код:
|
uint32_t EvaluateParamCondition(float *val, float val_lim, uint32_t compare)
{
switch (compare)
{
case 0: return (*val == val_lim); break;
case 1: return (*val › val_lim); break;
case 2: return (*val ‹ val_lim); break;
case 3: return (*val ›= val_lim); break;
case 4: return (*val ‹= val_lim); break;
case 5: return (*val != val_lim); break;
default : return BAD_PARAM;
}
}
uint32_t condition[2];
uint32_t global_result;
for (int i = 0; i ‹ 3; i++)
{
condition[i] = EvaluateParamCondition(taskParam[i].variable, taskParam[i].limit, taskParam[i].compare);
}
for (int i = 0; i ‹ 3; i++)
{
if (taskParam[i].logicGate == OR)
global_result |= condition[i];
else if (taskParam[i].logicGate == AND)
global_result &= condition[i];
}
if (global_result)
{
out1 = 1;
} |
ну и похожим образом для второго условия.
но при усложнении логики и добавлении скобок парсинг резко усложняется и не понятно какую структуру изобрести для сложных логических выражений.
вот тут я впал в ступор - time › 17:00 OR (temperature › 30 AND in1 = 1) out1=1
как хранить и обрабатывать логические группы?