serial.cpp
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 #include <serial/serial.h>
23 #include <serial/impl/impl.h>
24 
25 using namespace serial;
26 
27 Serial::Serial(const std::string &port_name, uint32_t baudrate, Serial::Timeout timeout, bytesize_t bytesize, parity_t parity,
28  stopbits_t stopbits, flowcontrol_t flowcontrol)
29  : pimpl_(new SerialImpl(port_name, baudrate, timeout, bytesize, parity, stopbits, flowcontrol)) {
30 
31 }
32 
34 // pimpl_ is automatically destroyed and close() is called inside pimpl_ destructor
35 }
36 
37 void Serial::open() {
38  pimpl_->open();
39 }
40 
41 void Serial::close() {
42  pimpl_->close();
43 }
44 
45 bool Serial::isOpen() const {
46  return pimpl_->isOpen();
47 }
48 
50  return pimpl_->available();
51 }
52 
54  return pimpl_->waitReadable(pimpl_->getTimeout().getReadConstant());
55 }
56 
58  return pimpl_->waitWritable(pimpl_->getTimeout().getWriteConstant());
59 }
60 
61 void Serial::waitByteTimes(size_t count) {
62  pimpl_->waitByteTimes(count);
63 }
64 
65 size_t Serial::read(uint8_t *buffer, size_t size) {
66  std::lock_guard<std::mutex> read_lock(read_mutex_);
67  return pimpl_->read(buffer, size);
68 }
69 
70 size_t Serial::read(std::vector<uint8_t> &buffer, size_t size) {
71  std::lock_guard<std::mutex> read_lock(read_mutex_);
72  std::unique_ptr<uint8_t[]> buf(new uint8_t[size]);
73  size_t bytes_read = pimpl_->read(buf.get(), size);
74  buffer.insert(buffer.end(), buf.get(), buf.get() + bytes_read);
75  return bytes_read;
76 }
77 
78 size_t Serial::read(std::string &buffer, size_t size) {
79  std::lock_guard<std::mutex> read_lock(read_mutex_);
80  std::unique_ptr<uint8_t[]> buf(new uint8_t[size]);
81  size_t bytes_read = pimpl_->read(buf.get(), size);
82  buffer.append(reinterpret_cast<const char *>(buf.get()), bytes_read);
83  return bytes_read;
84 }
85 
86 std::string Serial::read(size_t size) {
87  std::string buffer;
88  read(buffer, size);
89  return buffer;
90 }
91 
92 size_t Serial::readline_(std::string &line, size_t size, const std::string &eol) {
93  std::unique_ptr<uint8_t[]> buffer(new uint8_t[size]);
94  size_t eol_len = eol.length();
95  size_t read_so_far = 0;
96  while (read_so_far < size) {
97  size_t bytes_read = pimpl_->read(buffer.get() + read_so_far, 1);
98  read_so_far += bytes_read;
99  if (bytes_read == 0) {
100  break; // Timeout occurred on reading 1 byte
101  }
102  if (read_so_far >= eol_len && std::string(reinterpret_cast<const char *>(buffer.get() + read_so_far - eol_len), eol_len) == eol) {
103  break; // EOL found
104  }
105  }
106  line.append(reinterpret_cast<const char *>(buffer.get()), read_so_far);
107  return read_so_far;
108 }
109 
110 size_t Serial::readline(std::string &line, size_t size, const std::string &eol) {
111  std::lock_guard<std::mutex> read_lock(read_mutex_);
112  return readline_(line, size, eol);
113 }
114 
115 std::string Serial::readline(size_t size, const std::string &eol) {
116  std::lock_guard<std::mutex> read_lock(read_mutex_);
117  std::string line;
118  readline_(line, size, eol);
119  return line;
120 }
121 
122 std::vector<std::string> Serial::readlines(size_t size, const std::string &eol) {
123  std::lock_guard<std::mutex> read_lock(read_mutex_);
124  std::vector<std::string> lines;
125  std::string line;
126  while (readline_(line, size, eol) > 0) {
127  lines.push_back(line);
128  size -= line.size();
129  line.clear();
130  }
131  return lines;
132 }
133 
134 size_t Serial::write(const std::string &data) {
135  std::lock_guard<std::mutex> write_lock(write_mutex_);
136  return pimpl_->write(reinterpret_cast<const uint8_t *>(data.c_str()), data.length());
137 }
138 
139 size_t Serial::write(const std::vector<uint8_t> &data) {
140  std::lock_guard<std::mutex> write_lock(write_mutex_);
141  return pimpl_->write(&data[0], data.size());
142 }
143 
144 size_t Serial::write(const uint8_t *data, size_t size) {
145  std::lock_guard<std::mutex> write_lock(write_mutex_);
146  return pimpl_->write(data, size);
147 }
148 
149 void Serial::setPort(const std::string &port_name) {
150  std::lock_guard<std::mutex> read_lock(read_mutex_);
151  std::lock_guard<std::mutex> write_lock(write_mutex_);
152  bool was_open = pimpl_->isOpen();
153  if (was_open) {
154  close();
155  }
156  pimpl_->setPort(port_name);
157  if (was_open) {
158  open();
159  }
160 }
161 
162 std::string Serial::getPort() const {
163  return pimpl_->getPort();
164 }
165 
166 void Serial::setTimeout(const Timeout &timeout) {
167  pimpl_->setTimeout(timeout);
168 }
169 
170 void Serial::setTimeout(uint32_t inter_byte, uint32_t read_constant, uint32_t read_multiplier, uint32_t write_constant, uint32_t write_multiplier) {
171  setTimeout(Timeout(inter_byte, read_constant, read_multiplier, write_constant, write_multiplier));
172 }
173 
175  return pimpl_->getTimeout();
176 }
177 
178 void Serial::setBaudrate(uint32_t baudrate) {
179  pimpl_->setBaudrate(baudrate);
180 }
181 
182 uint32_t Serial::getBaudrate() const {
183  return uint32_t(pimpl_->getBaudrate());
184 }
185 
187  pimpl_->setBytesize(bytesize);
188 }
189 
191  return pimpl_->getBytesize();
192 }
193 
195  pimpl_->setParity(parity);
196 }
197 
199  return pimpl_->getParity();
200 }
201 
203  pimpl_->setStopbits(stopbits);
204 }
205 
207  return pimpl_->getStopbits();
208 }
209 
211  pimpl_->setFlowcontrol(flowcontrol);
212 }
213 
215  return pimpl_->getFlowcontrol();
216 }
217 
219  std::lock_guard<std::mutex> read_lock(read_mutex_);
220  std::lock_guard<std::mutex> write_lock(write_mutex_);
221  pimpl_->flush();
222 }
223 
225  std::lock_guard<std::mutex> read_lock(read_mutex_);
226  pimpl_->flushInput();
227 }
228 
230  std::lock_guard<std::mutex> write_lock(write_mutex_);
231  pimpl_->flushOutput();
232 }
233 
234 void Serial::sendBreak(int duration) {
235  pimpl_->sendBreak(duration);
236 }
237 
238 void Serial::setBreak(bool level) {
239  pimpl_->setBreak(level);
240 }
241 
242 void Serial::setRTS(bool level) {
243  pimpl_->setRTS(level);
244 }
245 
246 void Serial::setDTR(bool level) {
247  pimpl_->setDTR(level);
248 }
249 
251  pimpl_->waitForModemChanges();
252 }
253 
255  return pimpl_->getCTS();
256 }
257 
259  return pimpl_->getDSR();
260 }
261 
263  return pimpl_->getRI();
264 }
265 
267  return pimpl_->getCD();
268 }
serial::Serial::setBaudrate
void setBaudrate(uint32_t baudrate)
Definition: serial.cpp:178
serial::parity_t
parity_t
Definition: serial.h:68
serial::Serial::flushInput
void flushInput()
Definition: serial.cpp:224
serial::Serial::getTimeout
Timeout getTimeout() const
Definition: serial.cpp:174
serial::Serial::setTimeout
void setTimeout(const Timeout &timeout)
Definition: serial.cpp:166
serial::Serial::setPort
void setPort(const std::string &port_name)
Definition: serial.cpp:149
serial::Serial::setParity
void setParity(parity_t parity)
Definition: serial.cpp:194
serial
Definition: impl.h:56
serial::Serial::waitForModemChanges
void waitForModemChanges()
Definition: serial.cpp:250
serial::Serial::readline
size_t readline(std::string &line, size_t size=65536, const std::string &eol="\n")
Definition: serial.cpp:110
serial::Serial::getDSR
bool getDSR()
Definition: serial.cpp:258
serial::Serial::Timeout
Definition: serial.h:101
serial::Serial::close
void close()
Definition: serial.cpp:41
serial::Serial::getParity
parity_t getParity() const
Definition: serial.cpp:198
serial::Serial::setRTS
void setRTS(bool level=true)
Definition: serial.cpp:242
serial::Serial::setBytesize
void setBytesize(bytesize_t bytesize)
Definition: serial.cpp:186
serial::Serial::flush
void flush()
Definition: serial.cpp:218
impl.h
serial::Serial::waitReadable
bool waitReadable()
Definition: serial.cpp:53
serial::Serial::readlines
std::vector< std::string > readlines(size_t size=65536, const std::string &eol="\n")
Definition: serial.cpp:122
serial::Serial::getStopbits
stopbits_t getStopbits() const
Definition: serial.cpp:206
serial::bytesize_t
bytesize_t
Definition: serial.h:58
serial::Serial::getRI
bool getRI()
Definition: serial.cpp:262
serial::Serial::flushOutput
void flushOutput()
Definition: serial.cpp:229
serial::Serial::getCD
bool getCD()
Definition: serial.cpp:266
serial::Serial::pimpl_
std::unique_ptr< SerialImpl > pimpl_
Definition: serial.h:576
serial.h
serial::Serial::setFlowcontrol
void setFlowcontrol(flowcontrol_t flowcontrol)
Definition: serial.cpp:210
serial::Serial::SerialImpl
Definition: impl.h:88
serial::Serial::getBaudrate
uint32_t getBaudrate() const
Definition: serial.cpp:182
serial::Serial::~Serial
virtual ~Serial()
Definition: serial.cpp:33
serial::Serial::getCTS
bool getCTS()
Definition: serial.cpp:254
serial::Serial::open
void open()
Definition: serial.cpp:37
serial::Serial::sendBreak
void sendBreak(int duration)
Definition: serial.cpp:234
serial::Serial::getFlowcontrol
flowcontrol_t getFlowcontrol() const
Definition: serial.cpp:214
serial::flowcontrol_t
flowcontrol_t
Definition: serial.h:88
serial::Serial::setStopbits
void setStopbits(stopbits_t stopbits)
Definition: serial.cpp:202
serial::Serial::available
size_t available()
Definition: serial.cpp:49
serial::Serial::isOpen
bool isOpen() const
Definition: serial.cpp:45
serial::stopbits_t
stopbits_t
Definition: serial.h:79
serial::Serial::setDTR
void setDTR(bool level=true)
Definition: serial.cpp:246
serial::Serial::getBytesize
bytesize_t getBytesize() const
Definition: serial.cpp:190
serial::Serial::waitByteTimes
void waitByteTimes(size_t count)
Definition: serial.cpp:61
serial::Serial::readline_
size_t readline_(std::string &line, size_t size=65536, const std::string &eol="\n")
Definition: serial.cpp:92
serial::Serial::read_mutex_
std::mutex read_mutex_
Definition: serial.h:578
serial::Serial::Serial
Serial(const std::string &port_name="", uint32_t baudrate=9600, Timeout timeout=Timeout(), bytesize_t bytesize=eightbits, parity_t parity=parity_none, stopbits_t stopbits=stopbits_one, flowcontrol_t flowcontrol=flowcontrol_none)
Definition: serial.cpp:27
serial::Serial::getPort
std::string getPort() const
Definition: serial.cpp:162
serial::Serial::setBreak
void setBreak(bool level=true)
Definition: serial.cpp:238
serial::Serial::write
size_t write(const uint8_t *data, size_t size)
Definition: serial.cpp:144
serial::Serial::read
size_t read(uint8_t *buffer, size_t size)
Definition: serial.cpp:65
serial::Serial::write_mutex_
std::mutex write_mutex_
Definition: serial.h:579
serial::Serial::waitWritable
bool waitWritable()
Definition: serial.cpp:57


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