20 #include <boost/asio/executor_work_guard.hpp>
21 #include <boost/asio/io_context.hpp>
35 std::string to_lower(std::string s) {
36 std::transform(s.begin(), s.end(), s.begin(), [](
unsigned char c) { return std::tolower(c); });
44 std::shared_ptr<interface::Channel>
channel;
70 Impl(
const std::string& dev, uint32_t baud, std::shared_ptr<boost::asio::io_context> ioc)
72 explicit Impl(std::shared_ptr<interface::Channel> ch) :
channel(std::move(ch)) {}
85 return p.get_future();
99 boost::asio::executor_work_guard<boost::asio::io_context::executor_type> guard(ioc->get_executor());
174 std::string p = to_lower(
parity);
185 else if (f ==
"hardware")
196 Serial::Serial(
const std::string& d, uint32_t b, std::shared_ptr<boost::asio::io_context> i)
197 : impl_(std::make_unique<
Impl>(d, b, i)) {}
199 impl_->setup_internal_handlers();
218 impl_->data_handler = std::move(h);
222 impl_->connect_handler = std::move(h);
226 impl_->disconnect_handler = std::move(h);
230 impl_->error_handler = std::move(h);
235 impl_->auto_manage = m;
236 if (impl_->auto_manage && !impl_->started)
start();
246 impl_->retry_interval = i;
247 if (impl_->channel) {
248 auto ts = std::dynamic_pointer_cast<transport::Serial>(impl_->channel);
249 if (ts) ts->set_retry_interval(
static_cast<unsigned int>(i.count()));
static std::shared_ptr< interface::Channel > create(const ChannelOptions &options, std::shared_ptr< boost::asio::io_context > external_ioc=nullptr)
A C++17 compatible span-like class for safe array access.
constexpr size_type size() const noexcept
constexpr pointer data() const noexcept
Common interface for 1:1 point-to-point communication (e.g., TcpClient, Serial, Udp)
std::function< void(const ErrorContext &)> ErrorHandler
std::function< void(const MessageContext &)> MessageHandler
std::function< void(const ConnectionContext &)> ConnectionHandler
Modernized Serial Wrapper.
void set_stop_bits(int stop_bits)
void set_retry_interval(std::chrono::milliseconds interval)
config::SerialConfig build_config() const
bool is_connected() const override
std::future< bool > start() override
void set_parity(const std::string &parity)
ChannelInterface & on_disconnect(ConnectionHandler handler) override
ChannelInterface & on_connect(ConnectionHandler handler) override
ChannelInterface & auto_manage(bool manage=true) override
void set_data_bits(int data_bits)
void set_flow_control(const std::string &flow_control)
void set_manage_external_context(bool manage)
ChannelInterface & on_error(ErrorHandler handler) override
Serial(const std::string &device, uint32_t baud_rate)
void set_baud_rate(uint32_t baud_rate)
void send(std::string_view data) override
ChannelInterface & on_data(MessageHandler handler) override
void send_line(std::string_view line) override
std::string uint8_to_string(const uint8_t *data, size_t size)
Safely convert uint8_t* to const char* for string operations.
std::pair< const uint8_t *, size_t > string_to_bytes(std::string_view str)
Safely obtain a view of std::string as byte array without allocation.
wrapper::ConnectionContext ConnectionContext
wrapper::ErrorContext ErrorContext
wrapper::MessageContext MessageContext
enum unilink::config::SerialConfig::Flow flow
unsigned retry_interval_ms
enum unilink::config::SerialConfig::Parity parity
std::shared_ptr< interface::Channel > channel
config::SerialConfig build_config() const
MessageHandler data_handler
bool manage_external_context
Impl(std::shared_ptr< interface::Channel > ch)
std::thread external_thread
std::shared_ptr< boost::asio::io_context > external_ioc
bool start_promise_fulfilled_
ConnectionHandler disconnect_handler
Impl(const std::string &dev, uint32_t baud, std::shared_ptr< boost::asio::io_context > ioc)
void setup_internal_handlers()
std::chrono::milliseconds retry_interval
ConnectionHandler connect_handler
ErrorHandler error_handler
std::promise< bool > start_promise_
bool use_external_context
Impl(const std::string &dev, uint32_t baud)
std::future< bool > start()