From 7d27e6337c7a324d28c19d4e1a641ff503117270 Mon Sep 17 00:00:00 2001 From: Tobias Maier Date: Sat, 3 Jan 2026 20:16:51 +0100 Subject: [PATCH] Added create response message functions --- src/message.rs | 67 ++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 67 insertions(+) diff --git a/src/message.rs b/src/message.rs index 9ef6a4b..4e124af 100644 --- a/src/message.rs +++ b/src/message.rs @@ -53,6 +53,59 @@ impl Protocol300Message { } } + #[inline] + /// Creates a new `Protocol300message` used to respond to a message requesting data + /// + /// # Arguments + /// * `data_address`: Address of the data to read + /// * `data`: Data which should be used to respond to the message + /// + /// # Panics + /// Panics if the data vec is longer than 256 (u8), can never happen in protocol 300 + pub fn new_read_response_message(data_address: u16, data: &[u8]) -> Self{ + let message_identifier = MessageIdentifier::Response; + let function_code = FunctionCode::VirtualREAD; + let data_length = u8::try_from(data.len()).expect("Data should never be longer than 256"); + let telegram_length: u8 = 5 + data_length; + let data = data.to_owned(); + let checksum = calculate_checksum(telegram_length, message_identifier, function_code, data_address, data_length, &data); + Self { + telegram_length, + message_identifier, + function_code, + data_address, + data_length, + data, + checksum + } + } + + + #[inline] + /// Creates a new `Protocol300message` used to respond to a message writing data + /// + /// # Arguments + /// * `data_address`: Address of the data to read + /// * `data`: Data which should be used to respond to the message + /// + /// # Panics + /// Panics if the data vec is longer than 256 (u8), can never happen in protocol 300 + pub fn new_write_response_message(data_address: u16, written_data_length: u8) -> Self{ + let message_identifier = MessageIdentifier::Response; + let function_code = FunctionCode::VirtualWRITE; + let telegram_length: u8 = 5; + let checksum = calculate_checksum(telegram_length, message_identifier, function_code, data_address, written_data_length, &[]); + Self { + telegram_length, + message_identifier, + function_code, + data_address, + data_length: written_data_length, + data: vec![], + checksum + } + } + #[inline] /// Creates a new `Protocol300message` used to write data to the device /// @@ -447,5 +500,19 @@ mod tests { assert_eq!(8_usize, expected_message.get_expected_return_telegram_length().unwrap()); } + #[test] + fn create_read_response_message() { + let generated_message = Protocol300Message::new_read_response_message(0x5525, &[0x07, 0x01]).to_bytes(); + let expected_message = vec![0x41, 0x07, 0x01, 0x01, 0x55, 0x25, 0x02, 0x07, 0x01, 0x8D]; + assert_eq!(generated_message, expected_message); + } + + #[test] + fn create_write_response_message() { + let generated_message = Protocol300Message::new_write_response_message(0x2323, 1).to_bytes(); + let expected_message = vec![0x41, 0x05, 0x01, 0x02, 0x23, 0x23, 0x01, 0x4F]; + assert_eq!(generated_message, expected_message); + } + } \ No newline at end of file