SdoRes

[cpp]  view plain  copy
  1. /  
  2. /** 
  3.  \param    abort                 SDO接近的结果 
  4.  \param    command       SDO的命令索引 
  5.  \param    completeAccess        指示是否完成接近是需要的 
  6.  \param    dataSize              响应对象数据的大小 
  7.  \param    objLength             对象的完成的大小 
  8.  \param     pSdoRes              邮箱缓存的指针 
  9.  
  10.  \brief    这个函数被调用当SDO响应应该被发送 
  11. *////  
  12.   
  13. void SdoRes(UINT8 abort, UINT8 command, UINT8 completeAccess, UINT16 dataSize, UINT32 objLength, TINITSDOMBX MBXMEM *pSdoRes)  
  14. {  
  15.     /* 当上传响应,toggle bit 应该被覆盖 */  
  16.     if ((command != SDOSERVICE_UPLOADSEGMENTREQ) && (command != SDOSERVICE_DOWNLOADSEGMENTREQ))  
  17.     {  
  18.         pSdoRes->SdoHeader.Sdo[SDOHEADER_COMMANDOFFSET] = 0;  
  19.     }  
  20.     if ( abort == 0 )  
  21.     {  
  22.         /* SDO-Download or SDO-Upload 成功, 产生SDO和CoE的数据包头 */  
  23.         pSdoRes->CoeHeader &= ~COEHEADER_COESERVICEMASK;  
  24.         pSdoRes->CoeHeader |= ((UINT16)COESERVICE_SDORESPONSE) << COEHEADER_COESERVICESHIFT;  
  25.         if ( command == SDOSERVICE_INITIATEUPLOADREQ )  
  26.         {  
  27.             // HBu 06.02.06: Complete Access Bit in the SDO-Upload-Response too */  
  28.             if ( (objLength <= 4) && (objLength > 0) )  
  29.             {  
  30.                 /* 快速上传响应 */  
  31.                 pSdoRes->MbxHeader.Length             =         EXPEDITED_FRAME_SIZE;  
  32.                 pSdoRes->SdoHeader.Sdo[SDOHEADER_COMMANDOFFSET]    |=     SDOHEADER_SIZEINDICATOR     |  
  33.                                                                                         SDOHEADER_TRANSFERTYPE        |  
  34.                                                                                         completeAccess |  
  35.                                                                                         ((MAX_EXPEDITED_DATA - ((UINT8)objLength)) << SDOHEADERSHIFT_DATASETSIZE) |  
  36.                                                                                         SDOSERVICE_INITIATEUPLOADRES;  
  37.             }  
  38.             else  
  39.             {  
  40.                 /* 普通和分段上传响应 */  
  41. #if SEGMENTED_SDO_SUPPORTED  
  42. /*ECATCHANGE_START(V5.01) SDO3*/  
  43.                 if (((dataSize < MBX_HEADER_SIZE + UPLOAD_NORM_RES_SIZE)) || (objLength > (UINT32)(dataSize - MBX_HEADER_SIZE - UPLOAD_NORM_RES_SIZE)) )  
  44. /*ECATCHANGE_END(V5.01) SDO3*/  
  45.                 {  
  46.                     pSdoRes->MbxHeader.Length         =         SWAPWORD(UPLOAD_NORM_RES_SIZE+dataSize);  
  47.                 }  
  48.                 else  
  49. #endif  
  50.                 {  
  51.                     pSdoRes->MbxHeader.Length         =         SWAPWORD(UPLOAD_NORM_RES_SIZE+((UINT16)objLength));  
  52.                 }  
  53.                    ((TINITSDOUPLOADNORMRESMBX MBXMEM *) pSdoRes)->CompleteSize[0] = SWAPWORD((UINT16)objLength);  
  54.                    ((TINITSDOUPLOADNORMRESMBX MBXMEM *) pSdoRes)->CompleteSize[1] = SWAPWORD((UINT16)(objLength>>16));  
  55.                 pSdoRes->SdoHeader.Sdo[SDOHEADER_COMMANDOFFSET]    |=     SDOHEADER_SIZEINDICATOR     |  
  56.                                                                                         completeAccess |  
  57.                                                                                         SDOSERVICE_INITIATEUPLOADRES;  
  58.             }  
  59.         }  
  60.         /* 对于分段响应,命令是错误的在响应当中 */  
  61.         else if ( command == SDOSERVICE_DOWNLOADSEGMENTREQ )  
  62.         {  
  63.             /* Download segmented response */  
  64.             pSdoRes->MbxHeader.Length         = DOWNLOAD_NORM_RES_SIZE;  
  65.             pSdoRes->SdoHeader.Sdo[SDOHEADER_COMMANDOFFSET]    |= SDOSERVICE_DOWNLOADSEGMENTRES;  
  66.       }  
  67.         else if ( command != SDOSERVICE_UPLOADSEGMENTREQ )  
  68.         {  
  69.             /* Download response */  
  70.             pSdoRes->MbxHeader.Length         = DOWNLOAD_NORM_RES_SIZE;  
  71.             pSdoRes->SdoHeader.Sdo[SDOHEADER_COMMANDOFFSET]    |= SDOSERVICE_INITIATEDOWNLOADRES;  
  72.         }  
  73.     }  
  74.     else  
  75.     {  
  76.         /* 产生SDO-Abort-产生 */  
  77.         pSdoRes->MbxHeader.Length         = ABORT_NORM_RES_SIZE;  
  78.         pSdoRes->CoeHeader &= ~COEHEADER_COESERVICEMASK;  
  79.         pSdoRes->CoeHeader |= ((UINT16)COESERVICE_SDOREQUEST) << COEHEADER_COESERVICESHIFT;  
  80.         pSdoRes->SdoHeader.Sdo[SDOHEADER_COMMANDOFFSET]    = SDOSERVICE_ABORTTRANSFER;  
  81.         ((TABORTSDOTRANSFERREQMBX MBXMEM *) pSdoRes)->AbortCode = SWAPDWORD(cAbortCode[abort]);  
  82.     }  
  83.   
  84.     // HBu 02.05.06: 如果CoE响应,不应该被发送,因为发送邮箱是满的,它应该被存储  
  85.     if (MBX_MailboxSendReq((TMBX MBXMEM *) pSdoRes, COE_SERVICE) != 0)  
  86.     {  
  87.         /* 我们存储CoE邮箱服务应该晚一点发送它,当邮箱被读  
  88.         pCoeSendStored = (TMBX MBXMEM *) pSdoRes;  
  89.     }  
  90. }  
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值