use std::{io, time::Duration};
use super::{block_on_with_timeout, Context};
use tokio_serial::{SerialPortBuilder, SerialStream};
use crate::slave::Slave;
pub fn connect(builder: &SerialPortBuilder) -> io::Result<Context> {
connect_slave(builder, Slave::broadcast())
}
pub fn connect_with_timeout(
builder: &SerialPortBuilder,
timeout: Option<Duration>,
) -> io::Result<Context> {
connect_slave_with_timeout(builder, Slave::broadcast(), timeout)
}
pub fn connect_slave(builder: &SerialPortBuilder, slave: Slave) -> io::Result<Context> {
connect_slave_with_timeout(builder, slave, None)
}
pub fn connect_slave_with_timeout(
builder: &SerialPortBuilder,
slave: Slave,
timeout: Option<Duration>,
) -> io::Result<Context> {
let runtime = tokio::runtime::Builder::new_current_thread()
.enable_io()
.enable_time()
.build()?;
let serial = block_on_with_timeout(&runtime, timeout, async {
SerialStream::open(builder).map_err(Into::into)
})?;
let async_ctx = crate::client::rtu::attach_slave(serial, slave);
let sync_ctx = Context {
runtime,
async_ctx,
timeout,
};
Ok(sync_ctx)
}