Beispiel #1
0
        public bool Receive(string sender, byte[] payload)
        {
            using var stream = new MemoryStream(payload);
            // parse name
            var name = stream.ReadEnd();

            if (stream.Length - stream.Position < 2)
            {
                return(false);
            }
            // parse config
            var wrapper   = new NetworkDataReader(stream);
            var dimension = wrapper.ReadByte();
            var frameMode = wrapper.ReadByte() != 0;
            var rest      = stream.Length - stream.Position;
            // parse data
            Func <ITopic> newTopic, newData;

            switch (dimension)
            {
            case 2:
                newTopic = () => frameMode
                        ? (ITopic) new FrameContainer2D()
                        : (ITopic) new Accumulator2D();
                newData = () => {
                    var count  = rest / SizeOfV2;
                    var points = new V2[count];
                    for (var i = 0; i < points.Length; ++i)
                    {
                        points[i] = (wrapper.ReadFloat(),
                                     wrapper.ReadFloat());
                    }
                    return(frameMode
                            ? (ITopic) new FrameContainer2D(points)
                            : (ITopic) new Accumulator2D(points));
                };
                break;

            case 3:
                newTopic = () => frameMode
                        ? (ITopic) new FrameContainer3D()
                        : (ITopic) new Accumulator3D();
                newData = () => {
                    var count  = rest / SizeOfV3;
                    var points = new V3[count];
                    for (var i = 0; i < points.Length; ++i)
                    {
                        points[i] = (wrapper.ReadFloat(),
                                     wrapper.ReadFloat(),
                                     wrapper.ReadFloat());
                    }
                    return(frameMode
                            ? (ITopic) new FrameContainer3D(points)
                            : (ITopic) new Accumulator3D(points));
                };
                break;

            case 4:
                newTopic = () => frameMode
                        ? (ITopic) new FrameContainer4D()
                        : (ITopic) new Accumulator4D();
                newData = () => {
                    var count  = rest / SizeOfV4;
                    var points = new V4[count];
                    for (var i = 0; i < points.Length; ++i)
                    {
                        points[i] = (wrapper.ReadFloat(),
                                     wrapper.ReadFloat(),
                                     wrapper.ReadFloat(),
                                     wrapper.ReadFloat());
                    }
                    return(frameMode
                            ? (ITopic) new FrameContainer4D(points)
                            : (ITopic) new Accumulator4D(points));
                };
                break;

            default:
                return(false);
            }

            // save data
            var title = $"{sender}: {name}";

            lock (_dictionary) {
                if (_dictionary.TryGetValue(title, out var topic))
                {
                    return(topic.Add(newData()));
                }

                _dictionary.Add(title, newTopic());
                return(false);
            }
        }
        public void Process(RemotePacket remotePacket)
        {
            var(sender, _, payload) = remotePacket;
            var stream = new MemoryStream(payload);
            var topic  = stream.ReadEnd();
            var type   = (GraphType)stream.ReadByte();

            Ports.GetOrAdd(new TopicConfig(sender, topic, type),
                           new Port(null))
            ?.Also(port => {
                var rest  = stream.Length - stream.Position;
                var data  = new NetworkDataReader(stream);
                var frame = new List <Vector3>();
                switch (type)
                {
                case GraphType.OneDimension:
                    switch (rest)
                    {
                    case sizeof(float):
                        frame.Add(new Vector3((float)((DateTime.Now - Origin).Ticks / 1E7),
                                              data.ReadFloat(),
                                              float.NaN));
                        break;

                    case sizeof(double):
                        frame.Add(new Vector3((float)((DateTime.Now - Origin).Ticks / 1E7),
                                              (float)data.ReadDouble(),
                                              float.NaN));
                        break;
                    }

                    break;

                case GraphType.TwoDimension:
                    switch (rest)
                    {
                    case 2 * sizeof(float):
                        frame.Add(new Vector3(data.ReadFloat(),
                                              data.ReadFloat(),
                                              float.NaN));
                        break;

                    case 2 * sizeof(double):
                        frame.Add(new Vector3((float)data.ReadDouble(),
                                              (float)data.ReadDouble(),
                                              float.NaN));
                        break;
                    }

                    break;

                case GraphType.Pose:
                    switch (rest)
                    {
                    case 3 * sizeof(float):
                        frame.Add(new Vector3(data.ReadFloat(),
                                              data.ReadFloat(),
                                              data.ReadFloat()));
                        break;

                    case 3 * sizeof(double):
                        frame.Add(new Vector3((float)data.ReadDouble(),
                                              (float)data.ReadDouble(),
                                              (float)data.ReadDouble()));
                        break;
                    }

                    break;

                case GraphType.Frame:
                    var length = rest - 1;
                    switch ((FrameType)stream.ReadByte())
                    {
                    case FrameType.OneFloat:
                        length /= sizeof(float);
                        while (length-- > 0)
                        {
                            frame.Add(new Vector3((float)((DateTime.Now - Origin).Ticks / 1E7),
                                                  data.ReadFloat(),
                                                  float.NaN));
                        }
                        break;

                    case FrameType.OneDouble:
                        length /= sizeof(double);
                        while (length-- > 0)
                        {
                            frame.Add(new Vector3((float)((DateTime.Now - Origin).Ticks / 1E7),
                                                  (float)data.ReadDouble(),
                                                  float.NaN));
                        }
                        break;

                    case FrameType.TwoFloat:
                        length /= 2 * sizeof(float);
                        while (length-- > 0)
                        {
                            frame.Add(new Vector3(data.ReadFloat(),
                                                  data.ReadFloat(),
                                                  float.NaN));
                        }
                        break;

                    case FrameType.TwoDouble:
                        length /= 2 * sizeof(double);
                        while (length-- > 0)
                        {
                            frame.Add(new Vector3((float)data.ReadDouble(),
                                                  (float)data.ReadDouble(),
                                                  float.NaN));
                        }
                        break;

                    case FrameType.ThreeFloat:
                        length /= 3 * sizeof(float);
                        while (length-- > 0)
                        {
                            frame.Add(new Vector3(data.ReadFloat(),
                                                  data.ReadFloat(),
                                                  data.ReadFloat()));
                        }
                        break;

                    case FrameType.ThreeDouble:
                        length /= 3 * sizeof(double);
                        while (length-- > 0)
                        {
                            frame.Add(new Vector3((float)data.ReadDouble(),
                                                  (float)data.ReadDouble(),
                                                  (float)data.ReadDouble()));
                        }
                        break;

                    default:
                        throw new ArgumentOutOfRangeException();
                    }

                    break;

                default:
                    throw new ArgumentOutOfRangeException();
                }

                if (type == GraphType.Frame || frame.Any())
                {
                    port.Post(frame);
                }
            });
        }