From 5953dc64ffd57c822396657c224f43433ce38623 Mon Sep 17 00:00:00 2001 From: Timo Hilger Date: Mon, 16 Mar 2026 13:57:39 +0100 Subject: [PATCH] updated source with function library to get all ports and init serial com + visual updates --- .../BP/BP_SerialCom_v4_UE510_SPIE.uasset | 4 +- .../Widgets/WBP_Spie_MicrophoneButton.uasset | 4 +- .../BP_SerialCom_v4_UE510.uasset | 4 +- .../Source/SPIE_Avatar/SerialPortLibrary.cpp | 96 +++++++++++++++++++ Unreal/Source/SPIE_Avatar/SerialPortLibrary.h | 15 +++ 5 files changed, 117 insertions(+), 6 deletions(-) create mode 100644 Unreal/Source/SPIE_Avatar/SerialPortLibrary.cpp create mode 100644 Unreal/Source/SPIE_Avatar/SerialPortLibrary.h diff --git a/Unreal/Content/Project/BP/BP_SerialCom_v4_UE510_SPIE.uasset b/Unreal/Content/Project/BP/BP_SerialCom_v4_UE510_SPIE.uasset index cd9f7b3..96cedd9 100644 --- a/Unreal/Content/Project/BP/BP_SerialCom_v4_UE510_SPIE.uasset +++ b/Unreal/Content/Project/BP/BP_SerialCom_v4_UE510_SPIE.uasset @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:1a3d19ffc6765942d581823d02c83e703352536c384394e9eeb5788b0499d7b9 -size 128728 +oid sha256:ba1b930bf5f0dda852a03fdde7ca6e13a991e5d6537a22b34101487b14c4bc47 +size 214063 diff --git a/Unreal/Content/SPIE/Widgets/WBP_Spie_MicrophoneButton.uasset b/Unreal/Content/SPIE/Widgets/WBP_Spie_MicrophoneButton.uasset index 2d079f2..3649f38 100644 --- a/Unreal/Content/SPIE/Widgets/WBP_Spie_MicrophoneButton.uasset +++ b/Unreal/Content/SPIE/Widgets/WBP_Spie_MicrophoneButton.uasset @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:a9c3d09538305e416ed7c2678561b7ee4f21b88a27306052cfa03f151eba37ab -size 414061 +oid sha256:12e1d7bcc1e4f20cf16f6cb9e09dc5a2484165bce343fc84cbbd33421ae36d01 +size 414491 diff --git a/Unreal/Plugins/SerialCOM/Content/UE_BLUEPRINTS/BP_SerialCom_v4_UE510.uasset b/Unreal/Plugins/SerialCOM/Content/UE_BLUEPRINTS/BP_SerialCom_v4_UE510.uasset index b0be44f..8880133 100644 --- a/Unreal/Plugins/SerialCOM/Content/UE_BLUEPRINTS/BP_SerialCom_v4_UE510.uasset +++ b/Unreal/Plugins/SerialCOM/Content/UE_BLUEPRINTS/BP_SerialCom_v4_UE510.uasset @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:e11c9c55e327519c5fd98f5858a5303140baeff7b45433f63fb9dc6612419f44 -size 168499 +oid sha256:63f4d65b71405e426b460ae0f6486fc03de943eec55a83743ad5136745737d06 +size 195216 diff --git a/Unreal/Source/SPIE_Avatar/SerialPortLibrary.cpp b/Unreal/Source/SPIE_Avatar/SerialPortLibrary.cpp new file mode 100644 index 0000000..f79b069 --- /dev/null +++ b/Unreal/Source/SPIE_Avatar/SerialPortLibrary.cpp @@ -0,0 +1,96 @@ +// Fill out your copyright notice in the Description page of Project Settings. + + +#include "SerialPortLibrary.h" + +#if PLATFORM_WINDOWS +#include "Windows/AllowWindowsPlatformTypes.h" +#include +#include +#include "Windows/HideWindowsPlatformTypes.h" + +#pragma comment(lib, "setupapi.lib") +#endif + +TArray USerialPortLibrary::GetAvailableSerialPorts() +{ + TArray Ports; + +#if PLATFORM_WINDOWS + // Query registry for all COM ports + HKEY hKey; + if (RegOpenKeyEx(HKEY_LOCAL_MACHINE, TEXT("HARDWARE\\DEVICEMAP\\SERIALCOMM"), + 0, KEY_READ, &hKey) == ERROR_SUCCESS) + { + DWORD Index = 0; + TCHAR ValueName[256]; + TCHAR ValueData[256]; + DWORD ValueNameSize = 256; + DWORD ValueDataSize = 256 * sizeof(TCHAR); + DWORD Type; + + while (RegEnumValue(hKey, Index++, ValueName, &ValueNameSize, + nullptr, &Type, (LPBYTE)ValueData, &ValueDataSize) == ERROR_SUCCESS) + { + Ports.Add(FString(ValueData)); + ValueNameSize = 256; + ValueDataSize = 256 * sizeof(TCHAR); + } + RegCloseKey(hKey); + } +#endif + + return Ports; +} + +TArray USerialPortLibrary::GetAvailableSerialPortsWithNames() +{ + TArray Ports; + +#if PLATFORM_WINDOWS + // Use SetupAPI to get port + friendly device name + HDEVINFO DeviceInfoSet = SetupDiGetClassDevs( + nullptr, TEXT("USB"), nullptr, + DIGCF_PRESENT | DIGCF_ALLCLASSES + ); + + if (DeviceInfoSet == INVALID_HANDLE_VALUE) + return Ports; + + SP_DEVINFO_DATA DeviceInfoData; + DeviceInfoData.cbSize = sizeof(SP_DEVINFO_DATA); + + for (DWORD i = 0; SetupDiEnumDeviceInfo(DeviceInfoSet, i, &DeviceInfoData); i++) + { + TCHAR FriendlyName[256] = {}; + TCHAR PortName[256] = {}; + + // Get friendly name (e.g. "Arduino Uno (COM3)") + SetupDiGetDeviceRegistryProperty(DeviceInfoSet, &DeviceInfoData, + SPDRP_FRIENDLYNAME, nullptr, (PBYTE)FriendlyName, sizeof(FriendlyName), nullptr); + + // Get COM port from device registry key + HKEY DevKey = SetupDiOpenDevRegKey(DeviceInfoSet, &DeviceInfoData, + DICS_FLAG_GLOBAL, 0, DIREG_DEV, KEY_READ); + + if (DevKey != INVALID_HANDLE_VALUE) + { + DWORD PortNameSize = sizeof(PortName); + RegQueryValueEx(DevKey, TEXT("PortName"), nullptr, + nullptr, (LPBYTE)PortName, &PortNameSize); + RegCloseKey(DevKey); + + if (wcslen(PortName) > 0 && wcslen(FriendlyName) > 0) + { + // Format: "COM3|Arduino Uno (COM3)" + FString Entry = FString::Printf(TEXT("%s|%s"), PortName, FriendlyName); + Ports.Add(Entry); + } + } + } + + SetupDiDestroyDeviceInfoList(DeviceInfoSet); +#endif + + return Ports; +} \ No newline at end of file diff --git a/Unreal/Source/SPIE_Avatar/SerialPortLibrary.h b/Unreal/Source/SPIE_Avatar/SerialPortLibrary.h new file mode 100644 index 0000000..e446039 --- /dev/null +++ b/Unreal/Source/SPIE_Avatar/SerialPortLibrary.h @@ -0,0 +1,15 @@ +#pragma once +#include "CoreMinimal.h" +#include "Kismet/BlueprintFunctionLibrary.h" +#include "SerialPortLibrary.generated.h" + +UCLASS() +class SPIE_AVATAR_API USerialPortLibrary : public UBlueprintFunctionLibrary +{ + GENERATED_BODY() +public: + UFUNCTION(BlueprintPure, Category = "Serial Port") + static TArray GetAvailableSerialPorts(); + UFUNCTION(BlueprintPure, Category = "Serial Port") + static TArray GetAvailableSerialPortsWithNames(); +};