Exemplo n.º 1
0
        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);
            }
        }
Exemplo n.º 2
0
        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);
        }