DynamicType Use Cases
Set up:
#include <dds/dds.hpp>
#include <dds/core/xtypes/xtypes.hpp>
Define an enumerated (enum) type:
Define a structure type:
dds::core::xtypes::Member member1("long1", dds::core::xtypes::primitive_type<int32_t>() );
member1.id( 101 );
member1.key( true );
member1.must_understand(true);
dds::core::xtypes::Member member2 = dds::core::xtypes::Member("long2", dds::core::xtypes::primitive_type<int32_t>()).id( 101 ).optional(true);
structType.add_member( dds::core::xtypes::Member("a_long", dds::core::xtypes::primitive_type<int32_t>()) );
structType.add_member( dds::core::xtypes::Member("a_enum", enumType ) );
structType.add_member( dds::core::xtypes::Member(
"a_array",
dds::core::xtypes::ArrayType(dds::core::xtypes::primitive_type<int32_t>(), 5)) );
structType.add_member( dds::core::xtypes::Member(
"a_map",
dds::core::xtypes::MapType(dds::core::xtypes::primitive_type<int32_t>(),
fooType.add_member( dds::core::xtypes::Member("x", dds::core::xtypes::primitive_type<int32_t>()).key(true) );
structType.add_member( dds::core::xtypes::Member("a_foo", fooType));
This is equivalent to the IDL:
@bit_bound(16) enum EnumType { ONE=1, TWO=2, THREE=3 };
struct Foo {
@key long x;
};
struct StructType {
long a_long;
string a_string;
EnumType a_enum;
string<16> a_fixed_string;
@optional string<16> a_opt_string;
long a_array[5];
sequence<long,10> a_sequence;
map<long,string,10> a_map;
Foo a_foo;
};
Define a union type:
unionType.add_member(
dds::core::xtypes::UnionMember(
"a_other_long", dds::core::xtypes::primitive_type<int32_t>(), 2 ).is_default_case(
true).
id( 101) );
This is equivalent to the IDL:
struct Foo {
@key long x;
};
union UnionType switch( long ) {
case 1: long a_long;
default:
case 2: @id(101) long a_other_long;
case 3: @id(102) Foo a_foo;
case 4: long a_array[4];
};
The API also supports constructing struct and union types with the member[s] specified as an initializer list:
"Struct2", {
dds::core::xtypes::Member("a", dds::core::xtypes::primitive_type<int32_t>()).key(true),
dds::core::xtypes::Member("b", dds::core::xtypes::primitive_type<int32_t>()),
}
);
"Union2",
dds::core::xtypes::primitive_type<int32_t>(),
{
} );
Using Dynamic Types with DataReaders and DataWriters
Construct a Topic that refers to a constructed Dynamic Type (struct or union), then refer to that Topic when constructing the DataReader and/or DataWriter.
foo.add_member( dds::core::xtypes::Member("x", dds::core::xtypes::primitive_type<int32_t>()).key(true) );
foo.add_member( dds::core::xtypes::Member("y", dds::core::xtypes::primitive_type<bool>()) );
foo.add_member( dds::core::xtypes::Member("z", dds::core::xtypes::primitive_type<float>()) );
DynamicData Use Cases
Publishing a DynamicData sample
sample.value( "x", 3 );
sample.value( "y", true );
sample.value<float>( "z", 3.1415 );
test_dw.write( sample );
Receiving DynamicData samples
for ( auto sample : samples )
{
if ( sample.info().valid() )
{
cout << "x : " << sample.data().value<int32_t>("x") << endl;;
cout << "y : " << sample.data().value<bool>("y") << endl;
cout << "z : " << sample.data().value<float>("z") << endl;
}
}