tinkerforge_async/bindings/
industrial_digital_in_4_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 IndustrialDigitalIn4BrickletFunction {
24 GetValue,
25 SetGroup,
26 GetGroup,
27 GetAvailableForGroup,
28 SetDebouncePeriod,
29 GetDebouncePeriod,
30 SetInterrupt,
31 GetInterrupt,
32 GetEdgeCount,
33 SetEdgeCountConfig,
34 GetEdgeCountConfig,
35 GetIdentity,
36 CallbackInterrupt,
37}
38impl From<IndustrialDigitalIn4BrickletFunction> for u8 {
39 fn from(fun: IndustrialDigitalIn4BrickletFunction) -> Self {
40 match fun {
41 IndustrialDigitalIn4BrickletFunction::GetValue => 1,
42 IndustrialDigitalIn4BrickletFunction::SetGroup => 2,
43 IndustrialDigitalIn4BrickletFunction::GetGroup => 3,
44 IndustrialDigitalIn4BrickletFunction::GetAvailableForGroup => 4,
45 IndustrialDigitalIn4BrickletFunction::SetDebouncePeriod => 5,
46 IndustrialDigitalIn4BrickletFunction::GetDebouncePeriod => 6,
47 IndustrialDigitalIn4BrickletFunction::SetInterrupt => 7,
48 IndustrialDigitalIn4BrickletFunction::GetInterrupt => 8,
49 IndustrialDigitalIn4BrickletFunction::GetEdgeCount => 10,
50 IndustrialDigitalIn4BrickletFunction::SetEdgeCountConfig => 11,
51 IndustrialDigitalIn4BrickletFunction::GetEdgeCountConfig => 12,
52 IndustrialDigitalIn4BrickletFunction::GetIdentity => 255,
53 IndustrialDigitalIn4BrickletFunction::CallbackInterrupt => 9,
54 }
55 }
56}
57pub const INDUSTRIAL_DIGITAL_IN_4_BRICKLET_EDGE_TYPE_RISING: u8 = 0;
58pub const INDUSTRIAL_DIGITAL_IN_4_BRICKLET_EDGE_TYPE_FALLING: u8 = 1;
59pub const INDUSTRIAL_DIGITAL_IN_4_BRICKLET_EDGE_TYPE_BOTH: u8 = 2;
60
61#[derive(Clone, Copy, Debug, Default, PartialEq, Eq, Hash)]
62pub struct InterruptEvent {
63 pub interrupt_mask: u16,
64 pub value_mask: u16,
65}
66impl FromByteSlice for InterruptEvent {
67 fn bytes_expected() -> usize {
68 4
69 }
70 fn from_le_byte_slice(bytes: &[u8]) -> InterruptEvent {
71 InterruptEvent { interrupt_mask: <u16>::from_le_byte_slice(&bytes[0..2]), value_mask: <u16>::from_le_byte_slice(&bytes[2..4]) }
72 }
73}
74
75#[derive(Clone, Copy, Debug, Default, PartialEq, Eq, Hash)]
76pub struct EdgeCountConfig {
77 pub edge_type: u8,
78 pub debounce: u8,
79}
80impl FromByteSlice for EdgeCountConfig {
81 fn bytes_expected() -> usize {
82 2
83 }
84 fn from_le_byte_slice(bytes: &[u8]) -> EdgeCountConfig {
85 EdgeCountConfig { edge_type: <u8>::from_le_byte_slice(&bytes[0..1]), debounce: <u8>::from_le_byte_slice(&bytes[1..2]) }
86 }
87}
88
89#[derive(Clone, Debug, Default, PartialEq, Eq, Hash)]
90pub struct Identity {
91 pub uid: String,
92 pub connected_uid: String,
93 pub position: char,
94 pub hardware_version: [u8; 3],
95 pub firmware_version: [u8; 3],
96 pub device_identifier: u16,
97}
98impl FromByteSlice for Identity {
99 fn bytes_expected() -> usize {
100 25
101 }
102 fn from_le_byte_slice(bytes: &[u8]) -> Identity {
103 Identity {
104 uid: <String>::from_le_byte_slice(&bytes[0..8]),
105 connected_uid: <String>::from_le_byte_slice(&bytes[8..16]),
106 position: <char>::from_le_byte_slice(&bytes[16..17]),
107 hardware_version: <[u8; 3]>::from_le_byte_slice(&bytes[17..20]),
108 firmware_version: <[u8; 3]>::from_le_byte_slice(&bytes[20..23]),
109 device_identifier: <u16>::from_le_byte_slice(&bytes[23..25]),
110 }
111 }
112}
113
114#[derive(Clone)]
116pub struct IndustrialDigitalIn4Bricklet {
117 device: Device,
118}
119impl IndustrialDigitalIn4Bricklet {
120 pub const DEVICE_IDENTIFIER: u16 = 223;
121 pub const DEVICE_DISPLAY_NAME: &'static str = "Industrial Digital In 4 Bricklet";
122 pub fn new(uid: Uid, connection: AsyncIpConnection) -> IndustrialDigitalIn4Bricklet {
124 let mut result = IndustrialDigitalIn4Bricklet { device: Device::new([2, 0, 10], uid, connection, Self::DEVICE_DISPLAY_NAME) };
125 result.device.response_expected[u8::from(IndustrialDigitalIn4BrickletFunction::GetValue) as usize] =
126 ResponseExpectedFlag::AlwaysTrue;
127 result.device.response_expected[u8::from(IndustrialDigitalIn4BrickletFunction::SetGroup) as usize] = ResponseExpectedFlag::False;
128 result.device.response_expected[u8::from(IndustrialDigitalIn4BrickletFunction::GetGroup) as usize] =
129 ResponseExpectedFlag::AlwaysTrue;
130 result.device.response_expected[u8::from(IndustrialDigitalIn4BrickletFunction::GetAvailableForGroup) as usize] =
131 ResponseExpectedFlag::AlwaysTrue;
132 result.device.response_expected[u8::from(IndustrialDigitalIn4BrickletFunction::SetDebouncePeriod) as usize] =
133 ResponseExpectedFlag::True;
134 result.device.response_expected[u8::from(IndustrialDigitalIn4BrickletFunction::GetDebouncePeriod) as usize] =
135 ResponseExpectedFlag::AlwaysTrue;
136 result.device.response_expected[u8::from(IndustrialDigitalIn4BrickletFunction::SetInterrupt) as usize] = ResponseExpectedFlag::True;
137 result.device.response_expected[u8::from(IndustrialDigitalIn4BrickletFunction::GetInterrupt) as usize] =
138 ResponseExpectedFlag::AlwaysTrue;
139 result.device.response_expected[u8::from(IndustrialDigitalIn4BrickletFunction::GetEdgeCount) as usize] =
140 ResponseExpectedFlag::AlwaysTrue;
141 result.device.response_expected[u8::from(IndustrialDigitalIn4BrickletFunction::SetEdgeCountConfig) as usize] =
142 ResponseExpectedFlag::False;
143 result.device.response_expected[u8::from(IndustrialDigitalIn4BrickletFunction::GetEdgeCountConfig) as usize] =
144 ResponseExpectedFlag::AlwaysTrue;
145 result.device.response_expected[u8::from(IndustrialDigitalIn4BrickletFunction::GetIdentity) as usize] =
146 ResponseExpectedFlag::AlwaysTrue;
147 result
148 }
149
150 pub fn get_response_expected(&mut self, fun: IndustrialDigitalIn4BrickletFunction) -> Result<bool, GetResponseExpectedError> {
165 self.device.get_response_expected(u8::from(fun))
166 }
167
168 pub fn set_response_expected(
177 &mut self,
178 fun: IndustrialDigitalIn4BrickletFunction,
179 response_expected: bool,
180 ) -> Result<(), SetResponseExpectedError> {
181 self.device.set_response_expected(u8::from(fun), response_expected)
182 }
183
184 pub fn set_response_expected_all(&mut self, response_expected: bool) {
186 self.device.set_response_expected_all(response_expected)
187 }
188
189 pub fn get_api_version(&self) -> [u8; 3] {
192 self.device.api_version
193 }
194
195 pub async fn get_interrupt_callback_receiver(&mut self) -> impl Stream<Item = InterruptEvent> {
213 self.device
214 .get_callback_receiver(u8::from(IndustrialDigitalIn4BrickletFunction::CallbackInterrupt))
215 .await
216 .map(|p| InterruptEvent::from_le_byte_slice(p.body()))
217 }
218
219 pub async fn get_value(&mut self) -> Result<u16, TinkerforgeError> {
232 let payload = [0; 0];
233
234 #[allow(unused_variables)]
235 let result = self.device.get(u8::from(IndustrialDigitalIn4BrickletFunction::GetValue), &payload).await?;
236 Ok(u16::from_le_byte_slice(result.body()))
237 }
238
239 pub async fn set_group(&mut self, group: &[char; 4]) -> Result<(), TinkerforgeError> {
258 let mut payload = [0; 4];
259 group.write_to_slice(&mut payload[0..4]);
260
261 #[allow(unused_variables)]
262 let result = self.device.set(u8::from(IndustrialDigitalIn4BrickletFunction::SetGroup), &payload).await?;
263 Ok(())
264 }
265
266 pub async fn get_group(&mut self) -> Result<Box<[char; 4]>, TinkerforgeError> {
268 let payload = [0; 0];
269
270 #[allow(unused_variables)]
271 let result = self.device.get(u8::from(IndustrialDigitalIn4BrickletFunction::GetGroup), &payload).await?;
272 Ok(Box::<[char; 4]>::from_le_byte_slice(result.body()))
273 }
274
275 pub async fn get_available_for_group(&mut self) -> Result<u8, TinkerforgeError> {
279 let payload = [0; 0];
280
281 #[allow(unused_variables)]
282 let result = self.device.get(u8::from(IndustrialDigitalIn4BrickletFunction::GetAvailableForGroup), &payload).await?;
283 Ok(u8::from_le_byte_slice(result.body()))
284 }
285
286 pub async fn set_debounce_period(&mut self, debounce: u32) -> Result<(), TinkerforgeError> {
292 let mut payload = [0; 4];
293 debounce.write_to_slice(&mut payload[0..4]);
294
295 #[allow(unused_variables)]
296 let result = self.device.set(u8::from(IndustrialDigitalIn4BrickletFunction::SetDebouncePeriod), &payload).await?;
297 Ok(())
298 }
299
300 pub async fn get_debounce_period(&mut self) -> Result<u32, TinkerforgeError> {
302 let payload = [0; 0];
303
304 #[allow(unused_variables)]
305 let result = self.device.get(u8::from(IndustrialDigitalIn4BrickletFunction::GetDebouncePeriod), &payload).await?;
306 Ok(u32::from_le_byte_slice(result.body()))
307 }
308
309 pub async fn set_interrupt(&mut self, interrupt_mask: u16) -> Result<(), TinkerforgeError> {
320 let mut payload = [0; 2];
321 interrupt_mask.write_to_slice(&mut payload[0..2]);
322
323 #[allow(unused_variables)]
324 let result = self.device.set(u8::from(IndustrialDigitalIn4BrickletFunction::SetInterrupt), &payload).await?;
325 Ok(())
326 }
327
328 pub async fn get_interrupt(&mut self) -> Result<u16, TinkerforgeError> {
330 let payload = [0; 0];
331
332 #[allow(unused_variables)]
333 let result = self.device.get(u8::from(IndustrialDigitalIn4BrickletFunction::GetInterrupt), &payload).await?;
334 Ok(u16::from_le_byte_slice(result.body()))
335 }
336
337 pub async fn get_edge_count(&mut self, pin: u8, reset_counter: bool) -> Result<u32, TinkerforgeError> {
348 let mut payload = [0; 2];
349 pin.write_to_slice(&mut payload[0..1]);
350 reset_counter.write_to_slice(&mut payload[1..2]);
351
352 #[allow(unused_variables)]
353 let result = self.device.get(u8::from(IndustrialDigitalIn4BrickletFunction::GetEdgeCount), &payload).await?;
354 Ok(u32::from_le_byte_slice(result.body()))
355 }
356
357 pub async fn set_edge_count_config(&mut self, selection_mask: u16, edge_type: u8, debounce: u8) -> Result<(), TinkerforgeError> {
382 let mut payload = [0; 4];
383 selection_mask.write_to_slice(&mut payload[0..2]);
384 edge_type.write_to_slice(&mut payload[2..3]);
385 debounce.write_to_slice(&mut payload[3..4]);
386
387 #[allow(unused_variables)]
388 let result = self.device.set(u8::from(IndustrialDigitalIn4BrickletFunction::SetEdgeCountConfig), &payload).await?;
389 Ok(())
390 }
391
392 pub async fn get_edge_count_config(&mut self, pin: u8) -> Result<EdgeCountConfig, TinkerforgeError> {
403 let mut payload = [0; 1];
404 pin.write_to_slice(&mut payload[0..1]);
405
406 #[allow(unused_variables)]
407 let result = self.device.get(u8::from(IndustrialDigitalIn4BrickletFunction::GetEdgeCountConfig), &payload).await?;
408 Ok(EdgeCountConfig::from_le_byte_slice(result.body()))
409 }
410
411 pub async fn get_identity(&mut self) -> Result<Identity, TinkerforgeError> {
422 let payload = [0; 0];
423
424 #[allow(unused_variables)]
425 let result = self.device.get(u8::from(IndustrialDigitalIn4BrickletFunction::GetIdentity), &payload).await?;
426 Ok(Identity::from_le_byte_slice(result.body()))
427 }
428}