haltian_sdk/
lib.rs

1#![no_std]
2#![doc = include_str!("../README.md")]
3
4#[cfg(feature = "alloc")]
5extern crate alloc;
6
7pub mod devices;
8pub mod error;
9pub mod messages;
10
11pub use devices::*;
12pub use error::*;
13pub use messages::*;
14
15use serde::{Deserialize, Serialize};
16
17/// Thingsee Message (TSM) Event types
18#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash, Serialize, Deserialize)]
19#[repr(u8)]
20pub enum TsmEvent {
21    /// Not applicable (tsmEv 0)
22    NotApplicable = 0,
23    /// Event based reporting (tsmEv 7)
24    EventBased = 7,
25    /// Event based reporting with state change (tsmEv 9)
26    EventBasedStateChange = 9,
27    /// Time based reporting (tsmEv 10)
28    Timebased = 10,
29    /// Startup message (tsmEv 11)
30    Startup = 11,
31    /// Assistance request (tsmEv 19)
32    AssistanceRequest = 19,
33    /// Assistance response (tsmEv 20)
34    AssistanceResponse = 20,
35    /// Error message (tsmEv 29)
36    Error = 29,
37    /// Configuration command (tsmEv 30)
38    ConfigCommand = 30,
39    /// Configuration response (tsmEv 31)
40    ConfigResponse = 31,
41    /// Information request (tsmEv 32)
42    InfoRequest = 32,
43    /// Firmware response (tsmEv 33)
44    FirmwareResponse = 33,
45    /// Raw packet send (tsmEv 35)
46    RawPacketSend = 35,
47}
48
49/// Device model codes for different Thingsee devices
50#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash, Serialize, Deserialize)]
51pub enum DeviceModel {
52    /// Thingsee AIR (TSAR01)
53    #[serde(rename = "TSAR01")]
54    ThingseeAir01,
55    /// Thingsee AIR (TSAR02)
56    #[serde(rename = "TSAR02")]
57    ThingseeAir02,
58    /// Thingsee ANGLE RUGGED (TSAN01)
59    #[serde(rename = "TSAN01")]
60    ThingseeAngleRugged,
61    /// Thingsee BEAM (TSTF04)
62    #[serde(rename = "TSTF04")]
63    ThingseeBeam,
64    /// Thingsee COUNT (TSAP01)
65    #[serde(rename = "TSAP01")]
66    ThingseeCount,
67    /// Thingsee ENVIRONMENT (TSEN01)
68    #[serde(rename = "TSEN01")]
69    ThingseeEnvironment,
70    /// Thingsee ENVIRONMENT RUGGED (TSRU01)
71    #[serde(rename = "TSRU01")]
72    ThingseeEnvironmentRugged01,
73    /// Thingsee ENVIRONMENT RUGGED (TSRU02)
74    #[serde(rename = "TSRU02")]
75    ThingseeEnvironmentRugged02,
76    /// Thingsee ENVIRONMENT (TSPD04)
77    #[serde(rename = "TSPD04")]
78    ThingseeEnvironmentPd04,
79    /// Thingsee GATEWAY LAN (TSGW05)
80    #[serde(rename = "TSGW05")]
81    ThingseeGatewayLan,
82    /// Thingsee GATEWAY GLOBAL (TSGW06)
83    #[serde(rename = "TSGW06")]
84    ThingseeGatewayGlobal,
85    /// Thingsee LEAKAGE RUGGED (TSLK01)
86    #[serde(rename = "TSLK01")]
87    ThingseeLeakageRugged01,
88    /// Thingsee LEAKAGE RUGGED (TSLK02)
89    #[serde(rename = "TSLK02")]
90    ThingseeLeakageRugged02,
91    /// Thingsee POWERCOVER (TSPC01)
92    #[serde(rename = "TSPC01")]
93    ThingseePowercover,
94    /// Thingsee PRESENCE (TSPR04)
95    #[serde(rename = "TSPR04")]
96    ThingseePresence,
97    /// Haltian RADAR (TSRA01)
98    #[serde(rename = "TSRA01")]
99    HaltianRadar,
100}
101
102/// Common TSM ID ranges and constants
103pub mod tsm_ids {
104    // Common profile (1000-1999)
105    /// System information TSM ID
106    pub const SYSTEM_INFO: u16 = 1100;
107    /// System information unavailable TSM ID
108    pub const SYSTEM_INFO_UNAVAILABLE: u16 = 1102;
109    /// Battery information TSM ID
110    pub const BATTERY_INFO: u16 = 1110;
111    /// Orientation information TSM ID
112    pub const ORIENTATION_INFO: u16 = 1111;
113    /// Uptime information TSM ID
114    pub const UPTIME_INFO: u16 = 1112;
115    /// Wirepas network diagnostics TSM ID
116    pub const WIREPAS_NETWORK_DIAGNOSTICS: u16 = 1200;
117    /// Wirepas node identification TSM ID
118    pub const WIREPAS_NODE_IDENTIFICATION: u16 = 1201;
119    /// Sensor network diagnostics TSM ID
120    pub const SENSOR_NETWORK_DIAGNOSTICS: u16 = 1202;
121    /// Sensor network identification TSM ID
122    pub const SENSOR_NETWORK_IDENTIFICATION: u16 = 1205;
123    /// Cellular RF data TSM ID
124    pub const CELLULAR_RF_DATA: u16 = 1211;
125    /// Cellular identification TSM ID
126    pub const CELLULAR_IDENTIFICATION: u16 = 1212;
127    /// Wirepas node diagnostics TSM ID
128    pub const WIREPAS_NODE_DIAGNOSTICS: u16 = 1220;
129    /// Firmware binary version TSM ID
130    pub const FIRMWARE_BINARY_VERSION: u16 = 1312;
131    /// Hardware identification TSM ID
132    pub const HARDWARE_IDENTIFICATION: u16 = 1313;
133    /// Error information TSM ID
134    pub const ERROR_INFO: u16 = 1403;
135    /// Sensor interval configuration TSM ID
136    pub const SENSOR_INTERVAL_CONFIG: u16 = 1500;
137    /// Wirepas node role configuration TSM ID
138    pub const WIREPAS_NODE_ROLE_CONFIG: u16 = 1501;
139
140    // Analytics profile (2000-2999)
141    /// Occupancy state change TSM ID
142    pub const OCCUPANCY_STATE_CHANGE: u16 = 2100;
143
144    // Gateway profile (11000-11999)
145    /// Gateway heartbeat summary TSM ID
146    pub const GATEWAY_HEARTBEAT_SUMMARY: u16 = 11200;
147    /// Gateway heartbeat state change TSM ID
148    pub const GATEWAY_HEARTBEAT_STATE_CHANGE: u16 = 11201;
149    /// Gateway heartbeat configuration TSM ID
150    pub const GATEWAY_HEARTBEAT_CONFIG: u16 = 11210;
151    /// Gateway heartbeat request TSM ID
152    pub const GATEWAY_HEARTBEAT_REQUEST: u16 = 11211;
153    /// Gateway time synchronization configuration TSM ID
154    pub const GATEWAY_TIMESYNC_CONFIG: u16 = 11220;
155    /// Wirepas raw packet send TSM ID
156    pub const WIREPAS_RAW_PACKET_SEND: u16 = 11310;
157    /// Wirepas raw packet receive TSM ID
158    pub const WIREPAS_RAW_PACKET_RECEIVE: u16 = 11311;
159    /// Wirepas raw packet configuration TSM ID
160    pub const WIREPAS_RAW_PACKET_CONFIG: u16 = 11312;
161    /// Wirepas mesh application configuration TSM ID
162    pub const WIREPAS_MESH_APP_CONFIG: u16 = 11320;
163
164    // Environment profile (12000-12999)
165    /// Environment sensor data TSM ID
166    pub const ENVIRONMENT_DATA: u16 = 12100;
167    /// Magneto switch data TSM ID
168    pub const MAGNETO_SWITCH_DATA: u16 = 12101;
169    /// Leakage resistance data TSM ID
170    pub const LEAKAGE_RESISTANCE_DATA: u16 = 12102;
171    /// Environment sensor configuration TSM ID
172    pub const ENVIRONMENT_SENSOR_CONFIG: u16 = 12200;
173    /// Weather sensor configuration TSM ID
174    pub const WEATHER_SENSOR_CONFIG: u16 = 12210;
175    /// Leakage sensor configuration TSM ID
176    pub const LEAKAGE_SENSOR_CONFIG: u16 = 12212;
177
178    // Presence and occupancy profile (13000-13999)
179    /// Presence movement count TSM ID
180    pub const PRESENCE_MOVEMENT_COUNT: u16 = 13100;
181    /// Presence count data TSM ID
182    pub const PRESENCE_COUNT_DATA: u16 = 13103;
183    /// Presence sensor configuration TSM ID
184    pub const PRESENCE_SENSOR_CONFIG: u16 = 13200;
185
186    // Machine usage profile (16000-16999)
187    /// Machine usage data TSM ID
188    pub const MACHINE_USAGE_DATA: u16 = 16100;
189
190    // Distance profile (17000-17999)
191    /// Distance measurement TSM ID
192    pub const DISTANCE_MEASUREMENT: u16 = 17200;
193    /// Distance sensor configuration TSM ID
194    pub const DISTANCE_SENSOR_CONFIG: u16 = 17220;
195
196    // Angle profile (18000-18999)
197    /// Angle measurement data TSM ID
198    pub const ANGLE_DATA: u16 = 18100;
199    /// Angle sensor temperature TSM ID
200    pub const ANGLE_TEMPERATURE: u16 = 18101;
201    /// Angle LED control TSM ID
202    pub const ANGLE_LED_CONTROL: u16 = 18200;
203
204    // Air quality profile (24000-24999)
205    /// CO2 sensor data TSM ID
206    pub const CO2_DATA: u16 = 24100;
207    /// TVOC sensor data TSM ID
208    pub const TVOC_DATA: u16 = 24101;
209    /// CO2 sensor configuration TSM ID
210    pub const CO2_CONFIG: u16 = 24200;
211    /// TVOC sensor configuration TSM ID
212    pub const TVOC_CONFIG: u16 = 24202;
213
214    // Radar profile (28000-28999)
215    /// Radar set to sleep TSM ID
216    pub const RADAR_SET_TO_SLEEP: u16 = 28006;
217    /// Radar measurement TSM ID
218    pub const RADAR_MEASUREMENT: u16 = 28009;
219    /// Radar ELA started TSM ID
220    pub const RADAR_ELA_STARTED: u16 = 28010;
221    /// Radar ELA curve TSM ID
222    pub const RADAR_ELA_CURVE: u16 = 28011;
223    /// Radar ELA calibration TSM ID
224    pub const RADAR_ELA_CALIBRATION: u16 = 28037;
225}
226
227/// Common sensor status values
228#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash, Serialize, Deserialize)]
229#[repr(u8)]
230pub enum SensorStatus {
231    /// Sensor operating normally
232    Normal = 0,
233    /// Sensor warming up
234    WarmingUp = 1,
235    /// Sensor error
236    Error = 2,
237    /// Sensor calibrating
238    Calibrating = 3,
239}
240
241/// Battery level representation (0-100%)
242pub type BatteryLevel = u8;
243
244/// Temperature in Celsius (with 0.1°C precision)
245pub type Temperature = i16;
246
247/// Humidity percentage (0-100% with 0.1% precision)
248pub type Humidity = u16;
249
250/// Pressure in hPa (with 0.01 hPa precision)
251pub type Pressure = u32;
252
253/// Light level in lux
254pub type LightLevel = u32;
255
256/// CO2 concentration in ppm
257pub type Co2Level = u16;
258
259/// TVOC concentration in ppb
260pub type TvocLevel = u16;
261
262/// Distance in millimeters
263pub type Distance = u16;
264
265/// Angle in degrees (0-360)
266pub type Angle = u16;
267
268/// Resistance value for leakage detection
269pub type Resistance = u32;
270
271/// Thing Unique Identifier
272pub type Tuid = heapless::String<16>;
273
274/// Software version string
275pub type SoftwareVersion = heapless::String<32>;
276
277/// Product serial number
278pub type ProductSerialNumber = heapless::String<32>;
279
280/// Binary type identifier
281pub type BinaryType = heapless::String<16>;
282
283/// Binary version string
284pub type BinaryVersion = heapless::String<32>;
285
286/// Hardware ID string
287pub type HardwareId = heapless::String<16>;
288
289/// RSSI value in dBm
290pub type RssiDbm = i8;
291
292/// Raw RSSI value
293pub type Rssi = u8;
294
295/// Radio power value
296pub type RadioPower = u8;
297
298/// Radio power in dBm
299pub type RadioPowerDbm = i8;
300
301/// Cellular signal quality parameters
302#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
303pub struct CellularSignal {
304    /// Reference Signal Received Power (dBm)
305    #[serde(skip_serializing_if = "Option::is_none")]
306    pub cell_rsrp: Option<i16>,
307    /// Reference Signal Received Quality (dB)
308    #[serde(skip_serializing_if = "Option::is_none")]
309    pub cell_rsrq: Option<i16>,
310    /// Signal to Interference plus Noise Ratio (dB)
311    #[serde(skip_serializing_if = "Option::is_none")]
312    pub cell_sinr: Option<i16>,
313    /// Received Signal Strength Indicator (dBm)
314    #[serde(skip_serializing_if = "Option::is_none")]
315    pub cell_rssi: Option<i16>,
316    /// Received Signal Code Power (dBm)
317    #[serde(skip_serializing_if = "Option::is_none")]
318    pub cell_rscp: Option<i16>,
319    /// Energy per Chip to Noise Ratio (dB)
320    #[serde(skip_serializing_if = "Option::is_none")]
321    pub cell_ecn0: Option<i16>,
322    /// Location Area Code
323    #[serde(skip_serializing_if = "Option::is_none")]
324    pub cell_lac: Option<u16>,
325    /// Cell ID
326    #[serde(skip_serializing_if = "Option::is_none")]
327    pub cell_id: Option<u32>,
328    /// Tracking Area Code
329    #[serde(skip_serializing_if = "Option::is_none")]
330    pub cell_tac: Option<u16>,
331    /// Radio Access Technology
332    #[serde(skip_serializing_if = "Option::is_none")]
333    pub cell_rat: Option<u8>,
334}
335
336/// Accelerometer data (3-axis)
337#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
338pub struct AccelerometerData {
339    /// X-axis acceleration
340    pub accx: i16,
341    /// Y-axis acceleration
342    pub accy: i16,
343    /// Z-axis acceleration
344    pub accz: i16,
345}