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}