iodrivers_base
Driver.hpp
Go to the documentation of this file.
1 #ifndef IODRIVERS_BASE_DRIVER_HH
2 #define IODRIVERS_BASE_DRIVER_HH
3 
4 #include <stdexcept>
5 #include <stdint.h>
6 #include <stdio.h>
7 #include <unistd.h>
8 #include <vector>
9 #include <unistd.h>
10 #include <iodrivers_base/Status.hpp>
11 #include <iodrivers_base/Exceptions.hpp>
12 #include <set>
13 
14 struct addrinfo;
15 
16 namespace iodrivers_base {
17 
18 class IOStream;
19 class IOListener;
20 
21 class FileGuard
22 {
23  int fd;
24 public:
25  explicit FileGuard(int fd = -1)
26  : fd(fd) { }
27  ~FileGuard() { reset(); };
28 
29  void reset(int new_fd = -1)
30  {
31  if (fd != -1) close(fd);
32  fd = new_fd;
33  }
34 
35  int get() const { return fd; }
36  int release()
37  {
38  int ret = fd;
39  fd = -1;
40  return ret;
41  }
42 };
43 
69 class Driver
70 {
71 public:
74 
75  static const int INVALID_FD = -1;
76 
77 private:
79  uint8_t* internal_buffer;
81  size_t internal_buffer_size;
82 
83 public:
84  int const MAX_PACKET_SIZE;
85 
86 protected:
90 
93  std::set<IOListener*> m_listeners;
94 
100 
107 
112  base::Time m_read_timeout;
113 
118  base::Time m_write_timeout;
119 
129  std::pair<int, bool> readPacketInternal(uint8_t* buffer, int bufsize);
130 
144  std::pair<uint8_t const*, int> findPacket(uint8_t const* buffer, int buffer_size) const;
145 
149  std::pair<int, bool> extractPacketFromInternalBuffer(uint8_t* buffer, int out_buffer_size);
150 
155  int doPacketExtraction(uint8_t* buffer);
156 
157  mutable Status m_stats;
158 
159  void openIPClient(std::string const& hostname, int port, addrinfo const& hints);
160 
161 public:
169  Driver(int max_packet_size, bool extract_last = false);
170 
171  virtual ~Driver();
172 
176  void setReadTimeout(base::Time const& t);
177 
179  base::Time getReadTimeout() const;
180 
184  void setWriteTimeout(base::Time const& t);
185 
187  base::Time getWriteTimeout() const;
188 
190  void clear();
191 
196  Status getStatus() const;
197 
200  void resetStatus();
201 
206  Status getStats() const { return getStatus(); }
207 
210  void resetStats() { return resetStatus(); }
211 
216  void setExtractLastPacket(bool flag);
217 
222  bool getExtractLastPacket() const;
223 
233  virtual void openURI(std::string const& uri);
234 
240  bool openInet(const char *hostname, int port);
241 
245  void openTCP(std::string const& hostname, int port);
246 
255  void openUDP(std::string const& hostname, int remote_port);
256 
264  void openUDPBidirectional(std::string const& hostname, int out_port, int in_port);
265 
266 
275  bool openSerial(std::string const& port, int baudrate);
276 
280  void openFile(std::string const& path);
281 
286  static int openSerialIO(std::string const& port, int baudrate);
287 
294  static bool setNonBlockingFlag(int fd);
295 
303  void setFileDescriptor(int fd, bool auto_close = true);
304 
308  int getFileDescriptor() const;
309 
311  bool isValid() const;
312 
313  // In most Linux systems also baudrates up to 1152000 are defined.
315  {
316  SERIAL_1200 = 1200,
317  SERIAL_2400 = 2400,
318  SERIAL_4800 = 4800,
319  SERIAL_9600 = 9600,
320  SERIAL_19200 = 19200,
321  SERIAL_38400 = 38400,
322  SERIAL_57600 = 57600,
323  SERIAL_115200 = 115200,
324  SERIAL_230400 = 230400,
325  SERIAL_460800 = 460800,
326  SERIAL_576000 = 576000,
327  SERIAL_921600 = 921600,
328  SERIAL_1152000 = 1152000
329  };
330 
336  bool setSerialBaudrate(int rate);
337 
343  static bool setSerialBaudrate(int fd, int rate);
344 
346  virtual void close();
347 
349  bool hasPacket() const;
350 
356  int readPacket(uint8_t* buffer, int bufsize);
357 
362  int readPacket(uint8_t* buffer, int bufsize, base::Time const& packet_timeout);
363 
369  int readPacket(uint8_t* buffer, int bufsize, int packet_timeout, int first_byte_timeout = -1);
370 
389  int readPacket(uint8_t* buffer, int bufsize, base::Time const& packet_timeout, base::Time const& first_byte_timeout);
390 
395  bool writePacket(uint8_t const* buffer, int bufsize);
396 
399  bool writePacket(uint8_t const* buffer, int bufsize, int timeout);
400 
408  bool writePacket(uint8_t const* buffer, int bufsize, base::Time const& timeout);
409 
428  virtual int extractPacket(uint8_t const* buffer, size_t buffer_size) const = 0;
429 
436  void setMainStream(IOStream* stream);
437 
440  IOStream* getMainStream() const;
441 
456  void openTestMode();
457 
461  void addListener(IOListener* stream);
462 
466  void removeListener(IOListener* stream);
467 
468  static std::string printable_com(std::string const& buffer);
469  static std::string printable_com(uint8_t const* buffer, size_t buffer_size);
470  static std::string printable_com(char const* buffer, size_t buffer_size);
471 
472  static std::string binary_com(std::string const& str);
473  static std::string binary_com(uint8_t const* str, size_t str_size);
474  static std::string binary_com(char const* str, size_t str_size);
475 };
476 
477 }
478 
479 #endif
480 
std::pair< int, bool > extractPacketFromInternalBuffer(uint8_t *buffer, int out_buffer_size)
Definition: Driver.cpp:602
int release()
Definition: Driver.hpp:36
void openIPClient(std::string const &hostname, int port, addrinfo const &hints)
Definition: Driver.cpp:314
std::set< IOListener * > m_listeners
Definition: Driver.hpp:93
~FileGuard()
Definition: Driver.hpp:27
Definition: Driver.hpp:319
Definition: Driver.hpp:69
void setReadTimeout(base::Time const &t)
Definition: Driver.cpp:679
int readPacket(uint8_t *buffer, int bufsize)
Definition: Driver.cpp:683
iodrivers_base::Status Statistics
Definition: Driver.hpp:73
bool writePacket(uint8_t const *buffer, int bufsize)
Definition: Driver.cpp:784
base::Time getReadTimeout() const
Definition: Driver.cpp:681
Definition: Driver.hpp:327
Status getStatus() const
Definition: Driver.cpp:132
bool setSerialBaudrate(int rate)
Definition: Driver.cpp:416
void removeListener(IOListener *stream)
Definition: Driver.cpp:120
Definition: Driver.hpp:320
int const MAX_PACKET_SIZE
Definition: Driver.hpp:84
bool hasPacket() const
Definition: Driver.cpp:670
bool m_extract_last
Definition: Driver.hpp:106
void reset(int new_fd=-1)
Definition: Driver.hpp:29
Definition: Driver.hpp:323
static std::string binary_com(std::string const &str)
Definition: Driver.cpp:71
void openTCP(std::string const &hostname, int port)
Definition: Driver.cpp:320
virtual ~Driver()
Definition: Driver.cpp:96
Definition: Driver.hpp:21
IOStream * getMainStream() const
Definition: Driver.cpp:110
static std::string printable_com(std::string const &buffer)
Definition: Driver.cpp:48
bool isValid() const
Definition: Driver.cpp:154
Definition: IOStream.hpp:19
void setExtractLastPacket(bool flag)
Definition: Driver.cpp:140
void openUDP(std::string const &hostname, int remote_port)
Definition: Driver.cpp:339
Definition: Driver.hpp:324
static int openSerialIO(std::string const &port, int baudrate)
Definition: Driver.cpp:384
int getFileDescriptor() const
Definition: Driver.cpp:148
Definition: Status.hpp:8
std::pair< uint8_t const *, int > findPacket(uint8_t const *buffer, int buffer_size) const
Definition: Driver.cpp:525
Definition: Driver.hpp:318
static bool setNonBlockingFlag(int fd)
void openTestMode()
Definition: Driver.cpp:233
Definition: Driver.hpp:326
virtual void close()
Definition: Driver.cpp:519
base::Time m_read_timeout
Definition: Driver.hpp:112
bool openInet(const char *hostname, int port)
Definition: Driver.cpp:244
void setFileDescriptor(int fd, bool auto_close=true)
Definition: Driver.cpp:143
int doPacketExtraction(uint8_t *buffer)
Definition: Driver.cpp:583
FileGuard(int fd=-1)
Definition: Driver.hpp:25
void clear()
Definition: Driver.cpp:125
Definition: Driver.hpp:325
static const int INVALID_FD
Definition: Driver.hpp:75
Definition: Driver.hpp:322
Definition: Driver.hpp:317
Status getStats() const
Definition: Driver.hpp:206
Driver(int max_packet_size, bool extract_last=false)
Definition: Driver.cpp:87
Status m_stats
Definition: Driver.hpp:157
void setWriteTimeout(base::Time const &t)
Definition: Driver.cpp:779
virtual void openURI(std::string const &uri)
Definition: Driver.cpp:156
void openFile(std::string const &path)
Definition: Driver.cpp:408
bool openSerial(std::string const &port, int baudrate)
Definition: Driver.cpp:238
void addListener(IOListener *stream)
Definition: Driver.cpp:115
base::Time m_write_timeout
Definition: Driver.hpp:118
void setMainStream(IOStream *stream)
Definition: Driver.cpp:104
Definition: Driver.hpp:316
virtual int extractPacket(uint8_t const *buffer, size_t buffer_size) const =0
std::pair< int, bool > readPacketInternal(uint8_t *buffer, int bufsize)
Definition: Driver.cpp:622
void openUDPBidirectional(std::string const &hostname, int out_port, int in_port)
Definition: Driver.cpp:362
IOStream * m_stream
Definition: Driver.hpp:89
Definition: Driver.hpp:328
Definition: Driver.hpp:321
Definition: IOListener.hpp:12
SERIAL_RATES
Definition: Driver.hpp:314
void resetStatus()
Definition: Driver.cpp:137
void resetStats()
Definition: Driver.hpp:210
bool getExtractLastPacket() const
Definition: Driver.cpp:141
bool m_auto_close
Definition: Driver.hpp:99
base::Time getWriteTimeout() const
Definition: Driver.cpp:781