private PositionControllerResponse DecodeResponse(byte[] buffer) { using (Stream s = new MemoryStream(buffer)) { using (BinaryReader br = new BinaryReader(s)) { ushort header = br.ReadUInt16(); if (header != DATA_HEADER) { return(new PositionControllerResponse(PositionControllerStatus.CS_ERR_COMMUNICATION)); } ushort status = br.ReadUInt16(); uint position = br.ReadUInt32(); uint crc = br.ReadUInt32(); s.Seek(0, SeekOrigin.Begin); Stm32Crc32 crc32 = new Stm32Crc32(CRC32_INITIAL_VALUE, CRC32_POLYNOMIAL); crc32.Encode(br.ReadUInt32()); crc32.Encode(br.ReadUInt32()); if (crc32.GetValue() != crc) { return(new PositionControllerResponse(PositionControllerStatus.CS_ERR_CRC)); } return(new PositionControllerResponse((PositionControllerStatus)status, position)); } } }
private static IBuffer CreateRequest(PositionControllerCommand command, PositionControllerDirection direction, uint steps, byte[] buffer) { if (buffer == null || buffer.Length < REQUEST_LENGTH) { throw new ArgumentException($"'{nameof(buffer)}' parameter is null or too small"); } using (Stream s = new MemoryStream(buffer)) { using (BinaryWriter bw = new BinaryWriter(s)) { bw.Write((ushort)DATA_HEADER); bw.Write((byte)command); bw.Write((byte)direction); bw.Write((uint)steps); } } Stm32Crc32 crc32 = new Stm32Crc32(CRC32_INITIAL_VALUE, CRC32_POLYNOMIAL); using (Stream s = new MemoryStream(buffer)) { using (BinaryReader br = new BinaryReader(s)) { crc32.Encode(br.ReadUInt32()); crc32.Encode(br.ReadUInt32()); } } using (Stream s = new MemoryStream(buffer, 8, 4)) { using (BinaryWriter bw = new BinaryWriter(s)) { bw.Write((uint)crc32.GetValue()); } } return(buffer.AsBuffer()); }