modbus_mapping/
core.rs

1use async_trait::async_trait;
2use tokio_modbus::client::{Reader, Writer};
3
4#[async_trait]
5/// Define mapping between Modbus input registers and the Self type
6/// to create and update the type instance by reading values directly from input registers
7pub trait InputRegisterMap
8where
9    Self: Sized + Default,
10{
11    async fn update_from_input_registers(
12        &mut self,
13        client: &mut dyn Reader,
14    ) -> tokio_modbus::Result<()>;
15
16    async fn from_input_registers(client: &mut dyn Reader) -> tokio_modbus::Result<Self> {
17        let mut new = Self::default();
18        let _ = new.update_from_input_registers(client).await?;
19
20        Ok(Ok(new))
21    }
22}
23
24#[async_trait]
25/// Define mapping between Modbus holding registers and the Self type
26/// to create and update the type instance by reading values directly from holding registers, or write the values back to holding registers.
27pub trait HoldingRegisterMap
28where
29    Self: Sized + Default,
30{
31    async fn update_from_holding_registers(
32        &mut self,
33        client: &mut dyn Reader,
34    ) -> tokio_modbus::Result<()>;
35
36    async fn from_holding_registers(client: &mut dyn Reader) -> tokio_modbus::Result<Self> {
37        let mut new = Self::default();
38        let _ = new.update_from_holding_registers(client).await?;
39
40        Ok(Ok(new))
41    }
42
43    async fn write_to_registers(&self, client: &mut dyn Writer) -> tokio_modbus::Result<()>;
44}