From efdfea54bae7758af7260c458339f134ceaa7c75 Mon Sep 17 00:00:00 2001 From: Lucas Peter Date: Thu, 19 Sep 2024 17:44:34 +0200 Subject: [PATCH] rewrite connection to have a static list of devices --- .../SkyPortal/Private/SkyPortalSubsystem.cpp | 88 +++++++++++++++---- Source/SkyPortal/Public/SkyPortalSubsystem.h | 9 ++ 2 files changed, 79 insertions(+), 18 deletions(-) diff --git a/Source/SkyPortal/Private/SkyPortalSubsystem.cpp b/Source/SkyPortal/Private/SkyPortalSubsystem.cpp index 444acd8..b82e189 100644 --- a/Source/SkyPortal/Private/SkyPortalSubsystem.cpp +++ b/Source/SkyPortal/Private/SkyPortalSubsystem.cpp @@ -1,6 +1,10 @@ +// A lot of this code is made because of the work of https://github.com/capull0/SkyDumper + #include "SkyPortalSubsystem.h" #include "Engine/Engine.h" +DEFINE_LOG_CATEGORY(LogHIDApi); + void USkyPortalSubsystem::Initialize(FSubsystemCollectionBase& Collection) { @@ -13,14 +17,14 @@ void USkyPortalSubsystem::Initialize(FSubsystemCollectionBase& Collection) int res = hid_init(); if (res == 0) { - UE_LOG(LogTemp, Log, TEXT("HIDAPI initialized successfully.")); + UE_LOG(LogHIDApi, Log, TEXT("HIDAPI initialized successfully.")); } else { - UE_LOG(LogTemp, Error, TEXT("Failed to initialize HIDAPI.")); + UE_LOG(LogHIDApi, Error, TEXT("Failed to initialize HIDAPI.")); HidError = hid_error(NULL); - UE_LOG(LogTemp, Error, TEXT("%s"), *HidError); + UE_LOG(LogHIDApi, Error, TEXT("%s"), *HidError); } } @@ -38,31 +42,79 @@ void USkyPortalSubsystem::Deinitialize() Super::Deinitialize(); } + + +/* +Number of endpoints : 2 +found an IN End Point 0 with attributes interrupt and address 0x1 +found an OUT End Point 1 with attributes interrupt and address 0x1 +*/ bool USkyPortalSubsystem::ConnectPortal() { - PortalDevice = hid_open(VendorId, ProductId, NULL); //Connect using constants - if (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; - ReadPortal(); - - return true; - - } - else { - UE_LOG(LogTemp, Error, TEXT("Failed to connect to Portal.")); + 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(LogTemp, Error, TEXT("%s"), *HidError); + 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); + return true; + } + + break; + } + } + } + + // Move to the next device in the list + attributes = attributes->next; + } + + // Free the device list + hid_free_enumeration(list); + + return false; } + + void USkyPortalSubsystem::ReadPortal() { - hid_read(PortalDevice, PortalRawData, 16); + if (PortalDevice) { + hid_read(PortalDevice, PortalRawData, 16); + //RawDataArray.Append(PortalRawData, 16); + } + } -FString USkyPortalSubsystem::RawData() { - FString Raw = "0"; - return Raw; -} \ No newline at end of file diff --git a/Source/SkyPortal/Public/SkyPortalSubsystem.h b/Source/SkyPortal/Public/SkyPortalSubsystem.h index 6825026..289c668 100644 --- a/Source/SkyPortal/Public/SkyPortalSubsystem.h +++ b/Source/SkyPortal/Public/SkyPortalSubsystem.h @@ -8,6 +8,11 @@ #include "SkyPortalSubsystem.generated.h" +/* Macro Definitions */ +#define TIMEOUT 30000 +DECLARE_LOG_CATEGORY_EXTERN(LogHIDApi, Log, All); + +/* Subsystem */ UCLASS() class SKYPORTAL_API USkyPortalSubsystem : public UEngineSubsystem { @@ -36,6 +41,10 @@ private: protected: //Constants + const int VendorIds[4] = { 0x12ba, 0x54c, 0x1430, 0x1430 }; + const int ProductIds[4] = { 0x150, 0x967, 0x1f17 }; + + /////Defaults values, should not be used const int VendorId = 5168; const int ProductId = 336; };