diff options
Diffstat (limited to 'embassy-usb/src/class/cdc_acm.rs')
| -rw-r--r-- | embassy-usb/src/class/cdc_acm.rs | 19 |
1 files changed, 16 insertions, 3 deletions
diff --git a/embassy-usb/src/class/cdc_acm.rs b/embassy-usb/src/class/cdc_acm.rs index 0a1a5e64f..ab2311f4e 100644 --- a/embassy-usb/src/class/cdc_acm.rs +++ b/embassy-usb/src/class/cdc_acm.rs | |||
| @@ -1,7 +1,7 @@ | |||
| 1 | //! CDC-ACM class implementation, aka Serial over USB. | 1 | //! CDC-ACM class implementation, aka Serial over USB. |
| 2 | 2 | ||
| 3 | use core::cell::{Cell, RefCell}; | 3 | use core::cell::{Cell, RefCell}; |
| 4 | use core::future::{poll_fn, Future}; | 4 | use core::future::{Future, poll_fn}; |
| 5 | use core::mem::{self, MaybeUninit}; | 5 | use core::mem::{self, MaybeUninit}; |
| 6 | use core::sync::atomic::{AtomicBool, Ordering}; | 6 | use core::sync::atomic::{AtomicBool, Ordering}; |
| 7 | use core::task::Poll; | 7 | use core::task::Poll; |
| @@ -366,6 +366,16 @@ impl<'d> ControlChanged<'d> { | |||
| 366 | pub async fn control_changed(&self) { | 366 | pub async fn control_changed(&self) { |
| 367 | self.control.changed().await; | 367 | self.control.changed().await; |
| 368 | } | 368 | } |
| 369 | |||
| 370 | /// Gets the DTR (data terminal ready) state | ||
| 371 | pub fn dtr(&self) -> bool { | ||
| 372 | self.control.dtr.load(Ordering::Relaxed) | ||
| 373 | } | ||
| 374 | |||
| 375 | /// Gets the RTS (request to send) state | ||
| 376 | pub fn rts(&self) -> bool { | ||
| 377 | self.control.rts.load(Ordering::Relaxed) | ||
| 378 | } | ||
| 369 | } | 379 | } |
| 370 | 380 | ||
| 371 | /// CDC ACM class packet sender. | 381 | /// CDC ACM class packet sender. |
| @@ -545,9 +555,12 @@ impl<'d, D: Driver<'d>> embedded_io_async::Read for BufferedReceiver<'d, D> { | |||
| 545 | return self.receiver.read_packet(buf).await; | 555 | return self.receiver.read_packet(buf).await; |
| 546 | } | 556 | } |
| 547 | 557 | ||
| 548 | // Otherwise read a packet into the internal buffer, and return some of it to the caller | 558 | // Otherwise read a packet into the internal buffer, and return some of it to the caller. |
| 549 | self.start = 0; | 559 | // |
| 560 | // It's important that `start` and `end` be updated in this order so they're left in a | ||
| 561 | // consistent state if the `read` future is dropped mid-execution, e.g. from a timeout. | ||
| 550 | self.end = self.receiver.read_packet(&mut self.buffer).await?; | 562 | self.end = self.receiver.read_packet(&mut self.buffer).await?; |
| 563 | self.start = 0; | ||
| 551 | return Ok(self.read_from_buffer(buf)); | 564 | return Ok(self.read_from_buffer(buf)); |
| 552 | } | 565 | } |
| 553 | } | 566 | } |
