/** * \ingroup grp_nfc_dal * * \brief DAL deferred call function * This function will enable to call the callback client asyncronously and in the client context. * It will post a message in a queue that will be processed by a client thread. * * \param[in] func The function to call when message is read from the queue * \param[in] param Parameter that will be passed to the 'func' function. * */ void phDal4Nfc_DeferredCall(pphDal4Nfc_DeferFuncPointer_t func, void *param) { int retvalue = 0; phDal4Nfc_Message_Wrapper_t nDeferedMessageWrapper; phDal4Nfc_DeferredCall_Msg_t *pDeferedMessage; static phDal4Nfc_DeferredCall_Msg_t nDeferedMessageRead; static phDal4Nfc_DeferredCall_Msg_t nDeferedMessageWrite; #ifdef USE_MQ_MESSAGE_QUEUE nDeferedMessage.eMsgType = PH_DAL4NFC_MESSAGE_BASE; nDeferedMessage.def_call = func; nDeferedMessage.params = param; retvalue = (int)mq_send(nDeferedCallMessageQueueId, (char *)&nDeferedMessage, sizeof(phDal4Nfc_DeferredCall_Msg_t), 0); #else if(PHDAL4NFC_READ_MESSAGE==(* (int*)param)) { pDeferedMessage = &nDeferedMessageRead; } else { pDeferedMessage = &nDeferedMessageWrite; } nDeferedMessageWrapper.mtype = 1; nDeferedMessageWrapper.msg.eMsgType = PH_DAL4NFC_MESSAGE_BASE; pDeferedMessage->pCallback = func; pDeferedMessage->pParameter = param; nDeferedMessageWrapper.msg.pMsgData = pDeferedMessage; nDeferedMessageWrapper.msg.Size = sizeof(phDal4Nfc_DeferredCall_Msg_t); retvalue = phDal4Nfc_msgsnd(nDeferedCallMessageQueueId, (struct msgbuf *)&nDeferedMessageWrapper, sizeof(phLibNfc_Message_t), 0); #endif }
/*! * \brief System timer callback. * This callback is called by Linux whenever one the timers expires. It * calls the corresponding registered callback. * * \param sv structure storing the expired timer ID. */ static void phOsalNfc_Timer_Expired(union sigval sv) { uint32_t timerid = (uint32_t)(sv.sival_int); if((timerid < MAX_NO_TIMERS)&&(timers[timerid].nIsStopped == 1)) { //printf("phOsalNfc_Timer_Expired : Expired but already stopped TimerId=%d\n", timerid); return; } if(timerid < MAX_NO_TIMERS) { #ifndef CYCLIC_TIMER phOsalNfc_Timer_Stop(timerid); #else #endif #ifdef NXP_MESSAGING phOsalNfc_Timer_Msg_t *timer_msg; phOsalNfc_DeferedCalldInfo_t *osal_defer_msg; phDal4Nfc_Message_Wrapper_t wrapper; timer_msg = phOsalNfc_GetMemory(sizeof(phOsalNfc_Timer_Msg_t)); if(timer_msg == NULL) { phOsalNfc_RaiseException(phOsalNfc_e_NoMemory, 0); return; } osal_defer_msg = phOsalNfc_GetMemory(sizeof(phOsalNfc_DeferedCalldInfo_t)); if(osal_defer_msg == NULL) { phOsalNfc_FreeMemory(timer_msg); phOsalNfc_RaiseException(phOsalNfc_e_NoMemory, 0); return; } timer_msg->TimerId = timerid; timer_msg->pCallBck = timers[timerid].callback; timer_msg->pContext = timers[timerid].pContext; osal_defer_msg->pCallback = phOsalNfc_Timer_DeferredCall; osal_defer_msg->pParameter = timer_msg; wrapper.mtype = 1; wrapper.msg.eMsgType = PH_OSALNFC_TIMER_MSG; wrapper.msg.pMsgData = osal_defer_msg; wrapper.msg.Size = sizeof(phOsalNfc_DeferedCalldInfo_t); timers[timerid].ptr = osal_defer_msg; #ifndef G_IDLE_ADD_MSGQ phDal4Nfc_msgsnd(nDeferedCallMessageQueueId, (void *)&wrapper, sizeof(phOsalNfc_Message_t), 0); #else PostMessage((void *)&wrapper, sizeof(phOsalNfc_Message_t), 0); #endif //(timers[timerid].callback)(timerid, timers[timerid].pContext); #endif } }
/******************************************************************************* ** ** Function phTmlNfc_DeferredCall ** ** Description Posts message on upper layer thread ** upon successful read or write operation ** ** Parameters dwThreadId - id of the thread posting message ** ptWorkerMsg - message to be posted ** ** Returns None ** *******************************************************************************/ void phTmlNfc_DeferredCall(uintptr_t dwThreadId, phLibNfc_Message_t *ptWorkerMsg) { intptr_t bPostStatus; UNUSED(dwThreadId); /* Post message on the user thread to invoke the callback function */ sem_wait(&gpphTmlNfc_Context->postMsgSemaphore); bPostStatus = phDal4Nfc_msgsnd(gpphTmlNfc_Context->dwCallbackThreadId, ptWorkerMsg, 0 ); sem_post(&gpphTmlNfc_Context->postMsgSemaphore); }
static void terminateMessageThread(int clientId) { messageThreadRunning = 0; phDal4Nfc_Message_Wrapper_t message; phLibNfc_DeferredCall_t *msg; msg = (phLibNfc_DeferredCall_t *)malloc(sizeof(phLibNfc_DeferredCall_t)); msg->pCallback = 0; msg->pParameter = 0; message.msg.eMsgType = PH_LIBNFC_DEFERREDCALL_MSG; message.msg.pMsgData = msg; message.msg.Size = sizeof(phLibNfc_DeferredCall_t); phDal4Nfc_msgsnd(clientId, &message, sizeof(phLibNfc_Message_t), 0); }