1pub mod baseline;
8pub mod extended;
9pub mod service_mode;
10
11pub use baseline::*;
12pub use extended::*;
13pub use service_mode::*;
14
15use crate::Error;
16use bitvec::prelude::*;
17
18pub type Result<T> = core::result::Result<T, Error>;
20
21struct Preamble(BitArr!(for 14, in u8, Msb0));
22
23const MAX_BITS: usize = 15 + 4 * 9 + 1;
24pub type SerialiseBuffer = BitArr!(for MAX_BITS, in u8, Msb0);
26
27fn serialise(data: &[u8], buf: &mut SerialiseBuffer) -> Result<usize> {
30 let required_bits = 15 + data.len() * 9 + 1;
32 if required_bits > MAX_BITS {
33 return Err(Error::TooLong);
34 }
35
36 buf[0..16].copy_from_bitslice([0xff, 0xfe].view_bits::<Msb0>()); let mut pos: usize = 15;
39 for byte in data {
40 buf.set(pos, false); pos += 1;
42 buf[pos..pos + 8].copy_from_bitslice([*byte].view_bits::<Msb0>());
43 pos += 8;
44 }
45
46 buf.set(pos, true); pos += 1;
48
49 Ok(pos)
50}
51
52#[cfg(test)]
53mod test {
54 use super::*;
55
56 pub fn print_chunks(buf: &SerialiseBuffer, limit: usize) {
57 println!("Preamble: {}", &buf[..15]);
58
59 let mut offset = 15;
60 while offset < limit - 1 {
61 println!(
62 "[{}] Chunk: {}-{:08b}",
63 offset,
64 buf[offset] as u8,
65 &buf[offset + 1..offset + 9]
66 );
67 offset += 9;
68 }
69 println!("Stop bit: {}", buf[offset] as u8);
70 }
71}