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 
int release()
Definition: Driver.hpp:36
std::set< IOListener * > m_listeners
Definition: Driver.hpp:93
~FileGuard()
Definition: Driver.hpp:27
Definition: Driver.hpp:69
iodrivers_base::Status Statistics
Definition: Driver.hpp:73
int const MAX_PACKET_SIZE
Definition: Driver.hpp:84
bool m_extract_last
Definition: Driver.hpp:106
void reset(int new_fd=-1)
Definition: Driver.hpp:29
Definition: Driver.hpp:21
Definition: Bus.hpp:9
Definition: IOStream.hpp:19
Definition: Status.hpp:8
base::Time m_read_timeout
Definition: Driver.hpp:112
FileGuard(int fd=-1)
Definition: Driver.hpp:25
Status m_stats
Definition: Driver.hpp:157
base::Time m_write_timeout
Definition: Driver.hpp:118
IOStream * m_stream
Definition: Driver.hpp:89
Definition: IOListener.hpp:12
SERIAL_RATES
Definition: Driver.hpp:314
void resetStats()
Definition: Driver.hpp:210
Status getStats() const
Definition: Driver.hpp:206
bool m_auto_close
Definition: Driver.hpp:99