diff --git a/Source/SkyPortal/Private/SkyPortalIO.cpp b/Source/SkyPortal/Private/SkyPortalIO.cpp index d77711a..ec0e895 100644 --- a/Source/SkyPortal/Private/SkyPortalIO.cpp +++ b/Source/SkyPortal/Private/SkyPortalIO.cpp @@ -214,47 +214,52 @@ EPortalCommand GetPortalCommandFromChar(unsigned char Char) FPortalStatusData ParsePortalStatus(const uint8* StatusResponse) { - FPortalStatusData result; - result.Counter = StatusResponse[5]; - result.bIsReady = (StatusResponse[6] == 0x01); + FPortalStatusData result; + result.Counter = StatusResponse[5]; + result.bIsReady = (StatusResponse[6] == 0x01); - // 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 |= StatusResponse[1]; // 1st byte - FigureStatusArray |= (StatusResponse[2] << 8); // 2nd byte - FigureStatusArray |= (StatusResponse[3] << 16); // 3rd byte - FigureStatusArray |= (StatusResponse[4] << 24); // 4th byte + // 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 |= StatusResponse[1]; // 1st byte + FigureStatusArray |= (StatusResponse[2] << 8); // 2nd byte + FigureStatusArray |= (StatusResponse[3] << 16); // 3rd byte + FigureStatusArray |= (StatusResponse[4] << 24); // 4th byte - bool bChangeBitsSet = false; + bool bChangeBitsSet = false; - TStaticArray tempArray; - // For each of the 16 entries, extract the 2-bit status and map it to EFigureStatus - for (int32 i = 0; i < 16; ++i) + TStaticArray tempArray; + // 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) { - uint8 StatusBits = (FigureStatusArray >> (i * 2)) & 0b11; // Extract 2 bits - EFigureStatus FigureStatus; - - switch (StatusBits) - { - case 0b00: - FigureStatus = EFigureStatus::NOT_PRESENT; - case 0b01: - FigureStatus = EFigureStatus::PRESENT; - case 0b11: - FigureStatus = EFigureStatus::ADDED; - case 0b10: - FigureStatus = EFigureStatus::REMOVED; - default: - FigureStatus = EFigureStatus::NOT_PRESENT; // Default case - } - - // Add to the array of figure statuses - //PortalStatusData.StatusArray.Insert(FigureStatus, i); - tempArray[i] = FigureStatus; + case 0b00: + FigureStatus = EFigureStatus::NOT_PRESENT; + break; + case 0b01: + FigureStatus = EFigureStatus::PRESENT; + break; + case 0b11: + FigureStatus = EFigureStatus::ADDED; // When it's a new NUID detected + break; + case 0b10: + FigureStatus = EFigureStatus::REMOVED; // New NUID removed + break; + default: + FigureStatus = EFigureStatus::NOT_PRESENT; // Default case + break; } - result.StatusArray.SetNum(0); - result.StatusArray.Append(tempArray); - return result; + // Add to the array of figure statuses + //PortalStatusData.StatusArray.Insert(FigureStatus, i); + tempArray[i] = FigureStatus; } + result.StatusArray.SetNum(0); + result.StatusArray.Append(tempArray); + + return result; +} diff --git a/Source/SkyPortal/Private/SkyPortalRunner.cpp b/Source/SkyPortal/Private/SkyPortalRunner.cpp index 75f2871..dc22839 100644 --- a/Source/SkyPortal/Private/SkyPortalRunner.cpp +++ b/Source/SkyPortal/Private/SkyPortalRunner.cpp @@ -56,10 +56,11 @@ void FPortalStatusChecker::CheckPortalStatus() { case S: CurrentStatusData = ParsePortalStatus(output); + UE_LOG(LogSkyportalIO, Verbose, TEXT("Output Data: %s"), *BytesToHex(output, sizeof(output))); //Send delegate when new informations are received if (OldStatusData != CurrentStatusData) { - + for (int i = 0; i < CurrentStatusData.StatusArray.Num(); i++) { if (CurrentStatusData.StatusArray[i] != OldStatusData.StatusArray[i]) { @@ -79,18 +80,17 @@ void FPortalStatusChecker::CheckPortalStatus() case EFigureStatus::ADDED: //FigureData = ReadFigureBlocks(i); //subref->OnSkylanderAdded.Broadcast(GetFigureID(FigureData), i); + break; case EFigureStatus::REMOVED: subref->OnSkylanderRemoved.Broadcast(00, i); + break; } } } - - - + } OldStatusData = CurrentStatusData; subref->StatusData = CurrentStatusData; } - } break; default: return; diff --git a/Source/SkyPortal/Private/SkyPortalSubsystem.cpp b/Source/SkyPortal/Private/SkyPortalSubsystem.cpp index 6f4e162..de5505e 100644 --- a/Source/SkyPortal/Private/SkyPortalSubsystem.cpp +++ b/Source/SkyPortal/Private/SkyPortalSubsystem.cpp @@ -13,7 +13,7 @@ void USkyPortalSubsystem::Initialize(FSubsystemCollectionBase& Collection) Super::Initialize(Collection); // Start the status checker thread - StatusChecker = new FPortalStatusChecker(this, 0.1f); // Check every 50 milliseconds + StatusChecker = new FPortalStatusChecker(this, 0.01f); // Check every 10 milliseconds StatusCheckerThread = FRunnableThread::Create(StatusChecker, TEXT("PortalStatusCheckerThread"), 0, TPri_AboveNormal); UE_LOG(LogTemp, Log, TEXT("SkyPortalSubsystem Initialized")); @@ -92,7 +92,7 @@ FPortalStatusData USkyPortalSubsystem::PortalStatus() { output = PortalHandle->Read(); } while (output[0] != 'S'); - + return ParsePortalStatus(output); } @@ -266,7 +266,7 @@ bool USkyPortalSubsystem::IsPortalReady() SKYPORTAL_API void USkyPortalSubsystem::PortalMusic(const USoundWave* Sound) { - return ; + return; }