diff --git a/Source/SkyPortal/Private/SkyPortalSubsystem.cpp b/Source/SkyPortal/Private/SkyPortalSubsystem.cpp index dee295b..d48edea 100644 --- a/Source/SkyPortal/Private/SkyPortalSubsystem.cpp +++ b/Source/SkyPortal/Private/SkyPortalSubsystem.cpp @@ -145,9 +145,9 @@ bool USkyPortalSubsystem::OpenPortalHandle() { void USkyPortalSubsystem::ChangePortalColor(const FLinearColor& Color) { - unsigned char r = FMath::Clamp(Color.R * 100, 0.0f, 100.0f); - unsigned char g = FMath::Clamp(Color.G * 100, 0.0f, 100.0f); - unsigned char b = FMath::Clamp(Color.B * 100, 0.0f, 100.0f); + unsigned char r = FMath::Clamp(Color.R * 100, 0.0f, 255.0f); + unsigned char g = FMath::Clamp(Color.G * 100, 0.0f, 255.0f); + unsigned char b = FMath::Clamp(Color.B * 100, 0.0f, 255.0f); RWBlock req; @@ -277,6 +277,56 @@ void USkyPortalSubsystem::Write(RWBlock* pb) { #endif +FPortalStatusData USkyPortalSubsystem::ParsePortalStatus(const RWBlock& ResponseBlock) +{ + FPortalStatusData PortalStatusData; + + // Parse the figure status array (little-endian 32-bit integer) + uint32 FigureStatusArray = 0; + // Reading the 32-bit integer (character status array) from the buffer + FigureStatusArray |= ResponseBlock.buf[1]; // 1st byte + FigureStatusArray |= (ResponseBlock.buf[2] << 8); // 2nd byte + FigureStatusArray |= (ResponseBlock.buf[3] << 16); // 3rd byte + FigureStatusArray |= (ResponseBlock.buf[4] << 24); // 4th byte + + // For each of the 16 entries, extract the 2-bit status and map it to EFigureStatus + for (int32 i = 0; i < 16; ++i) + { + uint8 StatusBits = (FigureStatusArray >> (i * 2)) & 0b11; // Extract 2 bits + EFigureStatus FigureStatus; + + switch (StatusBits) + { + case 0b00: + FigureStatus = EFigureStatus::NOT_PRESENT; + break; + case 0b01: + FigureStatus = EFigureStatus::PRESENT; + break; + case 0b11: + FigureStatus = EFigureStatus::ADDED; + break; + case 0b10: + FigureStatus = EFigureStatus::REMOVED; + break; + default: + FigureStatus = EFigureStatus::NOT_PRESENT; // Default case + break; + } + + // Add to the array of figure statuses + PortalStatusData.StatusArray.Add(FigureStatus); + } + + // The next byte is the response counter + PortalStatusData.Counter = ResponseBlock.buf[5]; + + // The last byte is the boolean indicating whether the portal is ready + PortalStatusData.bIsReady = ResponseBlock.buf[6] != 0; // 0 means not ready, non-zero means ready + + return PortalStatusData; +} + void USkyPortalSubsystem::Sleep(int sleepMs) { FPlatformProcess::Sleep(sleepMs * 0.0001); } @@ -298,7 +348,7 @@ void USkyPortalSubsystem::CheckComplexResponse() { UE_LOG(LogSkyportalIO, Error, TEXT("Error.\n %s"), hid_error(PortalDevice)); return; } - EPortalCommand CommandResponse = GetPortalCommandFromChar(res.buf[1]); + EPortalCommand CommandResponse = GetPortalCommandFromChar(res.buf[0]); switch (CommandResponse) { case A: @@ -316,7 +366,8 @@ void USkyPortalSubsystem::CheckComplexResponse() { case R: break; case S: - + CurrentStatusData = ParsePortalStatus(res); + //Send delegate when new informations are received break; default: break; @@ -501,7 +552,7 @@ bool USkyPortalSubsystem::ConnectPortal() ActivatePortal(1); Sleep(500); - ChangePortalColor(FLinearColor(0xC8, 0xC8, 0xC8)); + ChangePortalColor(FLinearColor(0.5, 0.5, 0.5)); UE_LOG(LogSkyportalIO, Log, TEXT("Portal connected: ")); } diff --git a/Source/SkyPortal/Public/SkyPortalSubsystem.h b/Source/SkyPortal/Public/SkyPortalSubsystem.h index e84686f..b70a8cc 100644 --- a/Source/SkyPortal/Public/SkyPortalSubsystem.h +++ b/Source/SkyPortal/Public/SkyPortalSubsystem.h @@ -40,9 +40,9 @@ enum class EFigureStatus : uint8 }; USTRUCT(BlueprintType) -struct FPortalStatusResponse +struct FPortalStatusData { - GENERATED_BODY() + GENERATED_USTRUCT_BODY() // Array of statuses UPROPERTY(BlueprintReadOnly, Category = "SkyPortal|Figure") @@ -170,6 +170,8 @@ public: UPROPERTY(BlueprintAssignable, Category = "SkyPortal|Skylander") FOnSkylanderRemovedDelegate OnSkylanderRemoved; + UPROPERTY(BlueprintReadOnly) + FPortalStatusData CurrentStatusData; EPortalCommand GetPortalCommandFromChar(unsigned char Char); @@ -186,8 +188,9 @@ public: -private: +private: + FPortalStatusData ParsePortalStatus(const RWBlock& ResponseBlock);