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

57
src/message.rs Normal file
View File

@@ -0,0 +1,57 @@
use crate::{enums::{FunctionCode, MessageIdentifier}, utils::calculate_checksum};
#[derive(PartialEq, Debug)]
pub struct Protocol300Message {
/// Length of the user data in the telegram
pub telegram_length: u8,
/// Message Identifier, Request, Response etc.
pub message_identifier: MessageIdentifier,
/// Function Code, Read Write or RPC
pub function_code: FunctionCode,
/// Data address, 2 bytes represented as u16
pub data_address: u16,
/// Expected return bytes (if it is a request) or
/// Length of the data to write (if it is a write)
pub data_length: u8,
/// Return value of the Vitocontrol if it's a read, if it's a write message
/// it contains the number ofexpected return bytes
pub data: Vec<u8>,
/// Checksum
pub checksum: u8,
}
impl Protocol300Message {
pub fn new_request_message(data_address: u16, data_length: u8) -> Protocol300Message{
let telegram_length: u8 = 5;
let message_identifier = MessageIdentifier::Request;
let function_code = FunctionCode::VirtualREAD;
let data: Vec<u8> = vec![];
let checksum = calculate_checksum(telegram_length, message_identifier, function_code, data_address, data_length, &data);
Protocol300Message {
telegram_length,
message_identifier,
function_code,
data_address,
data_length,
data: vec![],
checksum
}
}
pub fn new_write_message(data_address: u16, data: &[u8]) -> Protocol300Message{
let data_length: u8 = data.len().try_into().expect("Data too long");
let telegram_length: u8 = 5 + data_length;
let message_identifier = MessageIdentifier::Request;
let function_code = FunctionCode::VirtualWRITE;
let checksum = calculate_checksum(telegram_length, message_identifier, function_code, data_address, data_length, data);
Protocol300Message {
telegram_length,
message_identifier,
function_code,
data_address,
data_length,
data: data.to_vec(),
checksum
}
}
}