2 #include <ossia/network/sockets/configuration.hpp>
3 #include <ossia/network/sockets/writers.hpp>
5 #include <boost/asio/io_context.hpp>
6 #include <boost/asio/placeholders.hpp>
7 #include <boost/asio/serial_port.hpp>
8 #include <boost/asio/write.hpp>
10 #include <nano_signal_slot.hpp>
15 template <
typename Framing>
19 using proto = boost::asio::serial_port;
20 using socket = boost::asio::serial_port;
21 using encoder =
typename Framing::template encoder<boost::asio::serial_port>;
22 using decoder =
typename Framing::template decoder<boost::asio::serial_port>;
24 serial_socket(
const serial_configuration& conf, boost::asio::io_context& ctx)
26 , m_conf{std::move(conf)}
28 , m_encoder{this->m_port}
29 , m_decoder{this->m_port}
35 m_port.open(m_conf.port);
37 m_port.set_option(proto::baud_rate(m_conf.baud_rate));
38 m_port.set_option(proto::character_size(m_conf.character_size));
39 m_port.set_option(proto::flow_control(
40 static_cast<proto::flow_control::type
>(m_conf.flow_control)));
41 m_port.set_option(proto::parity(
static_cast<proto::parity::type
>(m_conf.parity)));
43 proto::stop_bits(
static_cast<proto::stop_bits::type
>(m_conf.stop_bits)));
45 m_context.post([
this] { on_open(); });
51 struct proc : stream_processor<serial_socket, F>
54 m_decoder.receive(proc{*
this, std::move(f)});
62 m_context.post([
this] {
69 void write(
const char* data, std::size_t sz) { m_encoder.write(data, sz); }
71 bool connected() const noexcept {
return true; }
73 Nano::Signal<void()> on_open;
74 Nano::Signal<void()> on_close;
75 Nano::Signal<void()> on_fail;
77 boost::asio::io_context& m_context;
78 serial_configuration m_conf;
79 boost::asio::serial_port m_port;