aboutsummaryrefslogtreecommitdiff
path: root/embassy-usb-logger/src/lib.rs
diff options
context:
space:
mode:
authorJomer.Dev <[email protected]>2024-01-08 00:20:40 +0100
committerJomer.Dev <[email protected]>2024-01-08 00:20:40 +0100
commit1f57692d042de781f884d50f0cbd9eea0c71626d (patch)
treefcfd793713e5ae1059502cdf977eb1da5977b280 /embassy-usb-logger/src/lib.rs
parent8e7f477b01507044471b0b247aea1db52716a765 (diff)
Add function to create logger from class
Diffstat (limited to 'embassy-usb-logger/src/lib.rs')
-rw-r--r--embassy-usb-logger/src/lib.rs54
1 files changed, 54 insertions, 0 deletions
diff --git a/embassy-usb-logger/src/lib.rs b/embassy-usb-logger/src/lib.rs
index 45d780bf8..422cefb59 100644
--- a/embassy-usb-logger/src/lib.rs
+++ b/embassy-usb-logger/src/lib.rs
@@ -105,6 +105,34 @@ impl<const N: usize> UsbLogger<N> {
105 join(run_fut, join(log_fut, discard_fut)).await; 105 join(run_fut, join(log_fut, discard_fut)).await;
106 } 106 }
107 } 107 }
108
109 // Creates the futures needed for the logger from a given class
110 pub async fn create_future_from_class<'d, D>(&'d self, class: CdcAcmClass<'d, D> )
111 where
112 D: Driver<'d>,
113 {
114 const MAX_PACKET_SIZE: u8 = 64;
115 let (mut sender, mut receiver) = class.split();
116
117 loop {
118 let log_fut = async {
119 let mut rx: [u8; MAX_PACKET_SIZE as usize] = [0; MAX_PACKET_SIZE as usize];
120 sender.wait_connection().await;
121 loop {
122 let len = self.buffer.read(&mut rx[..]).await;
123 let _ = sender.write_packet(&rx[..len]).await;
124 }
125 };
126 let discard_fut = async {
127 let mut discard_buf: [u8; MAX_PACKET_SIZE as usize] = [0; MAX_PACKET_SIZE as usize];
128 receiver.wait_connection().await;
129 loop {
130 let _ = receiver.read_packet(&mut discard_buf).await;
131 }
132 };
133 join(log_fut, discard_fut).await;
134 }
135 }
108} 136}
109 137
110impl<const N: usize> log::Log for UsbLogger<N> { 138impl<const N: usize> log::Log for UsbLogger<N> {
@@ -153,3 +181,29 @@ macro_rules! run {
153 let _ = LOGGER.run(&mut ::embassy_usb_logger::LoggerState::new(), $p).await; 181 let _ = LOGGER.run(&mut ::embassy_usb_logger::LoggerState::new(), $p).await;
154 }; 182 };
155} 183}
184
185/// Initialize the USB serial logger from a serial class and return the future to run it.
186///
187/// Arguments specify the buffer size, log level and the serial class, respectively.
188///
189/// # Usage
190///
191/// ```
192/// embassy_usb_logger::with_class!(1024, log::LevelFilter::Info, class);
193/// ```
194///
195/// # Safety
196///
197/// This macro should only be invoked only once since it is setting the global logging state of the application.
198#[macro_export]
199macro_rules! with_class {
200 ( $x:expr, $l:expr, $p:ident ) => {
201 {
202 static LOGGER: ::embassy_usb_logger::UsbLogger<$x> = ::embassy_usb_logger::UsbLogger::new();
203 unsafe {
204 let _ = ::log::set_logger_racy(&LOGGER).map(|()| log::set_max_level_racy($l));
205 }
206 LOGGER.create_future_from_class($p)
207 }
208 };
209}