1#[cfg(feature = "serde")]
2use serde::{Deserialize, Serialize};
3use spacepackets::ecss::{EcssEnumU16, EcssEnumeration};
4use spacepackets::util::UnsignedEnum;
5use spacepackets::ByteConversionError;
6
7#[derive(Debug, Copy, Clone, PartialEq, Eq)]
8#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
9pub struct ResultU16 {
10 group_id: u8,
11 unique_id: u8,
12}
13
14impl ResultU16 {
15 pub const fn const_new(group_id: u8, unique_id: u8) -> Self {
16 Self {
17 group_id,
18 unique_id,
19 }
20 }
21 pub fn raw(&self) -> u16 {
22 ((self.group_id as u16) << 8) | self.unique_id as u16
23 }
24 pub fn group_id(&self) -> u8 {
25 self.group_id
26 }
27 pub fn unique_id(&self) -> u8 {
28 self.unique_id
29 }
30}
31
32impl From<ResultU16> for EcssEnumU16 {
33 fn from(v: ResultU16) -> Self {
34 EcssEnumU16::new(v.raw())
35 }
36}
37
38impl UnsignedEnum for ResultU16 {
39 fn size(&self) -> usize {
40 core::mem::size_of::<u16>()
41 }
42
43 fn write_to_be_bytes(&self, buf: &mut [u8]) -> Result<usize, ByteConversionError> {
44 if buf.len() < 2 {
45 return Err(ByteConversionError::ToSliceTooSmall {
46 found: buf.len(),
47 expected: 2,
48 });
49 }
50 buf[0] = self.group_id;
51 buf[1] = self.unique_id;
52 Ok(self.size())
53 }
54}
55
56impl EcssEnumeration for ResultU16 {
57 fn pfc(&self) -> u8 {
58 16
59 }
60}