added expected return

This commit is contained in:
2025-11-22 00:16:09 +01:00
parent 48ecc063bf
commit f3b79bb9aa

View File

@@ -143,6 +143,23 @@ impl Protocol300Message {
bytes_vec
}
// TODO docs and test
/// Returns the expected length of the return telegram, include start byte but excluding ACK byte
///
/// Currently only implemented for Read and Write requests, as the rest is not needed and/or
/// unknown behaviour
///
/// # Errors:
/// - `MessageReturnLengthError` - Describes the error which occured when converting
pub const fn get_expected_return_telegram_length(&self) -> Result<usize, MessageReturnLengthError> {
match (self.message_identifier, self.function_code) {
(MessageIdentifier::Request, FunctionCode::VirtualREAD) => Ok(8 + self.data_length as usize),
(MessageIdentifier::Request, FunctionCode::VirtualWRITE) => Ok(8),
(MessageIdentifier::Response, _) => Err(MessageReturnLengthError::NonsensicalRequest),
_ => Err(MessageReturnLengthError::Unimplemented())
}
}
}
/// Errors that can occur while creating a message
@@ -151,6 +168,18 @@ pub enum MessageCreationError {
/// The data length is longer than u8
#[error("Data too long")]
DataTooLong(#[from] std::num::TryFromIntError),
}
/// Errors that can occur while getting the expected return length of a message
#[derive(Error, Debug, PartialEq, Eq)]
pub enum MessageReturnLengthError {
/// The data length is longer than u8
#[error("Unimplemented")]
Unimplemented(),
/// It makes no sense to get the expected length for a response
#[error("Nonsensical request")]
NonsensicalRequest
}
/// Errors that can occur while decoding a message from bytes
@@ -343,5 +372,33 @@ mod tests {
assert_eq!(bytes_expected, bytes_generated);
}
#[test]
fn test_expected_return_length_read() {
let expected_message = Protocol300Message{
telegram_length: 5,
message_identifier: MessageIdentifier::Request,
function_code: FunctionCode::VirtualREAD,
data_address: 0x0101,
data_length: 2,
data: vec![],
checksum: 0x0A
};
assert_eq!(10_usize, expected_message.get_expected_return_telegram_length().unwrap());
}
#[test]
fn test_expected_return_length_write() {
let expected_message = Protocol300Message{
telegram_length: 9,
message_identifier: MessageIdentifier::Request,
function_code: FunctionCode::VirtualWRITE,
data_address: 0x0101,
data_length: 4,
data: vec![0x01, 0x02, 0x03, 0x04],
checksum: 0x1B
};
assert_eq!(8_usize, expected_message.get_expected_return_telegram_length().unwrap());
}
}