Initial Commit
This commit is contained in:
commit
47711e93b5
10 changed files with 855 additions and 0 deletions
54
.gitignore
vendored
Normal file
54
.gitignore
vendored
Normal file
|
@ -0,0 +1,54 @@
|
||||||
|
# Ignore all files by default, but scan all directories.
|
||||||
|
*
|
||||||
|
!*/
|
||||||
|
|
||||||
|
# Do not ignore git files in the root of the repo.
|
||||||
|
!/.git*
|
||||||
|
|
||||||
|
# Do not ignore current project's `.uproject`.
|
||||||
|
!/*.uproject
|
||||||
|
|
||||||
|
!/*.uplugin
|
||||||
|
|
||||||
|
# Do not ignore source, config and plugins dirs.
|
||||||
|
!/Source/**
|
||||||
|
!/Config/**
|
||||||
|
!/Plugins/**
|
||||||
|
!/Resources/**
|
||||||
|
|
||||||
|
# Only allow .uasset and .umap files from /Content dir.
|
||||||
|
# They're tracked by git-lfs, don't forget to track other
|
||||||
|
# files if adding them here.
|
||||||
|
!/Content/**/*.uasset
|
||||||
|
!/Content/**/*.umap
|
||||||
|
|
||||||
|
# Allow any files from /RawContent dir.
|
||||||
|
# Any file in /RawContent dir will be managed by git lfs.
|
||||||
|
!/RawContent/**/*
|
||||||
|
|
||||||
|
# OS/platform generated files.
|
||||||
|
|
||||||
|
# Windows
|
||||||
|
ehthumbs.db
|
||||||
|
Thumbs.db
|
||||||
|
|
||||||
|
# Mac OS X
|
||||||
|
.DS_Store
|
||||||
|
.DS_Store?
|
||||||
|
.AppleDouble
|
||||||
|
.LSOverride
|
||||||
|
._*
|
||||||
|
|
||||||
|
# Linux
|
||||||
|
*~
|
||||||
|
.directory
|
||||||
|
|
||||||
|
# vim
|
||||||
|
[._]*.s[a-w][a-z]
|
||||||
|
[._]s[a-w][a-z]
|
||||||
|
*.un~
|
||||||
|
Session.vim
|
||||||
|
.netrwhist
|
||||||
|
|
||||||
|
# Visual Studio
|
||||||
|
.vs
|
24
HarmonyLinkUE.uplugin
Normal file
24
HarmonyLinkUE.uplugin
Normal file
|
@ -0,0 +1,24 @@
|
||||||
|
{
|
||||||
|
"FileVersion": 3,
|
||||||
|
"Version": 1,
|
||||||
|
"VersionName": "1.0",
|
||||||
|
"FriendlyName": "HarmonyLinkUE",
|
||||||
|
"Description": "",
|
||||||
|
"Category": "Other",
|
||||||
|
"CreatedBy": "Jordon Brooks",
|
||||||
|
"CreatedByURL": "https://jordongamedev.co.uk",
|
||||||
|
"DocsURL": "",
|
||||||
|
"MarketplaceURL": "",
|
||||||
|
"SupportURL": "",
|
||||||
|
"CanContainContent": true,
|
||||||
|
"IsBetaVersion": true,
|
||||||
|
"IsExperimentalVersion": false,
|
||||||
|
"Installed": false,
|
||||||
|
"Modules": [
|
||||||
|
{
|
||||||
|
"Name": "HarmonyLinkUE",
|
||||||
|
"Type": "Runtime",
|
||||||
|
"LoadingPhase": "PreLoadingScreen"
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
BIN
Resources/Icon128.png
Normal file
BIN
Resources/Icon128.png
Normal file
Binary file not shown.
After Width: | Height: | Size: 12 KiB |
56
Source/HarmonyLinkUE/HarmonyLinkUE.Build.cs
Normal file
56
Source/HarmonyLinkUE/HarmonyLinkUE.Build.cs
Normal file
|
@ -0,0 +1,56 @@
|
||||||
|
// Some copyright should be here...
|
||||||
|
|
||||||
|
using UnrealBuildTool;
|
||||||
|
|
||||||
|
public class HarmonyLinkUE : ModuleRules
|
||||||
|
{
|
||||||
|
public HarmonyLinkUE(ReadOnlyTargetRules Target) : base(Target)
|
||||||
|
{
|
||||||
|
PCHUsage = ModuleRules.PCHUsageMode.UseExplicitOrSharedPCHs;
|
||||||
|
|
||||||
|
PublicIncludePaths.AddRange(
|
||||||
|
new string[] {
|
||||||
|
// ... add public include paths required here ...
|
||||||
|
}
|
||||||
|
);
|
||||||
|
|
||||||
|
|
||||||
|
PrivateIncludePaths.AddRange(
|
||||||
|
new string[] {
|
||||||
|
// ... add other private include paths required here ...
|
||||||
|
}
|
||||||
|
);
|
||||||
|
|
||||||
|
|
||||||
|
PublicDependencyModuleNames.AddRange(
|
||||||
|
new string[]
|
||||||
|
{
|
||||||
|
"Core",
|
||||||
|
"HTTP",
|
||||||
|
"Json",
|
||||||
|
"JsonUtilities"
|
||||||
|
// ... add other public dependencies that you statically link with here ...
|
||||||
|
}
|
||||||
|
);
|
||||||
|
|
||||||
|
|
||||||
|
PrivateDependencyModuleNames.AddRange(
|
||||||
|
new string[]
|
||||||
|
{
|
||||||
|
"CoreUObject",
|
||||||
|
"Engine",
|
||||||
|
"Slate",
|
||||||
|
"SlateCore",
|
||||||
|
// ... add private dependencies that you statically link with here ...
|
||||||
|
}
|
||||||
|
);
|
||||||
|
|
||||||
|
|
||||||
|
DynamicallyLoadedModuleNames.AddRange(
|
||||||
|
new string[]
|
||||||
|
{
|
||||||
|
// ... add any modules that your module loads dynamically here ...
|
||||||
|
}
|
||||||
|
);
|
||||||
|
}
|
||||||
|
}
|
70
Source/HarmonyLinkUE/Private/DataRefreshActor.cpp
Normal file
70
Source/HarmonyLinkUE/Private/DataRefreshActor.cpp
Normal file
|
@ -0,0 +1,70 @@
|
||||||
|
// DataRefreshActor.cpp
|
||||||
|
|
||||||
|
#include "DataRefreshActor.h"
|
||||||
|
#include "HarmonyLinkUEBPLibrary.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<USceneComponent>(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
|
||||||
|
UHarmonyLinkUEBPLibrary::RefreshAllInfo(FDeviceInfoCallback());
|
||||||
|
UHarmonyLinkUEBPLibrary::RefreshVersionInfo(FVersionInfoCallback());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Function to refresh data
|
||||||
|
void ADataRefreshActor::RefreshData()
|
||||||
|
{
|
||||||
|
// Only refresh data if the Harmony Link library is available
|
||||||
|
if (UHarmonyLinkUEBPLibrary::StaticClass())
|
||||||
|
{
|
||||||
|
// Check server status asynchronously
|
||||||
|
UHarmonyLinkUEBPLibrary::CheckServerStatus(ServerStatusCallback);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
22
Source/HarmonyLinkUE/Private/HarmonyLinkUE.cpp
Normal file
22
Source/HarmonyLinkUE/Private/HarmonyLinkUE.cpp
Normal file
|
@ -0,0 +1,22 @@
|
||||||
|
// 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)
|
289
Source/HarmonyLinkUE/Private/HarmonyLinkUEBPLibrary.cpp
Normal file
289
Source/HarmonyLinkUE/Private/HarmonyLinkUEBPLibrary.cpp
Normal file
|
@ -0,0 +1,289 @@
|
||||||
|
// .cpp file
|
||||||
|
|
||||||
|
#include "HarmonyLinkUEBPLibrary.h"
|
||||||
|
#include "Interfaces/IHttpResponse.h"
|
||||||
|
|
||||||
|
FAllInfo UHarmonyLinkUEBPLibrary::CachedAllInfo;
|
||||||
|
FHarmonyLinkVersionData UHarmonyLinkUEBPLibrary::CachedVersionData;
|
||||||
|
bool UHarmonyLinkUEBPLibrary::Connected;
|
||||||
|
|
||||||
|
UHarmonyLinkUEBPLibrary::UHarmonyLinkUEBPLibrary(const FObjectInitializer& ObjectInitializer)
|
||||||
|
: Super(ObjectInitializer)
|
||||||
|
{
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
void UHarmonyLinkUEBPLibrary::CheckServerStatus(FServerStatusCallback Callback)
|
||||||
|
{
|
||||||
|
TSharedPtr<IHttpRequest, ESPMode::ThreadSafe> Request = FHttpModule::Get().CreateRequest();
|
||||||
|
Request->SetURL(TEXT("http://localhost:9000/are_you_there"));
|
||||||
|
Request->SetVerb(TEXT("GET"));
|
||||||
|
|
||||||
|
Request->OnProcessRequestComplete().BindLambda(&UHarmonyLinkUEBPLibrary::OnCheckServerStatusResponseReceived, Callback);
|
||||||
|
|
||||||
|
Request->ProcessRequest();
|
||||||
|
}
|
||||||
|
|
||||||
|
void UHarmonyLinkUEBPLibrary::RefreshOSInfo(FOSInfoCallback Callback)
|
||||||
|
{
|
||||||
|
TSharedPtr<IHttpRequest, ESPMode::ThreadSafe> Request = FHttpModule::Get().CreateRequest();
|
||||||
|
Request->SetURL(TEXT("http://localhost:9000/os_info"));
|
||||||
|
Request->SetVerb(TEXT("GET"));
|
||||||
|
|
||||||
|
Request->OnProcessRequestComplete().BindLambda(&UHarmonyLinkUEBPLibrary::OnOSInfoResponseReceived, Callback);
|
||||||
|
|
||||||
|
Request->ProcessRequest();
|
||||||
|
}
|
||||||
|
|
||||||
|
void UHarmonyLinkUEBPLibrary::RefreshBatteryInfo(FBatteryInfoCallback Callback)
|
||||||
|
{
|
||||||
|
TSharedPtr<IHttpRequest, ESPMode::ThreadSafe> Request = FHttpModule::Get().CreateRequest();
|
||||||
|
Request->SetURL(TEXT("http://localhost:9000/battery_info"));
|
||||||
|
Request->SetVerb(TEXT("GET"));
|
||||||
|
|
||||||
|
Request->OnProcessRequestComplete().BindLambda(&UHarmonyLinkUEBPLibrary::OnBatteryInfoResponseReceived, Callback);
|
||||||
|
|
||||||
|
Request->ProcessRequest();
|
||||||
|
}
|
||||||
|
|
||||||
|
void UHarmonyLinkUEBPLibrary::RefreshAllInfo(FDeviceInfoCallback Callback)
|
||||||
|
{
|
||||||
|
TSharedPtr<IHttpRequest, ESPMode::ThreadSafe> Request = FHttpModule::Get().CreateRequest();
|
||||||
|
Request->SetURL(TEXT("http://localhost:9000/all_info"));
|
||||||
|
Request->SetVerb(TEXT("GET"));
|
||||||
|
|
||||||
|
Request->OnProcessRequestComplete().BindLambda(&UHarmonyLinkUEBPLibrary::OnDeviceInfoResponseReceived, Callback);
|
||||||
|
|
||||||
|
Request->ProcessRequest();
|
||||||
|
}
|
||||||
|
|
||||||
|
void UHarmonyLinkUEBPLibrary::RefreshVersionInfo(FVersionInfoCallback Callback)
|
||||||
|
{
|
||||||
|
TSharedPtr<IHttpRequest, ESPMode::ThreadSafe> Request = FHttpModule::Get().CreateRequest();
|
||||||
|
Request->SetURL(TEXT("http://localhost:9000/version_info"));
|
||||||
|
Request->SetVerb(TEXT("GET"));
|
||||||
|
|
||||||
|
Request->OnProcessRequestComplete().BindLambda(&UHarmonyLinkUEBPLibrary::OnVersionInfoResponseReceived, Callback);
|
||||||
|
|
||||||
|
Request->ProcessRequest();
|
||||||
|
}
|
||||||
|
|
||||||
|
void UHarmonyLinkUEBPLibrary::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 UHarmonyLinkUEBPLibrary::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<FJsonObject> JsonObject;
|
||||||
|
TSharedRef<TJsonReader<>> Reader = TJsonReaderFactory<>::Create(ResponseString);
|
||||||
|
if (FJsonSerializer::Deserialize(Reader, JsonObject))
|
||||||
|
{
|
||||||
|
// Parse the OSInfo
|
||||||
|
FOSInfo OSInfo;
|
||||||
|
if (JsonObject->HasField("os_info"))
|
||||||
|
{
|
||||||
|
TSharedPtr<FJsonObject> 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 UHarmonyLinkUEBPLibrary::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<FJsonObject> JsonObject;
|
||||||
|
TSharedRef<TJsonReader<>> 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 UHarmonyLinkUEBPLibrary::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<FJsonObject> JsonObject;
|
||||||
|
TSharedRef<TJsonReader<>> Reader = TJsonReaderFactory<>::Create(ResponseString);
|
||||||
|
if (FJsonSerializer::Deserialize(Reader, JsonObject))
|
||||||
|
{
|
||||||
|
// Parse the OSInfo
|
||||||
|
FOSInfo OSInfo;
|
||||||
|
if (JsonObject->HasField("os_info"))
|
||||||
|
{
|
||||||
|
TSharedPtr<FJsonObject> 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<FJsonObject, ESPMode::ThreadSafe>* 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<FJsonObject, ESPMode::ThreadSafe>* DockInfoObject = nullptr;
|
||||||
|
if (JsonObject->HasField("dock_info") && JsonObject->TryGetObjectField("dock_info", DockInfoObject))
|
||||||
|
{
|
||||||
|
const TSharedPtr<FJsonObject, ESPMode::ThreadSafe>* DockModelObject = nullptr;
|
||||||
|
if (DockInfoObject->Get()->HasField("dock_model") && JsonObject->TryGetObjectField("dock_model", DockModelObject))
|
||||||
|
{
|
||||||
|
TSharedPtr<FJsonObject> 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 UHarmonyLinkUEBPLibrary::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<FJsonObject> JsonObject;
|
||||||
|
TSharedRef<TJsonReader<>> 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.
|
||||||
|
}
|
||||||
|
}
|
43
Source/HarmonyLinkUE/Public/DataRefreshActor.h
Normal file
43
Source/HarmonyLinkUE/Public/DataRefreshActor.h
Normal file
|
@ -0,0 +1,43 @@
|
||||||
|
// DataRefreshActor.h
|
||||||
|
|
||||||
|
#pragma once
|
||||||
|
|
||||||
|
#include "CoreMinimal.h"
|
||||||
|
#include "GameFramework/Actor.h"
|
||||||
|
#include "HarmonyLinkUEBPLibrary.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;
|
||||||
|
};
|
14
Source/HarmonyLinkUE/Public/HarmonyLinkUE.h
Normal file
14
Source/HarmonyLinkUE/Public/HarmonyLinkUE.h
Normal file
|
@ -0,0 +1,14 @@
|
||||||
|
// Copyright Epic Games, Inc. All Rights Reserved.
|
||||||
|
|
||||||
|
#pragma once
|
||||||
|
|
||||||
|
#include "Modules/ModuleManager.h"
|
||||||
|
|
||||||
|
class FHarmonyLinkUEModule : public IModuleInterface
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
|
||||||
|
/** IModuleInterface implementation */
|
||||||
|
virtual void StartupModule() override;
|
||||||
|
virtual void ShutdownModule() override;
|
||||||
|
};
|
283
Source/HarmonyLinkUE/Public/HarmonyLinkUEBPLibrary.h
Normal file
283
Source/HarmonyLinkUE/Public/HarmonyLinkUEBPLibrary.h
Normal file
|
@ -0,0 +1,283 @@
|
||||||
|
// Copyright Epic Games, Inc. All Rights Reserved.
|
||||||
|
|
||||||
|
#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 "HarmonyLinkUEBPLibrary.generated.h"
|
||||||
|
|
||||||
|
UENUM(BlueprintType)
|
||||||
|
enum class EDockModel : uint8
|
||||||
|
{
|
||||||
|
SteamDeckDock,
|
||||||
|
JSAUX,
|
||||||
|
Unknown,
|
||||||
|
};
|
||||||
|
|
||||||
|
USTRUCT(BlueprintType)
|
||||||
|
struct FSDock
|
||||||
|
{
|
||||||
|
GENERATED_BODY()
|
||||||
|
|
||||||
|
public:
|
||||||
|
UPROPERTY(EditAnywhere, BlueprintReadWrite)
|
||||||
|
EDockModel Model = EDockModel::Unknown;
|
||||||
|
|
||||||
|
UPROPERTY(EditAnywhere, BlueprintReadWrite)
|
||||||
|
FString Name = "";
|
||||||
|
|
||||||
|
void Print() const
|
||||||
|
{
|
||||||
|
UE_LOG(LogTemp, Display, TEXT("Dock Model: %s"), *StaticEnum<EDockModel>()->GetNameStringByValue(static_cast<int64>(Model)));
|
||||||
|
UE_LOG(LogTemp, Display, TEXT("Name: %s"), *Name);
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
USTRUCT(BlueprintType)
|
||||||
|
struct FDockInfo
|
||||||
|
{
|
||||||
|
GENERATED_BODY()
|
||||||
|
|
||||||
|
public:
|
||||||
|
UPROPERTY(EditAnywhere, BlueprintReadWrite)
|
||||||
|
FSDock DockModel;
|
||||||
|
|
||||||
|
UPROPERTY(EditAnywhere, BlueprintReadWrite)
|
||||||
|
bool bIsDocked = false;
|
||||||
|
|
||||||
|
UPROPERTY(EditAnywhere, BlueprintReadWrite)
|
||||||
|
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)
|
||||||
|
FString OSType = "Unknown";
|
||||||
|
|
||||||
|
UPROPERTY(EditAnywhere, BlueprintReadWrite)
|
||||||
|
FString OSVersion = "";
|
||||||
|
|
||||||
|
UPROPERTY(EditAnywhere, BlueprintReadWrite)
|
||||||
|
FString OSEdition = "";
|
||||||
|
|
||||||
|
UPROPERTY(EditAnywhere, BlueprintReadWrite)
|
||||||
|
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)
|
||||||
|
bool bHasBattery = false;
|
||||||
|
|
||||||
|
UPROPERTY(EditAnywhere, BlueprintReadWrite)
|
||||||
|
int32 BatteryPercent = 0;
|
||||||
|
|
||||||
|
UPROPERTY(EditAnywhere, BlueprintReadWrite)
|
||||||
|
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<EChargingStatus>()->GetNameStringByValue(static_cast<int64>(ChargingStatus)));
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
USTRUCT(BlueprintType)
|
||||||
|
struct FHarmonyLinkVersionData
|
||||||
|
{
|
||||||
|
GENERATED_BODY()
|
||||||
|
|
||||||
|
public:
|
||||||
|
UPROPERTY(EditAnywhere, BlueprintReadWrite)
|
||||||
|
FString BuildTimestamp;
|
||||||
|
|
||||||
|
UPROPERTY(EditAnywhere, BlueprintReadWrite)
|
||||||
|
FString GitBranch;
|
||||||
|
|
||||||
|
UPROPERTY(EditAnywhere, BlueprintReadWrite)
|
||||||
|
FString GitDescribe;
|
||||||
|
|
||||||
|
UPROPERTY(EditAnywhere, BlueprintReadWrite)
|
||||||
|
FString GitCommitTimestamp;
|
||||||
|
|
||||||
|
UPROPERTY(EditAnywhere, BlueprintReadWrite)
|
||||||
|
bool bDebug;
|
||||||
|
|
||||||
|
UPROPERTY(EditAnywhere, BlueprintReadWrite)
|
||||||
|
FString Version;
|
||||||
|
|
||||||
|
UPROPERTY(EditAnywhere, BlueprintReadWrite)
|
||||||
|
int32 VersionMajor;
|
||||||
|
|
||||||
|
UPROPERTY(EditAnywhere, BlueprintReadWrite)
|
||||||
|
int32 VersionMinor;
|
||||||
|
|
||||||
|
UPROPERTY(EditAnywhere, BlueprintReadWrite)
|
||||||
|
int32 VersionPatch;
|
||||||
|
|
||||||
|
UPROPERTY(EditAnywhere, BlueprintReadWrite)
|
||||||
|
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)
|
||||||
|
FOSInfo OSInfo;
|
||||||
|
|
||||||
|
UPROPERTY(EditAnywhere, BlueprintReadWrite)
|
||||||
|
FDockInfo DockInfo;
|
||||||
|
|
||||||
|
UPROPERTY(EditAnywhere, BlueprintReadWrite)
|
||||||
|
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 UHarmonyLinkUEBPLibrary : 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);
|
||||||
|
};
|
Loading…
Add table
Add a link
Reference in a new issue