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