This commit is contained in:
2025-11-10 13:31:32 +01:00
commit 1ce1537487
7 changed files with 648 additions and 0 deletions

49
src/utils.rs Normal file
View File

@@ -0,0 +1,49 @@
use crate::enums::{FunctionCode, MessageIdentifier};
pub fn calculate_checksum(length: u8, message_identifier: MessageIdentifier, function_code: FunctionCode, address: u16, data_length: u8, data: &[u8]) -> u8 {
let mut checksum = 0u8;
let [addr_hi, addr_lo] = address.to_be_bytes();
for byte in [length, message_identifier as u8, function_code as u8, data_length, addr_hi, addr_lo].iter().chain(data) {
checksum = checksum.wrapping_add(*byte);
}
checksum
}
#[cfg(test)]
mod tests {
use crate::{enums::{FunctionCode, MessageIdentifier}, message::Protocol300Message, utils::calculate_checksum};
#[test]
fn test_check_checksum_1() {
let test_msg = Protocol300Message {
data_address: 0x5525,
telegram_length: 0x05,
function_code: FunctionCode::VirtualREAD,
message_identifier: MessageIdentifier::Request,
data_length: 0x02,
data: vec![],
checksum: 0x82,
};
assert_eq!(calculate_checksum(test_msg.telegram_length, test_msg.message_identifier, test_msg.function_code, test_msg.data_address, test_msg.data_length, &test_msg.data), 0x82);
}
#[test]
fn test_check_checksum_2() {
let test_msg = Protocol300Message {
data_address: 0x5525,
telegram_length: 0x07,
function_code: FunctionCode::VirtualREAD,
message_identifier: MessageIdentifier::Response,
data_length: 0x02,
data: vec![0x07, 0x01],
checksum: 0x8D,
};
assert_eq!(calculate_checksum(test_msg.telegram_length, test_msg.message_identifier, test_msg.function_code, test_msg.data_address, test_msg.data_length, &test_msg.data), 0x8D);
}
}