pub use serialport::SerialPort;
#[derive(Clone, Copy)]
pub enum NimingData {
Float(f32),
U8(u8),
}
#[repr(C)]
#[derive(Clone, Copy)]
pub enum NimingFramType {
F1 = 0xf1,
F2,
F3,
F4,
F5,
F6,
F7,
F8,
F9,
FA,
}
type NimingFrame = [Option<NimingData>; 10];
type NimingGroup = [NimingFrame; 10];
pub struct NimingUart {
port: Box<dyn SerialPort>,
group: NimingGroup,
}
impl NimingUart {
pub fn new(port: Box<dyn SerialPort>) -> Self {
Self {
port: port,
group: [[None; 10]; 10],
}
}
pub fn set(&mut self, frame: NimingFramType, idx: usize, value: Option<NimingData>) {
self.group[(frame as u16 - NimingFramType::F1 as u16) as usize][idx] = value;
}
pub fn send_frame(&mut self, frame: NimingFramType) {
let mut buff = vec![0xAA, 0xFF, frame as u8, 0];
let sum: u8 = self.group[(frame as u16 - NimingFramType::F1 as u16) as usize]
.iter()
.map(|data| match data.clone() {
None => 0,
Some(NimingData::Float(f)) => {
buff.extend_from_slice(&f.to_le_bytes());
4
}
Some(NimingData::U8(u)) => {
buff.extend_from_slice(&u.to_le_bytes());
1
}
})
.sum();
buff[3] = sum;
let mut check: [u8; 2] = [0; 2];
buff.iter().for_each(|b| {
check[0] = check[0].wrapping_add(*b);
check[1] = check[1].wrapping_add(check[0]);
});
buff.extend_from_slice(&check);
if let Err(_) = self.port.write_all(&buff) {};
}
pub fn send_frame_all(&mut self) {}
}