use bilge::prelude::*;
use packbytes::{FromBytes, ToBytes};
use crate::pack_bilge;
pub const MAX_COMMAND: usize = 4096;
#[derive(Copy, Clone, FromBytes, ToBytes, Debug, Default)]
pub struct Command {
pub token: u16,
pub access: Access,
pub executed: u8,
pub address: Address,
pub size: u16,
pub checksum: u8,
}
#[bitsize(8)]
#[derive(Copy, Clone, FromBits, DebugBits, PartialEq, Default)]
pub struct Access {
pub read: bool,
pub write: bool,
pub fixed: bool,
pub topological: bool,
_reserved: u3,
pub error: bool,
}
pack_bilge!(Access);
#[bitsize(32)]
#[derive(Copy, Clone, FromBits, DebugBits, PartialEq, Default)]
pub struct Address {
pub slave: u16,
pub register: u16,
}
pack_bilge!(Address);
pub fn checksum(slice: &[u8]) -> u8 {
let initial = 0b010110111; slice.iter().cloned().fold(initial, |a, b| a.wrapping_add(b)<<1)
}