/////////////////////////////////////////////////////////////////////////// // RxThread // thread to readout the message queue and parse the incoming messages // //////////////////////////////////////////////////////////////////////////// DWORD WINAPI RxThread(LPVOID par) { XLstatus xlStatus; unsigned int msgsrx = RECEIVE_EVENT_SIZE; XLevent xlEvent; UNUSED_PARAM(par); g_RXThreadRun = 1; while (g_RXThreadRun) { WaitForSingleObject(g_hMsgEvent,10); xlStatus = XL_SUCCESS; while (!xlStatus) { msgsrx = RECEIVE_EVENT_SIZE; xlStatus = xlReceive(g_xlPortHandle, &msgsrx, &xlEvent); if (xlStatus != XL_ERR_QUEUE_IS_EMPTY) { if (!g_silent) { printf("%s\n", xlGetEventString(&xlEvent)); } //ResetEvent(g_hMsgEvent); } } } return NO_ERROR; }
/** * \brief Read thread procedure * \param[in] pVoid contains the CPARAM_THREADPROC class object * \return void * \authors Arunkumar Karri * \date 07.19.2013 Created */ DWORD WINAPI CDIL_LIN_VectorXL::LINMsgReadThreadProc_LIN_Vector_XL(LPVOID pVoid) { USES_CONVERSION; CPARAM_THREADPROC* pThreadParam = (CPARAM_THREADPROC*) pVoid; XLstatus xlStatus = XL_SUCCESS; /* Assign thread action to CREATE_TIME_MAP */ pThreadParam->m_unActionCode = CREATE_TIME_MAP; /* Set the event to LIN_Vector_XL driver for wakeup and frame arrival notification */ //for (UINT i = 0; i < sg_unClientCnt; i++) { xlStatus = xlSetNotification (g_xlPortHandle[0], &g_hDataEvent[0], 1); } /* Set the thread action event to first notification event handle */ if (g_hDataEvent[0] != nullptr) { pThreadParam->m_hActionEvent = g_hDataEvent[0]; } /* Get the handle to the controller and validate it */ VALIDATE_POINTER_RETURN_VALUE_LOG(pThreadParam->m_hActionEvent, (DWORD)-1); DWORD dwResult = 0; unsigned int msgsrx; XLevent xlEvent; bool bLoopON = true; while (bLoopON) { WaitForSingleObject(g_hDataEvent[0], INFINITE); switch (pThreadParam->m_unActionCode) { case INVOKE_FUNCTION: { bool bMoreDataExist; msgsrx = RECEIVE_EVENT_SIZE; xlStatus = xlReceive(g_xlPortHandle[0], &msgsrx, &xlEvent); while (xlStatus == XL_SUCCESS ) { switch (xlStatus) { case XL_SUCCESS: { if ( g_pouDIL_LIN_Vector_XL != nullptr ) { g_pouDIL_LIN_Vector_XL->ProcessLINMsg(xlEvent); bMoreDataExist = true; } } break; default: break; } xlStatus = xlReceive(g_xlPortHandle[0], &msgsrx, &xlEvent);; } } break; case EXIT_THREAD: { bLoopON = false; } break; case CREATE_TIME_MAP: { //vCreateTimeModeMapping(pThreadParam->m_hActionEvent); SetEvent(pThreadParam->m_hActionEvent); pThreadParam->m_unActionCode = INVOKE_FUNCTION; } break; default: case INACTION: { // nothing right at this moment } break; } } SetEvent(pThreadParam->hGetExitNotifyEvent()); { ResetEvent(g_hDataEvent[0]); g_hDataEvent[0] = nullptr; } pThreadParam->m_hActionEvent = nullptr; return 0; }