NASA Astrobee Robot Software  Astrobee Version:
Flight software for the Astrobee robots operating inside the International Space Station.
All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros Pages
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