1
0
Fork 0

Fixed issue #426: SDO Client block transfer has incorrect handling of early server acknowledgments.

This commit is contained in:
Janez 2023-03-17 22:40:40 +01:00
parent 32d6106047
commit e79a364983

View file

@ -787,11 +787,18 @@ CO_SDO_return_t CO_SDOclientDownload(CO_SDOclient_t *SDO_C,
if (SDO_C->CANrxData[0] == 0xA2) {
/* check number of segments */
if (SDO_C->CANrxData[1] < SDO_C->block_seqno) {
size_t size_before, size_after;
/* NOT all segments transferred successfully.
* Re-transmit data after erroneous segment. */
size_before = CO_fifo_altGetOccupied(&SDO_C->bufFifo);
/* Change alt read pointer after the last successfully
* transmitted data byte (put it back). */
CO_fifo_altBegin(&SDO_C->bufFifo,
(size_t)SDO_C->CANrxData[1] * 7);
size_after = CO_fifo_altGetOccupied(&SDO_C->bufFifo);
SDO_C->finished = false;
/* Make correction of data size actually transferred */
SDO_C->sizeTran -= size_after - size_before;
}
else if (SDO_C->CANrxData[1] > SDO_C->block_seqno) {
/* something strange from server, break transmission */