Skip to content
Snippets Groups Projects
Commit 849aa566 authored by Sergi Hernandez's avatar Sergi Hernandez
Browse files

Added a serial implementation of the dynamixel slave.

parent 059a11bf
No related branches found
No related tags found
No related merge requests found
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(.)
......
......@@ -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)
......
#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();
}
#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
#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;
}
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment