src/sdo.c
changeset 145 e747d2e26af0
parent 87 074126d73842
child 149 fe50ada8020b
equal deleted inserted replaced
144:3ebf16150b2e 145:e747d2e26af0
    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. */