NASA Astrobee Robot Software  0.19.1
Flight software for the Astrobee robots operating inside the International Space Station.
serial.h
Go to the documentation of this file.
1 /* Copyright (c) 2017, United States Government, as represented by the
2  * Administrator of the National Aeronautics and Space Administration.
3  *
4  * All rights reserved.
5  *
6  * The Astrobee platform is licensed under the Apache License, Version 2.0
7  * (the "License"); you may not use this file except in compliance with the
8  * License. You may obtain a copy of the License at
9  *
10  * http://www.apache.org/licenses/LICENSE-2.0
11  *
12  * Unless required by applicable law or agreed to in writing, software
13  * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
14  * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
15  * License for the specific language governing permissions and limitations
16  * under the License.
17  */
18 
19 #ifndef FF_SERIAL_SERIAL_H_
20 #define FF_SERIAL_SERIAL_H_
21 
22 // Boost includes
23 #include <boost/asio.hpp>
24 #include <boost/bind.hpp>
25 #include <boost/thread.hpp>
26 #include <boost/utility.hpp>
27 #include <boost/function.hpp>
28 
29 // STL includes
30 #include <functional>
31 #include <vector>
32 #include <string>
33 
34 // Default read buffer size
35 #define MAX_BUFFER_SIZE 512
36 #define MAX_READ_ERRORS 10
37 #define READ_TIMEOUT_MS 1000
38 
39 // Serial read callback signature
40 typedef std::function<void(const uint8_t*, size_t)> SerialReadCallback;
41 typedef std::function<void(void)> SerialTimeoutCallback;
42 typedef std::function<void(void)> SerialShutdownCallback;
43 
44 namespace ff_serial {
45 
49 };
50 
51 // Provides asynchronous serial access
52 class Serial : private boost::noncopyable {
53  public:
54  // Constructor flags not ready
55  explicit Serial(SerialReadCallback cb_read);
56 
57  // Set a callback when a read timeout occurs
58  void SetTimeoutCallback(SerialTimeoutCallback cb, uint32_t ms = 1000);
59 
60  // Set a callback when a shutdown of the connection occurs (EOF)
62 
63  // Destructor
64  virtual ~Serial();
65 
66  // Open a serial port
67  bool Open(const std::string& port_name, unsigned int baud_rate,
68  boost::asio::serial_port_base::parity option_parity =
69  boost::asio::serial_port_base::parity(
70  boost::asio::serial_port_base::parity::none),
71  boost::asio::serial_port_base::character_size option_csize =
72  boost::asio::serial_port_base::character_size(8),
73  boost::asio::serial_port_base::flow_control option_flow =
74  boost::asio::serial_port_base::flow_control(
75  boost::asio::serial_port_base::flow_control::none),
76  boost::asio::serial_port_base::stop_bits option_stop =
77  boost::asio::serial_port_base::stop_bits(
78  boost::asio::serial_port_base::stop_bits::one));
79 
80  // Check if serial is open
81  bool IsOpen();
82 
83  // Close a serial port
84  void Close();
85 
86  // Write some data to the serial port
87  size_t Write(const uint8_t *data, size_t size);
88 
89  // Set reset pint state
91 
92  protected:
93  // Start a read action (timeout = 0 implies no timeout)
94  void ReadStart();
95 
96  // Stop a read action
97  void ReadStop(const boost::system::error_code& error, size_t bytes);
98 
99  // Timeout on read
100  void TimeoutCallback(const boost::system::error_code& error);
101 
102  private:
103  boost::asio::io_service asio_; // ASIO service
104  boost::asio::serial_port port_; // Serial port
105  boost::asio::deadline_timer timer_; // Timeout
106  boost::thread thread_; // Worker thread
107  SerialReadCallback cb_read_; // Read callback
108  SerialTimeoutCallback cb_timeout_; // Timeout callback
109  SerialShutdownCallback cb_shutdown_; // Shutdown callback
110  uint8_t buffer_[MAX_BUFFER_SIZE]; // Data buffer
111  uint32_t timeout_ms_; // Ms read timeout
112  bool timeout_; // Was there a timeout?
113 };
114 
115 } // namespace ff_serial
116 
117 #endif // FF_SERIAL_SERIAL_H_
ff_serial::Serial::SetShutdownCallback
void SetShutdownCallback(SerialShutdownCallback cb)
Definition: serial.cc:41
ff_serial::Serial::SetTimeoutCallback
void SetTimeoutCallback(SerialTimeoutCallback cb, uint32_t ms=1000)
Definition: serial.cc:35
MAX_BUFFER_SIZE
#define MAX_BUFFER_SIZE
Definition: serial.h:35
ff_serial::RESET_PIN_LOW
@ RESET_PIN_LOW
Definition: serial.h:47
ff_serial::Serial::Close
void Close()
Definition: serial.cc:80
ff_serial::Serial::TimeoutCallback
void TimeoutCallback(const boost::system::error_code &error)
Definition: serial.cc:122
ff_serial::Serial::ReadStart
void ReadStart()
Definition: serial.cc:89
ff_serial::Serial
Definition: serial.h:52
ff_serial::SerialResetPinState
SerialResetPinState
Definition: serial.h:46
ff_serial::Serial::ReadStop
void ReadStop(const boost::system::error_code &error, size_t bytes)
Definition: serial.cc:102
ff_serial::Serial::SetResetPinState
void SetResetPinState(SerialResetPinState state)
Definition: serial.cc:137
SerialTimeoutCallback
std::function< void(void)> SerialTimeoutCallback
Definition: serial.h:41
SerialShutdownCallback
std::function< void(void)> SerialShutdownCallback
Definition: serial.h:42
ff_serial::RESET_PIN_HIGH
@ RESET_PIN_HIGH
Definition: serial.h:48
ff_serial::Serial::Open
bool Open(const std::string &port_name, unsigned int baud_rate, boost::asio::serial_port_base::parity option_parity=boost::asio::serial_port_base::parity(boost::asio::serial_port_base::parity::none), boost::asio::serial_port_base::character_size option_csize=boost::asio::serial_port_base::character_size(8), boost::asio::serial_port_base::flow_control option_flow=boost::asio::serial_port_base::flow_control(boost::asio::serial_port_base::flow_control::none), boost::asio::serial_port_base::stop_bits option_stop=boost::asio::serial_port_base::stop_bits(boost::asio::serial_port_base::stop_bits::one))
Definition: serial.cc:46
ff_serial::Serial::~Serial
virtual ~Serial()
Definition: serial.cc:30
ff_serial
Definition: serial.h:44
ff_serial::Serial::Serial
Serial(SerialReadCallback cb_read)
Definition: serial.cc:26
error
uint8_t error
Definition: signal_lights.h:89
state
uint8_t state
Definition: signal_lights.h:90
ff_serial::Serial::Write
size_t Write(const uint8_t *data, size_t size)
Definition: serial.cc:130
SerialReadCallback
std::function< void(const uint8_t *, size_t)> SerialReadCallback
Definition: serial.h:40
ff_serial::Serial::IsOpen
bool IsOpen()
Definition: serial.cc:75