use crate::protocol as proto;
use tokio_modbus::prelude::{Reader, Writer};
pub struct R413D08 {
ctx: tokio_modbus::client::Context,
}
impl R413D08 {
pub fn new(ctx: tokio_modbus::client::Context) -> Self {
Self { ctx }
}
pub async fn read_ports(&mut self) -> tokio_modbus::Result<proto::PortStates> {
let rsp = self
.ctx
.read_holding_registers(proto::PortStates::ADDRESS, proto::PortStates::QUANTITY)
.await;
match rsp {
Ok(Ok(rsp)) => {
Ok(Ok(proto::PortStates::decode_from_holding_registers(&rsp)))
}
Ok(Err(err)) => {
Ok(Err(err))
}
Err(err) => {
Err(err)
}
}
}
pub async fn set_port_open(&mut self, port: proto::Port) -> tokio_modbus::Result<()> {
self.ctx
.write_single_register(
port.address_for_write_register(),
proto::Port::REG_DATA_SET_PORT_OPEN,
)
.await
}
pub async fn set_all_open(&mut self) -> tokio_modbus::Result<()> {
self.ctx
.write_single_register(
proto::PortsAll::ADDRESS,
proto::PortsAll::REG_DATA_SET_ALL_OPEN,
)
.await
}
pub async fn set_port_close(&mut self, port: proto::Port) -> tokio_modbus::Result<()> {
self.ctx
.write_single_register(
port.address_for_write_register(),
proto::Port::REG_DATA_SET_PORT_CLOSE,
)
.await
}
pub async fn set_all_close(&mut self) -> tokio_modbus::Result<()> {
self.ctx
.write_single_register(
proto::PortsAll::ADDRESS,
proto::PortsAll::REG_DATA_SET_ALL_CLOSE,
)
.await
}
pub async fn set_port_toggle(&mut self, port: proto::Port) -> tokio_modbus::Result<()> {
self.ctx
.write_single_register(
port.address_for_write_register(),
proto::Port::REG_DATA_SET_PORT_TOGGLE,
)
.await
}
pub async fn set_port_latch(&mut self, port: proto::Port) -> tokio_modbus::Result<()> {
self.ctx
.write_single_register(
port.address_for_write_register(),
proto::Port::REG_DATA_SET_PORT_LATCH,
)
.await
}
pub async fn set_port_momentary(&mut self, port: proto::Port) -> tokio_modbus::Result<()> {
self.ctx
.write_single_register(
port.address_for_write_register(),
proto::Port::REG_DATA_SET_PORT_MOMENTARY,
)
.await
}
pub async fn set_port_delay(
&mut self,
port: proto::Port,
delay: u8,
) -> tokio_modbus::Result<()> {
self.ctx
.write_single_register(
port.address_for_write_register(),
proto::Port::encode_delay_for_write_register(delay),
)
.await
}
pub async fn read_address(&mut self) -> tokio_modbus::Result<proto::Address> {
let rsp = self
.ctx
.read_holding_registers(proto::Address::ADDRESS, proto::Address::QUANTITY)
.await;
match rsp {
Ok(Ok(rsp)) => {
Ok(Ok(proto::Address::decode_from_holding_registers(&rsp)))
}
Ok(Err(err)) => {
Ok(Err(err))
}
Err(err) => {
Err(err)
}
}
}
pub async fn set_address(&mut self, address: proto::Address) -> tokio_modbus::Result<()> {
self.ctx
.write_single_register(proto::Address::ADDRESS, address.encode_for_write_register())
.await
}
}