aero3_command.cpp
Go to the documentation of this file.
2 #include <iostream> // for cout/cerr
3 using namespace aero;
4 using namespace controller;
5 
6 //#define DEBUG
7 
10 : io_(),serial_(io_),timer_(io_),is_canceled_(false),comm_err_(false)
11 {
12 }
13 
16 {
17  if(serial_.is_open())serial_.close();
18 }
19 
21 bool SerialCommunication::openPort(std::string _port, unsigned int _baud_rate)
22 {
23  boost::system::error_code error_code;
24  serial_.open(_port,error_code);
25  if(error_code){
26  return false;
27  }
28  else{
29  serial_.set_option(serial_port_base::baud_rate(_baud_rate));
30  return true;
31  }
32 }
33 
36 {
37  if(serial_.is_open())serial_.close();
38 }
39 
41 void SerialCommunication::writeAsync(std::vector<uint8_t>& _send_data)
42 {
43  serial_.async_write_some( buffer( _send_data ), [](boost::system::error_code, std::size_t){});
44  io_.reset();
45  io_.run();
46 }
47 
49 void SerialCommunication::onReceive(const boost::system::error_code& _error, size_t _bytes_transferred)
50 {
51  if (_error && _error != boost::asio::error::eof) {
52 #if DEBUG
53  std::cout << "receive failed: " << std::endl;
54 #endif
55  }
56  else {
57  const std::string data(boost::asio::buffer_cast<const char*>(stream_buffer_.data()), stream_buffer_.size());
58  receive_buffer_ = data;
59 
60  stream_buffer_.consume(stream_buffer_.size());
61  timer_.cancel();
62  is_canceled_ = true;
63  }
64 }
65 
67 void SerialCommunication::onTimer(const boost::system::error_code& _error)
68 {
69  if (!_error && !is_canceled_) serial_.cancel();
70 }
71 
73 void SerialCommunication::readBufferAsync(uint8_t _size=1, uint16_t _timeout=10)
74 {
75  receive_buffer_.clear();
76  is_canceled_ = false;
77 
78  boost::asio::async_read(serial_,stream_buffer_,boost::asio::transfer_at_least(_size),
79  boost::bind(&SerialCommunication::onReceive, this,
80  boost::asio::placeholders::error, boost::asio::placeholders::bytes_transferred));
81 
82  //transfer_all() -> read until full
83  //transfer_exactly(size_t size) -> read specific size
84  //transfer_at_least(size_t size) -> read at leaset size
85  timer_.expires_from_now(boost::posix_time::milliseconds(_timeout));
86  timer_.async_wait(boost::bind(&SerialCommunication::onTimer, this, _1));
87  io_.reset();
88  io_.run();
89 }
90 
91 void SerialCommunication::readBuffer(std::vector<uint8_t>& _receive_data, uint8_t _length = 1)
92 {
93 
94  _receive_data.clear();
95  _receive_data.resize(_length);
96  fill(_receive_data.begin(),_receive_data.end(),0);
97 
98  readBufferAsync( _length, 1000);
99 
100  if(receive_buffer_.size() < _length){
101  std::cerr << "Read Timeout" << std::endl;
102  comm_err_ = true;
103  }
104  else{
105  for(size_t i=0;i<_length;++i)_receive_data[i] = receive_buffer_[i];
106  comm_err_ = false;
107  }
108 
109 }
110 
113 {
114  ::tcflush(serial_.lowest_layer().native_handle(),TCIOFLUSH);
115 }
116 
117 //*******************************************************************
118 //*******************************************************************
121 :is_open_(false),check_sum_(0),count_(0),length_(0),serial_com_()
122 {
123 
124 }
125 
128 {
129  closePort();
130 }
131 
132 bool AeroCommand::openPort(std::string _port, unsigned int _baud_rate){
133  if(serial_com_.openPort(_port, _baud_rate)) is_open_ = true;
134  else is_open_ = false;
135 
136  return is_open_;
137 }
138 
141  is_open_ = false;
142 }
143 
146 }
147 
149 void AeroCommand::setCurrent(uint8_t _number,uint8_t _max, uint8_t _down)
150 {
151  check_sum_ = 0;
152 
153  if(_number == 0)length_ = 68;
154  else length_ = 8;
155 
156  send_data_.resize(length_);
157  fill(send_data_.begin(),send_data_.end(),0);
158 
159  send_data_[0] = 0xFD;
160  send_data_[1] = 0xDF;
161  send_data_[2] = length_-4;
162  send_data_[3] = 0x01;
163  send_data_[4] = _number;
164 
165  for(unsigned int i = 0;i < (length_-6)/2; ++i){
166  send_data_[i*2+5] = _max;
167  send_data_[i*2+6] = _down;
168  }
169 
170  //CheckSum
171  for(count_ = 2;count_ < length_-1;count_++) check_sum_ += send_data_[count_];
172  send_data_[length_-1] = ~check_sum_;
173 
175  serial_com_.writeAsync(send_data_);
176 
177 }
178 
180 void AeroCommand::onServo(uint8_t _number,uint16_t _data)
181 {
182  check_sum_ = 0;
183 
184  if(_number == 0)length_ = 68;
185  else length_ = 8;
186 
187  send_data_.resize(length_);
188  fill(send_data_.begin(),send_data_.end(),0);
189 
190  send_data_[0] = 0xFD;
191  send_data_[1] = 0xDF;
192  send_data_[2] = length_-4;
193  send_data_[3] = 0x21;
194  send_data_[4] = _number;
195 
196  for(unsigned int i = 0;i < (length_-6)/2; ++i){
197  send_data_[i*2+5] = _data >> 8;
198  send_data_[i*2+6] = _data;
199  }
200 
201  //CheckSum
202  for(count_ = 2;count_ < length_-1;count_++) check_sum_ += send_data_[count_];
203  send_data_[length_-1] = ~check_sum_;
204 
206  serial_com_.writeAsync(send_data_);
207 
208 }
209 
210 
212 std::vector<int16_t> AeroCommand::getPosition(uint8_t _number)
213 {
214  check_sum_ = 0;
215  length_ = 6;
216 
217  send_data_.resize(length_);
218  fill(send_data_.begin(),send_data_.end(),0);
219 
220  send_data_[0] = 0xFD;
221  send_data_[1] = 0xDF;
222  send_data_[2] = length_-4;
223  send_data_[3] = 0x41;
224  send_data_[4] = _number;
225 
226  //CheckSum
227  for(count_ = 2;count_ < length_-1;count_++) check_sum_ += send_data_[count_];
228  send_data_[length_-1] = ~check_sum_;
229 
231  serial_com_.writeAsync(send_data_);
232 
233  std::vector<uint8_t> receive_data;
234  if(_number == 0) receive_data.resize(68);
235  else receive_data.resize(8);
236  fill(receive_data.begin(),receive_data.end(),0);
237 
238  serial_com_.readBuffer(receive_data,receive_data.size());
240  std::vector<int16_t> parse_data;
241  if(_number==0) parse_data.resize(30);
242  else parse_data.resize(1);
243  fill(parse_data.begin(),parse_data.end(),0);
244  for(size_t i=0; i < parse_data.size() ; ++i){
245  parse_data[i] = static_cast<int16_t>((receive_data[i*2+5] << 8) + receive_data[i*2+6]);
246  }
247 
248  return parse_data;
249 
250 }
251 
253 std::vector<uint16_t> AeroCommand::getCurrent(uint8_t _number)
254 {
255  check_sum_ = 0;
256  length_ = 6;
257 
258  send_data_.resize(length_);
259  fill(send_data_.begin(),send_data_.end(),0);
260 
261  send_data_[0] = 0xFD;
262  send_data_[1] = 0xDF;
263  send_data_[2] = length_-4;
264  send_data_[3] = 0x42;
265  send_data_[4] = _number;
266 
267  //CheckSum
268  for(count_ = 2;count_ < length_-1;count_++) check_sum_ += send_data_[count_];
269  send_data_[length_-1] = ~check_sum_;
270 
272  serial_com_.writeAsync(send_data_);
273 
274  std::vector<uint8_t> receive_data;
275  if(_number == 0) receive_data.resize(68);
276  else receive_data.resize(8);
277  fill(receive_data.begin(),receive_data.end(),0);
278 
279  serial_com_.readBuffer(receive_data,receive_data.size());
281  std::vector<uint16_t> parse_data;
282  if(_number==0) parse_data.resize(31);
283  else parse_data.resize(1);
284  fill(parse_data.begin(),parse_data.end(),0);
285  for(size_t i=0; i < parse_data.size() ; ++i){
286  parse_data[i] = static_cast<uint16_t>((receive_data[i*2+5] << 8) + receive_data[i*2+6]);
287  }
288 
289  return parse_data;
290 
291 }
292 
294 std::vector<uint16_t> AeroCommand::getTemperatureVoltage(uint8_t _number)
295 {
296  check_sum_ = 0;
297  length_ = 6;
298 
299  send_data_.resize(length_);
300  fill(send_data_.begin(),send_data_.end(),0);
301 
302  send_data_[0] = 0xFD;
303  send_data_[1] = 0xDF;
304  send_data_[2] = length_-4;
305  send_data_[3] = 0x43;
306  send_data_[4] = _number;
307 
308  //CheckSum
309  for(count_ = 2;count_ < length_-1;count_++) check_sum_ += send_data_[count_];
310  send_data_[length_-1] = ~check_sum_;
311 
313  serial_com_.writeAsync(send_data_);
314 
315  std::vector<uint8_t> receive_data;
316  if(_number == 0) receive_data.resize(68);
317  else receive_data.resize(8);
318  fill(receive_data.begin(),receive_data.end(),0);
319 
320  serial_com_.readBuffer(receive_data,receive_data.size());
322  std::vector<uint16_t> parse_data;
323  if(_number==0) parse_data.resize(31);
324  else parse_data.resize(1);
325  fill(parse_data.begin(),parse_data.end(),0);
326  for(size_t i=0; i < parse_data.size() ; ++i){
327  parse_data[i] = static_cast<uint16_t>((receive_data[i*2+5] << 8) + receive_data[i*2+6]);
328  }
329 
330  return parse_data;
331 
332 }
333 
335 std::string AeroCommand::getVersion(uint8_t _number)
336 {
337  check_sum_ = 0;
338  length_ = 6;
339 
340  send_data_.resize(length_);
341  fill(send_data_.begin(),send_data_.end(),0);
342 
343  send_data_[0] = 0xFD;
344  send_data_[1] = 0xDF;
345  send_data_[2] = length_-4;
346  send_data_[3] = 0x51;
347  send_data_[4] = _number;
348 
349  //CheckSum
350  for(count_ = 2;count_ < length_-1;count_++) check_sum_ += send_data_[count_];
351  send_data_[length_-1] = ~check_sum_;
352 
354  serial_com_.writeAsync(send_data_);
355 
356  std::vector<uint8_t> receive_data;
357  receive_data.resize(11);
358  fill(receive_data.begin(),receive_data.end(),0);
359 
360  serial_com_.readBuffer(receive_data,receive_data.size());
362 
363  std::string version = "";
364  char data[3];
365  for(size_t i=0; i < 5 ; ++i){
366  sprintf(data,"%02X", receive_data[i+5]);
367  version += data;
368  }
369 
370  return version;
371 }
372 
374 std::vector<uint16_t> AeroCommand::getStatus(uint8_t _number)
375 {
376  check_sum_ = 0;
377  length_ = 6;
378 
379  send_data_.resize(length_);
380  fill(send_data_.begin(),send_data_.end(),0);
381 
382  send_data_[0] = 0xFD;
383  send_data_[1] = 0xDF;
384  send_data_[2] = length_-4;
385  send_data_[3] = 0x52;
386  send_data_[4] = _number;
387 
388  //CheckSum
389  for(count_ = 2;count_ < length_-1;count_++) check_sum_ += send_data_[count_];
390  send_data_[length_-1] = ~check_sum_;
391 
393  serial_com_.writeAsync(send_data_);
394 
395  std::vector<uint8_t> receive_data;
396  if(_number == 0) receive_data.resize(68);
397  else receive_data.resize(8);
398  fill(receive_data.begin(),receive_data.end(),0);
399 
400  serial_com_.readBuffer(receive_data,receive_data.size());
402 
403  std::vector<uint16_t> parse_data; //status data
404  if(_number==0) parse_data.resize(31);
405  else parse_data.resize(1);
406  fill(parse_data.begin(),parse_data.end(),0);
407  for(size_t i=0; i < parse_data.size() ; ++i){
408  parse_data[i] = static_cast<uint16_t>((receive_data[i*2+5] << 8) + receive_data[i*2+6]);
409  }
410 
411  return parse_data;
412 }
413 
415 void AeroCommand::throughCAN(uint8_t _send_no,uint8_t _command,
416 uint8_t _data1, uint8_t _data2, uint8_t _data3, uint8_t _data4, uint8_t _data5)
417 {
418  check_sum_ = 0;
419  length_ = 12;
420 
421  send_data_.resize(length_);
422  fill(send_data_.begin(),send_data_.end(),0);
423 
424  send_data_[0] = 0xFD; //Headder
425  send_data_[1] = 0xDF; //Headder
426  send_data_[2] = 8; //Data Length
427  send_data_[3] = 0x5F; //Command
428  send_data_[4] = _send_no; //Send No.
429 
430  send_data_[5] = _command;
431  send_data_[6] = _data1;
432  send_data_[7] = _data2;
433  send_data_[8] = _data3;
434  send_data_[9] = _data4;
435  send_data_[10] = _data5;
436 
437  //CheckSum
438  for(count_ = 2;count_ < length_-1;count_++) check_sum_ += send_data_[count_];
439  send_data_[length_-1] = ~check_sum_;
440 
442  serial_com_.writeAsync(send_data_);
443 }
444 
446 std::vector<int16_t> AeroCommand::actuateByPosition(uint16_t _time, int16_t *_data)
447 {
448  check_sum_ = 0;
449  length_ = 68;
450 
451  send_data_.resize(length_);
452  fill(send_data_.begin(),send_data_.end(),0);
453 
454  send_data_[0] = 0xFD;
455  send_data_[1] = 0xDF;
456  send_data_[2] = length_-4;
457  send_data_[3] = 0x14;
458  send_data_[4] = 0x00;
459 
460  for (int i = 0; i < 30; i++){
461  send_data_[i*2 + 5] = _data[i] >> 8;
462  send_data_[i*2 + 6] = _data[i] ;
463  }
464 
465  //time
466  send_data_[65] = _time >>8;
467  send_data_[66] = _time;
468 
469  //CheckSum
470  for(count_ = 2;count_ < length_-1;count_++) check_sum_ += send_data_[count_];
471  send_data_[length_-1] = ~check_sum_;
472 
474  serial_com_.writeAsync(send_data_);
475 
476  std::vector<uint8_t> receive_data;
477  receive_data.resize(68);
478  fill(receive_data.begin(),receive_data.end(),0);
479 
480  serial_com_.readBuffer(receive_data,receive_data.size());
482 
483  std::vector<int16_t> parse_data; //present position & robot status
484  parse_data.resize(31);
485  fill(parse_data.begin(),parse_data.end(),0);
486  for(size_t i=0; i < parse_data.size() ; ++i){
487  parse_data[i] = static_cast<int16_t>((receive_data[i*2+5] << 8) + receive_data[i*2+6]);
488  }
489  return parse_data;
490 
491 }
492 
494 std::vector<int16_t> AeroCommand::actuateBySpeed(int16_t *_data)
495 {
496  check_sum_ = 0;
497  length_ = 68;
498 
499  send_data_.resize(length_);
500  fill(send_data_.begin(),send_data_.end(),0);
501 
502  send_data_[0] = 0xFD;
503  send_data_[1] = 0xDF;
504  send_data_[2] = length_-4;
505  send_data_[3] = 0x15;
506  send_data_[4] = 0x00;
507 
508  for (int i = 0; i < 30; i++){
509  send_data_[i*2 + 5] = _data[i] >> 8;
510  send_data_[i*2 + 6] = _data[i] ;
511  }
512 
513  //CheckSum
514  for(count_ = 2;count_ < length_-1;count_++) check_sum_ += send_data_[count_];
515  send_data_[length_-1] = ~check_sum_;
516 
518  serial_com_.writeAsync(send_data_);
519 
520  std::vector<uint8_t> receive_data;
521  receive_data.resize(68);
522  fill(receive_data.begin(),receive_data.end(),0);
523 
524  serial_com_.readBuffer(receive_data,receive_data.size());
526 
527  std::vector<int16_t> parse_data; //present position & robot status
528  parse_data.resize(31);
529  fill(parse_data.begin(),parse_data.end(),0);
530  for(size_t i=0; i < parse_data.size() ; ++i){
531  parse_data[i] = static_cast<int16_t>((receive_data[i*2+5] << 8) + receive_data[i*2+6]);
532  }
533 
534  return parse_data;
535 }
536 
538 void AeroCommand::runScript(uint8_t _number,uint16_t _data)
539 {
540 
541  check_sum_ = 0;
542 
543  if(_number == 0)length_ = 68;
544  else length_ = 8;
545 
546  send_data_.resize(length_);
547  fill(send_data_.begin(),send_data_.end(),0);
548 
549  send_data_[0] = 0xFD;
550  send_data_[1] = 0xDF;
551  send_data_[2] = length_-4;
552  send_data_[3] = 0x22;
553  send_data_[4] = _number;
554 
555  for(unsigned int i = 0;i < (length_-6)/2;++i) send_data_[i*2+6] = _data;
556 
557  //CheckSum
558  for(count_ = 2;count_ < length_-1;count_++) check_sum_ += send_data_[count_];
559  send_data_[length_-1] = ~check_sum_;
560 
562  serial_com_.writeAsync(send_data_);
563 }
void readBufferAsync(uint8_t _size, uint16_t _timeout)
void writeAsync(std::vector< uint8_t > &_send_data)
std::vector< uint16_t > getStatus(uint8_t _number)
void readBuffer(std::vector< uint8_t > &_receive_data, uint8_t _size)
std::vector< uint16_t > getTemperatureVoltage(uint8_t _number)
std::vector< int16_t > actuateByPosition(uint16_t _time, int16_t *_data)
std::string getVersion(uint8_t _number)
std::vector< int16_t > getPosition(uint8_t _number)
void runScript(uint8_t _number, uint16_t _data)
void onTimer(const boost::system::error_code &_error)
void throughCAN(uint8_t _send_no, uint8_t _command, uint8_t _data1, uint8_t _data2, uint8_t _data3, uint8_t _data4, uint8_t _data5)
bool openPort(std::string _port, unsigned int _baud_rate)
boost::asio::streambuf stream_buffer_
Definition: aero3_command.h:39
bool openPort(std::string _port, unsigned int _baud_rate)
void setCurrent(uint8_t _number, uint8_t _max, uint8_t _down)
std::vector< uint16_t > getCurrent(uint8_t _number)
void onReceive(const boost::system::error_code &_error, size_t _bytes_transferred)
std::vector< uint8_t > send_data_
Definition: aero3_command.h:70
SerialCommunication serial_com_
Definition: aero3_command.h:73
std::vector< int16_t > actuateBySpeed(int16_t *_data)
void onServo(uint8_t _number, uint16_t _data)


seed_smartactuator_sdk
Author(s):
autogenerated on Mon Nov 2 2020 03:39:20