use failure::Error;
use libmodbus_sys as ffi;
use modbus_mapping::ModbusMapping;
use modbus::Modbus;
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 => bail!(::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 => bail!(::std::io::Error::last_os_error()),
len => Ok(len),
}
}
}
}