dshot_codec/
dshot_telemetry.rs1use 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 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 #[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 Temperature(u8),
59 Voltage(u32),
61 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}