1use crate::{
15 byte_converter::*, converting_callback_receiver::ConvertingCallbackReceiver, converting_receiver::ConvertingReceiver, device::*,
16 ip_connection::GetRequestSender,
17};
18pub enum AnalogInV2BrickletFunction {
19 GetVoltage,
20 GetAnalogValue,
21 SetVoltageCallbackPeriod,
22 GetVoltageCallbackPeriod,
23 SetAnalogValueCallbackPeriod,
24 GetAnalogValueCallbackPeriod,
25 SetVoltageCallbackThreshold,
26 GetVoltageCallbackThreshold,
27 SetAnalogValueCallbackThreshold,
28 GetAnalogValueCallbackThreshold,
29 SetDebouncePeriod,
30 GetDebouncePeriod,
31 SetMovingAverage,
32 GetMovingAverage,
33 GetIdentity,
34 CallbackVoltage,
35 CallbackAnalogValue,
36 CallbackVoltageReached,
37 CallbackAnalogValueReached,
38}
39impl From<AnalogInV2BrickletFunction> for u8 {
40 fn from(fun: AnalogInV2BrickletFunction) -> Self {
41 match fun {
42 AnalogInV2BrickletFunction::GetVoltage => 1,
43 AnalogInV2BrickletFunction::GetAnalogValue => 2,
44 AnalogInV2BrickletFunction::SetVoltageCallbackPeriod => 3,
45 AnalogInV2BrickletFunction::GetVoltageCallbackPeriod => 4,
46 AnalogInV2BrickletFunction::SetAnalogValueCallbackPeriod => 5,
47 AnalogInV2BrickletFunction::GetAnalogValueCallbackPeriod => 6,
48 AnalogInV2BrickletFunction::SetVoltageCallbackThreshold => 7,
49 AnalogInV2BrickletFunction::GetVoltageCallbackThreshold => 8,
50 AnalogInV2BrickletFunction::SetAnalogValueCallbackThreshold => 9,
51 AnalogInV2BrickletFunction::GetAnalogValueCallbackThreshold => 10,
52 AnalogInV2BrickletFunction::SetDebouncePeriod => 11,
53 AnalogInV2BrickletFunction::GetDebouncePeriod => 12,
54 AnalogInV2BrickletFunction::SetMovingAverage => 13,
55 AnalogInV2BrickletFunction::GetMovingAverage => 14,
56 AnalogInV2BrickletFunction::GetIdentity => 255,
57 AnalogInV2BrickletFunction::CallbackVoltage => 15,
58 AnalogInV2BrickletFunction::CallbackAnalogValue => 16,
59 AnalogInV2BrickletFunction::CallbackVoltageReached => 17,
60 AnalogInV2BrickletFunction::CallbackAnalogValueReached => 18,
61 }
62 }
63}
64pub const ANALOG_IN_V2_BRICKLET_THRESHOLD_OPTION_OFF: char = 'x';
65pub const ANALOG_IN_V2_BRICKLET_THRESHOLD_OPTION_OUTSIDE: char = 'o';
66pub const ANALOG_IN_V2_BRICKLET_THRESHOLD_OPTION_INSIDE: char = 'i';
67pub const ANALOG_IN_V2_BRICKLET_THRESHOLD_OPTION_SMALLER: char = '<';
68pub const ANALOG_IN_V2_BRICKLET_THRESHOLD_OPTION_GREATER: char = '>';
69
70#[derive(Clone, Copy, Debug, Default, PartialEq, Eq, Hash)]
71pub struct VoltageCallbackThreshold {
72 pub option: char,
73 pub min: u16,
74 pub max: u16,
75}
76impl FromByteSlice for VoltageCallbackThreshold {
77 fn bytes_expected() -> usize { 5 }
78 fn from_le_byte_slice(bytes: &[u8]) -> VoltageCallbackThreshold {
79 VoltageCallbackThreshold {
80 option: <char>::from_le_byte_slice(&bytes[0..1]),
81 min: <u16>::from_le_byte_slice(&bytes[1..3]),
82 max: <u16>::from_le_byte_slice(&bytes[3..5]),
83 }
84 }
85}
86
87#[derive(Clone, Copy, Debug, Default, PartialEq, Eq, Hash)]
88pub struct AnalogValueCallbackThreshold {
89 pub option: char,
90 pub min: u16,
91 pub max: u16,
92}
93impl FromByteSlice for AnalogValueCallbackThreshold {
94 fn bytes_expected() -> usize { 5 }
95 fn from_le_byte_slice(bytes: &[u8]) -> AnalogValueCallbackThreshold {
96 AnalogValueCallbackThreshold {
97 option: <char>::from_le_byte_slice(&bytes[0..1]),
98 min: <u16>::from_le_byte_slice(&bytes[1..3]),
99 max: <u16>::from_le_byte_slice(&bytes[3..5]),
100 }
101 }
102}
103
104#[derive(Clone, Debug, Default, PartialEq, Eq, Hash)]
105pub struct Identity {
106 pub uid: String,
107 pub connected_uid: String,
108 pub position: char,
109 pub hardware_version: [u8; 3],
110 pub firmware_version: [u8; 3],
111 pub device_identifier: u16,
112}
113impl FromByteSlice for Identity {
114 fn bytes_expected() -> usize { 25 }
115 fn from_le_byte_slice(bytes: &[u8]) -> Identity {
116 Identity {
117 uid: <String>::from_le_byte_slice(&bytes[0..8]),
118 connected_uid: <String>::from_le_byte_slice(&bytes[8..16]),
119 position: <char>::from_le_byte_slice(&bytes[16..17]),
120 hardware_version: <[u8; 3]>::from_le_byte_slice(&bytes[17..20]),
121 firmware_version: <[u8; 3]>::from_le_byte_slice(&bytes[20..23]),
122 device_identifier: <u16>::from_le_byte_slice(&bytes[23..25]),
123 }
124 }
125}
126
127#[derive(Clone)]
129pub struct AnalogInV2Bricklet {
130 device: Device,
131}
132impl AnalogInV2Bricklet {
133 pub const DEVICE_IDENTIFIER: u16 = 251;
134 pub const DEVICE_DISPLAY_NAME: &'static str = "Analog In Bricklet 2.0";
135 pub fn new<T: GetRequestSender>(uid: &str, req_sender: T) -> AnalogInV2Bricklet {
137 let mut result = AnalogInV2Bricklet { device: Device::new([2, 0, 1], uid, req_sender, 0) };
138 result.device.response_expected[u8::from(AnalogInV2BrickletFunction::GetVoltage) as usize] = ResponseExpectedFlag::AlwaysTrue;
139 result.device.response_expected[u8::from(AnalogInV2BrickletFunction::GetAnalogValue) as usize] = ResponseExpectedFlag::AlwaysTrue;
140 result.device.response_expected[u8::from(AnalogInV2BrickletFunction::SetVoltageCallbackPeriod) as usize] =
141 ResponseExpectedFlag::True;
142 result.device.response_expected[u8::from(AnalogInV2BrickletFunction::GetVoltageCallbackPeriod) as usize] =
143 ResponseExpectedFlag::AlwaysTrue;
144 result.device.response_expected[u8::from(AnalogInV2BrickletFunction::SetAnalogValueCallbackPeriod) as usize] =
145 ResponseExpectedFlag::True;
146 result.device.response_expected[u8::from(AnalogInV2BrickletFunction::GetAnalogValueCallbackPeriod) as usize] =
147 ResponseExpectedFlag::AlwaysTrue;
148 result.device.response_expected[u8::from(AnalogInV2BrickletFunction::SetVoltageCallbackThreshold) as usize] =
149 ResponseExpectedFlag::True;
150 result.device.response_expected[u8::from(AnalogInV2BrickletFunction::GetVoltageCallbackThreshold) as usize] =
151 ResponseExpectedFlag::AlwaysTrue;
152 result.device.response_expected[u8::from(AnalogInV2BrickletFunction::SetAnalogValueCallbackThreshold) as usize] =
153 ResponseExpectedFlag::True;
154 result.device.response_expected[u8::from(AnalogInV2BrickletFunction::GetAnalogValueCallbackThreshold) as usize] =
155 ResponseExpectedFlag::AlwaysTrue;
156 result.device.response_expected[u8::from(AnalogInV2BrickletFunction::SetDebouncePeriod) as usize] = ResponseExpectedFlag::True;
157 result.device.response_expected[u8::from(AnalogInV2BrickletFunction::GetDebouncePeriod) as usize] =
158 ResponseExpectedFlag::AlwaysTrue;
159 result.device.response_expected[u8::from(AnalogInV2BrickletFunction::SetMovingAverage) as usize] = ResponseExpectedFlag::False;
160 result.device.response_expected[u8::from(AnalogInV2BrickletFunction::GetMovingAverage) as usize] = ResponseExpectedFlag::AlwaysTrue;
161 result.device.response_expected[u8::from(AnalogInV2BrickletFunction::GetIdentity) as usize] = ResponseExpectedFlag::AlwaysTrue;
162 result
163 }
164
165 pub fn get_response_expected(&mut self, fun: AnalogInV2BrickletFunction) -> Result<bool, GetResponseExpectedError> {
180 self.device.get_response_expected(u8::from(fun))
181 }
182
183 pub fn set_response_expected(
192 &mut self,
193 fun: AnalogInV2BrickletFunction,
194 response_expected: bool,
195 ) -> Result<(), SetResponseExpectedError> {
196 self.device.set_response_expected(u8::from(fun), response_expected)
197 }
198
199 pub fn set_response_expected_all(&mut self, response_expected: bool) { self.device.set_response_expected_all(response_expected) }
201
202 pub fn get_api_version(&self) -> [u8; 3] { self.device.api_version }
205
206 pub fn get_voltage_callback_receiver(&self) -> ConvertingCallbackReceiver<u16> {
216 self.device.get_callback_receiver(u8::from(AnalogInV2BrickletFunction::CallbackVoltage))
217 }
218
219 pub fn get_analog_value_callback_receiver(&self) -> ConvertingCallbackReceiver<u16> {
226 self.device.get_callback_receiver(u8::from(AnalogInV2BrickletFunction::CallbackAnalogValue))
227 }
228
229 pub fn get_voltage_reached_callback_receiver(&self) -> ConvertingCallbackReceiver<u16> {
236 self.device.get_callback_receiver(u8::from(AnalogInV2BrickletFunction::CallbackVoltageReached))
237 }
238
239 pub fn get_analog_value_reached_callback_receiver(&self) -> ConvertingCallbackReceiver<u16> {
246 self.device.get_callback_receiver(u8::from(AnalogInV2BrickletFunction::CallbackAnalogValueReached))
247 }
248
249 pub fn get_voltage(&self) -> ConvertingReceiver<u16> {
255 let payload = vec![0; 0];
256
257 self.device.get(u8::from(AnalogInV2BrickletFunction::GetVoltage), payload)
258 }
259
260 pub fn get_analog_value(&self) -> ConvertingReceiver<u16> {
266 let payload = vec![0; 0];
267
268 self.device.get(u8::from(AnalogInV2BrickletFunction::GetAnalogValue), payload)
269 }
270
271 pub fn set_voltage_callback_period(&self, period: u32) -> ConvertingReceiver<()> {
277 let mut payload = vec![0; 4];
278 payload[0..4].copy_from_slice(&<u32>::to_le_byte_vec(period));
279
280 self.device.set(u8::from(AnalogInV2BrickletFunction::SetVoltageCallbackPeriod), payload)
281 }
282
283 pub fn get_voltage_callback_period(&self) -> ConvertingReceiver<u32> {
285 let payload = vec![0; 0];
286
287 self.device.get(u8::from(AnalogInV2BrickletFunction::GetVoltageCallbackPeriod), payload)
288 }
289
290 pub fn set_analog_value_callback_period(&self, period: u32) -> ConvertingReceiver<()> {
296 let mut payload = vec![0; 4];
297 payload[0..4].copy_from_slice(&<u32>::to_le_byte_vec(period));
298
299 self.device.set(u8::from(AnalogInV2BrickletFunction::SetAnalogValueCallbackPeriod), payload)
300 }
301
302 pub fn get_analog_value_callback_period(&self) -> ConvertingReceiver<u32> {
304 let payload = vec![0; 0];
305
306 self.device.get(u8::from(AnalogInV2BrickletFunction::GetAnalogValueCallbackPeriod), payload)
307 }
308
309 pub fn set_voltage_callback_threshold(&self, option: char, min: u16, max: u16) -> ConvertingReceiver<()> {
328 let mut payload = vec![0; 5];
329 payload[0..1].copy_from_slice(&<char>::to_le_byte_vec(option));
330 payload[1..3].copy_from_slice(&<u16>::to_le_byte_vec(min));
331 payload[3..5].copy_from_slice(&<u16>::to_le_byte_vec(max));
332
333 self.device.set(u8::from(AnalogInV2BrickletFunction::SetVoltageCallbackThreshold), payload)
334 }
335
336 pub fn get_voltage_callback_threshold(&self) -> ConvertingReceiver<VoltageCallbackThreshold> {
345 let payload = vec![0; 0];
346
347 self.device.get(u8::from(AnalogInV2BrickletFunction::GetVoltageCallbackThreshold), payload)
348 }
349
350 pub fn set_analog_value_callback_threshold(&self, option: char, min: u16, max: u16) -> ConvertingReceiver<()> {
369 let mut payload = vec![0; 5];
370 payload[0..1].copy_from_slice(&<char>::to_le_byte_vec(option));
371 payload[1..3].copy_from_slice(&<u16>::to_le_byte_vec(min));
372 payload[3..5].copy_from_slice(&<u16>::to_le_byte_vec(max));
373
374 self.device.set(u8::from(AnalogInV2BrickletFunction::SetAnalogValueCallbackThreshold), payload)
375 }
376
377 pub fn get_analog_value_callback_threshold(&self) -> ConvertingReceiver<AnalogValueCallbackThreshold> {
386 let payload = vec![0; 0];
387
388 self.device.get(u8::from(AnalogInV2BrickletFunction::GetAnalogValueCallbackThreshold), payload)
389 }
390
391 pub fn set_debounce_period(&self, debounce: u32) -> ConvertingReceiver<()> {
403 let mut payload = vec![0; 4];
404 payload[0..4].copy_from_slice(&<u32>::to_le_byte_vec(debounce));
405
406 self.device.set(u8::from(AnalogInV2BrickletFunction::SetDebouncePeriod), payload)
407 }
408
409 pub fn get_debounce_period(&self) -> ConvertingReceiver<u32> {
411 let payload = vec![0; 0];
412
413 self.device.get(u8::from(AnalogInV2BrickletFunction::GetDebouncePeriod), payload)
414 }
415
416 pub fn set_moving_average(&self, average: u8) -> ConvertingReceiver<()> {
422 let mut payload = vec![0; 1];
423 payload[0..1].copy_from_slice(&<u8>::to_le_byte_vec(average));
424
425 self.device.set(u8::from(AnalogInV2BrickletFunction::SetMovingAverage), payload)
426 }
427
428 pub fn get_moving_average(&self) -> ConvertingReceiver<u8> {
430 let payload = vec![0; 0];
431
432 self.device.get(u8::from(AnalogInV2BrickletFunction::GetMovingAverage), payload)
433 }
434
435 pub fn get_identity(&self) -> ConvertingReceiver<Identity> {
446 let payload = vec![0; 0];
447
448 self.device.get(u8::from(AnalogInV2BrickletFunction::GetIdentity), payload)
449 }
450}