public LocalSubscriberLink(Publication pub) { parent = pub; topic = parent.Name; }
public void IncrementSequence(string topic) { Publication pub = LookupPublication(topic); pub?.IncrementSequence(); }
public bool IsLatched(string topic) { Publication pub = LookupPublication(topic); return(pub?.Latch ?? false); }
/// <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); }