1use serde::{Deserialize, Serialize};
2
3#[derive(Debug, Clone, PartialEq, Eq, Hash)]
4#[non_exhaustive]
5pub enum HaltianError {
6 InvalidTsmId {
8 tsm_id: u16,
10 device_type: &'static str,
12 },
13 InvalidTsmEvent(u8),
15 SerializationError,
17 DeserializationError,
19 InvalidSensorData {
21 message: &'static str,
23 },
24 ConfigurationError {
26 message: &'static str,
28 },
29}
30
31impl core::fmt::Display for HaltianError {
32 fn fmt(&self, f: &mut core::fmt::Formatter<'_>) -> core::fmt::Result {
33 match self {
34 HaltianError::InvalidTsmId {
35 tsm_id,
36 device_type,
37 } => {
38 write!(
39 f,
40 "Invalid TSM ID {} for device type {}",
41 tsm_id, device_type
42 )
43 }
44 HaltianError::InvalidTsmEvent(event) => {
45 write!(f, "Invalid TSM event type: {}", event)
46 }
47 HaltianError::SerializationError => {
48 write!(f, "Failed to serialize message")
49 }
50 HaltianError::DeserializationError => {
51 write!(f, "Failed to deserialize message")
52 }
53 HaltianError::InvalidSensorData { message } => {
54 write!(f, "Invalid sensor data: {}", message)
55 }
56 HaltianError::ConfigurationError { message } => {
57 write!(f, "Configuration error: {}", message)
58 }
59 }
60 }
61}
62
63#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash, Serialize, Deserialize)]
65#[repr(u8)]
66pub enum DeviceErrorType {
67 System = 1,
69 Sensor = 2,
71 Communication = 3,
73 Configuration = 4,
75 Battery = 5,
77 Memory = 6,
79 Unknown = 255,
81}
82
83#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash, Serialize, Deserialize)]
85#[repr(u8)]
86pub enum DeviceErrorCause {
87 HardwareFailure = 1,
89 SoftwareFailure = 2,
91 CalibrationFailure = 3,
93 CommunicationTimeout = 4,
95 InvalidConfiguration = 5,
97 LowBattery = 6,
99 MemoryFull = 7,
101 SensorNotResponding = 8,
103 Unknown = 255,
105}
106
107#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
109pub struct DeviceErrorInfo {
110 #[serde(rename = "errorType")]
112 pub error_type: DeviceErrorType,
113 #[serde(rename = "errorCause")]
115 pub error_cause: DeviceErrorCause,
116}
117
118pub type Result<T> = core::result::Result<T, HaltianError>;
119
120pub trait Validate {
121 fn validate(&self) -> Result<()>;
123}
124
125pub trait Configure {
126 fn configure(&mut self, config: &Self) -> Result<()>;
128}