96 MSG_WAR(0x2A02, " index : ", d->transfers[id].index); |
96 MSG_WAR(0x2A02, " index : ", d->transfers[id].index); |
97 MSG_WAR(0x2A02, " subIndex : ", d->transfers[id].subIndex); |
97 MSG_WAR(0x2A02, " subIndex : ", d->transfers[id].subIndex); |
98 /* Reset timer handler */ |
98 /* Reset timer handler */ |
99 d->transfers[id].timer = TIMER_NONE; |
99 d->transfers[id].timer = TIMER_NONE; |
100 /* Call the user function to inform of the problem.*/ |
100 /* Call the user function to inform of the problem.*/ |
101 (*d->SDOtimeoutError)(id); |
101 (*d->SDOtimeoutError)((UNS8)id); |
102 /* Sending a SDO abort */ |
102 /* Sending a SDO abort */ |
103 sendSDOabort(d, d->transfers[id].whoami, |
103 sendSDOabort(d, d->transfers[id].whoami, |
104 d->transfers[id].index, d->transfers[id].subIndex, SDOABT_TIMED_OUT); |
104 d->transfers[id].index, d->transfers[id].subIndex, SDOABT_TIMED_OUT); |
105 /* Reset the line*/ |
105 /* Reset the line*/ |
106 resetSDOline(d, id); |
106 resetSDOline(d, (UNS8)id); |
107 } |
107 } |
108 |
108 |
109 #define StopSDO_TIMER(id) \ |
109 #define StopSDO_TIMER(id) \ |
110 MSG_WAR(0x3A05, "StopSDO_TIMER for line : ", line);\ |
110 MSG_WAR(0x3A05, "StopSDO_TIMER for line : ", line);\ |
111 d->transfers[id].timer = DelAlarm(d->transfers[id].timer); |
111 d->transfers[id].timer = DelAlarm(d->transfers[id].timer); |
134 UNS32 SDOlineToObjdict (CO_Data* d, UNS8 line) |
134 UNS32 SDOlineToObjdict (CO_Data* d, UNS8 line) |
135 { |
135 { |
136 UNS8 size; |
136 UNS8 size; |
137 UNS32 errorCode; |
137 UNS32 errorCode; |
138 MSG_WAR(0x3A08, "Enter in SDOlineToObjdict ", line); |
138 MSG_WAR(0x3A08, "Enter in SDOlineToObjdict ", line); |
139 size = d->transfers[line].count; |
139 size = (UNS8)d->transfers[line].count; |
140 errorCode = setODentry(d, d->transfers[line].index, d->transfers[line].subIndex, |
140 errorCode = setODentry(d, d->transfers[line].index, d->transfers[line].subIndex, |
141 (void *) d->transfers[line].data, &size, 1); |
141 (void *) d->transfers[line].data, &size, 1); |
142 if (errorCode != OD_SUCCESSFUL) |
142 if (errorCode != OD_SUCCESSFUL) |
143 return errorCode; |
143 return errorCode; |
144 MSG_WAR(0x3A08, "exit of SDOlineToObjdict ", line); |
144 MSG_WAR(0x3A08, "exit of SDOlineToObjdict ", line); |
189 } |
189 } |
190 if ((d->transfers[line].offset + nbBytes) > d->transfers[line].count) { |
190 if ((d->transfers[line].offset + nbBytes) > d->transfers[line].count) { |
191 MSG_ERR(0x1A11,"SDO Size of data too large. Exceed count", nbBytes); |
191 MSG_ERR(0x1A11,"SDO Size of data too large. Exceed count", nbBytes); |
192 return 0xFF; |
192 return 0xFF; |
193 } |
193 } |
194 offset = d->transfers[line].offset; |
194 offset = (UNS8)d->transfers[line].offset; |
195 for (i = 0 ; i < nbBytes ; i++) |
195 for (i = 0 ; i < nbBytes ; i++) |
196 * (data + i) = d->transfers[line].data[offset + i]; |
196 * (data + i) = d->transfers[line].data[offset + i]; |
197 d->transfers[line].offset = d->transfers[line].offset + nbBytes; |
197 d->transfers[line].offset = d->transfers[line].offset + nbBytes; |
198 return 0; |
198 return 0; |
199 } |
199 } |
207 |
207 |
208 if ((d->transfers[line].offset + nbBytes) > SDO_MAX_LENGTH_TRANSFERT) { |
208 if ((d->transfers[line].offset + nbBytes) > SDO_MAX_LENGTH_TRANSFERT) { |
209 MSG_ERR(0x1A15,"SDO Size of data too large. Exceed SDO_MAX_LENGTH_TRANSFERT", nbBytes); |
209 MSG_ERR(0x1A15,"SDO Size of data too large. Exceed SDO_MAX_LENGTH_TRANSFERT", nbBytes); |
210 return 0xFF; |
210 return 0xFF; |
211 } |
211 } |
212 offset = d->transfers[line].offset; |
212 offset = (UNS8)d->transfers[line].offset; |
213 for (i = 0 ; i < nbBytes ; i++) |
213 for (i = 0 ; i < nbBytes ; i++) |
214 d->transfers[line].data[offset + i] = * (data + i); |
214 d->transfers[line].data[offset + i] = * (data + i); |
215 d->transfers[line].offset = d->transfers[line].offset + nbBytes; |
215 d->transfers[line].offset = d->transfers[line].offset + nbBytes; |
216 return 0; |
216 return 0; |
217 } |
217 } |
325 UNS8 getSDOlineRestBytes (CO_Data* d, UNS8 line, UNS8 * nbBytes) |
325 UNS8 getSDOlineRestBytes (CO_Data* d, UNS8 line, UNS8 * nbBytes) |
326 { |
326 { |
327 if (d->transfers[line].count == 0) /* if received initiate SDO protocol with e=0 and s=0 */ |
327 if (d->transfers[line].count == 0) /* if received initiate SDO protocol with e=0 and s=0 */ |
328 * nbBytes = 0; |
328 * nbBytes = 0; |
329 else |
329 else |
330 * nbBytes = d->transfers[line].count - d->transfers[line].offset; |
330 * nbBytes = (UNS8)d->transfers[line].count - (UNS8)d->transfers[line].offset; |
331 return 0; |
331 return 0; |
332 } |
332 } |
333 |
333 |
334 /***************************************************************************/ |
334 /***************************************************************************/ |
335 UNS8 setSDOlineRestBytes (CO_Data* d, UNS8 line, UNS8 nbBytes) |
335 UNS8 setSDOlineRestBytes (CO_Data* d, UNS8 line, UNS8 nbBytes) |
1296 } |
1296 } |
1297 if (d->transfers[line].state != SDO_FINISHED) |
1297 if (d->transfers[line].state != SDO_FINISHED) |
1298 return d->transfers[line].state; |
1298 return d->transfers[line].state; |
1299 |
1299 |
1300 /* Transfert is finished. Put the value in the data. */ |
1300 /* Transfert is finished. Put the value in the data. */ |
1301 * size = d->transfers[line].count; |
1301 * size = (UNS8)d->transfers[line].count; |
1302 for ( i = 0 ; i < *size ; i++) { |
1302 for ( i = 0 ; i < *size ; i++) { |
1303 # ifdef CANOPEN_BIG_ENDIAN |
1303 # ifdef CANOPEN_BIG_ENDIAN |
1304 if (d->transfers[line].dataType != visible_string) |
1304 if (d->transfers[line].dataType != visible_string) |
1305 ( (char *) data)[*size - 1 - i] = d->transfers[line].data[i]; |
1305 ( (char *) data)[*size - 1 - i] = d->transfers[line].data[i]; |
1306 else /* String of bytes. */ |
1306 else /* String of bytes. */ |