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"); } }
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"); } }
/// <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"); } }
/// <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); } } }
/// <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)); }
// 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]); } } }
/// <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); } } }