/***************************************************************************** Function Name : IMSA_TimerMsgDistr() Description : TIMER消息分发函数 Input : VOS_VOID *pRcvMsg Output : VOS_VOID Return Value : VOS_VOID History : 1.sunbing 49683 2013-06-20 Draft Enact *****************************************************************************/ VOS_VOID IMSA_TimerMsgDistr(const REL_TIMER_MSG *pRcvMsg ) { IMSA_TIMER_ID_ENUM_UINT16 enTimerName; VOS_UINT32 i = IMSA_NULL; IMSA_TIMER_EVT_FUNC pTimerEvtFunc = VOS_NULL_PTR; IMSA_CONTROL_MANAGER_STRU *pstControlManager; enTimerName = (VOS_UINT16)PS_GET_REL_TIMER_NAME(pRcvMsg); pstControlManager = IMSA_GetControlManagerAddress(); /* 关机过程中,除开关机定时器超时,其他的都不处理 */ if((IMSA_STATUS_STOPING == pstControlManager->enImsaStatus) && (TI_IMSA_START_OR_STOP != enTimerName)) { IMSA_WARN_LOG("IMSA_TimerMsgDistr: Status is Stoping!"); return; } /* 在事件处理表中查找处理函数 */ for ( i = 0; i < g_ulImsaTimerEvtFuncTblSize; i++ ) { /*lint -e960*/ if ( enTimerName == g_astImsaTimerEvtFuncTbl[i].ulEvtId ) { /* 事件ID匹配 */ pTimerEvtFunc = g_astImsaTimerEvtFuncTbl[i].pTimerEvtFunc; break; } /*lint +e960*/ } /* 如果处理函数存在则调用 */ if ( VOS_NULL_PTR != pTimerEvtFunc ) { (*pTimerEvtFunc)(pRcvMsg); } else { /*lint -e961*/ IMSA_ERR_LOG1("IMSA_TimerMsgDistr: Unexpected event received! <enTimerName>", enTimerName); /*lint +e961*/ } return; }
/***************************************************************************** Function Name : IMSA_GetIntraMsgBuffAddr Discription : 获取发送内部消息的地址 发送内部消息的过程为: 1.申请内部消息地址, 2.填充内部消息内容 3.发送内部消息 Input : 消息长度:该长度含义同DOPRA申请消息时的长度,即不包括 消息头 VOS_MSG_HEADER的长度 Output : None Return : 消息地址 History: 1.sunbing 49683 2013-06-25 Draft Enact *****************************************************************************/ VOS_VOID *IMSA_GetIntraMsgBuffAddr( VOS_UINT32 ulBuffSize ) { IMSA_INTRA_MSG_QUEUE_STRU *pstIntraMsgQueue; VOS_UINT8 *pucMsgBuff; IMSA_INTRA_MSG *pstIntraMsgHead; if ( (0 == ulBuffSize) || (IMSA_INTRA_MSG_MAX_SIZE < ulBuffSize ) ) { /* 打印错误信息 */ /*lint -e961*/ IMSA_ERR_LOG1("IMSA_GetIntraMsgBuffAddr: Size error, ", ulBuffSize); /*lint +e961*/ return VOS_NULL_PTR; } /* 获取队列地址 */ pstIntraMsgQueue = IMSA_GetIntraMsgQueueAddress(); /* 验证是否队列满,留出一个消息不使用,避免正在处理的消息空间被分配出去 */ if ( ((pstIntraMsgQueue->usTail + 1 + 1) % IMSA_INTRA_MSG_MAX_NUM) != pstIntraMsgQueue->usHeader ) { pucMsgBuff = pstIntraMsgQueue->aucMsgBuff[pstIntraMsgQueue->usTail]; /* 将申请的缓冲区清0 */ IMSA_MEM_SET(pucMsgBuff, 0, IMSA_INTRA_MSG_MAX_SIZE); /*lint -e826*/ pstIntraMsgHead = (IMSA_INTRA_MSG *)pucMsgBuff; /*lint -e826*/ /* 填写内部消息消息头中的长度域,需要减去OSA消息头长度 */ pstIntraMsgHead->ulLength = ulBuffSize - 20; return (VOS_VOID *)pucMsgBuff; } else { /* 打印错误信息 */ IMSA_ERR_LOG("IMSA_GetIntraMsgBuffAddr: Queue full!"); return VOS_NULL_PTR; } }
/***************************************************************************** Function Name : IMSA_TimerMsgDistr() Description : TIMER消息分发函数 Input : VOS_VOID *pRcvMsg Output : VOS_VOID Return Value : VOS_VOID History : 1.sunbing 49683 2013-06-20 Draft Enact *****************************************************************************/ VOS_VOID IMSA_TimerMsgDistr(const REL_TIMER_MSG *pRcvMsg ) { IMSA_TIMER_ID_ENUM_UINT16 enTimerName; VOS_UINT32 i = IMSA_NULL; IMSA_TIMER_EVT_FUNC pTimerEvtFunc = VOS_NULL_PTR; enTimerName = (VOS_UINT16)PS_GET_REL_TIMER_NAME(pRcvMsg); /* 在事件处理表中查找处理函数 */ for ( i = 0; i < g_ulImsaTimerEvtFuncTblSize; i++ ) { /*lint -e960*/ if ( enTimerName == g_astImsaTimerEvtFuncTbl[i].ulEvtId ) { /* 事件ID匹配 */ pTimerEvtFunc = g_astImsaTimerEvtFuncTbl[i].pTimerEvtFunc; break; } /*lint +e960*/ } /* 如果处理函数存在则调用 */ if ( VOS_NULL_PTR != pTimerEvtFunc ) { (*pTimerEvtFunc)(pRcvMsg); } else { /*lint -e961*/ IMSA_ERR_LOG1("IMSA_TimerMsgDistr: Unexpected event received! <enTimerName>", enTimerName); /*lint +e961*/ } return; }