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::AsyncClientNotifier;
pub use serial_client::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 std::fmt::Display for AsyncError {
fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::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 {
fn source(&self) -> Option<&(dyn std::error::Error + 'static)> {
match self {
Self::Mbus(err) => Some(err),
_ => None,
}
}
}