public void SendPacket(IReadOnlyCollection <byte> payload) { if (!bluetoothCommunicator.IsConnected()) { throw new InvalidOperationException("Fox is not connected"); } if (payload.Count < MinPayloadLength || payload.Count > MaxPayloadLength) { throw new ArgumentException("Wrong payload size", nameof(payload)); } var fullPacket = new List <byte>(); // Length fullPacket.Add((byte)(payload.Count + AddToPacketLenght)); // Payload fullPacket.AddRange(payload); // CRC32 var crc = CRCGenerator.CalculateSTMCRC32(fullPacket); fullPacket.AddRange(BitsHelper.ConvertUInt32ToBytes(crc)); bluetoothCommunicator.SendMessage(fullPacket); }
/// <summary> /// Called when new raw packet received /// </summary> public void NewRawPacketReceived(IReadOnlyCollection <byte> packet) { var packetAsList = new List <byte>(packet); // Checking CRC var crcBuffer = packetAsList .GetRange(packet.Count - 4, 4); var expectedCRC = BitsHelper.ConvertBytesToUint32(crcBuffer.ToArray()); var calculatedCRC = CRCGenerator.CalculateSTMCRC32(packetAsList .GetRange(0, packetAsList.Count - 4)); if (expectedCRC != calculatedCRC) { return; } var payloadLength = packetAsList[0] - AddToPacketLenght; var payload = packetAsList .GetRange(1, payloadLength) .AsReadOnly(); OnPacketReceived(payload); }