//------------------------------------------------------------------------------ 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; }