use crate::services::diagnostic::{ObjectId, ReadDeviceIdCode};
use mbus_core::{
data_unit::common::Pdu,
errors::MbusError,
function_codes::public::{DiagnosticSubFunction, EncapsulatedInterfaceType, FunctionCode},
};
pub(super) struct ReqPduCompiler {}
impl ReqPduCompiler {
pub(super) fn read_exception_status_request() -> Result<Pdu, MbusError> {
Ok(Pdu::build_empty(FunctionCode::ReadExceptionStatus))
}
pub(super) fn diagnostics_request(
sub_function: DiagnosticSubFunction,
data: &[u16],
) -> Result<Pdu, MbusError> {
if data.len() > 125 {
return Err(MbusError::InvalidPduLength);
}
Pdu::build_sub_function(FunctionCode::Diagnostics, sub_function.into(), data)
}
pub(super) fn get_comm_event_counter_request() -> Result<Pdu, MbusError> {
Ok(Pdu::build_empty(FunctionCode::GetCommEventCounter))
}
pub(super) fn get_comm_event_log_request() -> Result<Pdu, MbusError> {
Ok(Pdu::build_empty(FunctionCode::GetCommEventLog))
}
pub(super) fn report_server_id_request() -> Result<Pdu, MbusError> {
Ok(Pdu::build_empty(FunctionCode::ReportServerId))
}
pub(super) fn encapsulated_interface_transport_request(
mei_type: EncapsulatedInterfaceType,
data: &[u8],
) -> Result<Pdu, MbusError> {
Pdu::build_mei_type(
FunctionCode::EncapsulatedInterfaceTransport,
mei_type.into(),
data,
)
}
pub(super) fn read_device_identification_request(
read_device_id_code: ReadDeviceIdCode,
object_id: ObjectId,
) -> Result<Pdu, MbusError> {
Pdu::build_mei_type(
FunctionCode::EncapsulatedInterfaceTransport,
EncapsulatedInterfaceType::ReadDeviceIdentification as u8,
&[read_device_id_code as u8, object_id.into()],
)
}
}