use crate::atmega328p::com::usart_initialize::{Usart, UsartDataSize};
use crate::delay::delay_ms;
use bit_field::BitField;
use core::{f64, u8, usize};
use fixed_slice_vec::FixedSliceVec;
impl Usart {
pub fn transmit_enable(&mut self) {
self.ucsrb.update(|srb| {
srb.set_bit(3, true);
});
}
pub fn transmitting_data(&mut self, data: u32, len: UsartDataSize) {
let mut i: i32 = 10;
while self.avai_write() == false {
if i != 0 {
delay_ms(1000);
i = i - 1;
} else {
unreachable!()
}
}
let mut udr = self.udr.read();
match len {
UsartDataSize::Five => {
udr.set_bits(0..5, data.get_bits(0..5) as u8);
}
UsartDataSize::Six => {
udr.set_bits(0..6, data.get_bits(0..6) as u8);
}
UsartDataSize::Seven => {
udr.set_bits(0..7, data.get_bits(0..7) as u8);
}
UsartDataSize::Eight => {
udr.set_bits(0..8, data.get_bits(0..8) as u8);
}
UsartDataSize::Nine => {
self.ucsrb.update(|ctrl| {
ctrl.set_bit(0, data.get_bit(8));
});
udr.set_bits(0..8, data.get_bits(0..8) as u8);
}
}
}
pub fn avai_write(&mut self) -> bool {
let ucsra = self.ucsra.read();
if ucsra.get_bit(5) == true {
true
} else {
false
}
}
pub fn flush_transmit(&mut self) {
let mut ucsra = self.ucsra.read();
let mut i: i32 = 10;
while ucsra.get_bit(6) == false {
ucsra = self.ucsra.read();
if i != 0 {
delay_ms(1000);
i = i - 1;
} else {
unreachable!()
}
}
}
pub fn transmit_disable(&mut self) {
let ucsra = self.ucsra.read();
let mut uscra6 = ucsra.get_bit(6);
let mut uscra5 = ucsra.get_bit(5);
let mut i: i32 = 100;
while uscra6 == false || uscra5 == false {
uscra6 = ucsra.get_bit(6);
uscra5 = ucsra.get_bit(5);
if i != 0 {
delay_ms(1000);
i = i - 1;
} else {
unreachable!()
}
}
self.ucsrb.update(|srb| {
srb.set_bit(3, false);
});
}
pub fn transmit_data(&mut self, data: u8) {
let mut ucsra = self.ucsra.read();
let mut udre = ucsra.get_bit(5);
let mut i: i32 = 100;
while udre == false {
ucsra = self.ucsra.read();
udre = ucsra.get_bit(5);
if i != 0 {
delay_ms(1000);
i = i - 1;
} else {
unreachable!();
}
}
self.udr.write(data);
}
pub fn write_string(&mut self, data: &'static str) {
let mut vec: FixedSliceVec<u8> = FixedSliceVec::new(&mut []);
for c in data.chars() {
vec.push(c as u8);
}
for i in 0..(vec.len()) {
self.transmit_data(vec[i]);
}
}
pub fn write_integer(&mut self, data: u32) {
let mut vec: FixedSliceVec<u8> = FixedSliceVec::new(&mut []);
let mut a = data;
while a != 0 {
let rem = a % 10;
a = a / 10;
match rem {
0 => vec.push('0' as u8),
1 => vec.push('1' as u8),
2 => vec.push('2' as u8),
3 => vec.push('3' as u8),
4 => vec.push('4' as u8),
5 => vec.push('5' as u8),
6 => vec.push('6' as u8),
7 => vec.push('7' as u8),
8 => vec.push('8' as u8),
9 => vec.push('9' as u8),
_ => unreachable!(),
}
}
for i in 0..(vec.len()) {
self.transmit_data(vec[vec.len() - 1 - i]);
}
}
pub fn write_float(&mut self, data: f64, precision: u32) {
let mut vec: FixedSliceVec<u8> = FixedSliceVec::new(&mut []);
let a: f64 = data;
let mut f: f64 = a % 1.0;
let mut i: i64 = (a - (a % 1.0)) as i64;
let mut x: u32 = precision;
let mut n: usize = 0;
while f != 0.00 && x != 0 {
let k: i64 = ((f * 10.0) - ((f * 10.0) % 1.0)) as i64; match k {
0 => vec.push('0' as u8),
1 => vec.push('1' as u8),
2 => vec.push('2' as u8),
3 => vec.push('3' as u8),
4 => vec.push('4' as u8),
5 => vec.push('5' as u8),
6 => vec.push('6' as u8),
7 => vec.push('7' as u8),
8 => vec.push('8' as u8),
9 => vec.push('9' as u8),
_ => unreachable!(),
}
f = (f * 10.0) % 1.0; x = x - 1;
n = n + 1;
}
vec.push('.' as u8);
while i != 0 {
let rem = i % 10;
i = i / 10;
match rem {
0 => vec.push('0' as u8),
1 => vec.push('1' as u8),
2 => vec.push('2' as u8),
3 => vec.push('3' as u8),
4 => vec.push('4' as u8),
5 => vec.push('5' as u8),
6 => vec.push('6' as u8),
7 => vec.push('7' as u8),
8 => vec.push('8' as u8),
9 => vec.push('9' as u8),
_ => (),
}
}
for ia in 0..(vec.len() - n - 1) {
self.transmit_data(vec[vec.len() - 1 - ia]);
}
for ia in 0..n - 1 {
vec.push(vec[ia]);
}
}
}