pub trait ScheduledRequest {
fn slave_id(&self) -> u8;
fn function_code(&self) -> u8;
}
impl ScheduledRequest for crate::batcher::BatchCommand {
fn slave_id(&self) -> u8 {
self.slave_id
}
fn function_code(&self) -> u8 {
self.function_code
}
}
impl ScheduledRequest for crate::coalescer::ReadRequest {
fn slave_id(&self) -> u8 {
self.slave_id
}
fn function_code(&self) -> u8 {
self.function
}
}
#[cfg(test)]
mod tests {
use super::*;
use crate::batcher::BatchCommand;
use crate::bytes::ByteOrder;
use crate::coalescer::ReadRequest;
use crate::value::ModbusValue;
fn sid<R: ScheduledRequest>(r: &R) -> u8 {
r.slave_id()
}
fn fc<R: ScheduledRequest>(r: &R) -> u8 {
r.function_code()
}
#[test]
fn read_request_implements_trait() {
let r = ReadRequest::new(7, 0x03, 100, 10);
assert_eq!(sid(&r), 7);
assert_eq!(fc(&r), 0x03);
}
#[test]
fn batch_command_implements_trait() {
let cmd = BatchCommand {
point_id: 1,
value: ModbusValue::U16(1),
slave_id: 3,
function_code: 0x10,
register_address: 0,
data_type: "uint16",
byte_order: ByteOrder::BigEndian,
};
assert_eq!(sid(&cmd), 3);
assert_eq!(fc(&cmd), 0x10);
}
}