Exemplo n.º 1
0
//------------------------------------------------------------------------------
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;
    }
}