ariel_os::reexports::embassy_usb::class::cdc_acm

Struct CdcAcmClass

pub struct CdcAcmClass<'d, D>
where D: Driver<'d>,
{ /* private fields */ }
Expand description

Packet level implementation of a CDC-ACM serial port.

This class can be used directly and it has the least overhead due to directly reading and writing USB packets with no intermediate buffers, but it will not act like a stream-like serial port. The following constraints must be followed if you use this class directly:

  • read_packet must be called with a buffer large enough to hold max_packet_size bytes.
  • write_packet must not be called with a buffer larger than max_packet_size bytes.
  • If you write a packet that is exactly max_packet_size bytes long, it won’t be processed by the host operating system until a subsequent shorter packet is sent. A zero-length packet (ZLP) can be sent if there is no other data to send. This is because USB bulk transactions must be terminated with a short packet, even if the bulk endpoint is used for stream-like data.

Implementations§

§

impl<'d, D> CdcAcmClass<'d, D>
where D: Driver<'d>,

pub fn new( builder: &mut Builder<'d, D>, state: &'d mut State<'d>, max_packet_size: u16, ) -> CdcAcmClass<'d, D>

Creates a new CdcAcmClass with the provided UsbBus and max_packet_size in bytes. For full-speed devices, max_packet_size has to be one of 8, 16, 32 or 64.

pub fn max_packet_size(&self) -> u16

Gets the maximum packet size in bytes.

pub fn line_coding(&self) -> LineCoding

Gets the current line coding. The line coding contains information that’s mainly relevant for USB to UART serial port emulators, and can be ignored if not relevant.

pub fn dtr(&self) -> bool

Gets the DTR (data terminal ready) state

pub fn rts(&self) -> bool

Gets the RTS (request to send) state

pub async fn write_packet(&mut self, data: &[u8]) -> Result<(), EndpointError>

Writes a single packet into the IN endpoint.

pub async fn read_packet( &mut self, data: &mut [u8], ) -> Result<usize, EndpointError>

Reads a single packet from the OUT endpoint.

pub async fn wait_connection(&mut self)

Waits for the USB host to enable this interface

pub fn split(self) -> (Sender<'d, D>, Receiver<'d, D>)

Split the class into a sender and receiver.

This allows concurrently sending and receiving packets from separate tasks.

pub fn split_with_control( self, ) -> (Sender<'d, D>, Receiver<'d, D>, ControlChanged<'d>)

Split the class into sender, receiver and control

Allows concurrently sending and receiving packets whilst monitoring for control changes (dtr, rts)

Auto Trait Implementations§

§

impl<'d, D> Freeze for CdcAcmClass<'d, D>
where <D as Driver<'d>>::EndpointIn: Freeze, <D as Driver<'d>>::EndpointOut: Freeze,

§

impl<'d, D> !RefUnwindSafe for CdcAcmClass<'d, D>

§

impl<'d, D> !Send for CdcAcmClass<'d, D>

§

impl<'d, D> !Sync for CdcAcmClass<'d, D>

§

impl<'d, D> Unpin for CdcAcmClass<'d, D>
where <D as Driver<'d>>::EndpointIn: Unpin, <D as Driver<'d>>::EndpointOut: Unpin,

§

impl<'d, D> !UnwindSafe for CdcAcmClass<'d, D>

Blanket Implementations§

Source§

impl<T> Any for T
where T: 'static + ?Sized,

Source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
Source§

impl<T> Borrow<T> for T
where T: ?Sized,

Source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
Source§

impl<T> BorrowMut<T> for T
where T: ?Sized,

Source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
Source§

impl<T> From<T> for T

Source§

fn from(t: T) -> T

Returns the argument unchanged.

§

impl<T, W> HasTypeWitness<W> for T
where W: MakeTypeWitness<Arg = T>, T: ?Sized,

§

const WITNESS: W = W::MAKE

A constant of the type witness
§

impl<T> Identity for T
where T: ?Sized,

§

const TYPE_EQ: TypeEq<T, <T as Identity>::Type> = TypeEq::NEW

Proof that Self is the same type as Self::Type, provides methods for casting between Self and Self::Type.
§

type Type = T

The same type as Self, used to emulate type equality bounds (T == U) with associated type equality constraints (T: Identity<Type = U>).
Source§

impl<T, U> Into<U> for T
where U: From<T>,

Source§

fn into(self) -> U

Calls U::from(self).

That is, this conversion is whatever the implementation of From<T> for U chooses to do.

Source§

impl<T> Same for T

Source§

type Output = T

Should always be Self
Source§

impl<T, U> TryFrom<U> for T
where U: Into<T>,

Source§

type Error = Infallible

The type returned in the event of a conversion error.
Source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
Source§

impl<T, U> TryInto<U> for T
where U: TryFrom<T>,

Source§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
Source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
§

impl<V, T> VZip<V> for T
where V: MultiLane<T>,

§

fn vzip(self) -> V