//------------------------------------------------------------------------------ static tOplkError processSyncCn(tNmtState nmtState_p, BOOL fReadyFlag_p) { tOplkError ret = kErrorOk; tPlkFrame * pTxFrame; tEdrvTxBuffer* pTxBuffer; tFrameInfo FrameInfo; UINT nextTxBufferOffset = dllkInstance_g.curTxBufferOffsetCycle ^ 1; // local node is CN, update only the PRes pTxBuffer = &dllkInstance_g.pTxBuffer[DLLK_TXFRAME_PRES + nextTxBufferOffset]; if (pTxBuffer->pBuffer != NULL) { // PRes does exist pTxFrame = (tPlkFrame*)pTxBuffer->pBuffer; if (nmtState_p != kNmtCsOperational) fReadyFlag_p = FALSE; FrameInfo.frame.pBuffer = pTxFrame; FrameInfo.frameSize = pTxBuffer->txFrameSize; ret = dllkframe_processTpdo(&FrameInfo, fReadyFlag_p); if (ret != kErrorOk) return ret; // BENCHMARK_MOD_02_TOGGLE(7); ret = dllkframe_updateFramePres(pTxBuffer, nmtState_p); if (ret != kErrorOk) return ret; // switch to next cycle dllkInstance_g.curTxBufferOffsetCycle = (UINT8)nextTxBufferOffset; } return ret; }
//------------------------------------------------------------------------------ tOplkError dllknode_setupSyncPhase(tNmtState nmtState_p, BOOL fReadyFlag_p, UINT nextTxBufferOffset_p, UINT32* pNextTimeOffsetNs_p, UINT* pIndex_p) { tOplkError ret = kErrorOk; BYTE* pCnNodeId; UINT32 accFrameLenNs = 0; tPlkFrame* pTxFrame; tEdrvTxBuffer* pTxBuffer; tFrameInfo FrameInfo; tDllkNodeInfo* pIntNodeInfo; BYTE flag1; // calculate WaitSoCPReq delay if (dllkInstance_g.dllConfigParam.waitSocPreq != 0) { *pNextTimeOffsetNs_p = dllkInstance_g.dllConfigParam.waitSocPreq + C_DLL_T_PREAMBLE + C_DLL_T_MIN_FRAME + C_DLL_T_IFG; } else { accFrameLenNs = C_DLL_T_PREAMBLE + C_DLL_T_MIN_FRAME + C_DLL_T_IFG; } pCnNodeId = &dllkInstance_g.aCnNodeIdList[nextTxBufferOffset_p][0]; if (nmtState_p != kNmtMsOperational) fReadyFlag_p = FALSE; pIntNodeInfo = dllkInstance_g.pFirstNodeInfo; while (pIntNodeInfo != NULL) { pTxBuffer = &pIntNodeInfo->pPreqTxBuffer[nextTxBufferOffset_p]; if ((pTxBuffer != NULL) && (pTxBuffer->pBuffer != NULL)) { // PReq does exist pTxFrame = (tPlkFrame*)pTxBuffer->pBuffer; flag1 = pIntNodeInfo->soaFlag1 & PLK_FRAME_FLAG1_EA; // $$$ d.k. set PLK_FRAME_FLAG1_MS if necessary // update frame (Flag1) ami_setUint8Le(&pTxFrame->data.preq.flag1, flag1); // process TPDO FrameInfo.pFrame = pTxFrame; FrameInfo.frameSize = pTxBuffer->txFrameSize; ret = dllkframe_processTpdo(&FrameInfo, fReadyFlag_p); if (ret != kErrorOk) return ret; pTxBuffer->timeOffsetNs = *pNextTimeOffsetNs_p; dllkInstance_g.ppTxBufferList[*pIndex_p] = pTxBuffer; (*pIndex_p)++; if (pTxBuffer == &dllkInstance_g.pTxBuffer[DLLK_TXFRAME_PRES + nextTxBufferOffset_p]) { // PRes of MN will be sent // update NMT state ami_setUint8Le(&pTxFrame->data.pres.nmtStatus, (BYTE) nmtState_p); *pNextTimeOffsetNs_p = pIntNodeInfo->presTimeoutNs; { tDllkNodeInfo* pIntPrcNodeInfo; pIntPrcNodeInfo = dllkInstance_g.pFirstPrcNodeInfo; while (pIntPrcNodeInfo != NULL) { *pCnNodeId = (BYTE)pIntPrcNodeInfo->nodeId; pCnNodeId++; *pNextTimeOffsetNs_p = pIntNodeInfo->presTimeoutNs; pIntPrcNodeInfo = pIntPrcNodeInfo->pNextNodeInfo; } *pCnNodeId = C_ADR_BROADCAST; // mark this entry as PRC slot finished pCnNodeId++; } } else { // PReq to CN *pCnNodeId = (BYTE)pIntNodeInfo->nodeId; pCnNodeId++; *pNextTimeOffsetNs_p = pIntNodeInfo->presTimeoutNs; } if (*pNextTimeOffsetNs_p == 0) { // add SoC frame length accFrameLenNs += C_DLL_T_PREAMBLE + (pTxBuffer->txFrameSize * C_DLL_T_BITTIME) + C_DLL_T_IFG; } else { *pNextTimeOffsetNs_p += accFrameLenNs; accFrameLenNs = 0; } } pIntNodeInfo = pIntNodeInfo->pNextNodeInfo; } *pCnNodeId = C_ADR_INVALID; // mark last entry in node-ID list return ret; }