minidsp_protocol/device/
probe.rs

1//! Resolves a `Device` struct using a hardware id + dsp version
2
3use crate::DeviceInfo;
4
5#[derive(Copy, Clone, Eq, PartialEq)]
6#[cfg_attr(feature = "debug", derive(Debug))]
7#[cfg_attr(
8    feature = "use_serde",
9    derive(
10        strum::EnumString,
11        strum::Display,
12        serde::Serialize,
13        serde::Deserialize,
14        schemars::JsonSchema,
15    )
16)]
17#[cfg_attr(feature = "use_serde", strum(serialize_all = "lowercase"))]
18pub enum DeviceKind {
19    Generic,
20    #[cfg(feature = "device_4x10hd")]
21    M4x10Hd,
22    #[cfg(feature = "device_10x10hd")]
23    M10x10Hd,
24    #[cfg(feature = "device_msharc4x8")]
25    MSharc4x8,
26    #[cfg(feature = "device_2x4hd")]
27    M2x4Hd,
28    #[cfg(feature = "device_shd")]
29    Shd,
30    #[cfg(feature = "device_ddrc24")]
31    DDRC24,
32    #[cfg(feature = "device_ddrc88bm")]
33    DDRC88BM,
34    #[cfg(feature = "device_nanodigi2x8")]
35    Nanodigi2x8,
36    #[cfg(feature = "device_c8x12v2")]
37    C8x12v2,
38    #[cfg(feature = "device_m2x4")]
39    M2x4,
40}
41
42impl Default for DeviceKind {
43    fn default() -> Self {
44        DeviceKind::Generic
45    }
46}
47
48/// Attempts to get a `&Device` from a DeviceInfo
49pub fn probe(device_info: &DeviceInfo) -> &'static super::Device {
50    by_kind(probe_kind(device_info))
51}
52
53pub fn probe_kind(device_info: &DeviceInfo) -> DeviceKind {
54    use DeviceKind::*;
55    match (device_info.hw_id, device_info.dsp_version) {
56        #[cfg(feature = "device_10x10hd")]
57        (1, 51) => M10x10Hd,
58        #[cfg(feature = "device_4x10hd")]
59        (1, _) => M4x10Hd,
60        #[cfg(feature = "device_msharc4x8")]
61        (4, _) => MSharc4x8,
62        #[cfg(feature = "device_2x4hd")]
63        (10, 100) => M2x4Hd,
64        #[cfg(feature = "device_ddrc24")]
65        (10, 101) => DDRC24,
66        #[cfg(feature = "device_ddrc88bm")]
67        (6, 95) => DDRC88BM,
68        #[cfg(feature = "device_shd")]
69        (14, _) => Shd,
70        #[cfg(feature = "device_nanodigi2x8")]
71        (2, 54) => Nanodigi2x8,
72        #[cfg(feature = "device_c8x12v2")]
73        (11, 97) => C8x12v2,
74        // TODO: Figure out hw id and dsp version
75        #[cfg(feature = "device_m2x4")]
76        (2, 22) => M2x4,
77        _ => Generic,
78    }
79}
80
81pub fn by_kind(kind: DeviceKind) -> &'static super::Device {
82    use DeviceKind::*;
83    match kind {
84        Generic => &super::GENERIC,
85
86        #[cfg(feature = "device_4x10hd")]
87        M4x10Hd => &super::m4x10hd::DEVICE,
88
89        #[cfg(feature = "device_msharc4x8")]
90        MSharc4x8 => &super::msharc4x8::DEVICE,
91
92        #[cfg(feature = "device_2x4hd")]
93        M2x4Hd => &super::m2x4hd::DEVICE,
94
95        #[cfg(feature = "device_ddrc24")]
96        DDRC24 => &super::ddrc24::DEVICE,
97
98        #[cfg(feature = "device_ddrc88bm")]
99        DDRC88BM => &super::ddrc88bm::DEVICE,
100
101        #[cfg(feature = "device_shd")]
102        Shd => &super::shd::DEVICE,
103
104        #[cfg(feature = "device_nanodigi2x8")]
105        Nanodigi2x8 => &super::nanodigi2x8::DEVICE,
106
107        #[cfg(feature = "device_c8x12v2")]
108        C8x12v2 => &super::c8x12v2::DEVICE,
109
110        #[cfg(feature = "device_m2x4")]
111        M2x4 => &super::m2x4::DEVICE,
112
113        #[cfg(feature = "device_10x10hd")]
114        M10x10Hd => &super::m10x10hd::DEVICE,
115    }
116}