示例#1
0
        public static bool WaitForSubscriptions(DataWriter writer, int subscriptionsCount, int milliseconds)
        {
            if (writer is null)
            {
                throw new ArgumentNullException(nameof(writer));
            }

            PublicationMatchedStatus status = default;

            writer.GetPublicationMatchedStatus(ref status);
            int count = milliseconds / 100;

            while (status.CurrentCount != subscriptionsCount && count > 0)
            {
                Thread.Sleep(100);
                writer.GetPublicationMatchedStatus(ref status);
                count--;
            }

            if (count == 0 && status.CurrentCount != subscriptionsCount)
            {
                return(false);
            }

            return(true);
        }
示例#2
0
        public void TestGetPublicationMatchedStatus()
        {
            // Initialize entities
            DataWriterQos qos = new DataWriterQos();

            qos.Reliability.Kind = ReliabilityQosPolicyKind.BestEffortReliabilityQos;
            DataWriter writer = _publisher.CreateDataWriter(_topic, qos);

            Assert.IsNotNull(writer);

            // If not datareaders are created should return the default status
            PublicationMatchedStatus status = default;
            ReturnCode result = writer.GetPublicationMatchedStatus(ref status);

            Assert.AreEqual(ReturnCode.Ok, result);
            Assert.AreEqual(0, status.CurrentCount);
            Assert.AreEqual(0, status.CurrentCountChange);
            Assert.AreEqual(0, status.TotalCount);
            Assert.AreEqual(0, status.TotalCountChange);
            Assert.AreEqual(InstanceHandle.HandleNil, status.LastSubscriptionHandle);

            // Create a not compatible reader
            Subscriber subscriber = _participant.CreateSubscriber();

            Assert.IsNotNull(subscriber);

            DataReaderQos drQos = new DataReaderQos();

            drQos.Reliability.Kind = ReliabilityQosPolicyKind.ReliableReliabilityQos;
            DataReader reader = subscriber.CreateDataReader(_topic, drQos);

            Assert.IsNotNull(reader);

            // Wait for discovery and check the status
            System.Threading.Thread.Sleep(100);

            result = writer.GetPublicationMatchedStatus(ref status);
            Assert.AreEqual(ReturnCode.Ok, result);
            Assert.AreEqual(0, status.CurrentCount);
            Assert.AreEqual(0, status.CurrentCountChange);
            Assert.AreEqual(0, status.TotalCount);
            Assert.AreEqual(0, status.TotalCountChange);
            Assert.AreEqual(InstanceHandle.HandleNil, status.LastSubscriptionHandle);

            // Create a compatible reader
            DataReader otherReader = subscriber.CreateDataReader(_topic);

            Assert.IsNotNull(otherReader);

            // Wait for discovery and check the status
            System.Threading.Thread.Sleep(100);

            result = writer.GetPublicationMatchedStatus(ref status);
            Assert.AreEqual(ReturnCode.Ok, result);
            Assert.AreEqual(1, status.CurrentCount);
            Assert.AreEqual(1, status.CurrentCountChange);
            Assert.AreEqual(1, status.TotalCount);
            Assert.AreEqual(1, status.TotalCountChange);
            Assert.AreEqual(otherReader.InstanceHandle, status.LastSubscriptionHandle);
        }
示例#3
0
        public ReturnCode GetPublicationMatchedStatus(
            ref PublicationMatchedStatus status)
        {
            ReturnCode result;

            ReportStack.Start();
            if (this.rlReq_isAlive)
            {
                if (status == null)
                {
                    status = new PublicationMatchedStatus();
                }
                GCHandle statusGCHandle = GCHandle.Alloc(status, GCHandleType.Normal);
                result = uResultToReturnCode(
                    User.Writer.GetPublicationMatchStatus(
                        rlReq_UserPeer, 1, PublicationMatchedStatusMarshaler.CopyOut, GCHandle.ToIntPtr(statusGCHandle)));
                status = statusGCHandle.Target as PublicationMatchedStatus;
                statusGCHandle.Free();
            }
            else
            {
                result = DDS.ReturnCode.AlreadyDeleted;
            }
            ReportStack.Flush(this, result != ReturnCode.Ok);
            return(result);
        }
 private void PrivatePublicationMatched(IntPtr entityData, IntPtr writerPtr, PublicationMatchedStatus status)
 {
     if (listener != null)
     {
         IDataWriter dataWriter = (IDataWriter)OpenSplice.SacsSuperClass.fromUserData(writerPtr);
         listener.OnPublicationMatched(dataWriter, status);
     }
 }
 private void PrivatePublicationMatched(IntPtr entityData, IntPtr writerPtr, PublicationMatchedStatus status)
 {
     if (listener != null)
     {
         IDataWriter dataWriter = (IDataWriter)OpenSplice.SacsSuperClass.fromUserData(writerPtr);
         listener.OnPublicationMatched(dataWriter, status);
     }
 }
示例#6
0
 public ReturnCode GetPublicationMatchedStatus(
     ref PublicationMatchedStatus status)
 {
     if (status == null)
     {
         status = new PublicationMatchedStatus();
     }
     return(Gapi.DataWriter.get_publication_matched_status(GapiPeer, status));
 }
 internal static V_RESULT CopyOut(ref v_topicMatchInfo from, PublicationMatchedStatus to)
 {
     to.TotalCount             = from.totalCount;
     to.TotalCountChange       = from.totalChanged;
     to.CurrentCount           = from.currentCount;
     to.CurrentCountChange     = from.currentChanged;
     to.LastSubscriptionHandle = User.InstanceHandle.FromGID(from.instanceHandle);
     return(V_RESULT.OK);
 }
示例#8
0
 /*! This event is raised when the DataWriter discovered a matching DataReader */
 public void OnPublicationMatchedHendler(DataWriter dataWriter, PublicationMatchedStatus status)
 {
     if (status.CurrentCountChange > 0)
     {
         Console.WriteLine("in DataWriter: " + dataWriter.Name + " " + status.CurrentCountChange + " Publication matched");
     }
     else
     {
         Console.WriteLine("in DataWriter: " + dataWriter.Name + " " + status.CurrentCountChange + " DataReader lost");
     }
 }
        internal static V_RESULT CopyOut(IntPtr fromPtr, IntPtr toPtr)
        {
            v_topicMatchInfo from = (v_topicMatchInfo)Marshal.PtrToStructure(fromPtr, type);

            GCHandle toGCHandle         = GCHandle.FromIntPtr(toPtr);
            PublicationMatchedStatus to = toGCHandle.Target as PublicationMatchedStatus;

            V_RESULT result = CopyOut(ref from, to);

            toGCHandle.Target = to;
            return(result);
        }
示例#10
0
        public static bool WaitForSubscriptions(this DataWriter writer, int subscriptionsCount, int milliseconds)
        {
            PublicationMatchedStatus status = new PublicationMatchedStatus();

            writer.GetPublicationMatchedStatus(ref status);
            int count = milliseconds / 100;

            while (status.CurrentCount != subscriptionsCount && count > 0)
            {
                System.Threading.Thread.Sleep(100);
                writer.GetPublicationMatchedStatus(ref status);
                count--;
            }

            if (count == 0 && status.CurrentCount != subscriptionsCount)
            {
                return(false);
            }

            return(true);
        }
示例#11
0
 public override void OnPublicationMatched(DataWriter writer, PublicationMatchedStatus status)
 {
     PublicationMatched?.Invoke(writer, status);
 }
示例#12
0
 public static extern ReturnCode get_publication_matched_status(
     IntPtr _this,
     PublicationMatchedStatus status
     );
示例#13
0
 public static extern ReturnCode get_publication_matched_status(
     IntPtr _this,
     PublicationMatchedStatus status
     );
示例#14
0
        static void Main(string[] args)
        {
            Ace.Init();

            DomainParticipantFactory dpf         = ParticipantService.Instance.GetDomainParticipantFactory("-DCPSConfigFile", "rtps.ini");
            DomainParticipant        participant = dpf.CreateParticipant(42);

            if (participant == null)
            {
                throw new Exception("Could not create the participant");
            }

            MessageTypeSupport support = new MessageTypeSupport();
            ReturnCode         result  = support.RegisterType(participant, support.GetTypeName());

            if (result != ReturnCode.Ok)
            {
                throw new Exception("Could not register type: " + result.ToString());
            }

            Topic topic = participant.CreateTopic("MessageTopic", support.GetTypeName());

            if (topic == null)
            {
                throw new Exception("Could not create the message topic");
            }

            Publisher publisher = participant.CreatePublisher();

            if (publisher == null)
            {
                throw new Exception("Could not create the publisher");
            }

            DataWriter writer = publisher.CreateDataWriter(topic);

            if (writer == null)
            {
                throw new Exception("Could not create the data writer");
            }
            MessageDataWriter messageWriter = new MessageDataWriter(writer);

            Console.WriteLine("Waiting for a subscriber...");
            PublicationMatchedStatus status = new PublicationMatchedStatus();

            do
            {
                result = messageWriter.GetPublicationMatchedStatus(ref status);
                System.Threading.Thread.Sleep(500);
            }while (status.CurrentCount < 1);

            Console.WriteLine("Subscriber found, writting data....");
            messageWriter.Write(new Message
            {
                Content = "Hello, I love you, won't you tell me your name?"
            });

            Console.WriteLine("Press a key to exit...");
            Console.ReadKey();

            participant.DeleteContainedEntities();
            dpf.DeleteParticipant(participant);
            ParticipantService.Instance.Shutdown();

            Ace.Fini();
        }