niming 0.1.0

Rust 对匿名上位机灵活帧的支持
Documentation
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,
}
// 匿名一帧最多10个数据
// 遇到None自动往前窜位

type NimingFrame = [Option<NimingData>; 10];

// 匿名区分了十种帧,它们就是一组,0xF1-0xFA一共十种
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) {}
}