//------------------------------------------------------------------------------ static void* k2uEventFetchThread(void* pArg_p) { UINT8 aEventBuf[sizeof(tEvent) + MAX_EVENT_ARG_SIZE]; tEvent* pEvent = (tEvent*)aEventBuf; INT ret; UNUSED_PARAMETER(pArg_p); while (!instance_l.fStopKernelThread) { ret = ioctl(instance_l.fd, PLK_CMD_GET_EVENT, pEvent); if (ret == 0) { DEBUG_LVL_EVENTU_TRACE("%s() User: got event type:%d(%s) sink:%d(%s)\n", __func__, pEvent->eventType, debugstr_getEventTypeStr(pEvent->eventType), pEvent->eventSink, debugstr_getEventSinkStr(pEvent->eventSink)); if (pEvent->eventArgSize == 0) pEvent->eventArg.pEventArg = NULL; else pEvent->eventArg.pEventArg = (UINT8*)pEvent + sizeof(tEvent); if (eventucal_postEventCircbuf(kEventQueueUInt, pEvent) != kErrorOk) { DEBUG_LVL_ERROR_TRACE("%s(): K2U event is dropped!!\n", __func__); } } else { // Ignore errors from kernel DEBUG_LVL_EVENTU_TRACE("%s(): Error in retrieving kernel to user event!!\n", __func__); } } instance_l.fStopKernelThread = FALSE; return NULL; }
//------------------------------------------------------------------------------ tOplkError eventu_postEvent(const tEvent* pEvent_p) { tOplkError ret = kErrorOk; // Check parameter validity ASSERT(pEvent_p != NULL); if (!instance_l.fInitialized) { DEBUG_LVL_ERROR_TRACE("%s() Eventu module is not initialized\n", __func__); return kErrorNoResource; } // Split event post to user internal and user to kernel switch (pEvent_p->eventSink) { // kernel layer modules case kEventSinkSync: case kEventSinkNmtk: case kEventSinkDllk: case kEventSinkDllkCal: case kEventSinkPdok: case kEventSinkPdokCal: case kEventSinkErrk: case kEventSinkTimesynck: DEBUG_LVL_EVENTU_TRACE("U2K type:%s(%d) sink:%s(%d) size:%d!\n", debugstr_getEventTypeStr(pEvent_p->eventType), pEvent_p->eventType, debugstr_getEventSinkStr(pEvent_p->eventSink), pEvent_p->eventSink, pEvent_p->eventArgSize); ret = eventucal_postKernelEvent(pEvent_p); if (ret != kErrorOk) { DEBUG_LVL_ERROR_TRACE("User to kernel event could not be posted!!\n"); } break; // user layer modules case kEventSinkNmtMnu: case kEventSinkNmtu: case kEventSinkSdoAsySeq: case kEventSinkApi: case kEventSinkSdoTest: case kEventSinkDlluCal: case kEventSinkErru: DEBUG_LVL_EVENTU_TRACE("UINT type:%s(%d) sink:%s(%d) size:%d!\n", debugstr_getEventTypeStr(pEvent_p->eventType), pEvent_p->eventType, debugstr_getEventSinkStr(pEvent_p->eventSink), pEvent_p->eventSink, pEvent_p->eventArgSize); ret = eventucal_postUserEvent(pEvent_p); if (ret != kErrorOk) { DEBUG_LVL_ERROR_TRACE("User internal event could not be posted!!\n"); } break; default: ret = kErrorEventUnknownSink; break; } return ret; }
//------------------------------------------------------------------------------ void eventkcal_postEventFromUser(const void* pEvent_p) { tEvent event; // Check parameter validity ASSERT(pEvent_p != NULL); if (!instance_l.fInitialized) return; // Copy the event to the local buffer OPLK_MEMCPY(&event, pEvent_p, sizeof(tEvent)); // Assign the event argument which is present after the event memory, if argument valid if (event.eventArgSize != 0) event.eventArg.pEventArg = (void*)((UINT8*)pEvent_p + sizeof(tEvent)); switch (event.eventSink) { case kEventSinkSync: case kEventSinkNmtk: case kEventSinkDllk: case kEventSinkDllkCal: case kEventSinkPdok: case kEventSinkPdokCal: case kEventSinkErrk: case kEventSinkTimesynck: DEBUG_LVL_EVENTK_TRACE("U2K type:%s(%d) sink:%s(%d) size:%d!\n", debugstr_getEventTypeStr(event.eventType), event.eventType, debugstr_getEventSinkStr(event.eventSink), event.eventSink, event.eventArgSize); eventkcal_postEventCircbuf(kEventQueueU2K, &event); break; case kEventSinkNmtMnu: case kEventSinkNmtu: case kEventSinkSdoAsySeq: case kEventSinkApi: case kEventSinkDlluCal: case kEventSinkErru: DEBUG_LVL_EVENTK_TRACE("UINT type:%s(%d) sink:%s(%d) size:%d!\n", debugstr_getEventTypeStr(event.eventType), event.eventType, debugstr_getEventSinkStr(event.eventSink), event.eventSink, event.eventArgSize); eventkcal_postEventCircbuf(kEventQueueUInt, &event); break; default: DEBUG_LVL_EVENTK_TRACE("UNKNOWN Event: Type:%s(%d) sink:%s(%d) size:%d!\n", debugstr_getEventTypeStr(event.eventType), event.eventType, debugstr_getEventSinkStr(event.eventSink), event.eventSink, event.eventArgSize); break; } }