Example #1
0
 public void setContentFilter(string cft_name, string expression, DDS.StringWrapper[] param_list)
 {
     DDS.StringSeq parameters = new DDS.StringSeq(param_list.Length);
     parameters.from_array(param_list);
     cftTopic = participant.create_contentfilteredtopic(cft_name, topic, expression, parameters);
     if (cftTopic == null)
     {
         throw new ApplicationException(
                   "create_contentfilteredtopic error");
     }
 }
Example #2
0
    /* Called when Custom Filter is created, or when parameters are changed */
    public void compile(ref object compile_data, string expression,
                        DDS.StringSeq parameters, DDS.TypeCode type_code,
                        string type_class_name, object old_compile_data)
    {
        /* We expect an expression of the form "%0 %1 <var>"
         * where %1 = "divides" or "greater-than"
         * and <var> is an integral member of the msg structure.
         *
         * We don't actually check that <var> has the correct typecode,
         * (or even that it exists!). See example Typecodes to see
         * how to work with typecodes.
         *
         * The compile information is a structure including the first filter
         * parameter (%0) and a function pointer to evaluate the sample
         */

        if (expression.StartsWith("%0 %1 ") && expression.Length > 6 &&
            parameters.length > 1)      // Enought parameters?
        {
            long p = Convert.ToInt64(parameters.get_at(0));

            if (String.Compare(parameters.get_at(1), "greater-than") == 0)
            {
                compile_data = new gt_test(p);
                return;
            }
            else if (String.Compare(parameters.get_at(1), "divides") == 0)
            {
                compile_data = new divide_test(p);
                return;
            }
        }

        Console.WriteLine("CustomFilter: Unable to compile expresssion '"
                          + expression + "'");
        Console.WriteLine("              with parameters '" + parameters.get_at(0)
                          + "' '" + parameters.get_at(1) + "'");
        //throw (new DDS.Retcode_BadParameter());
    }
    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 = queryconditionTypeSupport.get_type_name();
        try {
            queryconditionTypeSupport.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 querycondition",
            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 --- //

        /* 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,
            null,
            DDS.StatusMask.STATUS_MASK_ALL);
        if (reader == null) {
            shutdown(participant);
            throw new ApplicationException("create_datareader error");
        }

        /* If you want to change datareader_qos.history 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. */

        /*DDS.DataReaderQos reader_qos = new DDS.DataReaderQos();
        subscriber.get_default_datareader_qos(reader_qos);

        reader_qos.history.kind = DDS.HistoryQosPolicyKind.KEEP_LAST_HISTORY_QOS;
        reader_qos.history.depth = 6;

        DDS.DataReader reader = subscriber.create_datareader(
            topic,
            reader_qos,
            reader_listener,
            DDS.StatusMask.STATUS_MASK_ALL);
        if (reader == null)
        {
            shutdown(participant);
            reader_listener = null;
            throw new ApplicationException("create_datareader error");
        } */

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

        /* NOTE: There must be single-quotes in the query parameters around
         * any strings!  The single-quotes do NOT go in the query condition
         * itself.
         */
        DDS.QueryCondition query_for_guid2;

        DDS.StringSeq query_parameters = new DDS.StringSeq();
        query_parameters.ensure_length(1, 1);
        query_parameters.set_at(0, "'GUID2'");

        queryconditionDataReader querycondition_reader =
                (queryconditionDataReader)reader;
        query_for_guid2 = querycondition_reader.create_querycondition(
            DDS.SampleStateKind.ANY_SAMPLE_STATE,
            DDS.ViewStateKind.ANY_VIEW_STATE,
            DDS.InstanceStateKind.ALIVE_INSTANCE_STATE,
            "id MATCH %0",
            query_parameters);

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

            System.Threading.Thread.Sleep(receive_period);

            queryconditionSeq data_seq = new queryconditionSeq();
            DDS.SampleInfoSeq info_seq = new DDS.SampleInfoSeq();

            try
            {
                querycondition_reader.read_w_condition(
                    data_seq,
                    info_seq,
                    DDS.ResourceLimitsQosPolicy.LENGTH_UNLIMITED,
                    query_for_guid2);
            }
            catch (DDS.Retcode_NoData e)
            {
                continue;
            }
            catch (DDS.Exception e)
            {
                shutdown(participant);
                throw e;
            }

            int len = 0;
            double sum = 0;

            /* Iterate through the samples read using the read_w_condition() method,
             * accessing only the samples of GUID2.  Then, show the number of samples
             * received and, adding the value of x on each of them to calculate the
             * average afterwards. */
            for (int i = 0; i < data_seq.length; ++i)
            {
                if (!info_seq.get_at(i).valid_data)
                    continue;
                len++;
                sum += data_seq.get_at(i).value;
                Console.WriteLine("Guid = {0}\n", data_seq.get_at(i).id);
            }

            if (len > 0)
            {
                Console.WriteLine("Got {0} samples.  Avg = {1}\n", len, sum / len);

            }
            try
            {
                querycondition_reader.return_loan(data_seq, info_seq);
            }
            catch (DDS.Exception e)
            {
                Console.WriteLine("return loan error {0}", e);
            }

        }

        // --- Shutdown --- //

        /* Delete all entities */
        shutdown(participant);
    }
Example #5
0
        private static void Subscribe(int domainId, int sampleCount)
        {
            // --- Create participant --- //
            DDS.DomainParticipant participant =
                DDS.DomainParticipantFactory.get_instance().create_participant(
                    domainId,
                    DDS.DomainParticipantFactory.PARTICIPANT_QOS_DEFAULT,
                    null /* listener */,
                    DDS.StatusMask.STATUS_MASK_NONE);
            if (participant == null)
            {
                Shutdown(participant);
                throw new Exception("create_participant error");
            }

            // --- Create subscriber --- //
            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.
            string typeName = FlightTypeSupport.get_type_name();

            try {
                FlightTypeSupport.register_type(participant, typeName);
            }
            catch (DDS.Exception e) {
                Console.WriteLine("register_type error {0}", e);
                Shutdown(participant);
                throw e;
            }

            DDS.Topic topic = participant.create_topic(
                "Example Flight",
                typeName,
                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 --- //
            DDS.DataReader reader = subscriber.create_datareader(
                topic,
                DDS.Subscriber.DATAREADER_QOS_DEFAULT,
                null,
                DDS.StatusMask.STATUS_MASK_ALL);
            if (reader == null)
            {
                Shutdown(participant);
                throw new ApplicationException("create_datareader error");
            }

            FlightDataReader flightReader = (FlightDataReader)reader;

            // Query for company named 'CompanyA' and for flights in cruise
            // (about 30,000ft). The company parameter will be changed in
            // run-time. NOTE: There must be single-quotes in the query
            // parameters around-any strings! The single-quote do NOT go in the
            // query condition itself.
            DDS.StringSeq queryParameters = new DDS.StringSeq();
            queryParameters.ensure_length(2, 2);
            queryParameters.set_at(0, "'CompanyA'");
            queryParameters.set_at(1, "30000");
            Console.WriteLine(
                "Setting parameters to company: {0} and altitude >= {1}\n",
                queryParameters.get_at(0), queryParameters.get_at(1));

            // Create the query condition with an expession to MATCH the id
            // field in the structure and a numeric comparison.
            DDS.QueryCondition queryCondition =
                reader.create_querycondition(
                    DDS.SampleStateKind.ANY_SAMPLE_STATE,
                    DDS.ViewStateKind.ANY_VIEW_STATE,
                    DDS.InstanceStateKind.ALIVE_INSTANCE_STATE,
                    "company MATCH %0 AND altitude >= %1",
                    queryParameters);

            // --- Wait for data --- //
            const int receivePeriod = 1000; // Milliseconds
            bool      update        = false;

            for (int count = 0;
                 (sampleCount == 0) || (count < sampleCount);
                 count++)
            {
                // Poll for new samples every second.
                System.Threading.Thread.Sleep(receivePeriod);

                // Change the filter parameter after 5 seconds.
                if ((count + 1) % 10 == 5)
                {
                    queryParameters.set_at(0, "'CompanyB'");
                    update = true;
                }
                else if ((count + 1) % 10 == 0)
                {
                    queryParameters.set_at(0, "'CompanyA'");
                    update = true;
                }

                // Set new parameters.
                if (update)
                {
                    Console.WriteLine("Changing parameter to {0}",
                                      queryParameters.get_at(0));
                    queryCondition.set_query_parameters(queryParameters);
                    update = false;
                }

                // Iterate through the samples using read_w_condition.
                FlightSeq         dataSeq = new FlightSeq();
                DDS.SampleInfoSeq infoSeq = new DDS.SampleInfoSeq();
                try {
                    flightReader.read_w_condition(
                        dataSeq,
                        infoSeq,
                        DDS.ResourceLimitsQosPolicy.LENGTH_UNLIMITED,
                        queryCondition);
                } catch (DDS.Retcode_NoData) {
                    continue;
                } catch (DDS.Exception e) {
                    Shutdown(participant);
                    throw e;
                }

                for (int i = 0; i < dataSeq.length; i++)
                {
                    DDS.SampleInfo info = (DDS.SampleInfo)infoSeq.get_at(i);
                    if (info.valid_data)
                    {
                        Flight flight_info = (Flight)dataSeq.get_at(i);
                        Console.WriteLine(
                            "\t[trackId: {0}, company: {1}, altitude: {2}]\n",
                            flight_info.trackId,
                            flight_info.company,
                            flight_info.altitude);
                    }
                }

                try {
                    flightReader.return_loan(dataSeq, infoSeq);
                } catch (DDS.Exception e) {
                    Console.WriteLine("return loan error {0}", e);
                }
            }

            // Delete all entities
            Shutdown(participant);
        }
        private static void Subscribe(int domainId, int sampleCount)
        {
            // --- Create participant --- //
            DDS.DomainParticipant participant =
                DDS.DomainParticipantFactory.get_instance().create_participant(
                    domainId,
                    DDS.DomainParticipantFactory.PARTICIPANT_QOS_DEFAULT,
                    null /* listener */,
                    DDS.StatusMask.STATUS_MASK_NONE);
            if (participant == null) {
                Shutdown(participant);
                throw new Exception("create_participant error");
            }

            // --- Create subscriber --- //
            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.
            string typeName = FlightTypeSupport.get_type_name();
            try {
                FlightTypeSupport.register_type(participant, typeName);
            }
            catch(DDS.Exception e) {
                Console.WriteLine("register_type error {0}", e);
                Shutdown(participant);
                throw e;
            }

            DDS.Topic topic = participant.create_topic(
                "Example Flight",
                typeName,
                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 --- //
            DDS.DataReader reader = subscriber.create_datareader(
                topic,
                DDS.Subscriber.DATAREADER_QOS_DEFAULT,
                null,
                DDS.StatusMask.STATUS_MASK_ALL);
            if (reader == null) {
                Shutdown(participant);
                throw new ApplicationException("create_datareader error");
            }

            FlightDataReader flightReader = (FlightDataReader)reader;

            // Query for company named 'CompanyA' and for flights in cruise
            // (about 30,000ft). The company parameter will be changed in
            // run-time. NOTE: There must be single-quotes in the query
            // parameters around-any strings! The single-quote do NOT go in the
            // query condition itself.
            DDS.StringSeq queryParameters = new DDS.StringSeq();
            queryParameters.ensure_length(2, 2);
            queryParameters.set_at(0, "'CompanyA'");
            queryParameters.set_at(1, "30000");
            Console.WriteLine(
                "Setting parameters to company: {0} and altitude >= {1}\n",
                queryParameters.get_at(0), queryParameters.get_at(1));

            // Create the query condition with an expession to MATCH the id
            // field in the structure and a numeric comparison.
            DDS.QueryCondition queryCondition =
                reader.create_querycondition(
                    DDS.SampleStateKind.ANY_SAMPLE_STATE,
                    DDS.ViewStateKind.ANY_VIEW_STATE,
                    DDS.InstanceStateKind.ALIVE_INSTANCE_STATE,
                    "company MATCH %0 AND altitude >= %1",
                    queryParameters);

            // --- Wait for data --- //
            const int receivePeriod = 1000; // Milliseconds
            bool update = false;
            for (int count = 0;
                 (sampleCount == 0) || (count < sampleCount);
                 count++)
            {
                // Poll for new samples every second.
                System.Threading.Thread.Sleep(receivePeriod);

                // Change the filter parameter after 5 seconds.
                if ((count + 1) % 10 == 5) {
                    queryParameters.set_at(0, "'CompanyB'");
                    update = true;
                } else if ((count + 1) % 10 == 0) {
                    queryParameters.set_at(0, "'CompanyA'");
                    update = true;
                }

                // Set new parameters.
                if (update) {
                    Console.WriteLine("Changing parameter to {0}",
                        queryParameters.get_at(0));
                    queryCondition.set_query_parameters(queryParameters);
                    update = false;
                }

                // Iterate through the samples using read_w_condition.
                FlightSeq dataSeq = new FlightSeq();
                DDS.SampleInfoSeq infoSeq = new DDS.SampleInfoSeq();
                try {
                    flightReader.read_w_condition(
                        dataSeq,
                        infoSeq,
                        DDS.ResourceLimitsQosPolicy.LENGTH_UNLIMITED,
                        queryCondition);
                } catch (DDS.Retcode_NoData) {
                    continue;
                } catch (DDS.Exception e) {
                    Shutdown(participant);
                    throw e;
                }

                for (int i = 0; i < dataSeq.length; i++) {
                    DDS.SampleInfo info = (DDS.SampleInfo)infoSeq.get_at(i);
                    if (info.valid_data) {
                        Flight flight_info = (Flight)dataSeq.get_at(i);
                        Console.WriteLine(
                            "\t[trackId: {0}, company: {1}, altitude: {2}]\n",
                            flight_info.trackId,
                            flight_info.company,
                            flight_info.altitude);
                    }
                }

                try {
                    flightReader.return_loan(dataSeq, infoSeq);
                } catch (DDS.Exception e) {
                    Console.WriteLine("return loan error {0}", e);
                }
            }

            // Delete all entities
            Shutdown(participant);
        }
Example #7
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;
    }
    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 = queryconditionTypeSupport.get_type_name();
        try {
            queryconditionTypeSupport.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 querycondition",
            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 --- //


        /* 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,
            null,
            DDS.StatusMask.STATUS_MASK_ALL);
        if (reader == null)
        {
            shutdown(participant);
            throw new ApplicationException("create_datareader error");
        }

        /* If you want to change datareader_qos.history 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. */

        /*DDS.DataReaderQos reader_qos = new DDS.DataReaderQos();
         * subscriber.get_default_datareader_qos(reader_qos);
         *
         * reader_qos.history.kind = DDS.HistoryQosPolicyKind.KEEP_LAST_HISTORY_QOS;
         * reader_qos.history.depth = 6;
         *
         * DDS.DataReader reader = subscriber.create_datareader(
         *  topic,
         *  reader_qos,
         *  reader_listener,
         *  DDS.StatusMask.STATUS_MASK_ALL);
         * if (reader == null)
         * {
         *  shutdown(participant);
         *  reader_listener = null;
         *  throw new ApplicationException("create_datareader error");
         * } */

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

        /* NOTE: There must be single-quotes in the query parameters around
         * any strings!  The single-quotes do NOT go in the query condition
         * itself.
         */
        DDS.QueryCondition query_for_guid2;

        DDS.StringSeq query_parameters = new DDS.StringSeq();
        query_parameters.ensure_length(1, 1);
        query_parameters.set_at(0, "'GUID2'");

        queryconditionDataReader querycondition_reader =
            (queryconditionDataReader)reader;

        query_for_guid2 = querycondition_reader.create_querycondition(
            DDS.SampleStateKind.ANY_SAMPLE_STATE,
            DDS.ViewStateKind.ANY_VIEW_STATE,
            DDS.InstanceStateKind.ALIVE_INSTANCE_STATE,
            "id MATCH %0",
            query_parameters);

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

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

            queryconditionSeq data_seq = new queryconditionSeq();
            DDS.SampleInfoSeq info_seq = new DDS.SampleInfoSeq();

            try
            {
                querycondition_reader.read_w_condition(
                    data_seq,
                    info_seq,
                    DDS.ResourceLimitsQosPolicy.LENGTH_UNLIMITED,
                    query_for_guid2);
            }
            catch (DDS.Retcode_NoData e)
            {
                continue;
            }
            catch (DDS.Exception e)
            {
                shutdown(participant);
                throw e;
            }

            int    len = 0;
            double sum = 0;

            /* Iterate through the samples read using the read_w_condition() method,
             * accessing only the samples of GUID2.  Then, show the number of samples
             * received and, adding the value of x on each of them to calculate the
             * average afterwards. */
            for (int i = 0; i < data_seq.length; ++i)
            {
                if (!info_seq.get_at(i).valid_data)
                {
                    continue;
                }
                len++;
                sum += data_seq.get_at(i).value;
                Console.WriteLine("Guid = {0}\n", data_seq.get_at(i).id);
            }

            if (len > 0)
            {
                Console.WriteLine("Got {0} samples.  Avg = {1}\n", len, sum / len);
            }
            try
            {
                querycondition_reader.return_loan(data_seq, info_seq);
            }
            catch (DDS.Exception e)
            {
                Console.WriteLine("return loan error {0}", e);
            }
        }

        // --- Shutdown --- //

        /* Delete all entities */
        shutdown(participant);
    }
    static void subscribe(int domain_id, int sample_count, 
        String participant_auth, String reader_auth)
    {
        // --- Create participant --- //

        /* Start changes for programmatically qos */

        /* If you want to change the Participant'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.
         */

        /* Set user_data qos field for participant */

        /* Get default participant QoS to customize */
        DDS.DomainParticipantQos participant_qos =
            new DDS.DomainParticipantQos();
        DDS.DomainParticipantFactory.get_instance().
            get_default_participant_qos(participant_qos);

        DDS.StringSeq temp = new DDS.StringSeq(0);
        participant_qos.discovery.multicast_receive_addresses = temp;

        // user_data is opaque to DDS, so we include trailing \0 for string
        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.Default.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 ApplicationException("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 ApplicationException("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 ApplicationException("create_topic error");
        }

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

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

        /* Start changes for Builtin_Topics */
        /* Set user_data qos field for datareader */
        DDS.DataReaderQos datareader_qos = new DDS.DataReaderQos();
        subscriber.get_default_datareader_qos(datareader_qos);

        /* user_data is opaque to DDS, so we include trailing \0 for string */
        len = reader_auth.Length;
        max = participant_qos.resource_limits.reader_user_data_max_length;

        if (len > max) {
            Console.WriteLine(
                "error, datareader 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.
             */
            datareader_qos.user_data.value.from_array(
                System.Text.Encoding.Default.GetBytes(reader_auth));
        }

        /* To customize the data reader QoS, use
           the configuration file USER_QOS_PROFILES.xml */
        DDS.DataReader 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");
        }

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

        }

        // --- 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 = market_dataTypeSupport.get_type_name();
        try {
            market_dataTypeSupport.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 market_data",
            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 MultiChannel */
        DDS.StringSeq expression_parameters = new DDS.StringSeq(1);
        DDS.ContentFilteredTopic filtered_topic =
            participant.create_contentfilteredtopic_with_filter(
                "Example market_data",
                topic,
                "Symbol MATCH 'A'", expression_parameters,
                DDS.DomainParticipant.STRINGMATCHFILTER_NAME);

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

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

        /* To customize the data reader QoS, use
           the configuration file USER_QOS_PROFILES.xml */
        DDS.DataReader reader = subscriber.create_datareader(
            filtered_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");
        }

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

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

            if (count == 3) {
                filtered_topic.append_to_expression_parameter(0, "D");
                Console.WriteLine("changed filter to Symbol MATCH 'AD'");
            }
            if (count == 6) {
                filtered_topic.remove_from_expression_parameter(0, "A");
                Console.WriteLine("changed filter to Symbol MATCH 'D'");
            }

            System.Threading.Thread.Sleep(receive_period);

        }
        /* End changes for MultiChannel */

        // --- Shutdown --- //

        /* Delete all entities */
        shutdown(participant);
        reader_listener = null;
    }
Example #11
0
    static void subscribe(int domain_id, int sample_count)
    {
        /* Auxiliary variables */
        String odd_string  = "'ODD'";
        String even_string = "'EVEN'";

        // --- 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 = waitset_query_condTypeSupport.get_type_name();
        try {
            waitset_query_condTypeSupport.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 waitset_query_cond",
            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 --- //

        /* 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,
            null,
            DDS.StatusMask.STATUS_MASK_NONE);
        if (reader == null)
        {
            shutdown(participant);
            throw new ApplicationException("create_datareader error");
        }
        waitset_query_condDataReader waitset_query_cond_reader =
            (waitset_query_condDataReader)reader;

        /* Create query condition */
        DDS.StringSeq query_parameters = new DDS.StringSeq(1);
        query_parameters.ensure_length(1, 1);

        /* The initial value of the parameters is EVEN string */
        query_parameters.set_at(0, even_string);

        String query_expression = "name MATCH %0";

        DDS.QueryCondition query_condition =
            waitset_query_cond_reader.create_querycondition(
                DDS.SampleStateKind.NOT_READ_SAMPLE_STATE,
                DDS.ViewStateKind.ANY_VIEW_STATE,
                DDS.InstanceStateKind.ANY_INSTANCE_STATE,
                query_expression,
                query_parameters);
        if (query_condition == null)
        {
            shutdown(participant);
            throw new ApplicationException("create_querycondition error");
        }

        DDS.WaitSet waitset = new DDS.WaitSet();
        if (waitset == null)
        {
            shutdown(participant);
            throw new ApplicationException("create waitset error");
        }

        /* Attach Query Conditions */
        try {
            waitset.attach_condition((DDS.Condition)query_condition);
        } catch (DDS.Exception e) {
            Console.WriteLine("attach_condition error {0}", e);
            shutdown(participant);
            throw e;
        }

        DDS.Duration_t wait_timeout;
        wait_timeout.nanosec = (uint)500000000;
        wait_timeout.sec     = 1;

        Console.WriteLine("\n>>>Timeout: {0} sec",
                          wait_timeout.sec, wait_timeout.nanosec);
        Console.WriteLine(">>> Query conditions: name MATCH %0");
        Console.WriteLine("\t%0 = {0}", query_parameters.get_at(0));
        Console.WriteLine("---------------------------------\n");


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

        /* Main loop */

        for (int count = 0;
             (sample_count == 0) || (count < sample_count);
             ++count)
        {
            DDS.ConditionSeq active_conditions_seq = new DDS.ConditionSeq();

            /* We set a new parameter in the Query Condition after 7 secs */
            if (count == 7)
            {
                query_parameters.set_at(0, odd_string);
                Console.WriteLine("CHANGING THE QUERY CONDITION");
                Console.WriteLine("\n>>> Query conditions: name MATCH %0");
                Console.WriteLine("\t%0 = {0}", query_parameters.get_at(0));
                Console.WriteLine(">>> We keep one sample in the history");
                Console.WriteLine("-------------------------------------\n");
                query_condition.set_query_parameters(query_parameters);
            }

            /* wait() blocks execution of the thread until one or more attached
             * Conditions become true, or until a user-specified timeout
             * expires.
             */
            try {
                waitset.wait(active_conditions_seq, wait_timeout);
            } catch (DDS.Retcode_Timeout) {
                Console.WriteLine("Wait timed out!! No conditions were " +
                                  "triggered.");
                continue;
            } catch (DDS.Exception e) {
                Console.WriteLine("wait error {0}", e);
                break;
            }

            waitset_query_condSeq data_seq = new waitset_query_condSeq();
            DDS.SampleInfoSeq     info_seq = new DDS.SampleInfoSeq();

            bool follow = true;
            while (follow)
            {
                try {
                    waitset_query_cond_reader.take_w_condition(
                        data_seq, info_seq,
                        DDS.ResourceLimitsQosPolicy.LENGTH_UNLIMITED,
                        query_condition);

                    for (int i = 0; i < data_seq.length; ++i)
                    {
                        if (!info_seq.get_at(i).valid_data)
                        {
                            Console.WriteLine("Got metadata");
                            continue;
                        }
                        waitset_query_condTypeSupport.print_data(
                            data_seq.get_at(i));
                    }
                } catch (DDS.Retcode_NoData) {
                    /* When there isn't data, the subscriber stop to
                     * take samples
                     */
                    follow = false;
                } finally {
                    waitset_query_cond_reader.return_loan(data_seq, info_seq);
                }
            }
        }

        // --- Shutdown --- //

        /* Delete all entities */
        shutdown(participant);
    }
Example #12
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 = ChatObjectTypeSupport.get_type_name();
            try {
                ChatObjectTypeSupport.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(
                My.CHAT_TOPIC_NAME.VALUE, /*>>><<<*/
                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 ContentFiltered Topic */
            DDS.StringWrapper[] cft_param_list = new DDS.StringWrapper[] { "'Rajive'", "'Shannon'", "'Jaromy'" };
            DDS.StringSeq       cft_parameters = new DDS.StringSeq(3);
            cft_parameters.from_array(cft_param_list);

            DDS.ContentFilteredTopic cft = participant.create_contentfilteredtopic("Chat/filtered",
                                                                                   topic, "(id = %0 OR id = %1 OR id = %2)",
                                                                                   cft_parameters);

            if (cft == null)
            {
                Console.WriteLine("create_contentfilteredtopic error\n");
                shutdown(participant);
                throw new ApplicationException("create_contentfilteredtopic error");
            }
            /* <<< */


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

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

            /* 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,
                null,                             /*>>><<<*/
                DDS.StatusMask.STATUS_MASK_NONE); /*>>><<<*/
            if (reader == null)
            {
                shutdown(participant);
                reader_listener = null;
                throw new ApplicationException("create_datareader error");
            }

            /* >>> Setup StatusCondition */
            DDS.StatusCondition status_condition = reader.get_statuscondition();
            if (status_condition.Equals(null))
            {
                Console.WriteLine("get_statuscondition error\n");
                shutdown(participant);
                throw new ApplicationException("get_statuscondition error");
            }
            try {
                status_condition.set_enabled_statuses((DDS.StatusMask)DDS.StatusKind.DATA_AVAILABLE_STATUS);
            }
            catch {
                Console.WriteLine("set_enabled_statuses error\n");
                shutdown(participant);
                throw new ApplicationException("set_enabled_statuses error");
            }
            /* <<< */

            /* >>> Setup WaitSet */
            DDS.WaitSet waitset = new DDS.WaitSet();
            try {
                waitset.attach_condition(status_condition);
            }
            catch {
                // ... error
                waitset.Dispose(); waitset = null;
                shutdown(participant);
                reader_listener.Dispose(); reader_listener = null;
                return;
            }

            // holder for active conditions
            DDS.ConditionSeq active_conditions = new DDS.ConditionSeq();
            /* <<< */


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

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

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

                /* >>> Wait */
                /* Wait for condition to trigger */
                try {
                    waitset.wait(active_conditions, DDS.Duration_t.DURATION_INFINITE);
                    reader_listener.on_data_available(reader);
                }
                catch {
                }
                /* <<< */

                // System.Threading.Thread.Sleep(receive_period); /*>>><<<*/
            }

            // --- Shutdown --- //

            /* Delete all entities */
            waitset.Dispose(); waitset = null; /*>>><<<*/
            shutdown(participant);
            reader_listener = null;
        }
    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;
    }
    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;
    }
Example #15
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;
    }
Example #16
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 = market_dataTypeSupport.get_type_name();
        try {
            market_dataTypeSupport.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 market_data",
            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 MultiChannel */
        DDS.StringSeq            expression_parameters = new DDS.StringSeq(1);
        DDS.ContentFilteredTopic filtered_topic        =
            participant.create_contentfilteredtopic_with_filter(
                "Example market_data",
                topic,
                "Symbol MATCH 'A'", expression_parameters,
                DDS.DomainParticipant.STRINGMATCHFILTER_NAME);

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

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

        /* To customize the data reader QoS, use
         * the configuration file USER_QOS_PROFILES.xml */
        DDS.DataReader reader = subscriber.create_datareader(
            filtered_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");
        }

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

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

        for (int count = 0;
             (sample_count == 0) || (count < sample_count);
             ++count)
        {
            /* Console.WriteLine(
             *    "market_data subscriber sleeping for {0} sec...",
             *    receive_period / 1000);
             *
             * System.Threading.Thread.Sleep(receive_period);
             */

            if (count == 3)
            {
                filtered_topic.append_to_expression_parameter(0, "D");
                Console.WriteLine("changed filter to Symbol MATCH 'AD'");
            }
            if (count == 6)
            {
                filtered_topic.remove_from_expression_parameter(0, "A");
                Console.WriteLine("changed filter to Symbol MATCH 'D'");
            }

            System.Threading.Thread.Sleep(receive_period);
        }
        /* End changes for MultiChannel */

        // --- Shutdown --- //

        /* Delete all entities */
        shutdown(participant);
        reader_listener = null;
    }
Example #17
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;
    }
Example #18
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)
    {
        /* Auxiliary variables */
        String odd_string = "'ODD'";
        String even_string = "'EVEN'";

        // --- 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 = waitset_query_condTypeSupport.get_type_name();
        try {
            waitset_query_condTypeSupport.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 waitset_query_cond",
            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 --- //

        /* 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,
            null,
            DDS.StatusMask.STATUS_MASK_NONE);
        if (reader == null) {
            shutdown(participant);
            throw new ApplicationException("create_datareader error");
        }
        waitset_query_condDataReader waitset_query_cond_reader =
            (waitset_query_condDataReader)reader;

        /* Create query condition */
        DDS.StringSeq query_parameters = new DDS.StringSeq(1);
        query_parameters.ensure_length(1, 1);

        /* The initial value of the parameters is EVEN string */
        query_parameters.set_at(0, even_string);

        String query_expression = "name MATCH %0";

        DDS.QueryCondition query_condition =
            waitset_query_cond_reader.create_querycondition(
                DDS.SampleStateKind.NOT_READ_SAMPLE_STATE,
                DDS.ViewStateKind.ANY_VIEW_STATE,
                DDS.InstanceStateKind.ANY_INSTANCE_STATE,
                query_expression,
                query_parameters);
        if (query_condition == null) {
            shutdown(participant);
            throw new ApplicationException("create_querycondition error");
        }

        DDS.WaitSet waitset = new DDS.WaitSet();
        if (waitset == null) {
            shutdown(participant);
            throw new ApplicationException("create waitset error");
        }

        /* Attach Query Conditions */
        try {
            waitset.attach_condition((DDS.Condition)query_condition);
        } catch (DDS.Exception e) {
            Console.WriteLine("attach_condition error {0}", e);
            shutdown(participant);
            throw e;
        }

        DDS.Duration_t wait_timeout;
        wait_timeout.nanosec = (uint)500000000;
        wait_timeout.sec = 1;

        Console.WriteLine("\n>>>Timeout: {0} sec",
            wait_timeout.sec, wait_timeout.nanosec);
        Console.WriteLine(">>> Query conditions: name MATCH %0");
        Console.WriteLine("\t%0 = {0}", query_parameters.get_at(0));
        Console.WriteLine("---------------------------------\n");

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

        /* Main loop */

        for (int count=0;
             (sample_count == 0) || (count < sample_count);
             ++count) {

            DDS.ConditionSeq active_conditions_seq = new DDS.ConditionSeq();

            /* We set a new parameter in the Query Condition after 7 secs */
            if (count == 7) {
                query_parameters.set_at(0,odd_string);
                Console.WriteLine("CHANGING THE QUERY CONDITION");
                Console.WriteLine("\n>>> Query conditions: name MATCH %0");
                Console.WriteLine("\t%0 = {0}", query_parameters.get_at(0));
                Console.WriteLine(">>> We keep one sample in the history");
                Console.WriteLine("-------------------------------------\n");
                query_condition.set_query_parameters(query_parameters);
            }

            /* wait() blocks execution of the thread until one or more attached
             * Conditions become true, or until a user-specified timeout
             * expires.
             */
            try {
                waitset.wait(active_conditions_seq, wait_timeout);
            } catch (DDS.Retcode_Timeout) {
                Console.WriteLine("Wait timed out!! No conditions were " +
                    "triggered.");
                continue;
            } catch (DDS.Exception e) {
                Console.WriteLine("wait error {0}", e);
                break;
            }

            waitset_query_condSeq data_seq = new waitset_query_condSeq();
            DDS.SampleInfoSeq info_seq = new DDS.SampleInfoSeq();

            bool follow = true;
            while (follow) {
                try {
                    waitset_query_cond_reader.take_w_condition(
                        data_seq, info_seq,
                        DDS.ResourceLimitsQosPolicy.LENGTH_UNLIMITED,
                        query_condition);

                    for (int i = 0; i < data_seq.length; ++i) {
                        if (!info_seq.get_at(i).valid_data) {
                            Console.WriteLine("Got metadata");
                            continue;
                        }
                        waitset_query_condTypeSupport.print_data(
                            data_seq.get_at(i));
                    }
                } catch (DDS.Retcode_NoData) {
                    /* When there isn't data, the subscriber stop to
                     * take samples
                     */
                    follow = false;
                } finally {
                    waitset_query_cond_reader.return_loan(data_seq, info_seq);
                }
            }
        }

        // --- Shutdown --- //

        /* Delete all entities */
        shutdown(participant);
    }