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); } }); }