//================================================================== // // Filename: mapp_msg.c // Description: Message driver // //------------------------------------------------------------------ // // version: // date: 23:54pm, 08.Apr.2012, by Sirius // Description: // //------------------------------------------------------------------ //================================================================== #define MAPP_MSG_C /*------------------------------------------------------------------------------ * I N C L U D E *------------------------------------------------------------------------------*/ #include "general.h" #include "mapp_msg.h" //------------------------------------------------------------------ // static variables //------------------------------------------------------------------ static T_MSG_QUEUE s_tMsgQue[MsgQueueCnt]; /*======================================================= - Name: OSQPost - DESCRIPTION: - post message to module queue. - - Input: - Output: - - modification history - -------------------- - 13:41pm, 11.Dec.2009, written by Sirius * -------------------- =======================================================*/ void OSQPost(T_MSG_MODULE mod, U08 id, U16 prm) { T_MESSAGE msg; U08 enque,deque; BOOL qfull; msg.id = id; /* get message id */ msg.prm = prm; /* get message parameter */ enque = (U08)(s_tMsgQue[mod].nEnque & 0x7f); /* get enqueue index */ qfull = (U08)(s_tMsgQue[mod].nEnque & 0x80); /* MSB of enqueue as full flag */ deque = (U08)(s_tMsgQue[mod].nDeque & 0x7f); /* get dequeue index */ if (qfull == 0) { /* queue not full... */ s_tMsgQue[mod].Queue[enque] = msg; /* message enqueue */ enque++; if (enque >= QUEUE_LENGTH) { /* avoid overflow */ enque = 0; } if (enque == deque) { /* queue full now */ qfull = TRUE; } } if (qfull) { /* set queue MSB as full flag */ enque |= 0x80; } s_tMsgQue[mod].nEnque = enque; s_tMsgQue[mod].nDeque = deque; return; } int OSQIsEmpty(T_MSG_MODULE mod) { // 如果入队和出队的索引相等,且队列的MSB没有设置为满,则队列为空 if ((s_tMsgQue[mod].nEnque == s_tMsgQue[mod].nDeque) && ((s_tMsgQue[mod].nEnque & 0x80) == 0)) { return 1; // 队列为空 } return 0; // 队列不为空 } /*======================================================= - Name: OSQNew - DESCRIPTION: - post new message to module queue.If message already exists,change the param to new param. - - Input: - Output: - - modification history - -------------------- - 14:54pm, 11.Dec.2009, written by Sirius * -------------------- =======================================================*/ void OSQNew(T_MSG_MODULE mod, U08 id, U16 prm) { T_MESSAGE msg; U08 enque,deque,i; BOOL qfull; msg.id = id; /* get message id */ msg.prm = prm; /* get message parameter */ enque = (U08)(s_tMsgQue[mod].nEnque & 0x7f); /* get enqueue index */ qfull = (U08)(s_tMsgQue[mod].nEnque & 0x80); /* MSB of enqueue as full flag */ deque = (U08)(s_tMsgQue[mod].nDeque & 0x7f); /* get dequeue index */ if (qfull == 0) { /* queue not full... */ i = deque; while (i != enque) { /* findout the same message in queue */ if (s_tMsgQue[mod].Queue[i].id == msg.id) {/* message already exists,return... */ s_tMsgQue[mod].Queue[i].prm = msg.prm; /* message param change */ return; } i++; if (i >= QUEUE_LENGTH) { i = 0; } } s_tMsgQue[mod].Queue[enque] = msg; /* message enqueue */ enque++; if (enque >= QUEUE_LENGTH) { /* avoid overflow */ enque = 0; } if (enque == deque) { /* queue full now */ qfull = TRUE; } } if (qfull) { /* set queue MSB as full flag */ enque |= 0x80; } s_tMsgQue[mod].nEnque = enque; s_tMsgQue[mod].nDeque = deque; return; } /*======================================================= - Name: OSQInquiry - DESCRIPTION: - post new message to module queue.If message already exists,return. - - Input: - Output: - - modification history - -------------------- - 14:54pm, 11.Dec.2009, written by Sirius * -------------------- =======================================================*/ void OSQInquery(T_MSG_MODULE mod, U08 id, U16 prm) { T_MESSAGE msg; U08 enque,deque,i; BOOL qfull; msg.id = id; /* get message id */ msg.prm = prm; /* get message parameter */ enque = (U08)(s_tMsgQue[mod].nEnque & 0x7f); /* get enqueue index */ qfull = (U08)(s_tMsgQue[mod].nEnque & 0x80); /* MSB of enqueue as full flag */ deque = (U08)(s_tMsgQue[mod].nDeque & 0x7f); /* get dequeue index */ if (qfull == 0) { /* queue not full... */ i = deque; while (i != enque) { /* findout the same message in queue */ if (s_tMsgQue[mod].Queue[i].id == msg.id) {/* message already exists,return... */ return; } i++; if (i >= QUEUE_LENGTH) { i = 0; } } s_tMsgQue[mod].Queue[enque] = msg; /* message enqueue */ enque++; if (enque >= QUEUE_LENGTH) { /* avoid overflow */ enque = 0; } if (enque == deque) { /* queue full now */ qfull = TRUE; } } if (qfull) { /* set queue MSB as full flag */ enque |= 0x80; } s_tMsgQue[mod].nEnque = enque; s_tMsgQue[mod].nDeque = deque; return; } /*======================================================= - Name: OSQInsert - DESCRIPTION: - Insert a new message at the head of queue. - - Input: - Output: - - modification history - -------------------- - 15:01pm, 11.Dec.2009, written by Sirius * -------------------- =======================================================*/ void OSQInsert(T_MSG_MODULE mod, U08 id, U16 prm) { T_MESSAGE msg; U08 enque,deque; BOOL qfull; msg.id = id; /* get message id */ msg.prm = prm; /* get message parameter */ enque = (U08)(s_tMsgQue[mod].nEnque & 0x7f); /* get enqueue index */ qfull = (U08)(s_tMsgQue[mod].nEnque & 0x80); /* MSB of enqueue as full flag */ deque = (U08)(s_tMsgQue[mod].nDeque & 0x7f); /* get dequeue index */ if (qfull) { /* drop last message if queue full */ if (enque == 0) { enque = QUEUE_LENGTH - 1; } else { enque--; } } if (deque == 0) { /* adjust deque pointer to last position */ deque = QUEUE_LENGTH - 1; } else { deque--; } s_tMsgQue[mod].Queue[deque] = msg; /* insert message to queue head */ if (enque == deque) { /* queue full now */ qfull = TRUE; } if (qfull) { /* set queue MSB as full flag */ enque |= 0x80; } s_tMsgQue[mod].nEnque = enque; s_tMsgQue[mod].nDeque = deque; return; } /*======================================================= - Name: OSQGet - DESCRIPTION: - Message dequeue from queue. - - Input: - Output: - - modification history - -------------------- - 15:59pm, 11.Dec.2009, written by Sirius * -------------------- =======================================================*/ //T_MESSAGE *OSQGet(T_MSG_MODULE mod) //{ // static T_MESSAGE msg; // U08 enque,deque; // BOOL qempty; // msg.id = NO_MSG; // enque = (U08)(s_tMsgQue[mod].nEnque & 0x7f); /* get enqueue index */ // deque = (U08)(s_tMsgQue[mod].nDeque & 0x7f); /* get dequeue index */ // qempty = (U08)(s_tMsgQue[mod].nDeque & 0x80); /* MSB of dequeue as empty flag */ // if (qempty == 0) { /* queue not empty... */ // msg = s_tMsgQue[mod].Queue[deque]; /* message dequeue */ // deque++; // if (deque >= QUEUE_LENGTH) { /* avoid overflow */ // deque = 0; // } // if (enque == deque) { /* queue full now */ // qempty = TRUE; // } // } // if (qempty) { /* set queue MSB as full flag */ // deque |= 0x80; // } // s_tMsgQue[mod].nEnque = enque; // s_tMsgQue[mod].nDeque = deque; // // return (&msg); //} T_MESSAGE *OSQGet(T_MSG_MODULE mod) { static T_MESSAGE msg; U08 enque,deque; BOOL qempty; msg.id = NO_MSG; enque = (U08)(s_tMsgQue[mod].nEnque & 0x7f); /* get enqueue index */ deque = (U08)(s_tMsgQue[mod].nDeque & 0x7f); /* get dequeue index */ qempty = (U08)(s_tMsgQue[mod].nDeque & 0x80); /* MSB of dequeue as empty flag */ if (qempty == 0) { /* queue not empty... */ msg = s_tMsgQue[mod].Queue[deque]; /* message dequeue */ deque++; if (deque >= QUEUE_LENGTH) { /* avoid overflow */ deque = 0; } if (enque == deque) { /* queue full now */ qempty = TRUE; } } if (qempty) { /* set queue MSB as full flag */ deque |= 0x80; } s_tMsgQue[mod].nEnque = enque; s_tMsgQue[mod].nDeque = deque; return (&msg); } /*======================================================= - Name: OSQFlush - DESCRIPTION: - Flush module message queue. - - Input: - Output: - - modification history - -------------------- - 16:30pm, 11.Dec.2009, written by Sirius * -------------------- =======================================================*/ void OSQFlush(T_MSG_MODULE mod) { s_tMsgQue[mod].nEnque = 0x00; /* clear message enqueue,qfull=FALSE */ s_tMsgQue[mod].nDeque = 0x80; /* clear message dequeue,qempty = TRUE */ } /*======================================================= - Name: OSQInit - DESCRIPTION: - Init all module queue message - - Input: - Output: - - modification history - -------------------- - 16:44pm, 11.Dec.2009, written by Sirius * -------------------- =======================================================*/ void OSQInit(void) { T_MSG_MODULE mod; for (mod = (T_MSG_MODULE)0; mod < MsgQueueCnt; mod++) { OSQFlush(mod); } } //-------------------------------------------------------------- //============================================================== // End Of File //==============================================================