use std::time::Instant; pub fn usize_to_u16_be_bytes(n: usize) -> [u8; 2] { (n as u16).to_be_bytes() } pub fn usize_to_u16_le_bytes(n: usize) -> [u8; 2] { (n as u16).to_be_bytes() } pub fn u16_to_hex_be_bytes(n: u16) -> [u8; 2] { n.to_be_bytes() } pub fn u16_to_hex_le_bytes(n: u16) -> [u8; 2] { n.to_le_bytes() } pub fn calc_crc8_smbus(c: &[u8]) -> u8 { let crc8_smbus = crc::Crc::::new(&crc::CRC_8_SMBUS); crc8_smbus.checksum(c) } pub fn calc_crc8_itu(c: &[u8]) -> u8 { let crc8_itu_alg = crc::Crc::::new(&crc::CRC_8_I_432_1); crc8_itu_alg.checksum(c) } pub fn calc_crc8_itu_xor55(c: &[u8]) -> u8 { calc_crc8_itu(c) ^ 0x55 } pub fn elapsed_millis(start_at: Instant) -> u64 { start_at.elapsed().as_millis() as u64 } #[cfg(test)] mod test { use crate::serial_core::utils::{calc_crc8_itu, calc_crc8_itu_xor55, calc_crc8_smbus}; #[test] fn test_crc8_itu() { let req_vec = vec![ 0x55, 0xAA, 0x09, 0x00, 0x34, 0x00, 0xFB, 0x00, 0x1C, 0x00, 0x00, 0x18, 0x00, ]; let checksum = calc_crc8_itu(req_vec.as_slice()); assert_eq!(checksum, 0x7A); } #[test] fn test_crc8_smbus() { let req_vec = vec![ 0x55, 0xAA, 0x09, 0x00, 0x34, 0x00, 0xFB, 0x00, 0x1C, 0x00, 0x00, 0x18, 0x00, ]; let checksum = calc_crc8_smbus(req_vec.as_slice()); assert_eq!(checksum, 0x2F); } #[test] fn test_crc8_itu_xor55() { let req_vec = vec![0x55, 0xAA, 0x07, 0x00, 0x01, 0x01, 0xFF, 0xFF, 0xFF, 0xFF]; assert_eq!(calc_crc8_itu_xor55(req_vec.as_slice()), 0xFD); } }