#define maxHandlers 64
#define maxMessages 64
#define maxTimers 64
#define MSG_ADC_CYCLE 1
#define MSG_KEY_PRESS 2
#define MSG_KEY_REPEAT 3
#define MSG_LCD_REFRESH 4
#define MSG_BRESENHAM 5
#define MSG_MENU_SELECT 6
#define MSG_MENU_CANCEL 7
#define MSG_1W_TEMP 8
#define MSG_CHECK_TEMP 9
#define MSG_DISP_REFRESH 10
#define MSG_TIMER_SEC 11
typedef unsigned char msg_num; // -
typedef int msg_par; //
typedef unsigned char (*handler)(msg_par); // -
//
typedef struct {
msg_num msg; //
handler hnd; //
} iHandler;
//
typedef struct {
msg_num msg; //
msg_par par; //
} iMessage;
//
typedef struct {
msg_num msg; //
msg_par par; //
unsigned int time; // ( 10 )
} iTimer;
iTimer lTimer[maxTimers]; //
iHandler lHandler[maxHandlers]; //
iMessage lMessage[maxMessages]; //
unsigned int lMesPointer=0,hMesPointer=0; //
* This source code was highlighted with Source Code Highlighter .
//
// : setHandler(MSG_KEY_PRESS, &checkKey);
void setHandler(msg_num msg, handler hnd) {
unsigned char i,j;
i=0; j=0;
while (i<maxHandlers) {
if (lHandler[i].msg==0) { //
lHandler[i].hnd = hnd; //
lHandler[i].msg = msg;
break ;
}
i++;
}
}
//
// : killHandler(MSG_KEY_PRESS, &checkKey);
void killHandler(msg_num msg, handler hnd) {
unsigned char i,j;
i=0; j=0;
while (i<maxHandlers) {
if ((lHandler[i].msg==msg) && (lHandler[i].hnd==hnd)) {
lHandler[i].msg = 0; // ,
}
if (lHandler[i].msg != 0) {
if (i != j) { // ,
lHandler[j].msg = lHandler[i].msg;
lHandler[j].hnd = lHandler[i].hnd;
lHandler[i].msg = 0;
}
j++;
}
i++;
}
}
* This source code was highlighted with Source Code Highlighter .
//
// : sendMessage(MSG_KEY_PRESS, KEY_MENU)
void sendMessage(msg_num msg, msg_par par) {
hMesPointer = (hMesPointer+1) & (maxMessages-1); //
lMessage[hMesPointer].msg = msg; //
lMessage[hMesPointer].par = par;
if (hMesPointer == lMesPointer) { // ,
lMesPointer = (lMesPointer+1) & (maxMessages-1);
}
};
//
void dispatchMessage() {
char i;
unsigned char res;
if (hMesPointer == lMesPointer) { // -
return ;
}
lMesPointer = (lMesPointer+1) & (maxMessages-1); //
msg_num msg = lMessage[lMesPointer].msg;
msg_par par = lMessage[lMesPointer].par;
if (msg==0)
return ;
for (i=maxHandlers-1; i>=0; i--) { //
if (lHandler[i].msg==msg) { //
res = lHandler[i].hnd(par); //
if (res) { // 1,
break ;
}
}
}
}
* This source code was highlighted with Source Code Highlighter .
//
// : setTimer(MSG_LCD_REFRESH, 0, 50);
void setTimer(msg_num msg, msg_par par, unsigned int time) {
unsigned char i,firstFree;
firstFree = maxTimers+1;
if (time == 0) {
sendMessage(msg, par);
} else {
for (i=0; i<maxTimers; i++) { //
if (lTimer[i].msg == 0) {
firstFree = i;
} else { // -
if ((lTimer[i].msg == msg) && (lTimer[i].par == par)) {
lTimer[i].time = time;
return ;
}
}
}
if (firstFree <= maxTimers) { // -
lTimer[firstFree].msg = msg;
lTimer[firstFree].par = par;
lTimer[firstFree].time = time;
}
}
}
//
// - ,
//
void killTimer(msg_num msg) {
unsigned char i;
for (i=0; i<maxTimers; i++) {
if (lTimer[i].msg == msg) {
lTimer[i].msg = 0;
}
}
}
//
void dispatchTimer() {
unsigned char i;
msg_num msg;
msg_par par;
for (i=0; i<maxTimers; i++) {
if (lTimer[i].msg == 0)
continue ;
if (lTimer[i].time == 0) { //
msg = lTimer[i].msg;
par =lTimer[i].par;
lTimer[i].msg = 0;
sendMessage(msg, par); //
} else {
lTimer[i].time--; //
}
}
}
* This source code was highlighted with Source Code Highlighter .
Source: https://habr.com/ru/post/58366/
All Articles