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