1#[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 Io16BrickletFunction {
24 SetPort,
25 GetPort,
26 SetPortConfiguration,
27 GetPortConfiguration,
28 SetDebouncePeriod,
29 GetDebouncePeriod,
30 SetPortInterrupt,
31 GetPortInterrupt,
32 SetPortMonoflop,
33 GetPortMonoflop,
34 SetSelectedValues,
35 GetEdgeCount,
36 SetEdgeCountConfig,
37 GetEdgeCountConfig,
38 GetIdentity,
39 CallbackInterrupt,
40 CallbackMonoflopDone,
41}
42impl From<Io16BrickletFunction> for u8 {
43 fn from(fun: Io16BrickletFunction) -> Self {
44 match fun {
45 Io16BrickletFunction::SetPort => 1,
46 Io16BrickletFunction::GetPort => 2,
47 Io16BrickletFunction::SetPortConfiguration => 3,
48 Io16BrickletFunction::GetPortConfiguration => 4,
49 Io16BrickletFunction::SetDebouncePeriod => 5,
50 Io16BrickletFunction::GetDebouncePeriod => 6,
51 Io16BrickletFunction::SetPortInterrupt => 7,
52 Io16BrickletFunction::GetPortInterrupt => 8,
53 Io16BrickletFunction::SetPortMonoflop => 10,
54 Io16BrickletFunction::GetPortMonoflop => 11,
55 Io16BrickletFunction::SetSelectedValues => 13,
56 Io16BrickletFunction::GetEdgeCount => 14,
57 Io16BrickletFunction::SetEdgeCountConfig => 15,
58 Io16BrickletFunction::GetEdgeCountConfig => 16,
59 Io16BrickletFunction::GetIdentity => 255,
60 Io16BrickletFunction::CallbackInterrupt => 9,
61 Io16BrickletFunction::CallbackMonoflopDone => 12,
62 }
63 }
64}
65pub const IO16_BRICKLET_DIRECTION_IN: char = 'i';
66pub const IO16_BRICKLET_DIRECTION_OUT: char = 'o';
67pub const IO16_BRICKLET_EDGE_TYPE_RISING: u8 = 0;
68pub const IO16_BRICKLET_EDGE_TYPE_FALLING: u8 = 1;
69pub const IO16_BRICKLET_EDGE_TYPE_BOTH: u8 = 2;
70
71#[derive(Clone, Copy, Debug, Default, PartialEq, Eq, Hash)]
72pub struct PortConfiguration {
73 pub direction_mask: u8,
74 pub value_mask: u8,
75}
76impl FromByteSlice for PortConfiguration {
77 fn bytes_expected() -> usize {
78 2
79 }
80 fn from_le_byte_slice(bytes: &[u8]) -> PortConfiguration {
81 PortConfiguration { direction_mask: <u8>::from_le_byte_slice(&bytes[0..1]), value_mask: <u8>::from_le_byte_slice(&bytes[1..2]) }
82 }
83}
84
85#[derive(Clone, Copy, Debug, Default, PartialEq, Eq, Hash)]
86pub struct InterruptEvent {
87 pub port: char,
88 pub interrupt_mask: u8,
89 pub value_mask: u8,
90}
91impl FromByteSlice for InterruptEvent {
92 fn bytes_expected() -> usize {
93 3
94 }
95 fn from_le_byte_slice(bytes: &[u8]) -> InterruptEvent {
96 InterruptEvent {
97 port: <char>::from_le_byte_slice(&bytes[0..1]),
98 interrupt_mask: <u8>::from_le_byte_slice(&bytes[1..2]),
99 value_mask: <u8>::from_le_byte_slice(&bytes[2..3]),
100 }
101 }
102}
103
104#[derive(Clone, Copy, Debug, Default, PartialEq, Eq, Hash)]
105pub struct PortMonoflop {
106 pub value: u8,
107 pub time: u32,
108 pub time_remaining: u32,
109}
110impl FromByteSlice for PortMonoflop {
111 fn bytes_expected() -> usize {
112 9
113 }
114 fn from_le_byte_slice(bytes: &[u8]) -> PortMonoflop {
115 PortMonoflop {
116 value: <u8>::from_le_byte_slice(&bytes[0..1]),
117 time: <u32>::from_le_byte_slice(&bytes[1..5]),
118 time_remaining: <u32>::from_le_byte_slice(&bytes[5..9]),
119 }
120 }
121}
122
123#[derive(Clone, Copy, Debug, Default, PartialEq, Eq, Hash)]
124pub struct MonoflopDoneEvent {
125 pub port: char,
126 pub selection_mask: u8,
127 pub value_mask: u8,
128}
129impl FromByteSlice for MonoflopDoneEvent {
130 fn bytes_expected() -> usize {
131 3
132 }
133 fn from_le_byte_slice(bytes: &[u8]) -> MonoflopDoneEvent {
134 MonoflopDoneEvent {
135 port: <char>::from_le_byte_slice(&bytes[0..1]),
136 selection_mask: <u8>::from_le_byte_slice(&bytes[1..2]),
137 value_mask: <u8>::from_le_byte_slice(&bytes[2..3]),
138 }
139 }
140}
141
142#[derive(Clone, Copy, Debug, Default, PartialEq, Eq, Hash)]
143pub struct EdgeCountConfig {
144 pub edge_type: u8,
145 pub debounce: u8,
146}
147impl FromByteSlice for EdgeCountConfig {
148 fn bytes_expected() -> usize {
149 2
150 }
151 fn from_le_byte_slice(bytes: &[u8]) -> EdgeCountConfig {
152 EdgeCountConfig { edge_type: <u8>::from_le_byte_slice(&bytes[0..1]), debounce: <u8>::from_le_byte_slice(&bytes[1..2]) }
153 }
154}
155
156#[derive(Clone, Debug, Default, PartialEq, Eq, Hash)]
157pub struct Identity {
158 pub uid: String,
159 pub connected_uid: String,
160 pub position: char,
161 pub hardware_version: [u8; 3],
162 pub firmware_version: [u8; 3],
163 pub device_identifier: u16,
164}
165impl FromByteSlice for Identity {
166 fn bytes_expected() -> usize {
167 25
168 }
169 fn from_le_byte_slice(bytes: &[u8]) -> Identity {
170 Identity {
171 uid: <String>::from_le_byte_slice(&bytes[0..8]),
172 connected_uid: <String>::from_le_byte_slice(&bytes[8..16]),
173 position: <char>::from_le_byte_slice(&bytes[16..17]),
174 hardware_version: <[u8; 3]>::from_le_byte_slice(&bytes[17..20]),
175 firmware_version: <[u8; 3]>::from_le_byte_slice(&bytes[20..23]),
176 device_identifier: <u16>::from_le_byte_slice(&bytes[23..25]),
177 }
178 }
179}
180
181#[derive(Clone)]
183pub struct Io16Bricklet {
184 device: Device,
185}
186impl Io16Bricklet {
187 pub const DEVICE_IDENTIFIER: u16 = 28;
188 pub const DEVICE_DISPLAY_NAME: &'static str = "IO-16 Bricklet";
189 pub fn new(uid: Uid, connection: AsyncIpConnection) -> Io16Bricklet {
191 let mut result = Io16Bricklet { device: Device::new([2, 0, 10], uid, connection, Self::DEVICE_DISPLAY_NAME) };
192 result.device.response_expected[u8::from(Io16BrickletFunction::SetPort) as usize] = ResponseExpectedFlag::False;
193 result.device.response_expected[u8::from(Io16BrickletFunction::GetPort) as usize] = ResponseExpectedFlag::AlwaysTrue;
194 result.device.response_expected[u8::from(Io16BrickletFunction::SetPortConfiguration) as usize] = ResponseExpectedFlag::False;
195 result.device.response_expected[u8::from(Io16BrickletFunction::GetPortConfiguration) as usize] = ResponseExpectedFlag::AlwaysTrue;
196 result.device.response_expected[u8::from(Io16BrickletFunction::SetDebouncePeriod) as usize] = ResponseExpectedFlag::True;
197 result.device.response_expected[u8::from(Io16BrickletFunction::GetDebouncePeriod) as usize] = ResponseExpectedFlag::AlwaysTrue;
198 result.device.response_expected[u8::from(Io16BrickletFunction::SetPortInterrupt) as usize] = ResponseExpectedFlag::True;
199 result.device.response_expected[u8::from(Io16BrickletFunction::GetPortInterrupt) as usize] = ResponseExpectedFlag::AlwaysTrue;
200 result.device.response_expected[u8::from(Io16BrickletFunction::SetPortMonoflop) as usize] = ResponseExpectedFlag::False;
201 result.device.response_expected[u8::from(Io16BrickletFunction::GetPortMonoflop) as usize] = ResponseExpectedFlag::AlwaysTrue;
202 result.device.response_expected[u8::from(Io16BrickletFunction::SetSelectedValues) as usize] = ResponseExpectedFlag::False;
203 result.device.response_expected[u8::from(Io16BrickletFunction::GetEdgeCount) as usize] = ResponseExpectedFlag::AlwaysTrue;
204 result.device.response_expected[u8::from(Io16BrickletFunction::SetEdgeCountConfig) as usize] = ResponseExpectedFlag::False;
205 result.device.response_expected[u8::from(Io16BrickletFunction::GetEdgeCountConfig) as usize] = ResponseExpectedFlag::AlwaysTrue;
206 result.device.response_expected[u8::from(Io16BrickletFunction::GetIdentity) as usize] = ResponseExpectedFlag::AlwaysTrue;
207 result
208 }
209
210 pub fn get_response_expected(&mut self, fun: Io16BrickletFunction) -> Result<bool, GetResponseExpectedError> {
225 self.device.get_response_expected(u8::from(fun))
226 }
227
228 pub fn set_response_expected(&mut self, fun: Io16BrickletFunction, response_expected: bool) -> Result<(), SetResponseExpectedError> {
237 self.device.set_response_expected(u8::from(fun), response_expected)
238 }
239
240 pub fn set_response_expected_all(&mut self, response_expected: bool) {
242 self.device.set_response_expected_all(response_expected)
243 }
244
245 pub fn get_api_version(&self) -> [u8; 3] {
248 self.device.api_version
249 }
250
251 pub async fn get_interrupt_callback_receiver(&mut self) -> impl Stream<Item = InterruptEvent> {
267 self.device
268 .get_callback_receiver(u8::from(Io16BrickletFunction::CallbackInterrupt))
269 .await
270 .map(|p| InterruptEvent::from_le_byte_slice(p.body()))
271 }
272
273 pub async fn get_monoflop_done_callback_receiver(&mut self) -> impl Stream<Item = MonoflopDoneEvent> {
277 self.device
278 .get_callback_receiver(u8::from(Io16BrickletFunction::CallbackMonoflopDone))
279 .await
280 .map(|p| MonoflopDoneEvent::from_le_byte_slice(p.body()))
281 }
282
283 pub async fn set_port(&mut self, port: char, value_mask: u8) -> Result<(), TinkerforgeError> {
296 let mut payload = [0; 2];
297 port.write_to_slice(&mut payload[0..1]);
298 value_mask.write_to_slice(&mut payload[1..2]);
299
300 #[allow(unused_variables)]
301 let result = self.device.set(u8::from(Io16BrickletFunction::SetPort), &payload).await?;
302 Ok(())
303 }
304
305 pub async fn get_port(&mut self, port: char) -> Result<u8, TinkerforgeError> {
309 let mut payload = [0; 1];
310 port.write_to_slice(&mut payload[0..1]);
311
312 #[allow(unused_variables)]
313 let result = self.device.get(u8::from(Io16BrickletFunction::GetPort), &payload).await?;
314 Ok(u8::from_le_byte_slice(result.body()))
315 }
316
317 pub async fn set_port_configuration(
340 &mut self,
341 port: char,
342 selection_mask: u8,
343 direction: char,
344 value: bool,
345 ) -> Result<(), TinkerforgeError> {
346 let mut payload = [0; 4];
347 port.write_to_slice(&mut payload[0..1]);
348 selection_mask.write_to_slice(&mut payload[1..2]);
349 direction.write_to_slice(&mut payload[2..3]);
350 value.write_to_slice(&mut payload[3..4]);
351
352 #[allow(unused_variables)]
353 let result = self.device.set(u8::from(Io16BrickletFunction::SetPortConfiguration), &payload).await?;
354 Ok(())
355 }
356
357 pub async fn get_port_configuration(&mut self, port: char) -> Result<PortConfiguration, TinkerforgeError> {
368 let mut payload = [0; 1];
369 port.write_to_slice(&mut payload[0..1]);
370
371 #[allow(unused_variables)]
372 let result = self.device.get(u8::from(Io16BrickletFunction::GetPortConfiguration), &payload).await?;
373 Ok(PortConfiguration::from_le_byte_slice(result.body()))
374 }
375
376 pub async fn set_debounce_period(&mut self, debounce: u32) -> Result<(), TinkerforgeError> {
382 let mut payload = [0; 4];
383 debounce.write_to_slice(&mut payload[0..4]);
384
385 #[allow(unused_variables)]
386 let result = self.device.set(u8::from(Io16BrickletFunction::SetDebouncePeriod), &payload).await?;
387 Ok(())
388 }
389
390 pub async fn get_debounce_period(&mut self) -> Result<u32, TinkerforgeError> {
392 let payload = [0; 0];
393
394 #[allow(unused_variables)]
395 let result = self.device.get(u8::from(Io16BrickletFunction::GetDebouncePeriod), &payload).await?;
396 Ok(u32::from_le_byte_slice(result.body()))
397 }
398
399 pub async fn set_port_interrupt(&mut self, port: char, interrupt_mask: u8) -> Result<(), TinkerforgeError> {
408 let mut payload = [0; 2];
409 port.write_to_slice(&mut payload[0..1]);
410 interrupt_mask.write_to_slice(&mut payload[1..2]);
411
412 #[allow(unused_variables)]
413 let result = self.device.set(u8::from(Io16BrickletFunction::SetPortInterrupt), &payload).await?;
414 Ok(())
415 }
416
417 pub async fn get_port_interrupt(&mut self, port: char) -> Result<u8, TinkerforgeError> {
420 let mut payload = [0; 1];
421 port.write_to_slice(&mut payload[0..1]);
422
423 #[allow(unused_variables)]
424 let result = self.device.get(u8::from(Io16BrickletFunction::GetPortInterrupt), &payload).await?;
425 Ok(u8::from_le_byte_slice(result.body()))
426 }
427
428 pub async fn set_port_monoflop(&mut self, port: char, selection_mask: u8, value_mask: u8, time: u32) -> Result<(), TinkerforgeError> {
448 let mut payload = [0; 7];
449 port.write_to_slice(&mut payload[0..1]);
450 selection_mask.write_to_slice(&mut payload[1..2]);
451 value_mask.write_to_slice(&mut payload[2..3]);
452 time.write_to_slice(&mut payload[3..7]);
453
454 #[allow(unused_variables)]
455 let result = self.device.set(u8::from(Io16BrickletFunction::SetPortMonoflop), &payload).await?;
456 Ok(())
457 }
458
459 pub async fn get_port_monoflop(&mut self, port: char, pin: u8) -> Result<PortMonoflop, TinkerforgeError> {
465 let mut payload = [0; 2];
466 port.write_to_slice(&mut payload[0..1]);
467 pin.write_to_slice(&mut payload[1..2]);
468
469 #[allow(unused_variables)]
470 let result = self.device.get(u8::from(Io16BrickletFunction::GetPortMonoflop), &payload).await?;
471 Ok(PortMonoflop::from_le_byte_slice(result.body()))
472 }
473
474 pub async fn set_selected_values(&mut self, port: char, selection_mask: u8, value_mask: u8) -> Result<(), TinkerforgeError> {
488 let mut payload = [0; 3];
489 port.write_to_slice(&mut payload[0..1]);
490 selection_mask.write_to_slice(&mut payload[1..2]);
491 value_mask.write_to_slice(&mut payload[2..3]);
492
493 #[allow(unused_variables)]
494 let result = self.device.set(u8::from(Io16BrickletFunction::SetSelectedValues), &payload).await?;
495 Ok(())
496 }
497
498 pub async fn get_edge_count(&mut self, pin: u8, reset_counter: bool) -> Result<u32, TinkerforgeError> {
507 let mut payload = [0; 2];
508 pin.write_to_slice(&mut payload[0..1]);
509 reset_counter.write_to_slice(&mut payload[1..2]);
510
511 #[allow(unused_variables)]
512 let result = self.device.get(u8::from(Io16BrickletFunction::GetEdgeCount), &payload).await?;
513 Ok(u32::from_le_byte_slice(result.body()))
514 }
515
516 pub async fn set_edge_count_config(&mut self, pin: u8, edge_type: u8, debounce: u8) -> Result<(), TinkerforgeError> {
539 let mut payload = [0; 3];
540 pin.write_to_slice(&mut payload[0..1]);
541 edge_type.write_to_slice(&mut payload[1..2]);
542 debounce.write_to_slice(&mut payload[2..3]);
543
544 #[allow(unused_variables)]
545 let result = self.device.set(u8::from(Io16BrickletFunction::SetEdgeCountConfig), &payload).await?;
546 Ok(())
547 }
548
549 pub async fn get_edge_count_config(&mut self, pin: u8) -> Result<EdgeCountConfig, TinkerforgeError> {
560 let mut payload = [0; 1];
561 pin.write_to_slice(&mut payload[0..1]);
562
563 #[allow(unused_variables)]
564 let result = self.device.get(u8::from(Io16BrickletFunction::GetEdgeCountConfig), &payload).await?;
565 Ok(EdgeCountConfig::from_le_byte_slice(result.body()))
566 }
567
568 pub async fn get_identity(&mut self) -> Result<Identity, TinkerforgeError> {
579 let payload = [0; 0];
580
581 #[allow(unused_variables)]
582 let result = self.device.get(u8::from(Io16BrickletFunction::GetIdentity), &payload).await?;
583 Ok(Identity::from_le_byte_slice(result.body()))
584 }
585}