Ejemplo n.º 1
0
    static void publish(int domain_id, int sample_count)
    {
        // --- Create participant --- //

        /* To customize 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 publisher --- //

        /* To customize publisher QoS, use
         * the configuration file USER_QOS_PROFILES.xml */
        DDS.Publisher publisher = participant.create_publisher(
            DDS.DomainParticipant.PUBLISHER_QOS_DEFAULT,
            null /* listener */,
            DDS.StatusMask.STATUS_MASK_NONE);
        if (publisher == null)
        {
            shutdown(participant);
            throw new ApplicationException("create_publisher error");
        }

        /* If you want to change the DataWriter'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_publisher call above.
         */

        // Start changes for coherent_presentation

/*        DDS.PublisherQos publisher_qos = new DDS.PublisherQos();
 *      participant.get_default_publisher_qos(publisher_qos);
 *
 *      // Topic access scope means that writes from a particular datawriter to
 *      // multiple instances will be viewed coherently.
 *      publisher_qos.presentation.access_scope =
 *            DDS.PresentationQosPolicyAccessScopeKind.TOPIC_PRESENTATION_QOS;
 *      publisher_qos.presentation.coherent_access = true;
 *
 *      // --- Create publisher --- //
 *
 *      DDS.Publisher publisher = participant.create_publisher(
 *          publisher_qos,
 *          null,
 *          DDS.StatusMask.STATUS_MASK_NONE);
 *      if (publisher == null) {
 *          shutdown(participant);
 *          throw new ApplicationException("create_publisher error");
 *      }
 */     // End changes for Coherent_Presentation

        // --- Create topic --- //

        /* Register type before creating topic */
        System.String type_name = coherentTypeSupport.get_type_name();
        try {
            coherentTypeSupport.register_type(
                participant, type_name);
        } catch (DDS.Exception e) {
            Console.WriteLine("register_type error {0}", e);
            shutdown(participant);
            throw e;
        }

        /* To customize topic QoS, use
         * the configuration file USER_QOS_PROFILES.xml */
        DDS.Topic topic = participant.create_topic(
            "Example coherent",
            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 writer --- //

        /* To customize data writer QoS, use
         * the configuration file USER_QOS_PROFILES.xml */
        DDS.DataWriter writer = publisher.create_datawriter(
            topic,
            DDS.Publisher.DATAWRITER_QOS_DEFAULT,
            null /* listener */,
            DDS.StatusMask.STATUS_MASK_NONE);
        if (writer == null)
        {
            shutdown(participant);
            throw new ApplicationException("create_datawriter error");
        }

        /* If you want to change the DataWriter'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_datawriter call above.
         */

        // Start changes for coherent_presentation

        /* Get default datawriter QoS to customize */

/*        DDS.DataWriterQos datawriter_qos = new DDS.DataWriterQos();
 *      publisher.get_default_datawriter_qos(datawriter_qos);
 *
 *      datawriter_qos.reliability.kind =
 *          DDS.ReliabilityQosPolicyKind.RELIABLE_RELIABILITY_QOS;
 *      datawriter_qos.history.depth = 10;
 *      datawriter_qos.protocol.rtps_reliable_writer.
 *              heartbeats_per_max_samples = 0;
 *
 *      DDS.DataWriter writer = publisher.create_datawriter(
 *          topic,
 *          datawriter_qos,
 *          null,
 *          DDS.StatusMask.STATUS_MASK_NONE);
 *      if (writer == null) {
 *          shutdown(participant);
 *          throw new ApplicationException("create_datawriter error");
 *      }
 *
 */     // End changes for coherent_presentation

        coherentDataWriter coherent_writer =
            (coherentDataWriter)writer;

        // --- Write --- //

        /* Create data sample for writing */
        coherent instance = coherentTypeSupport.create_data();

        if (instance == null)
        {
            shutdown(participant);
            throw new ApplicationException(
                      "coherentTypeSupport.create_data error");
        }

        // Start changes for coherent_presentation

        /* For a data type that has a key, if the same instance is going to be
         * written multiple times, initialize the key here
         * and register the keyed instance prior to writing */
        DDS.InstanceHandle_t instance_handle = DDS.InstanceHandle_t.HANDLE_NIL;

        instance.id     = 0;
        instance_handle = coherent_writer.register_instance(instance);

        Random random = new Random();

        publisher.begin_coherent_changes();
        Console.WriteLine("Begin Coherent Changes");

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

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

            /* Modify the data to be sent here */
            int mod = count % 7;
            if (mod == 6)
            {
                Console.WriteLine("Begin Coherent Changes");
                try {
                    publisher.begin_coherent_changes();
                } catch (DDS.Exception e) {
                    Console.WriteLine("begin_coherent_chages {0}", e);
                }

                continue;
            }

            //Choose a random value for each field
            instance.field = (char)('a' + mod);
            instance.value = (int)(random.Next(9));

            Console.WriteLine("  Updating instance, {0}->{1}", instance.field,
                              instance.value);

            try {
                coherent_writer.write(instance, ref instance_handle);
            } catch (DDS.Exception e) {
                Console.WriteLine("write error {0}", e);
            }

            // Begin a new change group after sending 6 samples
            if (mod == 5)
            {
                Console.WriteLine("End Coherent Changes\n");
                try {
                    publisher.end_coherent_changes();
                } catch (DDS.Exception e) {
                    Console.WriteLine("end_coherent_changes error {0}", e);
                    throw new ApplicationException(
                              "coherentTypeSupport.end_coherent_changes error");
                }
            }
        }

        try {
            coherent_writer.unregister_instance(
                instance, ref instance_handle);
        } catch (DDS.Exception e) {
            Console.WriteLine("unregister instance error: {0}", e);
        }

        // --- Shutdown --- //

        /* Delete data sample */
        try {
            coherentTypeSupport.delete_data(instance);
        } catch (DDS.Exception e) {
            Console.WriteLine(
                "coherentTypeSupport.delete_data error: {0}", e);
        }

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