diff -r a82b70738e5c -r 8afa33692372 src/sdo.c --- a/src/sdo.c Fri Jun 16 14:24:59 2006 +0200 +++ b/src/sdo.c Fri Jun 16 14:44:23 2006 +0200 @@ -248,6 +248,7 @@ d->transfers[line].count = 0; d->transfers[line].offset = 0; d->transfers[line].dataType = 0; + d->transfers[line].Callback = NULL; return 0; } @@ -606,6 +607,8 @@ // The code is safe for the case e=s=0 in initiate frame. StopSDO_TIMER(line) d->transfers[line].state = SDO_FINISHED; + if(d->transfers[line].Callback) (*d->transfers[line].Callback)(d,nodeId); + MSG_WAR(0x3A77, "SDO. End of upload from node : ", nodeId); } else { // more segments to receive @@ -722,6 +725,7 @@ MSG_WAR(0x3A87, "SDO End download. segment response received. OK. from nodeId", nodeId); StopSDO_TIMER(line) d->transfers[line].state = SDO_FINISHED; + if(d->transfers[line].Callback) (*d->transfers[line].Callback)(d,nodeId); return 0x00; } // At least one transfer to send. @@ -861,6 +865,7 @@ StopSDO_TIMER(line) d->transfers[line].count = nbBytes; d->transfers[line].state = SDO_FINISHED; + if(d->transfers[line].Callback) (*d->transfers[line].Callback)(d,nodeId); return 0; } else { // So, if it is not an expedited transfert @@ -966,6 +971,7 @@ MSG_WAR(0x3AA6, "SDO End download expedited. Response received. from nodeId", nodeId); StopSDO_TIMER(line) d->transfers[line].state = SDO_FINISHED; + if(d->transfers[line].Callback) (*d->transfers[line].Callback)(d,nodeId); return 0x00; } if (nbBytes > 7) { @@ -1038,8 +1044,8 @@ } /*******************************************************************)******/ -UNS8 writeNetworkDict (CO_Data* d, UNS8 nodeId, UNS16 index, - UNS8 subIndex, UNS8 count, UNS8 dataType, void *data) +inline UNS8 _writeNetworkDict (CO_Data* d, UNS8 nodeId, UNS16 index, + UNS8 subIndex, UNS8 count, UNS8 dataType, void *data, SDOCallback_t Callback) { UNS8 err; UNS8 SDOfound = 0; @@ -1141,14 +1147,25 @@ // release the line resetSDOline(d, line); return 0xFF; - } + } + d->transfers[line].Callback = Callback; return 0; } - - - -/***************************************************************************/ -UNS8 readNetworkDict (CO_Data* d, UNS8 nodeId, UNS16 index, UNS8 subIndex, UNS8 dataType) +UNS8 writeNetworkDict (CO_Data* d, UNS8 nodeId, UNS16 index, + UNS8 subIndex, UNS8 count, UNS8 dataType, void *data) +{ + return _writeNetworkDict (d, nodeId, index, subIndex, count, dataType, data, NULL); +} + +UNS8 writeNetworkDictCallBack (CO_Data* d, UNS8 nodeId, UNS16 index, + UNS8 subIndex, UNS8 count, UNS8 dataType, void *data, SDOCallback_t Callback) +{ + return _writeNetworkDict (d, nodeId, index, subIndex, count, dataType, data, Callback); +} + + +/***************************************************************************/ +UNS8 _readNetworkDict (CO_Data* d, UNS8 nodeId, UNS16 index, UNS8 subIndex, UNS8 dataType, SDOCallback_t Callback) { UNS8 err; UNS8 SDOfound = 0; @@ -1229,9 +1246,19 @@ resetSDOline(d, line); return 0xFF; } + d->transfers[line].Callback = Callback; return 0; } +UNS8 readNetworkDict (CO_Data* d, UNS8 nodeId, UNS16 index, UNS8 subIndex, UNS8 dataType) +{ + return _readNetworkDict (d, nodeId, index, subIndex, dataType, NULL); +} + +UNS8 readNetworkDictCallback (CO_Data* d, UNS8 nodeId, UNS16 index, UNS8 subIndex, UNS8 dataType, SDOCallback_t Callback) +{ + return _readNetworkDict (d, nodeId, index, subIndex, dataType, Callback); +} /***************************************************************************/ UNS8 getReadResultNetworkDict (CO_Data* d, UNS8 nodeId, void* data, UNS8 *size,