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