Skip to content

Commit d5f2ef0

Browse files
committed
from_serialized_bytes for WrappedNativeMsgUntyped
1 parent 3518ac9 commit d5f2ef0

File tree

3 files changed

+63
-0
lines changed

3 files changed

+63
-0
lines changed

r2r/examples/serialization.rs

Lines changed: 31 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,31 @@
1+
use r2r::{WrappedNativeMsgUntyped, WrappedTypesupport};
2+
3+
fn main() -> Result<(), Box<dyn std::error::Error>> {
4+
let msg = r2r::std_msgs::msg::String {
5+
data: "Hello, world".into(),
6+
};
7+
8+
let bytes = msg.to_serialized_bytes()?;
9+
10+
// bytes to "untyped" r2r msg
11+
let mut native = WrappedNativeMsgUntyped::new_from("std_msgs/msg/String")?;
12+
native.from_serialized_bytes(&bytes)?;
13+
14+
// "untyped" msg to json
15+
let json = native.to_json()?;
16+
17+
println!("as json\n----\n{}", serde_json::to_string_pretty(&json)?);
18+
19+
// bytes to r2r msg.
20+
let msg2 = r2r::std_msgs::msg::String::from_serialized_bytes(&bytes)?;
21+
22+
println!("as r2r msg\n----\n{:#?}", msg2);
23+
24+
// json to r2r msg
25+
let msg3: r2r::std_msgs::msg::String = serde_json::from_value(json)?;
26+
27+
assert_eq!(msg, msg2);
28+
assert_eq!(msg2, msg3);
29+
30+
Ok(())
31+
}

r2r/src/lib.rs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -81,6 +81,7 @@ pub use msg_types::WrappedActionTypeSupport;
8181
pub use msg_types::WrappedNativeMsg as NativeMsg;
8282
pub use msg_types::WrappedServiceTypeSupport;
8383
pub use msg_types::WrappedTypesupport;
84+
pub use msg_types::WrappedNativeMsgUntyped;
8485

8586
mod utils;
8687
pub use utils::*;

r2r/src/msg_types.rs

Lines changed: 31 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -406,6 +406,37 @@ impl WrappedNativeMsgUntyped {
406406
}
407407
}
408408

409+
pub fn from_serialized_bytes(&mut self, data: &[u8]) -> Result<()> {
410+
// TODO: Copy paste from above, should refactor later.
411+
use r2r_rcl::*;
412+
413+
let msg_buf = rcl_serialized_message_t {
414+
buffer: data.as_ptr() as *mut u8,
415+
buffer_length: data.len(),
416+
buffer_capacity: data.len(),
417+
418+
// Since its read only, this should never be used ..
419+
allocator: unsafe { rcutils_get_default_allocator() },
420+
};
421+
422+
// Note From the docs of rmw_deserialize, its not clear whether this reuses
423+
// any part of msg_buf. However it shouldn't matter since from_native
424+
// clones everything again anyway ..
425+
let result = unsafe {
426+
rmw_deserialize(
427+
&msg_buf as *const rcl_serialized_message_t,
428+
self.ts,
429+
self.msg,
430+
)
431+
};
432+
433+
if result == RCL_RET_OK as i32 {
434+
Ok(())
435+
} else {
436+
Err(Error::from_rcl_error(result))
437+
}
438+
}
439+
409440
pub fn to_json(&self) -> Result<serde_json::Value> {
410441
let json = (self.msg_to_json)(self.msg);
411442
json.map_err(|serde_err| Error::SerdeError {

0 commit comments

Comments
 (0)