70 lines
2 KiB
C++
70 lines
2 KiB
C++
|
#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;
|
||
|
}
|