tinkerforge_async/bindings/
hat_zero_brick.rs1#[allow(unused_imports)]
15use crate::{
16 base58::Uid, byte_converter::*, device::*, error::TinkerforgeError, ip_connection::async_io::AsyncIpConnection,
17 low_level_traits::LowLevelRead,
18};
19#[allow(unused_imports)]
20use futures_core::Stream;
21#[allow(unused_imports)]
22use tokio_stream::StreamExt;
23pub enum HatZeroBrickFunction {
24 GetUsbVoltage,
25 SetUsbVoltageCallbackConfiguration,
26 GetUsbVoltageCallbackConfiguration,
27 GetSpitfpErrorCount,
28 SetBootloaderMode,
29 GetBootloaderMode,
30 SetWriteFirmwarePointer,
31 WriteFirmware,
32 SetStatusLedConfig,
33 GetStatusLedConfig,
34 GetChipTemperature,
35 Reset,
36 WriteUid,
37 ReadUid,
38 GetIdentity,
39 CallbackUsbVoltage,
40}
41impl From<HatZeroBrickFunction> for u8 {
42 fn from(fun: HatZeroBrickFunction) -> Self {
43 match fun {
44 HatZeroBrickFunction::GetUsbVoltage => 1,
45 HatZeroBrickFunction::SetUsbVoltageCallbackConfiguration => 2,
46 HatZeroBrickFunction::GetUsbVoltageCallbackConfiguration => 3,
47 HatZeroBrickFunction::GetSpitfpErrorCount => 234,
48 HatZeroBrickFunction::SetBootloaderMode => 235,
49 HatZeroBrickFunction::GetBootloaderMode => 236,
50 HatZeroBrickFunction::SetWriteFirmwarePointer => 237,
51 HatZeroBrickFunction::WriteFirmware => 238,
52 HatZeroBrickFunction::SetStatusLedConfig => 239,
53 HatZeroBrickFunction::GetStatusLedConfig => 240,
54 HatZeroBrickFunction::GetChipTemperature => 242,
55 HatZeroBrickFunction::Reset => 243,
56 HatZeroBrickFunction::WriteUid => 248,
57 HatZeroBrickFunction::ReadUid => 249,
58 HatZeroBrickFunction::GetIdentity => 255,
59 HatZeroBrickFunction::CallbackUsbVoltage => 4,
60 }
61 }
62}
63pub const HAT_ZERO_BRICK_THRESHOLD_OPTION_OFF: char = 'x';
64pub const HAT_ZERO_BRICK_THRESHOLD_OPTION_OUTSIDE: char = 'o';
65pub const HAT_ZERO_BRICK_THRESHOLD_OPTION_INSIDE: char = 'i';
66pub const HAT_ZERO_BRICK_THRESHOLD_OPTION_SMALLER: char = '<';
67pub const HAT_ZERO_BRICK_THRESHOLD_OPTION_GREATER: char = '>';
68pub const HAT_ZERO_BRICK_BOOTLOADER_MODE_BOOTLOADER: u8 = 0;
69pub const HAT_ZERO_BRICK_BOOTLOADER_MODE_FIRMWARE: u8 = 1;
70pub const HAT_ZERO_BRICK_BOOTLOADER_MODE_BOOTLOADER_WAIT_FOR_REBOOT: u8 = 2;
71pub const HAT_ZERO_BRICK_BOOTLOADER_MODE_FIRMWARE_WAIT_FOR_REBOOT: u8 = 3;
72pub const HAT_ZERO_BRICK_BOOTLOADER_MODE_FIRMWARE_WAIT_FOR_ERASE_AND_REBOOT: u8 = 4;
73pub const HAT_ZERO_BRICK_BOOTLOADER_STATUS_OK: u8 = 0;
74pub const HAT_ZERO_BRICK_BOOTLOADER_STATUS_INVALID_MODE: u8 = 1;
75pub const HAT_ZERO_BRICK_BOOTLOADER_STATUS_NO_CHANGE: u8 = 2;
76pub const HAT_ZERO_BRICK_BOOTLOADER_STATUS_ENTRY_FUNCTION_NOT_PRESENT: u8 = 3;
77pub const HAT_ZERO_BRICK_BOOTLOADER_STATUS_DEVICE_IDENTIFIER_INCORRECT: u8 = 4;
78pub const HAT_ZERO_BRICK_BOOTLOADER_STATUS_CRC_MISMATCH: u8 = 5;
79pub const HAT_ZERO_BRICK_STATUS_LED_CONFIG_OFF: u8 = 0;
80pub const HAT_ZERO_BRICK_STATUS_LED_CONFIG_ON: u8 = 1;
81pub const HAT_ZERO_BRICK_STATUS_LED_CONFIG_SHOW_HEARTBEAT: u8 = 2;
82pub const HAT_ZERO_BRICK_STATUS_LED_CONFIG_SHOW_STATUS: u8 = 3;
83
84#[derive(Clone, Copy, Debug, Default, PartialEq, Eq, Hash)]
85pub struct UsbVoltageCallbackConfiguration {
86 pub period: u32,
87 pub value_has_to_change: bool,
88 pub option: char,
89 pub min: u16,
90 pub max: u16,
91}
92impl FromByteSlice for UsbVoltageCallbackConfiguration {
93 fn bytes_expected() -> usize {
94 10
95 }
96 fn from_le_byte_slice(bytes: &[u8]) -> UsbVoltageCallbackConfiguration {
97 UsbVoltageCallbackConfiguration {
98 period: <u32>::from_le_byte_slice(&bytes[0..4]),
99 value_has_to_change: <bool>::from_le_byte_slice(&bytes[4..5]),
100 option: <char>::from_le_byte_slice(&bytes[5..6]),
101 min: <u16>::from_le_byte_slice(&bytes[6..8]),
102 max: <u16>::from_le_byte_slice(&bytes[8..10]),
103 }
104 }
105}
106
107#[derive(Clone, Copy, Debug, Default, PartialEq, Eq, Hash)]
108pub struct SpitfpErrorCount {
109 pub error_count_ack_checksum: u32,
110 pub error_count_message_checksum: u32,
111 pub error_count_frame: u32,
112 pub error_count_overflow: u32,
113}
114impl FromByteSlice for SpitfpErrorCount {
115 fn bytes_expected() -> usize {
116 16
117 }
118 fn from_le_byte_slice(bytes: &[u8]) -> SpitfpErrorCount {
119 SpitfpErrorCount {
120 error_count_ack_checksum: <u32>::from_le_byte_slice(&bytes[0..4]),
121 error_count_message_checksum: <u32>::from_le_byte_slice(&bytes[4..8]),
122 error_count_frame: <u32>::from_le_byte_slice(&bytes[8..12]),
123 error_count_overflow: <u32>::from_le_byte_slice(&bytes[12..16]),
124 }
125 }
126}
127
128#[derive(Clone, Debug, Default, PartialEq, Eq, Hash)]
129pub struct Identity {
130 pub uid: String,
131 pub connected_uid: String,
132 pub position: char,
133 pub hardware_version: [u8; 3],
134 pub firmware_version: [u8; 3],
135 pub device_identifier: u16,
136}
137impl FromByteSlice for Identity {
138 fn bytes_expected() -> usize {
139 25
140 }
141 fn from_le_byte_slice(bytes: &[u8]) -> Identity {
142 Identity {
143 uid: <String>::from_le_byte_slice(&bytes[0..8]),
144 connected_uid: <String>::from_le_byte_slice(&bytes[8..16]),
145 position: <char>::from_le_byte_slice(&bytes[16..17]),
146 hardware_version: <[u8; 3]>::from_le_byte_slice(&bytes[17..20]),
147 firmware_version: <[u8; 3]>::from_le_byte_slice(&bytes[20..23]),
148 device_identifier: <u16>::from_le_byte_slice(&bytes[23..25]),
149 }
150 }
151}
152
153#[derive(Clone)]
155pub struct HatZeroBrick {
156 device: Device,
157}
158impl HatZeroBrick {
159 pub const DEVICE_IDENTIFIER: u16 = 112;
160 pub const DEVICE_DISPLAY_NAME: &'static str = "HAT Zero Brick";
161 pub fn new(uid: Uid, connection: AsyncIpConnection) -> HatZeroBrick {
163 let mut result = HatZeroBrick { device: Device::new([2, 0, 10], uid, connection, Self::DEVICE_DISPLAY_NAME) };
164 result.device.response_expected[u8::from(HatZeroBrickFunction::GetUsbVoltage) as usize] = ResponseExpectedFlag::AlwaysTrue;
165 result.device.response_expected[u8::from(HatZeroBrickFunction::SetUsbVoltageCallbackConfiguration) as usize] =
166 ResponseExpectedFlag::True;
167 result.device.response_expected[u8::from(HatZeroBrickFunction::GetUsbVoltageCallbackConfiguration) as usize] =
168 ResponseExpectedFlag::AlwaysTrue;
169 result.device.response_expected[u8::from(HatZeroBrickFunction::GetSpitfpErrorCount) as usize] = ResponseExpectedFlag::AlwaysTrue;
170 result.device.response_expected[u8::from(HatZeroBrickFunction::SetBootloaderMode) as usize] = ResponseExpectedFlag::AlwaysTrue;
171 result.device.response_expected[u8::from(HatZeroBrickFunction::GetBootloaderMode) as usize] = ResponseExpectedFlag::AlwaysTrue;
172 result.device.response_expected[u8::from(HatZeroBrickFunction::SetWriteFirmwarePointer) as usize] = ResponseExpectedFlag::False;
173 result.device.response_expected[u8::from(HatZeroBrickFunction::WriteFirmware) as usize] = ResponseExpectedFlag::AlwaysTrue;
174 result.device.response_expected[u8::from(HatZeroBrickFunction::SetStatusLedConfig) as usize] = ResponseExpectedFlag::False;
175 result.device.response_expected[u8::from(HatZeroBrickFunction::GetStatusLedConfig) as usize] = ResponseExpectedFlag::AlwaysTrue;
176 result.device.response_expected[u8::from(HatZeroBrickFunction::GetChipTemperature) as usize] = ResponseExpectedFlag::AlwaysTrue;
177 result.device.response_expected[u8::from(HatZeroBrickFunction::Reset) as usize] = ResponseExpectedFlag::False;
178 result.device.response_expected[u8::from(HatZeroBrickFunction::WriteUid) as usize] = ResponseExpectedFlag::False;
179 result.device.response_expected[u8::from(HatZeroBrickFunction::ReadUid) as usize] = ResponseExpectedFlag::AlwaysTrue;
180 result.device.response_expected[u8::from(HatZeroBrickFunction::GetIdentity) as usize] = ResponseExpectedFlag::AlwaysTrue;
181 result
182 }
183
184 pub fn get_response_expected(&mut self, fun: HatZeroBrickFunction) -> Result<bool, GetResponseExpectedError> {
199 self.device.get_response_expected(u8::from(fun))
200 }
201
202 pub fn set_response_expected(&mut self, fun: HatZeroBrickFunction, response_expected: bool) -> Result<(), SetResponseExpectedError> {
211 self.device.set_response_expected(u8::from(fun), response_expected)
212 }
213
214 pub fn set_response_expected_all(&mut self, response_expected: bool) {
216 self.device.set_response_expected_all(response_expected)
217 }
218
219 pub fn get_api_version(&self) -> [u8; 3] {
222 self.device.api_version
223 }
224
225 pub async fn get_usb_voltage_callback_receiver(&mut self) -> impl Stream<Item = u16> {
234 self.device
235 .get_callback_receiver(u8::from(HatZeroBrickFunction::CallbackUsbVoltage))
236 .await
237 .map(|p| u16::from_le_byte_slice(p.body()))
238 }
239
240 pub async fn get_usb_voltage(&mut self) -> Result<u16, TinkerforgeError> {
247 let payload = [0; 0];
248
249 #[allow(unused_variables)]
250 let result = self.device.get(u8::from(HatZeroBrickFunction::GetUsbVoltage), &payload).await?;
251 Ok(u16::from_le_byte_slice(result.body()))
252 }
253
254 pub async fn set_usb_voltage_callback_configuration(
290 &mut self,
291 period: u32,
292 value_has_to_change: bool,
293 option: char,
294 min: u16,
295 max: u16,
296 ) -> Result<(), TinkerforgeError> {
297 let mut payload = [0; 10];
298 period.write_to_slice(&mut payload[0..4]);
299 value_has_to_change.write_to_slice(&mut payload[4..5]);
300 option.write_to_slice(&mut payload[5..6]);
301 min.write_to_slice(&mut payload[6..8]);
302 max.write_to_slice(&mut payload[8..10]);
303
304 #[allow(unused_variables)]
305 let result = self.device.set(u8::from(HatZeroBrickFunction::SetUsbVoltageCallbackConfiguration), &payload).await?;
306 Ok(())
307 }
308
309 pub async fn get_usb_voltage_callback_configuration(&mut self) -> Result<UsbVoltageCallbackConfiguration, TinkerforgeError> {
321 let payload = [0; 0];
322
323 #[allow(unused_variables)]
324 let result = self.device.get(u8::from(HatZeroBrickFunction::GetUsbVoltageCallbackConfiguration), &payload).await?;
325 Ok(UsbVoltageCallbackConfiguration::from_le_byte_slice(result.body()))
326 }
327
328 pub async fn get_spitfp_error_count(&mut self) -> Result<SpitfpErrorCount, TinkerforgeError> {
340 let payload = [0; 0];
341
342 #[allow(unused_variables)]
343 let result = self.device.get(u8::from(HatZeroBrickFunction::GetSpitfpErrorCount), &payload).await?;
344 Ok(SpitfpErrorCount::from_le_byte_slice(result.body()))
345 }
346
347 pub async fn set_bootloader_mode(&mut self, mode: u8) -> Result<u8, TinkerforgeError> {
370 let mut payload = [0; 1];
371 mode.write_to_slice(&mut payload[0..1]);
372
373 #[allow(unused_variables)]
374 let result = self.device.get(u8::from(HatZeroBrickFunction::SetBootloaderMode), &payload).await?;
375 Ok(u8::from_le_byte_slice(result.body()))
376 }
377
378 pub async fn get_bootloader_mode(&mut self) -> Result<u8, TinkerforgeError> {
387 let payload = [0; 0];
388
389 #[allow(unused_variables)]
390 let result = self.device.get(u8::from(HatZeroBrickFunction::GetBootloaderMode), &payload).await?;
391 Ok(u8::from_le_byte_slice(result.body()))
392 }
393
394 pub async fn set_write_firmware_pointer(&mut self, pointer: u32) -> Result<(), TinkerforgeError> {
401 let mut payload = [0; 4];
402 pointer.write_to_slice(&mut payload[0..4]);
403
404 #[allow(unused_variables)]
405 let result = self.device.set(u8::from(HatZeroBrickFunction::SetWriteFirmwarePointer), &payload).await?;
406 Ok(())
407 }
408
409 pub async fn write_firmware(&mut self, data: &[u8; 64]) -> Result<u8, TinkerforgeError> {
418 let mut payload = [0; 64];
419 data.write_to_slice(&mut payload[0..64]);
420
421 #[allow(unused_variables)]
422 let result = self.device.get(u8::from(HatZeroBrickFunction::WriteFirmware), &payload).await?;
423 Ok(u8::from_le_byte_slice(result.body()))
424 }
425
426 pub async fn set_status_led_config(&mut self, config: u8) -> Result<(), TinkerforgeError> {
440 let mut payload = [0; 1];
441 config.write_to_slice(&mut payload[0..1]);
442
443 #[allow(unused_variables)]
444 let result = self.device.set(u8::from(HatZeroBrickFunction::SetStatusLedConfig), &payload).await?;
445 Ok(())
446 }
447
448 pub async fn get_status_led_config(&mut self) -> Result<u8, TinkerforgeError> {
456 let payload = [0; 0];
457
458 #[allow(unused_variables)]
459 let result = self.device.get(u8::from(HatZeroBrickFunction::GetStatusLedConfig), &payload).await?;
460 Ok(u8::from_le_byte_slice(result.body()))
461 }
462
463 pub async fn get_chip_temperature(&mut self) -> Result<i16, TinkerforgeError> {
470 let payload = [0; 0];
471
472 #[allow(unused_variables)]
473 let result = self.device.get(u8::from(HatZeroBrickFunction::GetChipTemperature), &payload).await?;
474 Ok(i16::from_le_byte_slice(result.body()))
475 }
476
477 pub async fn reset(&mut self) -> Result<(), TinkerforgeError> {
484 let payload = [0; 0];
485
486 #[allow(unused_variables)]
487 let result = self.device.set(u8::from(HatZeroBrickFunction::Reset), &payload).await?;
488 Ok(())
489 }
490
491 pub async fn write_uid(&mut self, uid: u32) -> Result<(), TinkerforgeError> {
497 let mut payload = [0; 4];
498 uid.write_to_slice(&mut payload[0..4]);
499
500 #[allow(unused_variables)]
501 let result = self.device.set(u8::from(HatZeroBrickFunction::WriteUid), &payload).await?;
502 Ok(())
503 }
504
505 pub async fn read_uid(&mut self) -> Result<u32, TinkerforgeError> {
508 let payload = [0; 0];
509
510 #[allow(unused_variables)]
511 let result = self.device.get(u8::from(HatZeroBrickFunction::ReadUid), &payload).await?;
512 Ok(u32::from_le_byte_slice(result.body()))
513 }
514
515 pub async fn get_identity(&mut self) -> Result<Identity, TinkerforgeError> {
525 let payload = [0; 0];
526
527 #[allow(unused_variables)]
528 let result = self.device.get(u8::from(HatZeroBrickFunction::GetIdentity), &payload).await?;
529 Ok(Identity::from_le_byte_slice(result.body()))
530 }
531}