private void EnableOpenTrack(bool en) { if (en && OpenTrackThread == null) { SetState(CommState.TrackerActive, true); var port = 0; if (!int.TryParse(txtOpenTrackPort.Text, out port) || port <= 0) { MessageBox.Show(this, "Invalid UDP port", "OpenTrack Port Error", MessageBoxButtons.OK, MessageBoxIcon.Error); rdOpenTrack.Checked = false; return; } OpenTrackThread = new Thread(() => { ushort sequence = 0; var RemoteIpEndPoint = new IPEndPoint(IPAddress.Any, 0); List <byte[]> outgoingPackets = null; var lastOutgoing = DateTime.MinValue; using (var uc = new UdpClient(port)) { uc.Client.Blocking = false; var sleep = 0; while (OpenTrackThread != null) { SetState(CommState.DriverActive, _sharedMem.IsDriverActive); sleep = 1; if (uc.Client.Available >= OpenTrackPacket.Size) { var bytes = uc.Receive(ref RemoteIpEndPoint); var packet = StructFromBytes <OpenTrackPacket>(bytes); USBRotationData rotData; USBPositionData posData; packet.Init(out rotData, out posData); var usbPacket = USBPacket.Create((byte)(ROTATION_DATA | HMD_SOURCE), sequence++, rotData); var d = StructToBytes(usbPacket); SetPacketCrc(ref d); _sharedMem.WriteIncomingPacket(d); if (IsDebug && IsVisible) { lock (InPacketMonitor) InPacketMonitor.Add(usbPacket); } usbPacket = USBPacket.Create((byte)(POSITION_DATA | HMD_SOURCE), sequence++, posData); d = StructToBytes(usbPacket); SetPacketCrc(ref d); _sharedMem.WriteIncomingPacket(d); if (IsDebug && IsVisible) { lock (InPacketMonitor) InPacketMonitor.Add(usbPacket); } sleep = 0; } //opentrack doesnt receive data from us, just empty outgoing queue outgoingPackets = _sharedMem.ReadOutgoingPackets(); //this block is only for outputting data to monitor if (outgoingPackets != null) { lock (OutgoingPackets) { foreach (var item in outgoingPackets) { OutgoingPackets.Enqueue(item); } } } lock (OutgoingPackets) { if (OutgoingPackets.Count > 0 && (DateTime.Now - lastOutgoing).TotalMilliseconds >= 100) { lastOutgoing = DateTime.Now; var d = OutgoingPackets.Dequeue(); //33 byte packets in queue if (IsDebug && IsVisible) { var packet = StructFromBytes <USBPacket>(d); packet.ParseFields(); lock (OutPacketMonitor) OutPacketMonitor.Add(packet); } } } Thread.Sleep(sleep); } } }); OpenTrackThread.Start(); } else if (!en && OpenTrackThread != null) { var t = OpenTrackThread; OpenTrackThread = null; t.Join(); SetState(CommState.TrackerActive, false); } }
private void USBProcessor() { List <byte[]> outgoingPackets = null; HIDDev _usb = null; var data = new byte[33]; DateTime lastOutgoing = DateTime.MinValue; while (_running) { if (_usb == null) { var hd = HIDBrowse.Browse().FirstOrDefault(h => h.Vid == 0x1974 && h.Pid == 0x001); if (hd != null) { _usb = new HIDDev(); _usb.Open(hd); State = CommState.Connected; _sharedMem.SetState(State); } } try { if (_usb != null) { outgoingPackets = _sharedMem.ReadOutgoingPackets(); if (outgoingPackets != null) { lock (OutgoingPackets) foreach (var item in outgoingPackets) { OutgoingPackets.Enqueue(item); } } lock (OutgoingPackets) if (OutgoingPackets.Count > 0 && (DateTime.Now - lastOutgoing).TotalMilliseconds >= 100) { lastOutgoing = DateTime.Now; var d = OutgoingPackets.Dequeue(); //33 byte packets in queue _usb.Write(d); //send before monitor process if (IsDebug && IsVisible) { var packet = StructFromBytes <USBPacket>(d, 1); packet.ParseFields(); lock (OutPacketMonitor) OutPacketMonitor.Add(packet); } } _usb.Read(data); if (CheckPacketCrc(data, 1)) { _sharedMem.WriteIncomingPacket(data); //send before monitor process State = _sharedMem.IsDriverActive ? CommState.Active : CommState.ActiveNoDriver; if (IsDebug && IsVisible) { //var x = Marshal.SizeOf(typeof(USBPacket)); var packet = StructFromBytes <USBPacket>(data, 1); packet.ParseFields(); lock (InPacketMonitor) InPacketMonitor.Add(packet); } } } } catch (Exception ex) { Debug.WriteLine(ex.Message); if (_usb != null) { _usb.Close(); _usb.Dispose(); } _usb = null; State = CommState.Disconnected; _sharedMem.SetState(State); Thread.Sleep(100); } } if (_usb != null) { _usb.Close(); _usb.Dispose(); } _usb = null; State = CommState.Disconnected; _sharedMem.SetState(CommState.Disconnected); }