use core::fmt;
#[derive(Debug, PartialEq, Eq, Clone, Copy)]
pub enum MbusError {
ParseError,
BasicParseError,
Timeout,
ModbusException(u8),
IoError,
Unexpected,
ConnectionLost,
UnsupportedFunction(u8),
ReservedSubFunction(u16),
InvalidPduLength,
InvalidAduLength,
ConnectionFailed,
ConnectionClosed,
BufferTooSmall,
BufferLenMissmatch,
SendFailed,
InvalidAddress,
InvalidOffset,
TooManyRequests,
InvalidFunctionCode,
NoRetriesLeft,
TooManyFileReadSubRequests,
FileReadPduOverflow,
UnexpectedResponse,
InvalidTransport,
InvalidSlaveAddress,
ChecksumError,
InvalidConfiguration,
InvalidNumOfExpectedRsps,
InvalidDataLen,
InvalidQuantity,
InvalidValue,
InvalidAndMask,
InvalidOrMask,
InvalidByteCount,
InvalidDeviceIdentification,
InvalidDeviceIdCode,
InvalidMeiType,
InvalidBroadcastAddress,
BroadcastNotAllowed,
}
impl MbusError {
pub const fn broadcast_not_allowed() -> Self {
Self::BroadcastNotAllowed
}
}
impl fmt::Display for MbusError {
fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
match self {
MbusError::ParseError => write!(
f,
"Parse error: An error occurred while parsing the Modbus ADU"
),
MbusError::BasicParseError => write!(
f,
"Basic parse error: The received frame is fundamentally malformed"
),
MbusError::Timeout => write!(
f,
"Timeout: The transaction timed out waiting for a response"
),
MbusError::ModbusException(code) => write!(
f,
"Modbus exception: The server responded with exception code 0x{:02X}",
code
),
MbusError::IoError => write!(
f,
"I/O error: An I/O error occurred during TCP communication"
),
MbusError::Unexpected => write!(f, "Unexpected error: An unexpected error occurred"),
MbusError::ConnectionLost => write!(
f,
"Connection lost: The connection was lost during an active transaction"
),
MbusError::UnsupportedFunction(code) => write!(
f,
"Unsupported function: Function code 0x{:02X} is not supported",
code
),
MbusError::ReservedSubFunction(code) => write!(
f,
"Reserved sub-function: Sub-function code 0x{:04X} is not available",
code
),
MbusError::InvalidPduLength => {
write!(f, "Invalid PDU length: The PDU length is invalid")
}
MbusError::InvalidAduLength => {
write!(f, "Invalid ADU length: The ADU length is invalid")
}
MbusError::ConnectionFailed => write!(f, "Connection failed"),
MbusError::ConnectionClosed => write!(f, "Connection closed"),
MbusError::BufferTooSmall => {
write!(f, "Buffer too small: The data was too large for the buffer")
}
MbusError::BufferLenMissmatch => {
write!(f, "Buffer length mismatch: Buffer length is not matching")
}
MbusError::SendFailed => write!(f, "Send failed: Failed to send data"),
MbusError::InvalidAddress => write!(f, "Invalid address"),
MbusError::TooManyRequests => {
write!(f, "Too many requests: Expected responses buffer is full")
}
MbusError::InvalidFunctionCode => write!(f, "Invalid function code"),
MbusError::NoRetriesLeft => write!(f, "No retries left for the transaction"),
MbusError::TooManyFileReadSubRequests => write!(
f,
"Too many sub-requests: Maximum of 35 sub-requests per PDU allowed"
),
MbusError::FileReadPduOverflow => write!(
f,
"File read PDU overflow: Total length of file read sub-requests exceeds maximum allowed bytes per PDU"
),
MbusError::UnexpectedResponse => write!(
f,
"Unexpected response: An unexpected response was received"
),
MbusError::InvalidTransport => write!(
f,
"Invalid transport: The transport is invalid for the requested operation"
),
MbusError::InvalidSlaveAddress => write!(
f,
"Invalid slave address: The provided slave address is invalid"
),
MbusError::ChecksumError => write!(
f,
"Checksum error: The received frame has an invalid checksum"
),
MbusError::InvalidConfiguration => write!(
f,
"Invalid configuration: The provided configuration is invalid"
),
MbusError::InvalidNumOfExpectedRsps => write!(
f,
"Invalid number of expected responses: for serial transports the queue size N must be exactly 1"
),
MbusError::InvalidDataLen => write!(
f,
"Invalid data length: The provided data length is invalid"
),
MbusError::InvalidQuantity => {
write!(f, "Invalid quantity: The provided quantity is invalid")
}
MbusError::InvalidValue => write!(f, "Invalid value: The provided value is invalid"),
MbusError::InvalidAndMask => {
write!(f, "Invalid AND mask: The provided AND mask is invalid")
}
MbusError::InvalidOrMask => {
write!(f, "Invalid OR mask: The provided OR mask is invalid")
}
MbusError::InvalidByteCount => {
write!(f, "Invalid byte count: The provided byte count is invalid")
}
MbusError::InvalidDeviceIdentification => write!(
f,
"Invalid device identification: The provided device identification is invalid"
),
MbusError::InvalidDeviceIdCode => write!(
f,
"Invalid device ID code: The provided device ID code is invalid"
),
MbusError::InvalidMeiType => {
write!(f, "Invalid MEI type: The provided MEI type is invalid")
}
MbusError::InvalidBroadcastAddress => write!(
f,
"Invalid broadcast address: The provided broadcast address (0) is invalid. Must use UnitIdOrSlaveAddr::new_broadcast_address() instead."
),
MbusError::BroadcastNotAllowed => {
write!(f, "Broadcast not allowed: Broadcast not allowed")
}
MbusError::InvalidOffset => write!(f, "Invalid offset: The provided offset is invalid"),
}
}
}
impl core::error::Error for MbusError {}