Example #1
0
    private static unsafe bool HandlePacket(byte *offset, byte *end, out int increment)
    {
        Packet.Header *header = (Packet.Header *)offset;
        increment = -1;

        UInt16 checksum = CRC16.Generate(offset + Marshal.SizeOf(header->HeaderChecksum), Marshal.SizeOf(*header) - Marshal.SizeOf(header->HeaderChecksum));

        DebugTools.Print($"Header: HeaderChecksum={header->HeaderChecksum.ToString("X4")}, DataChecksum={header->DataChecksum.ToString("X4")}, Type={header->Type}, Size={header->Size} (Checksum={checksum.ToString("X4")}, Hex={ToHexString(offset, Marshal.SizeOf(*header))})");

        if (!Packet.VerifyHeader(header))
        {
            DebugTools.Print($"Header checksum failed: {header->HeaderChecksum.ToString("X4")} / {checksum.ToString("X4")}");
            return(false);
        }

        if (offset + (Marshal.SizeOf(*header) + header->Size) > end)
        {
            increment = 0;
            return(false);
        }

        checksum = CRC16.Generate(offset + Marshal.SizeOf(*header), header->Size);
        DebugTools.Print($"Data: DataChecksum={header->DataChecksum.ToString("X4")}, Size={header->Size} (Checksum={checksum.ToString("X4")}, Hex={ToHexString(offset + Marshal.SizeOf(*header), header->Size)})");

        if (!Packet.VerifyData(header))
        {
            DebugTools.Print($"Content checksum failed: {header->DataChecksum.ToString("X4")} / {checksum.ToString("X4")}");
            return(false);
        }

        increment = Marshal.SizeOf(*header) + header->Size;
        OnPacketReceivedEvent?.Invoke(header);
        return(true);
    }
    private unsafe void PacketReceived(Packet.Header *header)
    {
        switch (header->Type)
        {
        case (byte)CustomPackets.Type.OrientationData:
        {
            Orientation = *((CustomPackets.OrientationDataPacket *)header);

            DebugTools.Print($"DATA: {Orientation}");
            break;
        }

        case (byte)CustomPackets.Type.ProximityData:
        {
            ProximityData data = *((CustomPackets.ProximityDataPacket *)header);
            DebugTools.Print($"DATA: {data}");

            if (data.ID < 0 || data.ID >= ProximityContent.Length)
            {
                DebugTools.Print($"Invalid sensor index ID: {data.ID}");
                return;
            }

            int count = ProximityContent[data.ID].Count;
            int cap   = m_ContentCapacity - 1;
            for (; count-- > cap;)
            {
                ProximityContent[data.ID].RemoveAt(0);
            }

            ProximityContent[data.ID].Add(data);

            break;
        }

        default:
        {
            DebugTools.Print($"Unknown packet type: {header->Type}");
            break;
        }
        }
    }