canadensis_data_types/
optimized.rs1use canadensis_core::SubjectId;
2use canadensis_encoding::{DeserializeError, ReadCursor, WriteCursor};
3use heapless::Vec;
4
5const SUBJECT_ID_SPARSE_LIST_DISCRIMINANT: u8 = 1;
6
7#[derive(Debug, Clone, Default, PartialEq, Eq)]
10pub struct SubjectIdList<const N: usize>(pub Vec<SubjectId, N>);
11
12impl<const N: usize> SubjectIdList<N> {
13 const _ASSERT_SIZE: usize = 256 - N - 1;
15
16 pub fn new() -> Self {
17 SubjectIdList(Vec::new())
18 }
19}
20
21impl<const N: usize> canadensis_encoding::DataType for SubjectIdList<N> {
22 const EXTENT_BYTES: Option<u32> =
23 crate::uavcan::node::port::subject_id_list_1_0::SubjectIDList::EXTENT_BYTES;
24}
25impl<const N: usize> canadensis_encoding::Message for SubjectIdList<N> {}
26impl<const N: usize> canadensis_encoding::Serialize for SubjectIdList<N> {
27 fn size_bits(&self) -> usize {
28 8 + 8 + self.0.len() * 16
30 }
31
32 fn serialize(&self, cursor: &mut WriteCursor<'_>) {
33 cursor.write_aligned_u8(SUBJECT_ID_SPARSE_LIST_DISCRIMINANT);
35 cursor.write_aligned_u8(self.0.len() as u8);
37 for &value in &self.0 {
38 cursor.write_aligned_u16(value.into())
39 }
40 }
41}
42impl<const N: usize> canadensis_encoding::Deserialize for SubjectIdList<N> {
43 fn deserialize(cursor: &mut ReadCursor<'_>) -> Result<Self, DeserializeError>
44 where
45 Self: Sized,
46 {
47 let discriminant = cursor.read_aligned_u8();
48 if discriminant != SUBJECT_ID_SPARSE_LIST_DISCRIMINANT {
49 return Err(DeserializeError::UnionTag);
51 }
52 let length = cursor.read_aligned_u8();
53 if usize::from(length) > N {
54 return Err(DeserializeError::ArrayLength);
55 }
56 let mut ids = Vec::new();
57 for _ in 0..length {
58 let _ = ids.push(SubjectId::from_truncating(cursor.read_aligned_u16()));
60 }
61 Ok(SubjectIdList(ids))
62 }
63}