use crate::ll::commands::Command;
pub fn fast_command() {
todo!()
}
pub fn short_addressed() {
todo!()
}
pub fn full_addressed() {
todo!()
}
pub fn masked_write() {
todo!()
}
pub fn fast_command_header(command: Command) -> [u8; 1] {
let mut builder = TransactionHeaderBuilder::new_fast_command();
builder.write_fast_command_type(command);
builder.build()
}
pub fn short_addressed_header(base_address: u8, mode: AccessMode) -> [u8; 1] {
let mut builder = TransactionHeaderBuilder::new_short();
builder
.write_access_mode(mode)
.write_base_address(base_address);
builder.build()
}
#[allow(unused_parens)]
pub fn full_addressed_header(base_address: u8, sub_address: u8, mode: AccessMode) -> [u8; 2] {
let mut builder = TransactionHeaderBuilder::new_full();
builder
.write_base_address(base_address)
.write_sub_address(sub_address)
.write_access_mode(mode);
builder.build()
}
#[allow(unused_parens)]
pub fn masked_write_header(base_address: u8, sub_address: u8, mode: MaskedWriteMode) -> [u8; 2] {
let mut builder = TransactionHeaderBuilder::new_full();
builder
.write_base_address(base_address)
.write_sub_address(sub_address)
.write_access_mode(AccessMode::Write)
.write_operation_mode(mode);
builder.build()
}
pub enum AccessMode {
Read = 0b0,
Write = 0b1,
}
pub enum MaskedWriteMode {
Unmasked = 0b00,
EightBit = 0b01,
SixteenBit = 0b10,
ThirtyTwoBit = 0b11
}
#[derive(Clone)]
pub struct TransactionHeaderBuilder<const N: usize> {
inner: [u8; N]
}
impl<const N: usize> TransactionHeaderBuilder<N> {
pub const fn clear_access_mode(&mut self) -> &mut Self {
self.inner[0] &= 0b01111111;
self
}
#[allow(unused_parens)]
pub const fn write_access_mode(&mut self, mode: AccessMode) -> &mut Self {
self.inner[0] |= (((mode as u8) & 0b00000001) << 7);
self
}
pub const fn set_access_mode(&mut self, mode: AccessMode) -> &mut Self {
self
.clear_access_mode()
.write_access_mode(mode)
}
pub const fn clear_type_bit(&mut self) -> &mut Self {
self.inner[0] &= 0b11111110;
self
}
#[allow(unused_parens)]
pub const fn write_type_bit(&mut self, bit: u8) -> &mut Self {
self.inner[0] |= (bit & 0b00000001);
self
}
pub const fn set_type_bit(&mut self, bit: u8) -> &mut Self {
self
.clear_type_bit()
.write_type_bit(bit)
}
pub const fn clear_five_bits(&mut self) -> &mut Self {
self.inner[0] &= 0b11000001;
self
}
#[allow(unused_parens)]
pub const fn write_five_bits(&mut self, bits: u8) -> &mut Self {
self.inner[0] |= ((bits & 0b00011111) << 1);
self
}
pub const fn set_five_bits(&mut self, bits: u8) -> &mut Self {
self
.clear_five_bits()
.write_five_bits(bits)
}
pub const fn clear_base_address(&mut self) -> &mut Self {
self.clear_five_bits()
}
#[allow(unused_parens)]
pub const fn write_base_address(&mut self, address: u8) -> &mut Self {
self.write_five_bits(address)
}
pub const fn set_base_address(&mut self, address: u8) -> &mut Self {
self
.clear_base_address()
.write_base_address(address)
}
}
impl TransactionHeaderBuilder<1> {
pub const EMPTY_FAST_COMMAND: TransactionHeaderBuilder<1> = TransactionHeaderBuilder::empty_fast_command();
pub const fn new_short() -> Self {
Self { inner: [0b00000000] }
}
const fn empty_fast_command() -> Self {
let mut header = Self::new_short();
header
.write_access_mode(AccessMode::Write)
.write_type(true);
header
}
pub fn new_fast_command() -> Self {
Self::EMPTY_FAST_COMMAND.clone()
}
pub const fn clear_type(&mut self) -> &mut Self {
self.clear_type_bit()
}
pub const fn write_type(&mut self, bit: bool) -> &mut Self {
self.write_type_bit(bit as u8)
}
pub const fn set_type(&mut self, bit: bool) -> &mut Self {
self.set_type_bit(bit as u8)
}
pub const fn clear_fast_command_type(&mut self) -> &mut Self {
self.clear_five_bits()
}
pub const fn write_fast_command_type(&mut self, command: Command) -> &mut Self {
self.write_five_bits(command as u8)
}
pub const fn set_fast_command_type(&mut self, command: Command) -> &mut Self {
self.set_five_bits(command as u8)
}
pub const fn clear_fast_command(&mut self) -> &mut Self {
self
.clear_access_mode()
.clear_fast_command_type()
.clear_type()
}
pub const fn write_fast_command(&mut self, command: Command) -> &mut Self {
self
.write_access_mode(AccessMode::Write)
.write_fast_command_type(command)
.write_type(true)
}
pub const fn set_fast_command(&mut self, command: Command) -> &mut Self {
self
.set_access_mode(AccessMode::Write)
.set_fast_command_type(command)
.set_type(true)
}
pub const fn build(mut self) -> [u8; 1] {
self.inner[0] &= 0b10111111;
self.inner
}
}
impl TransactionHeaderBuilder<2> {
pub const fn new_full() -> Self {
Self { inner: [0b01000000, 0b00000000] }
}
pub const fn clear_operation_mode(&mut self) -> &mut Self {
self.inner[1] &= 0b11111100;
self
}
#[allow(unused_parens)]
pub const fn write_operation_mode(&mut self, mode: MaskedWriteMode) -> &mut Self {
self.inner[1] |= ((mode as u8) & 0b00000011);
self
}
pub const fn set_operation_mode(&mut self, mode: MaskedWriteMode) -> &mut Self {
self
.clear_operation_mode()
.write_operation_mode(mode)
}
pub const fn clear_sub_address(&mut self) -> &mut Self {
self.clear_type_bit();
self.inner[1] &= 0b00000011;
self
}
#[allow(unused_parens)]
pub const fn write_sub_address(&mut self, mut sub_address: u8) -> &mut Self {
sub_address &= 0b01111111;
self.write_type_bit(sub_address >> 6);
self.inner[1] |= (sub_address << 2);
self
}
pub const fn set_sub_address(&mut self, sub_address: u8) -> &mut Self {
self
.clear_sub_address()
.write_sub_address(sub_address)
}
pub const fn build(mut self) -> [u8; 2] {
self.inner[0] |= 0b01000000;
self.inner
}
}