.. _features: Features ======== Safe DDS provides a set of features that make it a powerful and flexible communication library while maintaining a high level of safety and embedded systems compatibility. The following table provides an overview of the main features of Safe DDS with respect to the OMG DDS Quality of Service (QoS) policies. Please refer to :ref:`features_dds_compliance` for a compliance matrix between the OMG DDS v1.4 API and Safe DDS. .. list-table:: :header-rows: 1 * - OMG DDS v1.4 QoS - Safe DDS support * - :class:`Deadline` - Full support. * - :class:`Durability` - :class:`VOLATILE_DURABILITY_QOS`, :class:`TRANSIENT_LOCAL_DURABILITY_QOS` * - :class:`EntityFactory` - Supported in :class:`DomainParticipantQos`, :class:`PublisherQos`, and :class:`SubscriberQos`. * - :class:`History` - Both :class:`KEEP_LAST_HISTORY_QOS`, and :class:`KEEP_ALL_HISTORY_QOS` supported with bounded depth. * - :class:`Liveliness` - Full support. * - :class:`Reliability` - Both :class:`BEST_EFFORT_RELIABILITY_QOS`, and :class:`RELIABLE_RELIABILITY_QOS` with :class:`max_blocking_time` set to 0. * - :class:`ResourceLimits` - Only bounded :class:`max_samples_per_instance`, :class:`max_instances`, and :class:`max_samples`. In addition to the previous Qos policies, Safe DDS provides the following features: - `OMG DDS v1.4 `__ compliant API (see :ref:`features_dds_compliance`). - Additional modern C++ APIs, including a fully static-memory API. - `OMG RTPS v2.5 `__ compliant wire protocol. - OMG DDS/RTPS standard discovery: SEDP and SPDP. - DDS Topic Instance support. - Shared memory communication between local DataWriters and DataReaders. - Customizable execution model. - Customizable transport layer. - Multicast and unicast support. - Fragmentation of large data samples. - Wire protocol optional packet-level integrity checks. - Wire protocol time-based events can be tuned. - Multi DDS Domain support. - Full control over memory usage: - Static memory mode: no heap at all. - Preallocated memory mode: allocations are done at configuration time. - Dynamic memory mode: user controlled heap. Limitations ----------- Beyond the features provided by Safe DDS, there are some limitations that should be taken into account when using the library: - The following QoS are taken into account for DDS matching procedures but they will only accept default values when creating Safe DDS entities: - Ownership - Destination Order - Partition - Lifecycle - Any other OMG DDS QoS policy not mentioned is not available in Safe DDS. - Safe DDS does not support modifying any QoS policy after the creation of an entity. - DataReader, DataWriter and Topics will only accept TypeSupports that handle memory-bounded types. - Safe DDS does not support the creation of new entities after the DomainParticipant has been enabled. - Safe DDS does not support the creation of new DomainParticipants after the creation of the default executor of the DomainParticipantFactory. - Safe DDS does not support the deletion of entities. - Safe DDS does not support the automatic scan of network interfaces. - Safe DDS is an execution context agnostic library and it is not thread-safe by default. - DomainParticipant only supports a single announcement locator. - DataReader only supports one optional unicast locator and one optional multicast locator. - DataWriter only supports one optional unicast locator. - DomainParticipantFactory has a maximum of 256 created DomainParticipants. - Topic has a maximum of 255 associated local DataReaders. - Static APIs may not comply with the OMG DDS standard defined API. - Safe DDS does not yet support any feature of OMG DDS-Security standard. - Safe DDS discovery does not implement fragmentation of incoming data. With respect to Safe DDS Gen, the supported feature set is restricted to the following: - Primitive types. - Structures. - Arrays. - Bounded sequences. - Bounded strings. - Modules. - Include directives. - Key annotation. - Optional members. - Enumerations. - Appendable and mutable extensibility. - Unions. - Typedefs. - Forward declarations. - Consts. - Empty structs. - Maps. That means that among other features, Safe DDS Gen does not yet support: - Unbounded types. - Bitsets. - Bitmasks. .. _features_dds_compliance: OMG DDS v1.4 API compliance matrix ---------------------------------- .. list-table:: :header-rows: 1 * - OMG DDS v1.4 API - Safe DDS API * - :func:`Entity::enable` - :func:`Entity::enable` * - :func:`DomainParticipantFactory::create_participant` - :func:`SafeDomainParticipantFactory::create_participant` * - :func:`DomainParticipant::register_type` - :func:`DomainParticipant::register_type` * - :func:`DomainParticipant::create_publisher` - :func:`DomainParticipant::create_publisher` * - :func:`DomainParticipant::create_subscriber` - :func:`DomainParticipant::create_subscriber` * - :func:`DomainParticipant::create_topic` - :func:`DomainParticipant::create_topic` * - :func:`DomainParticipant::assert_liveliness` - :func:`DomainParticipant::assert_liveliness` * - :func:`Topic::get_inconsistent_topic_status` - :func:`Topic::get_inconsistent_topic_status` * - :func:`TopicListener::on_inconsistent_topic` - :func:`TopicListener::on_inconsistent_topic` * - :func:`TypeSupport::register_type` - :func:`TypeSupport::register_type` * - :func:`TypeSupport::get_type_name` - :func:`TypeSupport::get_type_name` * - :func:`Publisher::create_datawriter` - :func:`Publisher::create_datawriter` * - :func:`Publisher::wait_for_acknowledgments` - :func:`Publisher::wait_for_acknowledgments` * - :func:`DataWriter::wait_for_acknowledgments` - :func:`DataWriter::wait_for_acknowledgments` * - :func:`DataWriter::get_liveliness_lost_status` - :func:`DataWriter::get_liveliness_lost_status` * - :func:`DataWriter::get_offered_deadline_missed_status` - :func:`DataWriter::get_offered_deadline_missed_status` * - :func:`DataWriter::get_offered_incompatible_qos_status` - :func:`DataWriter::get_offered_incompatible_qos_status` * - :func:`DataWriter::get_publication_matched_status` - :func:`DataWriter::get_publication_matched_status` * - :func:`DataWriter::assert_liveliness` - :func:`DataWriter::assert_liveliness` * - :func:`DataWriter::register_instance` - :func:`TypedDataWriter::register_instance` * - :func:`DataWriter::register_instance_w_timestamp` - :func:`TypedDataWriter::register_instance_w_timestamp` * - :func:`DataWriter::unregister_instance` - :func:`TypedDataWriter::unregister_instance` * - :func:`DataWriter::unregister_instance_w_timestamp` - :func:`TypedDataWriter::unregister_instance_w_timestamp` * - :func:`DataWriter::get_key_value` - :func:`TypedDataWriter::get_key_value` * - :func:`DataWriter::lookup_instance` - :func:`TypedDataWriter::lookup_instance` * - :func:`DataWriter::write` - :func:`TypedDataWriter::write` * - :func:`DataWriter::write_w_timestamp` - :func:`TypedDataWriter::write_w_timestamp` * - :func:`DataWriter::dispose` - :func:`TypedDataWriter::dispose` * - :func:`DataWriter::dispose_w_timestamp` - :func:`TypedDataWriter::dispose_w_timestamp` * - :func:`DataWriterListener::on_publication_matched` - :func:`DataWriterListener::on_publication_matched` * - :func:`DataWriterListener::on_offered_deadline_missed` - :func:`DataWriterListener::on_publication_matched` * - :func:`DataWriterListener::on_offered_incompatible_qos` - :func:`DataWriterListener::on_publication_matched` * - :func:`DataWriterListener::on_liveliness_lost` - :func:`DataWriterListener::on_publication_matched` * - :func:`Subscriber::create_datareader` - :func:`Subscriber::create_datareader` * - :func:`SubscriberListener::on_data_on_readers` - :func:`SubscriberListener::on_data_on_readers` * - :func:`DataReader::get_liveliness_changed_status` - :func:`DataReader::get_liveliness_changed_status` * - :func:`DataReader::get_requested_deadline_missed_status` - :func:`DataReader::get_requested_deadline_missed_status` * - :func:`DataReader::get_requested_incompatible_qos_status` - :func:`DataReader::get_requested_incompatible_qos_status` * - :func:`DataReader::get_sample_lost_status` - :func:`DataReader::get_sample_lost_status` * - :func:`DataReader::get_sample_rejected_status` - :func:`DataReader::get_sample_rejected_status` * - :func:`DataReader::get_subscription_matched_status` - :func:`DataReader::get_subscription_matched_status` * - :func:`DataReader::take_next_sample` - :func:`TypedDataReader::take_next_sample` * - :func:`DataReader::get_key_value` - :func:`TypedDataReader::get_key_value` * - :func:`DataReader::lookup_instance` - :func:`TypedDataReader::lookup_instance` * - :func:`DataReaderListener::on_data_available` - :func:`DataReaderListener::on_data_available` * - :func:`DataReaderListener::on_subscription_matched` - :func:`DataReaderListener::on_subscription_matched` * - :func:`DataReaderListener::on_requested_deadline_missed` - :func:`DataReaderListener::on_requested_deadline_missed` * - :func:`DataReaderListener::on_liveliness_changed` - :func:`DataReaderListener::on_liveliness_changed` * - :func:`DataReaderListener::on_sample_rejected` - :func:`DataReaderListener::on_sample_rejected` * - :func:`DataReaderListener::on_requested_incompatible_qos` - :func:`DataReaderListener::on_requested_incompatible_qos` * - :func:`DataReaderListener::on_sample_lost` - :func:`DataReaderListener::on_sample_lost`