Пример #1
0
 private void DeviceEmptyHandler(object sender, DeviceDescriptor deviceDescriptor)
 {
     if (_activeDevices.TryRemove(deviceDescriptor, out var device))
     {
         device.Dispose();
     }
     else
     {
         throw new Exception($"Remove device {deviceDescriptor.ToString()} failed");
     }
 }
Пример #2
0
 private void DeviceEmptyHandler(object sender, DeviceDescriptor deviceDescriptor)
 {
     _logger.Log($"Device {deviceDescriptor.DeviceHandle} instance {deviceDescriptor.DeviceInstance} is empty, disposing...");
     if (_activeDevices.TryRemove(deviceDescriptor, out var device))
     {
         device.Dispose();
     }
     else
     {
         throw new Exception($"Remove device {deviceDescriptor.ToString()} failed");
     }
 }
Пример #3
0
        /// <summary>
        /// Start the PollThread
        /// </summary>
        public override void Init()
        {
            _pollThread = new Thread(PollThread);
            _pollThread.Start();
            var timeout = Environment.TickCount + 5000;

            while (!PollThreadPolling && Environment.TickCount < timeout) // Wait for PollThread to start
            {
                Thread.Sleep(10);
            }

            if (!PollThreadPolling)
            {
                throw new Exception($"Device {DeviceDescriptor.ToString()} is not connected");
            }
        }
Пример #4
0
            /// <summary>
            /// GetDeviceDescription: Get a Description of the HMD and apply appropriate settings
            ///
            /// </summary>
            private void GetDeviceDescription()
            {
                _deviceDescriptor = GetComponent <DisplayInterface>().GetDeviceDescription();
                if (_deviceDescriptor != null)
                {
                    Debug.Log(_deviceDescriptor.ToString());
                    switch (_deviceDescriptor.DisplayMode)
                    {
                    case "full_screen":
                        viewMode = ViewMode.mono;
                        break;

                    case "horz_side_by_side":
                    case "vert_side_by_side":
                    default:
                        viewMode = ViewMode.stereo;
                        break;
                    }
                    stereoAmount = Mathf.Clamp(_deviceDescriptor.OverlapPercent, 0, 100);
                    SetResolution(_deviceDescriptor.Width, _deviceDescriptor.Height);              //set resolution before FOV
                    Camera.fieldOfView = Mathf.Clamp(_deviceDescriptor.MonocularVertical, 0, 180); //unity camera FOV is vertical
                    float aspectRatio = (float)_deviceDescriptor.Width / (float)_deviceDescriptor.Height;
                    //aspect ratio per eye depends on how many displays the HMD has
                    //for example, dSight has two 1920x1080 displays, so each eye should have 1.77 aspect
                    //whereas HDK has one 1920x1080 display, each eye should have 0.88 aspect (half of 1.77)
                    float aspectRatioPerEye = _deviceDescriptor.NumDisplays == 1 ? aspectRatio * 0.5f : aspectRatio;
                    //set projection matrix for each eye
                    Camera.projectionMatrix = Matrix4x4.Perspective(_deviceDescriptor.MonocularVertical, aspectRatioPerEye, Camera.nearClipPlane, Camera.farClipPlane);
                    SetDistortion(_deviceDescriptor.K1Red, _deviceDescriptor.K1Green, _deviceDescriptor.K1Blue,
                                  _deviceDescriptor.CenterProjX, _deviceDescriptor.CenterProjY); //set distortion shader

                    //if the view needs to be rotated 180 degrees, create a parent game object that is flipped 180 degrees on the z axis.
                    if (_deviceDescriptor.Rotate180 > 0)
                    {
                        GameObject vrHeadParent = new GameObject();
                        vrHeadParent.name = this.transform.name + "_parent";
                        vrHeadParent.transform.position = this.transform.position;
                        vrHeadParent.transform.rotation = this.transform.rotation;
                        if (this.transform.parent != null)
                        {
                            vrHeadParent.transform.parent = this.transform.parent;
                        }
                        this.transform.parent = vrHeadParent.transform;
                        vrHeadParent.transform.Rotate(0, 0, 180, Space.Self);
                    }
                }
            }
Пример #5
0
            /// <summary>
            /// GetDeviceDescription: Get a Description of the HMD and apply appropriate settings
            ///
            /// </summary>
            private void GetDeviceDescription()
            {
                _deviceDescriptor = GetComponent <DisplayInterface>().GetDeviceDescription();
                Debug.Log(_deviceDescriptor.ToString());
                if (_deviceDescriptor != null)
                {
                    switch (_deviceDescriptor.DisplayMode)
                    {
                    case "full_screen":
                        viewMode = ViewMode.mono;
                        break;

                    case "horz_side_by_side":
                    case "vert_side_by_side":
                    default:
                        viewMode = ViewMode.stereo;
                        break;
                    }
                    stereoAmount = Mathf.Clamp(_deviceDescriptor.OverlapPercent, 0, 100);
                    SetResolution(_deviceDescriptor.Width, _deviceDescriptor.Height);              //set resolution before FOV
                    Camera.fieldOfView = Mathf.Clamp(_deviceDescriptor.MonocularVertical, 0, 180); //unity camera FOV is vertical
                    SetDistortion(_deviceDescriptor.K1Red, _deviceDescriptor.K1Green, _deviceDescriptor.K1Blue,
                                  _deviceDescriptor.CenterProjX, _deviceDescriptor.CenterProjY);   //set distortion shader

                    //if the view needs to be rotated 180 degrees, create a parent game object that is flipped 180 degrees on the z axis.
                    if (_deviceDescriptor.Rotate180 > 0)
                    {
                        GameObject vrHeadParent = new GameObject();
                        vrHeadParent.name = this.transform.name + "_parent";
                        vrHeadParent.transform.position = this.transform.position;
                        vrHeadParent.transform.rotation = this.transform.rotation;
                        if (this.transform.parent != null)
                        {
                            vrHeadParent.transform.parent = this.transform.parent;
                        }
                        this.transform.parent = vrHeadParent.transform;
                        vrHeadParent.transform.Rotate(0, 0, 180, Space.Self);
                    }
                }
            }
 ///<summary>
 ///Returns a <see cref="T:System.String"/> that represents the current <see cref="UsbDeviceNotifyInfo"/>.
 ///</summary>
 ///
 ///<returns>
 ///A <see cref="System.String"/> that represents the current <see cref="UsbDeviceNotifyInfo"/>.
 ///</returns>
 public override string ToString()
 {
     object[] values = new object[] { Name, BusNumber, DeviceAddress, DeviceDescriptor.ToString() };
     return(string.Format("Name:{0} BusNumber:{1} DeviceAddress:{2}\n{3}", values));
 }
Пример #7
0
        // Temporary test application to validate functionality as it's being built.
        static void Main(string[] args)
        {
            Guid   testGuid = new Guid("d2938a49-3191-4b25-ba33-e45f0828ced4");
            Random r        = new Random();

            WinUSBEnumeratedDevice[] allDevices = WinUSBDevice.EnumerateAllDevices().ToArray();
            foreach (WinUSBEnumeratedDevice devicePath in allDevices)
            {
                Console.Out.WriteLine(devicePath.ToString());
                try {
                    WinUSBDevice d = new WinUSBDevice(devicePath);
                    try {
                        DeviceDescriptor dev = d.GetDeviceDescriptor();
                        Console.Out.WriteLine(dev.ToString());
                        ConfigurationDescriptor cfg = d.GetConfigurationDescriptor();
                        Console.Out.WriteLine(cfg.ToString());
                    }
                    finally
                    {
                        d.Close();
                    }
                }
                catch (Exception ex)
                {
                    Console.Out.WriteLine("Exception while querying descriptors: {0}", ex);
                }
            }


            WinUSBEnumeratedDevice[] devices = WinUSBDevice.EnumerateDevices(testGuid).ToArray();
            foreach (WinUSBEnumeratedDevice devicePath in devices)
            {
                Console.Out.WriteLine(devicePath);

                WinUSBDevice test = new WinUSBDevice(devicePath);

                // Try a data test. Test board just has OUT 3 looped back into IN 3
                // Set pipe timeouts to avoid hanging forever.
                test.SetPipePolicy(0x03, WinUsbPipePolicy.PIPE_TRANSFER_TIMEOUT, 100);
                test.SetPipePolicy(0x83, WinUsbPipePolicy.PIPE_TRANSFER_TIMEOUT, 100);

                // Send some junk via OUT 3
                byte[] data = new byte[128];
                r.NextBytes(data);

                // Flush out any data that might have been here from a previous run...
                // Will take about as long as the transfer timeout.
                while (test.ReadPipe(0x83, 64).Length != 0)
                {
                    ;
                }


                test.WritePipe(0x03, data);

                // read it back.
                byte[] returnData = test.ReadExactPipe(0x83, data.Length);

                for (int i = 0; i < data.Length; i++)
                {
                    if (data[i] != returnData[i])
                    {
                        throw new Exception("Error validating data returned from the device!");
                    }
                }
                Console.Out.WriteLine("Passed basic transfer test");

                // Timeout test
                returnData = test.ReadPipe(0x83, 32);
                if (returnData.Length != 0)
                {
                    throw new Exception("Pipe didn't timeout, where did it get that data?");
                }
                Console.Out.WriteLine("Passed timeout test");

                test.Close();
                test.Close(); // checking that double close doesn't cause issues.
            }

            Console.Out.WriteLine("{0} device{1}", devices.Length, devices.Length == 1?"":"s");

            WinUSBEnumeratedDevice[] hackrfs = HackRF.Enumerate().ToArray();
            if (hackrfs.Length > 0)
            {
                Console.WriteLine("Connecting to hackrf device {0}", hackrfs[0].ToString());

                HackRF rf = new HackRF(hackrfs[0]);

                Console.WriteLine("Version String: {0}", rf.ReadVersion());

                // Do some benchmarking with the receive modes.
                rf.SetSampleRate(2000000);
                rf.ModeReceive();
                rf.SetFrequency(100000000); // 100 MHz
                rf.SetSampleRate(10000000);

                int      lastEaten      = 0;
                int      eaten          = rf.PacketsEaten;
                long     lastEatenBytes = 0;
                long     eatenBytes     = rf.BytesEaten;
                DateTime lastTime       = DateTime.Now;
                while (true)
                {
                    System.Threading.Thread.Sleep(2000);
                    DateTime newTime = DateTime.Now;
                    lastEaten      = eaten;
                    eaten          = rf.PacketsEaten;
                    lastEatenBytes = eatenBytes;
                    eatenBytes     = rf.BytesEaten;
                    double seconds = newTime.Subtract(lastTime).TotalSeconds;
                    double pps     = (eaten - lastEaten) / seconds;
                    double mbps    = ((eatenBytes - lastEatenBytes) / seconds) / 1000000;
                    lastTime = newTime;


                    Console.WriteLine("Receiving... {0}  {1:n2}pps {2:n4}MB/s", eaten, pps, mbps);
                    string[] histogramData;
                    lock (rf)
                    {
                        histogramData = rf.EatenHistogram.OrderByDescending(kv => kv.Value).Take(8).Select(kv => string.Format("{0}:{1}", kv.Key, kv.Value)).ToArray();
                    }
                    Console.WriteLine(string.Join(" ", histogramData));
                }
            }


            WinUSBEnumeratedDevice[] fadecandies = Fadecandy.Enumerate().ToArray();
            if (fadecandies.Length > 0)
            {
                Fadecandy fc = new Fadecandy(fadecandies[0]);

                RgbRing ring = new RgbRing(24);

                double t = 0;
                while (true)
                {
                    ring.Update(t);
                    Array.Copy(ring.Ring, fc.Pixels, 24);
                    fc.Pixels[64].G = Math.Sin(t) * 0.2 + 0.2;
                    fc.FlushRange(0, 65);

                    t += 0.01;
                    System.Threading.Thread.Sleep(10);
                }
            }


            WinUSBEnumeratedDevice[] rgbbuttons = RgbButton.Enumerate().ToArray();
            if (rgbbuttons.Length > 0)
            {
                RgbButton rb = new RgbButton(rgbbuttons[0]);

#if false
                { // Put device into programming mode.
                    rb.EnterProgrammingMode();
                    return;
                }
#endif

                double t = 0;
                while (true)
                {
                    rb.ButtonColors[0].G = Math.Sin(t) * 0.2 + 0.2;
                    rb.ButtonColors[1].R = Math.Sin(t) * 0.2 + 0.2;
                    rb.ButtonColors[2].G = 0.5 - rb.ButtonValues[0] / 256.0;
                    rb.ButtonColors[2].R = 0.5 - rb.ButtonValues[1] / 256.0;
                    rb.ButtonColors[2].B = 0.5 - rb.ButtonValues[3] / 256.0;
                    rb.ButtonColors[3].B = (rb.DataCount & 1023) / 2048.0;
                    rb.SendButtonColors();

                    t += 0.02;
                    System.Threading.Thread.Sleep(20);

                    Console.WriteLine("{0} {1} {2} {3}", rb.ButtonValues[0], rb.ButtonValues[1], rb.ButtonValues[2], rb.ButtonValues[3]);
                }
            }
        }
Пример #8
0
            /// <summary>
            /// GetDeviceDescription: Get a Description of the HMD and apply appropriate settings
            /// 
            /// </summary>
            private void GetDeviceDescription()
            {
                _deviceDescriptor = GetComponent<DisplayInterface>().GetDeviceDescription();
                if (_deviceDescriptor != null)
                {
                    Debug.Log(_deviceDescriptor.ToString());
                    switch (_deviceDescriptor.DisplayMode)
                    {
                        case "full_screen":
                            viewMode = ViewMode.mono;
                            break;
                        case "horz_side_by_side":
                        case "vert_side_by_side":
                        default:
                            viewMode = ViewMode.stereo;
                            break;
                    }
                    stereoAmount = Mathf.Clamp(_deviceDescriptor.OverlapPercent, 0, 100);
                    SetResolution(_deviceDescriptor.Width, _deviceDescriptor.Height); //set resolution before FOV
                    Camera.fieldOfView = Mathf.Clamp(_deviceDescriptor.MonocularVertical, 0, 180); //unity camera FOV is vertical
                    SetDistortion(_deviceDescriptor.K1Red, _deviceDescriptor.K1Green, _deviceDescriptor.K1Blue,
                    _deviceDescriptor.CenterProjX, _deviceDescriptor.CenterProjY); //set distortion shader

                    //if the view needs to be rotated 180 degrees, create a parent game object that is flipped 180 degrees on the z axis.
                    if (_deviceDescriptor.Rotate180 > 0)
                    {
                        GameObject vrHeadParent = new GameObject();
                        vrHeadParent.name = this.transform.name + "_parent";
                        vrHeadParent.transform.position = this.transform.position;
                        vrHeadParent.transform.rotation = this.transform.rotation;
                        if (this.transform.parent != null)
                        {
                            vrHeadParent.transform.parent = this.transform.parent;
                        }
                        this.transform.parent = vrHeadParent.transform;
                        vrHeadParent.transform.Rotate(0, 0, 180, Space.Self);
                    }
                }
            }