use errors::*;
use libc::{c_char, c_int};
use libmodbus_sys;
use modbus_mapping::ModbusMapping;
use modbus::Modbus;
use std::io::Error;
pub trait ModbusServer {
fn receive(&self, request: &mut [u8]) -> Result<i32>;
fn reply(&self, request: &[u8], request_len: i32, modbus_mapping: &ModbusMapping) -> Result<i32>;
}
impl ModbusServer for Modbus {
fn receive(&self, request: &mut [u8]) -> Result<i32> {
assert!(request.len() <= libmodbus_sys::MODBUS_MAX_ADU_LENGTH as usize);
unsafe {
let len = libmodbus_sys::modbus_receive(self.ctx, request.as_mut_ptr());
match len {
-1 => bail!(Error::last_os_error()),
len => Ok(len),
}
}
}
fn reply(&self, request: &[u8], request_len: i32, modbus_mapping: &ModbusMapping) -> Result<i32> {
unsafe {
let len =
libmodbus_sys::modbus_reply(self.ctx, request.as_ptr(), request_len, modbus_mapping.modbus_mapping);
match len {
-1 => bail!(Error::last_os_error()),
len => Ok(len),
}
}
}
}