示例#1
0
//------------------------------------------------------------------------------
tOplkError dllkcal_process(tEvent* pEvent_p)
{
    tOplkError                  ret = kErrorOk;
    tDllCalAsndServiceIdFilter* pServFilter;
    tDllIdentParam*             pIdentParam;
    tDllConfigParam*            pConfigParam;

#if defined(CONFIG_INCLUDE_NMT_MN)
    tDllCalIssueRequest*        pIssueReq;
#endif

#if NMT_MAX_NODE_ID > 0
    tDllNodeInfo*               pNodeInfo;
    tDllNodeOpParam*            pNodeOpParam;
#endif

#if CONFIG_DLL_DEFERRED_RXFRAME_RELEASE_ASYNC == TRUE
    tFrameInfo* pFrameInfo;
#endif

    switch (pEvent_p->eventType)
    {
        case kEventTypeDllkServFilter:
            pServFilter = (tDllCalAsndServiceIdFilter*)pEvent_p->eventArg.pEventArg;
            ret = dllk_setAsndServiceIdFilter(pServFilter->serviceId,
                                              pServFilter->filter);
            break;

#if defined(CONFIG_INCLUDE_NMT_MN)
        case kEventTypeDllkIssueReq:
            pIssueReq = (tDllCalIssueRequest*)pEvent_p->eventArg.pEventArg;
            ret = dllkcal_issueRequest(pIssueReq->service, pIssueReq->nodeId,
                                       pIssueReq->soaFlag1);
            break;
#endif

#if NMT_MAX_NODE_ID > 0
        case kEventTypeDllkConfigNode:
            pNodeInfo = (tDllNodeInfo*)pEvent_p->eventArg.pEventArg;
            ret = dllk_configNode(pNodeInfo);
            break;

        case kEventTypeDllkAddNode:
            pNodeOpParam = (tDllNodeOpParam*)pEvent_p->eventArg.pEventArg;
            ret = dllk_addNode(pNodeOpParam);
            break;

        case kEventTypeDllkDelNode:
            pNodeOpParam = (tDllNodeOpParam*)pEvent_p->eventArg.pEventArg;
            ret = dllk_deleteNode(pNodeOpParam);
            break;
#endif // NMT_MAX_NODE_ID > 0

        case kEventTypeDllkIdentity:
            pIdentParam = (tDllIdentParam*)pEvent_p->eventArg.pEventArg;
            if (pIdentParam->sizeOfStruct > pEvent_p->eventArgSize)
            {
                pIdentParam->sizeOfStruct = pEvent_p->eventArgSize;
            }
            ret = dllk_setIdentity(pIdentParam);
            break;

        case kEventTypeDllkConfig:
            pConfigParam = (tDllConfigParam*)pEvent_p->eventArg.pEventArg;
            if (pConfigParam->sizeOfStruct > pEvent_p->eventArgSize)
            {
                pConfigParam->sizeOfStruct = pEvent_p->eventArgSize;
            }
            ret = dllk_config(pConfigParam);
            break;

#if CONFIG_DLL_DEFERRED_RXFRAME_RELEASE_ASYNC == TRUE
        case kEventTypeReleaseRxFrame:
            pFrameInfo = (tFrameInfo*)pEvent_p->eventArg.pEventArg;
            ret = dllk_releaseRxFrame(pFrameInfo->frame.pBuffer, pFrameInfo->frameSize);
            if (ret == kErrorOk)
            {
                instance_l.asyncFrameFreed++;

                instance_l.statistics.curRxFrameCount = instance_l.asyncFrameReceived - instance_l.asyncFrameFreed;
            }
            break;
#endif

        default:
            ret = kErrorInvalidEvent;
            break;
    }

    return ret;
}
//------------------------------------------------------------------------------
tOplkError pdok_processRxPdo(tPlkFrame* pFrame_p, UINT frameSize_p)
{
    tOplkError          ret = kErrorOk;
    BYTE                frameData;
    UINT                nodeId;
    tMsgType            msgType;
    tPdoChannel*        pPdoChannel;
    UINT                channelId;

    // check if received RPDO is valid
    frameData = ami_getUint8Le(&pFrame_p->data.pres.flag1);
    if ((frameData & PLK_FRAME_FLAG1_RD) == 0)
    {   // RPDO invalid
        goto Exit;
    }

    // retrieve POWERLINK message type
    msgType = (tMsgType)ami_getUint8Le(&pFrame_p->messageType);
    if (msgType == kMsgTypePreq)
    {   // RPDO is PReq frame
        nodeId = PDO_PREQ_NODE_ID;  // 0x00
    }
    else
    {   // RPDO is PRes frame
        // retrieve node ID
        nodeId = ami_getUint8Le(&pFrame_p->srcNodeId);
    }

    if (pdokInstance_g.fRunning)
    {
        // Get PDO channel reference
        channelId = pdokInstance_g.aRpdoChannelIdLut[nodeId];
        pPdoChannel = &pdokInstance_g.pdoChannels.pRxPdoChannel[channelId];

        if (pPdoChannel->nodeId != nodeId)
        {   // we received a PDO which we aren't interested in
            // discard it
            goto Exit;
        }

        // retrieve PDO version from frame
        frameData = ami_getUint8Le(&pFrame_p->data.pres.pdoVersion);
        if ((pPdoChannel->mappingVersion & PLK_VERSION_MAIN) != (frameData & PLK_VERSION_MAIN))
        {   // PDO versions do not match
            // $$$ raise PDO error
            // terminate processing of this RPDO
            goto Exit;
        }

        // valid RPDO found

        if ((unsigned int)(pPdoChannel->pdoSize + PLK_FRAME_OFFSET_PDO_PAYLOAD) > frameSize_p)
        {   // RPDO is too short
            // $$$ raise PDO error, set Ret
            goto Exit;
        }

        /*
        TRACE("%s() Channel:%d Node:%d MapObjectCnt:%d PdoSize:%d\n",
              __func__, channelId, nodeId, pPdoChannel->mappObjectCount,
              pPdoChannel->pdoSize);
        */

        pdokcal_writeRxPdo(channelId,
                           &pFrame_p->data.pres.aPayload[0],
                           pPdoChannel->pdoSize);
    }

Exit:
#if CONFIG_DLL_DEFERRED_RXFRAME_RELEASE_SYNC != FALSE
    dllk_releaseRxFrame(pFrame_p, frameSize_p);
    // $$$ return value?
#endif

    return ret;
}