tinkerforge_async/bindings/
dual_relay_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 DualRelayBrickletFunction {
24 SetState,
25 GetState,
26 SetMonoflop,
27 GetMonoflop,
28 SetSelectedState,
29 GetIdentity,
30 CallbackMonoflopDone,
31}
32impl From<DualRelayBrickletFunction> for u8 {
33 fn from(fun: DualRelayBrickletFunction) -> Self {
34 match fun {
35 DualRelayBrickletFunction::SetState => 1,
36 DualRelayBrickletFunction::GetState => 2,
37 DualRelayBrickletFunction::SetMonoflop => 3,
38 DualRelayBrickletFunction::GetMonoflop => 4,
39 DualRelayBrickletFunction::SetSelectedState => 6,
40 DualRelayBrickletFunction::GetIdentity => 255,
41 DualRelayBrickletFunction::CallbackMonoflopDone => 5,
42 }
43 }
44}
45
46#[derive(Clone, Copy, Debug, Default, PartialEq, Eq, Hash)]
47pub struct State {
48 pub relay1: bool,
49 pub relay2: bool,
50}
51impl FromByteSlice for State {
52 fn bytes_expected() -> usize {
53 2
54 }
55 fn from_le_byte_slice(bytes: &[u8]) -> State {
56 State { relay1: <bool>::from_le_byte_slice(&bytes[0..1]), relay2: <bool>::from_le_byte_slice(&bytes[1..2]) }
57 }
58}
59
60#[derive(Clone, Copy, Debug, Default, PartialEq, Eq, Hash)]
61pub struct Monoflop {
62 pub state: bool,
63 pub time: u32,
64 pub time_remaining: u32,
65}
66impl FromByteSlice for Monoflop {
67 fn bytes_expected() -> usize {
68 9
69 }
70 fn from_le_byte_slice(bytes: &[u8]) -> Monoflop {
71 Monoflop {
72 state: <bool>::from_le_byte_slice(&bytes[0..1]),
73 time: <u32>::from_le_byte_slice(&bytes[1..5]),
74 time_remaining: <u32>::from_le_byte_slice(&bytes[5..9]),
75 }
76 }
77}
78
79#[derive(Clone, Copy, Debug, Default, PartialEq, Eq, Hash)]
80pub struct MonoflopDoneEvent {
81 pub relay: u8,
82 pub state: bool,
83}
84impl FromByteSlice for MonoflopDoneEvent {
85 fn bytes_expected() -> usize {
86 2
87 }
88 fn from_le_byte_slice(bytes: &[u8]) -> MonoflopDoneEvent {
89 MonoflopDoneEvent { relay: <u8>::from_le_byte_slice(&bytes[0..1]), state: <bool>::from_le_byte_slice(&bytes[1..2]) }
90 }
91}
92
93#[derive(Clone, Debug, Default, PartialEq, Eq, Hash)]
94pub struct Identity {
95 pub uid: String,
96 pub connected_uid: String,
97 pub position: char,
98 pub hardware_version: [u8; 3],
99 pub firmware_version: [u8; 3],
100 pub device_identifier: u16,
101}
102impl FromByteSlice for Identity {
103 fn bytes_expected() -> usize {
104 25
105 }
106 fn from_le_byte_slice(bytes: &[u8]) -> Identity {
107 Identity {
108 uid: <String>::from_le_byte_slice(&bytes[0..8]),
109 connected_uid: <String>::from_le_byte_slice(&bytes[8..16]),
110 position: <char>::from_le_byte_slice(&bytes[16..17]),
111 hardware_version: <[u8; 3]>::from_le_byte_slice(&bytes[17..20]),
112 firmware_version: <[u8; 3]>::from_le_byte_slice(&bytes[20..23]),
113 device_identifier: <u16>::from_le_byte_slice(&bytes[23..25]),
114 }
115 }
116}
117
118#[derive(Clone)]
120pub struct DualRelayBricklet {
121 device: Device,
122}
123impl DualRelayBricklet {
124 pub const DEVICE_IDENTIFIER: u16 = 26;
125 pub const DEVICE_DISPLAY_NAME: &'static str = "Dual Relay Bricklet";
126 pub fn new(uid: Uid, connection: AsyncIpConnection) -> DualRelayBricklet {
128 let mut result = DualRelayBricklet { device: Device::new([2, 0, 10], uid, connection, Self::DEVICE_DISPLAY_NAME) };
129 result.device.response_expected[u8::from(DualRelayBrickletFunction::SetState) as usize] = ResponseExpectedFlag::False;
130 result.device.response_expected[u8::from(DualRelayBrickletFunction::GetState) as usize] = ResponseExpectedFlag::AlwaysTrue;
131 result.device.response_expected[u8::from(DualRelayBrickletFunction::SetMonoflop) as usize] = ResponseExpectedFlag::False;
132 result.device.response_expected[u8::from(DualRelayBrickletFunction::GetMonoflop) as usize] = ResponseExpectedFlag::AlwaysTrue;
133 result.device.response_expected[u8::from(DualRelayBrickletFunction::SetSelectedState) as usize] = ResponseExpectedFlag::False;
134 result.device.response_expected[u8::from(DualRelayBrickletFunction::GetIdentity) as usize] = ResponseExpectedFlag::AlwaysTrue;
135 result
136 }
137
138 pub fn get_response_expected(&mut self, fun: DualRelayBrickletFunction) -> Result<bool, GetResponseExpectedError> {
153 self.device.get_response_expected(u8::from(fun))
154 }
155
156 pub fn set_response_expected(
165 &mut self,
166 fun: DualRelayBrickletFunction,
167 response_expected: bool,
168 ) -> Result<(), SetResponseExpectedError> {
169 self.device.set_response_expected(u8::from(fun), response_expected)
170 }
171
172 pub fn set_response_expected_all(&mut self, response_expected: bool) {
174 self.device.set_response_expected_all(response_expected)
175 }
176
177 pub fn get_api_version(&self) -> [u8; 3] {
180 self.device.api_version
181 }
182
183 pub async fn get_monoflop_done_callback_receiver(&mut self) -> impl Stream<Item = MonoflopDoneEvent> {
187 self.device
188 .get_callback_receiver(u8::from(DualRelayBrickletFunction::CallbackMonoflopDone))
189 .await
190 .map(|p| MonoflopDoneEvent::from_le_byte_slice(p.body()))
191 }
192
193 pub async fn set_state(&mut self, relay1: bool, relay2: bool) -> Result<(), TinkerforgeError> {
202 let mut payload = [0; 2];
203 relay1.write_to_slice(&mut payload[0..1]);
204 relay2.write_to_slice(&mut payload[1..2]);
205
206 #[allow(unused_variables)]
207 let result = self.device.set(u8::from(DualRelayBrickletFunction::SetState), &payload).await?;
208 Ok(())
209 }
210
211 pub async fn get_state(&mut self) -> Result<State, TinkerforgeError> {
213 let payload = [0; 0];
214
215 #[allow(unused_variables)]
216 let result = self.device.get(u8::from(DualRelayBrickletFunction::GetState), &payload).await?;
217 Ok(State::from_le_byte_slice(result.body()))
218 }
219
220 pub async fn set_monoflop(&mut self, relay: u8, state: bool, time: u32) -> Result<(), TinkerforgeError> {
234 let mut payload = [0; 6];
235 relay.write_to_slice(&mut payload[0..1]);
236 state.write_to_slice(&mut payload[1..2]);
237 time.write_to_slice(&mut payload[2..6]);
238
239 #[allow(unused_variables)]
240 let result = self.device.set(u8::from(DualRelayBrickletFunction::SetMonoflop), &payload).await?;
241 Ok(())
242 }
243
244 pub async fn get_monoflop(&mut self, relay: u8) -> Result<Monoflop, TinkerforgeError> {
250 let mut payload = [0; 1];
251 relay.write_to_slice(&mut payload[0..1]);
252
253 #[allow(unused_variables)]
254 let result = self.device.get(u8::from(DualRelayBrickletFunction::GetMonoflop), &payload).await?;
255 Ok(Monoflop::from_le_byte_slice(result.body()))
256 }
257
258 pub async fn set_selected_state(&mut self, relay: u8, state: bool) -> Result<(), TinkerforgeError> {
264 let mut payload = [0; 2];
265 relay.write_to_slice(&mut payload[0..1]);
266 state.write_to_slice(&mut payload[1..2]);
267
268 #[allow(unused_variables)]
269 let result = self.device.set(u8::from(DualRelayBrickletFunction::SetSelectedState), &payload).await?;
270 Ok(())
271 }
272
273 pub async fn get_identity(&mut self) -> Result<Identity, TinkerforgeError> {
284 let payload = [0; 0];
285
286 #[allow(unused_variables)]
287 let result = self.device.get(u8::from(DualRelayBrickletFunction::GetIdentity), &payload).await?;
288 Ok(Identity::from_le_byte_slice(result.body()))
289 }
290}