diff options
| author | Jonas Bosse <[email protected]> | 2025-11-05 20:41:56 +0100 |
|---|---|---|
| committer | Jonas Bosse <[email protected]> | 2025-11-05 21:14:50 +0100 |
| commit | 24749e6da7a92ec4344be369e66a750a7d75138e (patch) | |
| tree | 793bc27164517decae55517f05a45dde3f8cd124 /embassy-usb-logger/src/lib.rs | |
| parent | 51f8aeaa0dd2359a669a3c38d194a8a70f26441f (diff) | |
fix usb-logger panic on usb disconnect
Diffstat (limited to 'embassy-usb-logger/src/lib.rs')
| -rw-r--r-- | embassy-usb-logger/src/lib.rs | 20 |
1 files changed, 14 insertions, 6 deletions
diff --git a/embassy-usb-logger/src/lib.rs b/embassy-usb-logger/src/lib.rs index de25abce1..7c3c5e709 100644 --- a/embassy-usb-logger/src/lib.rs +++ b/embassy-usb-logger/src/lib.rs | |||
| @@ -8,7 +8,7 @@ use core::future::Future; | |||
| 8 | use embassy_futures::join::join; | 8 | use embassy_futures::join::join; |
| 9 | use embassy_sync::pipe::Pipe; | 9 | use embassy_sync::pipe::Pipe; |
| 10 | use embassy_usb::class::cdc_acm::{CdcAcmClass, Receiver, Sender, State}; | 10 | use embassy_usb::class::cdc_acm::{CdcAcmClass, Receiver, Sender, State}; |
| 11 | use embassy_usb::driver::Driver; | 11 | use embassy_usb::driver::{Driver, EndpointError}; |
| 12 | use embassy_usb::{Builder, Config}; | 12 | use embassy_usb::{Builder, Config}; |
| 13 | use log::{Metadata, Record}; | 13 | use log::{Metadata, Record}; |
| 14 | 14 | ||
| @@ -133,17 +133,25 @@ impl<const N: usize, T: ReceiverHandler + Send + Sync> UsbLogger<N, T> { | |||
| 133 | sender.wait_connection().await; | 133 | sender.wait_connection().await; |
| 134 | loop { | 134 | loop { |
| 135 | let len = self.buffer.read(&mut rx[..]).await; | 135 | let len = self.buffer.read(&mut rx[..]).await; |
| 136 | let _ = sender.write_packet(&rx[..len]).await; | 136 | if Err(EndpointError::Disabled) == sender.write_packet(&rx[..len]).await |
| 137 | if len as u8 == MAX_PACKET_SIZE { | 137 | || len as u8 == MAX_PACKET_SIZE && Err(EndpointError::Disabled) == sender.write_packet(&[]).await |
| 138 | let _ = sender.write_packet(&[]).await; | 138 | { |
| 139 | } | 139 | sender.wait_connection().await; |
| 140 | }; | ||
| 140 | } | 141 | } |
| 141 | }; | 142 | }; |
| 142 | let reciever_fut = async { | 143 | let reciever_fut = async { |
| 143 | let mut reciever_buf: [u8; MAX_PACKET_SIZE as usize] = [0; MAX_PACKET_SIZE as usize]; | 144 | let mut reciever_buf: [u8; MAX_PACKET_SIZE as usize] = [0; MAX_PACKET_SIZE as usize]; |
| 144 | receiver.wait_connection().await; | 145 | receiver.wait_connection().await; |
| 145 | loop { | 146 | loop { |
| 146 | let n = receiver.read_packet(&mut reciever_buf).await.unwrap(); | 147 | let n = match receiver.read_packet(&mut reciever_buf).await { |
| 148 | Err(EndpointError::Disabled) => { | ||
| 149 | receiver.wait_connection().await; | ||
| 150 | continue; | ||
| 151 | } | ||
| 152 | Err(_) => continue, | ||
| 153 | Ok(n) => n, | ||
| 154 | }; | ||
| 147 | match &self.recieve_handler { | 155 | match &self.recieve_handler { |
| 148 | Some(handler) => { | 156 | Some(handler) => { |
| 149 | let data = &reciever_buf[..n]; | 157 | let data = &reciever_buf[..n]; |
