From 509d6aab73ed5a69a076fcf1d253e0a9adabc013 Mon Sep 17 00:00:00 2001 From: Jordon Brooks Date: Sun, 7 Jan 2024 23:46:48 +0000 Subject: [PATCH] Updated to use the new plugin --- Config/FilterPlugin.ini | 8 - HarmonyLink.uplugin | 24 ++ HarmonyLinkUE.uplugin | 26 -- .../HarmonyLink.Build.cs} | 23 +- Source/HarmonyLink/Private/HarmonyLink.cpp | 18 ++ .../Private/HarmonyLinkLibrary.cpp | 53 ++++ .../HarmonyLink/Private/Structs/Battery.cpp | 21 ++ .../HarmonyLink/Private/Structs/CPUInfo.cpp | 25 ++ Source/HarmonyLink/Public/Enums/Device.h | 17 ++ Source/HarmonyLink/Public/Enums/Platform.h | 16 + .../Public/HarmonyLink.h} | 4 +- .../HarmonyLink/Public/HarmonyLinkLibrary.h | 41 +++ Source/HarmonyLink/Public/Structs/Battery.h | 29 ++ Source/HarmonyLink/Public/Structs/CPUInfo.h | 36 +++ Source/HarmonyLink/Public/Structs/FDevice.h | 22 ++ Source/HarmonyLink/Public/Structs/OSVerInfo.h | 36 +++ .../Private/DataRefreshActor.cpp | 70 ----- .../Private/HarmonyLinkClient.cpp | 289 ------------------ .../HarmonyLinkUE/Private/HarmonyLinkUE.cpp | 22 -- .../HarmonyLinkUE/Public/DataRefreshActor.h | 43 --- .../HarmonyLinkUE/Public/HarmonyLinkClient.h | 283 ----------------- .../bin/Linux/libHarmonyLinkLib.so | Bin 0 -> 419512 bytes .../bin/Win64/HarmonyLinkLib.dll | Bin 0 -> 95744 bytes .../bin/Win64/HarmonyLinkLib.lib | Bin 0 -> 10636 bytes .../ThirdParty/HarmonyLinkLib/include/Core.h | 14 + .../HarmonyLinkLib/include/Enums/EDevice.h | 19 ++ .../HarmonyLinkLib/include/Enums/EPlatform.h | 15 + .../HarmonyLinkLib/include/FString.h | 165 ++++++++++ .../HarmonyLinkLib/include/HarmonyLinkLib.h | 25 ++ .../include/HarmonyLinkStruct.h | 13 + .../HarmonyLinkLib/include/Structs/FBattery.h | 22 ++ .../HarmonyLinkLib/include/Structs/FCPUInfo.h | 40 +++ .../HarmonyLinkLib/include/Structs/FDevice.h | 16 + .../include/Structs/FOSVerInfo.h | 50 +++ .../HarmonyLinkLib/include/Version.h | 45 +++ .../HarmonyLinkLib/include/Version.h.in | 11 + 36 files changed, 788 insertions(+), 753 deletions(-) delete mode 100644 Config/FilterPlugin.ini create mode 100644 HarmonyLink.uplugin delete mode 100644 HarmonyLinkUE.uplugin rename Source/{HarmonyLinkUE/HarmonyLinkUE.Build.cs => HarmonyLink/HarmonyLink.Build.cs} (60%) create mode 100644 Source/HarmonyLink/Private/HarmonyLink.cpp create mode 100644 Source/HarmonyLink/Private/HarmonyLinkLibrary.cpp create mode 100644 Source/HarmonyLink/Private/Structs/Battery.cpp create mode 100644 Source/HarmonyLink/Private/Structs/CPUInfo.cpp create mode 100644 Source/HarmonyLink/Public/Enums/Device.h create mode 100644 Source/HarmonyLink/Public/Enums/Platform.h rename Source/{HarmonyLinkUE/Public/HarmonyLinkUE.h => HarmonyLink/Public/HarmonyLink.h} (64%) create mode 100644 Source/HarmonyLink/Public/HarmonyLinkLibrary.h create mode 100644 Source/HarmonyLink/Public/Structs/Battery.h create mode 100644 Source/HarmonyLink/Public/Structs/CPUInfo.h create mode 100644 Source/HarmonyLink/Public/Structs/FDevice.h create mode 100644 Source/HarmonyLink/Public/Structs/OSVerInfo.h delete mode 100644 Source/HarmonyLinkUE/Private/DataRefreshActor.cpp delete mode 100644 Source/HarmonyLinkUE/Private/HarmonyLinkClient.cpp delete mode 100644 Source/HarmonyLinkUE/Private/HarmonyLinkUE.cpp delete mode 100644 Source/HarmonyLinkUE/Public/DataRefreshActor.h delete mode 100644 Source/HarmonyLinkUE/Public/HarmonyLinkClient.h create mode 100644 Source/ThirdParty/HarmonyLinkLib/bin/Linux/libHarmonyLinkLib.so create mode 100644 Source/ThirdParty/HarmonyLinkLib/bin/Win64/HarmonyLinkLib.dll create mode 100644 Source/ThirdParty/HarmonyLinkLib/bin/Win64/HarmonyLinkLib.lib create mode 100644 Source/ThirdParty/HarmonyLinkLib/include/Core.h create mode 100644 Source/ThirdParty/HarmonyLinkLib/include/Enums/EDevice.h create mode 100644 Source/ThirdParty/HarmonyLinkLib/include/Enums/EPlatform.h create mode 100644 Source/ThirdParty/HarmonyLinkLib/include/FString.h create mode 100644 Source/ThirdParty/HarmonyLinkLib/include/HarmonyLinkLib.h create mode 100644 Source/ThirdParty/HarmonyLinkLib/include/HarmonyLinkStruct.h create mode 100644 Source/ThirdParty/HarmonyLinkLib/include/Structs/FBattery.h create mode 100644 Source/ThirdParty/HarmonyLinkLib/include/Structs/FCPUInfo.h create mode 100644 Source/ThirdParty/HarmonyLinkLib/include/Structs/FDevice.h create mode 100644 Source/ThirdParty/HarmonyLinkLib/include/Structs/FOSVerInfo.h create mode 100644 Source/ThirdParty/HarmonyLinkLib/include/Version.h create mode 100644 Source/ThirdParty/HarmonyLinkLib/include/Version.h.in diff --git a/Config/FilterPlugin.ini b/Config/FilterPlugin.ini deleted file mode 100644 index ccebca2..0000000 --- a/Config/FilterPlugin.ini +++ /dev/null @@ -1,8 +0,0 @@ -[FilterPlugin] -; This section lists additional files which will be packaged along with your plugin. Paths should be listed relative to the root plugin directory, and -; may include "...", "*", and "?" wildcards to match directories, files, and individual characters respectively. -; -; Examples: -; /README.txt -; /Extras/... -; /Binaries/ThirdParty/*.dll diff --git a/HarmonyLink.uplugin b/HarmonyLink.uplugin new file mode 100644 index 0000000..c69226e --- /dev/null +++ b/HarmonyLink.uplugin @@ -0,0 +1,24 @@ +{ + "FileVersion": 3, + "Version": 1, + "VersionName": "1.0", + "FriendlyName": "HarmonyLink", + "Description": "", + "Category": "Other", + "CreatedBy": "Jordon Brooks", + "CreatedByURL": "https://jordongamedev.co.uk", + "DocsURL": "", + "MarketplaceURL": "", + "SupportURL": "", + "CanContainContent": true, + "IsBetaVersion": true, + "IsExperimentalVersion": true, + "Installed": false, + "Modules": [ + { + "Name": "HarmonyLink", + "Type": "Runtime", + "LoadingPhase": "Default" + } + ] +} diff --git a/HarmonyLinkUE.uplugin b/HarmonyLinkUE.uplugin deleted file mode 100644 index dd850a1..0000000 --- a/HarmonyLinkUE.uplugin +++ /dev/null @@ -1,26 +0,0 @@ -{ - "FileVersion": 3, - "Version": 1, - "VersionName": "1.0", - "FriendlyName": "HarmonyLinkUE", - "Description": "A plugin that provides real-time device metrics for games running on handheld devices, starting with the Steam Deck.", - "Category": "Handheld", - "CreatedBy": "Jordon Brooks", - "CreatedByURL": "https://jordongamedev.co.uk", - "DocsURL": "", - "MarketplaceURL": "com.epicgames.launcher://ue/marketplace/product/adec045fde54477a81f7829eb7c46afe", - "SupportURL": "", - "EngineVersion": "5.2.0", - "CanContainContent": false, - "IsBetaVersion": false, - "IsExperimentalVersion": true, - "Installed": false, - "Modules": [ - { - "Name": "HarmonyLinkUE", - "Type": "Runtime", - "LoadingPhase": "PreLoadingScreen", - "WhitelistPlatforms": ["Win64", "Linux"] - } - ] -} diff --git a/Source/HarmonyLinkUE/HarmonyLinkUE.Build.cs b/Source/HarmonyLink/HarmonyLink.Build.cs similarity index 60% rename from Source/HarmonyLinkUE/HarmonyLinkUE.Build.cs rename to Source/HarmonyLink/HarmonyLink.Build.cs index 2c8ad84..ede23b2 100644 --- a/Source/HarmonyLinkUE/HarmonyLinkUE.Build.cs +++ b/Source/HarmonyLink/HarmonyLink.Build.cs @@ -1,10 +1,11 @@ -// Some copyright should be here... +// Copyright Epic Games, Inc. All Rights Reserved. using UnrealBuildTool; +using System.IO; -public class HarmonyLinkUE : ModuleRules +public class HarmonyLink : ModuleRules { - public HarmonyLinkUE(ReadOnlyTargetRules Target) : base(Target) + public HarmonyLink(ReadOnlyTargetRules Target) : base(Target) { PCHUsage = ModuleRules.PCHUsageMode.UseExplicitOrSharedPCHs; @@ -18,6 +19,7 @@ public class HarmonyLinkUE : ModuleRules PrivateIncludePaths.AddRange( new string[] { // ... add other private include paths required here ... + "ThirdParty/HarmonyLinkLib/include" } ); @@ -26,9 +28,9 @@ public class HarmonyLinkUE : ModuleRules new string[] { "Core", - "HTTP", - "Json", - "JsonUtilities" + "CoreUObject", + "Engine", + "Projects" // ... add other public dependencies that you statically link with here ... } ); @@ -37,10 +39,6 @@ public class HarmonyLinkUE : ModuleRules PrivateDependencyModuleNames.AddRange( new string[] { - "CoreUObject", - "Engine", - "Slate", - "SlateCore", // ... add private dependencies that you statically link with here ... } ); @@ -52,5 +50,10 @@ public class HarmonyLinkUE : ModuleRules // ... add any modules that your module loads dynamically here ... } ); + + PublicAdditionalLibraries.Add(Path.Combine(PluginDirectory, "Source/ThirdParty/HarmonyLinkLib/bin/Win64/HarmonyLinkLib.lib")); + + + RuntimeDependencies.Add("$(BinaryOutputDir)/HarmonyLinkLib.dll", Path.Combine(PluginDirectory, "Source/ThirdParty/HarmonyLinkLib/bin/Win64/HarmonyLinkLib.dll")); } } diff --git a/Source/HarmonyLink/Private/HarmonyLink.cpp b/Source/HarmonyLink/Private/HarmonyLink.cpp new file mode 100644 index 0000000..da94234 --- /dev/null +++ b/Source/HarmonyLink/Private/HarmonyLink.cpp @@ -0,0 +1,18 @@ +// Copyright Epic Games, Inc. All Rights Reserved. + +#include "HarmonyLink.h" +#include "Modules/ModuleManager.h" + +#define LOCTEXT_NAMESPACE "FHarmonyLinkModule" + +void FHarmonyLinkModule::StartupModule() +{ +} + +void FHarmonyLinkModule::ShutdownModule() +{ +} + +#undef LOCTEXT_NAMESPACE + +IMPLEMENT_MODULE(FHarmonyLinkModule, HarmonyLink) diff --git a/Source/HarmonyLink/Private/HarmonyLinkLibrary.cpp b/Source/HarmonyLink/Private/HarmonyLinkLibrary.cpp new file mode 100644 index 0000000..9a35811 --- /dev/null +++ b/Source/HarmonyLink/Private/HarmonyLinkLibrary.cpp @@ -0,0 +1,53 @@ +// Copyright (C) 2023 Jordon Brooks + + +#include "HarmonyLinkLibrary.h" + +#include + +bool UHarmonyLinkLibrary::IsWine() +{ + static bool IsWine_ = HarmonyLinkLib::get_is_wine(); + return IsWine_; +} + +bool UHarmonyLinkLibrary::IsLinux() +{ + static bool IsLinux_ = +#if PLATFORM_WINDOWS + IsWine(); +#elif PLATFORM_LINUX + true; +#else + false; +#endif + + return IsLinux_; +} + +bool UHarmonyLinkLibrary::IsSteamDeck() +{ + static bool IsSteamDeck_ = GetDeviceInfo().Device == EDevice::STEAM_DECK; + return IsSteamDeck_; +} + +FCPUInfo UHarmonyLinkLibrary::GetCPUInfo() +{ + static FCPUInfo CPUInfo(HarmonyLinkLib::get_cpu_info()); + return CPUInfo; +} + +FDevice UHarmonyLinkLibrary::GetDeviceInfo() +{ + return FDevice(); +} + +FOSVerInfo UHarmonyLinkLibrary::GetOSInfo() +{ + return FOSVerInfo(); +} + +FBattery UHarmonyLinkLibrary::GetBatteryStatus() +{ + return FBattery(HarmonyLinkLib::get_battery_status()); +} diff --git a/Source/HarmonyLink/Private/Structs/Battery.cpp b/Source/HarmonyLink/Private/Structs/Battery.cpp new file mode 100644 index 0000000..3978e75 --- /dev/null +++ b/Source/HarmonyLink/Private/Structs/Battery.cpp @@ -0,0 +1,21 @@ +// Copyright (C) 2023 Jordon Brooks + +#include "Structs/Battery.h" + +#include + +FBattery::FBattery(HarmonyLinkLib::FBattery* battery) +{ + if (battery) + { + HasBattery = battery->has_battery; + IsACConnected = battery->is_connected_to_ac; + BatteryPercent = battery->battery_percent; + + battery->free(); + } + else + { + UE_LOG(LogTemp, Error, TEXT("Failed to convert FBattery.")) + } +} diff --git a/Source/HarmonyLink/Private/Structs/CPUInfo.cpp b/Source/HarmonyLink/Private/Structs/CPUInfo.cpp new file mode 100644 index 0000000..f075203 --- /dev/null +++ b/Source/HarmonyLink/Private/Structs/CPUInfo.cpp @@ -0,0 +1,25 @@ +// Copyright (C) 2023 Jordon Brooks + +#include "Structs/CPUInfo.h" + +FCPUInfo::FCPUInfo(HarmonyLinkLib::FCPUInfo* cpu_info) +{ + if (cpu_info) + { + VendorID = cpu_info->VendorID.c_str(); + ModelName = cpu_info->Model_Name.c_str(); + PhysicalCores = cpu_info->Physical_Cores; + LogicalCores = cpu_info->Logical_Cores; + + for (const HarmonyLinkLib::FString& Flag : cpu_info->Flags) + { + Flags.Add(Flag.c_str()); + } + + cpu_info->free(); + } + else + { + UE_LOG(LogTemp, Error, TEXT("Failed to convert FCPUInfo.")) + } +} diff --git a/Source/HarmonyLink/Public/Enums/Device.h b/Source/HarmonyLink/Public/Enums/Device.h new file mode 100644 index 0000000..066f952 --- /dev/null +++ b/Source/HarmonyLink/Public/Enums/Device.h @@ -0,0 +1,17 @@ +#pragma once + +#include "CoreMinimal.h" +#include "Device.generated.h" + +/** + * + */ +UENUM(BlueprintType) +enum class EDevice : uint8 +{ + DESKTOP UMETA(DisplayName = "Desktop"), + LAPTOP UMETA(DisplayName = "Laptop"), + HANDHELD UMETA(DisplayName = "Handheld"), + + STEAM_DECK UMETA(DisplayName = "Steam Deck") +}; diff --git a/Source/HarmonyLink/Public/Enums/Platform.h b/Source/HarmonyLink/Public/Enums/Platform.h new file mode 100644 index 0000000..492c31b --- /dev/null +++ b/Source/HarmonyLink/Public/Enums/Platform.h @@ -0,0 +1,16 @@ +#pragma once + +#include "CoreMinimal.h" +#include "Platform.generated.h" + +/** + * + */ +UENUM(BlueprintType) +enum class EPlatform : uint8 +{ + WINDOWS UMETA(DisplayName = "Windows"), + LINUX UMETA(DisplayName = "Linux"), + MAC UMETA(DisplayName = "Mac"), + UNIX UMETA(DisplayName = "Unix") +}; diff --git a/Source/HarmonyLinkUE/Public/HarmonyLinkUE.h b/Source/HarmonyLink/Public/HarmonyLink.h similarity index 64% rename from Source/HarmonyLinkUE/Public/HarmonyLinkUE.h rename to Source/HarmonyLink/Public/HarmonyLink.h index d530782..116fad0 100644 --- a/Source/HarmonyLinkUE/Public/HarmonyLinkUE.h +++ b/Source/HarmonyLink/Public/HarmonyLink.h @@ -1,10 +1,10 @@ -// Copyright Jordon Brooks © 2023 +// Copyright Epic Games, Inc. All Rights Reserved. #pragma once #include "Modules/ModuleManager.h" -class FHarmonyLinkUEModule : public IModuleInterface +class FHarmonyLinkModule : public IModuleInterface { public: diff --git a/Source/HarmonyLink/Public/HarmonyLinkLibrary.h b/Source/HarmonyLink/Public/HarmonyLinkLibrary.h new file mode 100644 index 0000000..a9ef618 --- /dev/null +++ b/Source/HarmonyLink/Public/HarmonyLinkLibrary.h @@ -0,0 +1,41 @@ +// Copyright (C) 2023 Jordon Brooks + +#pragma once + +#include "CoreMinimal.h" +#include "Kismet/BlueprintFunctionLibrary.h" +#include "Structs/Battery.h" +#include "Structs/CPUInfo.h" +#include "Structs/FDevice.h" +#include "Structs/OSVerInfo.h" +#include "HarmonyLinkLibrary.generated.h" + +/** + * + */ +UCLASS() +class HARMONYLINK_API UHarmonyLinkLibrary : public UBlueprintFunctionLibrary +{ + GENERATED_BODY() + + UFUNCTION(BlueprintCallable, Category="HarmonyLink") + static bool IsWine(); + + UFUNCTION(BlueprintCallable, Category="HarmonyLink") + static bool IsLinux(); + + UFUNCTION(BlueprintCallable, Category="HarmonyLink") + static bool IsSteamDeck(); + + UFUNCTION(BlueprintCallable, Category="HarmonyLink") + static FCPUInfo GetCPUInfo(); + + UFUNCTION(BlueprintCallable, Category="HarmonyLink") + static FDevice GetDeviceInfo(); + + UFUNCTION(BlueprintCallable, Category="HarmonyLink") + static FOSVerInfo GetOSInfo(); + + UFUNCTION(BlueprintCallable, Category="HarmonyLink") + static FBattery GetBatteryStatus(); +}; diff --git a/Source/HarmonyLink/Public/Structs/Battery.h b/Source/HarmonyLink/Public/Structs/Battery.h new file mode 100644 index 0000000..fd4c278 --- /dev/null +++ b/Source/HarmonyLink/Public/Structs/Battery.h @@ -0,0 +1,29 @@ +// Copyright (C) 2023 Jordon Brooks +#pragma once + +#include + +#include "CoreMinimal.h" +#include "Battery.generated.h" + +/** + * + */ +USTRUCT(BlueprintType) +struct FBattery +{ + GENERATED_BODY() + + FBattery() {} + + UPROPERTY(BlueprintReadWrite, EditAnywhere) + bool HasBattery = false; + + UPROPERTY(BlueprintReadWrite, EditAnywhere) + bool IsACConnected = false; + + UPROPERTY(BlueprintReadWrite, EditAnywhere) + int32 BatteryPercent = 0; + + FBattery(HarmonyLinkLib::FBattery* battery); +}; diff --git a/Source/HarmonyLink/Public/Structs/CPUInfo.h b/Source/HarmonyLink/Public/Structs/CPUInfo.h new file mode 100644 index 0000000..97d0f95 --- /dev/null +++ b/Source/HarmonyLink/Public/Structs/CPUInfo.h @@ -0,0 +1,36 @@ +// Copyright (C) 2023 Jordon Brooks + +#pragma once + +#include + +#include "CoreMinimal.h" +#include "CPUInfo.generated.h" + +/** + * + */ +USTRUCT(BlueprintType) +struct FCPUInfo +{ + GENERATED_BODY() + + FCPUInfo() {} + + UPROPERTY(BlueprintReadWrite, EditAnywhere) + FString VendorID; + + UPROPERTY(BlueprintReadWrite, EditAnywhere) + FString ModelName; + + UPROPERTY(BlueprintReadWrite, EditAnywhere) + int32 PhysicalCores = 0; + + UPROPERTY(BlueprintReadWrite, EditAnywhere) + int32 LogicalCores = 0; + + UPROPERTY(BlueprintReadWrite, EditAnywhere) + TSet Flags; + + FCPUInfo(HarmonyLinkLib::FCPUInfo* cpu_info); +}; diff --git a/Source/HarmonyLink/Public/Structs/FDevice.h b/Source/HarmonyLink/Public/Structs/FDevice.h new file mode 100644 index 0000000..7f54b29 --- /dev/null +++ b/Source/HarmonyLink/Public/Structs/FDevice.h @@ -0,0 +1,22 @@ +#pragma once + +#include "CoreMinimal.h" +#include "Enums/Device.h" +#include "Enums/Platform.h" + +#include "FDevice.generated.h" + +/** + * + */ +USTRUCT(BlueprintType) +struct FDevice +{ + GENERATED_BODY() + + UPROPERTY(BlueprintReadWrite, EditAnywhere) + EPlatform Platform = EPlatform::WINDOWS; + + UPROPERTY(BlueprintReadWrite, EditAnywhere) + EDevice Device = EDevice::DESKTOP; +}; diff --git a/Source/HarmonyLink/Public/Structs/OSVerInfo.h b/Source/HarmonyLink/Public/Structs/OSVerInfo.h new file mode 100644 index 0000000..2cce110 --- /dev/null +++ b/Source/HarmonyLink/Public/Structs/OSVerInfo.h @@ -0,0 +1,36 @@ +// Copyright (C) 2023 Jordon Brooks +#pragma once + +#include "CoreMinimal.h" + +#include "OSVerInfo.generated.h" + +/** + * + */ +USTRUCT(BlueprintType) +struct FOSVerInfo +{ + GENERATED_BODY() + + UPROPERTY(BlueprintReadWrite, EditAnywhere) + FString Name; + + UPROPERTY(BlueprintReadWrite, EditAnywhere) + int32 Version = 0; + + UPROPERTY(BlueprintReadWrite, EditAnywhere) + FString ID; + + UPROPERTY(BlueprintReadWrite, EditAnywhere) + FString VersionID; + + UPROPERTY(BlueprintReadWrite, EditAnywhere) + FString VersionCodename; + + UPROPERTY(BlueprintReadWrite, EditAnywhere) + FString PrettyName; + + UPROPERTY(BlueprintReadWrite, EditAnywhere) + FString VariantID; +}; diff --git a/Source/HarmonyLinkUE/Private/DataRefreshActor.cpp b/Source/HarmonyLinkUE/Private/DataRefreshActor.cpp deleted file mode 100644 index fa7c26c..0000000 --- a/Source/HarmonyLinkUE/Private/DataRefreshActor.cpp +++ /dev/null @@ -1,70 +0,0 @@ -// DataRefreshActor.cpp - -#include "DataRefreshActor.h" -#include "HarmonyLinkClient.h" - -// Sets default values -ADataRefreshActor::ADataRefreshActor() -{ - // Set default refresh interval to 1 second - RefreshInterval = 1.0f; - - // Create a SceneComponent for the actor - USceneComponent* SceneComponent = CreateDefaultSubobject(TEXT("DataRefreshSceneComponent")); - SetRootComponent(SceneComponent); -} - -// Called when the game starts or when spawned -void ADataRefreshActor::BeginPlay() -{ - Super::BeginPlay(); - - // Bind the delegate - ServerStatusCallback.BindUFunction(this, FName("OnServerStatusChecked")); - - // Start the timer for data refreshing - GetWorldTimerManager().SetTimer(RefreshTimerHandle, this, &ADataRefreshActor::RefreshData, RefreshInterval, true); -} - -void ADataRefreshActor::Destroyed() -{ - // Unbind the delegate - ServerStatusCallback.Unbind(); - - // Remember to call the parent class's Destroyed function at the end. - Super::Destroyed(); -} - - -// Called every frame -void ADataRefreshActor::Tick(float DeltaTime) -{ - Super::Tick(DeltaTime); - - // ... -} - -void ADataRefreshActor::OnServerStatusChecked(bool connected) -{ - UE_LOG(LogTemp, Display, TEXT("Refreshing")); - if (connected) - { - // Refresh the data and update the cached information - UHarmonyLinkClient::RefreshAllInfo(FDeviceInfoCallback()); - UHarmonyLinkClient::RefreshVersionInfo(FVersionInfoCallback()); - } -} - -// Function to refresh data -void ADataRefreshActor::RefreshData() -{ - // Only refresh data if the Harmony Link library is available - if (UHarmonyLinkClient::StaticClass()) - { - // Check server status asynchronously - UHarmonyLinkClient::CheckServerStatus(ServerStatusCallback); - } -} - - - diff --git a/Source/HarmonyLinkUE/Private/HarmonyLinkClient.cpp b/Source/HarmonyLinkUE/Private/HarmonyLinkClient.cpp deleted file mode 100644 index 83dbdbc..0000000 --- a/Source/HarmonyLinkUE/Private/HarmonyLinkClient.cpp +++ /dev/null @@ -1,289 +0,0 @@ -// .cpp file - -#include "HarmonyLinkClient.h" -#include "Interfaces/IHttpResponse.h" - -FAllInfo UHarmonyLinkClient::CachedAllInfo; -FHarmonyLinkVersionData UHarmonyLinkClient::CachedVersionData; -bool UHarmonyLinkClient::Connected; - -UHarmonyLinkClient::UHarmonyLinkClient(const FObjectInitializer& ObjectInitializer) - : Super(ObjectInitializer) -{ - -} - -void UHarmonyLinkClient::CheckServerStatus(FServerStatusCallback Callback) -{ - TSharedPtr Request = FHttpModule::Get().CreateRequest(); - Request->SetURL(TEXT("http://localhost:9000/are_you_there")); - Request->SetVerb(TEXT("GET")); - - Request->OnProcessRequestComplete().BindLambda(&UHarmonyLinkClient::OnCheckServerStatusResponseReceived, Callback); - - Request->ProcessRequest(); -} - -void UHarmonyLinkClient::RefreshOSInfo(FOSInfoCallback Callback) -{ - TSharedPtr Request = FHttpModule::Get().CreateRequest(); - Request->SetURL(TEXT("http://localhost:9000/os_info")); - Request->SetVerb(TEXT("GET")); - - Request->OnProcessRequestComplete().BindLambda(&UHarmonyLinkClient::OnOSInfoResponseReceived, Callback); - - Request->ProcessRequest(); -} - -void UHarmonyLinkClient::RefreshBatteryInfo(FBatteryInfoCallback Callback) -{ - TSharedPtr Request = FHttpModule::Get().CreateRequest(); - Request->SetURL(TEXT("http://localhost:9000/battery_info")); - Request->SetVerb(TEXT("GET")); - - Request->OnProcessRequestComplete().BindLambda(&UHarmonyLinkClient::OnBatteryInfoResponseReceived, Callback); - - Request->ProcessRequest(); -} - -void UHarmonyLinkClient::RefreshAllInfo(FDeviceInfoCallback Callback) -{ - TSharedPtr Request = FHttpModule::Get().CreateRequest(); - Request->SetURL(TEXT("http://localhost:9000/all_info")); - Request->SetVerb(TEXT("GET")); - - Request->OnProcessRequestComplete().BindLambda(&UHarmonyLinkClient::OnDeviceInfoResponseReceived, Callback); - - Request->ProcessRequest(); -} - -void UHarmonyLinkClient::RefreshVersionInfo(FVersionInfoCallback Callback) -{ - TSharedPtr Request = FHttpModule::Get().CreateRequest(); - Request->SetURL(TEXT("http://localhost:9000/version_info")); - Request->SetVerb(TEXT("GET")); - - Request->OnProcessRequestComplete().BindLambda(&UHarmonyLinkClient::OnVersionInfoResponseReceived, Callback); - - Request->ProcessRequest(); -} - -void UHarmonyLinkClient::OnCheckServerStatusResponseReceived(FHttpRequestPtr Request, FHttpResponsePtr Response, bool bWasSuccessful, FServerStatusCallback Callback) -{ - if (bWasSuccessful && Response.IsValid() && Response->GetResponseCode() == EHttpResponseCodes::Ok) - { - bool bConnected = Response->GetContentAsString().ToBool(); - - Connected = bConnected; - - Callback.ExecuteIfBound(bConnected); - } - else - { - Connected = false; - - Callback.ExecuteIfBound(false); - // The server returned an error, or the request failed. - // Handle the error here. - } -} - -void UHarmonyLinkClient::OnOSInfoResponseReceived(FHttpRequestPtr Request, FHttpResponsePtr Response, bool bWasSuccessful, FOSInfoCallback Callback) -{ - if (bWasSuccessful && Response.IsValid() && Response->GetResponseCode() == EHttpResponseCodes::Ok) - { - FString ResponseString = Response->GetContentAsString(); - UE_LOG(LogTemp, Warning, TEXT("Response: %s"), *ResponseString); - - // Parse the JSON response - TSharedPtr JsonObject; - TSharedRef> Reader = TJsonReaderFactory<>::Create(ResponseString); - if (FJsonSerializer::Deserialize(Reader, JsonObject)) - { - // Parse the OSInfo - FOSInfo OSInfo; - if (JsonObject->HasField("os_info")) - { - TSharedPtr OSInfoObject = JsonObject->GetObjectField("os_info"); - OSInfo.OSType = OSInfoObject->GetStringField("os_type"); - OSInfo.OSVersion = OSInfoObject->GetStringField("os_version"); - OSInfo.OSEdition = OSInfoObject->GetStringField("os_edition"); - OSInfo.OSBits = OSInfoObject->GetStringField("os_bits"); - } - - CachedAllInfo.OSInfo = OSInfo; - Callback.ExecuteIfBound(OSInfo); - } - } - else - { - // The server returned an error, or the request failed. - // Handle the error here. - } -} - -void UHarmonyLinkClient::OnBatteryInfoResponseReceived(FHttpRequestPtr Request, FHttpResponsePtr Response, bool bWasSuccessful, FBatteryInfoCallback Callback) -{ - if (bWasSuccessful && Response.IsValid() && Response->GetResponseCode() == EHttpResponseCodes::Ok) - { - FString ResponseString = Response->GetContentAsString(); - UE_LOG(LogTemp, Warning, TEXT("Response: %s"), *ResponseString); - - // Parse the JSON response - TSharedPtr JsonObject; - TSharedRef> Reader = TJsonReaderFactory<>::Create(ResponseString); - if (FJsonSerializer::Deserialize(Reader, JsonObject)) - { - // Parse the BatteryInfo - FBatteryInfo BatteryInfo; - BatteryInfo.bHasBattery = JsonObject->GetBoolField("has_battery"); - BatteryInfo.BatteryPercent = JsonObject->GetIntegerField("battery_percent"); - FString ChargingStatusString = JsonObject->GetStringField("charging_status"); - if (ChargingStatusString == "charging") - { - BatteryInfo.ChargingStatus = EChargingStatus::Charging; - } - else if (ChargingStatusString == "battery") - { - BatteryInfo.ChargingStatus = EChargingStatus::Battery; - } - else - { - BatteryInfo.ChargingStatus = EChargingStatus::Unknown; - } - - CachedAllInfo.BatteryInfo = BatteryInfo; - - Callback.ExecuteIfBound(BatteryInfo); - } - } - else - { - // The server returned an error, or the request failed. - // Handle the error here. - } -} - -void UHarmonyLinkClient::OnDeviceInfoResponseReceived(FHttpRequestPtr Request, FHttpResponsePtr Response, bool bWasSuccessful, FDeviceInfoCallback Callback) -{ - if (bWasSuccessful && Response.IsValid() && Response->GetResponseCode() == EHttpResponseCodes::Ok) - { - FString ResponseString = Response->GetContentAsString(); - UE_LOG(LogTemp, Warning, TEXT("Response: %s"), *ResponseString); - - // Parse the JSON response - TSharedPtr JsonObject; - TSharedRef> Reader = TJsonReaderFactory<>::Create(ResponseString); - if (FJsonSerializer::Deserialize(Reader, JsonObject)) - { - // Parse the OSInfo - FOSInfo OSInfo; - if (JsonObject->HasField("os_info")) - { - TSharedPtr OSInfoObject = JsonObject->GetObjectField("os_info"); - OSInfo.OSType = OSInfoObject->GetStringField("os_type"); - OSInfo.OSVersion = OSInfoObject->GetStringField("os_version"); - OSInfo.OSEdition = OSInfoObject->GetStringField("os_edition"); - OSInfo.OSBits = OSInfoObject->GetStringField("os_bits"); - } - - // Parse the Battery_Info - FBatteryInfo BatteryInfo; - const TSharedPtr* BatteryInfoObject = nullptr; - if (JsonObject->HasField("dock_info") && JsonObject->TryGetObjectField("battery_info", BatteryInfoObject)) - { - BatteryInfo.bHasBattery = BatteryInfoObject->Get()->GetBoolField("has_battery"); - BatteryInfo.BatteryPercent = BatteryInfoObject->Get()->GetIntegerField("battery_percent"); - - FString battery = BatteryInfoObject->Get()->GetStringField("charging_status"); - if (battery.ToLower() == "charging") { BatteryInfo.ChargingStatus = EChargingStatus::Charging; } - else if (battery.ToLower() == "battery") { BatteryInfo.ChargingStatus = EChargingStatus::Battery; } - else { BatteryInfo.ChargingStatus = EChargingStatus::Unknown; } - - } - - // Parse the DockInfo - FDockInfo DockInfo; - const TSharedPtr* DockInfoObject = nullptr; - if (JsonObject->HasField("dock_info") && JsonObject->TryGetObjectField("dock_info", DockInfoObject)) - { - const TSharedPtr* DockModelObject = nullptr; - if (DockInfoObject->Get()->HasField("dock_model") && JsonObject->TryGetObjectField("dock_model", DockModelObject)) - { - TSharedPtr DockModelSubObject = DockModelObject->Get()->GetObjectField("dock_model"); - - FString DockModel = DockModelObject->Get()->GetStringField("model"); - if (DockModel == "SteamDeckDock") { DockInfo.DockModel.Model = EDockModel::SteamDeckDock; } - else if (DockModel == "JSAUX") { DockInfo.DockModel.Model = EDockModel::JSAUX; } - else if (DockModel == "Unknown") { DockInfo.DockModel.Model = EDockModel::Unknown; } - - DockInfo.DockModel.Name = DockModelObject->Get()->GetStringField("name"); - } - else - { - // handle case where dock_model is null - DockInfo.DockModel.Model = EDockModel::Unknown; - DockInfo.DockModel.Name = "Unknown"; - } - - DockInfo.bIsDocked = DockInfoObject->Get()->GetBoolField("is_docked"); - DockInfo.bFallbackDetection = DockInfoObject->Get()->GetBoolField("fallback_detection"); - } - - // Create the DeviceInfo struct - FAllInfo AllInfo; - AllInfo.OSInfo = OSInfo; - AllInfo.DockInfo = DockInfo; - AllInfo.BatteryInfo = BatteryInfo; - - CachedAllInfo = AllInfo; - - // Call the callback with the DeviceInfo - Callback.ExecuteIfBound(AllInfo); - - // Handle the DeviceInfo struct as needed - // ... - } - } - else - { - // The server returned an error, or the request failed. - // Handle the error here. - } -} - - -void UHarmonyLinkClient::OnVersionInfoResponseReceived(FHttpRequestPtr Request, FHttpResponsePtr Response, bool bWasSuccessful, FVersionInfoCallback Callback) -{ - if (bWasSuccessful && Response.IsValid() && Response->GetResponseCode() == EHttpResponseCodes::Ok) - { - FString ResponseString = Response->GetContentAsString(); - UE_LOG(LogTemp, Warning, TEXT("Response: %s"), *ResponseString); - - // Parse the JSON response - TSharedPtr JsonObject; - TSharedRef> Reader = TJsonReaderFactory<>::Create(ResponseString); - if (FJsonSerializer::Deserialize(Reader, JsonObject)) - { - FHarmonyLinkVersionData VersionInfo; - VersionInfo.BuildTimestamp = JsonObject->GetStringField("build_timestamp"); - VersionInfo.GitBranch = JsonObject->GetStringField("git_branch"); - VersionInfo.GitDescribe = JsonObject->GetStringField("git_describe"); - VersionInfo.GitCommitTimestamp = JsonObject->GetStringField("git_commit_timestamp"); - VersionInfo.bDebug = JsonObject->GetBoolField("debug"); - VersionInfo.Version = JsonObject->GetStringField("version"); - VersionInfo.VersionMajor = JsonObject->GetIntegerField("version_major"); - VersionInfo.VersionMinor = JsonObject->GetIntegerField("version_minor"); - VersionInfo.VersionPatch = JsonObject->GetIntegerField("version_patch"); - VersionInfo.VersionPre = JsonObject->GetStringField("version_pre"); - - CachedVersionData = VersionInfo; - Callback.ExecuteIfBound(VersionInfo); - } - } - else - { - // The server returned an error, or the request failed. - // Handle the error here. - } -} diff --git a/Source/HarmonyLinkUE/Private/HarmonyLinkUE.cpp b/Source/HarmonyLinkUE/Private/HarmonyLinkUE.cpp deleted file mode 100644 index 75162f5..0000000 --- a/Source/HarmonyLinkUE/Private/HarmonyLinkUE.cpp +++ /dev/null @@ -1,22 +0,0 @@ -// Copyright Epic Games, Inc. All Rights Reserved. - -#include "HarmonyLinkUE.h" - -#define LOCTEXT_NAMESPACE "FHarmonyLinkUEModule" - -void FHarmonyLinkUEModule::StartupModule() -{ - // This code will execute after your module is loaded into memory; the exact timing is specified in the .uplugin file per-module - -} - -void FHarmonyLinkUEModule::ShutdownModule() -{ - // This function may be called during shutdown to clean up your module. For modules that support dynamic reloading, - // we call this function before unloading the module. - -} - -#undef LOCTEXT_NAMESPACE - -IMPLEMENT_MODULE(FHarmonyLinkUEModule, HarmonyLinkUE) \ No newline at end of file diff --git a/Source/HarmonyLinkUE/Public/DataRefreshActor.h b/Source/HarmonyLinkUE/Public/DataRefreshActor.h deleted file mode 100644 index dc51438..0000000 --- a/Source/HarmonyLinkUE/Public/DataRefreshActor.h +++ /dev/null @@ -1,43 +0,0 @@ -// DataRefreshActor.h - -#pragma once - -#include "CoreMinimal.h" -#include "GameFramework/Actor.h" -#include "HarmonyLinkClient.h" -#include "DataRefreshActor.generated.h" - -UCLASS() -class HARMONYLINKUE_API ADataRefreshActor : public AActor -{ - GENERATED_BODY() - -public: - // Sets default values for this actor's properties - ADataRefreshActor(); - -protected: - // Called when the game starts or when spawned - virtual void BeginPlay() override; - virtual void Destroyed() override; - - FServerStatusCallback ServerStatusCallback; - - // Function to refresh data - UFUNCTION() - void RefreshData(); - UFUNCTION() - void OnServerStatusChecked(bool connected); - -public: - // Called every frame - virtual void Tick(float DeltaTime) override; - -private: - // Timer interval for data refreshing (in seconds) - UPROPERTY(EditAnywhere, Category = "Data Refresh") - float RefreshInterval; - - // Timer handle for data refreshing - FTimerHandle RefreshTimerHandle; -}; diff --git a/Source/HarmonyLinkUE/Public/HarmonyLinkClient.h b/Source/HarmonyLinkUE/Public/HarmonyLinkClient.h deleted file mode 100644 index 7115edc..0000000 --- a/Source/HarmonyLinkUE/Public/HarmonyLinkClient.h +++ /dev/null @@ -1,283 +0,0 @@ -// Copyright Jordon Brooks © 2023 - -#pragma once - -#include "Kismet/BlueprintFunctionLibrary.h" -#include "Runtime/Online/HTTP/Public/HttpModule.h" -#include "Runtime/Online/HTTP/Public/Interfaces/IHttpRequest.h" -#include "Engine/World.h" -#include "Engine/WorldComposition.h" - -#include "HarmonyLinkClient.generated.h" - -UENUM(BlueprintType) -enum class EDockModel : uint8 -{ - SteamDeckDock, - JSAUX, - Unknown, -}; - -USTRUCT(BlueprintType) -struct FSDock -{ - GENERATED_BODY() - -public: - UPROPERTY(EditAnywhere, BlueprintReadWrite, Category="HarmonyLink") - EDockModel Model = EDockModel::Unknown; - - UPROPERTY(EditAnywhere, BlueprintReadWrite, Category="HarmonyLink") - FString Name = ""; - - void Print() const - { - UE_LOG(LogTemp, Display, TEXT("Dock Model: %s"), *StaticEnum()->GetNameStringByValue(static_cast(Model))); - UE_LOG(LogTemp, Display, TEXT("Name: %s"), *Name); - } -}; - -USTRUCT(BlueprintType) -struct FDockInfo -{ - GENERATED_BODY() - -public: - UPROPERTY(EditAnywhere, BlueprintReadWrite, Category="HarmonyLink") - FSDock DockModel; - - UPROPERTY(EditAnywhere, BlueprintReadWrite, Category="HarmonyLink") - bool bIsDocked = false; - - UPROPERTY(EditAnywhere, BlueprintReadWrite, Category="HarmonyLink") - bool bFallbackDetection = false; - - void Print() const - { - DockModel.Print(); - UE_LOG(LogTemp, Display, TEXT("IsDocked: %s"), bIsDocked ? TEXT("true") : TEXT("false")); - UE_LOG(LogTemp, Display, TEXT("FallbackDetection: %s"), bFallbackDetection ? TEXT("true") : TEXT("false")); - } -}; - - -USTRUCT(BlueprintType) -struct FOSInfo -{ - GENERATED_BODY() - -public: - UPROPERTY(EditAnywhere, BlueprintReadWrite, Category="HarmonyLink") - FString OSType = "Unknown"; - - UPROPERTY(EditAnywhere, BlueprintReadWrite, Category="HarmonyLink") - FString OSVersion = ""; - - UPROPERTY(EditAnywhere, BlueprintReadWrite, Category="HarmonyLink") - FString OSEdition = ""; - - UPROPERTY(EditAnywhere, BlueprintReadWrite, Category="HarmonyLink") - FString OSBits = "X64"; - - void Print() const - { - UE_LOG(LogTemp, Display, TEXT("OS Type: %s"), *OSType); - UE_LOG(LogTemp, Display, TEXT("OS Version: %s"), *OSVersion); - UE_LOG(LogTemp, Display, TEXT("OS Edition: %s"), *OSEdition); - UE_LOG(LogTemp, Display, TEXT("OS Bits: %s"), *OSBits); - } -}; - -UENUM(BlueprintType) -enum class EChargingStatus : uint8 -{ - Charging, - Battery, - Unknown -}; - -USTRUCT(BlueprintType) -struct FBatteryInfo -{ - GENERATED_BODY() - -public: - UPROPERTY(EditAnywhere, BlueprintReadWrite, Category="HarmonyLink") - bool bHasBattery = false; - - UPROPERTY(EditAnywhere, BlueprintReadWrite, Category="HarmonyLink") - int32 BatteryPercent = 0; - - UPROPERTY(EditAnywhere, BlueprintReadWrite, Category="HarmonyLink") - EChargingStatus ChargingStatus = EChargingStatus::Unknown; - - void Print() const - { - UE_LOG(LogTemp, Display, TEXT("Has Battery: %s"), bHasBattery ? TEXT("true") : TEXT("false")); - UE_LOG(LogTemp, Display, TEXT("Battery Percent: %d"), BatteryPercent); - UE_LOG(LogTemp, Display, TEXT("Charging Status: %s"), *StaticEnum()->GetNameStringByValue(static_cast(ChargingStatus))); - } -}; - -USTRUCT(BlueprintType) -struct FHarmonyLinkVersionData -{ - GENERATED_BODY() - -public: - UPROPERTY(EditAnywhere, BlueprintReadWrite, Category="HarmonyLink") - FString BuildTimestamp; - - UPROPERTY(EditAnywhere, BlueprintReadWrite, Category="HarmonyLink") - FString GitBranch; - - UPROPERTY(EditAnywhere, BlueprintReadWrite, Category="HarmonyLink") - FString GitDescribe; - - UPROPERTY(EditAnywhere, BlueprintReadWrite, Category="HarmonyLink") - FString GitCommitTimestamp; - - UPROPERTY(EditAnywhere, BlueprintReadWrite, Category="HarmonyLink") - bool bDebug; - - UPROPERTY(EditAnywhere, BlueprintReadWrite, Category="HarmonyLink") - FString Version; - - UPROPERTY(EditAnywhere, BlueprintReadWrite, Category="HarmonyLink") - int32 VersionMajor; - - UPROPERTY(EditAnywhere, BlueprintReadWrite, Category="HarmonyLink") - int32 VersionMinor; - - UPROPERTY(EditAnywhere, BlueprintReadWrite, Category="HarmonyLink") - int32 VersionPatch; - - UPROPERTY(EditAnywhere, BlueprintReadWrite, Category="HarmonyLink") - FString VersionPre; - - void Print() const - { - UE_LOG(LogTemp, Display, TEXT("Build Timestamp: %s"), *BuildTimestamp); - UE_LOG(LogTemp, Display, TEXT("Git Branch: %s"), *GitBranch); - UE_LOG(LogTemp, Display, TEXT("Git Describe: %s"), *GitDescribe); - UE_LOG(LogTemp, Display, TEXT("Git Commit Timestamp: %s"), *GitCommitTimestamp); - UE_LOG(LogTemp, Display, TEXT("Debug: %s"), bDebug ? TEXT("true") : TEXT("false")); - UE_LOG(LogTemp, Display, TEXT("Version: %s"), *Version); - UE_LOG(LogTemp, Display, TEXT("Version Major: %d"), VersionMajor); - UE_LOG(LogTemp, Display, TEXT("Version Minor: %d"), VersionMinor); - UE_LOG(LogTemp, Display, TEXT("Version Patch: %d"), VersionPatch); - UE_LOG(LogTemp, Display, TEXT("Version Pre: %s"), *VersionPre); - } -}; - -USTRUCT(BlueprintType) -struct FAllInfo -{ - GENERATED_BODY() - -public: - UPROPERTY(EditAnywhere, BlueprintReadWrite, Category="HarmonyLink") - FOSInfo OSInfo; - - UPROPERTY(EditAnywhere, BlueprintReadWrite, Category="HarmonyLink") - FDockInfo DockInfo; - - UPROPERTY(EditAnywhere, BlueprintReadWrite, Category="HarmonyLink") - FBatteryInfo BatteryInfo; - - void Print() const - { - UE_LOG(LogTemp, Display, TEXT("All Info:")); - OSInfo.Print(); - DockInfo.Print(); - BatteryInfo.Print(); - } -}; - -DECLARE_DYNAMIC_DELEGATE_OneParam(FDeviceInfoCallback, const FAllInfo&, DeviceInfo); -DECLARE_DYNAMIC_DELEGATE_OneParam(FOSInfoCallback, const FOSInfo&, OSInfo); -DECLARE_DYNAMIC_DELEGATE_OneParam(FBatteryInfoCallback, const FBatteryInfo&, BatteryInfo); -DECLARE_DYNAMIC_DELEGATE_OneParam(FVersionInfoCallback, const FHarmonyLinkVersionData&, VersionInfo); -DECLARE_DYNAMIC_DELEGATE_OneParam(FServerStatusCallback, const bool, connected); - - -/* -* Function library class. -* Each function in it is expected to be static and represents blueprint node that can be called in any blueprint. -* -* When declaring function you can define metadata for the node. Key function specifiers will be BlueprintPure and BlueprintCallable. -* BlueprintPure - means the function does not affect the owning object in any way and thus creates a node without Exec pins. -* BlueprintCallable - makes a function which can be executed in Blueprints - Thus it has Exec pins. -* DisplayName - full name of the node, shown when you mouse over the node and in the blueprint drop down menu. -* Its lets you name the node using characters not allowed in C++ function names. -* CompactNodeTitle - the word(s) that appear on the node. -* Keywords - the list of keywords that helps you to find node when you search for it using Blueprint drop-down menu. -* Good example is "Print String" node which you can find also by using keyword "log". -* Category - the category your node will be under in the Blueprint drop-down menu. -* -* For more info on custom blueprint nodes visit documentation: -* https://wiki.unrealengine.com/Custom_Blueprint_Node_Creation -*/ -UCLASS() -class HARMONYLINKUE_API UHarmonyLinkClient : public UBlueprintFunctionLibrary -{ - GENERATED_UCLASS_BODY() - - static bool Connected; - - // Cached DeviceInfo variable - static FAllInfo CachedAllInfo; - - // Cached DeviceInfo variable - static FHarmonyLinkVersionData CachedVersionData; - - UFUNCTION(BlueprintCallable, Category = "Harmony Link") - static bool GetIsConnected() - { return Connected; } - - UFUNCTION(BlueprintCallable, Category = "Harmony Link") - static void PrintAllInfo() - { CachedAllInfo.Print(); } - - UFUNCTION(BlueprintCallable, Category = "Harmony Link") - static FAllInfo GetAllInfo() - { return CachedAllInfo; } - - UFUNCTION(BlueprintCallable, Category = "Harmony Link") - static FBatteryInfo GetBatteryInfo() - { return CachedAllInfo.BatteryInfo; } - - UFUNCTION(BlueprintCallable, Category = "Harmony Link") - static FDockInfo GetDockInfo() - { return CachedAllInfo.DockInfo; } - - UFUNCTION(BlueprintCallable, Category = "Harmony Link") - static FOSInfo GetOSInfo() - { return CachedAllInfo.OSInfo; } - - UFUNCTION(BlueprintCallable, Category = "Harmony Link") - static FHarmonyLinkVersionData GetVersionInfo() - { return CachedVersionData; } - - UFUNCTION(BlueprintCallable, Category = "Harmony Link") - static void CheckServerStatus(FServerStatusCallback Callback); - - UFUNCTION(BlueprintCallable, Category = "Harmony Link") - static void RefreshOSInfo(FOSInfoCallback Callback); - - UFUNCTION(BlueprintCallable, Category = "Harmony Link") - static void RefreshBatteryInfo(FBatteryInfoCallback Callback); - - UFUNCTION(BlueprintCallable, Category = "Harmony Link") - static void RefreshAllInfo(FDeviceInfoCallback Callback); - - UFUNCTION(BlueprintCallable, Category = "Harmony Link") - static void RefreshVersionInfo(FVersionInfoCallback Callback); - -private: - static void OnCheckServerStatusResponseReceived(FHttpRequestPtr Request, FHttpResponsePtr Response, bool bWasSuccessful, FServerStatusCallback Callback); - static void OnOSInfoResponseReceived(FHttpRequestPtr Request, FHttpResponsePtr Response, bool bWasSuccessful, FOSInfoCallback Callback); - static void OnBatteryInfoResponseReceived(FHttpRequestPtr Request, FHttpResponsePtr Response, bool bWasSuccessful, FBatteryInfoCallback Callback); - static void OnDeviceInfoResponseReceived(FHttpRequestPtr Request, FHttpResponsePtr Response, bool bWasSuccessful, FDeviceInfoCallback Callback); - static void OnVersionInfoResponseReceived(FHttpRequestPtr Request, FHttpResponsePtr Response, bool bWasSuccessful, FVersionInfoCallback Callback); -}; diff --git a/Source/ThirdParty/HarmonyLinkLib/bin/Linux/libHarmonyLinkLib.so b/Source/ThirdParty/HarmonyLinkLib/bin/Linux/libHarmonyLinkLib.so new file mode 100644 index 0000000000000000000000000000000000000000..0daf6e280ab9fc8cf95f395677ea98ccad4b78c5 GIT binary patch literal 419512 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%0AK0e8X+&3iB(-u+iHC7 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 literal 0 HcmV?d00001 diff --git a/Source/ThirdParty/HarmonyLinkLib/bin/Win64/HarmonyLinkLib.dll b/Source/ThirdParty/HarmonyLinkLib/bin/Win64/HarmonyLinkLib.dll new file mode 100644 index 0000000000000000000000000000000000000000..c020eef03de811f14a7ede68118878741ec3508c GIT binary patch literal 95744 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 literal 0 HcmV?d00001 diff --git a/Source/ThirdParty/HarmonyLinkLib/bin/Win64/HarmonyLinkLib.lib b/Source/ThirdParty/HarmonyLinkLib/bin/Win64/HarmonyLinkLib.lib new file mode 100644 index 0000000000000000000000000000000000000000..ce48844e7b88a6e2d3148b72773cfc29f5783d53 GIT binary patch literal 10636 zcmcgyU2GFa5T5*yfca?%A>Y#afa=Qt z^=DM7TLd6fdr>810YcU~m9|U(DD)Upq*`o?P+hZ1o9B=p$#zerZFT^Ku3?JQ*q~DL z6#zm_w^VB0fn}tY8kL%cupX)5f=Z1GD2HVCYP5(c($;yEY<;K?$%;JI1xea}aOjYC zMC$bn@Ad8<8ad>Z`hAg5cFE_&+tZjcwdwZs9Bp%m%+2cjg5Y57 zc}7M-=t$R=+v6r6b=`DG`J@D)Ked(~w~#^!mk^VVB@@Y@fN?hMb~HM!`7}zf*ot5u z^F?L96jg1$_lRKkPxvBIEaH=6QL$Hy#sZ>vRIvLdC&PYUEF8f)r>ItQSy`@{*lfz! ze;%tc$_auion1+T$%e};AjHDbWOz0h5mTucCWh;9;_6TmeT=h^WY?Bx!py3u9V-Tu zvP*|OJ#NCOZ=Rg|V&KKRqMKQ^&)~>v%zb9|)e3{Xw0@Sk}41 zQR!4L5|zVKN;`(4&NJqV#e$L3xMF;W6dhRnOF8M5Wc6OIbcktL{;%-{@5is4e)2~qD z-ohrK8#6n9uKNs|rud*S#_hD#jA1TiWC>f%29!lEd01Io0aI;U&H(Kj^S(p{7^2_g zJ~0R-&SDmhvIdZOztZ?~^NbCRWaZy3k0XNKoI+cqJ1iRvGQY2up2` zyvPvO>5Md1)N2f(oQaBr#!0~#9+EO`kmL5Y#X%%=8E8a-}zr^3IIJ<_1UfjEB0Zn2>qCOgBG+@gtDIPa=;h! z*`4%N1!lfL`cbPW!c>H|>lz>4^r{cxD?xpfkJO4_yIzQCHTuouDNpWb6Kp6e#aDL} z20#~kE4a>;AC&!(a5Q{8W^4Ag*ar3w9?;$=Bx|rl@DKv@)Jd)ke^)5EWMzm5SJgB^ zcbzLJc>2^Ri6TI-76Kgs5kNsdL2H!0s`@mZ4#I;%5a;RCYe+o?8u5p;jtG=r^`{U< zF|(X^+`Lxg?CjF)jaX43JZ$~>!F9x_Vh1p@q5!@(J_ajlr}e}--lGLAC00b*T`ucj znQIbZru=}wy$0Lc=%Q8E;0I4aH@-&==|(Tj8tl{tN?F5X4H_R2M7jn$Xgyi$-_U}V z629dcWtI`f&^qIn7+x!Nwd;E)09nU@x%uk1zY>%_7js3^Cc6apyu0FG?8p~670>xU zD(>t?JO#KfvBcqO#GVf{j&^#q=xFN0um3QMXbKt8GqaR(a_-tp zKQw2<1PZUcb#){ox%v6NyW~J9WNcF4Wjx=qfz2hsN1`w-7sf+vfR-DKjpahaXN zZ@#wkH*yZIBe<9^1oDB#(MHW$-zi<*R~GS)FZkU6(U1r;`>%N>5P9vY+ho^#E9Cq3 zAR;WI2(!A&FagIsn~pXLPanSz|Fk@P5z(zTqRZi?Bp*0k)af_uUUwf}{dE`OEGIZw z?_o^9aL=g8%4~VE@jtRMHxMjYT=JN};+{*Fi7)rpr?p@9BCZN9T&cG)-m&U5!L;!1 z>?8bWh+pT5%|7>=3aO3f48C5N= + +// Enum class for representing different types of devices +namespace HarmonyLinkLib +{ + enum class EDevice : uint8_t + { + DESKTOP, + LAPTOP, + HANDHELD, + + STEAM_DECK, + // ROG_ALLY + // AYONEO_SLIDE + // etc... + }; +} diff --git a/Source/ThirdParty/HarmonyLinkLib/include/Enums/EPlatform.h b/Source/ThirdParty/HarmonyLinkLib/include/Enums/EPlatform.h new file mode 100644 index 0000000..c050ca3 --- /dev/null +++ b/Source/ThirdParty/HarmonyLinkLib/include/Enums/EPlatform.h @@ -0,0 +1,15 @@ +#pragma once + +#include + +// Enum class for representing different operating platforms +namespace HarmonyLinkLib +{ + enum class EPlatform : uint8_t + { + WINDOWS, + LINUX, + MAC, + UNIX, + }; +} diff --git a/Source/ThirdParty/HarmonyLinkLib/include/FString.h b/Source/ThirdParty/HarmonyLinkLib/include/FString.h new file mode 100644 index 0000000..3f23dc1 --- /dev/null +++ b/Source/ThirdParty/HarmonyLinkLib/include/FString.h @@ -0,0 +1,165 @@ +// Copyright (C) 2024 Jordon Brooks + +#pragma once + +#include +#include +#include + +#include "Core.h" // Replace with actual API export macro + +/** + * @file FString.h + * @brief FString Class - Custom String Management for DLL Export + * + * The FString class is a custom string management class designed to safely encapsulate + * string handling and memory management, especially for use in DLLs (Dynamic Link Libraries). + * It resolves the common issue of exporting classes containing standard library types, + * such as std::string, across DLL boundaries, which can lead to compiler warnings or errors. + * + * Features: + * - Implements basic string operations such as construction, destruction, copy, and move semantics. + * - Utilizes smart pointers (std::unique_ptr) for automatic memory management, reducing the risk of memory leaks. + * - Provides a simple interface for interacting with character strings, similar to std::string. + * - Includes both deep copy semantics for safety and move semantics for performance in object transfers. + * + * Usage: + * FString can be used as a safer alternative to std::string for classes that are exported from a DLL. + * It handles memory allocation/deallocation automatically and provides a basic set of string operations. + * + * Example: + * FString myString("Hello, world!"); + * std::cout << myString.c_str() << std::endl; // Output: Hello, world! + * + * Note: + * - The class is currently designed with basic functionality. Additional features such as + * string concatenation, substring, and comparison operations can be added as needed. + * - Ensure that the HarmonyLinkLibApi.h (or equivalent) file correctly defines the export macro + * for DLL usage. + * + */ + namespace HarmonyLinkLib + { + class HARMONYLINKLIB_API FString { + public: + FString() : data_(new char[1]) { + data_[0] = '\0'; + } + + FString(const char* str) { + const size_t len = strlen(str); + data_ = new char[len + 1]; + memcpy(data_, str, len + 1); + } + + // Copy constructor + FString(const FString& other) { + const size_t len = strlen(other.data_); + data_ = new char[len + 1]; + memcpy(data_, other.data_, len + 1); + } + + ~FString() { + delete[] data_; + } + + // Copy assignment operator + FString& operator=(const FString& other) { + if (this != &other) { + delete[] data_; + const size_t len = strlen(other.data_); + data_ = new char[len + 1]; + memcpy(data_, other.data_, len + 1); + } + return *this; + } + + // Concatenation operator for FString objects + FString operator+(const FString& other) const { + size_t thisLen = strlen(this->data_); + size_t otherLen = strlen(other.data_); + char* concatenated = new char[thisLen + otherLen + 1]; + + memcpy(concatenated, this->data_, thisLen); + memcpy(concatenated + thisLen, other.data_, otherLen + 1); + + FString result(concatenated); + delete[] concatenated; + return result; + } + + // Concatenation operator for const char* + FString operator+(const char* other) const { + return *this + FString(other); + } + + // Friend function to allow concatenation with const char* on the left-hand side + friend FString operator+(const char* lhs, const FString& rhs) { + return FString(lhs) + rhs; + } + + // Move constructor + FString(FString&& other) noexcept : data_(other.data_) { + other.data_ = nullptr; + } + + FString(const std::string& str) { + const size_t len = str.length(); + data_ = new char[len + 1]; + memcpy(data_, str.c_str(), len + 1); + } + + // Move assignment operator + FString& operator=(FString&& other) noexcept { + if (this != &other) { + delete[] data_; + data_ = other.data_; + other.data_ = nullptr; + } + return *this; + } + + bool operator==(const FString& other) const { + return strcmp(data_, other.data_) == 0; + } + + // Method to get a lowercase version of the string + static FString to_lower(FString& from) + { + for (size_t i = 0; i < strlen(from.data_); ++i) { + from.data_[i] = static_cast(std::tolower(static_cast(from.data_[i]))); + } + return from; + } + + // Overloaded static method to handle const char* + static FString to_lower(const char* from) { + FString temp_string(from); // Create an FString from const char* + return to_lower(temp_string); // Reuse the existing to_lower method + } + + const char* c_str() const { + return data_; + } + + private: + char* data_ = nullptr; + }; + } + +namespace std { + template<> + struct hash { + size_t operator()(const HarmonyLinkLib::FString& s) const { + size_t hashValue = 5381; // Starting value recommended by the djb2 algorithm + const char* str = s.c_str(); + + for (size_t i = 0; str[i] != '\0'; ++i) { + hashValue = ((hashValue << 5) + hashValue) + static_cast(str[i]); + // Equivalent to hashValue * 33 + str[i] + } + + return hashValue; + } + }; +} diff --git a/Source/ThirdParty/HarmonyLinkLib/include/HarmonyLinkLib.h b/Source/ThirdParty/HarmonyLinkLib/include/HarmonyLinkLib.h new file mode 100644 index 0000000..94f07ed --- /dev/null +++ b/Source/ThirdParty/HarmonyLinkLib/include/HarmonyLinkLib.h @@ -0,0 +1,25 @@ +// Copyright (C) 2023 Jordon Brooks + +#pragma once + +#include "Core.h" +#include "Structs/FBattery.h" +#include "Structs/FCPUInfo.h" +#include "Structs/FDevice.h" +#include "Structs/FOSVerInfo.h" + + +class IPlatformUtilities; + +namespace HarmonyLinkLib +{ + extern "C" HARMONYLINKLIB_API bool get_is_wine(); + + extern "C" HARMONYLINKLIB_API FCPUInfo* get_cpu_info(); + + extern "C" HARMONYLINKLIB_API FDevice* get_device_info(); + + extern "C" HARMONYLINKLIB_API FOSVerInfo* get_os_version(); + + extern "C" HARMONYLINKLIB_API FBattery* get_battery_status(); +} diff --git a/Source/ThirdParty/HarmonyLinkLib/include/HarmonyLinkStruct.h b/Source/ThirdParty/HarmonyLinkLib/include/HarmonyLinkStruct.h new file mode 100644 index 0000000..aa4497d --- /dev/null +++ b/Source/ThirdParty/HarmonyLinkLib/include/HarmonyLinkStruct.h @@ -0,0 +1,13 @@ +#pragma once + +struct HarmonyLinkStruct +{ + // Virtual destructor is important for proper cleanup of derived types + virtual ~HarmonyLinkStruct() = default; + + // Method to deallocate the object + void free() const + { + delete this; + } +}; diff --git a/Source/ThirdParty/HarmonyLinkLib/include/Structs/FBattery.h b/Source/ThirdParty/HarmonyLinkLib/include/Structs/FBattery.h new file mode 100644 index 0000000..6c41595 --- /dev/null +++ b/Source/ThirdParty/HarmonyLinkLib/include/Structs/FBattery.h @@ -0,0 +1,22 @@ +#pragma once + +#include +#include + +#include "HarmonyLinkStruct.h" + +namespace HarmonyLinkLib +{ + struct FBattery : HarmonyLinkStruct + { + bool has_battery; + bool is_connected_to_ac; + uint8_t battery_percent; + + void to_string() const { + std::wcout << "Battery present: " << (has_battery ? "'Yes'" : "'No'") << '\n'; + std::wcout << "Connected to AC: " << (is_connected_to_ac ? "'Yes'" : "'No'") << '\n'; + std::wcout << "Battery percent: '" << static_cast(battery_percent) << "%'" << '\n'; + } + }; +} diff --git a/Source/ThirdParty/HarmonyLinkLib/include/Structs/FCPUInfo.h b/Source/ThirdParty/HarmonyLinkLib/include/Structs/FCPUInfo.h new file mode 100644 index 0000000..8694e6a --- /dev/null +++ b/Source/ThirdParty/HarmonyLinkLib/include/Structs/FCPUInfo.h @@ -0,0 +1,40 @@ +#pragma once + +#include +#include +#include "FString.h" + +#include "HarmonyLinkStruct.h" + +namespace HarmonyLinkLib +{ + struct FCPUInfo : HarmonyLinkStruct + { + FString VendorID; + FString Model_Name; + uint32_t Physical_Cores = 0; + uint32_t Logical_Cores = 0; + std::unordered_set Flags; + + void print() const + { + wprintf(L"VendorID: '%hs'\n", VendorID.c_str()); + wprintf(L"Model_Name: '%hs'\n", Model_Name.c_str()); + wprintf(L"Physical_Cores: '%d'\n", Physical_Cores); + wprintf(L"Logical_Cores: '%d'\n", Logical_Cores); + + // Initialize a string to hold all flags + std::string allFlags; + for (const auto& flag : Flags) { + allFlags += std::string(flag.c_str()) + " "; // Append each flag followed by a space + } + + // Remove the trailing space + if (!allFlags.empty()) { + allFlags.pop_back(); + } + + wprintf(L"Flags: '%hs'\n", allFlags.c_str()); + } + }; +} diff --git a/Source/ThirdParty/HarmonyLinkLib/include/Structs/FDevice.h b/Source/ThirdParty/HarmonyLinkLib/include/Structs/FDevice.h new file mode 100644 index 0000000..204a5da --- /dev/null +++ b/Source/ThirdParty/HarmonyLinkLib/include/Structs/FDevice.h @@ -0,0 +1,16 @@ +#pragma once + +#include + +#include "Enums/EDevice.h" +#include "Enums/EPlatform.h" + +namespace HarmonyLinkLib +{ + // Struct to represent a specific device with both platform and device type + struct FDevice : HarmonyLinkStruct + { + EPlatform platform; + EDevice device; + }; +} diff --git a/Source/ThirdParty/HarmonyLinkLib/include/Structs/FOSVerInfo.h b/Source/ThirdParty/HarmonyLinkLib/include/Structs/FOSVerInfo.h new file mode 100644 index 0000000..6b62db3 --- /dev/null +++ b/Source/ThirdParty/HarmonyLinkLib/include/Structs/FOSVerInfo.h @@ -0,0 +1,50 @@ +#pragma once + +#include "FString.h" +#include "HarmonyLinkStruct.h" + +namespace HarmonyLinkLib +{ + struct FOSVerInfo : HarmonyLinkStruct { + // 'name' represents the operating system's name, e.g., "Ubuntu" in Linux or "Windows" in Windows systems. + FString name; + + // 'version' is a numerical representation of the OS version. In Linux, it might be the kernel version, + // whereas in Windows, it could be the major version number like 10 for Windows 10. + uint32_t version = 0; + + // 'id' is a unique identifier for the OS. In Linux, it might be a lower-case string like "ubuntu". + // In Windows, this could map to the edition ID, such as "Professional". + FString id; + + // 'version_id' is a string representing the specific version of the OS. + // For example, "20.04" in Ubuntu or "1909" in Windows 10. + FString version_id; + + // 'version_codename' is a codename for the OS version, if available. + // This is common in Linux distributions (e.g., "focal" for Ubuntu 20.04) but not typically used in Windows. + FString version_codename; + + // 'pretty_name' is a more readable version of the name, potentially including the version and codename. + // For example, "Ubuntu 20.04 LTS (Focal Fossa)" or "Windows 10 Pro". + FString pretty_name; + + // 'variant_id' is an identifier for the specific variant of the OS, if available. + // For example, in Linux distributions, this might be "desktop" for the desktop edition, + // "server" for the server edition, or "core" for a minimal installation. It helps distinguish + // between different flavors or editions of the same version. + // On the Steam Deck, this is set to "steamdeck". + FString variant_id; + + void print() const + { + wprintf(L"Name: '%hs'\n", name.c_str()); + wprintf(L"Version: '%d'\n", version); + wprintf(L"ID: '%hs'\n", id.c_str()); + wprintf(L"Version ID: '%hs'\n", version_id.c_str()); + wprintf(L"Version Codename: '%hs'\n", version_codename.c_str()); + wprintf(L"Pretty Name: '%hs'\n", pretty_name.c_str()); + wprintf(L"Variant ID: '%hs'\n", variant_id.c_str()); + } +}; +} diff --git a/Source/ThirdParty/HarmonyLinkLib/include/Version.h b/Source/ThirdParty/HarmonyLinkLib/include/Version.h new file mode 100644 index 0000000..61d6e3f --- /dev/null +++ b/Source/ThirdParty/HarmonyLinkLib/include/Version.h @@ -0,0 +1,45 @@ +// Copyright (C) 2024 Jordon Brooks +#pragma once + +#include "Core.h" +#include + +#include "FString.h" + +namespace HarmonyLinkLib +{ + class HARMONYLINKLIB_API version + { + public: + version() = default; + + static FString ToString() + { + return HARMONYLINK_VERSION; + } + + static FString get_build_timestamp() + { + return {__TIMESTAMP__}; + } + + static FString get_git_branch() + { + return {GIT_BRANCH_NAME}; + } + + static FString get_git_commit_timestamp() + { + return {GIT_COMMIT_TIMESTAMP}; + } + + static bool is_debug() + { +#ifdef DEBUG_MODE + return true; +#else + return false; +#endif + } + }; +} diff --git a/Source/ThirdParty/HarmonyLinkLib/include/Version.h.in b/Source/ThirdParty/HarmonyLinkLib/include/Version.h.in new file mode 100644 index 0000000..4081f8d --- /dev/null +++ b/Source/ThirdParty/HarmonyLinkLib/include/Version.h.in @@ -0,0 +1,11 @@ +// Version.h.in +#pragma once + +#define HARMONYLINK_VERSION_MAJOR @HarmonyLinkLib_VERSION_MAJOR@ +#define HARMONYLINK_VERSION_MINOR @HarmonyLinkLib_VERSION_MINOR@ +#define HARMONYLINK_VERSION_PATCH @HarmonyLinkLib_VERSION_PATCH@ +#define HARMONYLINK_VERSION_TWEAK @HarmonyLinkLib_VERSION_TWEAK@ +#define HARMONYLINK_VERSION "@HarmonyLinkLib_VERSION@" + +#define GIT_BRANCH_NAME "@GIT_BRANCH_NAME@" +#define GIT_COMMIT_TIMESTAMP "@GIT_COMMIT_TIMESTAMP@"