237 ** |
237 ** |
238 ** @return |
238 ** @return |
239 **/ |
239 **/ |
240 UNS32 objdictToSDOline (CO_Data* d, UNS8 line) |
240 UNS32 objdictToSDOline (CO_Data* d, UNS8 line) |
241 { |
241 { |
242 UNS32 size = 0; |
242 UNS32 size = SDO_MAX_LENGTH_TRANSFERT; |
243 UNS8 dataType; |
243 UNS8 dataType; |
244 UNS32 errorCode; |
244 UNS32 errorCode; |
245 |
245 |
246 MSG_WAR(0x3A05, "objdict->line index : ", d->transfers[line].index); |
246 MSG_WAR(0x3A05, "objdict->line index : ", d->transfers[line].index); |
247 MSG_WAR(0x3A06, " subIndex : ", d->transfers[line].subIndex); |
247 MSG_WAR(0x3A06, " subIndex : ", d->transfers[line].subIndex); |
248 |
248 |
249 #ifdef SDO_DYNAMIC_BUFFER_ALLOCATION |
249 #ifdef SDO_DYNAMIC_BUFFER_ALLOCATION |
250 //TODO: Read the size of the object. Depending o it put data into data or dynamicData |
250 /* Try to use the static buffer. */ |
251 errorCode = getODentry(d, d->transfers[line].index, |
251 errorCode = getODentry(d, d->transfers[line].index, |
252 d->transfers[line].subIndex, |
252 d->transfers[line].subIndex, |
253 (void *)d->transfers[line].data, |
253 (void *)d->transfers[line].data, |
254 &size, &dataType, 1); |
254 &size, &dataType, 1); |
|
255 if (errorCode == SDOABT_OUT_OF_MEMORY) { |
|
256 /* The static buffer is too small, try again using a dynamic buffer. * |
|
257 * 'size' now contains the real size of the requested object. */ |
|
258 if (size <= SDO_DYNAMIC_BUFFER_ALLOCATION_SIZE) { |
|
259 d->transfers[line].dynamicData = (UNS8 *) malloc(size * sizeof(UNS8)); |
|
260 if (d->transfers[line].dynamicData != NULL) { |
|
261 d->transfers[line].dynamicDataSize = size; |
|
262 errorCode = getODentry(d, |
|
263 d->transfers[line].index, |
|
264 d->transfers[line].subIndex, |
|
265 (void *) d->transfers[line].dynamicData, |
|
266 &d->transfers[line].dynamicDataSize, |
|
267 &dataType, |
|
268 1); |
|
269 } |
|
270 } |
|
271 } |
255 #else //SDO_DYNAMIC_BUFFER_ALLOCATION |
272 #else //SDO_DYNAMIC_BUFFER_ALLOCATION |
256 errorCode = getODentry(d, d->transfers[line].index, |
273 errorCode = getODentry(d, d->transfers[line].index, |
257 d->transfers[line].subIndex, |
274 d->transfers[line].subIndex, |
258 (void *)d->transfers[line].data, |
275 (void *)d->transfers[line].data, |
259 &size, &dataType, 1); |
276 &size, &dataType, 1); |