//================================================================== // // Filename: app_msg.c // Description: // //------------------------------------------------------------------ // // version: // data: 15:28pm, 1.July.2019, written by dwd // Description: // //------------------------------------------------------------------ //================================================================== /*------------------------------------------------------------------------------ * I N C L U D E *------------------------------------------------------------------------------*/ #include "app_def.h" #include "app_msg.h" //------------------------------------------------------------------ // static variables //------------------------------------------------------------------ static T_MSG_QUEUE s_tMsgQue[MsgQueueCnt]; /*======================================================= - Name: OSQPost - DESCRIPTION: - post message to module queue. - - Input: - Output: - - modification history - -------------------- - 15:28pm, 1.July.2019, written by dwd * -------------------- =======================================================*/ 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; } /*======================================================= - Name: OSQNew - DESCRIPTION: - post new message to module queue.If message already exists,change the param to new param. - - Input: - Output: - - modification history - -------------------- - 15:28pm, 1.July.2019, written by dwd * -------------------- =======================================================*/ 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 - -------------------- - 15:28pm, 1.July.2019, written by dwd * -------------------- =======================================================*/ 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:28pm, 1.July.2019, written by dwd * -------------------- =======================================================*/ 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:28pm, 1.July.2019, written by dwd * -------------------- =======================================================*/ 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 - -------------------- - 15:28pm, 1.July.2019, written by dwd * -------------------- =======================================================*/ 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 - -------------------- - 15:28pm, 1.July.2019, written by dwd * -------------------- =======================================================*/ void OSQInit(void) { T_MSG_MODULE mod; for (mod = (T_MSG_MODULE)0; mod < MsgQueueCnt; mod++) { OSQFlush(mod); } } //-------------------------------------------------------------- //============================================================== // End Of File //==============================================================