//*************************************************************************** // // Author(s)...: Pashgan http://ChipEnable.Ru // // Target(s)...: ATMega16 // // Compiler....: IAR 5.11A // // Description.: Заготовка для простой событийной системы // // Data........: 20.01.10 // //*************************************************************************** #include "event-system.h" //кольцевой буфер static volatile unsigned char cycleBuf[SIZE_BUF]; static unsigned char tailBuf = 0; static unsigned char headBuf = 0; static volatile unsigned char countBuf = 0; //возвращает колличество событий находящихся в буфере unsigned char ES_GetCount(void) { return countBuf; } //"очищает" буфер __monitor void ES_FlushBuf(void) { tailBuf = 0; headBuf = 0; 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++; //увеличить счетчик } } //***************************************************************************** void EmptyFunc(void) { } __flash void (*FuncAr[])(void) = { EmptyFunc //здесь будут обработчики }; void ES_Dispatch(unsigned char event) { void (*pFunc)(void); pFunc = FuncAr[event-1]; pFunc(); }