jt_util 0.1.1

jt808 jt1078等基础库实现
Documentation
use bytes::Bytes;
use chrono::{DateTime, Datelike, Local, TimeZone, Timelike};

use crate::timer_helper::TimeHelper;

pub trait IBuffWrite {
    fn put_u8(&mut self, n: u8);

    fn put_u16(&mut self, n: u16) {
        for v in n.to_be_bytes() {
            self.put_u8(v);
        }
    }
    fn put_u32(&mut self, n: u32) {
        for v in n.to_be_bytes() {
            self.put_u8(v);
        }
    }
    fn put_u64(&mut self, n: u64) {
        for v in n.to_be_bytes() {
            self.put_u8(v);
        }
    }
    fn put_slice(&mut self, src: &[u8]) {
        for v in src {
            self.put_u8(*v);
        }
    }
    fn put(&mut self, src: Bytes)
    // where
    //     Self: Sized,
    {
        for v in src {
            self.put_u8(v);
        }
    }
    fn put_dt_bcd6(&mut self, dt: DateTime<Local>) {
        self.put_u8(TimeHelper::i32_to_bcd2(dt.year()));
        self.put_u8(TimeHelper::u32_to_bcd2(dt.month()));
        self.put_u8(TimeHelper::u32_to_bcd2(dt.day()));
        self.put_u8(TimeHelper::u32_to_bcd2(dt.hour()));
        self.put_u8(TimeHelper::u32_to_bcd2(dt.minute()));
        self.put_u8(TimeHelper::u32_to_bcd2(dt.second()));
    }
}
pub trait IBuffRead {
    fn get(&self, index: usize) -> Option<&u8>;
    fn len(&self) -> usize;
    fn get_u64(&mut self) -> u64;
    fn get_u32(&mut self) -> u32;
    fn get_u16(&mut self) -> u16;
    fn get_u8(&mut self) -> u8;
    fn split_to(&mut self, at: usize) -> Bytes;
    fn to_bytes(&mut self) -> Bytes;
    fn get_dt_bcd6(&mut self) -> DateTime<Local> {
        Local
            .ymd(
                2000 + self.get_u8() as i32,
                self.get_u8() as u32,
                self.get_u8() as u32,
            )
            .and_hms(
                self.get_u8() as u32,
                self.get_u8() as u32,
                self.get_u8() as u32,
            )
    }
    fn get_dt_bcd6_timestamp(&mut self) -> i64 {

        let year = self.get_u8_bcd() as i32;
        let month = self.get_u8_bcd() as u32;
        let day = self.get_u8_bcd() as u32;
        let hour = self.get_u8_bcd() as u32;
        let min = self.get_u8_bcd() as u32;
        let sec = self.get_u8_bcd() as u32;

        if  year <= 0 || year > 100 || month > 12 || day > 31 || hour > 24 || min > 60 || sec > 60 {
            return 0;
        }

        Local.ymd(
            2000 + year,
            month,
            day,
        )
        .and_hms(
            hour,
            min,
            sec,
        ).timestamp()
    }
    
    fn get_u8_bcd(&mut self) -> u8 {
        let tmp = self.split_to(1);
        let ret = hex::encode(tmp).parse::<u8>().unwrap();
        ret
    }
}


#[test]
fn ibuff_write_test() {
    //get_u8_bcd
    let tmp = [0x21];
    let ret = hex::encode(tmp).parse::<u8>().unwrap();
    println!("test {}", ret);
}