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 PiezoSpeakerV2BrickletFunction {
24 SetBeep,
25 GetBeep,
26 SetAlarm,
27 GetAlarm,
28 UpdateVolume,
29 UpdateFrequency,
30 GetSpitfpErrorCount,
31 SetBootloaderMode,
32 GetBootloaderMode,
33 SetWriteFirmwarePointer,
34 WriteFirmware,
35 SetStatusLedConfig,
36 GetStatusLedConfig,
37 GetChipTemperature,
38 Reset,
39 WriteUid,
40 ReadUid,
41 GetIdentity,
42 CallbackBeepFinished,
43 CallbackAlarmFinished,
44}
45impl From<PiezoSpeakerV2BrickletFunction> for u8 {
46 fn from(fun: PiezoSpeakerV2BrickletFunction) -> Self {
47 match fun {
48 PiezoSpeakerV2BrickletFunction::SetBeep => 1,
49 PiezoSpeakerV2BrickletFunction::GetBeep => 2,
50 PiezoSpeakerV2BrickletFunction::SetAlarm => 3,
51 PiezoSpeakerV2BrickletFunction::GetAlarm => 4,
52 PiezoSpeakerV2BrickletFunction::UpdateVolume => 5,
53 PiezoSpeakerV2BrickletFunction::UpdateFrequency => 6,
54 PiezoSpeakerV2BrickletFunction::GetSpitfpErrorCount => 234,
55 PiezoSpeakerV2BrickletFunction::SetBootloaderMode => 235,
56 PiezoSpeakerV2BrickletFunction::GetBootloaderMode => 236,
57 PiezoSpeakerV2BrickletFunction::SetWriteFirmwarePointer => 237,
58 PiezoSpeakerV2BrickletFunction::WriteFirmware => 238,
59 PiezoSpeakerV2BrickletFunction::SetStatusLedConfig => 239,
60 PiezoSpeakerV2BrickletFunction::GetStatusLedConfig => 240,
61 PiezoSpeakerV2BrickletFunction::GetChipTemperature => 242,
62 PiezoSpeakerV2BrickletFunction::Reset => 243,
63 PiezoSpeakerV2BrickletFunction::WriteUid => 248,
64 PiezoSpeakerV2BrickletFunction::ReadUid => 249,
65 PiezoSpeakerV2BrickletFunction::GetIdentity => 255,
66 PiezoSpeakerV2BrickletFunction::CallbackBeepFinished => 7,
67 PiezoSpeakerV2BrickletFunction::CallbackAlarmFinished => 8,
68 }
69 }
70}
71pub const PIEZO_SPEAKER_V2_BRICKLET_BEEP_DURATION_OFF: u32 = 0;
72pub const PIEZO_SPEAKER_V2_BRICKLET_BEEP_DURATION_INFINITE: u32 = 4_294_967_295;
73pub const PIEZO_SPEAKER_V2_BRICKLET_ALARM_DURATION_OFF: u32 = 0;
74pub const PIEZO_SPEAKER_V2_BRICKLET_ALARM_DURATION_INFINITE: u32 = 4_294_967_295;
75pub const PIEZO_SPEAKER_V2_BRICKLET_BOOTLOADER_MODE_BOOTLOADER: u8 = 0;
76pub const PIEZO_SPEAKER_V2_BRICKLET_BOOTLOADER_MODE_FIRMWARE: u8 = 1;
77pub const PIEZO_SPEAKER_V2_BRICKLET_BOOTLOADER_MODE_BOOTLOADER_WAIT_FOR_REBOOT: u8 = 2;
78pub const PIEZO_SPEAKER_V2_BRICKLET_BOOTLOADER_MODE_FIRMWARE_WAIT_FOR_REBOOT: u8 = 3;
79pub const PIEZO_SPEAKER_V2_BRICKLET_BOOTLOADER_MODE_FIRMWARE_WAIT_FOR_ERASE_AND_REBOOT: u8 = 4;
80pub const PIEZO_SPEAKER_V2_BRICKLET_BOOTLOADER_STATUS_OK: u8 = 0;
81pub const PIEZO_SPEAKER_V2_BRICKLET_BOOTLOADER_STATUS_INVALID_MODE: u8 = 1;
82pub const PIEZO_SPEAKER_V2_BRICKLET_BOOTLOADER_STATUS_NO_CHANGE: u8 = 2;
83pub const PIEZO_SPEAKER_V2_BRICKLET_BOOTLOADER_STATUS_ENTRY_FUNCTION_NOT_PRESENT: u8 = 3;
84pub const PIEZO_SPEAKER_V2_BRICKLET_BOOTLOADER_STATUS_DEVICE_IDENTIFIER_INCORRECT: u8 = 4;
85pub const PIEZO_SPEAKER_V2_BRICKLET_BOOTLOADER_STATUS_CRC_MISMATCH: u8 = 5;
86pub const PIEZO_SPEAKER_V2_BRICKLET_STATUS_LED_CONFIG_OFF: u8 = 0;
87pub const PIEZO_SPEAKER_V2_BRICKLET_STATUS_LED_CONFIG_ON: u8 = 1;
88pub const PIEZO_SPEAKER_V2_BRICKLET_STATUS_LED_CONFIG_SHOW_HEARTBEAT: u8 = 2;
89pub const PIEZO_SPEAKER_V2_BRICKLET_STATUS_LED_CONFIG_SHOW_STATUS: u8 = 3;
90
91#[derive(Clone, Copy, Debug, Default, PartialEq, Eq, Hash)]
92pub struct Beep {
93 pub frequency: u16,
94 pub volume: u8,
95 pub duration: u32,
96 pub duration_remaining: u32,
97}
98impl FromByteSlice for Beep {
99 fn bytes_expected() -> usize {
100 11
101 }
102 fn from_le_byte_slice(bytes: &[u8]) -> Beep {
103 Beep {
104 frequency: <u16>::from_le_byte_slice(&bytes[0..2]),
105 volume: <u8>::from_le_byte_slice(&bytes[2..3]),
106 duration: <u32>::from_le_byte_slice(&bytes[3..7]),
107 duration_remaining: <u32>::from_le_byte_slice(&bytes[7..11]),
108 }
109 }
110}
111
112#[derive(Clone, Copy, Debug, Default, PartialEq, Eq, Hash)]
113pub struct Alarm {
114 pub start_frequency: u16,
115 pub end_frequency: u16,
116 pub step_size: u16,
117 pub step_delay: u16,
118 pub volume: u8,
119 pub duration: u32,
120 pub duration_remaining: u32,
121 pub current_frequency: u16,
122}
123impl FromByteSlice for Alarm {
124 fn bytes_expected() -> usize {
125 19
126 }
127 fn from_le_byte_slice(bytes: &[u8]) -> Alarm {
128 Alarm {
129 start_frequency: <u16>::from_le_byte_slice(&bytes[0..2]),
130 end_frequency: <u16>::from_le_byte_slice(&bytes[2..4]),
131 step_size: <u16>::from_le_byte_slice(&bytes[4..6]),
132 step_delay: <u16>::from_le_byte_slice(&bytes[6..8]),
133 volume: <u8>::from_le_byte_slice(&bytes[8..9]),
134 duration: <u32>::from_le_byte_slice(&bytes[9..13]),
135 duration_remaining: <u32>::from_le_byte_slice(&bytes[13..17]),
136 current_frequency: <u16>::from_le_byte_slice(&bytes[17..19]),
137 }
138 }
139}
140
141#[derive(Clone, Copy, Debug, Default, PartialEq, Eq, Hash)]
142pub struct SpitfpErrorCount {
143 pub error_count_ack_checksum: u32,
144 pub error_count_message_checksum: u32,
145 pub error_count_frame: u32,
146 pub error_count_overflow: u32,
147}
148impl FromByteSlice for SpitfpErrorCount {
149 fn bytes_expected() -> usize {
150 16
151 }
152 fn from_le_byte_slice(bytes: &[u8]) -> SpitfpErrorCount {
153 SpitfpErrorCount {
154 error_count_ack_checksum: <u32>::from_le_byte_slice(&bytes[0..4]),
155 error_count_message_checksum: <u32>::from_le_byte_slice(&bytes[4..8]),
156 error_count_frame: <u32>::from_le_byte_slice(&bytes[8..12]),
157 error_count_overflow: <u32>::from_le_byte_slice(&bytes[12..16]),
158 }
159 }
160}
161
162#[derive(Clone, Debug, Default, PartialEq, Eq, Hash)]
163pub struct Identity {
164 pub uid: String,
165 pub connected_uid: String,
166 pub position: char,
167 pub hardware_version: [u8; 3],
168 pub firmware_version: [u8; 3],
169 pub device_identifier: u16,
170}
171impl FromByteSlice for Identity {
172 fn bytes_expected() -> usize {
173 25
174 }
175 fn from_le_byte_slice(bytes: &[u8]) -> Identity {
176 Identity {
177 uid: <String>::from_le_byte_slice(&bytes[0..8]),
178 connected_uid: <String>::from_le_byte_slice(&bytes[8..16]),
179 position: <char>::from_le_byte_slice(&bytes[16..17]),
180 hardware_version: <[u8; 3]>::from_le_byte_slice(&bytes[17..20]),
181 firmware_version: <[u8; 3]>::from_le_byte_slice(&bytes[20..23]),
182 device_identifier: <u16>::from_le_byte_slice(&bytes[23..25]),
183 }
184 }
185}
186
187#[derive(Clone)]
189pub struct PiezoSpeakerV2Bricklet {
190 device: Device,
191}
192impl PiezoSpeakerV2Bricklet {
193 pub const DEVICE_IDENTIFIER: u16 = 2145;
194 pub const DEVICE_DISPLAY_NAME: &'static str = "Piezo Speaker Bricklet 2.0";
195 pub fn new(uid: Uid, connection: AsyncIpConnection) -> PiezoSpeakerV2Bricklet {
197 let mut result = PiezoSpeakerV2Bricklet { device: Device::new([2, 0, 10], uid, connection, Self::DEVICE_DISPLAY_NAME) };
198 result.device.response_expected[u8::from(PiezoSpeakerV2BrickletFunction::SetBeep) as usize] = ResponseExpectedFlag::False;
199 result.device.response_expected[u8::from(PiezoSpeakerV2BrickletFunction::GetBeep) as usize] = ResponseExpectedFlag::AlwaysTrue;
200 result.device.response_expected[u8::from(PiezoSpeakerV2BrickletFunction::SetAlarm) as usize] = ResponseExpectedFlag::False;
201 result.device.response_expected[u8::from(PiezoSpeakerV2BrickletFunction::GetAlarm) as usize] = ResponseExpectedFlag::AlwaysTrue;
202 result.device.response_expected[u8::from(PiezoSpeakerV2BrickletFunction::UpdateVolume) as usize] = ResponseExpectedFlag::False;
203 result.device.response_expected[u8::from(PiezoSpeakerV2BrickletFunction::UpdateFrequency) as usize] = ResponseExpectedFlag::False;
204 result.device.response_expected[u8::from(PiezoSpeakerV2BrickletFunction::GetSpitfpErrorCount) as usize] =
205 ResponseExpectedFlag::AlwaysTrue;
206 result.device.response_expected[u8::from(PiezoSpeakerV2BrickletFunction::SetBootloaderMode) as usize] =
207 ResponseExpectedFlag::AlwaysTrue;
208 result.device.response_expected[u8::from(PiezoSpeakerV2BrickletFunction::GetBootloaderMode) as usize] =
209 ResponseExpectedFlag::AlwaysTrue;
210 result.device.response_expected[u8::from(PiezoSpeakerV2BrickletFunction::SetWriteFirmwarePointer) as usize] =
211 ResponseExpectedFlag::False;
212 result.device.response_expected[u8::from(PiezoSpeakerV2BrickletFunction::WriteFirmware) as usize] =
213 ResponseExpectedFlag::AlwaysTrue;
214 result.device.response_expected[u8::from(PiezoSpeakerV2BrickletFunction::SetStatusLedConfig) as usize] =
215 ResponseExpectedFlag::False;
216 result.device.response_expected[u8::from(PiezoSpeakerV2BrickletFunction::GetStatusLedConfig) as usize] =
217 ResponseExpectedFlag::AlwaysTrue;
218 result.device.response_expected[u8::from(PiezoSpeakerV2BrickletFunction::GetChipTemperature) as usize] =
219 ResponseExpectedFlag::AlwaysTrue;
220 result.device.response_expected[u8::from(PiezoSpeakerV2BrickletFunction::Reset) as usize] = ResponseExpectedFlag::False;
221 result.device.response_expected[u8::from(PiezoSpeakerV2BrickletFunction::WriteUid) as usize] = ResponseExpectedFlag::False;
222 result.device.response_expected[u8::from(PiezoSpeakerV2BrickletFunction::ReadUid) as usize] = ResponseExpectedFlag::AlwaysTrue;
223 result.device.response_expected[u8::from(PiezoSpeakerV2BrickletFunction::GetIdentity) as usize] = ResponseExpectedFlag::AlwaysTrue;
224 result
225 }
226
227 pub fn get_response_expected(&mut self, fun: PiezoSpeakerV2BrickletFunction) -> Result<bool, GetResponseExpectedError> {
242 self.device.get_response_expected(u8::from(fun))
243 }
244
245 pub fn set_response_expected(
254 &mut self,
255 fun: PiezoSpeakerV2BrickletFunction,
256 response_expected: bool,
257 ) -> Result<(), SetResponseExpectedError> {
258 self.device.set_response_expected(u8::from(fun), response_expected)
259 }
260
261 pub fn set_response_expected_all(&mut self, response_expected: bool) {
263 self.device.set_response_expected_all(response_expected)
264 }
265
266 pub fn get_api_version(&self) -> [u8; 3] {
269 self.device.api_version
270 }
271
272 pub async fn get_beep_finished_callback_receiver(&mut self) -> impl Stream<Item = ()> {
276 self.device.get_callback_receiver(u8::from(PiezoSpeakerV2BrickletFunction::CallbackBeepFinished)).await.map(|_p| ())
277 }
278
279 pub async fn get_alarm_finished_callback_receiver(&mut self) -> impl Stream<Item = ()> {
281 self.device.get_callback_receiver(u8::from(PiezoSpeakerV2BrickletFunction::CallbackAlarmFinished)).await.map(|_p| ())
282 }
283
284 pub async fn set_beep(&mut self, frequency: u16, volume: u8, duration: u32) -> Result<(), TinkerforgeError> {
293 let mut payload = [0; 7];
294 frequency.write_to_slice(&mut payload[0..2]);
295 volume.write_to_slice(&mut payload[2..3]);
296 duration.write_to_slice(&mut payload[3..7]);
297
298 #[allow(unused_variables)]
299 let result = self.device.set(u8::from(PiezoSpeakerV2BrickletFunction::SetBeep), &payload).await?;
300 Ok(())
301 }
302
303 pub async fn get_beep(&mut self) -> Result<Beep, TinkerforgeError> {
313 let payload = [0; 0];
314
315 #[allow(unused_variables)]
316 let result = self.device.get(u8::from(PiezoSpeakerV2BrickletFunction::GetBeep), &payload).await?;
317 Ok(Beep::from_le_byte_slice(result.body()))
318 }
319
320 pub async fn set_alarm(
365 &mut self,
366 start_frequency: u16,
367 end_frequency: u16,
368 step_size: u16,
369 step_delay: u16,
370 volume: u8,
371 duration: u32,
372 ) -> Result<(), TinkerforgeError> {
373 let mut payload = [0; 13];
374 start_frequency.write_to_slice(&mut payload[0..2]);
375 end_frequency.write_to_slice(&mut payload[2..4]);
376 step_size.write_to_slice(&mut payload[4..6]);
377 step_delay.write_to_slice(&mut payload[6..8]);
378 volume.write_to_slice(&mut payload[8..9]);
379 duration.write_to_slice(&mut payload[9..13]);
380
381 #[allow(unused_variables)]
382 let result = self.device.set(u8::from(PiezoSpeakerV2BrickletFunction::SetAlarm), &payload).await?;
383 Ok(())
384 }
385
386 pub async fn get_alarm(&mut self) -> Result<Alarm, TinkerforgeError> {
397 let payload = [0; 0];
398
399 #[allow(unused_variables)]
400 let result = self.device.get(u8::from(PiezoSpeakerV2BrickletFunction::GetAlarm), &payload).await?;
401 Ok(Alarm::from_le_byte_slice(result.body()))
402 }
403
404 pub async fn update_volume(&mut self, volume: u8) -> Result<(), TinkerforgeError> {
406 let mut payload = [0; 1];
407 volume.write_to_slice(&mut payload[0..1]);
408
409 #[allow(unused_variables)]
410 let result = self.device.set(u8::from(PiezoSpeakerV2BrickletFunction::UpdateVolume), &payload).await?;
411 Ok(())
412 }
413
414 pub async fn update_frequency(&mut self, frequency: u16) -> Result<(), TinkerforgeError> {
416 let mut payload = [0; 2];
417 frequency.write_to_slice(&mut payload[0..2]);
418
419 #[allow(unused_variables)]
420 let result = self.device.set(u8::from(PiezoSpeakerV2BrickletFunction::UpdateFrequency), &payload).await?;
421 Ok(())
422 }
423
424 pub async fn get_spitfp_error_count(&mut self) -> Result<SpitfpErrorCount, TinkerforgeError> {
436 let payload = [0; 0];
437
438 #[allow(unused_variables)]
439 let result = self.device.get(u8::from(PiezoSpeakerV2BrickletFunction::GetSpitfpErrorCount), &payload).await?;
440 Ok(SpitfpErrorCount::from_le_byte_slice(result.body()))
441 }
442
443 pub async fn set_bootloader_mode(&mut self, mode: u8) -> Result<u8, TinkerforgeError> {
466 let mut payload = [0; 1];
467 mode.write_to_slice(&mut payload[0..1]);
468
469 #[allow(unused_variables)]
470 let result = self.device.get(u8::from(PiezoSpeakerV2BrickletFunction::SetBootloaderMode), &payload).await?;
471 Ok(u8::from_le_byte_slice(result.body()))
472 }
473
474 pub async fn get_bootloader_mode(&mut self) -> Result<u8, TinkerforgeError> {
483 let payload = [0; 0];
484
485 #[allow(unused_variables)]
486 let result = self.device.get(u8::from(PiezoSpeakerV2BrickletFunction::GetBootloaderMode), &payload).await?;
487 Ok(u8::from_le_byte_slice(result.body()))
488 }
489
490 pub async fn set_write_firmware_pointer(&mut self, pointer: u32) -> Result<(), TinkerforgeError> {
497 let mut payload = [0; 4];
498 pointer.write_to_slice(&mut payload[0..4]);
499
500 #[allow(unused_variables)]
501 let result = self.device.set(u8::from(PiezoSpeakerV2BrickletFunction::SetWriteFirmwarePointer), &payload).await?;
502 Ok(())
503 }
504
505 pub async fn write_firmware(&mut self, data: &[u8; 64]) -> Result<u8, TinkerforgeError> {
514 let mut payload = [0; 64];
515 data.write_to_slice(&mut payload[0..64]);
516
517 #[allow(unused_variables)]
518 let result = self.device.get(u8::from(PiezoSpeakerV2BrickletFunction::WriteFirmware), &payload).await?;
519 Ok(u8::from_le_byte_slice(result.body()))
520 }
521
522 pub async fn set_status_led_config(&mut self, config: u8) -> Result<(), TinkerforgeError> {
536 let mut payload = [0; 1];
537 config.write_to_slice(&mut payload[0..1]);
538
539 #[allow(unused_variables)]
540 let result = self.device.set(u8::from(PiezoSpeakerV2BrickletFunction::SetStatusLedConfig), &payload).await?;
541 Ok(())
542 }
543
544 pub async fn get_status_led_config(&mut self) -> Result<u8, TinkerforgeError> {
552 let payload = [0; 0];
553
554 #[allow(unused_variables)]
555 let result = self.device.get(u8::from(PiezoSpeakerV2BrickletFunction::GetStatusLedConfig), &payload).await?;
556 Ok(u8::from_le_byte_slice(result.body()))
557 }
558
559 pub async fn get_chip_temperature(&mut self) -> Result<i16, TinkerforgeError> {
566 let payload = [0; 0];
567
568 #[allow(unused_variables)]
569 let result = self.device.get(u8::from(PiezoSpeakerV2BrickletFunction::GetChipTemperature), &payload).await?;
570 Ok(i16::from_le_byte_slice(result.body()))
571 }
572
573 pub async fn reset(&mut self) -> Result<(), TinkerforgeError> {
580 let payload = [0; 0];
581
582 #[allow(unused_variables)]
583 let result = self.device.set(u8::from(PiezoSpeakerV2BrickletFunction::Reset), &payload).await?;
584 Ok(())
585 }
586
587 pub async fn write_uid(&mut self, uid: u32) -> Result<(), TinkerforgeError> {
593 let mut payload = [0; 4];
594 uid.write_to_slice(&mut payload[0..4]);
595
596 #[allow(unused_variables)]
597 let result = self.device.set(u8::from(PiezoSpeakerV2BrickletFunction::WriteUid), &payload).await?;
598 Ok(())
599 }
600
601 pub async fn read_uid(&mut self) -> Result<u32, TinkerforgeError> {
604 let payload = [0; 0];
605
606 #[allow(unused_variables)]
607 let result = self.device.get(u8::from(PiezoSpeakerV2BrickletFunction::ReadUid), &payload).await?;
608 Ok(u32::from_le_byte_slice(result.body()))
609 }
610
611 pub async fn get_identity(&mut self) -> Result<Identity, TinkerforgeError> {
622 let payload = [0; 0];
623
624 #[allow(unused_variables)]
625 let result = self.device.get(u8::from(PiezoSpeakerV2BrickletFunction::GetIdentity), &payload).await?;
626 Ok(Identity::from_le_byte_slice(result.body()))
627 }
628}