Esempio n. 1
0
 public LocalSubscriberLink(Publication pub)
 {
     parent = pub;
     topic  = parent.Name;
 }
Esempio n. 2
0
        public void IncrementSequence(string topic)
        {
            Publication pub = LookupPublication(topic);

            pub?.IncrementSequence();
        }
Esempio n. 3
0
        public bool IsLatched(string topic)
        {
            Publication pub = LookupPublication(topic);

            return(pub?.Latch ?? false);
        }
Esempio n. 4
0
        /// <summary>
        /// Register as a publisher on a topic.
        /// </summary>
        /// <typeparam name="T"></typeparam>
        /// <param name="ops"></param>
        /// <param name="callbacks"></param>
        /// <returns></returns>
        public async Task <bool> Advertise <T>(AdvertiseOptions <T> ops, SubscriberCallbacks callbacks) where T : RosMessage, new()
        {
            if (!IsValid(ops))
            {
                return(false);
            }

            Publication pub = null;

            lock (gate)
            {
                if (shuttingDown)
                {
                    return(false);
                }

                pub = LookupPublicationWithoutLock(ops.topic);
                if (pub != null)
                {
                    if (pub.Md5Sum != ops.md5Sum)
                    {
                        this.logger.LogError(
                            "Tried to advertise on topic [{0}] with md5sum [{1}] and datatype [{2}], but the topic is already advertised as md5sum [{3}] and datatype [{4}]",
                            ops.topic,
                            ops.md5Sum,
                            ops.dataType,
                            pub.Md5Sum,
                            pub.DataType
                            );
                        return(false);
                    }
                }
                else
                {
                    pub = new Publication(
                        ops.topic,
                        ops.dataType,
                        ops.md5Sum,
                        ops.messageDefinition,
                        ops.queueSize,
                        ops.Latch,
                        ops.hasHeader
                        );
                }
                pub.AddCallbacks(callbacks);
                advertisedTopics.Add(pub);
            }

            bool         found = false;
            Subscription sub   = null;

            lock (gate)
            {
                foreach (Subscription s in subscriptions)
                {
                    if (s.Name == ops.topic && Md5SumsMatch(s.Md5Sum, ops.md5Sum) && !s.IsDisposed)
                    {
                        found = true;
                        sub   = s;
                        break;
                    }
                }
            }

            if (found)
            {
                sub.AddLocalConnection(pub);
            }

            var args    = new XmlRpcValue(ThisNode.Name, ops.topic, ops.dataType, XmlRpcManager.Instance.Uri);
            var result  = new XmlRpcValue();
            var payload = new XmlRpcValue();

            if (!await Master.ExecuteAsync("registerPublisher", args, result, payload, true))
            {
                this.logger.LogError($"RPC \"registerPublisher\" for topic '{ops.topic}' failed.");
                return(false);
            }

            return(true);
        }