Skip to content

Commit 49f5065

Browse files
committed
Clean up examples using new API
Signed-off-by: Michael X. Grey <[email protected]>
1 parent 97c341d commit 49f5065

File tree

4 files changed

+38
-39
lines changed

4 files changed

+38
-39
lines changed

examples/minimal_client_service/src/minimal_client.rs

Lines changed: 9 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -1,32 +1,30 @@
11
use anyhow::{Error, Result};
22
use rclrs::*;
3+
use example_interfaces::srv::*;
34

45
fn main() -> Result<(), Error> {
56
let mut executor = Context::default_from_env()?.create_basic_executor();
67

78
let node = executor.create_node("minimal_client")?;
89

9-
let client = node.create_client::<example_interfaces::srv::AddTwoInts>("add_two_ints")?;
10+
let client = node.create_client::<AddTwoInts>("add_two_ints")?;
1011

11-
println!("Starting client");
12-
13-
while !client.service_is_ready()? {
14-
std::thread::sleep(std::time::Duration::from_millis(10));
15-
}
12+
let promise = executor.commands().run(async move {
13+
println!("Waiting for service...");
14+
client.notify_on_service_ready().await.unwrap();
1615

17-
let request = example_interfaces::srv::AddTwoInts_Request { a: 41, b: 1 };
16+
let request = AddTwoInts_Request { a: 41, b: 1 };
1817

19-
let response: Promise<example_interfaces::srv::AddTwoInts_Response> = client.call(&request).unwrap();
18+
println!("Waiting for response");
19+
let response: AddTwoInts_Response =
20+
client.call(&request).unwrap().await.unwrap();
2021

21-
let promise = executor.commands().run(async move {
22-
let response = response.await.unwrap();
2322
println!(
2423
"Result of {} + {} is: {}",
2524
request.a, request.b, response.sum,
2625
);
2726
});
2827

29-
println!("Waiting for response");
3028
executor
3129
.spin(SpinOptions::new().until_promise_resolved(promise))
3230
.first_error()?;

examples/minimal_client_service/src/minimal_client_async.rs

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,25 +1,26 @@
11
use anyhow::{Error, Result};
22
use rclrs::*;
3+
use example_interfaces::srv::*;
34

45
#[tokio::main]
56
async fn main() -> Result<(), Error> {
67
let mut executor = Context::default_from_env()?.create_basic_executor();
78

89
let node = executor.create_node("minimal_client")?;
910

10-
let client = node.create_client::<example_interfaces::srv::AddTwoInts>("add_two_ints")?;
11+
let client = node.create_client::<AddTwoInts>("add_two_ints")?;
1112

1213
println!("Starting client");
1314

1415
while !client.service_is_ready()? {
1516
std::thread::sleep(std::time::Duration::from_millis(10));
1617
}
1718

18-
let request = example_interfaces::srv::AddTwoInts_Request { a: 41, b: 1 };
19+
let request = AddTwoInts_Request { a: 41, b: 1 };
1920

2021
let promise = client.call_then(
2122
&request,
22-
move |response: example_interfaces::srv::AddTwoInts_Response| {
23+
move |response: AddTwoInts_Response| {
2324
println!(
2425
"Result of {} + {} is: {}",
2526
request.a, request.b, response.sum,
Lines changed: 7 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,17 +1,18 @@
11
use anyhow::{Error, Result};
22
use rclrs::*;
3+
use example_interfaces::srv::*;
34

45
fn handle_service(
5-
request: example_interfaces::srv::AddTwoInts_Request,
6+
request: AddTwoInts_Request,
67
info: ServiceInfo,
7-
) -> example_interfaces::srv::AddTwoInts_Response {
8+
) -> AddTwoInts_Response {
89
let timestamp = info
910
.received_timestamp
1011
.map(|t| format!(" at [{t:?}]"))
1112
.unwrap_or(String::new());
1213

1314
println!("request{timestamp}: {} + {}", request.a, request.b);
14-
example_interfaces::srv::AddTwoInts_Response {
15+
AddTwoInts_Response {
1516
sum: request.a + request.b,
1617
}
1718
}
@@ -22,11 +23,11 @@ fn main() -> Result<(), Error> {
2223
let node = executor.create_node("minimal_service")?;
2324

2425
let _server = node
25-
.create_service::<example_interfaces::srv::AddTwoInts, _>("add_two_ints", handle_service)?;
26+
.create_service::<AddTwoInts, _>("add_two_ints", handle_service)?;
2627

2728
println!("Starting server");
2829
executor
2930
.spin(SpinOptions::default())
30-
.first_error()
31-
.map_err(|err| err.into())
31+
.first_error()?;
32+
Ok(())
3233
}
Lines changed: 18 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -1,39 +1,31 @@
11
use rclrs::*;
22
use std::{
3-
sync::{Arc, Mutex},
43
thread,
54
time::Duration,
65
};
76
use std_msgs::msg::String as StringMsg;
87

98
pub struct SimpleSubscriptionNode {
109
#[allow(unused)]
11-
subscriber: Subscription<StringMsg>,
12-
data: Arc<Mutex<Option<StringMsg>>>,
10+
subscriber: WorkerSubscription<StringMsg, Option<String>>,
11+
worker: Worker<Option<String>>,
1312
}
1413

1514
impl SimpleSubscriptionNode {
1615
fn new(executor: &Executor) -> Result<Self, RclrsError> {
1716
let node = executor.create_node("simple_subscription").unwrap();
18-
let data: Arc<Mutex<Option<StringMsg>>> = Arc::new(Mutex::new(None));
19-
let data_mut: Arc<Mutex<Option<StringMsg>>> = Arc::clone(&data);
20-
let subscriber = node
17+
let worker = node.create_worker(None);
18+
19+
let subscriber = worker
2120
.create_subscription::<StringMsg, _>(
2221
"publish_hello",
23-
move |msg: StringMsg| {
24-
*data_mut.lock().unwrap() = Some(msg);
22+
move |data: &mut Option<String>, msg: StringMsg| {
23+
*data = Some(msg.data);
2524
},
2625
)
2726
.unwrap();
28-
Ok(Self { subscriber, data })
29-
}
30-
fn data_callback(&self) -> Result<(), RclrsError> {
31-
if let Some(data) = self.data.lock().unwrap().as_ref() {
32-
println!("{}", data.data);
33-
} else {
34-
println!("No message available yet.");
35-
}
36-
Ok(())
27+
28+
Ok(Self { subscriber, worker })
3729
}
3830
}
3931
fn main() -> Result<(), RclrsError> {
@@ -43,8 +35,15 @@ fn main() -> Result<(), RclrsError> {
4335
// TODO(@mxgrey): Replace this thread with a timer when the Timer feature
4436
// gets merged.
4537
thread::spawn(move || loop {
46-
thread::sleep(Duration::from_millis(1000));
47-
node.data_callback().unwrap()
38+
thread::sleep(Duration::from_secs(1));
39+
let _ = node.worker.run(|data: &mut Option<String>| {
40+
if let Some(data) = data {
41+
println!("{data}");
42+
} else {
43+
println!("No message available yet.");
44+
}
45+
});
4846
});
47+
4948
executor.spin(SpinOptions::default()).first_error()
5049
}

0 commit comments

Comments
 (0)