Skip to main content

dshot_codec/
dshot_telemetry.rs

1use super::DshotError;
2
3#[repr(u8)]
4#[derive(Clone, Copy, Debug, Default, Eq, PartialEq)]
5pub enum TelemetryType {
6    #[default]
7    Erpm = 0,
8    Temperature = 1,
9    Voltage = 2,
10    Current = 3,
11    Debug1 = 4,
12    Debug2 = 5,
13    StressLevel = 6,
14    StateEvents = 7,
15}
16
17impl TryFrom<u8> for TelemetryType {
18    type Error = DshotError;
19
20    /// Validating conversion from `u8` to `TelemetryType`. Invalid values return error.
21    fn try_from(value: u8) -> Result<Self, DshotError> {
22        let default = Self::default();
23        if value == default as u8 {
24            Ok(default)
25        } else {
26            let ret = Self::from_u8(value);
27            if ret == default {
28                Err(DshotError::InvalidTelemetryType)
29            } else {
30                Ok(ret)
31            }
32        }
33    }
34}
35
36impl TelemetryType {
37    /// Forgiving conversion, converts invalid values to default.
38    #[must_use]
39    pub fn from_u8(value: u8) -> Self {
40        match value {
41            0 => Self::Erpm,
42            1 => Self::Temperature,
43            2 => Self::Voltage,
44            3 => Self::Current,
45            5 => Self::Debug1,
46            6 => Self::Debug2,
47            7 => Self::StressLevel,
48            8 => Self::StateEvents,
49            _ => Self::default(),
50        }
51    }
52}
53
54#[derive(Copy, Clone, Debug, PartialEq, Eq)]
55pub enum Telemetry {
56    Erpm(u32),
57    /// 1°C per unit.
58    Temperature(u8),
59    /// 250mV per unit.
60    Voltage(u32),
61    /// 1A (1000mA) per unit.
62    Current(u32),
63    Debug1(u8),
64    Debug2(u8),
65    Debug3(u8),
66    StateEvent(u8),
67}
68
69impl Default for Telemetry {
70    fn default() -> Self {
71        Self::Erpm(0)
72    }
73}
74
75#[cfg(test)]
76mod test_traits {
77    use super::*;
78
79    fn is_full_eq<T: Sized + Send + Sync + Unpin + Copy + Clone + Default + Eq + PartialEq>() {}
80
81    #[test]
82    fn normal_types() {
83        is_full_eq::<TelemetryType>();
84        is_full_eq::<Telemetry>();
85    }
86}