pub(crate) mod command;
pub(crate) mod decode;
pub(crate) mod encode;
#[cfg(feature = "traffic")]
pub mod notifier;
pub(crate) mod response;
pub(crate) mod task;
mod client_core;
mod network_client;
mod serial_client;
pub use client_core::AsyncClientCore;
pub use network_client::AsyncTcpClient;
#[cfg(feature = "traffic")]
pub use notifier::AsyncClientTrafficNotifier;
#[cfg(any(feature = "serial-rtu", feature = "serial-ascii"))]
pub use serial_client::AsyncSerialClientKind;
pub use serial_client::{AsyncAsciiClient, AsyncRtuClient, AsyncSerialClient};
use mbus_core::errors::MbusError;
#[cfg(feature = "diagnostics")]
use mbus_core::function_codes::public::DiagnosticSubFunction;
#[cfg(feature = "diagnostics")]
pub use mbus_core::models::diagnostic::{DeviceIdentificationResponse, ObjectId, ReadDeviceIdCode};
#[cfg(feature = "file-record")]
pub use mbus_core::models::file_record::{SubRequest, SubRequestParams};
#[cfg(feature = "diagnostics")]
#[derive(Debug, Clone, PartialEq, Eq)]
pub struct DiagnosticsDataResponse {
pub sub_function: DiagnosticSubFunction,
pub data: Vec<u16>,
}
#[cfg(feature = "diagnostics")]
pub type CommEventLogResponse = (u16, u16, u16, Vec<u8>);
#[derive(Debug, PartialEq, Eq)]
pub enum AsyncError {
Mbus(MbusError),
WorkerClosed,
UnexpectedResponseType,
Timeout,
}
impl From<MbusError> for AsyncError {
fn from(value: MbusError) -> Self {
Self::Mbus(value)
}
}
impl core::fmt::Display for AsyncError {
fn fmt(&self, f: &mut core::fmt::Formatter<'_>) -> core::fmt::Result {
match self {
Self::Mbus(err) => write!(f, "Modbus error: {err:?}"),
Self::WorkerClosed => write!(f, "async worker channel closed"),
Self::UnexpectedResponseType => write!(f, "unexpected response type from worker"),
Self::Timeout => write!(f, "request timed out"),
}
}
}
impl std::error::Error for AsyncError {}