#[allow(unused_imports)]
use log::{debug, error, info, warn};
use futures::StreamExt;
use serde::{Deserialize, Serialize};
use ros2_client::{
AService, Context, Message, Name, Node, NodeName, NodeOptions, ServiceMapping, ServiceTypeName,
};
use rustdds::{
policy::{self, Deadline, Lifespan},
Duration, QosPolicies, QosPolicyBuilder,
};
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct AddTwoIntsRequest {
pub a: i64,
pub b: i64,
}
impl Message for AddTwoIntsRequest {}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct AddTwoIntsResponse {
pub sum: i64,
}
impl Message for AddTwoIntsResponse {}
fn main() {
pretty_env_logger::init();
debug!(">>> ros2_service starting...");
let mut node = create_node();
let service_qos = create_qos();
println!(">>> ros2_service node started");
let server = node
.create_server::<AService<AddTwoIntsRequest, AddTwoIntsResponse>>(
ServiceMapping::Enhanced,
&Name::new("/", "add_two_ints").unwrap(),
&ServiceTypeName::new("example_interfaces", "AddTwoInts"),
service_qos.clone(),
service_qos,
)
.unwrap();
println!(">>> ros2_service server created");
let server_stream = server.receive_request_stream().then(|result| async {
match result {
Ok((req_id, req)) => {
println!("request: {} + {}", req.a, req.b);
let resp = AddTwoIntsResponse { sum: req.a + req.b };
let sr = server.async_send_response(req_id, resp).await;
if let Err(e) = sr {
println!("Send error {e:?}");
}
}
Err(e) => println!("Receive request error: {e:?}"),
}
});
smol::block_on(server_stream.count());
}
fn create_qos() -> QosPolicies {
let service_qos: QosPolicies = {
QosPolicyBuilder::new()
.history(policy::History::KeepLast { depth: 10 })
.reliability(policy::Reliability::Reliable {
max_blocking_time: Duration::from_millis(100),
})
.durability(policy::Durability::Volatile)
.deadline(Deadline(Duration::INFINITE))
.lifespan(Lifespan {
duration: Duration::INFINITE,
})
.liveliness(policy::Liveliness::Automatic {
lease_duration: Duration::INFINITE,
})
.build()
};
service_qos
}
fn create_node() -> Node {
let context = Context::new().unwrap();
context
.new_node(
NodeName::new("/rustdds", "rustdds_server").unwrap(),
NodeOptions::new().enable_rosout(true),
)
.unwrap()
}