rewrite connection to have a static list of devices

This commit is contained in:
Lucas Peter 2024-09-19 17:44:34 +02:00
parent 5496613f14
commit efdfea54ba
No known key found for this signature in database
2 changed files with 79 additions and 18 deletions

View file

@ -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 "SkyPortalSubsystem.h"
#include "Engine/Engine.h" #include "Engine/Engine.h"
DEFINE_LOG_CATEGORY(LogHIDApi);
void USkyPortalSubsystem::Initialize(FSubsystemCollectionBase& Collection) void USkyPortalSubsystem::Initialize(FSubsystemCollectionBase& Collection)
{ {
@ -13,14 +17,14 @@ void USkyPortalSubsystem::Initialize(FSubsystemCollectionBase& Collection)
int res = hid_init(); int res = hid_init();
if (res == 0) if (res == 0)
{ {
UE_LOG(LogTemp, Log, TEXT("HIDAPI initialized successfully.")); UE_LOG(LogHIDApi, Log, TEXT("HIDAPI initialized successfully."));
} }
else else
{ {
UE_LOG(LogTemp, Error, TEXT("Failed to initialize HIDAPI.")); UE_LOG(LogHIDApi, Error, TEXT("Failed to initialize HIDAPI."));
HidError = hid_error(NULL); 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(); 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() { 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(); list = hid_enumerate(0x0, 0x0);
// If `list` is NULL, that means no devices were found or there was an error.
return true; // In this case, print an error message and terminate the program.
if (!list) {
} UE_LOG(LogHIDApi, Error, TEXT("No devices found"));
else {
UE_LOG(LogTemp, Error, TEXT("Failed to connect to Portal."));
// Get the error message from the HIDAPI // Get the error message from the HIDAPI
HidError = hid_error(NULL); HidError = hid_error(NULL);
UE_LOG(LogTemp, Error, TEXT("%s"), *HidError); UE_LOG(LogHIDApi, Error, TEXT("%s"), *HidError);
return false; 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() { void USkyPortalSubsystem::ReadPortal() {
if (PortalDevice) {
hid_read(PortalDevice, PortalRawData, 16); hid_read(PortalDevice, PortalRawData, 16);
//RawDataArray.Append(PortalRawData, 16);
}
} }
FString USkyPortalSubsystem::RawData() {
FString Raw = "0";
return Raw;
}

View file

@ -8,6 +8,11 @@
#include "SkyPortalSubsystem.generated.h" #include "SkyPortalSubsystem.generated.h"
/* Macro Definitions */
#define TIMEOUT 30000
DECLARE_LOG_CATEGORY_EXTERN(LogHIDApi, Log, All);
/* Subsystem */
UCLASS() UCLASS()
class SKYPORTAL_API USkyPortalSubsystem : public UEngineSubsystem class SKYPORTAL_API USkyPortalSubsystem : public UEngineSubsystem
{ {
@ -36,6 +41,10 @@ private:
protected: protected:
//Constants //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 VendorId = 5168;
const int ProductId = 336; const int ProductId = 336;
}; };