use errors::*;
use libc::c_int;
use libmodbus_sys;
use modbus::Modbus;
use std::ffi::CString;
use std::io::Error;
pub trait ModbusTCP {
fn new_tcp(ip: &str, port: u32) -> Result<Modbus>;
fn tcp_accept(&mut self, socket: &mut i32) -> Result<i32>;
fn tcp_listen(&mut self, num_connection: i32) -> Result<i32>;
}
impl ModbusTCP for Modbus {
fn new_tcp(ip: &str, port: u32) -> Result<Modbus> {
unsafe {
let ip = CString::new(ip).unwrap();
let ctx = libmodbus_sys::modbus_new_tcp(ip.as_ptr(), port as c_int);
if ctx.is_null() {
bail!(Error::last_os_error())
} else {
Ok(Modbus { ctx: ctx })
}
}
}
fn tcp_accept(&mut self, socket: &mut i32) -> Result<i32> {
unsafe {
match libmodbus_sys::modbus_tcp_accept(self.ctx, socket) {
-1 => bail!(Error::last_os_error()),
socket => Ok(socket),
}
}
}
fn tcp_listen(&mut self, num_connection: i32) -> Result<i32> {
unsafe {
match libmodbus_sys::modbus_tcp_listen(self.ctx, num_connection) {
-1 => bail!(Error::last_os_error()),
socket => Ok(socket),
}
}
}
}