1*c3739801SMiguel Ojeda use zerocopy_derive::*; 2*c3739801SMiguel Ojeda 3*c3739801SMiguel Ojeda // The only valid value of this type are the bytes `0xC0C0`. 4*c3739801SMiguel Ojeda #[derive(TryFromBytes, KnownLayout, Immutable)] 5*c3739801SMiguel Ojeda #[repr(u16)] 6*c3739801SMiguel Ojeda pub enum C0C0 { 7*c3739801SMiguel Ojeda _XC0C0 = 0xC0C0, 8*c3739801SMiguel Ojeda } 9*c3739801SMiguel Ojeda 10*c3739801SMiguel Ojeda #[derive(FromBytes, KnownLayout, Immutable, SplitAt)] 11*c3739801SMiguel Ojeda #[repr(C, align(4))] 12*c3739801SMiguel Ojeda pub struct Packet<Magic> { 13*c3739801SMiguel Ojeda magic_number: Magic, 14*c3739801SMiguel Ojeda milk: u8, 15*c3739801SMiguel Ojeda mug_size: u8, 16*c3739801SMiguel Ojeda temperature: [u8; 5], 17*c3739801SMiguel Ojeda marshmallows: [[u8; 3]], 18*c3739801SMiguel Ojeda } 19*c3739801SMiguel Ojeda 20*c3739801SMiguel Ojeda /// A packet begining with the magic number `0xC0C0`. 21*c3739801SMiguel Ojeda pub type CocoPacket = Packet<C0C0>; 22*c3739801SMiguel Ojeda 23*c3739801SMiguel Ojeda /// A packet beginning with any two initialized bytes. 24*c3739801SMiguel Ojeda pub type LocoPacket = Packet<[u8; 2]>; 25