diff --git a/dynamixel_base/Makefile b/dynamixel_base/Makefile index d9e8c5ecdd305b5f1f82c4bf880eaf85b18ea66a..ebecf23c994ac721aba9e658010fb9b6b9d0e23a 100755 --- a/dynamixel_base/Makefile +++ b/dynamixel_base/Makefile @@ -3,6 +3,7 @@ COMPILE_OPTS = -mlittle-endian -mthumb -mthumb-interwork COMPILE_OPTS += -Wall -O2 -fno-common +#COMPILE_OPTS += -Wall -g -fno-common COMPILE_OPTS += -ffreestanding -nostdlib COMPILE_OPTS_M4_FPU = -mfloat-abi=hard -mfpu=fpv4-sp-d16 -mcpu=cortex-m4 diff --git a/dynamixel_base/include/dynamixel_master.h b/dynamixel_base/include/dynamixel_master.h index 5bee28d6ed0fe82d2a70620b6ad169b9f08d8258..44bd9237401c30dc4bae3a597ad7806fe998ad38 100644 --- a/dynamixel_base/include/dynamixel_master.h +++ b/dynamixel_base/include/dynamixel_master.h @@ -50,5 +50,6 @@ unsigned char dyn_master_sync_write(TDynamixelMaster *master,unsigned char num,u unsigned char dyn_master_sync_read(TDynamixelMaster *master,unsigned char num,unsigned char *ids,unsigned short int address, unsigned short int length, TWriteData *data); unsigned char dyn_master_bulk_read(TDynamixelMaster *master,unsigned char num,unsigned char *ids,unsigned short int *address, unsigned short int *length, TWriteData *data); unsigned char dyn_master_bulk_write(TDynamixelMaster *master,unsigned char num,unsigned char *ids,unsigned short int *address, unsigned short int *length, TWriteData *data); +unsigned char dyn_master_relay(TDynamixelMaster *master,unsigned char *inst_pkt,unsigned char *status_pkt); #endif diff --git a/dynamixel_base/include/dynamixel_slave.h b/dynamixel_base/include/dynamixel_slave.h index 5e028f8523984638c36c727f64c0d2d57330a233..d281ad1135479ddf58ba2c00edc85145a50f2013 100644 --- a/dynamixel_base/include/dynamixel_slave.h +++ b/dynamixel_base/include/dynamixel_slave.h @@ -26,6 +26,7 @@ typedef struct return_level_t return_level; unsigned char packet_ready; unsigned char received_bytes; + unsigned short int rx_timeout_ms; unsigned short int op_length; unsigned char tx_buffer[MAX_DYN_SLAVE_TX_BUFFER_LEN]; unsigned char rx_buffer[MAX_DYN_SLAVE_RX_BUFFER_LEN]; @@ -48,6 +49,7 @@ typedef struct /* public functions */ void dyn_slave_init(TDynamixelSlave *slave,TComm *dev,unsigned char address,TDynVersion version); +void dyn_slave_set_rx_timeout(TDynamixelSlave *slave,unsigned short int timeout_ms); inline void dyn_slave_set_address(TDynamixelSlave *slave,unsigned char address); inline unsigned char dyn_slave_get_address(TDynamixelSlave *slave); inline void dyn_slave_set_return_delay(TDynamixelSlave *slave,unsigned char delay); diff --git a/dynamixel_base/src/dynamixel_master.c b/dynamixel_base/src/dynamixel_master.c index 02251010c1890f5d994542a0106ef66c89f76880..292a25f12f597d26c9f19780e82bd536c7ed64e7 100644 --- a/dynamixel_base/src/dynamixel_master.c +++ b/dynamixel_base/src/dynamixel_master.c @@ -105,6 +105,7 @@ unsigned char dyn_master_dma_receive_cb(void *dyn_master) { /* enable RX interrupts */ comm_receive_irq(dyn->comm_dev,0); + dyn->packet_ready=0x01; } return 0x00; @@ -326,8 +327,16 @@ unsigned char dyn_master_read_table(TDynamixelMaster *master,unsigned char id,un { if((error=dyn_master_wait_reception(master))==DYN_SUCCESS) { - if(dyn_get_read_status_data(master->rx_buffer,data)!=length)// not enough data - error=DYN_INST_ERROR; + if(master->version==DYN_VER1) + { + if(dyn_get_read_status_data(master->rx_buffer,data)!=length)// not enough data + error=DYN_INST_ERROR; + } + else + { + if(dyn2_get_read_status_data(master->rx_buffer,data)!=length)// not enough data + error=DYN_INST_ERROR; + } } } @@ -484,7 +493,7 @@ unsigned char dyn_master_sync_read(TDynamixelMaster *master,unsigned char num,un if(master->version==DYN_VER2) { dyn2_init_sync_read_packet(master->tx_buffer,num,ids,address,length); - master->rx_num_packets=0x01; + master->rx_num_packets=num; if(master->return_level==no_return) master->rx_no_answer=0x01; else @@ -536,7 +545,7 @@ unsigned char dyn_master_bulk_read(TDynamixelMaster *master,unsigned char num,un } else dyn2_init_bulk_read_packet(master->tx_buffer,num,ids,address,length); - master->rx_num_packets=0x01; + master->rx_num_packets=num; if(master->return_level==no_return) master->rx_no_answer=0x01; else @@ -608,3 +617,30 @@ unsigned char dyn_master_bulk_write(TDynamixelMaster *master,unsigned char num,u return error; } +unsigned char dyn_master_relay(TDynamixelMaster *master,unsigned char *inst_pkt,unsigned char *status_pkt) +{ + unsigned char error; + + dyn2_copy_packet(inst_pkt,master->tx_buffer); + master->rx_num_packets=0x01; + master->rx_no_answer=0x00; + // enable transmission + master->set_tx_mode(); + // send the data + if((error=dyn_master_send(master))!=DYN_SUCCESS) + { + master->set_rx_mode(); + return error; + } + // wait for the transmission to end + if((error=dyn_master_wait_transmission(master))!=DYN_SUCCESS) + { + master->set_rx_mode(); + return error; + } + // wait for the replay within the given timeout + error=dyn_master_wait_reception(master); + dyn2_copy_packet(master->rx_buffer,status_pkt); + + return error; +} diff --git a/dynamixel_base/src/dynamixel_slave.c b/dynamixel_base/src/dynamixel_slave.c index 69fb61323b4b43c8da4b0f75f8d502a0d787cfd8..5c3026a716316f970ec3549e8bbaf1b14f822fb6 100644 --- a/dynamixel_base/src/dynamixel_slave.c +++ b/dynamixel_base/src/dynamixel_slave.c @@ -6,7 +6,7 @@ unsigned char dyn_slave_irq_receive_cb(void *dyn_slave,unsigned char byte) TDynamixelSlave *dyn=(TDynamixelSlave *)dyn_slave; if(dyn->comm_dev->time!=0x00000000) - time_set_timeout(dyn->comm_dev->time,10000); + time_set_timeout(dyn->comm_dev->time,dyn->rx_timeout_ms*1000); switch(dyn->received_bytes) { case 0: if(byte==0xFF) @@ -285,7 +285,7 @@ void dyn_v2_slave_loop(TDynamixelSlave *slave) if(id==slave->address || id==DYN_BROADCAST_ID)// the packet is addressed to this device or it is a broadcast { // check the packet checksum - if(dyn2_check_checksum(slave->rx_buffer)==0xFF)// the incomming packet is okay + if(dyn2_check_checksum(slave->rx_buffer)==0x01)// the incomming packet is okay { // process the packet switch(dyn2_get_instruction(slave->rx_buffer)) @@ -448,6 +448,7 @@ void dyn_slave_init(TDynamixelSlave *slave,TComm *dev,unsigned char address,TDyn slave->return_delay=0x00; slave->return_level=return_all; slave->packet_ready=0x00; + slave->rx_timeout_ms=50; slave->received_bytes=0x00; slave->reg_address=0xFFFF; slave->reg_length=0x0000; @@ -462,6 +463,11 @@ void dyn_slave_init(TDynamixelSlave *slave,TComm *dev,unsigned char address,TDyn comm_receive_irq(slave->comm_dev,0); } +void dyn_slave_set_rx_timeout(TDynamixelSlave *slave,unsigned short int timeout_ms) +{ + slave->rx_timeout_ms=timeout_ms; +} + inline void dyn_slave_set_address(TDynamixelSlave *slave,unsigned char address) { slave->address=address;