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