impl.h
Go to the documentation of this file.
1 /***
2  * MIT License
3  *
4  * Copyright (c) 2020 Alessandro Tondo
5  * Copyright (c) 2012 William Woodall, John Harrison
6  *
7  * Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated
8  * documentation files (the "Software"), to deal in the Software without restriction, including without limitation
9  * the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and
10  * to permit persons to whom the Software is furnished to do so, subject to the following conditions:
11  *
12  * The above copyright notice and this permission notice shall be included in all copies or substantial portions of
13  * the Software.
14  *
15  * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO
16  * THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
17  * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
18  * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
19  * SOFTWARE.
20  */
21 
22 #ifndef SERIAL_IMPL_H
23 #define SERIAL_IMPL_H
24 
25 #include <serial/serial.h>
26 
27 #if defined(_WIN32)
28 #include <windows.h>
29 #else
30 #include <fcntl.h>
31 #include <sys/ioctl.h>
32 #include <termios.h>
33 #include <unistd.h>
34 #include <poll.h>
35 
36 #if defined(__linux__)
37 #include <linux/serial.h> //TODO: maybe termios2 could be an alternative
38 #elif defined(__MACH__)
39 #include <AvailabilityMacros.h>
40 #include <mach/clock.h>
41 #include <mach/mach.h>
42 #if defined(MAC_OS_X_VERSION_10_3) && (MAC_OS_X_VERSION_MIN_REQUIRED >= MAC_OS_X_VERSION_10_3)
43 #include <IOKit/serial/ioss.h>
44 #endif
45 //TODO: check if it works properly on macOS
46 #ifndef TIOCINQ
47 #ifdef FIONREAD
48 #define TIOCINQ FIONREAD
49 #else
50 #define TIOCINQ 0x541B
51 #endif
52 #endif
53 #endif
54 #endif
55 
56 namespace serial {
57 
58 #if defined(_WIN32)
59 inline std::string escape(const std::string &str) {
60  std::smatch match;
61  std::regex_search(str, match, std::regex(R"(^\\\\.\\)"));
62  if (match.empty()) {
63  return R"(\\.\)" + str;
64  }
65  return str;
66 }
67 #endif
68 
69 class Serial::SerialImpl {
70  public:
71  SerialImpl(std::string port, unsigned long baudrate, Timeout timeout, bytesize_t bytesize, parity_t parity,
72  stopbits_t stopbits, flowcontrol_t flowcontrol);
73 
74  virtual ~SerialImpl();
75 
76  void open();
77 
78  void close();
79 
80  bool isOpen() const;
81 
82  size_t available() const;
83 
84  bool waitReadable(std::chrono::milliseconds timeout_ms) const;
85 
86  bool waitWritable(std::chrono::milliseconds timeout_ms) const;
87 
88  void waitByteTimes(size_t count) const;
89 
90  size_t read(uint8_t *buf, size_t size = 1);
91 
92  size_t write(const uint8_t *data, size_t size);
93 
94  void flush() const;
95 
96  void flushInput() const;
97 
98  void flushOutput() const;
99 
100  void sendBreak(int duration_ms) const;
101 
102  void setBreak(bool level) const;
103 
104  void setModemStatus(uint32_t request, uint32_t command = 0) const;
105 
106  void setRTS(bool level) const;
107 
108  void setDTR(bool level) const;
109 
110  void waitForModemChanges() const;
111 
112  uint32_t getModemStatus() const;
113 
114  bool getCTS() const;
115 
116  bool getDSR() const;
117 
118  bool getRI() const;
119 
120  bool getCD() const;
121 
122  void setPort(const std::string &port);
123 
124  std::string getPort() const;
125 
126  void setTimeout(const Timeout &timeout);
127 
128  Timeout getTimeout() const;
129 
130  void setBaudrate(unsigned long baudrate);
131 
132  unsigned long getBaudrate() const;
133 
134  void setBytesize(bytesize_t bytesize);
135 
136  bytesize_t getBytesize() const;
137 
138  void setParity(parity_t parity);
139 
140  parity_t getParity() const;
141 
142  void setStopbits(stopbits_t stopbits);
143 
144  stopbits_t getStopbits() const;
145 
146  void setFlowcontrol(flowcontrol_t flowcontrol);
147 
149 
150  protected:
151  void reconfigurePort();
152 
153  private:
154 #if !defined(_WIN32)
155  int fd_;
156 #else
157  HANDLE fd_;
158 #endif
159  std::string port_;
160  bool is_open_;
162  unsigned long baudrate_;
167 };
168 } // namespace serial
169 
170 #endif // SERIAL_IMPL_H
serial::Serial::SerialImpl::bytesize_
bytesize_t bytesize_
Definition: impl.h:202
serial::parity_t
parity_t
Definition: serial.h:68
serial::Serial::SerialImpl::flushOutput
void flushOutput() const
Definition: impl_unix.cpp:560
serial::Serial::SerialImpl::timeout_
Timeout timeout_
Definition: impl.h:199
serial
Definition: impl.h:56
serial::Serial::SerialImpl::setPort
void setPort(const std::string &port)
Definition: impl_unix.cpp:471
serial::Serial::SerialImpl::waitByteTimes
void waitByteTimes(size_t count) const
Definition: impl_unix.cpp:407
serial::Serial::SerialImpl::sendBreak
void sendBreak(int duration_ms) const
Definition: impl_unix.cpp:569
serial::Serial::SerialImpl::open
void open()
Definition: impl_unix.cpp:48
serial::Serial::SerialImpl::getStopbits
stopbits_t getStopbits() const
Definition: impl_unix.cpp:527
serial::Serial::SerialImpl::getPort
std::string getPort() const
Definition: impl_unix.cpp:475
serial::Serial::Timeout
Definition: serial.h:101
serial::Serial::SerialImpl::setBaudrate
void setBaudrate(unsigned long baudrate)
Definition: impl_unix.cpp:487
serial::Serial::SerialImpl::setDTR
void setDTR(bool level) const
Definition: impl_unix.cpp:595
serial::Serial::SerialImpl::waitReadable
bool waitReadable(std::chrono::milliseconds timeout_ms) const
Definition: impl_unix.cpp:393
serial::Serial::SerialImpl::baudrate_
unsigned long baudrate_
Definition: impl.h:200
serial::Serial::SerialImpl::reconfigurePort
void reconfigurePort()
Definition: impl_unix.cpp:80
serial::Serial::SerialImpl::setBytesize
void setBytesize(bytesize_t bytesize)
Definition: impl_unix.cpp:498
serial::Serial::SerialImpl::flush
void flush() const
Definition: impl_unix.cpp:542
serial::Serial::SerialImpl::setModemStatus
void setModemStatus(uint32_t request, uint32_t command=0) const
Definition: impl_unix.cpp:582
serial::Serial::SerialImpl::parity_
parity_t parity_
Definition: impl.h:201
serial::Serial::SerialImpl::getBaudrate
unsigned long getBaudrate() const
Definition: impl_unix.cpp:494
serial::Serial::SerialImpl::flowcontrol_
flowcontrol_t flowcontrol_
Definition: impl.h:204
serial::Serial::SerialImpl::read
size_t read(uint8_t *buf, size_t size=1)
Definition: impl_unix.cpp:415
serial::Serial::SerialImpl::getTimeout
Timeout getTimeout() const
Definition: impl_unix.cpp:483
serial::bytesize_t
bytesize_t
Definition: serial.h:58
serial::Serial::SerialImpl::setRTS
void setRTS(bool level) const
Definition: impl_unix.cpp:591
serial::Serial::SerialImpl::getCD
bool getCD() const
Definition: impl_unix.cpp:636
serial::Serial::SerialImpl::setFlowcontrol
void setFlowcontrol(flowcontrol_t flowcontrol)
Definition: impl_unix.cpp:531
serial::Serial::SerialImpl::is_open_
bool is_open_
Definition: impl.h:198
serial::Serial::SerialImpl::available
size_t available() const
Definition: impl_unix.cpp:371
serial::Serial::SerialImpl::waitWritable
bool waitWritable(std::chrono::milliseconds timeout_ms) const
Definition: impl_unix.cpp:400
serial::Serial::SerialImpl::getModemStatus
uint32_t getModemStatus() const
Definition: impl_unix.cpp:613
serial::Serial::SerialImpl::getCTS
bool getCTS() const
Definition: impl_unix.cpp:624
serial::Serial::SerialImpl::setParity
void setParity(parity_t parity)
Definition: impl_unix.cpp:509
serial::Serial::SerialImpl::setBreak
void setBreak(bool level) const
Definition: impl_unix.cpp:578
serial::Serial::SerialImpl::close
void close()
Definition: impl_unix.cpp:359
serial::Serial::SerialImpl::setStopbits
void setStopbits(stopbits_t stopbits)
Definition: impl_unix.cpp:520
serial::Serial::SerialImpl::getDSR
bool getDSR() const
Definition: impl_unix.cpp:628
serial.h
serial::Serial::SerialImpl
Definition: impl.h:88
serial::Serial::SerialImpl::write
size_t write(const uint8_t *data, size_t size)
Definition: impl_unix.cpp:446
serial::Serial::SerialImpl::port_
std::string port_
Definition: impl.h:197
serial::Serial::SerialImpl::getBytesize
bytesize_t getBytesize() const
Definition: impl_unix.cpp:505
serial::Serial::SerialImpl::~SerialImpl
virtual ~SerialImpl()
Definition: impl_unix.cpp:44
serial::flowcontrol_t
flowcontrol_t
Definition: serial.h:88
serial::Serial::SerialImpl::SerialImpl
SerialImpl(std::string port, unsigned long baudrate, Timeout timeout, bytesize_t bytesize, parity_t parity, stopbits_t stopbits, flowcontrol_t flowcontrol)
Definition: impl_unix.cpp:28
serial::Serial::SerialImpl::getRI
bool getRI() const
Definition: impl_unix.cpp:632
serial::Serial::SerialImpl::getParity
parity_t getParity() const
Definition: impl_unix.cpp:516
serial::stopbits_t
stopbits_t
Definition: serial.h:79
serial::Serial::SerialImpl::waitForModemChanges
void waitForModemChanges() const
Definition: impl_unix.cpp:599
serial::Serial::SerialImpl::getFlowcontrol
flowcontrol_t getFlowcontrol() const
Definition: impl_unix.cpp:538
serial::Serial::SerialImpl::flushInput
void flushInput() const
Definition: impl_unix.cpp:551
serial::Serial::SerialImpl::isOpen
bool isOpen() const
Definition: impl_unix.cpp:367
serial::Serial::SerialImpl::setTimeout
void setTimeout(const Timeout &timeout)
Definition: impl_unix.cpp:479
serial::Serial::SerialImpl::stopbits_
stopbits_t stopbits_
Definition: impl.h:203
serial::Serial::SerialImpl::fd_
int fd_
Definition: impl.h:193


qb_device_driver
Author(s): qbroboticsĀ®
autogenerated on Thu Apr 27 2023 02:36:32