コード例 #1
0
    static void subscribe(int domain_id, int sample_count, int sel_cft)
    {
        // --- 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 = cftTypeSupport.get_type_name();
        try {
            cftTypeSupport.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 cft",
            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");
        }

        /* Sequence of parameters for the content filter expression */
        DDS.StringSeq parameters = new DDS.StringSeq(2);

        /* The default parameter list that we will include in the
         * sequence of parameters will be "1","4" (i.e., 1 <= x <= 4). */
        DDS.StringWrapper[] param_list = new DDS.StringWrapper[2] {
            "1", "4"
        };
        parameters.from_array(param_list);

        /* Create the content filtered topic in case sel_cft
         * is true.
         * The Content Filter Expresion has two parameters:
         * - %0 -- x must be greater or equal than %0.
         * - %1 -- x must be less or equal than %1.
         */
        DDS.ContentFilteredTopic cft = null;
        if (sel_cft != 0)
        {
            cft = participant.create_contentfilteredtopic(
                "ContentFilteredTopic", topic, "(x >= %0 and x <= %1)",
                parameters);
            if (cft == null)
            {
                shutdown(participant);
                throw new ApplicationException(
                          "create_contentfilteredtopic error");
            }
        }

        // --- Create reader --- //

        /* Create a data reader listener */
        cftListener reader_listener =
            new cftListener();

        /* Here we create the reader either using a Content Filtered Topic or
         * a normal topic */
        DDS.DataReader reader = null;
        if (sel_cft != 0)
        {
            Console.WriteLine("Using ContentFiltered Topic");
            reader = subscriber.create_datareader(cft,
                                                  DDS.Subscriber.DATAREADER_QOS_DEFAULT,
                                                  reader_listener, DDS.StatusMask.STATUS_MASK_ALL);
        }
        else
        {
            Console.WriteLine("Using Normal Topic");
            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 ApplicationException("create_datareader error");
        }

        /* If you want to set the reliability and history QoS settings
         * programmatically rather than using the XML, you will need to add
         * the following lines to your code and comment out the
         * create_datareader calls above.
         */

        /*
         * DDS.DataReaderQos datareader_qos = new DDS.DataReaderQos();
         * try {
         *  subscriber.get_default_datareader_qos(datareader_qos);
         * } catch (DDS.Exception e) {
         *  Console.WriteLine("get_default_datareader_qos error {0}", e);
         *  shutdown(participant);
         *  throw e;
         * }
         *
         * datareader_qos.reliability.kind =
         *  DDS.ReliabilityQosPolicyKind.RELIABLE_RELIABILITY_QOS;
         * datareader_qos.durability.kind =
         *  DDS.DurabilityQosPolicyKind.TRANSIENT_LOCAL_DURABILITY_QOS;
         * datareader_qos.history.kind =
         *  DDS.HistoryQosPolicyKind.KEEP_LAST_HISTORY_QOS;
         * datareader_qos.history.depth = 20;
         *
         * if (sel_cft != 0) {
         *  Console.WriteLine("Using ContentFiltered Topic");
         *  reader = subscriber.create_datareader(cft,
         *      datareader_qos, reader_listener,
         *      DDS.StatusMask.STATUS_MASK_ALL);
         * } else {
         *  Console.WriteLine("Using Normal Topic");
         *  reader = subscriber.create_datareader(topic,
         *      datareader_qos, reader_listener,
         *      DDS.StatusMask.STATUS_MASK_ALL);
         * }
         *
         * if (reader == null) {
         *  shutdown(participant);
         *  reader_listener = null;
         *  throw new ApplicationException("create_datareader error");
         * }
         *
         */

        if (sel_cft != 0)
        {
            Console.WriteLine("\n==========================");
            Console.WriteLine("Using CFT\nFilter: 1 <= x <= 4");
            Console.WriteLine("==========================");
        }

        // --- Wait for data --- //

        /* Main loop */
        const System.Int32 receive_period = 1000; // milliseconds

        for (int count = 0;
             (sample_count == 0) || (count < sample_count);
             ++count)
        {
            Console.WriteLine(
                "cft subscriber sleeping for {0} sec...",
                receive_period / 1000);

            System.Threading.Thread.Sleep(receive_period);

            if (sel_cft == 0)
            {
                continue;
            }
            if (count == 10)
            {
                Console.WriteLine("\n==========================");
                Console.WriteLine("Changing filter parameters");
                Console.WriteLine("Filter: 5 <= x <= 9");
                Console.WriteLine("===========================");
                parameters.set_at(0, "5");
                parameters.set_at(1, "9");
                try {
                    cft.set_expression_parameters(parameters);
                } catch (DDS.Exception e) {
                    Console.WriteLine("set_expression_parameters error {0}", e);
                    shutdown(participant);
                    throw e;
                }
            }
            else if (count == 20)
            {
                Console.WriteLine("\n==========================");
                Console.WriteLine("Changing filter parameters");
                Console.WriteLine("Filter: 3 <= x <= 9");
                Console.WriteLine("===========================");
                DDS.StringSeq oldParameters = new DDS.StringSeq();
                cft.get_expression_parameters(oldParameters);

                oldParameters.set_at(0, "3");
                try {
                    cft.set_expression_parameters(oldParameters);
                } catch (DDS.Exception e) {
                    Console.WriteLine("set_expression_parameters error {0}", e);
                    shutdown(participant);
                    throw e;
                }
            }
        }

        // --- Shutdown --- //

        /* Delete all entities */
        shutdown(participant);
        reader_listener = null;
    }
コード例 #2
0
    static void subscribe(int domain_id, int sample_count, int sel_cft)
    {
        // --- 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 = cftTypeSupport.get_type_name();
        try {
            cftTypeSupport.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 cft",
            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");
        }

        /* Sequence of parameters for the content filter expression */
        DDS.StringSeq parameters = new DDS.StringSeq(2);
        /* The default parameter list that we will include in the
         * sequence of parameters will be "1","4" (i.e., 1 <= x <= 4). */
        DDS.StringWrapper[] param_list = new DDS.StringWrapper[2] {"1", "4"};
        parameters.from_array(param_list);
        /* Create the content filtered topic in case sel_cft
         * is true.
         * The Content Filter Expresion has two parameters:
         * - %0 -- x must be greater or equal than %0.
         * - %1 -- x must be less or equal than %1.
         */
        DDS.ContentFilteredTopic cft = null;
        if (sel_cft != 0) {
            cft = participant.create_contentfilteredtopic(
                "ContentFilteredTopic", topic, "(x >= %0 and x <= %1)",
                parameters);
            if (cft == null) {
                shutdown(participant);
                throw new ApplicationException(
                    "create_contentfilteredtopic error");
            }
        }

        // --- Create reader --- //

        /* Create a data reader listener */
        cftListener reader_listener =
            new cftListener();

        /* Here we create the reader either using a Content Filtered Topic or
         * a normal topic */
        DDS.DataReader reader = null;
        if (sel_cft != 0) {
            Console.WriteLine("Using ContentFiltered Topic");
            reader = subscriber.create_datareader(cft,
                DDS.Subscriber.DATAREADER_QOS_DEFAULT,
                reader_listener, DDS.StatusMask.STATUS_MASK_ALL);
        } else {
            Console.WriteLine("Using Normal Topic");
            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 ApplicationException("create_datareader error");
        }

        /* If you want to set the reliability and history QoS settings
         * programmatically rather than using the XML, you will need to add
         * the following lines to your code and comment out the
         * create_datareader calls above.
         */

        /*
        DDS.DataReaderQos datareader_qos = new DDS.DataReaderQos();
        try {
            subscriber.get_default_datareader_qos(datareader_qos);
        } catch (DDS.Exception e) {
            Console.WriteLine("get_default_datareader_qos error {0}", e);
            shutdown(participant);
            throw e;
        }

        datareader_qos.reliability.kind =
            DDS.ReliabilityQosPolicyKind.RELIABLE_RELIABILITY_QOS;
        datareader_qos.durability.kind =
            DDS.DurabilityQosPolicyKind.TRANSIENT_LOCAL_DURABILITY_QOS;
        datareader_qos.history.kind =
            DDS.HistoryQosPolicyKind.KEEP_LAST_HISTORY_QOS;
        datareader_qos.history.depth = 20;

        if (sel_cft != 0) {
            Console.WriteLine("Using ContentFiltered Topic");
            reader = subscriber.create_datareader(cft,
                datareader_qos, reader_listener,
                DDS.StatusMask.STATUS_MASK_ALL);
        } else {
            Console.WriteLine("Using Normal Topic");
            reader = subscriber.create_datareader(topic,
                datareader_qos, reader_listener,
                DDS.StatusMask.STATUS_MASK_ALL);
        }

        if (reader == null) {
            shutdown(participant);
            reader_listener = null;
            throw new ApplicationException("create_datareader error");
        }

        */

        if (sel_cft != 0) {
            Console.WriteLine("\n==========================");
            Console.WriteLine("Using CFT\nFilter: 1 <= x <= 4");
            Console.WriteLine("==========================");
        }

        // --- Wait for data --- //

        /* Main loop */
        const System.Int32 receive_period = 1000; // milliseconds
        for (int count=0;
             (sample_count == 0) || (count < sample_count);
             ++count) {
            Console.WriteLine(
                "cft subscriber sleeping for {0} sec...",
                receive_period / 1000);

            System.Threading.Thread.Sleep(receive_period);

            if (sel_cft == 0) {
                continue;
            }
            if (count == 10) {
                Console.WriteLine("\n==========================");
                Console.WriteLine("Changing filter parameters");
                Console.WriteLine("Filter: 5 <= x <= 9");
                Console.WriteLine("===========================");
                parameters.set_at(0, "5");
                parameters.set_at(1, "9");
                try {
                    cft.set_expression_parameters(parameters);
                } catch (DDS.Exception e) {
                    Console.WriteLine("set_expression_parameters error {0}", e);
                    shutdown(participant);
                    throw e;
                }
            } else if (count == 20) {
                Console.WriteLine("\n==========================");
                Console.WriteLine("Changing filter parameters");
                Console.WriteLine("Filter: 3 <= x <= 9");
                Console.WriteLine("===========================");
                DDS.StringSeq oldParameters = new DDS.StringSeq();
                cft.get_expression_parameters(oldParameters);

                oldParameters.set_at(0, "3");
                try {
                    cft.set_expression_parameters(oldParameters);
                } catch (DDS.Exception e) {
                    Console.WriteLine("set_expression_parameters error {0}", e);
                    shutdown(participant);
                    throw e;
                }
            }
        }

        // --- Shutdown --- //

        /* Delete all entities */
        shutdown(participant);
        reader_listener = null;
    }
コード例 #3
0
    static void subscribe(int domain_id, int sample_count, int sel_cft)
    {
        // --- 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 = cftTypeSupport.get_type_name();
        try {
            cftTypeSupport.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 cft",
            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");
        }

        /* For this filter we only allow 1 parameter */
        DDS.StringSeq parameters = new DDS.StringSeq(1);
        /* The default parameter list that we will include in the
         * sequence of parameters will be "SOME_STRING" */
        DDS.StringWrapper[] param_list =
                new DDS.StringWrapper[1] { "SOME_STRING" };
        parameters.from_array(param_list);
        DDS.ContentFilteredTopic cft = null;

        if (sel_cft == 1) {
            /* create_contentfilteredtopic_with_filter */
            cft = participant.create_contentfilteredtopic_with_filter(
                "ContentFilteredTopic", topic, "name MATCH %0", parameters,
                DDS.DomainParticipant.STRINGMATCHFILTER_NAME);
            if (cft == null) {
                shutdown(participant);
                throw new ApplicationException(
                    "create_contentfilteredtopic_with_filter error");
            }
        }

        // --- Create reader --- //

        /* Create a data reader listener */
        cftListener reader_listener =
            new cftListener();

        DDS.DataReader reader = null;
        if (sel_cft != 0) {
            Console.WriteLine("Using ContentFiltered Topic");
            reader = subscriber.create_datareader(cft,
                DDS.Subscriber.DATAREADER_QOS_DEFAULT,
                reader_listener, DDS.StatusMask.STATUS_MASK_ALL);
        } else {
            Console.WriteLine("Using Normal Topic");
            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 ApplicationException("create_datareader error");
        }

        /* If you want to set the reliability and history QoS settings
         * programmatically rather than using the XML, you will need to add
         * the following lines to your code and comment out the
         * create_datareader calls above.
         */

        /*
        DDS.DataReaderQos datareader_qos = new DDS.DataReaderQos();
        try {
            subscriber.get_default_datareader_qos(datareader_qos);
        } catch (DDS.Exception e) {
            Console.WriteLine("get_default_datareader_qos error {0}", e);
            shutdown(participant);
            throw e;
        }

        datareader_qos.reliability.kind =
            DDS.ReliabilityQosPolicyKind.RELIABLE_RELIABILITY_QOS;
        datareader_qos.durability.kind =
            DDS.DurabilityQosPolicyKind.TRANSIENT_LOCAL_DURABILITY_QOS;
        datareader_qos.history.kind =
            DDS.HistoryQosPolicyKind.KEEP_LAST_HISTORY_QOS;
        datareader_qos.history.depth = 20;

        if (sel_cft != 0) {
            Console.WriteLine("Using ContentFiltered Topic");
            reader = subscriber.create_datareader(cft,
                datareader_qos, reader_listener,
                DDS.StatusMask.STATUS_MASK_ALL);
        } else {
            Console.WriteLine("Using Normal Topic");
            reader = subscriber.create_datareader(topic,
                datareader_qos, reader_listener,
                DDS.StatusMask.STATUS_MASK_ALL);
        }

        if (reader == null) {
            shutdown(participant);
            reader_listener = null;
            throw new ApplicationException("create_datareader error");
        }

        */

        /* Change the filter */
        if (sel_cft == 1) {
            Console.WriteLine(">>> Now setting a new filter: name MATCH \"EVEN\"");
            try {
                cft.append_to_expression_parameter(0, "EVEN");
            } catch (DDS.Exception e) {
                Console.WriteLine("append_to_expression_parameter error {0}", e);
                shutdown(participant);
                throw e;
            }
        }
        // --- Wait for data --- //

        /* Main loop */
        const System.Int32 receive_period = 1000; // milliseconds
        for (int count=0;
             (sample_count == 0) || (count < sample_count); ++count) {
            System.Threading.Thread.Sleep(receive_period);

            if (sel_cft == 0) {
                continue;
            }
            if (count == 10) {
                Console.WriteLine("\n===========================");
                Console.WriteLine("Changing filter parameters");
                Console.WriteLine("Append 'ODD' filter");
                Console.WriteLine("===========================");
                try {
                    cft.append_to_expression_parameter(0, "ODD");
                } catch (DDS.Exception e) {
                    Console.WriteLine(
                        "append_to_expression_parameter error {0}", e);
                    shutdown(participant);
                    throw e;
                }
            }
            if (count == 20) {
                Console.WriteLine("\n===========================");
                Console.WriteLine("Changing filter parameters");
                Console.WriteLine("Removing 'EVEN' filter");
                Console.WriteLine("===========================");
                try {
                    cft.remove_from_expression_parameter(0, "EVEN");
                } catch (DDS.Exception e) {
                    Console.WriteLine(
                        "append_to_expression_parameter error {0}", e);
                    shutdown(participant);
                    throw e;
                }
            }
        }

        // --- Shutdown --- //

        /* Delete all entities */
        shutdown(participant);
        reader_listener = null;
    }
コード例 #4
0
    static void subscribe(int domain_id, int sample_count, int sel_cft)
    {
        // --- 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 = cftTypeSupport.get_type_name();
        try {
            cftTypeSupport.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 cft",
            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");
        }

        /* For this filter we only allow 1 parameter */
        DDS.StringSeq parameters = new DDS.StringSeq(1);

        /* The default parameter list that we will include in the
         * sequence of parameters will be "SOME_STRING" */
        DDS.StringWrapper[] param_list =
            new DDS.StringWrapper[1] {
            "SOME_STRING"
        };
        parameters.from_array(param_list);
        DDS.ContentFilteredTopic cft = null;

        if (sel_cft == 1)
        {
            /* create_contentfilteredtopic_with_filter */
            cft = participant.create_contentfilteredtopic_with_filter(
                "ContentFilteredTopic", topic, "name MATCH %0", parameters,
                DDS.DomainParticipant.STRINGMATCHFILTER_NAME);
            if (cft == null)
            {
                shutdown(participant);
                throw new ApplicationException(
                          "create_contentfilteredtopic_with_filter error");
            }
        }


        // --- Create reader --- //

        /* Create a data reader listener */
        cftListener reader_listener =
            new cftListener();

        DDS.DataReader reader = null;
        if (sel_cft != 0)
        {
            Console.WriteLine("Using ContentFiltered Topic");
            reader = subscriber.create_datareader(cft,
                                                  DDS.Subscriber.DATAREADER_QOS_DEFAULT,
                                                  reader_listener, DDS.StatusMask.STATUS_MASK_ALL);
        }
        else
        {
            Console.WriteLine("Using Normal Topic");
            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 ApplicationException("create_datareader error");
        }

        /* If you want to set the reliability and history QoS settings
         * programmatically rather than using the XML, you will need to add
         * the following lines to your code and comment out the
         * create_datareader calls above.
         */

        /*
         * DDS.DataReaderQos datareader_qos = new DDS.DataReaderQos();
         * try {
         *  subscriber.get_default_datareader_qos(datareader_qos);
         * } catch (DDS.Exception e) {
         *  Console.WriteLine("get_default_datareader_qos error {0}", e);
         *  shutdown(participant);
         *  throw e;
         * }
         *
         * datareader_qos.reliability.kind =
         *  DDS.ReliabilityQosPolicyKind.RELIABLE_RELIABILITY_QOS;
         * datareader_qos.durability.kind =
         *  DDS.DurabilityQosPolicyKind.TRANSIENT_LOCAL_DURABILITY_QOS;
         * datareader_qos.history.kind =
         *  DDS.HistoryQosPolicyKind.KEEP_LAST_HISTORY_QOS;
         * datareader_qos.history.depth = 20;
         *
         * if (sel_cft != 0) {
         *  Console.WriteLine("Using ContentFiltered Topic");
         *  reader = subscriber.create_datareader(cft,
         *      datareader_qos, reader_listener,
         *      DDS.StatusMask.STATUS_MASK_ALL);
         * } else {
         *  Console.WriteLine("Using Normal Topic");
         *  reader = subscriber.create_datareader(topic,
         *      datareader_qos, reader_listener,
         *      DDS.StatusMask.STATUS_MASK_ALL);
         * }
         *
         * if (reader == null) {
         *  shutdown(participant);
         *  reader_listener = null;
         *  throw new ApplicationException("create_datareader error");
         * }
         *
         */

        /* Change the filter */
        if (sel_cft == 1)
        {
            Console.WriteLine(">>> Now setting a new filter: name MATCH \"EVEN\"");
            try {
                cft.append_to_expression_parameter(0, "EVEN");
            } catch (DDS.Exception e) {
                Console.WriteLine("append_to_expression_parameter error {0}", e);
                shutdown(participant);
                throw e;
            }
        }
        // --- Wait for data --- //

        /* Main loop */
        const System.Int32 receive_period = 1000; // milliseconds

        for (int count = 0;
             (sample_count == 0) || (count < sample_count); ++count)
        {
            System.Threading.Thread.Sleep(receive_period);

            if (sel_cft == 0)
            {
                continue;
            }
            if (count == 10)
            {
                Console.WriteLine("\n===========================");
                Console.WriteLine("Changing filter parameters");
                Console.WriteLine("Append 'ODD' filter");
                Console.WriteLine("===========================");
                try {
                    cft.append_to_expression_parameter(0, "ODD");
                } catch (DDS.Exception e) {
                    Console.WriteLine(
                        "append_to_expression_parameter error {0}", e);
                    shutdown(participant);
                    throw e;
                }
            }
            if (count == 20)
            {
                Console.WriteLine("\n===========================");
                Console.WriteLine("Changing filter parameters");
                Console.WriteLine("Removing 'EVEN' filter");
                Console.WriteLine("===========================");
                try {
                    cft.remove_from_expression_parameter(0, "EVEN");
                } catch (DDS.Exception e) {
                    Console.WriteLine(
                        "append_to_expression_parameter error {0}", e);
                    shutdown(participant);
                    throw e;
                }
            }
        }

        // --- Shutdown --- //

        /* Delete all entities */
        shutdown(participant);
        reader_listener = null;
    }