This commit is contained in:
2025-12-07 16:50:10 +01:00
parent c2b9eaa8d3
commit a000c0854b
5 changed files with 123 additions and 67 deletions

View File

@@ -1,10 +1,15 @@
use crate::enums::{FunctionCode, MessageIdentifier};
#[expect(clippy::big_endian_bytes, reason="Function is needed for the Protocol 300")]
/// Calculate the checksum for a Protocol 300 message
///
/// The inputs are seperate as the function is needed without have a construced
/// `Protocol300Message` sometimes.
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 mut checksum: u8 = 0;
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) {
for byte in [length, message_identifier.into(), function_code.into(), data_length, addr_hi, addr_lo].iter().chain(data) {
checksum = checksum.wrapping_add(*byte);
}
@@ -12,9 +17,6 @@ pub fn calculate_checksum(length: u8, message_identifier: MessageIdentifier, fun
}
#[cfg(test)]
mod tests {
use crate::{enums::{FunctionCode, MessageIdentifier}, message::Protocol300Message, utils::calculate_checksum};
@@ -28,7 +30,7 @@ mod tests {
use alloc::vec::Vec;
#[test]
fn test_check_checksum_1() {
fn check_checksum_1() {
let test_msg = Protocol300Message {
data_address: 0x5525,
telegram_length: 0x05,
@@ -42,7 +44,7 @@ mod tests {
}
#[test]
fn test_check_checksum_2() {
fn check_checksum_2() {
let test_msg = Protocol300Message {
data_address: 0x5525,
telegram_length: 0x07,
@@ -56,7 +58,7 @@ mod tests {
}
#[test]
fn test_received_message_wrapping_add_from_bytes() {
fn received_message_wrapping_add_from_bytes() {
let checksum = calculate_checksum(0x06, MessageIdentifier::Request, FunctionCode::VirtualWRITE, 0x2323, 0x01, &[0xB6]);
assert_eq!(checksum, 0x05);
}