1use serialport;
2use std::error::Error as StdError;
3use std::fmt;
4use std::io;
5use std::sync::mpsc;
6
7#[derive(Debug, Clone, Copy, Default)]
9pub struct Vector3 {
10 pub x: f32,
11 pub y: f32,
12 pub z: f32,
13}
14
15impl fmt::Display for Vector3 {
16 fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
17 write!(f, "Vector3(x={}, y={}, z={})", self.x, self.y, self.z)
18 }
19}
20
21#[derive(Debug, Clone, Copy, Default)]
22pub struct Quaternion {
23 pub w: f32,
24 pub x: f32,
25 pub y: f32,
26 pub z: f32,
27}
28
29impl fmt::Display for Quaternion {
30 fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
31 write!(
32 f,
33 "Quaternion(w={}, x={}, y={}, z={})",
34 self.w, self.x, self.y, self.z
35 )
36 }
37}
38
39#[derive(Debug, Clone, Copy, Default)]
41pub struct ImuData {
42 pub accelerometer: Option<Vector3>,
44 pub gyroscope: Option<Vector3>,
46 pub magnetometer: Option<Vector3>,
48 pub quaternion: Option<Quaternion>,
50 pub euler: Option<Vector3>,
52 pub linear_acceleration: Option<Vector3>,
54 pub gravity: Option<Vector3>,
56 pub temperature: Option<f32>,
58 pub calibration_status: Option<u8>,
60}
61
62#[derive(Debug)]
64pub enum ImuError {
65 DeviceError(String),
67 ReadError(String),
69 WriteError(String),
71 ConfigurationError(String),
73 LockError(String),
75 CommandSendError(String),
77 NotSupported(String),
79 InvalidPacket(String),
81 Other(String),
83}
84
85impl fmt::Display for ImuError {
86 fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
87 match self {
88 ImuError::DeviceError(s) => write!(f, "Device error: {}", s),
89 ImuError::ReadError(s) => write!(f, "Read error: {}", s),
90 ImuError::WriteError(s) => write!(f, "Write error: {}", s),
91 ImuError::ConfigurationError(s) => write!(f, "Configuration error: {}", s),
92 ImuError::LockError(s) => write!(f, "Lock error: {}", s),
93 ImuError::CommandSendError(s) => write!(f, "Command send error: {}", s),
94 ImuError::NotSupported(s) => write!(f, "Not supported: {}", s),
95 ImuError::InvalidPacket(s) => write!(f, "Invalid packet: {}", s),
96 ImuError::Other(s) => write!(f, "Other IMU error: {}", s),
97 }
98 }
99}
100
101impl StdError for ImuError {}
102
103impl From<io::Error> for ImuError {
105 fn from(err: io::Error) -> Self {
106 ImuError::DeviceError(err.to_string())
107 }
108}
109
110impl From<serialport::Error> for ImuError {
111 fn from(err: serialport::Error) -> Self {
112 ImuError::DeviceError(err.to_string())
113 }
114}
115
116impl<T> From<std::sync::PoisonError<T>> for ImuError {
117 fn from(err: std::sync::PoisonError<T>) -> Self {
118 ImuError::LockError(err.to_string())
119 }
120}
121
122impl<T> From<mpsc::SendError<T>> for ImuError {
123 fn from(err: mpsc::SendError<T>) -> Self {
124 ImuError::CommandSendError(err.to_string())
125 }
126}
127
128impl From<mpsc::RecvError> for ImuError {
129 fn from(err: mpsc::RecvError) -> Self {
130 ImuError::CommandSendError(err.to_string())
131 }
132}
133
134pub trait ImuReader {
135 fn get_data(&self) -> Result<ImuData, ImuError>;
137
138 fn stop(&self) -> Result<(), ImuError>;
139}
140
141#[derive(Debug, Clone, Copy)]
142pub enum ImuFrequency {
143 Hz0_2, Hz0_5, Hz1, Hz2, Hz5, Hz10, Hz20, Hz50, Hz100, Hz200, Single, None, }