private ShapeWaitSet CreateTriangleReader() { DataReaderQos qos = GetDataReaderQos(); ITopicDescription topic = null; if (_config.ReaderFilterConfig.Enabled) { string filter = _config.ReaderFilterConfig.FilterKind == FilterKind.Inside ? FILTER_INSIDE : FILTER_OUTSIDE; topic = _participant.CreateContentFilteredTopic("CFTriangle" + (++_cfTriangleCount), _triangleTopic, filter, _config.ReaderFilterConfig.X0.ToString(), _config.ReaderFilterConfig.X1.ToString(), _config.ReaderFilterConfig.Y0.ToString(), _config.ReaderFilterConfig.Y1.ToString()); } else { topic = _triangleTopic; } DataReader reader = _subscriber.CreateDataReader(topic, qos); if (reader == null) { throw new Exception("Could not create triangle data reader"); } ShapeTypeDataReader triangleDataReader = new ShapeTypeDataReader(reader); return(new ShapeWaitSet(triangleDataReader, TriangleTopicDataAvailable)); }
private void TriangleTopicDataAvailable(ShapeTypeDataReader dr) { List <ShapeType> samples = new List <ShapeType>(); List <SampleInfo> infos = new List <SampleInfo>(); ReturnCode error = dr.Take(samples, infos); if (error == ReturnCode.Ok) { for (int i = 0; i < samples.Count; i++) { SampleInfo info = infos[i]; ShapeType sample = samples[i]; if (info.ValidData) { int x = Convert.ToInt32((sample.x - (sample.shapesize / 2)) * _factorX); int y = Convert.ToInt32((sample.y - (sample.shapesize / 2)) * _factorY); TriangleType square = new TriangleType { Color = sample.color, X = x, Y = y, Size = sample.shapesize, PublicationHandle = info.PublicationHandle }; TriangleUpdated?.Invoke(this, square); } } } }
public ShapeWaitSet(ShapeTypeDataReader dataReader, Action <ShapeTypeDataReader> dataAvailableFunc) { _dataAvailableFunc = dataAvailableFunc; _dataReader = dataReader; _waitSet = new WaitSet(); _thread = new Thread(DoThreadActivity) { IsBackground = true }; _cancelCondition = new GuardCondition(); _statusCondition = dataReader.StatusCondition; _waitSet.AttachCondition(_statusCondition); _waitSet.AttachCondition(_cancelCondition); _statusCondition.EnabledStatuses = StatusKind.DataAvailableStatus; _thread.Start(); }