diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt index 104a60d72e69effbd35a142abc1b618e096c136d..15f5b02b3f9a37f6fc2b1a4135b500d77ad7dae7 100644 --- a/src/CMakeLists.txt +++ b/src/CMakeLists.txt @@ -1,9 +1,9 @@ ADD_SUBDIRECTORY(xml) # edit the following line to add all the source code files of the library -SET(sources dynamixel.cpp dynamixelserver.cpp dynamixelserver_ftdi.cpp dynamixelserver_serial.cpp dynamixelexceptions.cpp dynamixel_slave.cpp dynamixel_slave_ftdi.cpp) +SET(sources dynamixel.cpp dynamixelserver.cpp dynamixelserver_ftdi.cpp dynamixelserver_serial.cpp dynamixelexceptions.cpp dynamixel_slave.cpp dynamixel_slave_ftdi.cpp dynamixel_slave_serial.cpp) # edit the following line to add all the header files of the library -SET(headers dynamixel.h dynamixelserver.h dynamixelserver_ftdi.h dynamixelserver_serial.h dynamixelexceptions.h dynamixel_common.h) +SET(headers dynamixel.h dynamixelserver.h dynamixelserver_ftdi.h dynamixelserver_serial.h dynamixelexceptions.h dynamixel_common.h dynamixel_slave.h dynamixel_slave_ftdi.h dynamixel_slave_serial.h) INCLUDE_DIRECTORIES(.) diff --git a/src/dynamixel_slave.cpp b/src/dynamixel_slave.cpp index 7773dd703c5cea0cc7e856a294a16ca743f63b33..d5b12075db9f3d034eb5f44ae9d02f60dab59707 100644 --- a/src/dynamixel_slave.cpp +++ b/src/dynamixel_slave.cpp @@ -7,7 +7,7 @@ CDynamixelSlave::CDynamixelSlave(const std::string& cont_id,dyn_version_t dyn_ve this->new_packet_available_event_id=cont_id + "new_packet_event_id"; this->event_server->create_event(this->new_packet_available_event_id); this->finish_thread_event_id=cont_id + "finish_thread_event_id"; - this->event_server->create_event(this->new_packet_available_event_id); + this->event_server->create_event(this->finish_thread_event_id); this->thread_server=CThreadServer::instance(); this->process_packets_thread_id=cont_id + "_thread_id"; @@ -42,8 +42,8 @@ void *CDynamixelSlave::process_packets_thread(void *params) slave->comm_access.exit(); } end=false; + events.push_back(slave->finish_thread_event_id); events.push_back(slave->comm_dev->get_rx_event_id()); - events.push_back(slave->new_packet_available_event_id); while(!end) { event_index=slave->event_server->wait_first(events); @@ -53,6 +53,7 @@ void *CDynamixelSlave::process_packets_thread(void *params) { // process the incomming data num=slave->comm_dev->get_num_data(); + std::cout << "num data: " << num << std::endl; data=new unsigned char[num]; if(slave->comm_dev->read(data,num)!=num) std::cout << "Error while reading the communication device" << std::endl; @@ -60,6 +61,7 @@ void *CDynamixelSlave::process_packets_thread(void *params) { for(i=0;i<num;i++) { + std::cout << std::hex << (int)data[i] << std::endl; if(!data_phase) { switch(num_bytes) diff --git a/src/dynamixel_slave_serial.cpp b/src/dynamixel_slave_serial.cpp new file mode 100644 index 0000000000000000000000000000000000000000..8d6bd4182293dd2eef7aa4116e06588ff2bb3814 --- /dev/null +++ b/src/dynamixel_slave_serial.cpp @@ -0,0 +1,56 @@ +#include "dynamixelexceptions.h" +#include "dynamixel_slave_serial.h" +#include "eventexceptions.h" +#include "rs232.h" +#include <sstream> +#include <sys/types.h> +#include <sys/stat.h> +#include <unistd.h> + +CDynamixelSlaveSerial::CDynamixelSlaveSerial(const std::string& cont_id,const std::string &device,dyn_version_t dyn_ver):CDynamixelSlave(cont_id,dyn_ver) +{ + TRS232_config serial_config; + + this->bus_info.baud_rate=-1; + this->bus_info.device=""; + this->comm_dev=new CRS232(cont_id); + this->comm_dev->open((void *)&device); + this->bus_info.device=device; + serial_config.baud=921600; + serial_config.num_bits=8; + serial_config.parity=none; + serial_config.stop_bits=1; + this->comm_dev->config(&serial_config); + this->bus_info.baud_rate=921600; + ((CRS232 *)this->comm_dev)->clear_control_signal(rs232_dtr); + this->start(); +} + +int CDynamixelSlaveSerial::get_baudrate(void) +{ + return this->bus_info.baud_rate; +} + +void CDynamixelSlaveSerial::set_baudrate(int baudrate) +{ + TRS232_config serial_config; + + this->comm_access.enter(); + serial_config.baud=baudrate; + serial_config.num_bits=8; + serial_config.parity=none; + serial_config.stop_bits=1; + this->comm_dev->config(&serial_config); + this->bus_info.baud_rate=baudrate; + this->comm_access.exit(); +} + +std::string CDynamixelSlaveSerial::get_serial_device(void) +{ + return this->bus_info.device; +} + +CDynamixelSlaveSerial::~CDynamixelSlaveSerial() +{ + this->stop(); +} diff --git a/src/dynamixel_slave_serial.h b/src/dynamixel_slave_serial.h new file mode 100644 index 0000000000000000000000000000000000000000..1976e4fc7f744c2ebb7609208b33f086e9a0b071 --- /dev/null +++ b/src/dynamixel_slave_serial.h @@ -0,0 +1,58 @@ +#ifndef _DYNAMIXEL_SLAVE_SERIAL_H +#define _DYNAMIXEL_SLAVE_SERIAL_H + +#include "dynamixel_slave.h" + +/** + * \brief Basic Dynamixel bus information + * + * This structure holds the identifier of the current bus used (in case there + * exist multiple buses) and also the baudrate of the bus. + */ +typedef struct +{ + int baud_rate; + std::string device; +}TBus_info; + +/** + * \brief + * + */ +class CDynamixelSlaveSerial : public CDynamixelSlave +{ + private: + /** + * \brief + * + */ + TBus_info bus_info; + public: + /** + * \brief + * + */ + CDynamixelSlaveSerial(const std::string& cont_id,const std::string &device,dyn_version_t dyn_ver=dyn_version1); + /** + * \brief + * + */ + void set_baudrate(int baudrate); + /** + * \brief + * + */ + int get_baudrate(void); + /** + * \brief + * + */ + std::string get_serial_device(void); + /** + * \brief + * + */ + virtual ~CDynamixelSlaveSerial(); +}; + +#endif diff --git a/src/examples/test_dynamixel_slave.cpp b/src/examples/test_dynamixel_slave.cpp index bf8d8d5aa0e7f62b861740f60f6156b95918ab48..4859730690a13c541fa1e4dcd7ab8ca5f9ab48dd 100644 --- a/src/examples/test_dynamixel_slave.cpp +++ b/src/examples/test_dynamixel_slave.cpp @@ -1,14 +1,14 @@ #include "eventexceptions.h" -#include "dynamixel_slave_ftdi.h" +#include "dynamixel_slave_serial.h" #include <iostream> int main(int argc, char *argv[]) { - CDynamixelSlaveFTDI slave("slave"); - try{ - slave.config_bus(0,1000000); + CDynamixelSlaveSerial slave("slave","/dev/ttyUSB0"); + slave.set_baudrate(921600); sleep(10); + std::cout << "exit" << std::endl; }catch(CException &e){ std::cout << e.what() << std::endl; }