/* HelloWorld_publisher.cpp A publication of data of type HelloWorld This file is derived from code automatically generated by the rtiddsgen command: rtiddsgen -language C++/CLI -example <arch> HelloWorld.idl Example publication of type HelloWorld automatically generated by 'rtiddsgen'. To test them follow these steps: (1) Compile this file and the example subscription. (2) Start the subscription on the same domain used for RTI Data Distribution with the command HelloWorld_subscriber <domain_id> <sample_count> (3) Start the publication on the same domain used for RTI Data Distribution with the command HelloWorld_publisher <domain_id> <sample_count> (4) [Optional] Specify the list of discovery initial peers and multicast receive addresses via an environment variable or a file (in the current working directory) called NDDS_DISCOVERY_PEERS. You can run any number of publishers and subscribers programs, and can add and remove them dynamically from the domain. Example: To run the example application on domain <domain_id>: HelloWorld_publisher <domain_id> <sample_count> HelloWorld_subscriber <domain_id> <sample_count> */ #ifndef IMPORT_HelloWorld /* If this example code is packaged into an assembly other than that * containing the generated types themselves, no header inclusion is * necessary. In that case, simply define IMPORT_HelloWorld. */ #include "HelloWorldSupport.h" #endif using namespace System; public ref class HelloWorldPublisher { public: static void publish(int domain_id, int sample_count); private: static void shutdown( DDS::DomainParticipant^ participant); }; int main(array<System::String^>^ argv) { int domain_id = 0; if (argv->Length >= 1) { domain_id = Int32::Parse(argv[0]); } int sample_count = 0; /* infinite loop */ if (argv->Length >= 2) { sample_count = Int32::Parse(argv[1]); } /* Uncomment this to turn on additional logging NDDS::ConfigLogger::get_instance()->set_verbosity_by_category( NDDS::LogCategory::NDDS_CONFIG_LOG_CATEGORY_API, NDDS::LogVerbosity::NDDS_CONFIG_LOG_VERBOSITY_STATUS_ALL); */ try { HelloWorldPublisher::publish( domain_id, sample_count); } catch(DDS::Exception^) { return -1; } return 0; } void HelloWorldPublisher::publish(int domain_id, int sample_count) { /* To customize participant QoS, use DDS::DomainParticipantFactory::get_instance()->get_default_participant_qos() */ DDS::DomainParticipant^ participant = DDS::DomainParticipantFactory::get_instance()->create_participant( domain_id, DDS::DomainParticipantFactory::PARTICIPANT_QOS_DEFAULT, nullptr /* listener */, DDS::StatusMask::STATUS_MASK_NONE); if (participant == nullptr) { shutdown(participant); throw gcnew ApplicationException("create_participant error"); } /* To customize publisher QoS, use participant->get_default_publisher_qos() */ DDS::Publisher^ publisher = participant->create_publisher( DDS::DomainParticipant::PUBLISHER_QOS_DEFAULT, nullptr /* listener */, DDS::StatusMask::STATUS_MASK_NONE); if (publisher == nullptr) { shutdown(participant); throw gcnew ApplicationException("create_publisher error"); } /* Register type before creating topic */ System::String^ type_name = HelloWorldTypeSupport::get_type_name(); try { HelloWorldTypeSupport::register_type( participant, type_name); } catch (DDS::Exception^ e) { shutdown(participant); throw e; } /* To customize topic QoS, use participant->get_default_topic_qos() */ DDS::Topic^ topic = participant->create_topic( "Example HelloWorld", type_name, DDS::DomainParticipant::TOPIC_QOS_DEFAULT, nullptr /* listener */, DDS::StatusMask::STATUS_MASK_NONE); if (topic == nullptr) { shutdown(participant); throw gcnew ApplicationException("create_topic error"); } /* To customize data writer QoS, use publisher->get_default_datawriter_qos() */ DDS::DataWriter^ writer = publisher->create_datawriter( topic, DDS::Publisher::DATAWRITER_QOS_DEFAULT, nullptr /* listener */, DDS::StatusMask::STATUS_MASK_NONE); if (writer == nullptr) { shutdown(participant); throw gcnew ApplicationException("create_datawriter error"); } HelloWorldDataWriter^ HelloWorld_writer = safe_cast<HelloWorldDataWriter^>(writer); /* Create data sample for writing */ HelloWorld^ instance = HelloWorldTypeSupport::create_data(); if (instance == nullptr) { shutdown(participant); throw gcnew ApplicationException( "HelloWorldTypeSupport::create_data error"); } /* For data type that has key, if the same instance is going to be written multiple times, initialize the key here and register the keyed instance prior to writing */ DDS::InstanceHandle_t instance_handle = DDS::InstanceHandle_t::HANDLE_NIL; /* instance_handle = HelloWorld_writer->register_instance(instance); */ /* Main loop */ const System::Int32 send_period = 4000; // milliseconds for (int count=0; (sample_count == 0) || (count < sample_count); ++count) { Console::WriteLine("Writing HelloWorld, count {0}", count); /* Modify the data to be sent here */ instance->msg = "Hello World! (" + count + ")"; try { HelloWorld_writer->write(instance, instance_handle); } catch(DDS::Exception ^e) { Console::WriteLine("write error: {0}", e); } System::Threading::Thread::Sleep(send_period); } /* try { HelloWorld_writer->unregister_instance( instance, instance_handle); } catch(DDS::Exception ^e) { Console::WriteLine("unregister instance error: {0}", e); } */ /* Delete data sample */ try { HelloWorldTypeSupport::delete_data(instance); } catch(DDS::Exception ^e) { Console::WriteLine("HelloWorldTypeSupport::delete_data error: {0}", e); } /* Delete all entities */ shutdown(participant); } /* Delete all entities */ void HelloWorldPublisher::shutdown( DDS::DomainParticipant^ participant) { if (participant != nullptr) { participant->delete_contained_entities(); DDS::DomainParticipantFactory::get_instance()->delete_participant(participant); } /* RTI Data Distribution Service provides finalize_instance() method on domain participant factory for people who want to release memory used by the participant factory. Uncomment the following block of code for clean destruction of the singleton. */ /* DDS::DomainParticipantFactory::finalize_instance(); */ }