bool HIDDeviceManager::Enumerate(HIDEnumerateVisitor* enumVisitor) { HDEVINFO hdevInfoSet; SP_DEVICE_INTERFACE_DATA interfaceData; interfaceData.cbSize = sizeof(interfaceData); // Get handle to info data set describing all available HIDs. hdevInfoSet = SetupDiGetClassDevsA(&HidGuid, NULL, NULL, DIGCF_INTERFACEDEVICE | DIGCF_PRESENT); if (hdevInfoSet == INVALID_HANDLE_VALUE) return false; for(int deviceIndex = 0; SetupDiEnumDeviceInterfaces(hdevInfoSet, NULL, &HidGuid, deviceIndex, &interfaceData); deviceIndex++) { // For each device, we extract its file path and open it to get attributes, // such as vendor and product id. If anything goes wrong, we move onto next device. HIDDevicePathWrapper pathWrapper; if (!pathWrapper.InitPathFromInterfaceData(hdevInfoSet, &interfaceData)) continue; // Look for the device to check if it is already opened. Ptr<DeviceCreateDesc> existingDevice = Manager->FindDevice(pathWrapper.GetPath()); // if device exists and it is opened then most likely the CreateHIDFile // will fail; therefore, we just set Enumerated to 'true' and continue. if (existingDevice && existingDevice->pDevice) { existingDevice->Enumerated = true; continue; } // open device in non-exclusive mode for detection... HANDLE hidDev = CreateHIDFile(pathWrapper.GetPath(), false); if (hidDev == INVALID_HANDLE_VALUE) continue; HIDDeviceDesc devDesc; devDesc.Path = pathWrapper.GetPath(); if (initVendorProductVersion(hidDev, &devDesc) && enumVisitor->MatchVendorProduct(devDesc.VendorId, devDesc.ProductId) && initUsage(hidDev, &devDesc)) { initStrings(hidDev, &devDesc); // Construct minimal device that the visitor callback can get feature reports from. Win32::HIDDevice device(this, hidDev); enumVisitor->Visit(device, devDesc); } ::CloseHandle(hidDev); } SetupDiDestroyDeviceInfoList(hdevInfoSet); return true; }
bool HIDDeviceManager::Enumerate(HIDEnumerateVisitor* enumVisitor) { if (!initializeManager()) { return false; } CFSetRef deviceSet = IOHIDManagerCopyDevices(HIDManager); CFIndex deviceCount = CFSetGetCount(deviceSet); // Allocate a block of memory and read the set into it. IOHIDDeviceRef* devices = (IOHIDDeviceRef*) OVR_ALLOC(sizeof(IOHIDDeviceRef) * deviceCount); CFSetGetValues(deviceSet, (const void **) devices); // Iterate over devices. for (CFIndex deviceIndex = 0; deviceIndex < deviceCount; deviceIndex++) { IOHIDDeviceRef hidDev = devices[deviceIndex]; if (!hidDev) { continue; } HIDDeviceDesc devDesc; if (getPath(hidDev, &(devDesc.Path)) && initVendorProductVersion(hidDev, &devDesc) && enumVisitor->MatchVendorProduct(devDesc.VendorId, devDesc.ProductId) && initUsage(hidDev, &devDesc)) { initStrings(hidDev, &devDesc); initSerialNumber(hidDev, &devDesc); // Construct minimal device that the visitor callback can get feature reports from. OSX::HIDDevice device(this, hidDev); enumVisitor->Visit(device, devDesc); } } OVR_FREE(devices); CFRelease(deviceSet); return true; }
bool HIDDeviceManager::getFullDesc(HANDLE hidDev, HIDDeviceDesc* desc) const { if (!initVendorProductVersion(hidDev, desc)) { return false; } if (!initUsage(hidDev, desc)) { return false; } initStrings(hidDev, desc); return true; }
bool HIDDeviceManager::getFullDesc(IOHIDDeviceRef device, HIDDeviceDesc* desc) { if (!initVendorProductVersion(device, desc)) { return false; } if (!initUsage(device, desc)) { return false; } if (!initSerialNumber(device, desc)) { return false; } initStrings(device, desc); return true; }
//----------------------------------------------------------------------------- bool HIDDeviceManager::getFullDesc(hid_device_info* device, HIDDeviceDesc* desc) { if (!initVendorProductVersion(device, desc)) { return false; } desc->SerialNumber = String(device->serial_number); desc->Manufacturer = String(device->manufacturer_string); desc->Product = String(device->product_string); /* if (!getStringProperty(device, "serial", &(desc->SerialNumber))) { return false; } getStringProperty(device, "manufacturer", &(desc->Manufacturer)); getStringProperty(device, "product", &(desc->Product)); */ return true; }
bool HIDDeviceManager::Enumerate(HIDEnumerateVisitor* enumVisitor) { if (!initializeManager()) { return false; } CFSetRef deviceSet = IOHIDManagerCopyDevices(HIDManager); if (!deviceSet) return false; CFIndex deviceCount = CFSetGetCount(deviceSet); // Allocate a block of memory and read the set into it. IOHIDDeviceRef* devices = (IOHIDDeviceRef*) OVR_ALLOC(sizeof(IOHIDDeviceRef) * deviceCount); CFSetGetValues(deviceSet, (const void **) devices); // Iterate over devices. for (CFIndex deviceIndex = 0; deviceIndex < deviceCount; deviceIndex++) { IOHIDDeviceRef hidDev = devices[deviceIndex]; if (!hidDev) { continue; } HIDDeviceDesc devDesc; if (getPath(hidDev, &(devDesc.Path)) && initVendorProductVersion(hidDev, &devDesc) && enumVisitor->MatchVendorProduct(devDesc.VendorId, devDesc.ProductId) && initUsage(hidDev, &devDesc)) { initStrings(hidDev, &devDesc); initSerialNumber(hidDev, &devDesc); // Look for the device to check if it is already opened. Ptr<DeviceCreateDesc> existingDevice = DevManager->FindHIDDevice(devDesc, true); // if device exists and it is opened then most likely the CreateHIDFile // will fail; therefore, we just set Enumerated to 'true' and continue. if (existingDevice && existingDevice->pDevice) { existingDevice->Enumerated = true; continue; } // open the device temporarily for startup communication if (IOHIDDeviceOpen(hidDev, kIOHIDOptionsTypeSeizeDevice) == kIOReturnSuccess) { // Construct minimal device that the visitor callback can get feature reports from. OSX::HIDDevice device(this, hidDev); enumVisitor->Visit(device, devDesc); IOHIDDeviceClose(hidDev, kIOHIDOptionsTypeSeizeDevice); } } } OVR_FREE(devices); CFRelease(deviceSet); return true; }