Добрый день, есть несколько разных параметров, температура напряжение и тд.
так вот надо отследить, переход параметра(ов) из Нормы в Аварию и соответственно обратно.
Ну и при аварии это все в журнал занести и тд.
Сделал это так:
Код:
void poling_error(void){
uint8_t i=0;
for(i=0;i<(MAX_HANDLER_SWITCH+1);i++){
switch(CallBackSwitch[i].mode){
case STATUS_NORM:{
// Вызываеться функция когда парметр в норме
// Ожидание перехода в АВАРИЮ
if(CallBackSwitch[i].CallBack_Norm){
CallBackSwitch[i].mode=CallBackSwitch[i].CallBack_Norm();
}
break;
}
case STATUS_ERROR:{
// Вызываеться функция когда парметр в АВАРИИ
// Ожидание перехода в НОРМУ
if(CallBackSwitch[i].CallBack_Error){
CallBackSwitch[i].mode=CallBackSwitch[i].CallBack_Error();
}
break;
}
}
}
}
Код:
uint8_t T_12_Norm(void){
// текуший статус норма ожидаем перехода в аварию
if(GetCurrent_T(T_BAL_12)>=Global_Flash_SettingAllVar.T_BALL_TOP){
SetStatus(MATCH_ERROR,ST_T12);
//Журнал аварии
ArgWebLog.id=ERROR_ID_T12_BALL_ERROR;
ArgWebLog.status=STATUS_WEB_BAD;
Add_WebLog(ArgWebLog);
//----------
AddBufferStr((unsigned char*)&trap_T_12_ERROR);
//----------
return STATUS_ERROR;
}
if(GetCurrent_T(T_BAL_12)>=Global_Flash_SettingAllVar.T_BALL_BOT){
SetStatus(MATCH_ADMONITION,ST_T12);
}
return STATUS_NORM;
}
//=========================
uint8_t T_12_Error(void){
if(GetCurrent_T(T_BAL_12)<=Global_Flash_SettingAllVar.T_BALL_BOT){
SetStatus(MATCH_NORM,ST_T12);
ArgWebLog.id=ERROR_ID_T12_BALL_NORM;
ArgWebLog.status=STATUS_WEB_GOOD;
Add_WebLog(ArgWebLog);
//----------
AddBufferStr((unsigned char*)&trap_T_12_NORM);
//----------
return STATUS_NORM; // после этого эта функция больше не вызываеться
}
if(GetCurrent_T(T_BAL_12)<=Global_Flash_SettingAllVar.T_BALL_TOP){
SetStatus(MATCH_ADMONITION,ST_T12);
}
return STATUS_ERROR;
}
Но тут мне не нравиться что в функции T_12_Norm и T_12_Error вызываються постоянно, хотелось бы сделать что бы было более прозрачно, что бы они вызывались чисто при переключению единоразово,но пока вижу что особо это не как не сделаешь.