tinkerforge_async/bindings/
moisture_bricklet.rs1#[allow(unused_imports)]
15use crate::{
16 base58::Uid, byte_converter::*, device::*, error::TinkerforgeError, ip_connection::async_io::AsyncIpConnection,
17 low_level_traits::LowLevelRead,
18};
19#[allow(unused_imports)]
20use futures_core::Stream;
21#[allow(unused_imports)]
22use tokio_stream::StreamExt;
23pub enum MoistureBrickletFunction {
24 GetMoistureValue,
25 SetMoistureCallbackPeriod,
26 GetMoistureCallbackPeriod,
27 SetMoistureCallbackThreshold,
28 GetMoistureCallbackThreshold,
29 SetDebouncePeriod,
30 GetDebouncePeriod,
31 SetMovingAverage,
32 GetMovingAverage,
33 GetIdentity,
34 CallbackMoisture,
35 CallbackMoistureReached,
36}
37impl From<MoistureBrickletFunction> for u8 {
38 fn from(fun: MoistureBrickletFunction) -> Self {
39 match fun {
40 MoistureBrickletFunction::GetMoistureValue => 1,
41 MoistureBrickletFunction::SetMoistureCallbackPeriod => 2,
42 MoistureBrickletFunction::GetMoistureCallbackPeriod => 3,
43 MoistureBrickletFunction::SetMoistureCallbackThreshold => 4,
44 MoistureBrickletFunction::GetMoistureCallbackThreshold => 5,
45 MoistureBrickletFunction::SetDebouncePeriod => 6,
46 MoistureBrickletFunction::GetDebouncePeriod => 7,
47 MoistureBrickletFunction::SetMovingAverage => 10,
48 MoistureBrickletFunction::GetMovingAverage => 11,
49 MoistureBrickletFunction::GetIdentity => 255,
50 MoistureBrickletFunction::CallbackMoisture => 8,
51 MoistureBrickletFunction::CallbackMoistureReached => 9,
52 }
53 }
54}
55pub const MOISTURE_BRICKLET_THRESHOLD_OPTION_OFF: char = 'x';
56pub const MOISTURE_BRICKLET_THRESHOLD_OPTION_OUTSIDE: char = 'o';
57pub const MOISTURE_BRICKLET_THRESHOLD_OPTION_INSIDE: char = 'i';
58pub const MOISTURE_BRICKLET_THRESHOLD_OPTION_SMALLER: char = '<';
59pub const MOISTURE_BRICKLET_THRESHOLD_OPTION_GREATER: char = '>';
60
61#[derive(Clone, Copy, Debug, Default, PartialEq, Eq, Hash)]
62pub struct MoistureCallbackThreshold {
63 pub option: char,
64 pub min: u16,
65 pub max: u16,
66}
67impl FromByteSlice for MoistureCallbackThreshold {
68 fn bytes_expected() -> usize {
69 5
70 }
71 fn from_le_byte_slice(bytes: &[u8]) -> MoistureCallbackThreshold {
72 MoistureCallbackThreshold {
73 option: <char>::from_le_byte_slice(&bytes[0..1]),
74 min: <u16>::from_le_byte_slice(&bytes[1..3]),
75 max: <u16>::from_le_byte_slice(&bytes[3..5]),
76 }
77 }
78}
79
80#[derive(Clone, Debug, Default, PartialEq, Eq, Hash)]
81pub struct Identity {
82 pub uid: String,
83 pub connected_uid: String,
84 pub position: char,
85 pub hardware_version: [u8; 3],
86 pub firmware_version: [u8; 3],
87 pub device_identifier: u16,
88}
89impl FromByteSlice for Identity {
90 fn bytes_expected() -> usize {
91 25
92 }
93 fn from_le_byte_slice(bytes: &[u8]) -> Identity {
94 Identity {
95 uid: <String>::from_le_byte_slice(&bytes[0..8]),
96 connected_uid: <String>::from_le_byte_slice(&bytes[8..16]),
97 position: <char>::from_le_byte_slice(&bytes[16..17]),
98 hardware_version: <[u8; 3]>::from_le_byte_slice(&bytes[17..20]),
99 firmware_version: <[u8; 3]>::from_le_byte_slice(&bytes[20..23]),
100 device_identifier: <u16>::from_le_byte_slice(&bytes[23..25]),
101 }
102 }
103}
104
105#[derive(Clone)]
107pub struct MoistureBricklet {
108 device: Device,
109}
110impl MoistureBricklet {
111 pub const DEVICE_IDENTIFIER: u16 = 232;
112 pub const DEVICE_DISPLAY_NAME: &'static str = "Moisture Bricklet";
113 pub fn new(uid: Uid, connection: AsyncIpConnection) -> MoistureBricklet {
115 let mut result = MoistureBricklet { device: Device::new([2, 0, 10], uid, connection, Self::DEVICE_DISPLAY_NAME) };
116 result.device.response_expected[u8::from(MoistureBrickletFunction::GetMoistureValue) as usize] = ResponseExpectedFlag::AlwaysTrue;
117 result.device.response_expected[u8::from(MoistureBrickletFunction::SetMoistureCallbackPeriod) as usize] =
118 ResponseExpectedFlag::True;
119 result.device.response_expected[u8::from(MoistureBrickletFunction::GetMoistureCallbackPeriod) as usize] =
120 ResponseExpectedFlag::AlwaysTrue;
121 result.device.response_expected[u8::from(MoistureBrickletFunction::SetMoistureCallbackThreshold) as usize] =
122 ResponseExpectedFlag::True;
123 result.device.response_expected[u8::from(MoistureBrickletFunction::GetMoistureCallbackThreshold) as usize] =
124 ResponseExpectedFlag::AlwaysTrue;
125 result.device.response_expected[u8::from(MoistureBrickletFunction::SetDebouncePeriod) as usize] = ResponseExpectedFlag::True;
126 result.device.response_expected[u8::from(MoistureBrickletFunction::GetDebouncePeriod) as usize] = ResponseExpectedFlag::AlwaysTrue;
127 result.device.response_expected[u8::from(MoistureBrickletFunction::SetMovingAverage) as usize] = ResponseExpectedFlag::False;
128 result.device.response_expected[u8::from(MoistureBrickletFunction::GetMovingAverage) as usize] = ResponseExpectedFlag::AlwaysTrue;
129 result.device.response_expected[u8::from(MoistureBrickletFunction::GetIdentity) as usize] = ResponseExpectedFlag::AlwaysTrue;
130 result
131 }
132
133 pub fn get_response_expected(&mut self, fun: MoistureBrickletFunction) -> Result<bool, GetResponseExpectedError> {
148 self.device.get_response_expected(u8::from(fun))
149 }
150
151 pub fn set_response_expected(
160 &mut self,
161 fun: MoistureBrickletFunction,
162 response_expected: bool,
163 ) -> Result<(), SetResponseExpectedError> {
164 self.device.set_response_expected(u8::from(fun), response_expected)
165 }
166
167 pub fn set_response_expected_all(&mut self, response_expected: bool) {
169 self.device.set_response_expected_all(response_expected)
170 }
171
172 pub fn get_api_version(&self) -> [u8; 3] {
175 self.device.api_version
176 }
177
178 pub async fn get_moisture_callback_receiver(&mut self) -> impl Stream<Item = u16> {
188 self.device
189 .get_callback_receiver(u8::from(MoistureBrickletFunction::CallbackMoisture))
190 .await
191 .map(|p| u16::from_le_byte_slice(p.body()))
192 }
193
194 pub async fn get_moisture_reached_callback_receiver(&mut self) -> impl Stream<Item = u16> {
201 self.device
202 .get_callback_receiver(u8::from(MoistureBrickletFunction::CallbackMoistureReached))
203 .await
204 .map(|p| u16::from_le_byte_slice(p.body()))
205 }
206
207 pub async fn get_moisture_value(&mut self) -> Result<u16, TinkerforgeError> {
215 let payload = [0; 0];
216
217 #[allow(unused_variables)]
218 let result = self.device.get(u8::from(MoistureBrickletFunction::GetMoistureValue), &payload).await?;
219 Ok(u16::from_le_byte_slice(result.body()))
220 }
221
222 pub async fn set_moisture_callback_period(&mut self, period: u32) -> Result<(), TinkerforgeError> {
228 let mut payload = [0; 4];
229 period.write_to_slice(&mut payload[0..4]);
230
231 #[allow(unused_variables)]
232 let result = self.device.set(u8::from(MoistureBrickletFunction::SetMoistureCallbackPeriod), &payload).await?;
233 Ok(())
234 }
235
236 pub async fn get_moisture_callback_period(&mut self) -> Result<u32, TinkerforgeError> {
238 let payload = [0; 0];
239
240 #[allow(unused_variables)]
241 let result = self.device.get(u8::from(MoistureBrickletFunction::GetMoistureCallbackPeriod), &payload).await?;
242 Ok(u32::from_le_byte_slice(result.body()))
243 }
244
245 pub async fn set_moisture_callback_threshold(&mut self, option: char, min: u16, max: u16) -> Result<(), TinkerforgeError> {
264 let mut payload = [0; 5];
265 option.write_to_slice(&mut payload[0..1]);
266 min.write_to_slice(&mut payload[1..3]);
267 max.write_to_slice(&mut payload[3..5]);
268
269 #[allow(unused_variables)]
270 let result = self.device.set(u8::from(MoistureBrickletFunction::SetMoistureCallbackThreshold), &payload).await?;
271 Ok(())
272 }
273
274 pub async fn get_moisture_callback_threshold(&mut self) -> Result<MoistureCallbackThreshold, TinkerforgeError> {
283 let payload = [0; 0];
284
285 #[allow(unused_variables)]
286 let result = self.device.get(u8::from(MoistureBrickletFunction::GetMoistureCallbackThreshold), &payload).await?;
287 Ok(MoistureCallbackThreshold::from_le_byte_slice(result.body()))
288 }
289
290 pub async fn set_debounce_period(&mut self, debounce: u32) -> Result<(), TinkerforgeError> {
300 let mut payload = [0; 4];
301 debounce.write_to_slice(&mut payload[0..4]);
302
303 #[allow(unused_variables)]
304 let result = self.device.set(u8::from(MoistureBrickletFunction::SetDebouncePeriod), &payload).await?;
305 Ok(())
306 }
307
308 pub async fn get_debounce_period(&mut self) -> Result<u32, TinkerforgeError> {
310 let payload = [0; 0];
311
312 #[allow(unused_variables)]
313 let result = self.device.get(u8::from(MoistureBrickletFunction::GetDebouncePeriod), &payload).await?;
314 Ok(u32::from_le_byte_slice(result.body()))
315 }
316
317 pub async fn set_moving_average(&mut self, average: u8) -> Result<(), TinkerforgeError> {
323 let mut payload = [0; 1];
324 average.write_to_slice(&mut payload[0..1]);
325
326 #[allow(unused_variables)]
327 let result = self.device.set(u8::from(MoistureBrickletFunction::SetMovingAverage), &payload).await?;
328 Ok(())
329 }
330
331 pub async fn get_moving_average(&mut self) -> Result<u8, TinkerforgeError> {
333 let payload = [0; 0];
334
335 #[allow(unused_variables)]
336 let result = self.device.get(u8::from(MoistureBrickletFunction::GetMovingAverage), &payload).await?;
337 Ok(u8::from_le_byte_slice(result.body()))
338 }
339
340 pub async fn get_identity(&mut self) -> Result<Identity, TinkerforgeError> {
351 let payload = [0; 0];
352
353 #[allow(unused_variables)]
354 let result = self.device.get(u8::from(MoistureBrickletFunction::GetIdentity), &payload).await?;
355 Ok(Identity::from_le_byte_slice(result.body()))
356 }
357}