From 7162e21e44784a3338f1d319882236256cdc118a 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. Also bump async-std dependency to 1.12 (unfortunately still doesn't ensure recent-enough `async-channel` - but I'll fix that in another PR). Also update the stream example and READMEs with the new method, making it print any receive errors (but not panic on them) and doing exactly 10 tries (instead of waiting for 10 success payloads). --- README.md | 40 +++++++++++++++++------------------- cameleon/Cargo.toml | 2 +- cameleon/README.md | 41 +++++++++++++++++-------------------- cameleon/examples/stream.rs | 34 +++++++++++++++--------------- cameleon/src/payload.rs | 6 ++++++ device/Cargo.toml | 5 ++--- 6 files changed, 63 insertions(+), 65 deletions(-) diff --git a/README.md b/README.md index d4d73cf9..5dcd03dc 100644 --- a/README.md +++ b/README.md @@ -62,30 +62,28 @@ 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) => { +for _ in 0..10 { + let payload = match payload_rx.recv_blocking() { + Ok(payload) => payload, + Err(e) => { + println!("payload receive error: {e}"); continue; } + }; + 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/Cargo.toml b/cameleon/Cargo.toml index 02e1a20c..63ca9c2b 100644 --- a/cameleon/Cargo.toml +++ b/cameleon/Cargo.toml @@ -20,7 +20,7 @@ thiserror = "1.0.24" semver = "1.0.0" zip = "0.6.0" sha-1 = "0.10.0" -async-std = { version = "1.9.0", features = ["unstable"] } +async-std = { version = "1.12.0", features = ["unstable"] } tracing = "0.1.26" auto_impl = "1.0.1" cameleon-device = { path = "../device", version = "0.1.8" } diff --git a/cameleon/README.md b/cameleon/README.md index 120bfaf7..ea62a15d 100644 --- a/cameleon/README.md +++ b/cameleon/README.md @@ -62,30 +62,28 @@ 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) => { +for _ in 0..10 { + let payload = match payload_rx.recv_blocking() { + Ok(payload) => payload, + Err(e) => { + println!("payload receive error: {e}"); continue; } + }; + 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 +186,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..d768c0fe 100644 --- a/cameleon/examples/stream.rs +++ b/cameleon/examples/stream.rs @@ -25,27 +25,25 @@ 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) => { + for _ in 0..10 { + let payload = match payload_rx.recv_blocking() { + Ok(payload) => payload, + Err(e) => { + println!("payload receive error: {e}"); continue; } + }; + 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..c6560bb7 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 the payload. + 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 diff --git a/device/Cargo.toml b/device/Cargo.toml index dd14016e..f06dbd33 100644 --- a/device/Cargo.toml +++ b/device/Cargo.toml @@ -10,14 +10,14 @@ repository = "https://github.com/cameleon-rs/cameleon" description = """ cameleon-device provides device specific protocol decoders and basic I/O operations for GenICam compatible devices. """ -categories = ["computer-vision"] +categories = ["computer-vision"] keywords = ["genicam", "camera", "usb3", "gige", "uvc"] [dependencies] thiserror = "1.0.24" log = "0.4.14" semver = "1.0.0" -async-std = { version = "1.9.0", features = ["unstable"] } +async-std = { version = "1.12.0", features = ["unstable"] } const_format = "0.2.14" futures = "0.3.14" lazy_static = "1.4.0" @@ -29,7 +29,6 @@ rusb = { version = "0.9.0", optional = true } libusb1-sys = { version = "0.6.0", optional = true } libc = { version = "0.2", optional = true } - [dev-dependencies] trybuild = "1.0.42"