tinkerforge_async/bindings/
solid_state_relay_v2_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 SolidStateRelayV2BrickletFunction {
24 SetState,
25 GetState,
26 SetMonoflop,
27 GetMonoflop,
28 GetSpitfpErrorCount,
29 SetBootloaderMode,
30 GetBootloaderMode,
31 SetWriteFirmwarePointer,
32 WriteFirmware,
33 SetStatusLedConfig,
34 GetStatusLedConfig,
35 GetChipTemperature,
36 Reset,
37 WriteUid,
38 ReadUid,
39 GetIdentity,
40 CallbackMonoflopDone,
41}
42impl From<SolidStateRelayV2BrickletFunction> for u8 {
43 fn from(fun: SolidStateRelayV2BrickletFunction) -> Self {
44 match fun {
45 SolidStateRelayV2BrickletFunction::SetState => 1,
46 SolidStateRelayV2BrickletFunction::GetState => 2,
47 SolidStateRelayV2BrickletFunction::SetMonoflop => 3,
48 SolidStateRelayV2BrickletFunction::GetMonoflop => 4,
49 SolidStateRelayV2BrickletFunction::GetSpitfpErrorCount => 234,
50 SolidStateRelayV2BrickletFunction::SetBootloaderMode => 235,
51 SolidStateRelayV2BrickletFunction::GetBootloaderMode => 236,
52 SolidStateRelayV2BrickletFunction::SetWriteFirmwarePointer => 237,
53 SolidStateRelayV2BrickletFunction::WriteFirmware => 238,
54 SolidStateRelayV2BrickletFunction::SetStatusLedConfig => 239,
55 SolidStateRelayV2BrickletFunction::GetStatusLedConfig => 240,
56 SolidStateRelayV2BrickletFunction::GetChipTemperature => 242,
57 SolidStateRelayV2BrickletFunction::Reset => 243,
58 SolidStateRelayV2BrickletFunction::WriteUid => 248,
59 SolidStateRelayV2BrickletFunction::ReadUid => 249,
60 SolidStateRelayV2BrickletFunction::GetIdentity => 255,
61 SolidStateRelayV2BrickletFunction::CallbackMonoflopDone => 5,
62 }
63 }
64}
65pub const SOLID_STATE_RELAY_V2_BRICKLET_BOOTLOADER_MODE_BOOTLOADER: u8 = 0;
66pub const SOLID_STATE_RELAY_V2_BRICKLET_BOOTLOADER_MODE_FIRMWARE: u8 = 1;
67pub const SOLID_STATE_RELAY_V2_BRICKLET_BOOTLOADER_MODE_BOOTLOADER_WAIT_FOR_REBOOT: u8 = 2;
68pub const SOLID_STATE_RELAY_V2_BRICKLET_BOOTLOADER_MODE_FIRMWARE_WAIT_FOR_REBOOT: u8 = 3;
69pub const SOLID_STATE_RELAY_V2_BRICKLET_BOOTLOADER_MODE_FIRMWARE_WAIT_FOR_ERASE_AND_REBOOT: u8 = 4;
70pub const SOLID_STATE_RELAY_V2_BRICKLET_BOOTLOADER_STATUS_OK: u8 = 0;
71pub const SOLID_STATE_RELAY_V2_BRICKLET_BOOTLOADER_STATUS_INVALID_MODE: u8 = 1;
72pub const SOLID_STATE_RELAY_V2_BRICKLET_BOOTLOADER_STATUS_NO_CHANGE: u8 = 2;
73pub const SOLID_STATE_RELAY_V2_BRICKLET_BOOTLOADER_STATUS_ENTRY_FUNCTION_NOT_PRESENT: u8 = 3;
74pub const SOLID_STATE_RELAY_V2_BRICKLET_BOOTLOADER_STATUS_DEVICE_IDENTIFIER_INCORRECT: u8 = 4;
75pub const SOLID_STATE_RELAY_V2_BRICKLET_BOOTLOADER_STATUS_CRC_MISMATCH: u8 = 5;
76pub const SOLID_STATE_RELAY_V2_BRICKLET_STATUS_LED_CONFIG_OFF: u8 = 0;
77pub const SOLID_STATE_RELAY_V2_BRICKLET_STATUS_LED_CONFIG_ON: u8 = 1;
78pub const SOLID_STATE_RELAY_V2_BRICKLET_STATUS_LED_CONFIG_SHOW_HEARTBEAT: u8 = 2;
79pub const SOLID_STATE_RELAY_V2_BRICKLET_STATUS_LED_CONFIG_SHOW_STATUS: u8 = 3;
80
81#[derive(Clone, Copy, Debug, Default, PartialEq, Eq, Hash)]
82pub struct Monoflop {
83 pub state: bool,
84 pub time: u32,
85 pub time_remaining: u32,
86}
87impl FromByteSlice for Monoflop {
88 fn bytes_expected() -> usize {
89 9
90 }
91 fn from_le_byte_slice(bytes: &[u8]) -> Monoflop {
92 Monoflop {
93 state: <bool>::from_le_byte_slice(&bytes[0..1]),
94 time: <u32>::from_le_byte_slice(&bytes[1..5]),
95 time_remaining: <u32>::from_le_byte_slice(&bytes[5..9]),
96 }
97 }
98}
99
100#[derive(Clone, Copy, Debug, Default, PartialEq, Eq, Hash)]
101pub struct SpitfpErrorCount {
102 pub error_count_ack_checksum: u32,
103 pub error_count_message_checksum: u32,
104 pub error_count_frame: u32,
105 pub error_count_overflow: u32,
106}
107impl FromByteSlice for SpitfpErrorCount {
108 fn bytes_expected() -> usize {
109 16
110 }
111 fn from_le_byte_slice(bytes: &[u8]) -> SpitfpErrorCount {
112 SpitfpErrorCount {
113 error_count_ack_checksum: <u32>::from_le_byte_slice(&bytes[0..4]),
114 error_count_message_checksum: <u32>::from_le_byte_slice(&bytes[4..8]),
115 error_count_frame: <u32>::from_le_byte_slice(&bytes[8..12]),
116 error_count_overflow: <u32>::from_le_byte_slice(&bytes[12..16]),
117 }
118 }
119}
120
121#[derive(Clone, Debug, Default, PartialEq, Eq, Hash)]
122pub struct Identity {
123 pub uid: String,
124 pub connected_uid: String,
125 pub position: char,
126 pub hardware_version: [u8; 3],
127 pub firmware_version: [u8; 3],
128 pub device_identifier: u16,
129}
130impl FromByteSlice for Identity {
131 fn bytes_expected() -> usize {
132 25
133 }
134 fn from_le_byte_slice(bytes: &[u8]) -> Identity {
135 Identity {
136 uid: <String>::from_le_byte_slice(&bytes[0..8]),
137 connected_uid: <String>::from_le_byte_slice(&bytes[8..16]),
138 position: <char>::from_le_byte_slice(&bytes[16..17]),
139 hardware_version: <[u8; 3]>::from_le_byte_slice(&bytes[17..20]),
140 firmware_version: <[u8; 3]>::from_le_byte_slice(&bytes[20..23]),
141 device_identifier: <u16>::from_le_byte_slice(&bytes[23..25]),
142 }
143 }
144}
145
146#[derive(Clone)]
148pub struct SolidStateRelayV2Bricklet {
149 device: Device,
150}
151impl SolidStateRelayV2Bricklet {
152 pub const DEVICE_IDENTIFIER: u16 = 296;
153 pub const DEVICE_DISPLAY_NAME: &'static str = "Solid State Relay Bricklet 2.0";
154 pub fn new(uid: Uid, connection: AsyncIpConnection) -> SolidStateRelayV2Bricklet {
156 let mut result = SolidStateRelayV2Bricklet { device: Device::new([2, 0, 10], uid, connection, Self::DEVICE_DISPLAY_NAME) };
157 result.device.response_expected[u8::from(SolidStateRelayV2BrickletFunction::SetState) as usize] = ResponseExpectedFlag::False;
158 result.device.response_expected[u8::from(SolidStateRelayV2BrickletFunction::GetState) as usize] = ResponseExpectedFlag::AlwaysTrue;
159 result.device.response_expected[u8::from(SolidStateRelayV2BrickletFunction::SetMonoflop) as usize] = ResponseExpectedFlag::False;
160 result.device.response_expected[u8::from(SolidStateRelayV2BrickletFunction::GetMonoflop) as usize] =
161 ResponseExpectedFlag::AlwaysTrue;
162 result.device.response_expected[u8::from(SolidStateRelayV2BrickletFunction::GetSpitfpErrorCount) as usize] =
163 ResponseExpectedFlag::AlwaysTrue;
164 result.device.response_expected[u8::from(SolidStateRelayV2BrickletFunction::SetBootloaderMode) as usize] =
165 ResponseExpectedFlag::AlwaysTrue;
166 result.device.response_expected[u8::from(SolidStateRelayV2BrickletFunction::GetBootloaderMode) as usize] =
167 ResponseExpectedFlag::AlwaysTrue;
168 result.device.response_expected[u8::from(SolidStateRelayV2BrickletFunction::SetWriteFirmwarePointer) as usize] =
169 ResponseExpectedFlag::False;
170 result.device.response_expected[u8::from(SolidStateRelayV2BrickletFunction::WriteFirmware) as usize] =
171 ResponseExpectedFlag::AlwaysTrue;
172 result.device.response_expected[u8::from(SolidStateRelayV2BrickletFunction::SetStatusLedConfig) as usize] =
173 ResponseExpectedFlag::False;
174 result.device.response_expected[u8::from(SolidStateRelayV2BrickletFunction::GetStatusLedConfig) as usize] =
175 ResponseExpectedFlag::AlwaysTrue;
176 result.device.response_expected[u8::from(SolidStateRelayV2BrickletFunction::GetChipTemperature) as usize] =
177 ResponseExpectedFlag::AlwaysTrue;
178 result.device.response_expected[u8::from(SolidStateRelayV2BrickletFunction::Reset) as usize] = ResponseExpectedFlag::False;
179 result.device.response_expected[u8::from(SolidStateRelayV2BrickletFunction::WriteUid) as usize] = ResponseExpectedFlag::False;
180 result.device.response_expected[u8::from(SolidStateRelayV2BrickletFunction::ReadUid) as usize] = ResponseExpectedFlag::AlwaysTrue;
181 result.device.response_expected[u8::from(SolidStateRelayV2BrickletFunction::GetIdentity) as usize] =
182 ResponseExpectedFlag::AlwaysTrue;
183 result
184 }
185
186 pub fn get_response_expected(&mut self, fun: SolidStateRelayV2BrickletFunction) -> Result<bool, GetResponseExpectedError> {
201 self.device.get_response_expected(u8::from(fun))
202 }
203
204 pub fn set_response_expected(
213 &mut self,
214 fun: SolidStateRelayV2BrickletFunction,
215 response_expected: bool,
216 ) -> Result<(), SetResponseExpectedError> {
217 self.device.set_response_expected(u8::from(fun), response_expected)
218 }
219
220 pub fn set_response_expected_all(&mut self, response_expected: bool) {
222 self.device.set_response_expected_all(response_expected)
223 }
224
225 pub fn get_api_version(&self) -> [u8; 3] {
228 self.device.api_version
229 }
230
231 pub async fn get_monoflop_done_callback_receiver(&mut self) -> impl Stream<Item = bool> {
235 self.device
236 .get_callback_receiver(u8::from(SolidStateRelayV2BrickletFunction::CallbackMonoflopDone))
237 .await
238 .map(|p| bool::from_le_byte_slice(p.body()))
239 }
240
241 pub async fn set_state(&mut self, state: bool) -> Result<(), TinkerforgeError> {
245 let mut payload = [0; 1];
246 state.write_to_slice(&mut payload[0..1]);
247
248 #[allow(unused_variables)]
249 let result = self.device.set(u8::from(SolidStateRelayV2BrickletFunction::SetState), &payload).await?;
250 Ok(())
251 }
252
253 pub async fn get_state(&mut self) -> Result<bool, TinkerforgeError> {
255 let payload = [0; 0];
256
257 #[allow(unused_variables)]
258 let result = self.device.get(u8::from(SolidStateRelayV2BrickletFunction::GetState), &payload).await?;
259 Ok(bool::from_le_byte_slice(result.body()))
260 }
261
262 pub async fn set_monoflop(&mut self, state: bool, time: u32) -> Result<(), TinkerforgeError> {
275 let mut payload = [0; 5];
276 state.write_to_slice(&mut payload[0..1]);
277 time.write_to_slice(&mut payload[1..5]);
278
279 #[allow(unused_variables)]
280 let result = self.device.set(u8::from(SolidStateRelayV2BrickletFunction::SetMonoflop), &payload).await?;
281 Ok(())
282 }
283
284 pub async fn get_monoflop(&mut self) -> Result<Monoflop, TinkerforgeError> {
290 let payload = [0; 0];
291
292 #[allow(unused_variables)]
293 let result = self.device.get(u8::from(SolidStateRelayV2BrickletFunction::GetMonoflop), &payload).await?;
294 Ok(Monoflop::from_le_byte_slice(result.body()))
295 }
296
297 pub async fn get_spitfp_error_count(&mut self) -> Result<SpitfpErrorCount, TinkerforgeError> {
309 let payload = [0; 0];
310
311 #[allow(unused_variables)]
312 let result = self.device.get(u8::from(SolidStateRelayV2BrickletFunction::GetSpitfpErrorCount), &payload).await?;
313 Ok(SpitfpErrorCount::from_le_byte_slice(result.body()))
314 }
315
316 pub async fn set_bootloader_mode(&mut self, mode: u8) -> Result<u8, TinkerforgeError> {
339 let mut payload = [0; 1];
340 mode.write_to_slice(&mut payload[0..1]);
341
342 #[allow(unused_variables)]
343 let result = self.device.get(u8::from(SolidStateRelayV2BrickletFunction::SetBootloaderMode), &payload).await?;
344 Ok(u8::from_le_byte_slice(result.body()))
345 }
346
347 pub async fn get_bootloader_mode(&mut self) -> Result<u8, TinkerforgeError> {
356 let payload = [0; 0];
357
358 #[allow(unused_variables)]
359 let result = self.device.get(u8::from(SolidStateRelayV2BrickletFunction::GetBootloaderMode), &payload).await?;
360 Ok(u8::from_le_byte_slice(result.body()))
361 }
362
363 pub async fn set_write_firmware_pointer(&mut self, pointer: u32) -> Result<(), TinkerforgeError> {
370 let mut payload = [0; 4];
371 pointer.write_to_slice(&mut payload[0..4]);
372
373 #[allow(unused_variables)]
374 let result = self.device.set(u8::from(SolidStateRelayV2BrickletFunction::SetWriteFirmwarePointer), &payload).await?;
375 Ok(())
376 }
377
378 pub async fn write_firmware(&mut self, data: &[u8; 64]) -> Result<u8, TinkerforgeError> {
387 let mut payload = [0; 64];
388 data.write_to_slice(&mut payload[0..64]);
389
390 #[allow(unused_variables)]
391 let result = self.device.get(u8::from(SolidStateRelayV2BrickletFunction::WriteFirmware), &payload).await?;
392 Ok(u8::from_le_byte_slice(result.body()))
393 }
394
395 pub async fn set_status_led_config(&mut self, config: u8) -> Result<(), TinkerforgeError> {
409 let mut payload = [0; 1];
410 config.write_to_slice(&mut payload[0..1]);
411
412 #[allow(unused_variables)]
413 let result = self.device.set(u8::from(SolidStateRelayV2BrickletFunction::SetStatusLedConfig), &payload).await?;
414 Ok(())
415 }
416
417 pub async fn get_status_led_config(&mut self) -> Result<u8, TinkerforgeError> {
425 let payload = [0; 0];
426
427 #[allow(unused_variables)]
428 let result = self.device.get(u8::from(SolidStateRelayV2BrickletFunction::GetStatusLedConfig), &payload).await?;
429 Ok(u8::from_le_byte_slice(result.body()))
430 }
431
432 pub async fn get_chip_temperature(&mut self) -> Result<i16, TinkerforgeError> {
439 let payload = [0; 0];
440
441 #[allow(unused_variables)]
442 let result = self.device.get(u8::from(SolidStateRelayV2BrickletFunction::GetChipTemperature), &payload).await?;
443 Ok(i16::from_le_byte_slice(result.body()))
444 }
445
446 pub async fn reset(&mut self) -> Result<(), TinkerforgeError> {
453 let payload = [0; 0];
454
455 #[allow(unused_variables)]
456 let result = self.device.set(u8::from(SolidStateRelayV2BrickletFunction::Reset), &payload).await?;
457 Ok(())
458 }
459
460 pub async fn write_uid(&mut self, uid: u32) -> Result<(), TinkerforgeError> {
466 let mut payload = [0; 4];
467 uid.write_to_slice(&mut payload[0..4]);
468
469 #[allow(unused_variables)]
470 let result = self.device.set(u8::from(SolidStateRelayV2BrickletFunction::WriteUid), &payload).await?;
471 Ok(())
472 }
473
474 pub async fn read_uid(&mut self) -> Result<u32, TinkerforgeError> {
477 let payload = [0; 0];
478
479 #[allow(unused_variables)]
480 let result = self.device.get(u8::from(SolidStateRelayV2BrickletFunction::ReadUid), &payload).await?;
481 Ok(u32::from_le_byte_slice(result.body()))
482 }
483
484 pub async fn get_identity(&mut self) -> Result<Identity, TinkerforgeError> {
495 let payload = [0; 0];
496
497 #[allow(unused_variables)]
498 let result = self.device.get(u8::from(SolidStateRelayV2BrickletFunction::GetIdentity), &payload).await?;
499 Ok(Identity::from_le_byte_slice(result.body()))
500 }
501}