1use crate::{
15    byte_converter::*,
16    converting_callback_receiver::ConvertingCallbackReceiver,
17    converting_high_level_callback_receiver::ConvertingHighLevelCallbackReceiver,
18    converting_receiver::{BrickletRecvTimeoutError, ConvertingReceiver},
19    device::*,
20    ip_connection::GetRequestSender,
21    low_level_traits::*,
22};
23pub enum ThermalImagingBrickletFunction {
24    GetHighContrastImageLowLevel,
25    GetTemperatureImageLowLevel,
26    GetStatistics,
27    SetResolution,
28    GetResolution,
29    SetSpotmeterConfig,
30    GetSpotmeterConfig,
31    SetHighContrastConfig,
32    GetHighContrastConfig,
33    SetImageTransferConfig,
34    GetImageTransferConfig,
35    SetFluxLinearParameters,
36    GetFluxLinearParameters,
37    SetFfcShutterMode,
38    GetFfcShutterMode,
39    RunFfcNormalization,
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    CallbackHighContrastImageLowLevel,
53    CallbackTemperatureImageLowLevel,
54}
55impl From<ThermalImagingBrickletFunction> for u8 {
56    fn from(fun: ThermalImagingBrickletFunction) -> Self {
57        match fun {
58            ThermalImagingBrickletFunction::GetHighContrastImageLowLevel => 1,
59            ThermalImagingBrickletFunction::GetTemperatureImageLowLevel => 2,
60            ThermalImagingBrickletFunction::GetStatistics => 3,
61            ThermalImagingBrickletFunction::SetResolution => 4,
62            ThermalImagingBrickletFunction::GetResolution => 5,
63            ThermalImagingBrickletFunction::SetSpotmeterConfig => 6,
64            ThermalImagingBrickletFunction::GetSpotmeterConfig => 7,
65            ThermalImagingBrickletFunction::SetHighContrastConfig => 8,
66            ThermalImagingBrickletFunction::GetHighContrastConfig => 9,
67            ThermalImagingBrickletFunction::SetImageTransferConfig => 10,
68            ThermalImagingBrickletFunction::GetImageTransferConfig => 11,
69            ThermalImagingBrickletFunction::SetFluxLinearParameters => 14,
70            ThermalImagingBrickletFunction::GetFluxLinearParameters => 15,
71            ThermalImagingBrickletFunction::SetFfcShutterMode => 16,
72            ThermalImagingBrickletFunction::GetFfcShutterMode => 17,
73            ThermalImagingBrickletFunction::RunFfcNormalization => 18,
74            ThermalImagingBrickletFunction::GetSpitfpErrorCount => 234,
75            ThermalImagingBrickletFunction::SetBootloaderMode => 235,
76            ThermalImagingBrickletFunction::GetBootloaderMode => 236,
77            ThermalImagingBrickletFunction::SetWriteFirmwarePointer => 237,
78            ThermalImagingBrickletFunction::WriteFirmware => 238,
79            ThermalImagingBrickletFunction::SetStatusLedConfig => 239,
80            ThermalImagingBrickletFunction::GetStatusLedConfig => 240,
81            ThermalImagingBrickletFunction::GetChipTemperature => 242,
82            ThermalImagingBrickletFunction::Reset => 243,
83            ThermalImagingBrickletFunction::WriteUid => 248,
84            ThermalImagingBrickletFunction::ReadUid => 249,
85            ThermalImagingBrickletFunction::GetIdentity => 255,
86            ThermalImagingBrickletFunction::CallbackHighContrastImageLowLevel => 12,
87            ThermalImagingBrickletFunction::CallbackTemperatureImageLowLevel => 13,
88        }
89    }
90}
91pub const THERMAL_IMAGING_BRICKLET_RESOLUTION_0_TO_6553_KELVIN: u8 = 0;
92pub const THERMAL_IMAGING_BRICKLET_RESOLUTION_0_TO_655_KELVIN: u8 = 1;
93pub const THERMAL_IMAGING_BRICKLET_FFC_STATUS_NEVER_COMMANDED: u8 = 0;
94pub const THERMAL_IMAGING_BRICKLET_FFC_STATUS_IMMINENT: u8 = 1;
95pub const THERMAL_IMAGING_BRICKLET_FFC_STATUS_IN_PROGRESS: u8 = 2;
96pub const THERMAL_IMAGING_BRICKLET_FFC_STATUS_COMPLETE: u8 = 3;
97pub const THERMAL_IMAGING_BRICKLET_IMAGE_TRANSFER_MANUAL_HIGH_CONTRAST_IMAGE: u8 = 0;
98pub const THERMAL_IMAGING_BRICKLET_IMAGE_TRANSFER_MANUAL_TEMPERATURE_IMAGE: u8 = 1;
99pub const THERMAL_IMAGING_BRICKLET_IMAGE_TRANSFER_CALLBACK_HIGH_CONTRAST_IMAGE: u8 = 2;
100pub const THERMAL_IMAGING_BRICKLET_IMAGE_TRANSFER_CALLBACK_TEMPERATURE_IMAGE: u8 = 3;
101pub const THERMAL_IMAGING_BRICKLET_SHUTTER_MODE_MANUAL: u8 = 0;
102pub const THERMAL_IMAGING_BRICKLET_SHUTTER_MODE_AUTO: u8 = 1;
103pub const THERMAL_IMAGING_BRICKLET_SHUTTER_MODE_EXTERNAL: u8 = 2;
104pub const THERMAL_IMAGING_BRICKLET_SHUTTER_LOCKOUT_INACTIVE: u8 = 0;
105pub const THERMAL_IMAGING_BRICKLET_SHUTTER_LOCKOUT_HIGH: u8 = 1;
106pub const THERMAL_IMAGING_BRICKLET_SHUTTER_LOCKOUT_LOW: u8 = 2;
107pub const THERMAL_IMAGING_BRICKLET_BOOTLOADER_MODE_BOOTLOADER: u8 = 0;
108pub const THERMAL_IMAGING_BRICKLET_BOOTLOADER_MODE_FIRMWARE: u8 = 1;
109pub const THERMAL_IMAGING_BRICKLET_BOOTLOADER_MODE_BOOTLOADER_WAIT_FOR_REBOOT: u8 = 2;
110pub const THERMAL_IMAGING_BRICKLET_BOOTLOADER_MODE_FIRMWARE_WAIT_FOR_REBOOT: u8 = 3;
111pub const THERMAL_IMAGING_BRICKLET_BOOTLOADER_MODE_FIRMWARE_WAIT_FOR_ERASE_AND_REBOOT: u8 = 4;
112pub const THERMAL_IMAGING_BRICKLET_BOOTLOADER_STATUS_OK: u8 = 0;
113pub const THERMAL_IMAGING_BRICKLET_BOOTLOADER_STATUS_INVALID_MODE: u8 = 1;
114pub const THERMAL_IMAGING_BRICKLET_BOOTLOADER_STATUS_NO_CHANGE: u8 = 2;
115pub const THERMAL_IMAGING_BRICKLET_BOOTLOADER_STATUS_ENTRY_FUNCTION_NOT_PRESENT: u8 = 3;
116pub const THERMAL_IMAGING_BRICKLET_BOOTLOADER_STATUS_DEVICE_IDENTIFIER_INCORRECT: u8 = 4;
117pub const THERMAL_IMAGING_BRICKLET_BOOTLOADER_STATUS_CRC_MISMATCH: u8 = 5;
118pub const THERMAL_IMAGING_BRICKLET_STATUS_LED_CONFIG_OFF: u8 = 0;
119pub const THERMAL_IMAGING_BRICKLET_STATUS_LED_CONFIG_ON: u8 = 1;
120pub const THERMAL_IMAGING_BRICKLET_STATUS_LED_CONFIG_SHOW_HEARTBEAT: u8 = 2;
121pub const THERMAL_IMAGING_BRICKLET_STATUS_LED_CONFIG_SHOW_STATUS: u8 = 3;
122
123#[derive(Clone, Copy)]
124pub struct HighContrastImageLowLevel {
125    pub image_chunk_offset: u16,
126    pub image_chunk_data: [u8; 62],
127}
128impl FromByteSlice for HighContrastImageLowLevel {
129    fn bytes_expected() -> usize { 64 }
130    fn from_le_byte_slice(bytes: &[u8]) -> HighContrastImageLowLevel {
131        HighContrastImageLowLevel {
132            image_chunk_offset: <u16>::from_le_byte_slice(&bytes[0..2]),
133            image_chunk_data: <[u8; 62]>::from_le_byte_slice(&bytes[2..64]),
134        }
135    }
136}
137impl LowLevelRead<u8, HighContrastImageResult> for HighContrastImageLowLevel {
138    fn ll_message_length(&self) -> usize { 4800 }
139
140    fn ll_message_chunk_offset(&self) -> usize { self.image_chunk_offset as usize }
141
142    fn ll_message_chunk_data(&self) -> &[u8] { &self.image_chunk_data }
143
144    fn get_result(&self) -> HighContrastImageResult { HighContrastImageResult {} }
145}
146
147#[derive(Clone, Copy, Debug, Default, PartialEq, Eq, Hash)]
148pub struct TemperatureImageLowLevel {
149    pub image_chunk_offset: u16,
150    pub image_chunk_data: [u16; 31],
151}
152impl FromByteSlice for TemperatureImageLowLevel {
153    fn bytes_expected() -> usize { 64 }
154    fn from_le_byte_slice(bytes: &[u8]) -> TemperatureImageLowLevel {
155        TemperatureImageLowLevel {
156            image_chunk_offset: <u16>::from_le_byte_slice(&bytes[0..2]),
157            image_chunk_data: <[u16; 31]>::from_le_byte_slice(&bytes[2..64]),
158        }
159    }
160}
161impl LowLevelRead<u16, TemperatureImageResult> for TemperatureImageLowLevel {
162    fn ll_message_length(&self) -> usize { 4800 }
163
164    fn ll_message_chunk_offset(&self) -> usize { self.image_chunk_offset as usize }
165
166    fn ll_message_chunk_data(&self) -> &[u16] { &self.image_chunk_data }
167
168    fn get_result(&self) -> TemperatureImageResult { TemperatureImageResult {} }
169}
170
171#[derive(Clone, Copy, Debug, Default, PartialEq, Eq, Hash)]
172pub struct Statistics {
173    pub spotmeter_statistics: [u16; 4],
174    pub temperatures: [u16; 4],
175    pub resolution: u8,
176    pub ffc_status: u8,
177    pub temperature_warning: [bool; 2],
178}
179impl FromByteSlice for Statistics {
180    fn bytes_expected() -> usize { 19 }
181    fn from_le_byte_slice(bytes: &[u8]) -> Statistics {
182        Statistics {
183            spotmeter_statistics: <[u16; 4]>::from_le_byte_slice(&bytes[0..8]),
184            temperatures: <[u16; 4]>::from_le_byte_slice(&bytes[8..16]),
185            resolution: <u8>::from_le_byte_slice(&bytes[16..17]),
186            ffc_status: <u8>::from_le_byte_slice(&bytes[17..18]),
187            temperature_warning: <[bool; 2]>::from_le_byte_slice(&bytes[18..19]),
188        }
189    }
190}
191
192#[derive(Clone, Copy, Debug, Default, PartialEq, Eq, Hash)]
193pub struct HighContrastConfig {
194    pub region_of_interest: [u8; 4],
195    pub dampening_factor: u16,
196    pub clip_limit: [u16; 2],
197    pub empty_counts: u16,
198}
199impl FromByteSlice for HighContrastConfig {
200    fn bytes_expected() -> usize { 12 }
201    fn from_le_byte_slice(bytes: &[u8]) -> HighContrastConfig {
202        HighContrastConfig {
203            region_of_interest: <[u8; 4]>::from_le_byte_slice(&bytes[0..4]),
204            dampening_factor: <u16>::from_le_byte_slice(&bytes[4..6]),
205            clip_limit: <[u16; 2]>::from_le_byte_slice(&bytes[6..10]),
206            empty_counts: <u16>::from_le_byte_slice(&bytes[10..12]),
207        }
208    }
209}
210
211#[derive(Clone, Copy)]
212pub struct HighContrastImageLowLevelEvent {
213    pub image_chunk_offset: u16,
214    pub image_chunk_data: [u8; 62],
215}
216impl FromByteSlice for HighContrastImageLowLevelEvent {
217    fn bytes_expected() -> usize { 64 }
218    fn from_le_byte_slice(bytes: &[u8]) -> HighContrastImageLowLevelEvent {
219        HighContrastImageLowLevelEvent {
220            image_chunk_offset: <u16>::from_le_byte_slice(&bytes[0..2]),
221            image_chunk_data: <[u8; 62]>::from_le_byte_slice(&bytes[2..64]),
222        }
223    }
224}
225impl LowLevelRead<u8, HighContrastImageResult> for HighContrastImageLowLevelEvent {
226    fn ll_message_length(&self) -> usize { 4800 }
227
228    fn ll_message_chunk_offset(&self) -> usize { self.image_chunk_offset as usize }
229
230    fn ll_message_chunk_data(&self) -> &[u8] { &self.image_chunk_data }
231
232    fn get_result(&self) -> HighContrastImageResult { HighContrastImageResult {} }
233}
234
235#[derive(Clone, Copy, Debug, Default, PartialEq, Eq, Hash)]
236pub struct TemperatureImageLowLevelEvent {
237    pub image_chunk_offset: u16,
238    pub image_chunk_data: [u16; 31],
239}
240impl FromByteSlice for TemperatureImageLowLevelEvent {
241    fn bytes_expected() -> usize { 64 }
242    fn from_le_byte_slice(bytes: &[u8]) -> TemperatureImageLowLevelEvent {
243        TemperatureImageLowLevelEvent {
244            image_chunk_offset: <u16>::from_le_byte_slice(&bytes[0..2]),
245            image_chunk_data: <[u16; 31]>::from_le_byte_slice(&bytes[2..64]),
246        }
247    }
248}
249impl LowLevelRead<u16, TemperatureImageResult> for TemperatureImageLowLevelEvent {
250    fn ll_message_length(&self) -> usize { 4800 }
251
252    fn ll_message_chunk_offset(&self) -> usize { self.image_chunk_offset as usize }
253
254    fn ll_message_chunk_data(&self) -> &[u16] { &self.image_chunk_data }
255
256    fn get_result(&self) -> TemperatureImageResult { TemperatureImageResult {} }
257}
258
259#[derive(Clone, Copy, Debug, Default, PartialEq, Eq, Hash)]
260pub struct FluxLinearParameters {
261    pub scene_emissivity: u16,
262    pub temperature_background: u16,
263    pub tau_window: u16,
264    pub temperatur_window: u16,
265    pub tau_atmosphere: u16,
266    pub temperature_atmosphere: u16,
267    pub reflection_window: u16,
268    pub temperature_reflection: u16,
269}
270impl FromByteSlice for FluxLinearParameters {
271    fn bytes_expected() -> usize { 16 }
272    fn from_le_byte_slice(bytes: &[u8]) -> FluxLinearParameters {
273        FluxLinearParameters {
274            scene_emissivity: <u16>::from_le_byte_slice(&bytes[0..2]),
275            temperature_background: <u16>::from_le_byte_slice(&bytes[2..4]),
276            tau_window: <u16>::from_le_byte_slice(&bytes[4..6]),
277            temperatur_window: <u16>::from_le_byte_slice(&bytes[6..8]),
278            tau_atmosphere: <u16>::from_le_byte_slice(&bytes[8..10]),
279            temperature_atmosphere: <u16>::from_le_byte_slice(&bytes[10..12]),
280            reflection_window: <u16>::from_le_byte_slice(&bytes[12..14]),
281            temperature_reflection: <u16>::from_le_byte_slice(&bytes[14..16]),
282        }
283    }
284}
285
286#[derive(Clone, Copy, Debug, Default, PartialEq, Eq, Hash)]
287pub struct FfcShutterMode {
288    pub shutter_mode: u8,
289    pub temp_lockout_state: u8,
290    pub video_freeze_during_ffc: bool,
291    pub ffc_desired: bool,
292    pub elapsed_time_since_last_ffc: u32,
293    pub desired_ffc_period: u32,
294    pub explicit_cmd_to_open: bool,
295    pub desired_ffc_temp_delta: u16,
296    pub imminent_delay: u16,
297}
298impl FromByteSlice for FfcShutterMode {
299    fn bytes_expected() -> usize { 17 }
300    fn from_le_byte_slice(bytes: &[u8]) -> FfcShutterMode {
301        FfcShutterMode {
302            shutter_mode: <u8>::from_le_byte_slice(&bytes[0..1]),
303            temp_lockout_state: <u8>::from_le_byte_slice(&bytes[1..2]),
304            video_freeze_during_ffc: <bool>::from_le_byte_slice(&bytes[2..3]),
305            ffc_desired: <bool>::from_le_byte_slice(&bytes[3..4]),
306            elapsed_time_since_last_ffc: <u32>::from_le_byte_slice(&bytes[4..8]),
307            desired_ffc_period: <u32>::from_le_byte_slice(&bytes[8..12]),
308            explicit_cmd_to_open: <bool>::from_le_byte_slice(&bytes[12..13]),
309            desired_ffc_temp_delta: <u16>::from_le_byte_slice(&bytes[13..15]),
310            imminent_delay: <u16>::from_le_byte_slice(&bytes[15..17]),
311        }
312    }
313}
314
315#[derive(Clone, Copy, Debug, Default, PartialEq, Eq, Hash)]
316pub struct SpitfpErrorCount {
317    pub error_count_ack_checksum: u32,
318    pub error_count_message_checksum: u32,
319    pub error_count_frame: u32,
320    pub error_count_overflow: u32,
321}
322impl FromByteSlice for SpitfpErrorCount {
323    fn bytes_expected() -> usize { 16 }
324    fn from_le_byte_slice(bytes: &[u8]) -> SpitfpErrorCount {
325        SpitfpErrorCount {
326            error_count_ack_checksum: <u32>::from_le_byte_slice(&bytes[0..4]),
327            error_count_message_checksum: <u32>::from_le_byte_slice(&bytes[4..8]),
328            error_count_frame: <u32>::from_le_byte_slice(&bytes[8..12]),
329            error_count_overflow: <u32>::from_le_byte_slice(&bytes[12..16]),
330        }
331    }
332}
333
334#[derive(Clone, Debug, Default, PartialEq, Eq, Hash)]
335pub struct Identity {
336    pub uid: String,
337    pub connected_uid: String,
338    pub position: char,
339    pub hardware_version: [u8; 3],
340    pub firmware_version: [u8; 3],
341    pub device_identifier: u16,
342}
343impl FromByteSlice for Identity {
344    fn bytes_expected() -> usize { 25 }
345    fn from_le_byte_slice(bytes: &[u8]) -> Identity {
346        Identity {
347            uid: <String>::from_le_byte_slice(&bytes[0..8]),
348            connected_uid: <String>::from_le_byte_slice(&bytes[8..16]),
349            position: <char>::from_le_byte_slice(&bytes[16..17]),
350            hardware_version: <[u8; 3]>::from_le_byte_slice(&bytes[17..20]),
351            firmware_version: <[u8; 3]>::from_le_byte_slice(&bytes[20..23]),
352            device_identifier: <u16>::from_le_byte_slice(&bytes[23..25]),
353        }
354    }
355}
356
357#[derive(Clone, Copy, Debug, Default, PartialEq, Eq, Hash)]
358pub struct HighContrastImageResult {}
359
360#[derive(Clone, Copy, Debug, Default, PartialEq, Eq, Hash)]
361pub struct TemperatureImageResult {}
362
363#[derive(Clone)]
365pub struct ThermalImagingBricklet {
366    device: Device,
367}
368impl ThermalImagingBricklet {
369    pub const DEVICE_IDENTIFIER: u16 = 278;
370    pub const DEVICE_DISPLAY_NAME: &'static str = "Thermal Imaging Bricklet";
371    pub fn new<T: GetRequestSender>(uid: &str, req_sender: T) -> ThermalImagingBricklet {
373        let mut result = ThermalImagingBricklet { device: Device::new([2, 0, 2], uid, req_sender, 4) };
374        result.device.response_expected[u8::from(ThermalImagingBrickletFunction::GetHighContrastImageLowLevel) as usize] =
375            ResponseExpectedFlag::AlwaysTrue;
376        result.device.response_expected[u8::from(ThermalImagingBrickletFunction::GetTemperatureImageLowLevel) as usize] =
377            ResponseExpectedFlag::AlwaysTrue;
378        result.device.response_expected[u8::from(ThermalImagingBrickletFunction::GetStatistics) as usize] =
379            ResponseExpectedFlag::AlwaysTrue;
380        result.device.response_expected[u8::from(ThermalImagingBrickletFunction::SetResolution) as usize] = ResponseExpectedFlag::False;
381        result.device.response_expected[u8::from(ThermalImagingBrickletFunction::GetResolution) as usize] =
382            ResponseExpectedFlag::AlwaysTrue;
383        result.device.response_expected[u8::from(ThermalImagingBrickletFunction::SetSpotmeterConfig) as usize] =
384            ResponseExpectedFlag::False;
385        result.device.response_expected[u8::from(ThermalImagingBrickletFunction::GetSpotmeterConfig) as usize] =
386            ResponseExpectedFlag::AlwaysTrue;
387        result.device.response_expected[u8::from(ThermalImagingBrickletFunction::SetHighContrastConfig) as usize] =
388            ResponseExpectedFlag::False;
389        result.device.response_expected[u8::from(ThermalImagingBrickletFunction::GetHighContrastConfig) as usize] =
390            ResponseExpectedFlag::AlwaysTrue;
391        result.device.response_expected[u8::from(ThermalImagingBrickletFunction::SetImageTransferConfig) as usize] =
392            ResponseExpectedFlag::True;
393        result.device.response_expected[u8::from(ThermalImagingBrickletFunction::GetImageTransferConfig) as usize] =
394            ResponseExpectedFlag::AlwaysTrue;
395        result.device.response_expected[u8::from(ThermalImagingBrickletFunction::SetFluxLinearParameters) as usize] =
396            ResponseExpectedFlag::False;
397        result.device.response_expected[u8::from(ThermalImagingBrickletFunction::GetFluxLinearParameters) as usize] =
398            ResponseExpectedFlag::AlwaysTrue;
399        result.device.response_expected[u8::from(ThermalImagingBrickletFunction::SetFfcShutterMode) as usize] = ResponseExpectedFlag::False;
400        result.device.response_expected[u8::from(ThermalImagingBrickletFunction::GetFfcShutterMode) as usize] =
401            ResponseExpectedFlag::AlwaysTrue;
402        result.device.response_expected[u8::from(ThermalImagingBrickletFunction::RunFfcNormalization) as usize] =
403            ResponseExpectedFlag::False;
404        result.device.response_expected[u8::from(ThermalImagingBrickletFunction::GetSpitfpErrorCount) as usize] =
405            ResponseExpectedFlag::AlwaysTrue;
406        result.device.response_expected[u8::from(ThermalImagingBrickletFunction::SetBootloaderMode) as usize] =
407            ResponseExpectedFlag::AlwaysTrue;
408        result.device.response_expected[u8::from(ThermalImagingBrickletFunction::GetBootloaderMode) as usize] =
409            ResponseExpectedFlag::AlwaysTrue;
410        result.device.response_expected[u8::from(ThermalImagingBrickletFunction::SetWriteFirmwarePointer) as usize] =
411            ResponseExpectedFlag::False;
412        result.device.response_expected[u8::from(ThermalImagingBrickletFunction::WriteFirmware) as usize] =
413            ResponseExpectedFlag::AlwaysTrue;
414        result.device.response_expected[u8::from(ThermalImagingBrickletFunction::SetStatusLedConfig) as usize] =
415            ResponseExpectedFlag::False;
416        result.device.response_expected[u8::from(ThermalImagingBrickletFunction::GetStatusLedConfig) as usize] =
417            ResponseExpectedFlag::AlwaysTrue;
418        result.device.response_expected[u8::from(ThermalImagingBrickletFunction::GetChipTemperature) as usize] =
419            ResponseExpectedFlag::AlwaysTrue;
420        result.device.response_expected[u8::from(ThermalImagingBrickletFunction::Reset) as usize] = ResponseExpectedFlag::False;
421        result.device.response_expected[u8::from(ThermalImagingBrickletFunction::WriteUid) as usize] = ResponseExpectedFlag::False;
422        result.device.response_expected[u8::from(ThermalImagingBrickletFunction::ReadUid) as usize] = ResponseExpectedFlag::AlwaysTrue;
423        result.device.response_expected[u8::from(ThermalImagingBrickletFunction::GetIdentity) as usize] = ResponseExpectedFlag::AlwaysTrue;
424        result
425    }
426
427    pub fn get_response_expected(&mut self, fun: ThermalImagingBrickletFunction) -> Result<bool, GetResponseExpectedError> {
442        self.device.get_response_expected(u8::from(fun))
443    }
444
445    pub fn set_response_expected(
454        &mut self,
455        fun: ThermalImagingBrickletFunction,
456        response_expected: bool,
457    ) -> Result<(), SetResponseExpectedError> {
458        self.device.set_response_expected(u8::from(fun), response_expected)
459    }
460
461    pub fn set_response_expected_all(&mut self, response_expected: bool) { self.device.set_response_expected_all(response_expected) }
463
464    pub fn get_api_version(&self) -> [u8; 3] { self.device.api_version }
467
468    pub fn get_high_contrast_image_low_level_callback_receiver(&self) -> ConvertingCallbackReceiver<HighContrastImageLowLevelEvent> {
470        self.device.get_callback_receiver(u8::from(ThermalImagingBrickletFunction::CallbackHighContrastImageLowLevel))
471    }
472
473    pub fn get_high_contrast_image_callback_receiver(
485        &self,
486    ) -> ConvertingHighLevelCallbackReceiver<u8, HighContrastImageResult, HighContrastImageLowLevelEvent> {
487        ConvertingHighLevelCallbackReceiver::new(
488            self.device.get_callback_receiver(u8::from(ThermalImagingBrickletFunction::CallbackHighContrastImageLowLevel)),
489        )
490    }
491
492    pub fn get_temperature_image_low_level_callback_receiver(&self) -> ConvertingCallbackReceiver<TemperatureImageLowLevelEvent> {
494        self.device.get_callback_receiver(u8::from(ThermalImagingBrickletFunction::CallbackTemperatureImageLowLevel))
495    }
496
497    pub fn get_temperature_image_callback_receiver(
507        &self,
508    ) -> ConvertingHighLevelCallbackReceiver<u16, TemperatureImageResult, TemperatureImageLowLevelEvent> {
509        ConvertingHighLevelCallbackReceiver::new(
510            self.device.get_callback_receiver(u8::from(ThermalImagingBrickletFunction::CallbackTemperatureImageLowLevel)),
511        )
512    }
513
514    pub fn get_high_contrast_image_low_level(&self) -> ConvertingReceiver<HighContrastImageLowLevel> {
529        let payload = vec![0; 0];
530
531        self.device.get(u8::from(ThermalImagingBrickletFunction::GetHighContrastImageLowLevel), payload)
532    }
533
534    pub fn get_high_contrast_image(&self) -> Result<Vec<u8>, BrickletRecvTimeoutError> {
549        let ll_result = self.device.get_high_level(0, &mut || self.get_high_contrast_image_low_level().recv())?;
550        Ok(ll_result.0)
551    }
552
553    pub fn get_temperature_image_low_level(&self) -> ConvertingReceiver<TemperatureImageLowLevel> {
567        let payload = vec![0; 0];
568
569        self.device.get(u8::from(ThermalImagingBrickletFunction::GetTemperatureImageLowLevel), payload)
570    }
571
572    pub fn get_temperature_image(&self) -> Result<Vec<u16>, BrickletRecvTimeoutError> {
586        let ll_result = self.device.get_high_level(1, &mut || self.get_temperature_image_low_level().recv())?;
587        Ok(ll_result.0)
588    }
589
590    pub fn get_statistics(&self) -> ConvertingReceiver<Statistics> {
629        let payload = vec![0; 0];
630
631        self.device.get(u8::from(ThermalImagingBrickletFunction::GetStatistics), payload)
632    }
633
634    pub fn set_resolution(&self, resolution: u8) -> ConvertingReceiver<()> {
646        let mut payload = vec![0; 1];
647        payload[0..1].copy_from_slice(&<u8>::to_le_byte_vec(resolution));
648
649        self.device.set(u8::from(ThermalImagingBrickletFunction::SetResolution), payload)
650    }
651
652    pub fn get_resolution(&self) -> ConvertingReceiver<u8> {
658        let payload = vec![0; 0];
659
660        self.device.get(u8::from(ThermalImagingBrickletFunction::GetResolution), payload)
661    }
662
663    pub fn set_spotmeter_config(&self, region_of_interest: [u8; 4]) -> ConvertingReceiver<()> {
672        let mut payload = vec![0; 4];
673        payload[0..4].copy_from_slice(&<[u8; 4]>::to_le_byte_vec(region_of_interest));
674
675        self.device.set(u8::from(ThermalImagingBrickletFunction::SetSpotmeterConfig), payload)
676    }
677
678    pub fn get_spotmeter_config(&self) -> ConvertingReceiver<[u8; 4]> {
680        let payload = vec![0; 0];
681
682        self.device.get(u8::from(ThermalImagingBrickletFunction::GetSpotmeterConfig), payload)
683    }
684
685    pub fn set_high_contrast_config(
724        &self,
725        region_of_interest: [u8; 4],
726        dampening_factor: u16,
727        clip_limit: [u16; 2],
728        empty_counts: u16,
729    ) -> ConvertingReceiver<()> {
730        let mut payload = vec![0; 12];
731        payload[0..4].copy_from_slice(&<[u8; 4]>::to_le_byte_vec(region_of_interest));
732        payload[4..6].copy_from_slice(&<u16>::to_le_byte_vec(dampening_factor));
733        payload[6..10].copy_from_slice(&<[u16; 2]>::to_le_byte_vec(clip_limit));
734        payload[10..12].copy_from_slice(&<u16>::to_le_byte_vec(empty_counts));
735
736        self.device.set(u8::from(ThermalImagingBrickletFunction::SetHighContrastConfig), payload)
737    }
738
739    pub fn get_high_contrast_config(&self) -> ConvertingReceiver<HighContrastConfig> {
741        let payload = vec![0; 0];
742
743        self.device.get(u8::from(ThermalImagingBrickletFunction::GetHighContrastConfig), payload)
744    }
745
746    pub fn set_image_transfer_config(&self, config: u8) -> ConvertingReceiver<()> {
763        let mut payload = vec![0; 1];
764        payload[0..1].copy_from_slice(&<u8>::to_le_byte_vec(config));
765
766        self.device.set(u8::from(ThermalImagingBrickletFunction::SetImageTransferConfig), payload)
767    }
768
769    pub fn get_image_transfer_config(&self) -> ConvertingReceiver<u8> {
777        let payload = vec![0; 0];
778
779        self.device.get(u8::from(ThermalImagingBrickletFunction::GetImageTransferConfig), payload)
780    }
781
782    pub fn set_flux_linear_parameters(
789        &self,
790        scene_emissivity: u16,
791        temperature_background: u16,
792        tau_window: u16,
793        temperatur_window: u16,
794        tau_atmosphere: u16,
795        temperature_atmosphere: u16,
796        reflection_window: u16,
797        temperature_reflection: u16,
798    ) -> ConvertingReceiver<()> {
799        let mut payload = vec![0; 16];
800        payload[0..2].copy_from_slice(&<u16>::to_le_byte_vec(scene_emissivity));
801        payload[2..4].copy_from_slice(&<u16>::to_le_byte_vec(temperature_background));
802        payload[4..6].copy_from_slice(&<u16>::to_le_byte_vec(tau_window));
803        payload[6..8].copy_from_slice(&<u16>::to_le_byte_vec(temperatur_window));
804        payload[8..10].copy_from_slice(&<u16>::to_le_byte_vec(tau_atmosphere));
805        payload[10..12].copy_from_slice(&<u16>::to_le_byte_vec(temperature_atmosphere));
806        payload[12..14].copy_from_slice(&<u16>::to_le_byte_vec(reflection_window));
807        payload[14..16].copy_from_slice(&<u16>::to_le_byte_vec(temperature_reflection));
808
809        self.device.set(u8::from(ThermalImagingBrickletFunction::SetFluxLinearParameters), payload)
810    }
811
812    pub fn get_flux_linear_parameters(&self) -> ConvertingReceiver<FluxLinearParameters> {
817        let payload = vec![0; 0];
818
819        self.device.get(u8::from(ThermalImagingBrickletFunction::GetFluxLinearParameters), payload)
820    }
821
822    pub fn set_ffc_shutter_mode(
837        &self,
838        shutter_mode: u8,
839        temp_lockout_state: u8,
840        video_freeze_during_ffc: bool,
841        ffc_desired: bool,
842        elapsed_time_since_last_ffc: u32,
843        desired_ffc_period: u32,
844        explicit_cmd_to_open: bool,
845        desired_ffc_temp_delta: u16,
846        imminent_delay: u16,
847    ) -> ConvertingReceiver<()> {
848        let mut payload = vec![0; 17];
849        payload[0..1].copy_from_slice(&<u8>::to_le_byte_vec(shutter_mode));
850        payload[1..2].copy_from_slice(&<u8>::to_le_byte_vec(temp_lockout_state));
851        payload[2..3].copy_from_slice(&<bool>::to_le_byte_vec(video_freeze_during_ffc));
852        payload[3..4].copy_from_slice(&<bool>::to_le_byte_vec(ffc_desired));
853        payload[4..8].copy_from_slice(&<u32>::to_le_byte_vec(elapsed_time_since_last_ffc));
854        payload[8..12].copy_from_slice(&<u32>::to_le_byte_vec(desired_ffc_period));
855        payload[12..13].copy_from_slice(&<bool>::to_le_byte_vec(explicit_cmd_to_open));
856        payload[13..15].copy_from_slice(&<u16>::to_le_byte_vec(desired_ffc_temp_delta));
857        payload[15..17].copy_from_slice(&<u16>::to_le_byte_vec(imminent_delay));
858
859        self.device.set(u8::from(ThermalImagingBrickletFunction::SetFfcShutterMode), payload)
860    }
861
862    pub fn get_ffc_shutter_mode(&self) -> ConvertingReceiver<FfcShutterMode> {
877        let payload = vec![0; 0];
878
879        self.device.get(u8::from(ThermalImagingBrickletFunction::GetFfcShutterMode), payload)
880    }
881
882    pub fn run_ffc_normalization(&self) -> ConvertingReceiver<()> {
889        let payload = vec![0; 0];
890
891        self.device.set(u8::from(ThermalImagingBrickletFunction::RunFfcNormalization), payload)
892    }
893
894    pub fn get_spitfp_error_count(&self) -> ConvertingReceiver<SpitfpErrorCount> {
906        let payload = vec![0; 0];
907
908        self.device.get(u8::from(ThermalImagingBrickletFunction::GetSpitfpErrorCount), payload)
909    }
910
911    pub fn set_bootloader_mode(&self, mode: u8) -> ConvertingReceiver<u8> {
934        let mut payload = vec![0; 1];
935        payload[0..1].copy_from_slice(&<u8>::to_le_byte_vec(mode));
936
937        self.device.get(u8::from(ThermalImagingBrickletFunction::SetBootloaderMode), payload)
938    }
939
940    pub fn get_bootloader_mode(&self) -> ConvertingReceiver<u8> {
949        let payload = vec![0; 0];
950
951        self.device.get(u8::from(ThermalImagingBrickletFunction::GetBootloaderMode), payload)
952    }
953
954    pub fn set_write_firmware_pointer(&self, pointer: u32) -> ConvertingReceiver<()> {
961        let mut payload = vec![0; 4];
962        payload[0..4].copy_from_slice(&<u32>::to_le_byte_vec(pointer));
963
964        self.device.set(u8::from(ThermalImagingBrickletFunction::SetWriteFirmwarePointer), payload)
965    }
966
967    pub fn write_firmware(&self, data: [u8; 64]) -> ConvertingReceiver<u8> {
976        let mut payload = vec![0; 64];
977        payload[0..64].copy_from_slice(&<[u8; 64]>::to_le_byte_vec(data));
978
979        self.device.get(u8::from(ThermalImagingBrickletFunction::WriteFirmware), payload)
980    }
981
982    pub fn set_status_led_config(&self, config: u8) -> ConvertingReceiver<()> {
996        let mut payload = vec![0; 1];
997        payload[0..1].copy_from_slice(&<u8>::to_le_byte_vec(config));
998
999        self.device.set(u8::from(ThermalImagingBrickletFunction::SetStatusLedConfig), payload)
1000    }
1001
1002    pub fn get_status_led_config(&self) -> ConvertingReceiver<u8> {
1010        let payload = vec![0; 0];
1011
1012        self.device.get(u8::from(ThermalImagingBrickletFunction::GetStatusLedConfig), payload)
1013    }
1014
1015    pub fn get_chip_temperature(&self) -> ConvertingReceiver<i16> {
1022        let payload = vec![0; 0];
1023
1024        self.device.get(u8::from(ThermalImagingBrickletFunction::GetChipTemperature), payload)
1025    }
1026
1027    pub fn reset(&self) -> ConvertingReceiver<()> {
1034        let payload = vec![0; 0];
1035
1036        self.device.set(u8::from(ThermalImagingBrickletFunction::Reset), payload)
1037    }
1038
1039    pub fn write_uid(&self, uid: u32) -> ConvertingReceiver<()> {
1045        let mut payload = vec![0; 4];
1046        payload[0..4].copy_from_slice(&<u32>::to_le_byte_vec(uid));
1047
1048        self.device.set(u8::from(ThermalImagingBrickletFunction::WriteUid), payload)
1049    }
1050
1051    pub fn read_uid(&self) -> ConvertingReceiver<u32> {
1054        let payload = vec![0; 0];
1055
1056        self.device.get(u8::from(ThermalImagingBrickletFunction::ReadUid), payload)
1057    }
1058
1059    pub fn get_identity(&self) -> ConvertingReceiver<Identity> {
1070        let payload = vec![0; 0];
1071
1072        self.device.get(u8::from(ThermalImagingBrickletFunction::GetIdentity), payload)
1073    }
1074}