static void subscribe(int domain_id, int sample_count, String participant_auth) { // --- Create participant --- // /* Start changes for programmatically qos */ /* Get default participant QoS to customize */ DDS.DomainParticipantQos participant_qos = new DDS.DomainParticipantQos(); DDS.DomainParticipantFactory.get_instance(). get_default_participant_qos(participant_qos); // If you want to change the Participant's QoS programmatically // rather than using the XML file, you will need to uncomment the // following line. //participant_qos.resource_limits.participant_user_data_max_length = 1024; // user_data is opaque to DDS int len = participant_auth.Length; int max = participant_qos.resource_limits.participant_user_data_max_length; if (len > max) { Console.WriteLine( "error, participant user_data exceeds resource limits"); } else { /* Byte type is defined to be 8 bits. If chars are not 8 bits * on your system, this will not work. */ participant_qos.user_data.value.from_array( System.Text.Encoding.ASCII.GetBytes(participant_auth)); } DDS.DomainParticipant participant = DDS.DomainParticipantFactory.get_instance().create_participant( domain_id, participant_qos, null, DDS.StatusMask.STATUS_MASK_NONE); if (participant == null) { shutdown(participant); throw new Exception("create_participant error"); } /* End changes for programmatically qos */ /* The participant is disabled by default. We enable it now */ try { participant.enable(); } catch (DDS.Exception e) { Console.WriteLine("failed to enable participant {0}", e); shutdown(participant); throw e; } // --- Create subscriber --- // /* To customize the subscriber QoS, use * the configuration file USER_QOS_PROFILES.xml */ DDS.Subscriber subscriber = participant.create_subscriber( DDS.DomainParticipant.SUBSCRIBER_QOS_DEFAULT, null /* listener */, DDS.StatusMask.STATUS_MASK_NONE); if (subscriber == null) { shutdown(participant); throw new Exception("create_subscriber error"); } // --- Create topic --- // /* Register the type before creating the topic */ System.String type_name = msgTypeSupport.get_type_name(); try { msgTypeSupport.register_type(participant, type_name); } catch (DDS.Exception e) { Console.WriteLine("register_type error {0}", e); shutdown(participant); throw e; } /* To customize the topic QoS, use * the configuration file USER_QOS_PROFILES.xml */ DDS.Topic topic = participant.create_topic( "Example msg", type_name, DDS.DomainParticipant.TOPIC_QOS_DEFAULT, null /* listener */, DDS.StatusMask.STATUS_MASK_NONE); if (topic == null) { shutdown(participant); throw new Exception("create_topic error"); } // --- Create reader --- // /* Create a data reader listener */ msgListener reader_listener = new msgListener(); /* To customize the data reader QoS, use * the configuration file USER_QOS_PROFILES.xml */ DDS.DataReader reader = subscriber.create_datareader( topic, DDS.Subscriber.DATAREADER_QOS_DEFAULT, reader_listener, DDS.StatusMask.STATUS_MASK_ALL); if (reader == null) { shutdown(participant); reader_listener = null; throw new Exception("create_datareader error"); } // --- Wait for data --- // /* Main loop */ const int receive_period = 1000; // milliseconds for (int count = 0; (sample_count == 0) || (count < sample_count); ++count) { System.Threading.Thread.Sleep(receive_period); } // --- Shutdown --- // /* Delete all entities */ shutdown(participant); reader_listener = null; }
static void publish(int domain_id, int sample_count) { // --- Create participant --- // /* Start changes for Builtin_Topics */ /* If you want to change the Factory's QoS programmatically rather * than using the XML file, you will need to add the following lines to * your code and comment out the participant call above. */ /* By default, the participant is enabled upon construction. * At that time our listeners for the builtin topics have not * been installed, so we disable the participant until we * set up the listeners. */ /* * DDS.DomainParticipantFactoryQos factory_qos = * new DDS.DomainParticipantFactoryQos(); * DDS.DomainParticipantFactory.get_instance().get_qos(factory_qos); * factory_qos.entity_factory.autoenable_created_entities = false; * DDS.DomainParticipantFactory.get_instance().set_qos(factory_qos); * */ // If you want to change the Participant's QoS programmatically // rather than using the XML file, you will need to uncomment the // following lines and replace in create_participant the argument // DDS.DomainParticipantFactory.PARTICIPANT_QOS_DEFAULT with // participant_qos //DDS.DomainParticipantQos participant_qos = // new DDS.DomainParticipantQos(); //DDS.DomainParticipantFactory.get_instance(). // get_default_participant_qos(participant_qos); //participant_qos.resource_limits.participant_user_data_max_length = 1024; /* To customize participant QoS, use * the configuration file USER_QOS_PROFILES.xml */ DDS.DomainParticipant participant = DDS.DomainParticipantFactory.get_instance().create_participant( domain_id, DDS.DomainParticipantFactory.PARTICIPANT_QOS_DEFAULT, null /* listener */, DDS.StatusMask.STATUS_MASK_NONE); if (participant == null) { shutdown(participant); throw new Exception("create_participant error"); } // Installing listeners for the builting topics requires several steps // First get the builting subscriber DDS.Subscriber builtin_subscriber = participant.get_builtin_subscriber(); if (builtin_subscriber == null) { shutdown(participant); throw new Exception("create_builtin_subscriber error"); } /* Then get builtin subscriber's datareader for participants * The type name is a bit hairy, but can be read right to left: * DDS.ParticipantBuiltinTopicDataDataReader is a * DataReader for BuiltinTopicData concerning a discovered * Participant */ DDS.ParticipantBuiltinTopicDataDataReader builtin_participant_datareader = (DDS.ParticipantBuiltinTopicDataDataReader) builtin_subscriber.lookup_datareader( DDS.ParticipantBuiltinTopicDataTypeSupport. PARTICIPANT_TOPIC_NAME); // Install our listener BuiltinParticipantListener builtin_participant_listener = new BuiltinParticipantListener(); try { builtin_participant_datareader.set_listener( builtin_participant_listener, (DDS.StatusMask.STATUS_MASK_NONE | (DDS.StatusMask)DDS.StatusKind.DATA_AVAILABLE_STATUS)); } catch (DDS.Exception e) { shutdown(participant); Console.WriteLine("set_listener error: {0}", e); } // Get builtin subscriber's datareader for subscribers DDS.SubscriptionBuiltinTopicDataDataReader builtin_subscription_datareader = (DDS.SubscriptionBuiltinTopicDataDataReader) builtin_subscriber.lookup_datareader( DDS.SubscriptionBuiltinTopicDataTypeSupport. SUBSCRIPTION_TOPIC_NAME); if (builtin_participant_datareader == null) { shutdown(participant); throw new Exception("lookup_datareader error"); } // Install our listener BuiltinSubscriberListener builtin_subscriber_listener = new BuiltinSubscriberListener(); builtin_subscription_datareader.set_listener( builtin_subscriber_listener, (DDS.StatusMask.STATUS_MASK_NONE | (DDS.StatusMask)DDS.StatusKind.DATA_AVAILABLE_STATUS)); /* Done! All the listeners are installed, so we can enable the * participant now. */ participant.enable(); /* End changes for Builtin_Topics */ // --- Create publisher --- // /* To customize publisher QoS, use * the configuration file USER_QOS_PROFILES.xml */ DDS.Publisher publisher = participant.create_publisher( DDS.DomainParticipant.PUBLISHER_QOS_DEFAULT, null /* listener */, DDS.StatusMask.STATUS_MASK_NONE); if (publisher == null) { shutdown(participant); throw new Exception("create_publisher error"); } // --- Create topic --- // /* Register type before creating topic */ string type_name = msgTypeSupport.get_type_name(); try { msgTypeSupport.register_type(participant, type_name); } catch (DDS.Exception e) { Console.WriteLine("register_type error {0}", e); shutdown(participant); throw e; } /* To customize topic QoS, use * the configuration file USER_QOS_PROFILES.xml */ DDS.Topic topic = participant.create_topic( "Example msg", type_name, DDS.DomainParticipant.TOPIC_QOS_DEFAULT, null /* listener */, DDS.StatusMask.STATUS_MASK_NONE); if (topic == null) { shutdown(participant); throw new Exception("create_topic error"); } // --- Create writer --- // /* To customize data writer QoS, use * the configuration file USER_QOS_PROFILES.xml */ DDS.DataWriter writer = publisher.create_datawriter( topic, DDS.Publisher.DATAWRITER_QOS_DEFAULT, null, DDS.StatusMask.STATUS_MASK_NONE); if (writer == null) { shutdown(participant); throw new Exception("create_datawriter error"); } msgDataWriter msg_writer = (msgDataWriter)writer; // --- Write --- // /* Create data sample for writing */ msg instance = msgTypeSupport.create_data(); if (instance == null) { shutdown(participant); throw new Exception("msgTypeSupport.create_data error"); } /* For a data type that has a 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 = msg_writer.register_instance(instance); */ /* Main loop */ const int send_period = 1000; // milliseconds /* Changes for Builtin_Topics */ for (short count = 0; (sample_count == 0) || (count < sample_count); ++count) { System.Threading.Thread.Sleep(send_period); Console.WriteLine("Writing msg, count {0}", count); /* Modify the data to be sent here */ /* Changes for Builtin_Topics */ instance.x = count; try { msg_writer.write(instance, ref instance_handle); } catch (DDS.Exception e) { Console.WriteLine("write error {0}", e); } } /* * try { * msg_writer.unregister_instance( * instance, ref instance_handle); * } catch(DDS.Exception e) { * Console.WriteLine("unregister instance error: {0}", e); * } */ // --- Shutdown --- // /* Delete data sample */ try { msgTypeSupport.delete_data(instance); } catch (DDS.Exception e) { Console.WriteLine("msgTypeSupport.delete_data error: {0}", e); } /* Delete all entities */ shutdown(participant); }