From 24749e6da7a92ec4344be369e66a750a7d75138e Mon Sep 17 00:00:00 2001 From: Jonas Bosse Date: Wed, 5 Nov 2025 20:41:56 +0100 Subject: fix usb-logger panic on usb disconnect --- embassy-usb-logger/CHANGELOG.md | 2 ++ embassy-usb-logger/src/lib.rs | 20 ++++++++++++++------ 2 files changed, 16 insertions(+), 6 deletions(-) diff --git a/embassy-usb-logger/CHANGELOG.md b/embassy-usb-logger/CHANGELOG.md index 4ea0e8871..3ba140b1f 100644 --- a/embassy-usb-logger/CHANGELOG.md +++ b/embassy-usb-logger/CHANGELOG.md @@ -8,6 +8,8 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 ## Unreleased - ReleaseDate +- Fixed panic in `UsbLogger` when usb is disconnected + ## 0.5.1 - 2025-08-26 ## 0.5.0 - 2025-07-22 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; use embassy_futures::join::join; use embassy_sync::pipe::Pipe; use embassy_usb::class::cdc_acm::{CdcAcmClass, Receiver, Sender, State}; -use embassy_usb::driver::Driver; +use embassy_usb::driver::{Driver, EndpointError}; use embassy_usb::{Builder, Config}; use log::{Metadata, Record}; @@ -133,17 +133,25 @@ impl UsbLogger { sender.wait_connection().await; loop { let len = self.buffer.read(&mut rx[..]).await; - let _ = sender.write_packet(&rx[..len]).await; - if len as u8 == MAX_PACKET_SIZE { - let _ = sender.write_packet(&[]).await; - } + if Err(EndpointError::Disabled) == sender.write_packet(&rx[..len]).await + || len as u8 == MAX_PACKET_SIZE && Err(EndpointError::Disabled) == sender.write_packet(&[]).await + { + sender.wait_connection().await; + }; } }; let reciever_fut = async { let mut reciever_buf: [u8; MAX_PACKET_SIZE as usize] = [0; MAX_PACKET_SIZE as usize]; receiver.wait_connection().await; loop { - let n = receiver.read_packet(&mut reciever_buf).await.unwrap(); + let n = match receiver.read_packet(&mut reciever_buf).await { + Err(EndpointError::Disabled) => { + receiver.wait_connection().await; + continue; + } + Err(_) => continue, + Ok(n) => n, + }; match &self.recieve_handler { Some(handler) => { let data = &reciever_buf[..n]; -- cgit