use mbus_core::{
errors::MbusError,
function_codes::public::{DiagnosticSubFunction, EncapsulatedInterfaceType},
transport::UnitIdOrSlaveAddr,
};
#[cfg(feature = "coils")]
use crate::services::coil::Coils;
#[cfg(feature = "diagnostics")]
use crate::services::diagnostic::DeviceIdentificationResponse;
#[cfg(feature = "discrete-inputs")]
use crate::services::discrete_input::DiscreteInputs;
#[cfg(feature = "fifo")]
use crate::services::fifo_queue::FifoQueue;
#[cfg(feature = "file-record")]
use crate::services::file_record::SubRequestParams;
#[cfg(feature = "registers")]
use crate::services::register::Registers;
pub trait RequestErrorNotifier {
fn request_failed(
&mut self,
txn_id: u16,
unit_id_slave_addr: UnitIdOrSlaveAddr,
error: MbusError,
);
}
#[cfg(feature = "traffic")]
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
pub enum TrafficDirection {
Tx,
Rx,
}
#[cfg(feature = "traffic")]
pub trait TrafficNotifier {
fn on_tx_frame(&mut self, _txn_id: u16, _unit_id_slave_addr: UnitIdOrSlaveAddr, _frame: &[u8]) {
}
fn on_rx_frame(&mut self, _txn_id: u16, _unit_id_slave_addr: UnitIdOrSlaveAddr, _frame: &[u8]) {
}
fn on_tx_error(
&mut self,
_txn_id: u16,
_unit_id_slave_addr: UnitIdOrSlaveAddr,
_error: MbusError,
_frame: &[u8],
) {
}
fn on_rx_error(
&mut self,
_txn_id: u16,
_unit_id_slave_addr: UnitIdOrSlaveAddr,
_error: MbusError,
_frame: &[u8],
) {
}
}
#[cfg(feature = "coils")]
pub trait CoilResponse {
fn read_coils_response(
&mut self,
txn_id: u16,
unit_id_slave_addr: UnitIdOrSlaveAddr,
coils: &Coils,
);
fn read_single_coil_response(
&mut self,
txn_id: u16,
unit_id_slave_addr: UnitIdOrSlaveAddr,
address: u16,
value: bool,
);
fn write_single_coil_response(
&mut self,
txn_id: u16,
unit_id_slave_addr: UnitIdOrSlaveAddr,
address: u16,
value: bool,
);
fn write_multiple_coils_response(
&mut self,
txn_id: u16,
unit_id_slave_addr: UnitIdOrSlaveAddr,
address: u16,
quantity: u16,
);
}
#[cfg(feature = "fifo")]
pub trait FifoQueueResponse {
fn read_fifo_queue_response(
&mut self,
txn_id: u16,
unit_id_slave_addr: UnitIdOrSlaveAddr,
fifo_queue: &FifoQueue,
);
}
#[cfg(feature = "file-record")]
pub trait FileRecordResponse {
fn read_file_record_response(
&mut self,
txn_id: u16,
unit_id_slave_addr: UnitIdOrSlaveAddr,
data: &[SubRequestParams],
);
fn write_file_record_response(&mut self, txn_id: u16, unit_id_slave_addr: UnitIdOrSlaveAddr);
}
#[cfg(feature = "registers")]
pub trait RegisterResponse {
fn read_multiple_input_registers_response(
&mut self,
txn_id: u16,
unit_id_slave_addr: UnitIdOrSlaveAddr,
registers: &Registers,
);
fn read_single_input_register_response(
&mut self,
txn_id: u16,
unit_id_slave_addr: UnitIdOrSlaveAddr,
address: u16,
value: u16,
);
fn read_multiple_holding_registers_response(
&mut self,
txn_id: u16,
unit_id_slave_addr: UnitIdOrSlaveAddr,
registers: &Registers,
);
fn write_single_register_response(
&mut self,
txn_id: u16,
unit_id_slave_addr: UnitIdOrSlaveAddr,
address: u16,
value: u16,
);
fn write_multiple_registers_response(
&mut self,
txn_id: u16,
unit_id_slave_addr: UnitIdOrSlaveAddr,
starting_address: u16,
quantity: u16,
);
fn read_write_multiple_registers_response(
&mut self,
txn_id: u16,
unit_id_slave_addr: UnitIdOrSlaveAddr,
registers: &Registers,
);
fn read_single_register_response(
&mut self,
txn_id: u16,
unit_id_slave_addr: UnitIdOrSlaveAddr,
address: u16,
value: u16,
);
fn read_single_holding_register_response(
&mut self,
txn_id: u16,
unit_id_slave_addr: UnitIdOrSlaveAddr,
address: u16,
value: u16,
);
fn mask_write_register_response(&mut self, txn_id: u16, unit_id_slave_addr: UnitIdOrSlaveAddr);
}
#[cfg(feature = "discrete-inputs")]
pub trait DiscreteInputResponse {
fn read_multiple_discrete_inputs_response(
&mut self,
txn_id: u16,
unit_id_slave_addr: UnitIdOrSlaveAddr,
discrete_inputs: &DiscreteInputs,
);
fn read_single_discrete_input_response(
&mut self,
txn_id: u16,
unit_id_slave_addr: UnitIdOrSlaveAddr,
address: u16,
value: bool,
);
}
#[cfg(feature = "diagnostics")]
pub trait DiagnosticsResponse {
fn read_device_identification_response(
&mut self,
txn_id: u16,
unit_id_slave_addr: UnitIdOrSlaveAddr,
response: &DeviceIdentificationResponse,
);
fn encapsulated_interface_transport_response(
&mut self,
txn_id: u16,
unit_id_slave_addr: UnitIdOrSlaveAddr,
mei_type: EncapsulatedInterfaceType,
data: &[u8],
);
fn read_exception_status_response(
&mut self,
txn_id: u16,
unit_id_slave_addr: UnitIdOrSlaveAddr,
status: u8,
);
fn diagnostics_response(
&mut self,
txn_id: u16,
unit_id_slave_addr: UnitIdOrSlaveAddr,
sub_function: DiagnosticSubFunction,
data: &[u16],
);
fn get_comm_event_counter_response(
&mut self,
txn_id: u16,
unit_id_slave_addr: UnitIdOrSlaveAddr,
status: u16,
event_count: u16,
);
fn get_comm_event_log_response(
&mut self,
txn_id: u16,
unit_id_slave_addr: UnitIdOrSlaveAddr,
status: u16,
event_count: u16,
message_count: u16,
events: &[u8],
);
fn report_server_id_response(
&mut self,
txn_id: u16,
unit_id_slave_addr: UnitIdOrSlaveAddr,
data: &[u8],
);
}