realman 0.2.1

realman robot Rust SDK
Documentation
use std::{
    io::{Read, Write},
    thread::sleep,
    time::Duration,
};

use serde::Serialize;

use crate::{
    traits::{ModbusTrait, SetStateResponse, WriteStateResponse},
    BaudrateType, ModbusPortType, PortType, Result, Transport,
};

impl ModbusTrait for Transport {
    fn set_modbus_mode(
        &mut self,
        port: PortType,
        baudrate: BaudrateType,
        timeout: u8,
    ) -> Result<SetStateResponse> {
        let mut buf = [0; 256];

        #[derive(Serialize)]
        struct Command {
            command: &'static str,
            port: u8,
            baudrate: usize,
            timeout: u8,
        }

        let cmd = Command {
            command: "set_modbus_mode",
            port: port.into(),
            baudrate: baudrate.into(),
            timeout: if timeout == 0 { 1 } else { timeout },
        };

        let data = serde_json::to_vec(&cmd)?;

        self.write_all(&data)?;

        let n = self.read(&mut buf)?;

        sleep(Duration::from_millis(10));

        let cmd_resp =
            serde_json::from_str::<SetStateResponse>(&String::from_utf8_lossy(&buf[0..n]))?;

        Ok(cmd_resp)
    }

    fn write_single_register(
        &mut self,
        port: ModbusPortType,
        address: u16,
        data: i16,
        device: i32,
    ) -> Result<WriteStateResponse> {
        let mut buf = [0; 256];

        #[derive(Serialize)]
        struct Command {
            command: &'static str,
            port: u8,
            address: u16,
            data: i16,
            device: i32,
        }

        let cmd = Command {
            command: "write_single_register",
            port: port.into(),
            address,
            data,
            device,
        };

        let data = serde_json::to_vec(&cmd)?;

        self.write_all(&data)?;

        let n = self.read(&mut buf)?;

        let cmd_resp =
            serde_json::from_str::<WriteStateResponse>(&String::from_utf8_lossy(&buf[0..n]))?;

        Ok(cmd_resp)
    }
}