ut181a 0.2.1

Uni-T UT181A DMM remote control
Documentation
pub(crate) struct Packet {
    data: Vec<u8>
}

impl Packet {
    pub(crate) fn checksum(&self) -> u16 {
        let mut sum = 2 + (self.data.len() & 0xFF) as u16 + ((self.data.len() >> 8) & 0xFF) as u16;
        for b in &self.data {
            sum = sum.wrapping_add(u16::from(*b));
        }
        sum
    }

    pub(crate) fn new(body: &[u8]) -> Packet {
        let mut data = Vec::with_capacity(body.len());
        data.extend(body);
        Packet {
            data,
        }
    }

    pub(crate) fn frame(&self) -> Vec<u8> {
        let mut pkt: Vec<u8> = Vec::with_capacity(6 + self.data.len());

        pkt.push(0xAB);
        pkt.push(0xCD);

        let pkt_len = self.data.len() + 2;

        pkt.push((pkt_len & 0xFF) as u8);
        pkt.push(((pkt_len >> 8) & 0xFF) as u8);

        pkt.extend(&self.data);

        let cs = self.checksum();

        pkt.push((cs & 0xFF) as u8);
        pkt.push(((cs >> 8) & 0xFF) as u8);

        pkt
    }
}