src/sdo.c
changeset 32 8afa33692372
parent 31 a82b70738e5c
child 53 73bc47a0db55
--- 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,