1#[derive(Clone, Copy, Debug, Eq, PartialEq)]
5#[non_exhaustive]
6pub enum BoardId {
7 Jellybean,
9 Jawbreaker,
11 HackRfOne,
13 Rad1o,
15 HackRfOneR9,
17 HackRfPro,
19 Unrecognized,
21 Undetected,
23 Unknown(u8),
25}
26
27impl BoardId {
28 pub(crate) const fn from_raw(value: u8) -> Self {
29 match value {
30 0 => Self::Jellybean,
31 1 => Self::Jawbreaker,
32 2 => Self::HackRfOne,
33 3 => Self::Rad1o,
34 4 => Self::HackRfOneR9,
35 5 => Self::HackRfPro,
36 0xfe => Self::Unrecognized,
37 0xff => Self::Undetected,
38 other => Self::Unknown(other),
39 }
40 }
41
42 pub const fn name(self) -> &'static str {
44 match self {
45 Self::Jellybean => "Jellybean",
46 Self::Jawbreaker => "Jawbreaker",
47 Self::HackRfOne | Self::HackRfOneR9 => "HackRF One",
48 Self::Rad1o => "rad1o",
49 Self::HackRfPro => "HackRF Pro",
50 Self::Unrecognized => "unrecognized",
51 Self::Undetected => "undetected",
52 Self::Unknown(_) => "unknown",
53 }
54 }
55}
56
57#[derive(Clone, Debug, Eq, PartialEq)]
59pub struct DeviceInfo {
60 pub board_id: BoardId,
62 pub firmware_version: String,
64 pub usb_api_version: u16,
69 pub serial: Option<u128>,
71}
72
73impl DeviceInfo {
74 pub const fn board_name(&self) -> &'static str {
76 self.board_id.name()
77 }
78}
79
80#[derive(Clone, Copy, Debug, Eq, PartialEq)]
81pub(crate) struct PartIdSerial {
82 pub(crate) part_id: [u32; 2],
83 pub(crate) serial: [u32; 4],
84}
85
86impl PartIdSerial {
87 pub(crate) const fn serial_u128(self) -> Option<u128> {
88 let [a, b, c, d] = self.serial;
89 let value = ((a as u128) << 96) | ((b as u128) << 64) | ((c as u128) << 32) | d as u128;
90 if value == 0 { None } else { Some(value) }
91 }
92}