catch boost exceptions in Serial.h
This commit is contained in:
parent
c694bd30d3
commit
de253b6e81
2 changed files with 50 additions and 16 deletions
|
@ -71,6 +71,8 @@ namespace create {
|
||||||
// Start and stop reading data from Create
|
// Start and stop reading data from Create
|
||||||
bool startReading();
|
bool startReading();
|
||||||
void stopReading();
|
void stopReading();
|
||||||
|
bool openPort(const std::string& portName, const int& baud);
|
||||||
|
bool closePort();
|
||||||
|
|
||||||
protected:
|
protected:
|
||||||
std::shared_ptr<Data> data;
|
std::shared_ptr<Data> data;
|
||||||
|
|
|
@ -40,26 +40,26 @@ namespace create {
|
||||||
|
|
||||||
bool Serial::connect(const std::string& portName, const int& baud, std::function<void()> cb) {
|
bool Serial::connect(const std::string& portName, const int& baud, std::function<void()> cb) {
|
||||||
using namespace boost::asio;
|
using namespace boost::asio;
|
||||||
port.open(portName);
|
if (!openPort(portName, baud)) {
|
||||||
port.set_option(serial_port::baud_rate(baud));
|
return false;
|
||||||
port.set_option(serial_port::character_size(8));
|
}
|
||||||
port.set_option(serial_port::parity(serial_port::parity::none));
|
|
||||||
port.set_option(serial_port::stop_bits(serial_port::stop_bits::one));
|
|
||||||
port.set_option(serial_port::flow_control(serial_port::flow_control::none));
|
|
||||||
|
|
||||||
signals.async_wait(std::bind(&Serial::signalHandler, this, std::placeholders::_1, std::placeholders::_2));
|
signals.async_wait(std::bind(&Serial::signalHandler, this, std::placeholders::_1, std::placeholders::_2));
|
||||||
|
|
||||||
usleep(1000000);
|
usleep(1000000);
|
||||||
|
|
||||||
if (port.is_open()) {
|
if (!port.is_open()) {
|
||||||
callback = cb;
|
return false;
|
||||||
bool startReadSuccess = startReading();
|
|
||||||
if (!startReadSuccess) {
|
|
||||||
port.close();
|
|
||||||
}
|
|
||||||
return startReadSuccess;
|
|
||||||
}
|
}
|
||||||
return false;
|
|
||||||
|
callback = cb;
|
||||||
|
bool startReadSuccess = startReading();
|
||||||
|
if (!startReadSuccess) {
|
||||||
|
closePort();
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
void Serial::disconnect() {
|
void Serial::disconnect() {
|
||||||
|
@ -76,6 +76,33 @@ namespace create {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
bool Serial::openPort(const std::string& portName, const int& baud) {
|
||||||
|
using namespace boost::asio;
|
||||||
|
try {
|
||||||
|
port.open(portName);
|
||||||
|
port.set_option(serial_port::baud_rate(baud));
|
||||||
|
port.set_option(serial_port::character_size(8));
|
||||||
|
port.set_option(serial_port::parity(serial_port::parity::none));
|
||||||
|
port.set_option(serial_port::stop_bits(serial_port::stop_bits::one));
|
||||||
|
port.set_option(serial_port::flow_control(serial_port::flow_control::none));
|
||||||
|
} catch (const boost::system::system_error& /*e*/) {
|
||||||
|
CERR("[create::Serial] ", "failed to open port: " << portName);
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
bool Serial::closePort() {
|
||||||
|
using namespace boost::asio;
|
||||||
|
try {
|
||||||
|
port.close();
|
||||||
|
} catch (const boost::system::system_error& /*e*/) {
|
||||||
|
CERR("[create::Serial] ", "failed to close port");
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
bool Serial::startReading() {
|
bool Serial::startReading() {
|
||||||
if (!connected()) return false;
|
if (!connected()) return false;
|
||||||
|
|
||||||
|
@ -186,8 +213,13 @@ namespace create {
|
||||||
CERR("[create::Serial] ", "send failed, not connected.");
|
CERR("[create::Serial] ", "send failed, not connected.");
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
// TODO: catch boost exceptions
|
|
||||||
boost::asio::write(port, boost::asio::buffer(bytes, numBytes));
|
try {
|
||||||
|
boost::asio::write(port, boost::asio::buffer(bytes, numBytes));
|
||||||
|
} catch (const boost::system::system_error & e) {
|
||||||
|
CERR("[create::Serial] ", "failed to write bytes to port");
|
||||||
|
return false;
|
||||||
|
}
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue