7 #ifndef MT4CPP_SERIAL_PORT_HPP 
    8 #define MT4CPP_SERIAL_PORT_HPP 
   13 #include <boost/bind.hpp> 
   14 #include <boost/function.hpp> 
   15 #include <boost/asio.hpp> 
   16 #include <boost/asio/basic_waitable_timer.hpp> 
   18 #include <boost/chrono.hpp> 
   27     template<
typename clock_type>
 
   30         typedef std::vector<char> Buffer; 
 
   31         typedef clock_type Clock; 
 
   32         typedef typename Clock::duration Timeout; 
 
   33         typedef boost::function1<bool, const Buffer&> ReadPredicate; 
 
   37                    const Timeout timeout,
 
   38                    boost::asio::serial_port_base::baud_rate baud_rate
 
   39                    = boost::asio::serial_port_base::baud_rate(9600),
 
   40                    boost::asio::serial_port_base::flow_control flow_control
 
   41                    = boost::asio::serial_port_base::flow_control(boost::asio::serial_port_base::flow_control::none),
 
   42                    boost::asio::serial_port_base::parity parity
 
   43                    = boost::asio::serial_port_base::parity(boost::asio::serial_port_base::parity::none),
 
   44                    boost::asio::serial_port_base::stop_bits stop_bits
 
   45                    = boost::asio::serial_port_base::stop_bits(boost::asio::serial_port_base::stop_bits::one),
 
   46                    boost::asio::serial_port_base::character_size character_size
 
   47                    = boost::asio::serial_port_base::character_size(8) )
 
   51             port_(io_, port_name ),
 
   54             port_.set_option(baud_rate);
 
   55             port_.set_option(flow_control);
 
   56             port_.set_option(parity);
 
   57             port_.set_option(stop_bits);
 
   58             port_.set_option(character_size);
 
   67         inline const Buffer& 
read_if(ReadPredicate p) {
 
   72             timer_.expires_from_now( timeout_ );
 
   73             timer_.async_wait(boost::bind(&BasicSerialPort::timerEvent, 
this, boost::asio::placeholders::error) );
 
   82             return read_if( boost::bind( std::less<int>(), boost::bind(&Buffer::size, _1), n ) );
 
   86         inline Buffer::size_type 
write(
const Buffer& buf) { 
 
   91             if(writeBuffer_.empty() )
 
   94             timer_.expires_from_now( timeout_ );
 
   95             timer_.async_wait(boost::bind(&BasicSerialPort::timerEvent, 
this, boost::asio::placeholders::error) );
 
  103         boost::asio::io_service io_;
 
  104         boost::asio::serial_port port_; 
 
  105         boost::asio::basic_waitable_timer<Clock> timer_; 
 
  107         static const Buffer::size_type BUFFER_SIZE = 16;
 
  108         char buffer_ [BUFFER_SIZE]; 
 
  111         Buffer::size_type bytesWritten_; 
 
  115         inline void readSome(ReadPredicate p) {
 
  116             port_.async_read_some( boost::asio::buffer(buffer_, 1),
 
  117                                    boost::bind(&BasicSerialPort::readEvent, 
this,
 
  118                                                boost::asio::placeholders::error,
 
  119                                                boost::asio::placeholders::bytes_transferred,
 
  125         inline void writeSome() {
 
  126             Buffer::size_type to_write = std::min(writeBuffer_.size() - bytesWritten_, BUFFER_SIZE);
 
  127             Buffer::const_iterator b = writeBuffer_.begin() + bytesWritten_;
 
  128             Buffer::const_iterator e = b + to_write;
 
  129             std::copy( b, e, buffer_ );
 
  131             port_.async_write_some( boost::asio::buffer(buffer_, to_write ),
 
  132                                     boost::bind(&BasicSerialPort::writeEvent, 
this,
 
  133                                                 boost::asio::placeholders::error,
 
  134                                                 boost::asio::placeholders::bytes_transferred) );
 
  138         inline void readEvent(
const boost::system::error_code& error, std::size_t bytes_transferred, ReadPredicate p) {
 
  140                 if(bytes_transferred > 0) { 
 
  141                     readBuffer_.push_back(buffer_[0]);
 
  142                     if( ! p(readBuffer_) ) { 
 
  151         inline Buffer::size_type initWriteBuffer() {
 
  152             Buffer::size_type to_write = std::min(writeBuffer_.size() - bytesWritten_, BUFFER_SIZE);
 
  153             Buffer::const_iterator b = writeBuffer_.begin() + bytesWritten_;
 
  154             Buffer::const_iterator e = b + to_write;
 
  155             std::copy( b, e, buffer_ );
 
  160         inline void writeEvent(
const boost::system::error_code& error, std::size_t bytes_transferred) {
 
  162             if(!error && !cancel_) { 
 
  163                 if(bytes_transferred > 0) { 
 
  164                     bytesWritten_ += bytes_transferred;
 
  165                     if(bytesWritten_ >= writeBuffer_.size()) {
 
  175         inline void timerEvent(
const boost::system::error_code& error) {
 
  184     typedef BasicSerialPort<boost::chrono::steady_clock> SerialPort;
 
  188 #endif // MT4CPP_SERIAL_PORT_HPP 
~BasicSerialPort()
Definition: SerialPort.hpp:62
Definition: Command.hpp:21
the template for object represents serial port with timeout 
Definition: SerialPort.hpp:28
const Buffer & read_if(ReadPredicate p)
Definition: SerialPort.hpp:67
BasicSerialPort(const std::string &port_name, const Timeout timeout, boost::asio::serial_port_base::baud_rate baud_rate=boost::asio::serial_port_base::baud_rate(9600), boost::asio::serial_port_base::flow_control flow_control=boost::asio::serial_port_base::flow_control(boost::asio::serial_port_base::flow_control::none), boost::asio::serial_port_base::parity parity=boost::asio::serial_port_base::parity(boost::asio::serial_port_base::parity::none), boost::asio::serial_port_base::stop_bits stop_bits=boost::asio::serial_port_base::stop_bits(boost::asio::serial_port_base::stop_bits::one), boost::asio::serial_port_base::character_size character_size=boost::asio::serial_port_base::character_size(8))
Definition: SerialPort.hpp:36
Buffer::size_type write(const Buffer &buf)
Definition: SerialPort.hpp:86
const Buffer & read_n(int n)
Definition: SerialPort.hpp:81