use crate::prelude::*;
use libmodbus_sys as ffi;
pub trait ModbusServer {
fn receive(&self, request: &mut [u8]) -> Result<i32, Error>;
fn reply(
&self,
request: &[u8],
request_len: i32,
modbus_mapping: &ModbusMapping,
) -> Result<i32, Error>;
}
impl ModbusServer for Modbus {
fn receive(&self, request: &mut [u8]) -> Result<i32, Error> {
assert!(request.len() <= Modbus::MAX_ADU_LENGTH as usize);
unsafe {
let len = ffi::modbus_receive(self.ctx, request.as_mut_ptr());
match len {
-1 => Err(Error::Server {
msg: "receive".to_owned(),
source: ::std::io::Error::last_os_error(),
}),
len => Ok(len),
}
}
}
fn reply(
&self,
request: &[u8],
request_len: i32,
modbus_mapping: &ModbusMapping,
) -> Result<i32, Error> {
unsafe {
let len = ffi::modbus_reply(
self.ctx,
request.as_ptr(),
request_len,
modbus_mapping.modbus_mapping,
);
match len {
-1 => Err(Error::Server {
msg: "reply".to_owned(),
source: ::std::io::Error::last_os_error(),
}),
len => Ok(len),
}
}
}
}