use errors::*;
use libmodbus_sys;
use modbus::Modbus;
use std::ffi::CString;
use std::io::Error;
pub trait ModbusTCPPI {
fn new_tcp_pi(node: &str, service: &str) -> Result<Modbus>;
fn tcp_pi_accept(&mut self, socket: &mut i32) -> Result<i32>;
fn tcp_pi_listen(&mut self, num_connection: i32) -> Result<i32>;
}
impl ModbusTCPPI for Modbus {
fn new_tcp_pi(node: &str, service: &str) -> Result<Modbus> {
unsafe {
let node = CString::new(node).unwrap();
let service = CString::new(service).unwrap();
let ctx = libmodbus_sys::modbus_new_tcp_pi(node.as_ptr(), service.as_ptr());
if ctx.is_null() {
bail!(Error::last_os_error())
} else {
Ok(Modbus { ctx: ctx })
}
}
}
fn tcp_pi_accept(&mut self, socket: &mut i32) -> Result<i32> {
unsafe {
match libmodbus_sys::modbus_tcp_pi_accept(self.ctx, socket) {
-1 => bail!(Error::last_os_error()),
socket => Ok(socket),
}
}
}
fn tcp_pi_listen(&mut self, num_connection: i32) -> Result<i32> {
unsafe {
match libmodbus_sys::modbus_tcp_pi_listen(self.ctx, num_connection) {
-1 => bail!(Error::last_os_error()),
socket => Ok(socket),
}
}
}
}