use core::marker::PhantomData;
use binrw::{BinRead, BinWrite};
use crate::{protocol, protocol::r#struct::Readable};
pub mod read_coils;
pub mod read_discrete_inputs;
pub mod read_exception_status;
pub mod read_registers;
pub mod write_multiple_coils;
pub mod write_multiple_registers;
pub mod write_single_coil;
pub mod write_single_register;
#[derive(Copy, Clone, Debug, Eq, PartialEq, BinRead, BinWrite)]
#[repr(u8)]
#[brw(repr = u8)]
#[must_use]
pub enum Code {
ReadCoils = 1,
ReadDiscreteInputs = 2,
ReadHoldingRegisters = 3,
ReadInputRegisters = 4,
WriteSingleCoil = 5,
WriteSingleRegister = 6,
ReadExceptionStatus = 7,
Diagnostics = 8,
GetCommunicationEventCounter = 11,
GetCommunicationEventLog = 12,
WriteMultipleCoils = 15,
WriteMultipleRegisters = 16,
ReportServerId = 17,
ReadFileRecord = 20,
WriteFileRecord = 21,
MaskWriteRegister = 22,
ReadWriteMultipleRegisters = 23,
ReadFifoQueue = 24,
EncapsulatedInterfaceTransport = 43,
}
impl Code {
#[must_use]
pub const fn with_error_flag(self) -> u8 {
self as u8 | 0x80
}
}
#[derive(Copy, Clone)]
#[must_use]
pub struct ReadCoils<S: Readable>(PhantomData<S>);
impl<S: Readable> protocol::Function for ReadCoils<S> {
const CODE: Code = Code::ReadCoils;
type Args = read_coils::Args;
type Output = read_coils::Output<S>;
}
#[derive(Copy, Clone)]
#[must_use]
pub struct ReadDiscreteInputs<S>(PhantomData<S>);
impl<S: Readable> protocol::Function for ReadDiscreteInputs<S> {
const CODE: Code = Code::ReadDiscreteInputs;
type Args = read_discrete_inputs::Args;
type Output = read_discrete_inputs::Output<S>;
}
#[must_use]
pub struct ReadHoldingRegisters;
impl protocol::Function for ReadHoldingRegisters {
const CODE: Code = Code::ReadHoldingRegisters;
type Args = read_registers::Args;
type Output = read_registers::Output;
}
#[must_use]
pub struct ReadHoldingRegistersExact<const N: usize>;
impl<const N: usize> protocol::Function for ReadHoldingRegistersExact<N> {
const CODE: Code = Code::ReadHoldingRegisters;
type Args = read_registers::ArgsExact<N>;
type Output = read_registers::OutputExact<N>;
}
#[must_use]
pub struct ReadInputRegisters;
impl protocol::Function for ReadInputRegisters {
const CODE: Code = Code::ReadInputRegisters;
type Args = read_registers::Args;
type Output = read_registers::Output;
}
#[must_use]
pub struct ReadInputRegistersExact<const N: usize>;
impl<const N: usize> protocol::Function for ReadInputRegistersExact<N> {
const CODE: Code = Code::ReadInputRegisters;
type Args = read_registers::ArgsExact<N>;
type Output = read_registers::OutputExact<N>;
}
#[must_use]
pub struct WriteSingleCoil;
impl protocol::Function for WriteSingleCoil {
const CODE: Code = Code::WriteSingleCoil;
type Args = write_single_coil::Payload;
type Output = write_single_coil::Payload;
}
#[must_use]
pub struct WriteSingleRegister;
impl protocol::Function for WriteSingleRegister {
const CODE: Code = Code::WriteSingleRegister;
type Args = write_single_register::Payload;
type Output = write_single_register::Payload;
}
#[must_use]
#[derive(Copy, Clone)]
pub struct ReadExceptionStatus;
impl protocol::Function for ReadExceptionStatus {
const CODE: Code = Code::ReadExceptionStatus;
type Args = read_exception_status::Args;
type Output = read_exception_status::Output;
}
#[must_use]
pub struct WriteMultipleCoils;
impl protocol::Function for WriteMultipleCoils {
const CODE: Code = Code::WriteMultipleCoils;
type Args = write_multiple_coils::Args;
type Output = write_multiple_coils::Output;
}
#[must_use]
pub struct WriteMultipleRegisters;
impl protocol::Function for WriteMultipleRegisters {
const CODE: Code = Code::WriteMultipleRegisters;
type Args = write_multiple_registers::Args;
type Output = write_multiple_registers::Output;
}