Added create response message functions
This commit is contained in:
@@ -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]
|
#[inline]
|
||||||
/// Creates a new `Protocol300message` used to write data to the device
|
/// 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());
|
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);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
}
|
}
|
||||||
Reference in New Issue
Block a user