use crate::atmega2560p::com::usart_initialize::UsartObject;
use crate::delay::delay_ms;
use bit_field::BitField;
use core::u32;
impl UsartObject {
pub unsafe fn recieve_enable(&mut self) {
(*self.usart).ucsrb.update(|ucsrb| {
ucsrb.set_bit(4, true);
});
}
pub fn available(&mut self) -> bool {
let ucsra = unsafe { (*self.usart).ucsra.read() };
if ucsra.get_bit(7) == true {
true
} else {
false
}
}
pub fn recieve_data(&mut self) -> Option<u32> {
let ucsrc = unsafe { (*self.usart).ucsrc.read() };
let ucsrb = unsafe { (*self.usart).ucsrb.read() };
let mut i: i32 = 10;
while self.available() == false {
if i != 0 {
delay_ms(1000);
i = i - 1;
} else {
unreachable!()
}
}
if ucsrc.get_bits(1..3) == 0b11 && ucsrb.get_bit(2) == true {
let ucsra = unsafe { (*self.usart).ucsra.read() };
let mut udr: u32 = unsafe { (*self.usart).udr.read() as u32 };
if ucsra.get_bits(2..5) != 0b000 {
None
} else {
let rxb8: u32 = ucsrb.get_bits(1..2) as u32;
udr.set_bits(8..9, rxb8);
Some(udr)
}
}
else {
let ucsra = unsafe { (*self.usart).ucsra.read() };
let udr: u32 = unsafe { (*self.usart).udr.read() as u32 };
if ucsra.get_bits(2..5) != 0b000 {
None
} else {
Some(udr)
}
}
}
pub fn error_check(&mut self) -> bool {
let ucsra = unsafe { (*self.usart).ucsra.read() };
if ucsra.get_bits(3..5) != 0b00 {
true
} else {
false
}
}
pub fn parity_check(&mut self) -> bool {
let ucsra = unsafe { (*self.usart).ucsra.read() };
if ucsra.get_bit(2) == true {
true
} else {
false
}
}
pub unsafe fn recieve_disable(&mut self) {
(*self.usart).ucsrb.update(|ucsrb| {
ucsrb.set_bit(4, false);
});
}
pub unsafe fn flush_recieve(&mut self) {
let mut _udr = (*self.usart).udr.read();
let mut ucsra = (*self.usart).ucsra.read();
let mut i: i32 = 100;
while ucsra.get_bit(7) == true {
ucsra = (*self.usart).ucsra.read();
_udr = (*self.usart).udr.read();
if i != 0 {
delay_ms(1000);
i = i - 1;
} else {
unreachable!()
}
}
(*self.usart).ucsra.update(|ucsra| {
ucsra.set_bit(7, false);
});
}
pub fn read(&mut self) -> Option<u32> {
let ucsrc = unsafe { (*self.usart).ucsrc.read() };
let ucsrb = unsafe { (*self.usart).ucsrb.read() };
let mut i: i32 = 10;
while self.available() == false {
if i != 0 {
delay_ms(1000);
i = i - 1;
} else {
unreachable!()
}
}
if ucsrc.get_bits(1..3) == 0b11 && ucsrb.get_bit(2) == true {
let ucsra = unsafe { (*self.usart).ucsra.read() };
let ucsrb = unsafe { (*self.usart).ucsrb.read() };
let mut udr: u32 = unsafe { (*self.usart).udr.read() as u32 };
if ucsra.get_bits(2..5) != 0b000 {
None
} else {
let rxb8: u32 = ucsrb.get_bits(1..2) as u32;
udr.set_bits(8..9, rxb8);
Some(udr)
}
} else {
let ucsra = unsafe { (*self.usart).ucsra.read() };
let udr: u32 = unsafe { (*self.usart).udr.read() as u32 };
if ucsra.get_bits(2..5) != 0b000 {
None
} else {
Some(udr)
}
}
}
}