#include "SkyPortalIO.h" #include "Engine/Engine.h" DEFINE_LOG_CATEGORY(LogHIDApi); DEFINE_LOG_CATEGORY(LogSkyportalIO); bool OpenPortalHandle() { //reset if (PortalDevice) { hid_close(PortalDevice); } /* Declare two pointers to hold information about HID devices. "list" will point to the head of the linked list of devices, "attributes" will be used to iterate through the list. */ struct hid_device_info* list, * attributes; list = hid_enumerate(0x0, 0x0); // If `list` is NULL, that means no devices were found or there was an error. // In this case, print an error message and terminate the program. if (!list) { UE_LOG(LogHIDApi, Error, TEXT("No devices found")); // Get the error message from the HIDAPI HidError = hid_error(NULL); UE_LOG(LogHIDApi, Error, TEXT("%s"), *HidError); return false; } attributes = list; // Iterate through the linked list of devices int vendorCount = sizeof(VendorIds) / sizeof(VendorIds[0]); int productCount = sizeof(ProductIds) / sizeof(ProductIds[0]); while (attributes) { // Check if the devices match any of vendor_id and product_id for (int i = 0; i < vendorCount; i++) { for (int j = 0; j < productCount; j++) { if (attributes->vendor_id == VendorIds[i] && attributes->product_id == ProductIds[j]) { UE_LOG(LogHIDApi, Display, TEXT("Portal found")); UE_LOG(LogHIDApi, Log, TEXT("Vendor ID: 0x%x, Product ID: 0x%x"), attributes->vendor_id, attributes->product_id); PortalDevice = hid_open(attributes->vendor_id, attributes->product_id, NULL); if (PortalDevice) { UE_LOG(LogHIDApi, Display, TEXT("Successful connection to Portal.")); // Free the device list hid_free_enumeration(list); //bPortalConnected = true; return true; } break; } } } // Move to the next device in the list attributes = attributes->next; } // Free the device list hid_free_enumeration(list); UE_LOG(LogHIDApi, Error, TEXT("No Portals found")); return false; }