private void receiveData() { int count = 0; DDS.ConditionSeq active_conditions = new DDS.ConditionSeq(); while (true) { try { waitset.wait(active_conditions, timeout); for (int c = 0; c < active_conditions.length; ++c) { if (active_conditions.get_at(c) == status_condition) { DDS.StatusMask triggeredmask = reader.get_status_changes(); if ((triggeredmask & (DDS.StatusMask) DDS.StatusKind.DATA_AVAILABLE_STATUS) != 0) { try { DDS.TypedDataReader <T> dataReader = (DDS.TypedDataReader <T>)reader; dataReader.take( dataSeq, infoSeq, DDS.ResourceLimitsQosPolicy.LENGTH_UNLIMITED, DDS.SampleStateKind.ANY_SAMPLE_STATE, DDS.ViewStateKind.ANY_VIEW_STATE, DDS.InstanceStateKind.ANY_INSTANCE_STATE); System.Int32 dataLength = dataSeq.length; for (int i = 0; i < dataLength; ++i) { if (infoSeq.get_at(i).valid_data) { T temp = new T(); temp.copy_from(dataSeq.get_at(i)); demultiplexer(temp); } else if (infoSeq.get_at(i).instance_state == DDS.InstanceStateKind.NOT_ALIVE_DISPOSED_INSTANCE_STATE) { Console.WriteLine("DDS INSTANCE NOT_ALIVE_DISPOSED_INSTANCE_STATE"); demultiplexer(null); } } dataReader.return_loan(dataSeq, infoSeq); } catch (DDS.Retcode_NoData) { Console.WriteLine("RETCODE_NODATA"); demultiplexer(null); return; } catch (Exception ex) { Console.WriteLine("WaitsetSubscriber: take error {0}", ex); } } else { StatusKindPrinter.print((int)triggeredmask); if ((triggeredmask & (DDS.StatusMask) DDS.StatusKind.SUBSCRIPTION_MATCHED_STATUS) != 0) { DDS.SubscriptionMatchedStatus status = new DDS.SubscriptionMatchedStatus(); reader.get_subscription_matched_status(ref status); Console.WriteLine("Subscription matched. current_count = {0}", status.current_count); } if ((triggeredmask & (DDS.StatusMask) DDS.StatusKind.LIVELINESS_CHANGED_STATUS) != 0) { DDS.LivelinessChangedStatus status = new DDS.LivelinessChangedStatus(); reader.get_liveliness_changed_status(ref status); Console.WriteLine("Liveliness changed. alive_count = {0}", status.alive_count); if (status.alive_count == 0) { Console.WriteLine("publisher disconnected"); return; } } if ((triggeredmask & (DDS.StatusMask) DDS.StatusKind.SAMPLE_LOST_STATUS) != 0) { DDS.SampleLostStatus status = new DDS.SampleLostStatus(); reader.get_sample_lost_status(ref status); Console.WriteLine("Sample lost. Reason = {0}", status.last_reason.ToString()); } if ((triggeredmask & (DDS.StatusMask) DDS.StatusKind.SAMPLE_REJECTED_STATUS) != 0) { DDS.SampleRejectedStatus status = new DDS.SampleRejectedStatus(); reader.get_sample_rejected_status(ref status); Console.WriteLine("Sample Rejected. Reason = {0}", status.last_reason.ToString()); } } } } } catch (DDS.Retcode_Timeout) { Console.WriteLine("wait timed out"); count += 2; continue; } } }
private void receiveData() { DDS.ConditionSeq activeConditions = new DDS.ConditionSeq(); while (true) { try { _waitset.wait(activeConditions, _timeout); for (var c = 0; c < activeConditions.length; ++c) { if (activeConditions.get_at(c) == _statusCondition) { DDS.StatusMask triggeredmask = _reader.get_status_changes(); if ((triggeredmask & (DDS.StatusMask) DDS.StatusKind.DATA_AVAILABLE_STATUS) != 0) { try { DDS.TypedDataReader <T> dataReader = (DDS.TypedDataReader <T>)_reader; dataReader.take( _dataSeq, _infoSeq, DDS.ResourceLimitsQosPolicy.LENGTH_UNLIMITED, DDS.SampleStateKind.ANY_SAMPLE_STATE, DDS.ViewStateKind.ANY_VIEW_STATE, DDS.InstanceStateKind.ANY_INSTANCE_STATE); int dataLength = _dataSeq.length; //Console.WriteLine("Received {0}", dataLength); for (var i = 0; i < dataLength; ++i) { if (_infoSeq.get_at(i).valid_data) { var temp = new T(); temp.copy_from(_dataSeq.get_at(i)); _subject.OnNext(temp); } else if (_infoSeq.get_at(i).instance_state == DDS.InstanceStateKind.NOT_ALIVE_DISPOSED_INSTANCE_STATE) { /* FIXME: If the instance comes back online, * it will break the Rx contract. */ //Console.WriteLine("OnCompleted CALLED FROM LIB CODE on tid "+ //System.Threading.Thread.CurrentThread.ManagedThreadId); _subject.OnCompleted(); } } dataReader.return_loan(_dataSeq, _infoSeq); } catch (DDS.Retcode_NoData) { _subject.OnCompleted(); return; } catch (Exception ex) { _subject.OnError(ex); Console.WriteLine($"ObservableTopicWaitSet: take error {ex}"); } } else { StatusKindPrinter.print((int)triggeredmask); if ((triggeredmask & (DDS.StatusMask) DDS.StatusKind.SUBSCRIPTION_MATCHED_STATUS) != 0) { DDS.SubscriptionMatchedStatus status = new DDS.SubscriptionMatchedStatus(); _reader.get_subscription_matched_status(ref status); Console.WriteLine($"Subscription matched. current_count = {status.current_count}"); } if ((triggeredmask & (DDS.StatusMask) DDS.StatusKind.LIVELINESS_CHANGED_STATUS) != 0) { DDS.LivelinessChangedStatus status = new DDS.LivelinessChangedStatus(); _reader.get_liveliness_changed_status(ref status); Console.WriteLine($"Liveliness changed. alive_count = {status.alive_count}"); } if ((triggeredmask & (DDS.StatusMask) DDS.StatusKind.SAMPLE_LOST_STATUS) != 0) { DDS.SampleLostStatus status = new DDS.SampleLostStatus(); _reader.get_sample_lost_status(ref status); Console.WriteLine($"Sample lost. Reason = {status.last_reason.ToString()}"); } if ((triggeredmask & (DDS.StatusMask) DDS.StatusKind.SAMPLE_REJECTED_STATUS) != 0) { DDS.SampleRejectedStatus status = new DDS.SampleRejectedStatus(); _reader.get_sample_rejected_status(ref status); Console.WriteLine($"Sample Rejected. Reason = {status.last_reason.ToString()}"); } } } } } catch (DDS.Retcode_Timeout) { Console.WriteLine("wait timed out"); } } }
private void ReceiveData() { DDS.ConditionSeq activeConditions = new DDS.ConditionSeq(); while (true) { try { _waitset.wait(activeConditions, _timeout); for (var c = 0; c < activeConditions.length; ++c) { if (activeConditions.get_at(c) == _statusCondition) { DDS.StatusMask triggeredmask = _reader.get_status_changes(); if ((triggeredmask & (DDS.StatusMask) DDS.StatusKind.DATA_AVAILABLE_STATUS) != 0) { try { DDS.TypedDataReader <T> dataReader = (DDS.TypedDataReader <T>)_reader; dataReader.take( _dataSeq, _infoSeq, DDS.ResourceLimitsQosPolicy.LENGTH_UNLIMITED, DDS.SampleStateKind.ANY_SAMPLE_STATE, DDS.ViewStateKind.ANY_VIEW_STATE, DDS.InstanceStateKind.ANY_INSTANCE_STATE); int dataLength = _dataSeq.length; //Console.WriteLine("Received {0}", dataLength); for (var i = 0; i < dataLength; ++i) { DDS.SampleInfo info = _infoSeq.get_at(i); if (info.valid_data) { var data = new T(); data.copy_from(_dataSeq.get_at(i)); var key = _keySelector(data); DDSKeyedSubject <TKey, T> keyedSubject; if (!_keyedSubjectDict.ContainsKey(key)) { keyedSubject = new DDSKeyedSubject <TKey, T>(key, _scheduler); _keyedSubjectDict.Add(key, keyedSubject); _handleKeyDict.Add(info.instance_handle, key); _groupSubject.OnNext(keyedSubject); } else { keyedSubject = _keyedSubjectDict[key]; if (_externalSubDict) { if (!_handleKeyDict.ContainsKey(info.instance_handle)) { _handleKeyDict.Add(info.instance_handle, key); _groupSubject.OnNext(keyedSubject); } } } keyedSubject.OnNext(data); } else if (info.instance_state == DDS.InstanceStateKind.NOT_ALIVE_DISPOSED_INSTANCE_STATE) { if (_handleKeyDict.ContainsKey(info.instance_handle)) { var key = _handleKeyDict[info.instance_handle]; if (_keyedSubjectDict.ContainsKey(key)) { var keyedSub = _keyedSubjectDict[key]; _keyedSubjectDict.Remove(key); _handleKeyDict.Remove(info.instance_handle); keyedSub.OnCompleted(); /* FIXME: If the instance comes alive again, it will break the Rx contract */ } else { Console.WriteLine( "InstanceDataReaderListener invariant broken: keyedSubDict does not contain key"); } } else { Console.WriteLine( "InstanceDataReaderListener invariant broken: handleKeyDict does not contain info.instance_handle"); } } } dataReader.return_loan(_dataSeq, _infoSeq); } catch (DDS.Retcode_NoData) { _subject.OnCompleted(); return; } catch (Exception ex) { _subject.OnError(ex); Console.WriteLine($"ObservableTopicWaitSet: take error {ex}"); } } else { StatusKindPrinter.print((int)triggeredmask); if ((triggeredmask & (DDS.StatusMask) DDS.StatusKind.SUBSCRIPTION_MATCHED_STATUS) != 0) { DDS.SubscriptionMatchedStatus status = new DDS.SubscriptionMatchedStatus(); _reader.get_subscription_matched_status(ref status); Console.WriteLine($"Subscription matched. current_count = {status.current_count}"); } if ((triggeredmask & (DDS.StatusMask) DDS.StatusKind.LIVELINESS_CHANGED_STATUS) != 0) { DDS.LivelinessChangedStatus status = new DDS.LivelinessChangedStatus(); _reader.get_liveliness_changed_status(ref status); Console.WriteLine($"Liveliness changed. alive_count = {status.alive_count}"); } if ((triggeredmask & (DDS.StatusMask) DDS.StatusKind.SAMPLE_LOST_STATUS) != 0) { DDS.SampleLostStatus status = new DDS.SampleLostStatus(); _reader.get_sample_lost_status(ref status); Console.WriteLine($"Sample lost. Reason = {status.last_reason.ToString()}"); } if ((triggeredmask & (DDS.StatusMask) DDS.StatusKind.SAMPLE_REJECTED_STATUS) != 0) { DDS.SampleRejectedStatus status = new DDS.SampleRejectedStatus(); _reader.get_sample_rejected_status(ref status); Console.WriteLine($"Sample Rejected. Reason = {status.last_reason.ToString()}"); } } } } } catch (DDS.Retcode_Timeout) { Console.WriteLine("wait timed out"); } } }