diff --git a/fan-controller/src/fan/mod.rs b/fan-controller/src/fan/mod.rs index 2fe4087..8bf7887 100644 --- a/fan-controller/src/fan/mod.rs +++ b/fan-controller/src/fan/mod.rs @@ -5,7 +5,6 @@ pub(crate) mod set_point; use core::str::FromStr; -use crate::modbus::ReadInputRegister; use crate::{configuration, modbus}; use defmt::{error, info, Format}; use embassy_rp::dma::Channel; diff --git a/fan-controller/src/modbus/client.rs b/fan-controller/src/modbus/client.rs index 0c5951f..ad6ecf5 100644 --- a/fan-controller/src/modbus/client.rs +++ b/fan-controller/src/modbus/client.rs @@ -12,7 +12,7 @@ use embedded_io_async::{Read, Write}; use crate::{ configuration, fan::{self, address, holding_registers, set_point::SetPoint, Fan, FanResponse, BAUD_RATE}, - modbus::{self, ReadInputRegister}, + modbus::{self, function::read_input_register::ReadInputRegister}, }; pub(crate) enum Error { @@ -189,7 +189,7 @@ impl<'a, UART: uart::Instance, PIN: Pin> Client<'a, UART, PIN> { // Device address fan 1 address::FAN_1, // Modbus function code - modbus::function_code::WRITE_SINGLE_REGISTER, + modbus::function::code::WRITE_SINGLE_REGISTER, // Holding register address holding_registers::REFERENCE_SET_POINT[0], holding_registers::REFERENCE_SET_POINT[1], @@ -249,7 +249,7 @@ impl<'a, UART: uart::Instance, PIN: Pin> Client<'a, UART, PIN> { Fan::Two => address::FAN_2, }, // Modbus function code - modbus::function_code::READ_INPUT_REGISTER, + modbus::function::code::READ_INPUT_REGISTER, // Input register address fan::input_registers::TEMPERATURE_SENSOR_1[0], fan::input_registers::TEMPERATURE_SENSOR_1[1], diff --git a/fan-controller/src/modbus/function/code.rs b/fan-controller/src/modbus/function/code.rs new file mode 100644 index 0000000..5fa6527 --- /dev/null +++ b/fan-controller/src/modbus/function/code.rs @@ -0,0 +1,3 @@ +pub const READ_HOLDING_REGISTER: u8 = 0x03; +pub const READ_INPUT_REGISTER: u8 = 0x04; +pub const WRITE_SINGLE_REGISTER: u8 = 0x06; diff --git a/fan-controller/src/modbus/function/mod.rs b/fan-controller/src/modbus/function/mod.rs new file mode 100644 index 0000000..1edfdce --- /dev/null +++ b/fan-controller/src/modbus/function/mod.rs @@ -0,0 +1,6 @@ +pub(super) mod code; +pub(crate) mod read_input_register; + +pub(crate) trait Function { + const CODE: u8; +} diff --git a/fan-controller/src/modbus/function/read_input_register.rs b/fan-controller/src/modbus/function/read_input_register.rs new file mode 100644 index 0000000..3d50ef5 --- /dev/null +++ b/fan-controller/src/modbus/function/read_input_register.rs @@ -0,0 +1,19 @@ +use crate::modbus::function::{self, Function}; + +pub(crate) struct ReadInputRegister { + pub(crate) address: u16, + pub(crate) number_of_registers: u16, +} + +impl ReadInputRegister { + pub(crate) fn new(address: u16, number_of_registers: u16) -> Self { + Self { + address, + number_of_registers, + } + } +} + +impl Function for ReadInputRegister { + const CODE: u8 = function::code::READ_INPUT_REGISTER; +} diff --git a/fan-controller/src/modbus/mod.rs b/fan-controller/src/modbus/mod.rs index cd5cf4b..7e7c898 100644 --- a/fan-controller/src/modbus/mod.rs +++ b/fan-controller/src/modbus/mod.rs @@ -1,11 +1,9 @@ pub(crate) mod client; +mod function; use crc::{Crc, CRC_16_MODBUS}; -pub(super) mod function_code { - pub const READ_HOLDING_REGISTER: u8 = 0x03; - pub const READ_INPUT_REGISTER: u8 = 0x04; - pub const WRITE_SINGLE_REGISTER: u8 = 0x06; -} + +use crate::modbus::function::{read_input_register::ReadInputRegister, Function}; /// Used to create CRC checksums when forming modbus messages pub(super) const CRC: Crc = Crc::::new(&CRC_16_MODBUS); @@ -32,31 +30,9 @@ pub(super) const fn get_message_delay(baud_rate: u32) -> u64 { MICROSECONDS_FOR_BITS.div_ceil(baud_rate as u64) } -pub(crate) trait Function { - const CODE: u8; -} - -pub(crate) struct ReadInputRegister { - address: u16, - number_of_registers: u16, -} - -impl ReadInputRegister { - pub(crate) fn new(address: u16, number_of_registers: u16) -> Self { - Self { - address, - number_of_registers, - } - } -} - -impl Function for ReadInputRegister { - const CODE: u8 = function_code::READ_INPUT_REGISTER; -} - pub(crate) struct Message { - address: u8, - function: F, + device_address: u8, + pub(crate) function: F, } pub(crate) trait ToBytes { @@ -69,7 +45,7 @@ impl ToBytes<8> for Message { let length_bytes = self.function.number_of_registers.to_be_bytes(); let mut buffer = [ // Device address - self.address, + self.device_address, // Modbus function code self.code(), // Starting address @@ -93,7 +69,10 @@ impl ToBytes<8> for Message { impl Message { pub(crate) fn new(address: u8, function: F) -> Self { - Self { address, function } + Self { + device_address: address, + function, + } } const fn code(&self) -> u8 {