/
/**
\brief 这个函数是在背后调用的,它不影响ECAT_Application在同步模式
*
void COE_Main(void)
{
#if SDO_RES_INTERFACE
/* ECATCHANGE_START(V5.01) SDO6*/
UINT8 abort = 0;
if(pSdoPendFunc != NULL)
{
abort = pSdoPendFunc(u16StoreIndex,u8StoreSubindex,u32StoreDataSize,pStoreData,bStoreCompleteAccess);
if(abort != ABORTIDX_WORKING)
{
switch(u8PendingSdo)
{
#if SEGMENTED_SDO_SUPPORTED
case SDO_PENDING_SEG_WRITE:
if(pSdoSegData)
{
/* 分配的缓存将被释放 */
FREEMEM( (UINT16 VARMEM *) pSdoSegData );
pSdoSegData = NULL;
}
#endif
case SDO_PENDING_WRITE:
/*发送SDO的下载响应*/
SDOS_SdoRes(abort, 0, NULL);
break;
case SDO_PENDING_SEG_READ:
case SDO_PENDING_READ:
/* 发送SDO的上传响应 */
SDOS_SdoRes(abort, u32StoreDataSize, pStoreData);
break;
}
u8PendingSdo = 0;
u16StoreIndex = 0;
u8StoreSubindex = 0;
u32StoreDataSize = 0;
pStoreData = NULL;
bStoreCompleteAccess = 0;
pSdoPendFunc = NULL;
}
}
/* ECATCHANGE_END(V5.01) SDO6*/
#endif
}
/** @} */
#endif //#if COE_SUPPORTED
/
/**
\param abort SDO的接入结果
\param objLength 对象的总长度
\param pData 指向邮箱缓存的指针
\brief 这个函数被调用当SDO响应应该被发送的时候
*
void SDOS_SdoRes(UINT8 abort, UINT32 objLength, UINT16 MBXMEM *pData)
{
UINT16 dataSize = 0;
if (bSdoInWork)
{
/* SDO-Response is expected */
UINT8 command = pSdoResStored->SdoHeader.Sdo[SDOHEADER_COMMANDOFFSET] & SDOHEADER_COMMAND;
UINT8 completeAccess = pSdoResStored->SdoHeader.Sdo[SDOHEADER_COMMANDOFFSET] & SDOHEADER_COMPLETEACCESS;
if ( command == SDOSERVICE_INITIATEUPLOADREQ )
{
#if SEGMENTED_SDO_SUPPORTED
/* dataSize contains the available size in one mailbox */
dataSize = u16SendMbxSize - MBX_HEADER_SIZE - UPLOAD_NORM_RES_SIZE;
if ( dataSize < objLength )
{
/* Segmented Upload, the variables for the segmented transfer should be initialized */
bSdoSegFollows = TRUE;
bSdoSegLastToggle = 1;
#if COMPLETE_ACCESS_SUPPORTED
bSdoSegAccess = completeAccess;
#endif
nSdoSegCompleteSize = objLength;
nSdoSegService = SDOSERVICE_UPLOADSEGMENTREQ;
pSdoSegData = (UINT16 VARMEM *) pData;
/* the first segment shall be copied */
MBXMEMCPY(((TINITSDOUPLOADNORMRESMBX MBXMEM *) pSdoResStored)->Data, pData, dataSize);
/* ECATCHANGE_START(V5.01) SDO6*/
nSdoSegBytesToHandle = dataSize;
/* ECATCHANGE_END(V5.01) SDO6*/
}
else
#endif
if ( (objLength <= 4) && (objLength > 0) )
{
/* Expedited response */
if ( pData != ((TINITSDOUPLOADEXPRESMBX MBXMEM *) pSdoResStored)->Data )
{
/* the data is not in the response buffer yet, it shall be copied */
MBXMEMCPY(((TINITSDOUPLOADEXPRESMBX MBXMEM *) pSdoResStored)->Data, pData, objLength);
}
}
else
{
/* Normal response */
if ( pData != ((TINITSDOUPLOADNORMRESMBX MBXMEM *) pSdoResStored)->Data )
{
/* the data is not in the response buffer yet, it shall be copied */
MBXMEMCPY(((TINITSDOUPLOADNORMRESMBX MBXMEM *) pSdoResStored)->Data, pData, objLength);
}
}
}
/* SDO access is finished, send the response */
bSdoInWork = FALSE;
SdoRes(abort, command, completeAccess, dataSize, objLength, pSdoResStored);
}
}
#endif // SDO_RES_INTERFACE