} // CloneState #endregion #region Check Connectivity /// <summary> /// Indicates if the Wiimote remains connected to the system or not. /// This method is time consuming because it waits the Wiimote response. /// </summary> public void CheckConnectivity() { if (isConnected) { try { wiimote.GetStatus(); } catch (Exception) { isConnected = false; MessageBox.Show("", "Wiimote " + playerIndex + " Disconnected", MessageBoxButtons.OK, MessageBoxIcon.Error); } } } // CheckConnectivity
public static List<Wiimote> GetConnectedWiimotes() { List<Wiimote> motes = new List<Wiimote>(); int index = 0; bool found = false; Guid guid; // get the GUID of the HID class HIDImports.HidD_GetHidGuid(out guid); // get a handle to all devices that are part of the HID class // Fun fact: DIGCF_PRESENT worked on my machine just fine. I reinstalled Vista, and now it no longer finds the Wiimote with that parameter enabled... IntPtr hDevInfo = HIDImports.SetupDiGetClassDevs(ref guid, null, IntPtr.Zero, HIDImports.DIGCF_DEVICEINTERFACE);// | HIDImports.DIGCF_PRESENT); // create a new interface data struct and initialize its size HIDImports.SP_DEVICE_INTERFACE_DATA diData = new HIDImports.SP_DEVICE_INTERFACE_DATA(); diData.cbSize = Marshal.SizeOf(diData); // get a device interface to a single device (enumerate all devices) while (HIDImports.SetupDiEnumDeviceInterfaces(hDevInfo, IntPtr.Zero, ref guid, index, ref diData)) { UInt32 size; // get the buffer size for this device detail instance (returned in the size parameter) HIDImports.SetupDiGetDeviceInterfaceDetail(hDevInfo, ref diData, IntPtr.Zero, 0, out size, IntPtr.Zero); // create a detail struct and set its size HIDImports.SP_DEVICE_INTERFACE_DETAIL_DATA diDetail = new HIDImports.SP_DEVICE_INTERFACE_DETAIL_DATA(); // yeah, yeah...well, see, on Win x86, cbSize must be 5 for some reason. On x64, apparently 8 is what it wants. // someday I should figure this out. Thanks to Paul Miller on this... if (IntPtr.Size == 8) diDetail.cbSize = 8; else diDetail.cbSize = 5; // actually get the detail struct if (HIDImports.SetupDiGetDeviceInterfaceDetail(hDevInfo, ref diData, ref diDetail, size, out size, IntPtr.Zero)) { Debug.WriteLine(index + " " + diDetail.DevicePath + " " + Marshal.GetLastWin32Error()); // open a read/write handle to our device using the DevicePath returned SafeFileHandle mHandle = HIDImports.CreateFile(diDetail.DevicePath, FileAccess.ReadWrite, FileShare.ReadWrite, IntPtr.Zero, FileMode.Open, HIDImports.EFileAttributes.Overlapped, IntPtr.Zero); // create an attributes struct and initialize the size HIDImports.HIDD_ATTRIBUTES attrib = new HIDImports.HIDD_ATTRIBUTES(); attrib.Size = Marshal.SizeOf(attrib); // get the attributes of the current device if (HIDImports.HidD_GetAttributes(mHandle.DangerousGetHandle(), ref attrib)) { // if the vendor and product IDs match up if (attrib.VendorID == VID && attrib.ProductID == PID) { Debug.WriteLine("Found it!"); found = true; Wiimote mote = new Wiimote(); mote.mStream = new FileStream(mHandle, FileAccess.ReadWrite, REPORT_LENGTH, true); mote.mHandle = mHandle; // start an async read operation on it mote.BeginAsyncRead(); // read the calibration info from the controller try { mote.ReadCalibration(); } catch { // if we fail above, try the alternate HID writes mote.mAltWriteMethod = true; mote.ReadCalibration(); } // force a status check to get the state of any extensions plugged in at startup mote.GetStatus(); motes.Add(mote); } else { // otherwise this isn't the controller, so close up the file handle mHandle.Close(); } } } else { // failed to get the detail struct throw new Exception("SetupDiGetDeviceInterfaceDetail failed on index " + index); } index++; } // clean up our list HIDImports.SetupDiDestroyDeviceInfoList(hDevInfo); // if we didn't find a Wiimote, throw an exception if (!found) throw new Exception("Wiimote not found in HID device list."); return motes; }
public static List <Wiimote> GetConnectedWiimotes() { List <Wiimote> motes = new List <Wiimote>(); int index = 0; bool found = false; Guid guid; // get the GUID of the HID class HIDImports.HidD_GetHidGuid(out guid); // get a handle to all devices that are part of the HID class // Fun fact: DIGCF_PRESENT worked on my machine just fine. I reinstalled Vista, and now it no longer finds the Wiimote with that parameter enabled... IntPtr hDevInfo = HIDImports.SetupDiGetClassDevs(ref guid, null, IntPtr.Zero, HIDImports.DIGCF_DEVICEINTERFACE);// | HIDImports.DIGCF_PRESENT); // create a new interface data struct and initialize its size HIDImports.SP_DEVICE_INTERFACE_DATA diData = new HIDImports.SP_DEVICE_INTERFACE_DATA(); diData.cbSize = Marshal.SizeOf(diData); // get a device interface to a single device (enumerate all devices) while (HIDImports.SetupDiEnumDeviceInterfaces(hDevInfo, IntPtr.Zero, ref guid, index, ref diData)) { UInt32 size; // get the buffer size for this device detail instance (returned in the size parameter) HIDImports.SetupDiGetDeviceInterfaceDetail(hDevInfo, ref diData, IntPtr.Zero, 0, out size, IntPtr.Zero); // create a detail struct and set its size HIDImports.SP_DEVICE_INTERFACE_DETAIL_DATA diDetail = new HIDImports.SP_DEVICE_INTERFACE_DETAIL_DATA(); // yeah, yeah...well, see, on Win x86, cbSize must be 5 for some reason. On x64, apparently 8 is what it wants. // someday I should figure this out. Thanks to Paul Miller on this... if (IntPtr.Size == 8) { diDetail.cbSize = 8; } else { diDetail.cbSize = 5; } // actually get the detail struct if (HIDImports.SetupDiGetDeviceInterfaceDetail(hDevInfo, ref diData, ref diDetail, size, out size, IntPtr.Zero)) { Debug.WriteLine(index + " " + diDetail.DevicePath + " " + Marshal.GetLastWin32Error()); // open a read/write handle to our device using the DevicePath returned SafeFileHandle mHandle = HIDImports.CreateFile(diDetail.DevicePath, FileAccess.ReadWrite, FileShare.ReadWrite, IntPtr.Zero, FileMode.Open, HIDImports.EFileAttributes.Overlapped, IntPtr.Zero); // create an attributes struct and initialize the size HIDImports.HIDD_ATTRIBUTES attrib = new HIDImports.HIDD_ATTRIBUTES(); attrib.Size = Marshal.SizeOf(attrib); // get the attributes of the current device if (HIDImports.HidD_GetAttributes(mHandle.DangerousGetHandle(), ref attrib)) { // if the vendor and product IDs match up if (attrib.VendorID == VID && attrib.ProductID == PID) { Debug.WriteLine("Found it!"); found = true; Wiimote mote = new Wiimote(); mote.mStream = new FileStream(mHandle, FileAccess.ReadWrite, REPORT_LENGTH, true); mote.mHandle = mHandle; // start an async read operation on it mote.BeginAsyncRead(); // read the calibration info from the controller try { mote.ReadCalibration(); } catch { // if we fail above, try the alternate HID writes mote.mAltWriteMethod = true; mote.ReadCalibration(); } // force a status check to get the state of any extensions plugged in at startup mote.GetStatus(); motes.Add(mote); } else { // otherwise this isn't the controller, so close up the file handle mHandle.Close(); } } } else { // failed to get the detail struct throw new Exception("SetupDiGetDeviceInterfaceDetail failed on index " + index); } index++; } // clean up our list HIDImports.SetupDiDestroyDeviceInfoList(hDevInfo); // if we didn't find a Wiimote, throw an exception if (!found) { throw new Exception("Wiimote not found in HID device list."); } return(motes); }