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 TemperatureIrV2BrickletFunction {
24 GetAmbientTemperature,
25 SetAmbientTemperatureCallbackConfiguration,
26 GetAmbientTemperatureCallbackConfiguration,
27 GetObjectTemperature,
28 SetObjectTemperatureCallbackConfiguration,
29 GetObjectTemperatureCallbackConfiguration,
30 SetEmissivity,
31 GetEmissivity,
32 GetSpitfpErrorCount,
33 SetBootloaderMode,
34 GetBootloaderMode,
35 SetWriteFirmwarePointer,
36 WriteFirmware,
37 SetStatusLedConfig,
38 GetStatusLedConfig,
39 GetChipTemperature,
40 Reset,
41 WriteUid,
42 ReadUid,
43 GetIdentity,
44 CallbackAmbientTemperature,
45 CallbackObjectTemperature,
46}
47impl From<TemperatureIrV2BrickletFunction> for u8 {
48 fn from(fun: TemperatureIrV2BrickletFunction) -> Self {
49 match fun {
50 TemperatureIrV2BrickletFunction::GetAmbientTemperature => 1,
51 TemperatureIrV2BrickletFunction::SetAmbientTemperatureCallbackConfiguration => 2,
52 TemperatureIrV2BrickletFunction::GetAmbientTemperatureCallbackConfiguration => 3,
53 TemperatureIrV2BrickletFunction::GetObjectTemperature => 5,
54 TemperatureIrV2BrickletFunction::SetObjectTemperatureCallbackConfiguration => 6,
55 TemperatureIrV2BrickletFunction::GetObjectTemperatureCallbackConfiguration => 7,
56 TemperatureIrV2BrickletFunction::SetEmissivity => 9,
57 TemperatureIrV2BrickletFunction::GetEmissivity => 10,
58 TemperatureIrV2BrickletFunction::GetSpitfpErrorCount => 234,
59 TemperatureIrV2BrickletFunction::SetBootloaderMode => 235,
60 TemperatureIrV2BrickletFunction::GetBootloaderMode => 236,
61 TemperatureIrV2BrickletFunction::SetWriteFirmwarePointer => 237,
62 TemperatureIrV2BrickletFunction::WriteFirmware => 238,
63 TemperatureIrV2BrickletFunction::SetStatusLedConfig => 239,
64 TemperatureIrV2BrickletFunction::GetStatusLedConfig => 240,
65 TemperatureIrV2BrickletFunction::GetChipTemperature => 242,
66 TemperatureIrV2BrickletFunction::Reset => 243,
67 TemperatureIrV2BrickletFunction::WriteUid => 248,
68 TemperatureIrV2BrickletFunction::ReadUid => 249,
69 TemperatureIrV2BrickletFunction::GetIdentity => 255,
70 TemperatureIrV2BrickletFunction::CallbackAmbientTemperature => 4,
71 TemperatureIrV2BrickletFunction::CallbackObjectTemperature => 8,
72 }
73 }
74}
75pub const TEMPERATURE_IR_V2_BRICKLET_THRESHOLD_OPTION_OFF: char = 'x';
76pub const TEMPERATURE_IR_V2_BRICKLET_THRESHOLD_OPTION_OUTSIDE: char = 'o';
77pub const TEMPERATURE_IR_V2_BRICKLET_THRESHOLD_OPTION_INSIDE: char = 'i';
78pub const TEMPERATURE_IR_V2_BRICKLET_THRESHOLD_OPTION_SMALLER: char = '<';
79pub const TEMPERATURE_IR_V2_BRICKLET_THRESHOLD_OPTION_GREATER: char = '>';
80pub const TEMPERATURE_IR_V2_BRICKLET_BOOTLOADER_MODE_BOOTLOADER: u8 = 0;
81pub const TEMPERATURE_IR_V2_BRICKLET_BOOTLOADER_MODE_FIRMWARE: u8 = 1;
82pub const TEMPERATURE_IR_V2_BRICKLET_BOOTLOADER_MODE_BOOTLOADER_WAIT_FOR_REBOOT: u8 = 2;
83pub const TEMPERATURE_IR_V2_BRICKLET_BOOTLOADER_MODE_FIRMWARE_WAIT_FOR_REBOOT: u8 = 3;
84pub const TEMPERATURE_IR_V2_BRICKLET_BOOTLOADER_MODE_FIRMWARE_WAIT_FOR_ERASE_AND_REBOOT: u8 = 4;
85pub const TEMPERATURE_IR_V2_BRICKLET_BOOTLOADER_STATUS_OK: u8 = 0;
86pub const TEMPERATURE_IR_V2_BRICKLET_BOOTLOADER_STATUS_INVALID_MODE: u8 = 1;
87pub const TEMPERATURE_IR_V2_BRICKLET_BOOTLOADER_STATUS_NO_CHANGE: u8 = 2;
88pub const TEMPERATURE_IR_V2_BRICKLET_BOOTLOADER_STATUS_ENTRY_FUNCTION_NOT_PRESENT: u8 = 3;
89pub const TEMPERATURE_IR_V2_BRICKLET_BOOTLOADER_STATUS_DEVICE_IDENTIFIER_INCORRECT: u8 = 4;
90pub const TEMPERATURE_IR_V2_BRICKLET_BOOTLOADER_STATUS_CRC_MISMATCH: u8 = 5;
91pub const TEMPERATURE_IR_V2_BRICKLET_STATUS_LED_CONFIG_OFF: u8 = 0;
92pub const TEMPERATURE_IR_V2_BRICKLET_STATUS_LED_CONFIG_ON: u8 = 1;
93pub const TEMPERATURE_IR_V2_BRICKLET_STATUS_LED_CONFIG_SHOW_HEARTBEAT: u8 = 2;
94pub const TEMPERATURE_IR_V2_BRICKLET_STATUS_LED_CONFIG_SHOW_STATUS: u8 = 3;
95
96#[derive(Clone, Copy, Debug, Default, PartialEq, Eq, Hash)]
97pub struct AmbientTemperatureCallbackConfiguration {
98 pub period: u32,
99 pub value_has_to_change: bool,
100 pub option: char,
101 pub min: i16,
102 pub max: i16,
103}
104impl FromByteSlice for AmbientTemperatureCallbackConfiguration {
105 fn bytes_expected() -> usize {
106 10
107 }
108 fn from_le_byte_slice(bytes: &[u8]) -> AmbientTemperatureCallbackConfiguration {
109 AmbientTemperatureCallbackConfiguration {
110 period: <u32>::from_le_byte_slice(&bytes[0..4]),
111 value_has_to_change: <bool>::from_le_byte_slice(&bytes[4..5]),
112 option: <char>::from_le_byte_slice(&bytes[5..6]),
113 min: <i16>::from_le_byte_slice(&bytes[6..8]),
114 max: <i16>::from_le_byte_slice(&bytes[8..10]),
115 }
116 }
117}
118
119#[derive(Clone, Copy, Debug, Default, PartialEq, Eq, Hash)]
120pub struct ObjectTemperatureCallbackConfiguration {
121 pub period: u32,
122 pub value_has_to_change: bool,
123 pub option: char,
124 pub min: i16,
125 pub max: i16,
126}
127impl FromByteSlice for ObjectTemperatureCallbackConfiguration {
128 fn bytes_expected() -> usize {
129 10
130 }
131 fn from_le_byte_slice(bytes: &[u8]) -> ObjectTemperatureCallbackConfiguration {
132 ObjectTemperatureCallbackConfiguration {
133 period: <u32>::from_le_byte_slice(&bytes[0..4]),
134 value_has_to_change: <bool>::from_le_byte_slice(&bytes[4..5]),
135 option: <char>::from_le_byte_slice(&bytes[5..6]),
136 min: <i16>::from_le_byte_slice(&bytes[6..8]),
137 max: <i16>::from_le_byte_slice(&bytes[8..10]),
138 }
139 }
140}
141
142#[derive(Clone, Copy, Debug, Default, PartialEq, Eq, Hash)]
143pub struct SpitfpErrorCount {
144 pub error_count_ack_checksum: u32,
145 pub error_count_message_checksum: u32,
146 pub error_count_frame: u32,
147 pub error_count_overflow: u32,
148}
149impl FromByteSlice for SpitfpErrorCount {
150 fn bytes_expected() -> usize {
151 16
152 }
153 fn from_le_byte_slice(bytes: &[u8]) -> SpitfpErrorCount {
154 SpitfpErrorCount {
155 error_count_ack_checksum: <u32>::from_le_byte_slice(&bytes[0..4]),
156 error_count_message_checksum: <u32>::from_le_byte_slice(&bytes[4..8]),
157 error_count_frame: <u32>::from_le_byte_slice(&bytes[8..12]),
158 error_count_overflow: <u32>::from_le_byte_slice(&bytes[12..16]),
159 }
160 }
161}
162
163#[derive(Clone, Debug, Default, PartialEq, Eq, Hash)]
164pub struct Identity {
165 pub uid: String,
166 pub connected_uid: String,
167 pub position: char,
168 pub hardware_version: [u8; 3],
169 pub firmware_version: [u8; 3],
170 pub device_identifier: u16,
171}
172impl FromByteSlice for Identity {
173 fn bytes_expected() -> usize {
174 25
175 }
176 fn from_le_byte_slice(bytes: &[u8]) -> Identity {
177 Identity {
178 uid: <String>::from_le_byte_slice(&bytes[0..8]),
179 connected_uid: <String>::from_le_byte_slice(&bytes[8..16]),
180 position: <char>::from_le_byte_slice(&bytes[16..17]),
181 hardware_version: <[u8; 3]>::from_le_byte_slice(&bytes[17..20]),
182 firmware_version: <[u8; 3]>::from_le_byte_slice(&bytes[20..23]),
183 device_identifier: <u16>::from_le_byte_slice(&bytes[23..25]),
184 }
185 }
186}
187
188#[derive(Clone)]
190pub struct TemperatureIrV2Bricklet {
191 device: Device,
192}
193impl TemperatureIrV2Bricklet {
194 pub const DEVICE_IDENTIFIER: u16 = 291;
195 pub const DEVICE_DISPLAY_NAME: &'static str = "Temperature IR Bricklet 2.0";
196 pub fn new(uid: Uid, connection: AsyncIpConnection) -> TemperatureIrV2Bricklet {
198 let mut result = TemperatureIrV2Bricklet { device: Device::new([2, 0, 10], uid, connection, Self::DEVICE_DISPLAY_NAME) };
199 result.device.response_expected[u8::from(TemperatureIrV2BrickletFunction::GetAmbientTemperature) as usize] =
200 ResponseExpectedFlag::AlwaysTrue;
201 result.device.response_expected[u8::from(TemperatureIrV2BrickletFunction::SetAmbientTemperatureCallbackConfiguration) as usize] =
202 ResponseExpectedFlag::True;
203 result.device.response_expected[u8::from(TemperatureIrV2BrickletFunction::GetAmbientTemperatureCallbackConfiguration) as usize] =
204 ResponseExpectedFlag::AlwaysTrue;
205 result.device.response_expected[u8::from(TemperatureIrV2BrickletFunction::GetObjectTemperature) as usize] =
206 ResponseExpectedFlag::AlwaysTrue;
207 result.device.response_expected[u8::from(TemperatureIrV2BrickletFunction::SetObjectTemperatureCallbackConfiguration) as usize] =
208 ResponseExpectedFlag::True;
209 result.device.response_expected[u8::from(TemperatureIrV2BrickletFunction::GetObjectTemperatureCallbackConfiguration) as usize] =
210 ResponseExpectedFlag::AlwaysTrue;
211 result.device.response_expected[u8::from(TemperatureIrV2BrickletFunction::SetEmissivity) as usize] = ResponseExpectedFlag::False;
212 result.device.response_expected[u8::from(TemperatureIrV2BrickletFunction::GetEmissivity) as usize] =
213 ResponseExpectedFlag::AlwaysTrue;
214 result.device.response_expected[u8::from(TemperatureIrV2BrickletFunction::GetSpitfpErrorCount) as usize] =
215 ResponseExpectedFlag::AlwaysTrue;
216 result.device.response_expected[u8::from(TemperatureIrV2BrickletFunction::SetBootloaderMode) as usize] =
217 ResponseExpectedFlag::AlwaysTrue;
218 result.device.response_expected[u8::from(TemperatureIrV2BrickletFunction::GetBootloaderMode) as usize] =
219 ResponseExpectedFlag::AlwaysTrue;
220 result.device.response_expected[u8::from(TemperatureIrV2BrickletFunction::SetWriteFirmwarePointer) as usize] =
221 ResponseExpectedFlag::False;
222 result.device.response_expected[u8::from(TemperatureIrV2BrickletFunction::WriteFirmware) as usize] =
223 ResponseExpectedFlag::AlwaysTrue;
224 result.device.response_expected[u8::from(TemperatureIrV2BrickletFunction::SetStatusLedConfig) as usize] =
225 ResponseExpectedFlag::False;
226 result.device.response_expected[u8::from(TemperatureIrV2BrickletFunction::GetStatusLedConfig) as usize] =
227 ResponseExpectedFlag::AlwaysTrue;
228 result.device.response_expected[u8::from(TemperatureIrV2BrickletFunction::GetChipTemperature) as usize] =
229 ResponseExpectedFlag::AlwaysTrue;
230 result.device.response_expected[u8::from(TemperatureIrV2BrickletFunction::Reset) as usize] = ResponseExpectedFlag::False;
231 result.device.response_expected[u8::from(TemperatureIrV2BrickletFunction::WriteUid) as usize] = ResponseExpectedFlag::False;
232 result.device.response_expected[u8::from(TemperatureIrV2BrickletFunction::ReadUid) as usize] = ResponseExpectedFlag::AlwaysTrue;
233 result.device.response_expected[u8::from(TemperatureIrV2BrickletFunction::GetIdentity) as usize] = ResponseExpectedFlag::AlwaysTrue;
234 result
235 }
236
237 pub fn get_response_expected(&mut self, fun: TemperatureIrV2BrickletFunction) -> Result<bool, GetResponseExpectedError> {
252 self.device.get_response_expected(u8::from(fun))
253 }
254
255 pub fn set_response_expected(
264 &mut self,
265 fun: TemperatureIrV2BrickletFunction,
266 response_expected: bool,
267 ) -> Result<(), SetResponseExpectedError> {
268 self.device.set_response_expected(u8::from(fun), response_expected)
269 }
270
271 pub fn set_response_expected_all(&mut self, response_expected: bool) {
273 self.device.set_response_expected_all(response_expected)
274 }
275
276 pub fn get_api_version(&self) -> [u8; 3] {
279 self.device.api_version
280 }
281
282 pub async fn get_ambient_temperature_callback_receiver(&mut self) -> impl Stream<Item = i16> {
290 self.device
291 .get_callback_receiver(u8::from(TemperatureIrV2BrickletFunction::CallbackAmbientTemperature))
292 .await
293 .map(|p| i16::from_le_byte_slice(p.body()))
294 }
295
296 pub async fn get_object_temperature_callback_receiver(&mut self) -> impl Stream<Item = i16> {
301 self.device
302 .get_callback_receiver(u8::from(TemperatureIrV2BrickletFunction::CallbackObjectTemperature))
303 .await
304 .map(|p| i16::from_le_byte_slice(p.body()))
305 }
306
307 pub async fn get_ambient_temperature(&mut self) -> Result<i16, TinkerforgeError> {
314 let payload = [0; 0];
315
316 #[allow(unused_variables)]
317 let result = self.device.get(u8::from(TemperatureIrV2BrickletFunction::GetAmbientTemperature), &payload).await?;
318 Ok(i16::from_le_byte_slice(result.body()))
319 }
320
321 pub async fn set_ambient_temperature_callback_configuration(
354 &mut self,
355 period: u32,
356 value_has_to_change: bool,
357 option: char,
358 min: i16,
359 max: i16,
360 ) -> Result<(), TinkerforgeError> {
361 let mut payload = [0; 10];
362 period.write_to_slice(&mut payload[0..4]);
363 value_has_to_change.write_to_slice(&mut payload[4..5]);
364 option.write_to_slice(&mut payload[5..6]);
365 min.write_to_slice(&mut payload[6..8]);
366 max.write_to_slice(&mut payload[8..10]);
367
368 #[allow(unused_variables)]
369 let result =
370 self.device.set(u8::from(TemperatureIrV2BrickletFunction::SetAmbientTemperatureCallbackConfiguration), &payload).await?;
371 Ok(())
372 }
373
374 pub async fn get_ambient_temperature_callback_configuration(
383 &mut self,
384 ) -> Result<AmbientTemperatureCallbackConfiguration, TinkerforgeError> {
385 let payload = [0; 0];
386
387 #[allow(unused_variables)]
388 let result =
389 self.device.get(u8::from(TemperatureIrV2BrickletFunction::GetAmbientTemperatureCallbackConfiguration), &payload).await?;
390 Ok(AmbientTemperatureCallbackConfiguration::from_le_byte_slice(result.body()))
391 }
392
393 pub async fn get_object_temperature(&mut self) -> Result<i16, TinkerforgeError> {
405 let payload = [0; 0];
406
407 #[allow(unused_variables)]
408 let result = self.device.get(u8::from(TemperatureIrV2BrickletFunction::GetObjectTemperature), &payload).await?;
409 Ok(i16::from_le_byte_slice(result.body()))
410 }
411
412 pub async fn set_object_temperature_callback_configuration(
445 &mut self,
446 period: u32,
447 value_has_to_change: bool,
448 option: char,
449 min: i16,
450 max: i16,
451 ) -> Result<(), TinkerforgeError> {
452 let mut payload = [0; 10];
453 period.write_to_slice(&mut payload[0..4]);
454 value_has_to_change.write_to_slice(&mut payload[4..5]);
455 option.write_to_slice(&mut payload[5..6]);
456 min.write_to_slice(&mut payload[6..8]);
457 max.write_to_slice(&mut payload[8..10]);
458
459 #[allow(unused_variables)]
460 let result =
461 self.device.set(u8::from(TemperatureIrV2BrickletFunction::SetObjectTemperatureCallbackConfiguration), &payload).await?;
462 Ok(())
463 }
464
465 pub async fn get_object_temperature_callback_configuration(
474 &mut self,
475 ) -> Result<ObjectTemperatureCallbackConfiguration, TinkerforgeError> {
476 let payload = [0; 0];
477
478 #[allow(unused_variables)]
479 let result =
480 self.device.get(u8::from(TemperatureIrV2BrickletFunction::GetObjectTemperatureCallbackConfiguration), &payload).await?;
481 Ok(ObjectTemperatureCallbackConfiguration::from_le_byte_slice(result.body()))
482 }
483
484 pub async fn set_emissivity(&mut self, emissivity: u16) -> Result<(), TinkerforgeError> {
503 let mut payload = [0; 2];
504 emissivity.write_to_slice(&mut payload[0..2]);
505
506 #[allow(unused_variables)]
507 let result = self.device.set(u8::from(TemperatureIrV2BrickletFunction::SetEmissivity), &payload).await?;
508 Ok(())
509 }
510
511 pub async fn get_emissivity(&mut self) -> Result<u16, TinkerforgeError> {
513 let payload = [0; 0];
514
515 #[allow(unused_variables)]
516 let result = self.device.get(u8::from(TemperatureIrV2BrickletFunction::GetEmissivity), &payload).await?;
517 Ok(u16::from_le_byte_slice(result.body()))
518 }
519
520 pub async fn get_spitfp_error_count(&mut self) -> Result<SpitfpErrorCount, TinkerforgeError> {
532 let payload = [0; 0];
533
534 #[allow(unused_variables)]
535 let result = self.device.get(u8::from(TemperatureIrV2BrickletFunction::GetSpitfpErrorCount), &payload).await?;
536 Ok(SpitfpErrorCount::from_le_byte_slice(result.body()))
537 }
538
539 pub async fn set_bootloader_mode(&mut self, mode: u8) -> Result<u8, TinkerforgeError> {
562 let mut payload = [0; 1];
563 mode.write_to_slice(&mut payload[0..1]);
564
565 #[allow(unused_variables)]
566 let result = self.device.get(u8::from(TemperatureIrV2BrickletFunction::SetBootloaderMode), &payload).await?;
567 Ok(u8::from_le_byte_slice(result.body()))
568 }
569
570 pub async fn get_bootloader_mode(&mut self) -> Result<u8, TinkerforgeError> {
579 let payload = [0; 0];
580
581 #[allow(unused_variables)]
582 let result = self.device.get(u8::from(TemperatureIrV2BrickletFunction::GetBootloaderMode), &payload).await?;
583 Ok(u8::from_le_byte_slice(result.body()))
584 }
585
586 pub async fn set_write_firmware_pointer(&mut self, pointer: u32) -> Result<(), TinkerforgeError> {
593 let mut payload = [0; 4];
594 pointer.write_to_slice(&mut payload[0..4]);
595
596 #[allow(unused_variables)]
597 let result = self.device.set(u8::from(TemperatureIrV2BrickletFunction::SetWriteFirmwarePointer), &payload).await?;
598 Ok(())
599 }
600
601 pub async fn write_firmware(&mut self, data: &[u8; 64]) -> Result<u8, TinkerforgeError> {
610 let mut payload = [0; 64];
611 data.write_to_slice(&mut payload[0..64]);
612
613 #[allow(unused_variables)]
614 let result = self.device.get(u8::from(TemperatureIrV2BrickletFunction::WriteFirmware), &payload).await?;
615 Ok(u8::from_le_byte_slice(result.body()))
616 }
617
618 pub async fn set_status_led_config(&mut self, config: u8) -> Result<(), TinkerforgeError> {
632 let mut payload = [0; 1];
633 config.write_to_slice(&mut payload[0..1]);
634
635 #[allow(unused_variables)]
636 let result = self.device.set(u8::from(TemperatureIrV2BrickletFunction::SetStatusLedConfig), &payload).await?;
637 Ok(())
638 }
639
640 pub async fn get_status_led_config(&mut self) -> Result<u8, TinkerforgeError> {
648 let payload = [0; 0];
649
650 #[allow(unused_variables)]
651 let result = self.device.get(u8::from(TemperatureIrV2BrickletFunction::GetStatusLedConfig), &payload).await?;
652 Ok(u8::from_le_byte_slice(result.body()))
653 }
654
655 pub async fn get_chip_temperature(&mut self) -> Result<i16, TinkerforgeError> {
662 let payload = [0; 0];
663
664 #[allow(unused_variables)]
665 let result = self.device.get(u8::from(TemperatureIrV2BrickletFunction::GetChipTemperature), &payload).await?;
666 Ok(i16::from_le_byte_slice(result.body()))
667 }
668
669 pub async fn reset(&mut self) -> Result<(), TinkerforgeError> {
676 let payload = [0; 0];
677
678 #[allow(unused_variables)]
679 let result = self.device.set(u8::from(TemperatureIrV2BrickletFunction::Reset), &payload).await?;
680 Ok(())
681 }
682
683 pub async fn write_uid(&mut self, uid: u32) -> Result<(), TinkerforgeError> {
689 let mut payload = [0; 4];
690 uid.write_to_slice(&mut payload[0..4]);
691
692 #[allow(unused_variables)]
693 let result = self.device.set(u8::from(TemperatureIrV2BrickletFunction::WriteUid), &payload).await?;
694 Ok(())
695 }
696
697 pub async fn read_uid(&mut self) -> Result<u32, TinkerforgeError> {
700 let payload = [0; 0];
701
702 #[allow(unused_variables)]
703 let result = self.device.get(u8::from(TemperatureIrV2BrickletFunction::ReadUid), &payload).await?;
704 Ok(u32::from_le_byte_slice(result.body()))
705 }
706
707 pub async fn get_identity(&mut self) -> Result<Identity, TinkerforgeError> {
718 let payload = [0; 0];
719
720 #[allow(unused_variables)]
721 let result = self.device.get(u8::from(TemperatureIrV2BrickletFunction::GetIdentity), &payload).await?;
722 Ok(Identity::from_le_byte_slice(result.body()))
723 }
724}