From 2dc848bf836e2a694a1fba1df0d1fa98927bdd08 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Mat=C4=9Bj=20Laitl?= Date: Sat, 11 Mar 2023 00:14:56 +0100 Subject: [PATCH] Introduce `recv_blocking()` method on `PayloadReceiver` Allows callers to wait for a frame without using futures. --- README.md | 40 +++++++++++++++--------------------- cameleon/README.md | 41 +++++++++++++++---------------------- cameleon/examples/stream.rs | 34 +++++++++++++----------------- cameleon/src/payload.rs | 6 ++++++ 4 files changed, 54 insertions(+), 67 deletions(-) diff --git a/README.md b/README.md index d4d73cf9..d693cebf 100644 --- a/README.md +++ b/README.md @@ -62,30 +62,24 @@ camera.load_context().unwrap(); // Start streaming. Channel capacity is set to 3. let payload_rx = camera.start_streaming(3).unwrap(); -let mut payload_count = 0; -while payload_count < 10 { - match payload_rx.try_recv() { - Ok(payload) => { - println!( - "payload received! block_id: {:?}, timestamp: {:?}", - payload.id(), - payload.timestamp() - ); - if let Some(image_info) = payload.image_info() { - println!("{:?}\n", image_info); - let image = payload.image(); - // do something with the image. - // ... - } - payload_count += 1; - - // Send back payload to streaming loop to reuse the buffer. This is optional. - payload_rx.send_back(payload); - } - Err(_err) => { - continue; - } +for _ in 0..10 { + let payload = payload_rx + .recv_blocking() + .expect("should receive a payload"); + println!( + "payload received! block_id: {:?}, timestamp: {:?}", + payload.id(), + payload.timestamp() + ); + if let Some(image_info) = payload.image_info() { + println!("{:?}\n", image_info); + let image = payload.image(); + // do something with the image. + // ... } + + // Send back payload to streaming loop to reuse the buffer. This is optional. + payload_rx.send_back(payload); } // Closes the camera. diff --git a/cameleon/README.md b/cameleon/README.md index 120bfaf7..fe196e3d 100644 --- a/cameleon/README.md +++ b/cameleon/README.md @@ -62,30 +62,24 @@ camera.load_context().unwrap(); // Start streaming. Channel capacity is set to 3. let payload_rx = camera.start_streaming(3).unwrap(); -let mut payload_count = 0; -while payload_count < 10 { - match payload_rx.try_recv() { - Ok(payload) => { - println!( - "payload received! block_id: {:?}, timestamp: {:?}", - payload.id(), - payload.timestamp() - ); - if let Some(image_info) = payload.image_info() { - println!("{:?}\n", image_info); - let image = payload.image(); - // do something with the image. - // ... - } - payload_count += 1; - - // Send back payload to streaming loop to reuse the buffer. This is optional. - payload_rx.send_back(payload); - } - Err(_err) => { - continue; - } +for _ in 0..10 { + let payload = payload_rx + .recv_blocking() + .expect("should receive a payload"); + println!( + "payload received! block_id: {:?}, timestamp: {:?}", + payload.id(), + payload.timestamp() + ); + if let Some(image_info) = payload.image_info() { + println!("{:?}\n", image_info); + let image = payload.image(); + // do something with the image. + // ... } + + // Send back payload to streaming loop to reuse the buffer. This is optional. + payload_rx.send_back(payload); } // Closes the camera. @@ -188,4 +182,3 @@ To start developing, please refer to [CONTRIBUTING.md][contributing]. This project is licenced under [MPL 2.0][license]. [license]: https://github.com/cameleon-rs/cameleon/blob/main/LICENSE - diff --git a/cameleon/examples/stream.rs b/cameleon/examples/stream.rs index 6d6a89d2..913e944f 100644 --- a/cameleon/examples/stream.rs +++ b/cameleon/examples/stream.rs @@ -25,27 +25,21 @@ fn main() { // Start streaming. Channel capacity is set to 3. let payload_rx = camera.start_streaming(3).unwrap(); - let mut payload_count = 0_usize; - while payload_count < 10 { - match payload_rx.try_recv() { - Ok(payload) => { - println!( - "payload received! block_id: {:?}, timestamp: {:?}", - payload.id(), - payload.timestamp() - ); - if let Some(image_info) = payload.image_info() { - println!("{:?}\n", image_info); - } - payload_count += 1; - - // Send back payload to streaming loop to reuse the buffer. - payload_rx.send_back(payload); - } - Err(_err) => { - continue; - } + for _ in 0..10 { + let payload = payload_rx + .recv_blocking() + .expect("should receive a payload"); + println!( + "payload received! block_id: {:?}, timestamp: {:?}", + payload.id(), + payload.timestamp() + ); + if let Some(image_info) = payload.image_info() { + println!("{:?}\n", image_info); } + + // Send back payload to streaming loop to reuse the buffer. + payload_rx.send_back(payload); } camera.close().ok(); diff --git a/cameleon/src/payload.rs b/cameleon/src/payload.rs index 7cf168af..155f977e 100644 --- a/cameleon/src/payload.rs +++ b/cameleon/src/payload.rs @@ -122,6 +122,12 @@ impl PayloadReceiver { self.rx.try_recv()? } + /// Receives [`Payload`] sent from the device. + /// If the channel is empty, this method blocks until the device produces it. + pub fn recv_blocking(&self) -> StreamResult { + self.rx.recv_blocking()? + } + /// Sends back [`Payload`] to the device to reuse already allocated `payload`. /// /// Sending back `payload` may improve performance of streaming, but not required to call this