я подумал сделать что то вроде этого
создал структуру для параметров, входов и выходов.
CODE
struct sTaskParams
{
float *var; //var compare limit
float limit;
uint8_t compare; //0 = '==', 1 = '>', 2 = '<', 3 = '>=', 4 = '<=', 5 = '!='
uint8_t logicGate; //0=and, 1=or
uint8_t enable;
};
struct sTaskDigInput
{
uint8_t enable;
uint8_t inNum;
uint8_t inState;
uint8_t logicGate;
};
struct sTaskOutput
{
uint8_t enable;
uint8_t outNum;
uint8_t outState;
};
struct sTaskCondition
{
uint8_t result;
uint8_t logic;
};
потом создал задачу в которой жестко задал 10 параметров 8 входов и 8 выходов.
Код
struct sDailyTask
{
uint8_t enable; //ON/OFF
uint8_t state;
uint32_t condIdx;
struct sTaskParam taskParams[MAX_PARAMS];
struct sTaskDigInput taskDigInputs[MAX_DIG_INPUTS];
struct sTaskOutput taskOutputs[MAX_OUTPUTS];
struct sTaskCondition taskCondition[MAX_CONDITIONS];
};
ну и массив из 10 задач.
Код
struct sDailyTask dailyTask[MAX_TASKS];
в принципе если логика идет подряд
Код
param1 && param2 || input1
то так я понимаю как обработать условие
проверяю параметры
Код
uint32_t TASKER_ChekParameters(uint32_t task_num)
{
uint32_t glob_cond=0;
for (int i = 0; i < sizeof(dailyTask[task_num].taskParams); i++)
{
if (dailyTask[task_num].taskParams[i].enable)
{
dailyTask[task_num].taskCondition[dailyTask[task_num].condIdx].result = TASKER_EvaluateParamCondition(dailyTasktask_num].taskParams[i].variable,
dailyTask[task_num].taskParams[i].limit,
dailyTask[task_num].taskParams[i].compare);
dailyTask[task_num].taskCondition[dailyTask[task_num].condIdx].logic = dailyTask[task_num].taskParams[i].logicGate;
dailyTask[task_num].condIdx++;
}
}
проверяю входы
Код
uint32_t TASKER_CheckInputs(uint32_t task_num)
{
int size = sizeof(dailyTask[task_num].taskDigInputs);
for (int i = 0; i < size; i++)
{
if (dailyTask[task_num].taskDigInputs[i].enable)
{
dailyTask[task_num].taskCondition[dailyTask[task_num].condIdx].result = TASKER_EvaluateInputCondition(dailyTask[task_num].taskDigInputs[i].inNum,
dailyTask[task_num].taskDigInputs[i].inState);
dailyTask[task_num].taskCondition[dailyTask[task_num].condIdx].logic = dailyTask[task_num].taskDigInputs[i].logicGate;
dailyTask[task_num].condIdx++;
}
}
return 0;
}
потом смотрю общий результат всех входных условий
Код
uint32_t TASKER_EvaluateTaskCondition(uint32_t task_num)
{
uint32_t result=0;
TASKER_ChekParameters(task_num);
TASK_CheckInputs(task_num);
for (int i = 0; i < dailyTask[task_num].condIdx; i++)
{
if (dailyTask[task_num].taskCondition[i].logic == OR)
result |= dailyTask[task_num].taskCondition[i].result;
else if (dailyTask[task_num].taskCondition[i].logic == AND)
result &= dailyTask[task_num].taskCondition[i].result;
}
return result;
}
но если условие более заковыристое
Код
(param1 && input1) || (param2 && (input2 || input3))
вот тут я не могу додуматься как создать структуру которая будет хранить логические связи.
Сообщение отредактировал Herz - Jan 27 2016, 14:02