diff --git a/dynamixel_base/src/dynamixel.c b/dynamixel_base/src/dynamixel.c index e25fdb7d54f046e2f9c10587e61bebd062860c46..8c00138cf8697fb3304a1d00874292afa0fb4109 100755 --- a/dynamixel_base/src/dynamixel.c +++ b/dynamixel_base/src/dynamixel.c @@ -51,10 +51,21 @@ unsigned char dyn_convert_v2_inst_packet(unsigned char *source, unsigned char *d destination[DYN_HEADER_OFF]=0xFF; destination[DYN_HEADER_OFF+1]=0xFF; destination[DYN_ID_OFF]=source[DYN2_ID_OFF]; - destination[DYN_LENGTH_OFF]=source[DYN2_LENGTH_OFF]; + destination[DYN_LENGTH_OFF]=2;//source[DYN2_LENGTH_OFF]; destination[DYN_INST_OFF]=source[DYN2_INST_OFF]; - for(i=0;i<destination[DYN_LENGTH_OFF];i++) - destination[DYN_DATA_OFF+i]=source[DYN2_DATA_OFF+i]; + switch(source[DYN2_INST_OFF]) + { + case DYN_PING: break; + case DYN_READ: destination[DYN_DATA_OFF]=source[DYN2_DATA_OFF]; + destination[DYN_DATA_OFF+1]=source[DYN2_DATA_OFF+2]; + destination[DYN_LENGTH_OFF]+=2; + break; + case DYN_WRITE: destination[DYN_DATA_OFF]=source[DYN2_DATA_OFF]; + for(i=0;i<source[DYN2_DATA_OFF]-5;i++) + destination[DYN_DATA_OFF+1+i]=source[DYN2_DATA_OFF+2+i]; + destination[DYN_LENGTH_OFF]+=source[DYN2_DATA_OFF]-4; + break; + } dyn_set_checksum(destination); return 0x01; } @@ -247,10 +258,10 @@ unsigned char dyn_convert_v2_status_packet(unsigned char *source, unsigned char destination[DYN_HEADER_OFF]=0xFF; destination[DYN_HEADER_OFF+1]=0xFF; destination[DYN_ID_OFF]=source[DYN2_ID_OFF]; - destination[DYN_LENGTH_OFF]=source[DYN2_LENGTH_OFF]; + destination[DYN_LENGTH_OFF]=source[DYN2_LENGTH_OFF]-2; destination[DYN_ERROR_OFF]=source[DYN2_ERROR_OFF]; - for(i=0;i<destination[DYN_LENGTH_OFF];i++) - destination[DYN_DATA_OFF+i]=source[DYN2_DATA_OFF+i]; + for(i=0;i<destination[DYN_LENGTH_OFF]-2;i++) + destination[DYN_DATA_OFF+i]=source[DYN2_DATA_OFF+1+i]; dyn_set_checksum(destination); return 0x01; } diff --git a/dynamixel_base/src/dynamixel2.c b/dynamixel_base/src/dynamixel2.c index dc26232184df175583bddc9fa84c80a00e06d7a5..ce34b1154a505a3db5824391ce6a288b857a49b0 100644 --- a/dynamixel_base/src/dynamixel2.c +++ b/dynamixel_base/src/dynamixel2.c @@ -88,11 +88,25 @@ unsigned char dyn2_convert_v1_inst_packet(unsigned char *source, unsigned char * destination[DYN2_HEADER_OFF+2]=0xFD; destination[DYN2_RESERVED]=0x00; destination[DYN2_ID_OFF]=source[DYN_ID_OFF]; - destination[DYN2_LENGTH_OFF]=source[DYN_LENGTH_OFF]; + destination[DYN2_LENGTH_OFF]=3;//source[DYN_LENGTH_OFF]; destination[DYN2_LENGTH_OFF+1]=0x00; destination[DYN2_INST_OFF]=source[DYN_INST_OFF]; - for(i=0;i<source[DYN_LENGTH_OFF];i++) - destination[DYN2_DATA_OFF+i]=source[DYN_DATA_OFF+i]; + switch(source[DYN_INST_OFF]) + { + case DYN_PING: break; + case DYN_READ: destination[DYN2_DATA_OFF]=source[DYN_DATA_OFF]; + destination[DYN2_DATA_OFF+1]=0x00; + destination[DYN2_DATA_OFF+2]=source[DYN_DATA_OFF+1]; + destination[DYN2_DATA_OFF+3]=0x00; + (*((unsigned short int *)&destination[DYN2_LENGTH_OFF]))+=4; + break; + case DYN_WRITE: destination[DYN2_DATA_OFF]=source[DYN_DATA_OFF]; + destination[DYN2_DATA_OFF+1]=0x00; + for(i=0;i<source[DYN_LENGTH_OFF]-3;i++) + destination[DYN2_DATA_OFF+2+i]=source[DYN_DATA_OFF+1+i]; + (*((unsigned short int *)&destination[DYN2_LENGTH_OFF]))+=source[DYN_LENGTH_OFF]-1; + break; + } dyn2_set_checksum(destination); return 0x01; @@ -417,12 +431,12 @@ unsigned char dyn2_convert_v1_status_packet(TDynInstruction inst,unsigned char * destination[DYN2_HEADER_OFF+2]=0xFD; destination[DYN2_RESERVED]=0x00; destination[DYN2_ID_OFF]=source[DYN_ID_OFF]; - destination[DYN2_LENGTH_OFF]=source[DYN_LENGTH_OFF]; + destination[DYN2_LENGTH_OFF]=source[DYN_LENGTH_OFF]+2; destination[DYN2_LENGTH_OFF+1]=0x00; destination[DYN2_INST_OFF]=inst; destination[DYN2_ERROR_OFF]=source[DYN_ERROR_OFF]; - for(i=0;i<source[DYN_LENGTH_OFF];i++) - destination[DYN2_DATA_OFF+i]=source[DYN_DATA_OFF+i]; + for(i=0;i<destination[DYN2_LENGTH_OFF]-4;i++) + destination[DYN2_DATA_OFF+1+i]=source[DYN_DATA_OFF+i]; dyn2_set_checksum(destination); return 0x01;