private byte[] SerializePointsCommand(DataCommandDto cmd) { using (MemoryStream stream = new MemoryStream()) { using (BinaryWriter writer = new BinaryWriter(stream)) { writer.Write(cmd.Command); writer.Write(cmd.NPoints); foreach (var point in cmd.Points) { writer.Write(point.Control); writer.Write(point.X); writer.Write(point.Y); writer.Write(point.R); writer.Write(point.G); writer.Write(point.B); writer.Write(point.I); writer.Write(point.U1); writer.Write(point.U2); } } return stream.ToArray(); } }
public void StreamPoints(DacPointDto[] points, ushort pointRate = 30000) { // Try prepare var response = Prepare(); var played = 0; ReadOnlySpan<DacPointDto> buffer = new ReadOnlySpan<DacPointDto>(points); for (; ; ) { var pointCap = (buffer.Length < BUFFER_SIZE) ? buffer.Length - 1 : (BUFFER_SIZE - response.DacStatus.BufferFullness); if (pointCap < 0) { response = Ping(); } else { if ((played + pointCap) >= buffer.Length) { // playback done break; } var playablePoints = buffer.Slice(played, pointCap); DataCommandDto cmd = new DataCommandDto() { Command = COMMAND_DATA, NPoints = Convert.ToUInt16(pointCap), Points = playablePoints.ToArray() }; //serialize points var serialized = SerializePointsCommand(cmd); //transmit response = Transmit(serialized); played += pointCap; Begin(pointRate); } } }