//*************************************************************************** // // Author(s)...: Pashgan http://ChipEnable.Ru // // Target(s)...: любой микроконтроллер mega // // Compiler....: IAR 5.11A // // Description.: Заготовка для событийной системы на таблицах // // Data........: 26.11.10 // //*************************************************************************** #include "event-system.h" //кольцевой буфер static volatile unsigned char cycleBuf[SIZE_BUF]; static volatile unsigned char tailBuf = 0; static volatile unsigned char headBuf = 0; static volatile unsigned char countBuf = 0; //взять событие unsigned char ES_GetEvent(void) { unsigned char event; if (countBuf > 0){ //если приемный буфер не пустой event = cycleBuf[headBuf]; //считать из него событие countBuf--; //уменьшить счетчик headBuf++; //инкрементировать индекс головы буфера if (headBuf == SIZE_BUF) headBuf = 0; return event; //вернуть событие } return 0; } //положить событие void ES_PlaceEvent(unsigned char event) { if (countBuf < SIZE_BUF){ //если в буфере еще есть место cycleBuf[tailBuf] = event; //кинуть событие в буфер tailBuf++; //увеличить индекс хвоста буфера if (tailBuf == SIZE_BUF) tailBuf = 0; countBuf++; //увеличить счетчик } } //***************************************************************************** volatile unsigned char currentState = 0; __flash struct ROW_TABLE { unsigned char state; //состояние unsigned char event; //событие unsigned char nextState; //следующее состояние void (*pStateFunc)(void); }; void ES_Init(void) { tailBuf = 0; headBuf = 0; countBuf = 0; } void EmptyFunc(void) { } struct ROW_TABLE table[] = { // STATE EVENT NEXT STATE STATE_FUNC { 0, 0, 0, EmptyFunc} }; void ES_Dispatch(unsigned char currentEvent) { unsigned char i; for (i=0; table[i].state; i++){ if (table[i].state == currentState && table[i].event == currentEvent){ if (table[i].nextState != STATE_NO_CHANGE){ currentState = table[i].nextState; } table[i].pStateFunc(); break; } } }