123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327 |
- //==================================================================
- //
- // 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
- //==============================================================
|