aboutsummaryrefslogtreecommitdiff
path: root/embassy-usb/src/class/cdc_acm.rs
diff options
context:
space:
mode:
Diffstat (limited to 'embassy-usb/src/class/cdc_acm.rs')
-rw-r--r--embassy-usb/src/class/cdc_acm.rs19
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
3use core::cell::{Cell, RefCell}; 3use core::cell::{Cell, RefCell};
4use core::future::{poll_fn, Future}; 4use core::future::{Future, poll_fn};
5use core::mem::{self, MaybeUninit}; 5use core::mem::{self, MaybeUninit};
6use core::sync::atomic::{AtomicBool, Ordering}; 6use core::sync::atomic::{AtomicBool, Ordering};
7use core::task::Poll; 7use 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}