1pub mod command;
19pub mod decode;
20pub mod encode;
21#[cfg(feature = "traffic")]
22pub mod notifier;
23pub mod response;
24pub(crate) mod task;
25
26mod client_core;
27mod network_client;
28mod serial_client;
29
30pub use client_core::AsyncClientCore;
31pub use command::ClientRequest;
32pub use network_client::AsyncTcpClient;
33#[cfg(feature = "traffic")]
34pub use notifier::AsyncClientTrafficNotifier;
35pub use response::ClientResponse;
36#[cfg(any(feature = "serial-rtu", feature = "serial-ascii"))]
37pub use serial_client::AsyncSerialClientKind;
38pub use serial_client::{AsyncAsciiClient, AsyncRtuClient, AsyncSerialClient};
39
40use mbus_core::errors::MbusError;
41#[cfg(feature = "diagnostics")]
42use mbus_core::function_codes::public::DiagnosticSubFunction;
43#[cfg(feature = "diagnostics")]
44pub use mbus_core::models::diagnostic::{DeviceIdentificationResponse, ObjectId, ReadDeviceIdCode};
45#[cfg(feature = "file-record")]
46pub use mbus_core::models::file_record::{SubRequest, SubRequestParams};
47
48#[cfg(feature = "diagnostics")]
49#[derive(Debug, Clone, PartialEq, Eq)]
51pub struct DiagnosticsDataResponse {
52 pub sub_function: DiagnosticSubFunction,
54 pub data: Vec<u16>,
56}
57#[cfg(feature = "diagnostics")]
58pub type CommEventLogResponse = (u16, u16, u16, Vec<u8>);
60
61#[derive(Debug, PartialEq, Eq)]
63pub enum AsyncError {
64 Mbus(MbusError),
66 WorkerClosed,
68 UnexpectedResponseType,
70 Timeout,
79}
80
81impl From<MbusError> for AsyncError {
82 fn from(value: MbusError) -> Self {
83 Self::Mbus(value)
84 }
85}
86
87impl core::fmt::Display for AsyncError {
88 fn fmt(&self, f: &mut core::fmt::Formatter<'_>) -> core::fmt::Result {
89 match self {
90 Self::Mbus(err) => write!(f, "Modbus error: {err:?}"),
91 Self::WorkerClosed => write!(f, "async worker channel closed"),
92 Self::UnexpectedResponseType => write!(f, "unexpected response type from worker"),
93 Self::Timeout => write!(f, "request timed out"),
94 }
95 }
96}
97
98impl std::error::Error for AsyncError {}