Example #1
0
    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;
    }