private static void RegisterDomain(Topic <T> topicInstance, string domain)
        {
            lock (_locker)
            {
                DomainParticipantFactory dpf = DomainParticipantFactory.Instance;
                ErrorHandler.CheckHandle(dpf, "DDS.DomainParticipantFactory.Instance");
                var dpQos = new DomainParticipantQos();
                dpf.GetDefaultParticipantQos(ref dpQos);
                topicInstance.Participant = dpf.CreateParticipant(domain, dpQos) ??
                                            (dpf.LookupParticipant(domain) ?? dpf.CreateParticipant(domain, dpQos));

                if (topicInstance.Participant == null)
                {
                    throw new Exception("DDS NOT started, please start / restart your DDS!");
                }
            }
        }
        private void InitializeWriter(AdapterWriterQos desiredQos)
        {
            var writerQos = new DataWriterQos();

            topicPublisher.GetDefaultDataWriterQos(ref writerQos);
            topicPublisher.CopyFromTopicQos(ref writerQos, currentTopic.TopicQos);
            if (desiredQos != null)
            {
                writerQos.WriterDataLifecycle.AutodisposeUnregisteredInstances = false;
                writerQos.Reliability.Kind = desiredQos.MessageReliabilityType.ConvertReliability();
                writerQos.Durability.Kind  = desiredQos.PersistenceType.ConvertPersistence();
            }

            // Create a DataWritter for the current Topic
            dataWriter = topicPublisher.CreateDataWriter(currentTopic.TopicMessageTopic, writerQos) as DataWriter <T>;
            ErrorHandler.CheckHandle(
                DataWriter, "Publisher.CreateDatawriter (InitializeWriter)");
        }
Beispiel #3
0
        private void CreateDataReader(AdapterReaderQos desiredQos, DataReaderListener <T> listener,
                                      int waitForHistoricalData)
        {
            if (partitionName.Contains("*"))
            {
                partitionName.Replace("*", string.Empty);
            }

            if (dataReader != null)
            {
                if (listener != null)
                {
                    ReturnCode status = dataReader.SetListener(
                        listener, StatusKind.DataAvailable | StatusKind.SampleLost | StatusKind.SampleRejected);
                    ErrorHandler.CheckStatus(status, "Subscriber.SetListener (CreateDataReader)");
                }
            }
            else
            {
                // Create a DataReader for the Topic
                // (using the appropriate QoS) and attach a listener to the data reader on new data available
                var dataReaderQos = new DataReaderQos();
                topicSubscriber.CopyFromTopicQos(ref dataReaderQos, currentTopic.TopicQos);

                if (desiredQos != null)
                {
                    dataReaderQos.Durability.Kind  = desiredQos.PersistenceType.ConvertPersistence();
                    dataReaderQos.Reliability.Kind = desiredQos.MessageReliabilityType.ConvertReliability();
                }

                dataReader = topicSubscriber.CreateDataReader(
                    currentTopic.TopicMessageTopic,
                    dataReaderQos,
                    listener,
                    StatusKind.DataAvailable);

                ErrorHandler.CheckHandle(
                    dataReader, "Subscriber.CreateDatareader (CreateDataReader)");

                dataReader.WaitForHistoricalData(new Duration(waitForHistoricalData, 0));
            }
        }
        public Publisher(Topic <T> topic, string partitionName, AdapterWriterQos desiredQos)
        {
            currentTopic = topic;

            IDomainParticipant participant = topic.Participant;
            var publisherQos = new PublisherQos();

            ReturnCode status = participant.GetDefaultPublisherQos(ref publisherQos);

            ErrorHandler.CheckStatus(status, "Publisher.GetDefaultSubscriberQos (Publisher)");
            publisherQos.Partition.Name    = new string[1];
            publisherQos.Partition.Name[0] = partitionName;

            // Create a Subscriber for the application.
            topicPublisher = participant.CreatePublisher(publisherQos);
            ErrorHandler.CheckHandle(
                topicPublisher, "Publisher.CreateSubscriber (Publisher)");

            InitializeWriter(desiredQos);
        }
        public Topic(string topicName, AdapterTopicQos requiredTopicQoS, TypeSupport clientTypeSupport)
        {
            if (clientTypeSupport == null)
            {
                throw new ArgumentNullException("clientTypeSupport");
            }

            string domain = null;

            // just using the default partition, named after the topic name
            TopicName = topicName;
            TopicType = typeof(T).Name;

            // Create a DomainParticipantFactory and a DomainParticipant
            RegisterDomain(this, domain);

            ErrorHandler.CheckHandle(Participant, "DDS.DomainParticipantFactory.CreateParticipant");

            // Register the required datatype.
            typeSupport = new TopicTypeSupport(clientTypeSupport);
            ReturnCode status = typeSupport.RegisterType(Participant, topicName);

            ErrorHandler.CheckStatus(status, "Topic.TopicMessageTypeSupport.RegisterType");

            TopicQos topicQos = null;

            Participant.GetDefaultTopicQos(ref topicQos);
            ApplyQos(topicQos, requiredTopicQoS);

            TopicQos = topicQos;

            TopicMessageTopic = Participant.CreateTopic(topicName, topicName, topicQos);

            Participant.SetDefaultTopicQos(topicQos);
            if (TopicMessageTopic == null)
            {
                throw new Exception("QoS for topic " + TopicName + " FAILED!, please check QoS!");
            }
        }
Beispiel #6
0
        public Subscriber(Topic <T> topic, string partitionName, AdapterReaderQos desiredQos,
                          DataReaderListener <T> listener, int waitForHistoricalData)
        {
            currentTopic       = topic;
            this.partitionName = partitionName;
            this.listener      = listener;
            IDomainParticipant participant = topic.Participant;
            var subQos = new SubscriberQos();

            ReturnCode status = participant.GetDefaultSubscriberQos(ref subQos);

            ErrorHandler.CheckStatus(
                status, "Subscriber.GetDefaultSubscriberQos (Subscriber)");
            subQos.Partition.Name    = new string[1];
            subQos.Partition.Name[0] = partitionName;

            // Create a Subscriber for the application.
            topicSubscriber = participant.CreateSubscriber(subQos);
            ErrorHandler.CheckHandle(
                topicSubscriber, "Subscriber.CreateSubscriber (Subscriber)");

            CreateDataReader(desiredQos, listener, waitForHistoricalData);
        }