예제 #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 = ccfTypeSupport.get_type_name();
        try {
            ccfTypeSupport.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 ccf",
            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");
        }

        /* Start changes for Custom Content Filter */
        /* Create and register custom filter */
        custom_filter_type custom_filter = new custom_filter_type();

        try {
            participant.register_contentfilter("CustomFilter", custom_filter);
        }
        catch (DDS.Exception e) {
            Console.WriteLine("write error {0}", e);
        }

        DDS.StringSeq       parameters = new DDS.StringSeq(2);
        DDS.StringWrapper[] param_list = { "2", "divides" };

        parameters.from_array(param_list);

        /* Create content filtered topic */
        DDS.ContentFilteredTopic cft =
            participant.create_contentfilteredtopic_with_filter(
                "ContentFilteredTopic", topic, "%0 %1 x", parameters,
                "CustomFilter"); // custom filter name
        if (cft == null)
        {
            shutdown(participant);
            throw new ApplicationException(
                      "create_contentfilteredtopic_with_filter error");
        }

        Console.WriteLine("Filter: 2 divides x");

        /* Also note that we pass 'cft' rather than 'topic' to the
         * datareader below
         */

        /* End changes for Custom Contet Filter */

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

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


        /*
         * NOTE THAT WE USE THE PREVIOUSLY CREATED CUSTOM FILTERED
         * TOPIC TO READ NEW SAMPLES
         */
        /* 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");
        }

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

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

        for (int count = 0;
             (sample_count == 0) || (count < sample_count);
             ++count)
        {
            if (count == 10)
            {
                Console.WriteLine("changing filter parameters");
                Console.WriteLine("Filter: 15 greater-than x");
                parameters.set_at(0, "15");
                parameters.set_at(1, "greater-than");
                cft.set_expression_parameters(parameters);
            }
            else if (count == 20)
            {
                Console.WriteLine("changing filter parameters");
                Console.WriteLine("Filter: 3 divides x");
                DDS.StringSeq old_parameters = new DDS.StringSeq();
                cft.get_expression_parameters(old_parameters);

                old_parameters.set_at(0, "3");
                old_parameters.set_at(1, "divides");
                cft.set_expression_parameters(old_parameters);
            }

            System.Threading.Thread.Sleep(receive_period);
        }

        // --- 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;
    }