static void subscribe(int domain_id, int sample_count) { // --- Create participant --- // /* To customize the 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 ApplicationException("create_participant error"); } // --- 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 ApplicationException("create_subscriber error"); } // --- Create topic --- // /* Register the type before creating the topic */ System.String type_name = deadline_contentfilterTypeSupport.get_type_name(); try { deadline_contentfilterTypeSupport.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 deadline_contentfilter", type_name, DDS.DomainParticipant.TOPIC_QOS_DEFAULT, null /* listener */, DDS.StatusMask.STATUS_MASK_NONE); if (topic == null) { shutdown(participant); throw new ApplicationException("create_topic error"); } // --- Create reader --- // //// Start changes for Deadline // Set up content filtered topic to show interaction with deadline DDS.StringSeq parameters = new DDS.StringSeq(1); // need to specify length otherwise create_contentfilteredtopic will // throw an unhandled exception error! if (parameters.ensure_length(1, 1) == false) { Console.WriteLine("ensure_length error\n"); } parameters.set_at(0, "2"); DDS.ContentFilteredTopic cft = participant.create_contentfilteredtopic( "ContentFilteredTopic", topic, "code < %0", parameters); /* Create a data reader listener */ deadline_contentfilterListener reader_listener = new deadline_contentfilterListener(); /* To customize the data reader QoS, use * the configuration file USER_QOS_PROFILES.xml */ DDS.DataReader reader = subscriber.create_datareader( cft, DDS.Subscriber.DATAREADER_QOS_DEFAULT, reader_listener, DDS.StatusMask.STATUS_MASK_ALL); if (reader == null) { shutdown(participant); reader_listener = null; throw new ApplicationException("create_datareader error"); } /* If you want to change the DataReader's QoS programmatically rather than * using the XML file, you will need to add the following lines to your * code and comment out the create_datareader call above. * * In this case, we set the deadline period to 2 seconds to trigger * a deadline if the DataWriter does not update often enough, or if * the content-filter filters out data so there is no data available * with 2 seconds. */ /* * DDS.DataReaderQos datareader_qos = new DDS.DataReaderQos(); * subscriber.get_default_datareader_qos(datareader_qos); * if (datareader_qos == null) * { * shutdown(participant); * reader_listener = null; * throw new ApplicationException("get_default_datareader_qos error"); * } * * // Set deadline QoS to be 2 sec * datareader_qos.deadline.period.sec = 2; * datareader_qos.deadline.period.nanosec = 0; * * DDS.DataReader reader = subscriber.create_datareader( * topic, * datareader_qos, //DDS.Subscriber.DATAREADER_QOS_DEFAULT, * reader_listener, * DDS.StatusMask.STATUS_MASK_ALL); * if (reader == null) * { * shutdown(participant); * reader_listener = null; * throw new ApplicationException("create_datareader error"); * } */ // --- Wait for data --- // /* Main loop */ const System.Int32 receive_period = 1000; // milliseconds for (int count = 0; (sample_count == 0) || (count < sample_count); ++count) { // After 10 seconds, change content filter to accept only // instance 0 if (count == 10) { Console.WriteLine("Starting to filter out instance1\n"); parameters.set_at(0, "1"); cft.set_expression_parameters(parameters); } System.Threading.Thread.Sleep(receive_period); } // --- Shutdown --- // /* Delete all entities */ shutdown(participant); reader_listener = null; }
static void subscribe(int domain_id, int sample_count) { // --- Create participant --- // /* To customize the 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 ApplicationException("create_participant error"); } // --- 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 ApplicationException("create_subscriber error"); } // --- Create topic --- // /* Register the type before creating the topic */ System.String type_name = deadline_contentfilterTypeSupport.get_type_name(); try { deadline_contentfilterTypeSupport.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 deadline_contentfilter", type_name, DDS.DomainParticipant.TOPIC_QOS_DEFAULT, null /* listener */, DDS.StatusMask.STATUS_MASK_NONE); if (topic == null) { shutdown(participant); throw new ApplicationException("create_topic error"); } // --- Create reader --- // //// Start changes for Deadline // Set up content filtered topic to show interaction with deadline DDS.StringSeq parameters = new DDS.StringSeq(1); // need to specify length otherwise create_contentfilteredtopic will // throw an unhandled exception error! if (parameters.ensure_length(1, 1) == false) { Console.WriteLine("ensure_length error\n"); } parameters.set_at(0, "2"); DDS.ContentFilteredTopic cft = participant.create_contentfilteredtopic( "ContentFilteredTopic", topic, "code < %0", parameters); /* Create a data reader listener */ deadline_contentfilterListener reader_listener = new deadline_contentfilterListener(); /* To customize the data reader QoS, use the configuration file USER_QOS_PROFILES.xml */ DDS.DataReader reader = subscriber.create_datareader( cft, DDS.Subscriber.DATAREADER_QOS_DEFAULT, reader_listener, DDS.StatusMask.STATUS_MASK_ALL); if (reader == null) { shutdown(participant); reader_listener = null; throw new ApplicationException("create_datareader error"); } /* If you want to change the DataReader's QoS programmatically rather than * using the XML file, you will need to add the following lines to your * code and comment out the create_datareader call above. * * In this case, we set the deadline period to 2 seconds to trigger * a deadline if the DataWriter does not update often enough, or if * the content-filter filters out data so there is no data available * with 2 seconds. */ /* DDS.DataReaderQos datareader_qos = new DDS.DataReaderQos(); subscriber.get_default_datareader_qos(datareader_qos); if (datareader_qos == null) { shutdown(participant); reader_listener = null; throw new ApplicationException("get_default_datareader_qos error"); } // Set deadline QoS to be 2 sec datareader_qos.deadline.period.sec = 2; datareader_qos.deadline.period.nanosec = 0; DDS.DataReader reader = subscriber.create_datareader( topic, datareader_qos, //DDS.Subscriber.DATAREADER_QOS_DEFAULT, reader_listener, DDS.StatusMask.STATUS_MASK_ALL); if (reader == null) { shutdown(participant); reader_listener = null; throw new ApplicationException("create_datareader error"); } */ // --- Wait for data --- // /* Main loop */ const System.Int32 receive_period = 1000; // milliseconds for (int count=0; (sample_count == 0) || (count < sample_count); ++count) { // After 10 seconds, change content filter to accept only // instance 0 if (count == 10) { Console.WriteLine("Starting to filter out instance1\n"); parameters.set_at(0, "1"); cft.set_expression_parameters(parameters); } System.Threading.Thread.Sleep(receive_period); } // --- Shutdown --- // /* Delete all entities */ shutdown(participant); reader_listener = null; }