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 Io4V2BrickletFunction {
24 SetValue,
25 GetValue,
26 SetSelectedValue,
27 SetConfiguration,
28 GetConfiguration,
29 SetInputValueCallbackConfiguration,
30 GetInputValueCallbackConfiguration,
31 SetAllInputValueCallbackConfiguration,
32 GetAllInputValueCallbackConfiguration,
33 SetMonoflop,
34 GetMonoflop,
35 GetEdgeCount,
36 SetEdgeCountConfiguration,
37 GetEdgeCountConfiguration,
38 SetPwmConfiguration,
39 GetPwmConfiguration,
40 GetSpitfpErrorCount,
41 SetBootloaderMode,
42 GetBootloaderMode,
43 SetWriteFirmwarePointer,
44 WriteFirmware,
45 SetStatusLedConfig,
46 GetStatusLedConfig,
47 GetChipTemperature,
48 Reset,
49 WriteUid,
50 ReadUid,
51 GetIdentity,
52 CallbackInputValue,
53 CallbackAllInputValue,
54 CallbackMonoflopDone,
55}
56impl From<Io4V2BrickletFunction> for u8 {
57 fn from(fun: Io4V2BrickletFunction) -> Self {
58 match fun {
59 Io4V2BrickletFunction::SetValue => 1,
60 Io4V2BrickletFunction::GetValue => 2,
61 Io4V2BrickletFunction::SetSelectedValue => 3,
62 Io4V2BrickletFunction::SetConfiguration => 4,
63 Io4V2BrickletFunction::GetConfiguration => 5,
64 Io4V2BrickletFunction::SetInputValueCallbackConfiguration => 6,
65 Io4V2BrickletFunction::GetInputValueCallbackConfiguration => 7,
66 Io4V2BrickletFunction::SetAllInputValueCallbackConfiguration => 8,
67 Io4V2BrickletFunction::GetAllInputValueCallbackConfiguration => 9,
68 Io4V2BrickletFunction::SetMonoflop => 10,
69 Io4V2BrickletFunction::GetMonoflop => 11,
70 Io4V2BrickletFunction::GetEdgeCount => 12,
71 Io4V2BrickletFunction::SetEdgeCountConfiguration => 13,
72 Io4V2BrickletFunction::GetEdgeCountConfiguration => 14,
73 Io4V2BrickletFunction::SetPwmConfiguration => 15,
74 Io4V2BrickletFunction::GetPwmConfiguration => 16,
75 Io4V2BrickletFunction::GetSpitfpErrorCount => 234,
76 Io4V2BrickletFunction::SetBootloaderMode => 235,
77 Io4V2BrickletFunction::GetBootloaderMode => 236,
78 Io4V2BrickletFunction::SetWriteFirmwarePointer => 237,
79 Io4V2BrickletFunction::WriteFirmware => 238,
80 Io4V2BrickletFunction::SetStatusLedConfig => 239,
81 Io4V2BrickletFunction::GetStatusLedConfig => 240,
82 Io4V2BrickletFunction::GetChipTemperature => 242,
83 Io4V2BrickletFunction::Reset => 243,
84 Io4V2BrickletFunction::WriteUid => 248,
85 Io4V2BrickletFunction::ReadUid => 249,
86 Io4V2BrickletFunction::GetIdentity => 255,
87 Io4V2BrickletFunction::CallbackInputValue => 17,
88 Io4V2BrickletFunction::CallbackAllInputValue => 18,
89 Io4V2BrickletFunction::CallbackMonoflopDone => 19,
90 }
91 }
92}
93pub const IO4_V2_BRICKLET_DIRECTION_IN: char = 'i';
94pub const IO4_V2_BRICKLET_DIRECTION_OUT: char = 'o';
95pub const IO4_V2_BRICKLET_EDGE_TYPE_RISING: u8 = 0;
96pub const IO4_V2_BRICKLET_EDGE_TYPE_FALLING: u8 = 1;
97pub const IO4_V2_BRICKLET_EDGE_TYPE_BOTH: u8 = 2;
98pub const IO4_V2_BRICKLET_BOOTLOADER_MODE_BOOTLOADER: u8 = 0;
99pub const IO4_V2_BRICKLET_BOOTLOADER_MODE_FIRMWARE: u8 = 1;
100pub const IO4_V2_BRICKLET_BOOTLOADER_MODE_BOOTLOADER_WAIT_FOR_REBOOT: u8 = 2;
101pub const IO4_V2_BRICKLET_BOOTLOADER_MODE_FIRMWARE_WAIT_FOR_REBOOT: u8 = 3;
102pub const IO4_V2_BRICKLET_BOOTLOADER_MODE_FIRMWARE_WAIT_FOR_ERASE_AND_REBOOT: u8 = 4;
103pub const IO4_V2_BRICKLET_BOOTLOADER_STATUS_OK: u8 = 0;
104pub const IO4_V2_BRICKLET_BOOTLOADER_STATUS_INVALID_MODE: u8 = 1;
105pub const IO4_V2_BRICKLET_BOOTLOADER_STATUS_NO_CHANGE: u8 = 2;
106pub const IO4_V2_BRICKLET_BOOTLOADER_STATUS_ENTRY_FUNCTION_NOT_PRESENT: u8 = 3;
107pub const IO4_V2_BRICKLET_BOOTLOADER_STATUS_DEVICE_IDENTIFIER_INCORRECT: u8 = 4;
108pub const IO4_V2_BRICKLET_BOOTLOADER_STATUS_CRC_MISMATCH: u8 = 5;
109pub const IO4_V2_BRICKLET_STATUS_LED_CONFIG_OFF: u8 = 0;
110pub const IO4_V2_BRICKLET_STATUS_LED_CONFIG_ON: u8 = 1;
111pub const IO4_V2_BRICKLET_STATUS_LED_CONFIG_SHOW_HEARTBEAT: u8 = 2;
112pub const IO4_V2_BRICKLET_STATUS_LED_CONFIG_SHOW_STATUS: u8 = 3;
113
114#[derive(Clone, Copy, Debug, Default, PartialEq, Eq, Hash)]
115pub struct Configuration {
116 pub direction: char,
117 pub value: bool,
118}
119impl FromByteSlice for Configuration {
120 fn bytes_expected() -> usize {
121 2
122 }
123 fn from_le_byte_slice(bytes: &[u8]) -> Configuration {
124 Configuration { direction: <char>::from_le_byte_slice(&bytes[0..1]), value: <bool>::from_le_byte_slice(&bytes[1..2]) }
125 }
126}
127
128#[derive(Clone, Copy, Debug, Default, PartialEq, Eq, Hash)]
129pub struct InputValueCallbackConfiguration {
130 pub period: u32,
131 pub value_has_to_change: bool,
132}
133impl FromByteSlice for InputValueCallbackConfiguration {
134 fn bytes_expected() -> usize {
135 5
136 }
137 fn from_le_byte_slice(bytes: &[u8]) -> InputValueCallbackConfiguration {
138 InputValueCallbackConfiguration {
139 period: <u32>::from_le_byte_slice(&bytes[0..4]),
140 value_has_to_change: <bool>::from_le_byte_slice(&bytes[4..5]),
141 }
142 }
143}
144
145#[derive(Clone, Copy, Debug, Default, PartialEq, Eq, Hash)]
146pub struct AllInputValueCallbackConfiguration {
147 pub period: u32,
148 pub value_has_to_change: bool,
149}
150impl FromByteSlice for AllInputValueCallbackConfiguration {
151 fn bytes_expected() -> usize {
152 5
153 }
154 fn from_le_byte_slice(bytes: &[u8]) -> AllInputValueCallbackConfiguration {
155 AllInputValueCallbackConfiguration {
156 period: <u32>::from_le_byte_slice(&bytes[0..4]),
157 value_has_to_change: <bool>::from_le_byte_slice(&bytes[4..5]),
158 }
159 }
160}
161
162#[derive(Clone, Copy, Debug, Default, PartialEq, Eq, Hash)]
163pub struct Monoflop {
164 pub value: bool,
165 pub time: u32,
166 pub time_remaining: u32,
167}
168impl FromByteSlice for Monoflop {
169 fn bytes_expected() -> usize {
170 9
171 }
172 fn from_le_byte_slice(bytes: &[u8]) -> Monoflop {
173 Monoflop {
174 value: <bool>::from_le_byte_slice(&bytes[0..1]),
175 time: <u32>::from_le_byte_slice(&bytes[1..5]),
176 time_remaining: <u32>::from_le_byte_slice(&bytes[5..9]),
177 }
178 }
179}
180
181#[derive(Clone, Copy, Debug, Default, PartialEq, Eq, Hash)]
182pub struct EdgeCountConfiguration {
183 pub edge_type: u8,
184 pub debounce: u8,
185}
186impl FromByteSlice for EdgeCountConfiguration {
187 fn bytes_expected() -> usize {
188 2
189 }
190 fn from_le_byte_slice(bytes: &[u8]) -> EdgeCountConfiguration {
191 EdgeCountConfiguration { edge_type: <u8>::from_le_byte_slice(&bytes[0..1]), debounce: <u8>::from_le_byte_slice(&bytes[1..2]) }
192 }
193}
194
195#[derive(Clone, Copy, Debug, Default, PartialEq, Eq, Hash)]
196pub struct PwmConfiguration {
197 pub frequency: u32,
198 pub duty_cycle: u16,
199}
200impl FromByteSlice for PwmConfiguration {
201 fn bytes_expected() -> usize {
202 6
203 }
204 fn from_le_byte_slice(bytes: &[u8]) -> PwmConfiguration {
205 PwmConfiguration { frequency: <u32>::from_le_byte_slice(&bytes[0..4]), duty_cycle: <u16>::from_le_byte_slice(&bytes[4..6]) }
206 }
207}
208
209#[derive(Clone, Copy, Debug, Default, PartialEq, Eq, Hash)]
210pub struct InputValueEvent {
211 pub channel: u8,
212 pub changed: bool,
213 pub value: bool,
214}
215impl FromByteSlice for InputValueEvent {
216 fn bytes_expected() -> usize {
217 3
218 }
219 fn from_le_byte_slice(bytes: &[u8]) -> InputValueEvent {
220 InputValueEvent {
221 channel: <u8>::from_le_byte_slice(&bytes[0..1]),
222 changed: <bool>::from_le_byte_slice(&bytes[1..2]),
223 value: <bool>::from_le_byte_slice(&bytes[2..3]),
224 }
225 }
226}
227
228#[derive(Clone, Copy, Debug, Default, PartialEq, Eq, Hash)]
229pub struct AllInputValueEvent {
230 pub changed: [bool; 4],
231 pub value: [bool; 4],
232}
233impl FromByteSlice for AllInputValueEvent {
234 fn bytes_expected() -> usize {
235 2
236 }
237 fn from_le_byte_slice(bytes: &[u8]) -> AllInputValueEvent {
238 AllInputValueEvent { changed: <[bool; 4]>::from_le_byte_slice(&bytes[0..1]), value: <[bool; 4]>::from_le_byte_slice(&bytes[1..2]) }
239 }
240}
241
242#[derive(Clone, Copy, Debug, Default, PartialEq, Eq, Hash)]
243pub struct MonoflopDoneEvent {
244 pub channel: u8,
245 pub value: bool,
246}
247impl FromByteSlice for MonoflopDoneEvent {
248 fn bytes_expected() -> usize {
249 2
250 }
251 fn from_le_byte_slice(bytes: &[u8]) -> MonoflopDoneEvent {
252 MonoflopDoneEvent { channel: <u8>::from_le_byte_slice(&bytes[0..1]), value: <bool>::from_le_byte_slice(&bytes[1..2]) }
253 }
254}
255
256#[derive(Clone, Copy, Debug, Default, PartialEq, Eq, Hash)]
257pub struct SpitfpErrorCount {
258 pub error_count_ack_checksum: u32,
259 pub error_count_message_checksum: u32,
260 pub error_count_frame: u32,
261 pub error_count_overflow: u32,
262}
263impl FromByteSlice for SpitfpErrorCount {
264 fn bytes_expected() -> usize {
265 16
266 }
267 fn from_le_byte_slice(bytes: &[u8]) -> SpitfpErrorCount {
268 SpitfpErrorCount {
269 error_count_ack_checksum: <u32>::from_le_byte_slice(&bytes[0..4]),
270 error_count_message_checksum: <u32>::from_le_byte_slice(&bytes[4..8]),
271 error_count_frame: <u32>::from_le_byte_slice(&bytes[8..12]),
272 error_count_overflow: <u32>::from_le_byte_slice(&bytes[12..16]),
273 }
274 }
275}
276
277#[derive(Clone, Debug, Default, PartialEq, Eq, Hash)]
278pub struct Identity {
279 pub uid: String,
280 pub connected_uid: String,
281 pub position: char,
282 pub hardware_version: [u8; 3],
283 pub firmware_version: [u8; 3],
284 pub device_identifier: u16,
285}
286impl FromByteSlice for Identity {
287 fn bytes_expected() -> usize {
288 25
289 }
290 fn from_le_byte_slice(bytes: &[u8]) -> Identity {
291 Identity {
292 uid: <String>::from_le_byte_slice(&bytes[0..8]),
293 connected_uid: <String>::from_le_byte_slice(&bytes[8..16]),
294 position: <char>::from_le_byte_slice(&bytes[16..17]),
295 hardware_version: <[u8; 3]>::from_le_byte_slice(&bytes[17..20]),
296 firmware_version: <[u8; 3]>::from_le_byte_slice(&bytes[20..23]),
297 device_identifier: <u16>::from_le_byte_slice(&bytes[23..25]),
298 }
299 }
300}
301
302#[derive(Clone)]
304pub struct Io4V2Bricklet {
305 device: Device,
306}
307impl Io4V2Bricklet {
308 pub const DEVICE_IDENTIFIER: u16 = 2111;
309 pub const DEVICE_DISPLAY_NAME: &'static str = "IO-4 Bricklet 2.0";
310 pub fn new(uid: Uid, connection: AsyncIpConnection) -> Io4V2Bricklet {
312 let mut result = Io4V2Bricklet { device: Device::new([2, 0, 10], uid, connection, Self::DEVICE_DISPLAY_NAME) };
313 result.device.response_expected[u8::from(Io4V2BrickletFunction::SetValue) as usize] = ResponseExpectedFlag::False;
314 result.device.response_expected[u8::from(Io4V2BrickletFunction::GetValue) as usize] = ResponseExpectedFlag::AlwaysTrue;
315 result.device.response_expected[u8::from(Io4V2BrickletFunction::SetSelectedValue) as usize] = ResponseExpectedFlag::False;
316 result.device.response_expected[u8::from(Io4V2BrickletFunction::SetConfiguration) as usize] = ResponseExpectedFlag::False;
317 result.device.response_expected[u8::from(Io4V2BrickletFunction::GetConfiguration) as usize] = ResponseExpectedFlag::AlwaysTrue;
318 result.device.response_expected[u8::from(Io4V2BrickletFunction::SetInputValueCallbackConfiguration) as usize] =
319 ResponseExpectedFlag::True;
320 result.device.response_expected[u8::from(Io4V2BrickletFunction::GetInputValueCallbackConfiguration) as usize] =
321 ResponseExpectedFlag::AlwaysTrue;
322 result.device.response_expected[u8::from(Io4V2BrickletFunction::SetAllInputValueCallbackConfiguration) as usize] =
323 ResponseExpectedFlag::True;
324 result.device.response_expected[u8::from(Io4V2BrickletFunction::GetAllInputValueCallbackConfiguration) as usize] =
325 ResponseExpectedFlag::AlwaysTrue;
326 result.device.response_expected[u8::from(Io4V2BrickletFunction::SetMonoflop) as usize] = ResponseExpectedFlag::False;
327 result.device.response_expected[u8::from(Io4V2BrickletFunction::GetMonoflop) as usize] = ResponseExpectedFlag::AlwaysTrue;
328 result.device.response_expected[u8::from(Io4V2BrickletFunction::GetEdgeCount) as usize] = ResponseExpectedFlag::AlwaysTrue;
329 result.device.response_expected[u8::from(Io4V2BrickletFunction::SetEdgeCountConfiguration) as usize] = ResponseExpectedFlag::False;
330 result.device.response_expected[u8::from(Io4V2BrickletFunction::GetEdgeCountConfiguration) as usize] =
331 ResponseExpectedFlag::AlwaysTrue;
332 result.device.response_expected[u8::from(Io4V2BrickletFunction::SetPwmConfiguration) as usize] = ResponseExpectedFlag::False;
333 result.device.response_expected[u8::from(Io4V2BrickletFunction::GetPwmConfiguration) as usize] = ResponseExpectedFlag::AlwaysTrue;
334 result.device.response_expected[u8::from(Io4V2BrickletFunction::GetSpitfpErrorCount) as usize] = ResponseExpectedFlag::AlwaysTrue;
335 result.device.response_expected[u8::from(Io4V2BrickletFunction::SetBootloaderMode) as usize] = ResponseExpectedFlag::AlwaysTrue;
336 result.device.response_expected[u8::from(Io4V2BrickletFunction::GetBootloaderMode) as usize] = ResponseExpectedFlag::AlwaysTrue;
337 result.device.response_expected[u8::from(Io4V2BrickletFunction::SetWriteFirmwarePointer) as usize] = ResponseExpectedFlag::False;
338 result.device.response_expected[u8::from(Io4V2BrickletFunction::WriteFirmware) as usize] = ResponseExpectedFlag::AlwaysTrue;
339 result.device.response_expected[u8::from(Io4V2BrickletFunction::SetStatusLedConfig) as usize] = ResponseExpectedFlag::False;
340 result.device.response_expected[u8::from(Io4V2BrickletFunction::GetStatusLedConfig) as usize] = ResponseExpectedFlag::AlwaysTrue;
341 result.device.response_expected[u8::from(Io4V2BrickletFunction::GetChipTemperature) as usize] = ResponseExpectedFlag::AlwaysTrue;
342 result.device.response_expected[u8::from(Io4V2BrickletFunction::Reset) as usize] = ResponseExpectedFlag::False;
343 result.device.response_expected[u8::from(Io4V2BrickletFunction::WriteUid) as usize] = ResponseExpectedFlag::False;
344 result.device.response_expected[u8::from(Io4V2BrickletFunction::ReadUid) as usize] = ResponseExpectedFlag::AlwaysTrue;
345 result.device.response_expected[u8::from(Io4V2BrickletFunction::GetIdentity) as usize] = ResponseExpectedFlag::AlwaysTrue;
346 result
347 }
348
349 pub fn get_response_expected(&mut self, fun: Io4V2BrickletFunction) -> Result<bool, GetResponseExpectedError> {
364 self.device.get_response_expected(u8::from(fun))
365 }
366
367 pub fn set_response_expected(&mut self, fun: Io4V2BrickletFunction, response_expected: bool) -> Result<(), SetResponseExpectedError> {
376 self.device.set_response_expected(u8::from(fun), response_expected)
377 }
378
379 pub fn set_response_expected_all(&mut self, response_expected: bool) {
381 self.device.set_response_expected_all(response_expected)
382 }
383
384 pub fn get_api_version(&self) -> [u8; 3] {
387 self.device.api_version
388 }
389
390 pub async fn get_input_value_callback_receiver(&mut self) -> impl Stream<Item = InputValueEvent> {
399 self.device
400 .get_callback_receiver(u8::from(Io4V2BrickletFunction::CallbackInputValue))
401 .await
402 .map(|p| InputValueEvent::from_le_byte_slice(p.body()))
403 }
404
405 pub async fn get_all_input_value_callback_receiver(&mut self) -> impl Stream<Item = AllInputValueEvent> {
412 self.device
413 .get_callback_receiver(u8::from(Io4V2BrickletFunction::CallbackAllInputValue))
414 .await
415 .map(|p| AllInputValueEvent::from_le_byte_slice(p.body()))
416 }
417
418 pub async fn get_monoflop_done_callback_receiver(&mut self) -> impl Stream<Item = MonoflopDoneEvent> {
422 self.device
423 .get_callback_receiver(u8::from(Io4V2BrickletFunction::CallbackMonoflopDone))
424 .await
425 .map(|p| MonoflopDoneEvent::from_le_byte_slice(p.body()))
426 }
427
428 pub async fn set_value(&mut self, value: &[bool; 4]) -> Result<(), TinkerforgeError> {
442 let mut payload = [0; 1];
443 value.write_to_slice(&mut payload[0..1]);
444
445 #[allow(unused_variables)]
446 let result = self.device.set(u8::from(Io4V2BrickletFunction::SetValue), &payload).await?;
447 Ok(())
448 }
449
450 pub async fn get_value(&mut self) -> Result<Box<[bool; 4]>, TinkerforgeError> {
454 let payload = [0; 0];
455
456 #[allow(unused_variables)]
457 let result = self.device.get(u8::from(Io4V2BrickletFunction::GetValue), &payload).await?;
458 Ok(Box::<[bool; 4]>::from_le_byte_slice(result.body()))
459 }
460
461 pub async fn set_selected_value(&mut self, channel: u8, value: bool) -> Result<(), TinkerforgeError> {
470 let mut payload = [0; 2];
471 channel.write_to_slice(&mut payload[0..1]);
472 value.write_to_slice(&mut payload[1..2]);
473
474 #[allow(unused_variables)]
475 let result = self.device.set(u8::from(Io4V2BrickletFunction::SetSelectedValue), &payload).await?;
476 Ok(())
477 }
478
479 pub async fn set_configuration(&mut self, channel: u8, direction: char, value: bool) -> Result<(), TinkerforgeError> {
502 let mut payload = [0; 3];
503 channel.write_to_slice(&mut payload[0..1]);
504 direction.write_to_slice(&mut payload[1..2]);
505 value.write_to_slice(&mut payload[2..3]);
506
507 #[allow(unused_variables)]
508 let result = self.device.set(u8::from(Io4V2BrickletFunction::SetConfiguration), &payload).await?;
509 Ok(())
510 }
511
512 pub async fn get_configuration(&mut self, channel: u8) -> Result<Configuration, TinkerforgeError> {
518 let mut payload = [0; 1];
519 channel.write_to_slice(&mut payload[0..1]);
520
521 #[allow(unused_variables)]
522 let result = self.device.get(u8::from(Io4V2BrickletFunction::GetConfiguration), &payload).await?;
523 Ok(Configuration::from_le_byte_slice(result.body()))
524 }
525
526 pub async fn set_input_value_callback_configuration(
538 &mut self,
539 channel: u8,
540 period: u32,
541 value_has_to_change: bool,
542 ) -> Result<(), TinkerforgeError> {
543 let mut payload = [0; 6];
544 channel.write_to_slice(&mut payload[0..1]);
545 period.write_to_slice(&mut payload[1..5]);
546 value_has_to_change.write_to_slice(&mut payload[5..6]);
547
548 #[allow(unused_variables)]
549 let result = self.device.set(u8::from(Io4V2BrickletFunction::SetInputValueCallbackConfiguration), &payload).await?;
550 Ok(())
551 }
552
553 pub async fn get_input_value_callback_configuration(
556 &mut self,
557 channel: u8,
558 ) -> Result<InputValueCallbackConfiguration, TinkerforgeError> {
559 let mut payload = [0; 1];
560 channel.write_to_slice(&mut payload[0..1]);
561
562 #[allow(unused_variables)]
563 let result = self.device.get(u8::from(Io4V2BrickletFunction::GetInputValueCallbackConfiguration), &payload).await?;
564 Ok(InputValueCallbackConfiguration::from_le_byte_slice(result.body()))
565 }
566
567 pub async fn set_all_input_value_callback_configuration(
577 &mut self,
578 period: u32,
579 value_has_to_change: bool,
580 ) -> Result<(), TinkerforgeError> {
581 let mut payload = [0; 5];
582 period.write_to_slice(&mut payload[0..4]);
583 value_has_to_change.write_to_slice(&mut payload[4..5]);
584
585 #[allow(unused_variables)]
586 let result = self.device.set(u8::from(Io4V2BrickletFunction::SetAllInputValueCallbackConfiguration), &payload).await?;
587 Ok(())
588 }
589
590 pub async fn get_all_input_value_callback_configuration(&mut self) -> Result<AllInputValueCallbackConfiguration, TinkerforgeError> {
593 let payload = [0; 0];
594
595 #[allow(unused_variables)]
596 let result = self.device.get(u8::from(Io4V2BrickletFunction::GetAllInputValueCallbackConfiguration), &payload).await?;
597 Ok(AllInputValueCallbackConfiguration::from_le_byte_slice(result.body()))
598 }
599
600 pub async fn set_monoflop(&mut self, channel: u8, value: bool, time: u32) -> Result<(), TinkerforgeError> {
615 let mut payload = [0; 6];
616 channel.write_to_slice(&mut payload[0..1]);
617 value.write_to_slice(&mut payload[1..2]);
618 time.write_to_slice(&mut payload[2..6]);
619
620 #[allow(unused_variables)]
621 let result = self.device.set(u8::from(Io4V2BrickletFunction::SetMonoflop), &payload).await?;
622 Ok(())
623 }
624
625 pub async fn get_monoflop(&mut self, channel: u8) -> Result<Monoflop, TinkerforgeError> {
631 let mut payload = [0; 1];
632 channel.write_to_slice(&mut payload[0..1]);
633
634 #[allow(unused_variables)]
635 let result = self.device.get(u8::from(Io4V2BrickletFunction::GetMonoflop), &payload).await?;
636 Ok(Monoflop::from_le_byte_slice(result.body()))
637 }
638
639 pub async fn get_edge_count(&mut self, channel: u8, reset_counter: bool) -> Result<u32, TinkerforgeError> {
648 let mut payload = [0; 2];
649 channel.write_to_slice(&mut payload[0..1]);
650 reset_counter.write_to_slice(&mut payload[1..2]);
651
652 #[allow(unused_variables)]
653 let result = self.device.get(u8::from(Io4V2BrickletFunction::GetEdgeCount), &payload).await?;
654 Ok(u32::from_le_byte_slice(result.body()))
655 }
656
657 pub async fn set_edge_count_configuration(&mut self, channel: u8, edge_type: u8, debounce: u8) -> Result<(), TinkerforgeError> {
679 let mut payload = [0; 3];
680 channel.write_to_slice(&mut payload[0..1]);
681 edge_type.write_to_slice(&mut payload[1..2]);
682 debounce.write_to_slice(&mut payload[2..3]);
683
684 #[allow(unused_variables)]
685 let result = self.device.set(u8::from(Io4V2BrickletFunction::SetEdgeCountConfiguration), &payload).await?;
686 Ok(())
687 }
688
689 pub async fn get_edge_count_configuration(&mut self, channel: u8) -> Result<EdgeCountConfiguration, TinkerforgeError> {
700 let mut payload = [0; 1];
701 channel.write_to_slice(&mut payload[0..1]);
702
703 #[allow(unused_variables)]
704 let result = self.device.get(u8::from(Io4V2BrickletFunction::GetEdgeCountConfiguration), &payload).await?;
705 Ok(EdgeCountConfiguration::from_le_byte_slice(result.body()))
706 }
707
708 pub async fn set_pwm_configuration(&mut self, channel: u8, frequency: u32, duty_cycle: u16) -> Result<(), TinkerforgeError> {
717 let mut payload = [0; 7];
718 channel.write_to_slice(&mut payload[0..1]);
719 frequency.write_to_slice(&mut payload[1..5]);
720 duty_cycle.write_to_slice(&mut payload[5..7]);
721
722 #[allow(unused_variables)]
723 let result = self.device.set(u8::from(Io4V2BrickletFunction::SetPwmConfiguration), &payload).await?;
724 Ok(())
725 }
726
727 pub async fn get_pwm_configuration(&mut self, channel: u8) -> Result<PwmConfiguration, TinkerforgeError> {
729 let mut payload = [0; 1];
730 channel.write_to_slice(&mut payload[0..1]);
731
732 #[allow(unused_variables)]
733 let result = self.device.get(u8::from(Io4V2BrickletFunction::GetPwmConfiguration), &payload).await?;
734 Ok(PwmConfiguration::from_le_byte_slice(result.body()))
735 }
736
737 pub async fn get_spitfp_error_count(&mut self) -> Result<SpitfpErrorCount, TinkerforgeError> {
749 let payload = [0; 0];
750
751 #[allow(unused_variables)]
752 let result = self.device.get(u8::from(Io4V2BrickletFunction::GetSpitfpErrorCount), &payload).await?;
753 Ok(SpitfpErrorCount::from_le_byte_slice(result.body()))
754 }
755
756 pub async fn set_bootloader_mode(&mut self, mode: u8) -> Result<u8, TinkerforgeError> {
779 let mut payload = [0; 1];
780 mode.write_to_slice(&mut payload[0..1]);
781
782 #[allow(unused_variables)]
783 let result = self.device.get(u8::from(Io4V2BrickletFunction::SetBootloaderMode), &payload).await?;
784 Ok(u8::from_le_byte_slice(result.body()))
785 }
786
787 pub async fn get_bootloader_mode(&mut self) -> Result<u8, TinkerforgeError> {
796 let payload = [0; 0];
797
798 #[allow(unused_variables)]
799 let result = self.device.get(u8::from(Io4V2BrickletFunction::GetBootloaderMode), &payload).await?;
800 Ok(u8::from_le_byte_slice(result.body()))
801 }
802
803 pub async fn set_write_firmware_pointer(&mut self, pointer: u32) -> Result<(), TinkerforgeError> {
810 let mut payload = [0; 4];
811 pointer.write_to_slice(&mut payload[0..4]);
812
813 #[allow(unused_variables)]
814 let result = self.device.set(u8::from(Io4V2BrickletFunction::SetWriteFirmwarePointer), &payload).await?;
815 Ok(())
816 }
817
818 pub async fn write_firmware(&mut self, data: &[u8; 64]) -> Result<u8, TinkerforgeError> {
827 let mut payload = [0; 64];
828 data.write_to_slice(&mut payload[0..64]);
829
830 #[allow(unused_variables)]
831 let result = self.device.get(u8::from(Io4V2BrickletFunction::WriteFirmware), &payload).await?;
832 Ok(u8::from_le_byte_slice(result.body()))
833 }
834
835 pub async fn set_status_led_config(&mut self, config: u8) -> Result<(), TinkerforgeError> {
849 let mut payload = [0; 1];
850 config.write_to_slice(&mut payload[0..1]);
851
852 #[allow(unused_variables)]
853 let result = self.device.set(u8::from(Io4V2BrickletFunction::SetStatusLedConfig), &payload).await?;
854 Ok(())
855 }
856
857 pub async fn get_status_led_config(&mut self) -> Result<u8, TinkerforgeError> {
865 let payload = [0; 0];
866
867 #[allow(unused_variables)]
868 let result = self.device.get(u8::from(Io4V2BrickletFunction::GetStatusLedConfig), &payload).await?;
869 Ok(u8::from_le_byte_slice(result.body()))
870 }
871
872 pub async fn get_chip_temperature(&mut self) -> Result<i16, TinkerforgeError> {
879 let payload = [0; 0];
880
881 #[allow(unused_variables)]
882 let result = self.device.get(u8::from(Io4V2BrickletFunction::GetChipTemperature), &payload).await?;
883 Ok(i16::from_le_byte_slice(result.body()))
884 }
885
886 pub async fn reset(&mut self) -> Result<(), TinkerforgeError> {
893 let payload = [0; 0];
894
895 #[allow(unused_variables)]
896 let result = self.device.set(u8::from(Io4V2BrickletFunction::Reset), &payload).await?;
897 Ok(())
898 }
899
900 pub async fn write_uid(&mut self, uid: u32) -> Result<(), TinkerforgeError> {
906 let mut payload = [0; 4];
907 uid.write_to_slice(&mut payload[0..4]);
908
909 #[allow(unused_variables)]
910 let result = self.device.set(u8::from(Io4V2BrickletFunction::WriteUid), &payload).await?;
911 Ok(())
912 }
913
914 pub async fn read_uid(&mut self) -> Result<u32, TinkerforgeError> {
917 let payload = [0; 0];
918
919 #[allow(unused_variables)]
920 let result = self.device.get(u8::from(Io4V2BrickletFunction::ReadUid), &payload).await?;
921 Ok(u32::from_le_byte_slice(result.body()))
922 }
923
924 pub async fn get_identity(&mut self) -> Result<Identity, TinkerforgeError> {
935 let payload = [0; 0];
936
937 #[allow(unused_variables)]
938 let result = self.device.get(u8::from(Io4V2BrickletFunction::GetIdentity), &payload).await?;
939 Ok(Identity::from_le_byte_slice(result.body()))
940 }
941}