From d414f57003d04136adf8d5c616003141034f4dc6 Mon Sep 17 00:00:00 2001 From: Sergi Hernandez Juan <shernand@iri.upc.edu> Date: Sat, 8 Jun 2024 13:18:52 +0200 Subject: [PATCH] Used the same solution to optimize the operation of the dynamixel master. --- dynamixel_base/include/dynamixel_master.h | 22 +-- dynamixel_base/src/dynamixel_master.c | 164 ++++++++-------------- dynamixel_base/src/dynamixel_slave.c | 15 -- 3 files changed, 59 insertions(+), 142 deletions(-) diff --git a/dynamixel_base/include/dynamixel_master.h b/dynamixel_base/include/dynamixel_master.h index 740162c..8edda63 100644 --- a/dynamixel_base/include/dynamixel_master.h +++ b/dynamixel_base/include/dynamixel_master.h @@ -58,21 +58,11 @@ typedef struct * */ unsigned char packet_ready; - /** - * \brief - * - */ - unsigned char rx_dma_mode; /** * \brief * */ volatile unsigned char tx_done; - /** - * \brief - * - */ - unsigned short int sync_bulk_address; /** * \brief * @@ -112,17 +102,7 @@ typedef struct * \brief * */ - unsigned char (*tx_irq)(void *hal_dev, const unsigned char *data, unsigned short int length); - /** - * \brief - * - */ - unsigned char (*rx_irq)(void *hal_dev, const unsigned char *data, unsigned short int length); - /** - * \brief - * - */ - unsigned char (*abort_irq)(void *hal_dev); + unsigned short int rx_length; /** * \brief * diff --git a/dynamixel_base/src/dynamixel_master.c b/dynamixel_base/src/dynamixel_master.c index 3dbd2b6..0e7ead5 100644 --- a/dynamixel_base/src/dynamixel_master.c +++ b/dynamixel_base/src/dynamixel_master.c @@ -3,64 +3,8 @@ /* private functions */ void dyn_master_receive_cb(TDynamixelMaster *master) { - unsigned short int length; - if(master!=0x00000000) - { - if(master->rx_dma_mode==0x01) - { - master->rx_dma_mode=0x00; - master->rx_num_packets--; - if(master->rx_num_packets==0x00) - { - time_cancel_timeout(&master->time); - master->sync_bulk_address=0x0000; - master->packet_ready=0x01; - } - else - { - if(master->version==DYN_VER1) - { - if(master->rx_num_packets==0x01) - master->sync_bulk_address=0x0000; - master->rx_irq(master->hal_dev,&master->rx_buffer[master->sync_bulk_address],4); - } - else - { - if(master->rx_num_packets==0x01) - master->sync_bulk_address=0x0000; - master->rx_irq(master->hal_dev,&master->rx_buffer[master->sync_bulk_address],7); - } - } - } - else - { - master->rx_dma_mode=0x01; - if(master->version==DYN_VER1) - { - if(master->rx_buffer[0]!=0xFF) return; - if(master->rx_buffer[1]!=0xFF) return; - if(master->hal_dev!=0x00000000) - { - length=master->rx_buffer[master->sync_bulk_address+3]; - master->rx_dma(master->hal_dev,&master->rx_buffer[master->sync_bulk_address+4],length); - master->sync_bulk_address+=length+4; - } - } - else - { - if(master->rx_buffer[0]!=0xFF) return; - if(master->rx_buffer[1]!=0xFF) return; - if(master->rx_buffer[2]!=0xFD) return; - if(master->hal_dev!=0x00000000) - { - length=master->rx_buffer[master->sync_bulk_address+5]+(master->rx_buffer[master->sync_bulk_address+6]<<8); - master->rx_dma(master->hal_dev,&master->rx_buffer[master->sync_bulk_address+7],length); - master->sync_bulk_address+=length+7; - } - } - } - } + master->packet_ready=0x01; } void dyn_master_send_cb(TDynamixelMaster *master) @@ -71,14 +15,7 @@ void dyn_master_send_cb(TDynamixelMaster *master) if(master->rx_no_answer) master->rx_no_answer=0x00; else - { - if(master->version==DYN_VER1) - master->rx_irq(master->hal_dev,master->rx_buffer,4); - else - { - master->rx_irq(master->hal_dev,master->rx_buffer,7); - } - } + master->rx_dma(master->hal_dev,master->rx_buffer,master->rx_length); master->tx_done=0x01; } } @@ -103,16 +40,6 @@ void dummy_dyn_master_disable_power(void) } -unsigned char dummy_dyn_master_tx_irq(void *hal_dev, const unsigned char *data, unsigned short int length) -{ - return DYN_SUCCESS; -} - -unsigned char dummy_dyn_master_rx_irq(void *hal_dev, const unsigned char *data, unsigned short int length) -{ - return DYN_SUCCESS; -} - unsigned char dummy_dyn_master_tx_dma(void *hal_dev, const unsigned char *data, unsigned short int length) { return DYN_SUCCESS; @@ -123,11 +50,6 @@ unsigned char dummy_dyn_master_rx_dma(void *hal_dev, const unsigned char *data, return DYN_SUCCESS; } -unsigned char dummy_dyn_master_abort_irq(void *hal_dev) -{ - return DYN_SUCCESS; -} - unsigned char dummy_dyn_master_abort_dma(void *hal_dev) { return DYN_SUCCESS; @@ -200,7 +122,6 @@ unsigned char dyn_master_wait_reception(TDynamixelMaster *master) if(time_is_timeout(&master->time)) { /* cancel any IRQ or DMA reception */ - master->abort_irq(master->hal_dev); master->abort_dma(master->hal_dev); return DYN_TIMEOUT; } @@ -221,7 +142,6 @@ unsigned char dyn_master_is_reception_done(TDynamixelMaster *master) if(time_is_timeout(&master->time)) { /* cancel any IRQ or DMA reception */ - master->abort_irq(master->hal_dev); master->abort_dma(master->hal_dev); return DYN_TIMEOUT; } @@ -246,10 +166,15 @@ unsigned char dyn_master_start_read_table(TDynamixelMaster *master,unsigned char { // generate the read packet for the desired device if(master->version==DYN_VER1) + { dyn_init_read_packet(master->tx_buffer,id,address,length); + master->rx_length=length+4; + } else + { dyn2_init_read_packet(master->tx_buffer,id,address,length); - master->rx_num_packets=0x01; + master->rx_length=length+7; + } if(master->return_level==no_return || id==DYN_BROADCAST_ID) master->rx_no_answer=0x01; else @@ -342,10 +267,15 @@ unsigned char dyn_master_start_write_table(TDynamixelMaster *master,unsigned cha { // generate the read packet for the desired device if(master->version==DYN_VER1) + { dyn_init_write_packet(master->tx_buffer,id,address,length,data); + master->rx_length=6; + } else + { dyn2_init_write_packet(master->tx_buffer,id,address,length,data); - master->rx_num_packets=0x01; + master->rx_length=11; + } if(master->return_level==return_all && id!=DYN_BROADCAST_ID) master->rx_no_answer=0x00; else @@ -421,8 +351,7 @@ unsigned char dyn_master_start_sync_write(TDynamixelMaster *master,unsigned char dyn_init_sync_write_packet(master->tx_buffer,num,ids,address,length,data); else dyn2_init_sync_write_packet(master->tx_buffer,num,ids,address,length,data); - master->rx_num_packets=0x01; - master->rx_no_answer=0x00; + master->rx_no_answer=0x01; // enable transmission master->set_tx_mode(); // send the data @@ -458,7 +387,7 @@ unsigned char dyn_master_start_sync_read(TDynamixelMaster *master,unsigned char if(master->version==DYN_VER2) { dyn2_init_sync_read_packet(master->tx_buffer,num,ids,address,length); - master->rx_num_packets=num; + master->rx_length=(length+7)*num; if(master->return_level==no_return) master->rx_no_answer=0x01; else @@ -545,8 +474,8 @@ unsigned char dyn_master_start_bulk_write(TDynamixelMaster *master,unsigned char if(master->version==DYN_VER2) { dyn2_init_bulk_write_packet(master->tx_buffer,num,ids,address,length,data); - master->rx_num_packets=0x01; - master->rx_no_answer=0x00; + master->rx_length=0; + master->rx_no_answer=0x01; // enable transmission master->set_tx_mode(); // send the data @@ -586,16 +515,22 @@ unsigned char dyn_master_start_bulk_read(TDynamixelMaster *master,unsigned char // generate the read packet for the desired device if(master->version==DYN_VER1) { + master->rx_length=0; for(i=0;i<num;i++) { ver1_address[i]=address[i]; ver1_length[i]=length[i]; + master->rx_length=(length[i]+4); } dyn_init_bulk_read_packet(master->tx_buffer,num,ids,ver1_address,ver1_length); } else + { dyn2_init_bulk_read_packet(master->tx_buffer,num,ids,address,length); - master->rx_num_packets=num; + master->rx_length=0; + for(i=0;i<num;i++) + master->rx_length=(length[i]+7); + } if(master->return_level==no_return) master->rx_no_answer=0x01; else @@ -688,16 +623,12 @@ void dyn_master_init(TDynamixelMaster *master,void *hal_dev,TDynVersion version) { master->hal_dev=hal_dev; master->version=version; - master->rx_dma_mode=0x00; master->tx_done=0x01; /* initialize the internal callbacks */ master->set_tx_mode=dummy_dyn_master_set_tx_mode; master->set_rx_mode=dummy_dyn_master_set_rx_mode; master->enable_power=dummy_dyn_master_enable_power; master->disable_power=dummy_dyn_master_disable_power; - master->tx_irq=dummy_dyn_master_tx_irq; - master->rx_irq=dummy_dyn_master_rx_irq; - master->abort_irq=dummy_dyn_master_abort_irq; master->tx_dma=dummy_dyn_master_tx_dma; master->rx_dma=dummy_dyn_master_rx_dma; master->abort_dma=dummy_dyn_master_abort_dma; @@ -705,9 +636,8 @@ void dyn_master_init(TDynamixelMaster *master,void *hal_dev,TDynVersion version) master->packet_ready=0x00; master->rx_timeout_ms=50; master->rx_no_answer=0x00; - master->rx_num_packets=0x00; + master->rx_length=0x0000; master->return_level=return_all; - master->sync_bulk_address=0x0000; master->set_rx_mode(); } @@ -738,10 +668,15 @@ unsigned char dyn_master_ping(TDynamixelMaster *master,unsigned char id) { // generate the ping packet for the desired device if(master->version==DYN_VER1) + { dyn_init_ping_packet(master->tx_buffer,id); + master->rx_length=6; + } else + { dyn2_init_ping_packet(master->tx_buffer,id); - master->rx_num_packets=0x01; + master->rx_length=14; + } master->rx_no_answer=0x00; // enable transmission master->set_tx_mode(); @@ -805,10 +740,15 @@ unsigned char dyn_master_read_table(TDynamixelMaster *master,unsigned char id,un { // generate the read packet for the desired device if(master->version==DYN_VER1) + { dyn_init_read_packet(master->tx_buffer,id,address,length); + master->rx_length=length+4; + } else + { dyn2_init_read_packet(master->tx_buffer,id,address,length); - master->rx_num_packets=0x01; + master->rx_length=length+7; + } if(master->return_level==no_return || id==DYN_BROADCAST_ID) master->rx_no_answer=0x01; else @@ -893,10 +833,15 @@ unsigned char dyn_master_write_table(TDynamixelMaster *master,unsigned char id, { // generate the write packet for the desired device if(master->version==DYN_VER1) + { dyn_init_write_packet(master->tx_buffer,id,address,length,data); + master->rx_length=6; + } else + { dyn2_init_write_packet(master->tx_buffer,id,address,length,data); - master->rx_num_packets=0x01; + master->rx_length=11; + } if(master->return_level==return_all && id!=DYN_BROADCAST_ID) master->rx_no_answer=0x00; else @@ -950,10 +895,15 @@ unsigned char dyn_master_reg_write(TDynamixelMaster *master,unsigned char id, un { // generate the registered write packet for the desired device if(master->version==DYN_VER1) + { dyn_init_reg_write_packet(master->tx_buffer,id,address,length,data); + master->rx_length=6; + } else + { dyn2_init_reg_write_packet(master->tx_buffer,id,address,length,data); - master->rx_num_packets=0x01; + master->rx_length=11; + } if(master->return_level==return_all && id!=DYN_BROADCAST_ID) master->rx_no_answer=0x00; else @@ -1010,7 +960,6 @@ unsigned char dyn_master_action(TDynamixelMaster *master) dyn_init_action_packet(master->tx_buffer); else dyn2_init_action_packet(master->tx_buffer); - master->rx_num_packets=0x01; master->rx_no_answer=0x01; // enable transmission master->set_tx_mode(); @@ -1042,7 +991,6 @@ unsigned char dyn_master_sync_write(TDynamixelMaster *master,unsigned char num,u dyn_init_sync_write_packet(master->tx_buffer,num,ids,address,length,data); else dyn2_init_sync_write_packet(master->tx_buffer,num,ids,address,length,data); - master->rx_num_packets=0x01; master->rx_no_answer=0x01; // enable transmission master->set_tx_mode(); @@ -1073,7 +1021,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=num; + master->rx_length=(length+7)*num; if(master->return_level==no_return) master->rx_no_answer=0x01; else @@ -1130,16 +1078,22 @@ unsigned char dyn_master_bulk_read(TDynamixelMaster *master,unsigned char num,un // generate the read packet for the desired device if(master->version==DYN_VER1) { + master->rx_length=0; for(i=0;i<num;i++) { ver1_address[i]=address[i]; ver1_length[i]=length[i]; + master->rx_length=length[i]+4; } dyn_init_bulk_read_packet(master->tx_buffer,num,ids,ver1_address,ver1_length); } else + { dyn2_init_bulk_read_packet(master->tx_buffer,num,ids,address,length); - master->rx_num_packets=num; + master->rx_length=0; + for(i=0;i<num;i++) + master->rx_length=(length[i]+7); + } if(master->return_level==no_return) master->rx_no_answer=0x01; else @@ -1216,7 +1170,6 @@ unsigned char dyn_master_bulk_write(TDynamixelMaster *master,unsigned char num,u if(master->version==DYN_VER2) { dyn2_init_bulk_write_packet(master->tx_buffer,num,ids,address,length,data); - master->rx_num_packets=0x01; master->rx_no_answer=0x01; // enable transmission master->set_tx_mode(); @@ -1258,7 +1211,6 @@ unsigned char dyn_master_relay(TDynamixelMaster *master,TDynVersion inst_ver,uns else dyn2_copy_packet(inst_pkt,master->tx_buffer); } - master->rx_num_packets=0x01; master->rx_no_answer=0x00; // enable transmission master->set_tx_mode(); diff --git a/dynamixel_base/src/dynamixel_slave.c b/dynamixel_base/src/dynamixel_slave.c index c48e500..c284434 100644 --- a/dynamixel_base/src/dynamixel_slave.c +++ b/dynamixel_base/src/dynamixel_slave.c @@ -31,16 +31,6 @@ unsigned char dummy_dyn_slave_on_relay(TDynVersion version,unsigned char *inst_p return DYN_NO_DEVICE; } -unsigned char dummy_dyn_slave_tx_irq(void *hal_dev, const unsigned char *data, unsigned short int length) -{ - return DYN_SUCCESS; -} - -unsigned char dummy_dyn_slave_rx_irq(void *hal_dev, const unsigned char *data, unsigned short int length) -{ - return DYN_SUCCESS; -} - unsigned char dummy_dyn_slave_tx_dma(void *hal_dev, const unsigned char *data, unsigned short int length) { return DYN_SUCCESS; @@ -51,11 +41,6 @@ unsigned char dummy_dyn_slave_rx_dma(void *hal_dev, const unsigned char *data, u return DYN_SUCCESS; } -unsigned char dummy_dyn_slave_abort_irq(void *hal_dev) -{ - return DYN_SUCCESS; -} - unsigned char dummy_dyn_slave_abort_dma(void *hal_dev) { return DYN_SUCCESS; -- GitLab