use crate::{protocol as proto, tokio_common::Result, tokio_sync::R413D08};
use std::sync::{Arc, Mutex};
use tokio_modbus::{client::sync::Context, prelude::SlaveContext, Slave};
#[derive(Clone)]
pub struct SafeClient {
ctx: Arc<Mutex<Context>>,
}
impl SafeClient {
pub fn new(ctx: Context) -> Self {
Self {
ctx: Arc::new(Mutex::new(ctx)),
}
}
pub fn from_shared(ctx: Arc<Mutex<Context>>) -> Self {
Self { ctx }
}
pub fn clone_shared(&self) -> Arc<Mutex<Context>> {
self.ctx.clone()
}
pub fn read_ports(&self) -> Result<proto::PortStates> {
let mut guard = self.ctx.lock().unwrap();
R413D08::read_ports(&mut guard)
}
pub fn set_port_open(&self, port: proto::Port) -> Result<()> {
let mut guard = self.ctx.lock().unwrap();
R413D08::set_port_open(&mut guard, port)
}
pub fn set_all_open(&self) -> Result<()> {
let mut guard = self.ctx.lock().unwrap();
R413D08::set_all_open(&mut guard)
}
pub fn set_port_close(&self, port: proto::Port) -> Result<()> {
let mut guard = self.ctx.lock().unwrap();
R413D08::set_port_close(&mut guard, port)
}
pub fn set_all_close(&self) -> Result<()> {
let mut guard = self.ctx.lock().unwrap();
R413D08::set_all_close(&mut guard)
}
pub fn set_port_toggle(&self, port: proto::Port) -> Result<()> {
let mut guard = self.ctx.lock().unwrap();
R413D08::set_port_toggle(&mut guard, port)
}
pub fn set_port_latch(&self, port: proto::Port) -> Result<()> {
let mut guard = self.ctx.lock().unwrap();
R413D08::set_port_latch(&mut guard, port)
}
pub fn set_port_momentary(&self, port: proto::Port) -> Result<()> {
let mut guard = self.ctx.lock().unwrap();
R413D08::set_port_momentary(&mut guard, port)
}
pub fn set_port_delay(&self, port: proto::Port, delay: u8) -> Result<()> {
let mut guard = self.ctx.lock().unwrap();
R413D08::set_port_delay(&mut guard, port, delay)
}
pub fn read_address(&self) -> Result<proto::Address> {
let mut guard = self.ctx.lock().unwrap();
R413D08::read_address(&mut guard)
}
pub fn set_address(&self, address: proto::Address) -> Result<()> {
let mut guard = self.ctx.lock().unwrap();
R413D08::set_address(&mut guard, address)?;
guard.set_slave(Slave(*address));
Ok(())
}
}