diff --git a/src/dynamixelserver.cpp b/src/dynamixelserver.cpp index dc250af1d653d8a89ac4ec00ff9028e0711bee40..1fe70ced63a435cb29ad2bd2cdf11abab72d5c47 100644 --- a/src/dynamixelserver.cpp +++ b/src/dynamixelserver.cpp @@ -73,6 +73,9 @@ void CDynamixelServer::send_instruction_packet_v1(dyn_inst_t inst,unsigned char if(len!=0) throw CDynamixelServerException(_HERE_,"Invalid data length"); break; + case dyn_bulk_read: + case dyn_bulk_write: + case dyn_sync_read: case dyn_sync_write: id=0xFE; length=6+len; packet=new unsigned char[length]; @@ -995,7 +998,7 @@ void CDynamixelServer::write_sync(std::vector<unsigned char>& servo_ids,unsigned void CDynamixelServer::read_sync(std::vector<unsigned char>& servo_ids,unsigned short int start_addr,unsigned short int length, std::vector< std::vector<unsigned char> >& data,dyn_version_t version) { - unsigned char *data_int=NULL,*data_out=NULL,error; + unsigned char *data_int=NULL,*data_out=NULL,error,length_v1; unsigned short length_v2; unsigned int i,j=0; int length_int=0; @@ -1005,14 +1008,9 @@ void CDynamixelServer::read_sync(std::vector<unsigned char>& servo_ids,unsigned /* handle exceptions */ throw CDynamixelServerException(_HERE_,"No servos specified"); } - if(version==dyn_version1) - { - /* handle exception */ - throw CDynamixelServerException(_HERE_,"Operation not supported in version 1"); - } - else - { - try{ + try{ + if(version==dyn_version2) + { length_int=4+servo_ids.size(); data_int=new unsigned char[length_int]; data_int[0]=start_addr%256; @@ -1051,14 +1049,53 @@ void CDynamixelServer::read_sync(std::vector<unsigned char>& servo_ids,unsigned throw e; } } - }catch(CException &e){ + } + else + { + length_int=2+servo_ids.size(); + data_int=new unsigned char[length_int]; + data_int[0]=(unsigned char)start_addr; + data_int[1]=(unsigned char)length; + for(i=0;i<servo_ids.size();i++) + data_int[2+i]=servo_ids[i]; + this->send_instruction_packet_v1(dyn_sync_read,data_int,length_int); + /* read all the data from all the servos */ if(data_int!=NULL) { delete[] data_int; - data_out=NULL; + data_int=NULL; } - throw e; + data.resize(servo_ids.size()); + for(i=0;i<servo_ids.size();i++) + { + try{ + error=this->receive_status_packet_v1(&data_out,&length_v1); + this->handle_error(error); + if(data_out!=NULL) + { + data[i].resize(length_v1); + for(j=0;j<length_v1;j++) + data[i][j]=data_out[j]; + delete[] data_out; + data_out=NULL; + } + }catch(CException &e){ + if(data_out!=NULL) + { + delete[] data_out; + data_out=NULL; + } + throw e; + } + } + } + }catch(CException &e){ + if(data_int!=NULL) + { + delete[] data_int; + data_out=NULL; } + throw e; } } @@ -1083,14 +1120,9 @@ void CDynamixelServer::write_bulk(std::vector<unsigned char>& servo_ids,std::vec /* handle exceptions */ throw CDynamixelServerException(_HERE_,"Too many or not enough data blocks"); } - if(version==dyn_version1) - { - /* handle exception */ - throw CDynamixelServerException(_HERE_,"Operation not supported in version 1"); - } - else - { - try{ + try{ + if(version==dyn_version2) + { length=0; for(i=0;i<servo_ids.size();i++) length+=5+data[i].size(); @@ -1108,20 +1140,38 @@ void CDynamixelServer::write_bulk(std::vector<unsigned char>& servo_ids,std::vec } this->send_instruction_packet_v2(dyn_bulk_write,data_int,length); delete[] data_int; - }catch(CException &e){ - if(data_int!=NULL) + } + else + { + length=0; + for(i=0;i<servo_ids.size();i++) + length+=3+data[i].size(); + data_int=new unsigned char[length]; + for(i=0;i<servo_ids.size();i++) { - delete[] data_int; - data_int=NULL; + data_int[offset]=servo_ids[i]; + data_int[offset+1]=(unsigned char)start_addr[i]; + data_int[offset+2]=(unsigned char)data[i].size(); + for(j=0;j<data[i].size();j++) + data_int[offset+3+j]=data[i][j]; + offset+=3+data[i].size(); } - throw e; + this->send_instruction_packet_v1(dyn_bulk_write,data_int,length); + delete[] data_int; + } + }catch(CException &e){ + if(data_int!=NULL) + { + delete[] data_int; + data_int=NULL; } + throw e; } } void CDynamixelServer::read_bulk(std::vector<unsigned char>& servo_ids,std::vector<unsigned short int> &start_addr,std::vector<unsigned short int> &length, std::vector< std::vector<unsigned char> >& data,dyn_version_t version) { - unsigned char *data_int=NULL,*data_out=NULL,error; + unsigned char *data_int=NULL,*data_out=NULL,error,length_v1; unsigned short int length_v2; unsigned int i,j=0; int length_int=0; @@ -1141,14 +1191,9 @@ void CDynamixelServer::read_bulk(std::vector<unsigned char>& servo_ids,std::vect /* handle exceptions */ throw CDynamixelServerException(_HERE_,"Too many or not enough read lengths"); } - if(version==dyn_version1) - { - /* handle exception */ - throw CDynamixelServerException(_HERE_,"Operation not supported in version 1"); - } - else - { - try{ + try{ + if(version==dyn_version2) + { length_int=5*servo_ids.size(); data_int=new unsigned char[length_int]; for(i=0;i<servo_ids.size();i++) @@ -1189,14 +1234,55 @@ void CDynamixelServer::read_bulk(std::vector<unsigned char>& servo_ids,std::vect throw e; } } - }catch(CException &e){ + } + else + { + length_int=3*servo_ids.size(); + data_int=new unsigned char[length_int]; + for(i=0;i<servo_ids.size();i++) + { + data_int[i*3]=servo_ids[i]; + data_int[i*3+1]=(unsigned char)start_addr[i]; + data_int[i*3+2]=(unsigned char)length[i]; + } + this->send_instruction_packet_v1(dyn_bulk_read,data_int,length_int); + /* read all the data from all the servos */ if(data_int!=NULL) { delete[] data_int; data_int=NULL; } - throw e; + data.resize(servo_ids.size()); + for(i=0;i<servo_ids.size();i++) + { + error=this->receive_status_packet_v1(&data_out,&length_v1); + try{ + this->handle_error(error); + if(data_out!=NULL) + { + data[i].resize(length_v1); + for(j=0;j<length_v1;j++) + data[i][j]=data_out[j]; + delete[] data_out; + data_out=NULL; + } + }catch(CException &e){ + if(data_out!=NULL) + { + delete[] data_out; + data_out=NULL; + } + throw e; + } + } } + }catch(CException &e){ + if(data_int!=NULL) + { + delete[] data_int; + data_int=NULL; + } + throw e; } } diff --git a/src/examples/CMakeLists.txt b/src/examples/CMakeLists.txt index d882fdcd05bcada8f742964d66b900afc9937316..666109205992fd850d7d764034bc95c210c91cd9 100644 --- a/src/examples/CMakeLists.txt +++ b/src/examples/CMakeLists.txt @@ -27,3 +27,9 @@ ADD_EXECUTABLE(test_dynamixel_slave test_dynamixel_slave.cpp) # edit the following line to add the necessary libraries TARGET_LINK_LIBRARIES(test_dynamixel_slave dynamixel) + +# edit the following line to add the source code for the example and the name of the executable +ADD_EXECUTABLE(test_new_firmware test_new_firmware.cpp) + +# edit the following line to add the necessary libraries +TARGET_LINK_LIBRARIES(test_new_firmware dynamixel) diff --git a/src/examples/test_dynamixel_bulk_read.cpp b/src/examples/test_dynamixel_bulk_read.cpp index 8e457cf2f86b0aa64e70006542594be12be6ee96..f79de20fbaf8b7d1dc0f6e01ce2e79a9ee643c26 100755 --- a/src/examples/test_dynamixel_bulk_read.cpp +++ b/src/examples/test_dynamixel_bulk_read.cpp @@ -21,11 +21,11 @@ int main(int argc, char *argv[]) events.push_back(dyn_server->get_scan_done_event_id()); events.push_back(dyn_server->get_scan_error_event_id()); dyn_server->config_bus(0,1000000); - dyn_server->start_scan(dyn_version2); + dyn_server->start_scan(dyn_version1); event_id=event_server->wait_first(events); if(event_id==0) { - devices=dyn_server->get_device_ids(dyn_version2); + devices=dyn_server->get_device_ids(dyn_version1); num_servos=devices.size(); start_addr.resize(num_servos); length.resize(num_servos); @@ -36,7 +36,7 @@ int main(int argc, char *argv[]) start_addr[i]=0x1B; length[i]=3; } - dyn_server->read_bulk(servo_ids,start_addr,length,data,dyn_version2); + dyn_server->read_bulk(servo_ids,start_addr,length,data,dyn_version1); for(i=0;i<num_servos;i++) { std::cout << "PID parameters for the servo " << (int)servo_ids[i] << std::endl; diff --git a/src/examples/test_dynamixel_server.cpp b/src/examples/test_dynamixel_server.cpp index 8e3ed0f5a3e0e65793a7c54e51fc0b3910afcb24..b8567e82a5856ba34ecf67a07ed2e3b828afa7b3 100644 --- a/src/examples/test_dynamixel_server.cpp +++ b/src/examples/test_dynamixel_server.cpp @@ -41,6 +41,7 @@ int main(int argc, char *argv[]) } else std::cout << "Error while scanning the bus: " << dyn_server->get_scan_error() << std::endl; + return 0; try{ dyn_server->config_bus(0,1000000); dyn_server->start_scan(); diff --git a/src/examples/test_dynamixel_sync.cpp b/src/examples/test_dynamixel_sync.cpp index f4ab9f6f087cf86bdcc075edb3ea938ebd2b5188..3bbf67d5c5df4aa59a4acf4a71e61c69b0f705d5 100644 --- a/src/examples/test_dynamixel_sync.cpp +++ b/src/examples/test_dynamixel_sync.cpp @@ -8,7 +8,7 @@ int main(int argc, char *argv[]) CEventServer *event_server=CEventServer::instance(); std::vector< std::vector<unsigned char> > data; std::vector<unsigned char> servo_ids; - unsigned short int star_addrs=0x1E; + unsigned short int star_addrs=0x1C; int i,num_servos,pos=0,event_id; std::list<std::string> events; std::vector<int> devices; @@ -31,21 +31,25 @@ int main(int argc, char *argv[]) for(i=0;i<num_servos;i++) { servo_ids[i]=devices[i]; - data[i].resize(4); - data[i][0]=pos%256; - data[i][1]=pos/256; - data[i][2]=0x00; - data[i][3]=0x02; + data[i].resize(6); + data[i][0]=0x00; + data[i][1]=0x01; + data[i][2]=pos%256; + data[i][3]=pos/256; + data[i][4]=0xFF; + data[i][5]=0x03; } dyn_server->write_sync(servo_ids,star_addrs,data,dyn_version1); sleep(2); pos=1023; for(i=0;i<num_servos;i++) { - data[i][0]=pos%256; - data[i][1]=pos/256; - data[i][2]=0x00; - data[i][3]=0x01; + data[i][0]=0x00; + data[i][1]=0x01; + data[i][2]=pos%256; + data[i][3]=pos/256; + data[i][4]=0xFF; + data[i][5]=0x03; } dyn_server->write_sync(servo_ids,star_addrs,data,dyn_version1); sleep(5); diff --git a/src/examples/test_new_firmware.cpp b/src/examples/test_new_firmware.cpp new file mode 100644 index 0000000000000000000000000000000000000000..b5ae6f459baa8a8ea1f73adf555f07514eb19715 --- /dev/null +++ b/src/examples/test_new_firmware.cpp @@ -0,0 +1,61 @@ +#include "eventexceptions.h" +#include "dynamixelserver_ftdi.h" +#include "eventserver.h" +#include <iostream> + +int main(int argc, char *argv[]) +{ + CDynamixelServerFTDI *dyn_server=CDynamixelServerFTDI::instance(); + CEventServer *event_server=CEventServer::instance(); + int i,j,num_buses,event_id,num_dev,baudrate; + std::list<std::string> events; + std::vector<int> devices; + unsigned short int model; + unsigned char data[53]; + CDynamixel *servo; + + num_buses=dyn_server->get_num_buses(); + std::cout << "Num. buses: " << num_buses << std::endl; + if(num_buses>0) + { + try{ + events.push_back(dyn_server->get_scan_done_event_id()); + events.push_back(dyn_server->get_scan_error_event_id()); + dyn_server->config_bus(0,1000000); + dyn_server->start_scan(); + event_id=event_server->wait_first(events); + if(event_id==0) + { + num_dev=dyn_server->get_num_devices(); + std::cout << "Num. devices: " << std::dec << num_dev << std::endl; + baudrate=dyn_server->get_baudrate(); + std::cout << "Baudrate: " << std::dec << baudrate << " bps" << std::endl; + devices=dyn_server->get_device_ids(); + for(i=0;i<num_dev;i++) + { + servo=dyn_server->get_device(devices[i]); + servo->read_word_register(0x00,&model); + std::cout << "servo " << std::dec << devices[i] << " model " << (int)model << std::endl; + servo->read_registers(0x00,data,53); + for(j=0;j<53;j++) + { + std::cout << " Reg " << std::hex << j << " value: " << std::hex << (int)data[j] << std::endl; + } + dyn_server->free_device(devices[i]); + delete servo; + } + } + else + std::cout << "Error while scanning the bus: " << dyn_server->get_scan_error() << std::endl; + }catch(CException &e){ + std::cout << e.what() << std::endl; + } + } +} + + + + + + +