Skip to main content

device_driver/
fieldset.rs

1#![allow(unused)]
2
3use crate::ByteOrder;
4
5/// # Safety
6/// Implers of this trait will get their memory changed through a byte slice.
7/// So make sure the type has a stable ABI and has no padding bits.
8pub unsafe trait Fieldset: Sized {
9    /// Metadata describing some properties of the fieldset
10    const METADATA: FieldsetMetadata;
11    /// Get a zero-initialized instance of the fieldset
12    const ZERO: Self;
13
14    /// Get the fieldset as a mutable slice
15    fn as_slice_mut(&mut self) -> &mut [u8] {
16        unsafe {
17            core::slice::from_raw_parts_mut(
18                (self as *mut Self).cast::<u8>(),
19                core::mem::size_of::<Self>(),
20            )
21        }
22    }
23}
24
25unsafe impl<T: Fieldset, const N: usize> Fieldset for [T; N] {
26    const METADATA: FieldsetMetadata = T::METADATA;
27    const ZERO: Self = [T::ZERO; N];
28}
29
30#[doc(hidden)]
31pub trait NotFieldset {}
32impl NotFieldset for () {}
33
34/// Metadata about fieldsets
35#[derive(Debug, Clone, PartialEq, Eq, Hash)]
36#[cfg_attr(feature = "defmt", derive(defmt::Format))]
37#[non_exhaustive]
38pub struct FieldsetMetadata {
39    /// The byte order of the fieldset
40    pub byte_order: ByteOrder,
41}
42
43impl FieldsetMetadata {
44    /// A default that allows you to construct the metadata in const contexts.
45    /// Yields the same value as [`Self::default`].
46    pub const DEFAULT: Self = Self {
47        byte_order: ByteOrder::LE,
48    };
49
50    /// Create a new instance with the default value
51    pub const fn new() -> Self {
52        Self::DEFAULT
53    }
54
55    /// Set the byte order
56    pub const fn with_byte_order(self, byte_order: ByteOrder) -> Self {
57        Self { byte_order, ..self }
58    }
59}
60
61impl Default for FieldsetMetadata {
62    fn default() -> Self {
63        Self::DEFAULT
64    }
65}
66
67#[doc(hidden)]
68pub trait ToTuple {
69    type Tuple;
70    fn to_tuple(self) -> Self::Tuple;
71}
72
73#[doc(hidden)]
74pub trait Append<T> {
75    type Appended;
76    fn append(self, val: T) -> Self::Appended;
77}
78
79impl<A> Append<A> for () {
80    type Appended = Fs1<A>;
81
82    fn append(self, val: A) -> Self::Appended {
83        Fs1(val)
84    }
85}
86
87macro_rules! impl_append {
88    ($name:ident -> None, $(($tname:ident: $tnum:tt)),+) => {
89        // No append impl
90    };
91    ($name:ident -> $next:ident, $(($tname:ident: $tnum:tt)),+) => {
92        impl<$($tname),*, NEW> Append<NEW> for $name<$($tname),*> {
93            type Appended = $next<$($tname),* , NEW>;
94            fn append(self, val: NEW) -> Self::Appended {
95                $next($(self.$tnum),*, val)
96            }
97        }
98    };
99}
100
101macro_rules! create_fsn {
102    ($name:ident -> $next:ident, $(($tname:ident: $tnum:tt)),+) => {
103        /// Combined fieldsets
104        #[derive(Debug)]
105        #[repr(C)]
106        #[doc(hidden)]
107        pub struct $name<$($tname),*>($($tname),*);
108
109        unsafe impl<$($tname: Fieldset),*> Fieldset for $name<$($tname),*> {
110            const METADATA: FieldsetMetadata = A::METADATA;
111            const ZERO: Self = Self($($tname::ZERO),*);
112        }
113
114        impl<$($tname),*> ToTuple for $name<$($tname),*> {
115            type Tuple = ($($tname),*,);
116            fn to_tuple(self) -> Self::Tuple {
117                (
118                    $(self.$tnum),*,
119                )
120            }
121        }
122        impl<'a, $($tname),*> ToTuple for &'a mut $name<$($tname),*> {
123            type Tuple = ($(&'a mut $tname),*,);
124            fn to_tuple(self) -> Self::Tuple {
125                (
126                    $(&mut self.$tnum),*,
127                )
128            }
129        }
130
131        impl_append!($name -> $next, $(($tname: $tnum)),+);
132    }
133}
134
135create_fsn!(Fs1  -> Fs2, (A: 0));
136create_fsn!(Fs2  -> Fs3, (A: 0), (B: 1));
137create_fsn!(Fs3  -> Fs4, (A: 0), (B: 1), (C: 2));
138create_fsn!(Fs4  -> Fs5, (A: 0), (B: 1), (C: 2), (D: 3));
139create_fsn!(Fs5  -> Fs6, (A: 0), (B: 1), (C: 2), (D: 3), (E: 4));
140create_fsn!(Fs6  -> Fs7, (A: 0), (B: 1), (C: 2), (D: 3), (E: 4), (F: 5));
141create_fsn!(Fs7  -> Fs8, (A: 0), (B: 1), (C: 2), (D: 3), (E: 4), (F: 5), (G: 6));
142create_fsn!(Fs8  -> Fs9, (A: 0), (B: 1), (C: 2), (D: 3), (E: 4), (F: 5), (G: 6), (H: 7));
143create_fsn!(Fs9  -> Fs10, (A: 0), (B: 1), (C: 2), (D: 3), (E: 4), (F: 5), (G: 6), (H: 7), (I: 8));
144create_fsn!(Fs10 -> Fs11, (A: 0), (B: 1), (C: 2), (D: 3), (E: 4), (F: 5), (G: 6), (H: 7), (I: 8), (J: 9));
145create_fsn!(Fs11 -> Fs12, (A: 0), (B: 1), (C: 2), (D: 3), (E: 4), (F: 5), (G: 6), (H: 7), (I: 8), (J: 9), (K: 10));
146create_fsn!(Fs12 -> Fs13, (A: 0), (B: 1), (C: 2), (D: 3), (E: 4), (F: 5), (G: 6), (H: 7), (I: 8), (J: 9), (K: 10), (L: 11));
147create_fsn!(Fs13 -> Fs14, (A: 0), (B: 1), (C: 2), (D: 3), (E: 4), (F: 5), (G: 6), (H: 7), (I: 8), (J: 9), (K: 10), (L: 11), (M: 12));
148create_fsn!(Fs14 -> Fs15, (A: 0), (B: 1), (C: 2), (D: 3), (E: 4), (F: 5), (G: 6), (H: 7), (I: 8), (J: 9), (K: 10), (L: 11), (M: 12), (N: 13));
149create_fsn!(Fs15 -> Fs16, (A: 0), (B: 1), (C: 2), (D: 3), (E: 4), (F: 5), (G: 6), (H: 7), (I: 8), (J: 9), (K: 10), (L: 11), (M: 12), (N: 13), (O: 14));
150create_fsn!(Fs16 -> Fs17, (A: 0), (B: 1), (C: 2), (D: 3), (E: 4), (F: 5), (G: 6), (H: 7), (I: 8), (J: 9), (K: 10), (L: 11), (M: 12), (N: 13), (O: 14), (P: 15));
151create_fsn!(Fs17 -> Fs18, (A: 0), (B: 1), (C: 2), (D: 3), (E: 4), (F: 5), (G: 6), (H: 7), (I: 8), (J: 9), (K: 10), (L: 11), (M: 12), (N: 13), (O: 14), (P: 15), (Q: 16));
152create_fsn!(Fs18 -> Fs19, (A: 0), (B: 1), (C: 2), (D: 3), (E: 4), (F: 5), (G: 6), (H: 7), (I: 8), (J: 9), (K: 10), (L: 11), (M: 12), (N: 13), (O: 14), (P: 15), (Q: 16), (R: 17));
153create_fsn!(Fs19 -> Fs20, (A: 0), (B: 1), (C: 2), (D: 3), (E: 4), (F: 5), (G: 6), (H: 7), (I: 8), (J: 9), (K: 10), (L: 11), (M: 12), (N: 13), (O: 14), (P: 15), (Q: 16), (R: 17), (S: 18));
154create_fsn!(Fs20 -> Fs21, (A: 0), (B: 1), (C: 2), (D: 3), (E: 4), (F: 5), (G: 6), (H: 7), (I: 8), (J: 9), (K: 10), (L: 11), (M: 12), (N: 13), (O: 14), (P: 15), (Q: 16), (R: 17), (S: 18), (T: 19));
155create_fsn!(Fs21 -> Fs22, (A: 0), (B: 1), (C: 2), (D: 3), (E: 4), (F: 5), (G: 6), (H: 7), (I: 8), (J: 9), (K: 10), (L: 11), (M: 12), (N: 13), (O: 14), (P: 15), (Q: 16), (R: 17), (S: 18), (T: 19), (U: 20));
156create_fsn!(Fs22 -> Fs23, (A: 0), (B: 1), (C: 2), (D: 3), (E: 4), (F: 5), (G: 6), (H: 7), (I: 8), (J: 9), (K: 10), (L: 11), (M: 12), (N: 13), (O: 14), (P: 15), (Q: 16), (R: 17), (S: 18), (T: 19), (U: 20), (V: 21));
157create_fsn!(Fs23 -> Fs24, (A: 0), (B: 1), (C: 2), (D: 3), (E: 4), (F: 5), (G: 6), (H: 7), (I: 8), (J: 9), (K: 10), (L: 11), (M: 12), (N: 13), (O: 14), (P: 15), (Q: 16), (R: 17), (S: 18), (T: 19), (U: 20), (V: 21), (W: 22));
158create_fsn!(Fs24 -> Fs25, (A: 0), (B: 1), (C: 2), (D: 3), (E: 4), (F: 5), (G: 6), (H: 7), (I: 8), (J: 9), (K: 10), (L: 11), (M: 12), (N: 13), (O: 14), (P: 15), (Q: 16), (R: 17), (S: 18), (T: 19), (U: 20), (V: 21), (W: 22), (X: 23));
159create_fsn!(Fs25 -> Fs26, (A: 0), (B: 1), (C: 2), (D: 3), (E: 4), (F: 5), (G: 6), (H: 7), (I: 8), (J: 9), (K: 10), (L: 11), (M: 12), (N: 13), (O: 14), (P: 15), (Q: 16), (R: 17), (S: 18), (T: 19), (U: 20), (V: 21), (W: 22), (X: 23), (Y: 24));
160create_fsn!(Fs26 -> None, (A: 0), (B: 1), (C: 2), (D: 3), (E: 4), (F: 5), (G: 6), (H: 7), (I: 8), (J: 9), (K: 10), (L: 11), (M: 12), (N: 13), (O: 14), (P: 15), (Q: 16), (R: 17), (S: 18), (T: 19), (U: 20), (V: 21), (W: 22), (X: 23), (Y: 24), (Z: 25));