use mbus_core::transport::UnitIdOrSlaveAddr;
use super::pool::MbusClientId;
#[cfg(feature = "network-tcp")]
use super::pool::with_tcp_client;
#[cfg(any(feature = "serial-rtu", feature = "serial-ascii"))]
use super::pool::with_serial_client_uniform;
use crate::c::error::MbusStatusCode;
#[cfg(all(feature = "discrete-inputs", feature = "network-tcp"))]
#[unsafe(no_mangle)]
pub extern "C" fn mbus_tcp_read_discrete_inputs(
id: MbusClientId,
txn_id: u16,
unit_id: u8,
address: u16,
quantity: u16,
) -> MbusStatusCode {
with_tcp_client(id, |inner| {
let uid = match UnitIdOrSlaveAddr::new(unit_id) {
Ok(u) => u,
Err(e) => return MbusStatusCode::from(e),
};
match inner.read_discrete_inputs(txn_id, uid, address, quantity) {
Ok(()) => MbusStatusCode::MbusOk,
Err(e) => MbusStatusCode::from(e),
}
})
.unwrap_or_else(|e| e)
}
#[cfg(all(
feature = "discrete-inputs",
any(feature = "serial-rtu", feature = "serial-ascii")
))]
#[unsafe(no_mangle)]
pub extern "C" fn mbus_serial_read_discrete_inputs(
id: MbusClientId,
txn_id: u16,
unit_id: u8,
address: u16,
quantity: u16,
) -> MbusStatusCode {
with_serial_client_uniform!(id, |inner| {
let uid = match UnitIdOrSlaveAddr::new(unit_id) {
Ok(u) => u,
Err(e) => return MbusStatusCode::from(e),
};
match inner.read_discrete_inputs(txn_id, uid, address, quantity) {
Ok(()) => MbusStatusCode::MbusOk,
Err(e) => MbusStatusCode::from(e),
}
})
.unwrap_or_else(|e| e)
}
#[cfg(all(feature = "discrete-inputs", feature = "network-tcp"))]
#[unsafe(no_mangle)]
pub extern "C" fn mbus_tcp_read_single_discrete_input(
id: MbusClientId,
txn_id: u16,
unit_id: u8,
address: u16,
) -> MbusStatusCode {
with_tcp_client(id, |inner| {
let uid = match UnitIdOrSlaveAddr::new(unit_id) {
Ok(u) => u,
Err(e) => return MbusStatusCode::from(e),
};
match inner.read_single_discrete_input(txn_id, uid, address) {
Ok(()) => MbusStatusCode::MbusOk,
Err(e) => MbusStatusCode::from(e),
}
})
.unwrap_or_else(|e| e)
}
#[cfg(all(
feature = "discrete-inputs",
any(feature = "serial-rtu", feature = "serial-ascii")
))]
#[unsafe(no_mangle)]
pub extern "C" fn mbus_serial_read_single_discrete_input(
id: MbusClientId,
txn_id: u16,
unit_id: u8,
address: u16,
) -> MbusStatusCode {
with_serial_client_uniform!(id, |inner| {
let uid = match UnitIdOrSlaveAddr::new(unit_id) {
Ok(u) => u,
Err(e) => return MbusStatusCode::from(e),
};
match inner.read_single_discrete_input(txn_id, uid, address) {
Ok(()) => MbusStatusCode::MbusOk,
Err(e) => MbusStatusCode::from(e),
}
})
.unwrap_or_else(|e| e)
}