现在的位置: 首页 > 综合 > 正文

SdoRes

2014年03月29日 ⁄ 综合 ⁄ 共 2831字 ⁄ 字号 评论关闭
/////////////////////////////////////////////////////////////////////////////////////////
/**
 \param    abort                 SDO接近的结果
 \param    command		 SDO的命令索引
 \param    completeAccess        指示是否完成接近是需要的
 \param    dataSize              响应对象数据的大小
 \param    objLength             对象的完成的大小
 \param     pSdoRes              邮箱缓存的指针

 \brief    这个函数被调用当SDO响应应该被发送
*////////////////////////////////////////////////////////////////////////////////////////

void SdoRes(UINT8 abort, UINT8 command, UINT8 completeAccess, UINT16 dataSize, UINT32 objLength, TINITSDOMBX MBXMEM *pSdoRes)
{
    /* 当上传响应,toggle bit 应该被覆盖 */
    if ((command != SDOSERVICE_UPLOADSEGMENTREQ) && (command != SDOSERVICE_DOWNLOADSEGMENTREQ))
    {
        pSdoRes->SdoHeader.Sdo[SDOHEADER_COMMANDOFFSET] = 0;
    }
    if ( abort == 0 )
    {
        /* SDO-Download or SDO-Upload 成功, 产生SDO和CoE的数据包头 */
        pSdoRes->CoeHeader &= ~COEHEADER_COESERVICEMASK;
        pSdoRes->CoeHeader |= ((UINT16)COESERVICE_SDORESPONSE) << COEHEADER_COESERVICESHIFT;
        if ( command == SDOSERVICE_INITIATEUPLOADREQ )
        {
            // HBu 06.02.06: Complete Access Bit in the SDO-Upload-Response too */
            if ( (objLength <= 4) && (objLength > 0) )
            {
                /* 快速上传响应 */
                pSdoRes->MbxHeader.Length             =         EXPEDITED_FRAME_SIZE;
                pSdoRes->SdoHeader.Sdo[SDOHEADER_COMMANDOFFSET]    |=     SDOHEADER_SIZEINDICATOR     |
                                                                                        SDOHEADER_TRANSFERTYPE        |
                                                                                        completeAccess |
                                                                                        ((MAX_EXPEDITED_DATA - ((UINT8)objLength)) << SDOHEADERSHIFT_DATASETSIZE) |
                                                                                        SDOSERVICE_INITIATEUPLOADRES;
            }
            else
            {
                /* 普通和分段上传响应 */
#if SEGMENTED_SDO_SUPPORTED
/*ECATCHANGE_START(V5.01) SDO3*/
                if (((dataSize < MBX_HEADER_SIZE + UPLOAD_NORM_RES_SIZE)) || (objLength > (UINT32)(dataSize - MBX_HEADER_SIZE - UPLOAD_NORM_RES_SIZE)) )
/*ECATCHANGE_END(V5.01) SDO3*/
                {
                    pSdoRes->MbxHeader.Length         =         SWAPWORD(UPLOAD_NORM_RES_SIZE+dataSize);
                }
                else
#endif
                {
                    pSdoRes->MbxHeader.Length         =         SWAPWORD(UPLOAD_NORM_RES_SIZE+((UINT16)objLength));
                }
                   ((TINITSDOUPLOADNORMRESMBX MBXMEM *) pSdoRes)->CompleteSize[0] = SWAPWORD((UINT16)objLength);
                   ((TINITSDOUPLOADNORMRESMBX MBXMEM *) pSdoRes)->CompleteSize[1] = SWAPWORD((UINT16)(objLength>>16));
                pSdoRes->SdoHeader.Sdo[SDOHEADER_COMMANDOFFSET]    |=     SDOHEADER_SIZEINDICATOR     |
                                                                                        completeAccess |
                                                                                        SDOSERVICE_INITIATEUPLOADRES;
            }
        }
        /* 对于分段响应,命令是错误的在响应当中 */
        else if ( command == SDOSERVICE_DOWNLOADSEGMENTREQ )
        {
            /* Download segmented response */
            pSdoRes->MbxHeader.Length         = DOWNLOAD_NORM_RES_SIZE;
            pSdoRes->SdoHeader.Sdo[SDOHEADER_COMMANDOFFSET]    |= SDOSERVICE_DOWNLOADSEGMENTRES;
      }
        else if ( command != SDOSERVICE_UPLOADSEGMENTREQ )
        {
            /* Download response */
            pSdoRes->MbxHeader.Length         = DOWNLOAD_NORM_RES_SIZE;
            pSdoRes->SdoHeader.Sdo[SDOHEADER_COMMANDOFFSET]    |= SDOSERVICE_INITIATEDOWNLOADRES;
        }
    }
    else
    {
        /* 产生SDO-Abort-产生 */
        pSdoRes->MbxHeader.Length         = ABORT_NORM_RES_SIZE;
        pSdoRes->CoeHeader &= ~COEHEADER_COESERVICEMASK;
        pSdoRes->CoeHeader |= ((UINT16)COESERVICE_SDOREQUEST) << COEHEADER_COESERVICESHIFT;
        pSdoRes->SdoHeader.Sdo[SDOHEADER_COMMANDOFFSET]    = SDOSERVICE_ABORTTRANSFER;
        ((TABORTSDOTRANSFERREQMBX MBXMEM *) pSdoRes)->AbortCode = SWAPDWORD(cAbortCode[abort]);
    }

    // HBu 02.05.06: 如果CoE响应,不应该被发送,因为发送邮箱是满的,它应该被存储
    if (MBX_MailboxSendReq((TMBX MBXMEM *) pSdoRes, COE_SERVICE) != 0)
    {
        /* 我们存储CoE邮箱服务应该晚一点发送它,当邮箱被读
        pCoeSendStored = (TMBX MBXMEM *) pSdoRes;
    }
}

抱歉!评论已关闭.