初始化提交

This commit is contained in:
2023-10-28 21:30:28 +08:00
commit 4de07e1988
20 changed files with 822 additions and 0 deletions

View File

@@ -0,0 +1,15 @@
// Copyright Epic Games, Inc. All Rights Reserved.
using UnrealBuildTool;
using System.Collections.Generic;
public class MecanumVehicleTarget : TargetRules
{
public MecanumVehicleTarget( TargetInfo Target) : base(Target)
{
Type = TargetType.Game;
DefaultBuildSettings = BuildSettingsVersion.V2;
IncludeOrderVersion = EngineIncludeOrderVersion.Unreal5_1;
ExtraModuleNames.Add("MecanumVehicle");
}
}

View File

@@ -0,0 +1,31 @@
// Copyright Epic Games, Inc. All Rights Reserved.
using UnrealBuildTool;
public class MecanumVehicle : ModuleRules
{
public MecanumVehicle(ReadOnlyTargetRules Target) : base(Target)
{
PCHUsage = PCHUsageMode.UseExplicitOrSharedPCHs;
PublicDependencyModuleNames.AddRange(
new string[]
{
"Core",
"Engine",
"InputCore" ,
"CoreUObject",
}
);
PrivateDependencyModuleNames.AddRange(
new string[]
{
"RHI",
"Sockets",
"Networking",
"RenderCore",
}
);
}
}

View File

@@ -0,0 +1,6 @@
// Copyright Epic Games, Inc. All Rights Reserved.
#include "MecanumVehicle.h"
#include "Modules/ModuleManager.h"
IMPLEMENT_PRIMARY_GAME_MODULE( FDefaultGameModuleImpl, MecanumVehicle, "MecanumVehicle" );

View File

@@ -0,0 +1,6 @@
// Copyright Epic Games, Inc. All Rights Reserved.
#pragma once
#include "CoreMinimal.h"

View File

@@ -0,0 +1,127 @@
#include "MecanumVehicleAdapter.h"
#include "Sockets.h"
#include "Networking.h"
#include "Misc/Timespan.h"
#include "SocketSubsystem.h"
AMecanumVehicleAdapter::AMecanumVehicleAdapter(const FObjectInitializer& ObjectInitializer)
{
PrimaryActorTick.bCanEverTick = true;
}
void AMecanumVehicleAdapter::BeginPlay()
{
Super::BeginPlay();
SocketSubsystem = ISocketSubsystem::Get(PLATFORM_SOCKETSUBSYSTEM);
UDPSocket = SocketSubsystem->CreateSocket(NAME_DGram, TEXT("Raspberry Socket"), FNetworkProtocolTypes::IPv4);
UDPBuffer.SetNumUninitialized(1024);
PingTime = 1024.0;
for (int32 Index = 0; Index < MAX_uint8; ++Index)
{
UDPRecvTime[Index] = FDateTime(0);
}
UpdataSocket(TEXT("192.168.1.1"));
}
void AMecanumVehicleAdapter::UpdataCompensation(const TArray<double>& Value)
{
if (Value.Num() != 8) return;
SpeedCompensationMax[0] = Value[0];
SpeedCompensationMax[1] = Value[1];
SpeedCompensationMax[2] = Value[2];
SpeedCompensationMax[3] = Value[3];
SpeedCompensationMin[0] = Value[4];
SpeedCompensationMin[1] = Value[5];
SpeedCompensationMin[2] = Value[6];
SpeedCompensationMin[3] = Value[7];
}
void AMecanumVehicleAdapter::UpdataSocket(const FString& IP, const int32 Port)
{
int32 BytesNum = 0;
Addr = SocketSubsystem->CreateInternetAddr();
bool bIsValid;
Addr->SetIp(TEXT("192.168.1.1"), bIsValid);
Addr->SetIp(*IP, bIsValid);
Addr->SetPort(Port);
}
void AMecanumVehicleAdapter::UpdataInput(const FVector Value, const bool bIsBrake)
{
++UDPSequenceIndex;
UDPSequenceIndex %= MAX_uint8;
UDPRecvTime[UDPSequenceIndex] = FDateTime::UtcNow();
double SpeedLF = 0.0f;
double SpeedRF = 0.0f;
double SpeedLR = 0.0f;
double SpeedRR = 0.0f;
SpeedLF += Value.X;
SpeedRF += Value.X;
SpeedLR += Value.X;
SpeedRR += Value.X;
SpeedLF += Value.Y;
SpeedRF -= Value.Y;
SpeedLR -= Value.Y;
SpeedRR += Value.Y;
SpeedLF += Value.Z;
SpeedRF -= Value.Z;
SpeedLR += Value.Z;
SpeedRR -= Value.Z;
UDPBuffer[0] = UDPSequenceIndex;
UDPBuffer[1] = (int8)(FMath::Clamp(FMath::Sign(SpeedLF) * FMath::Lerp(SpeedCompensationMin[0], SpeedCompensationMax[0], FMath::Abs(SpeedLF)) * 128.0, MIN_int8, MAX_int8));
UDPBuffer[2] = (int8)(FMath::Clamp(FMath::Sign(SpeedRF) * FMath::Lerp(SpeedCompensationMin[1], SpeedCompensationMax[1], FMath::Abs(SpeedRF)) * 128.0, MIN_int8, MAX_int8));
UDPBuffer[3] = (int8)(FMath::Clamp(FMath::Sign(SpeedLR) * FMath::Lerp(SpeedCompensationMin[2], SpeedCompensationMax[2], FMath::Abs(SpeedLR)) * 128.0, MIN_int8, MAX_int8));
UDPBuffer[4] = (int8)(FMath::Clamp(FMath::Sign(SpeedRR) * FMath::Lerp(SpeedCompensationMin[3], SpeedCompensationMax[3], FMath::Abs(SpeedRR)) * 128.0, MIN_int8, MAX_int8));
UDPBuffer[5] = bIsBrake;
int32 BytesNum = 0;
UDPSocket->SendTo(UDPBuffer.GetData(), 6, BytesNum, *Addr);
}
void AMecanumVehicleAdapter::Tick(float DeltaTime)
{
Super::Tick(DeltaTime);
int32 BytesNum = 0;
TSharedRef<FInternetAddr> Source = SocketSubsystem->CreateInternetAddr();
uint32 PendingDataSize;
while (UDPSocket->HasPendingData(PendingDataSize))
{
UDPSocket->RecvFrom(UDPBuffer.GetData(), UDPBuffer.Num(), BytesNum, *Source);
if (BytesNum == 1)
{
uint8 Index = UDPBuffer[0];
PingTime = (FDateTime::UtcNow() - UDPRecvTime[Index]).GetTotalMilliseconds();
}
else continue;
UDPLastTime = FDateTime::UtcNow();
}
PingTime = FMath::Max(PingTime, (FDateTime::UtcNow() - UDPLastTime).GetTotalMilliseconds());
}
void AMecanumVehicleAdapter::EndPlay(const EEndPlayReason::Type EndPlayReason)
{
Super::EndPlay(EndPlayReason);
}

View File

@@ -0,0 +1,59 @@
#pragma once
#include "CoreMinimal.h"
#include "GameFramework/Actor.h"
#include "MecanumVehicleAdapter.generated.h"
class FSocket;
class ISocketSubsystem;
UCLASS()
class MECANUMVEHICLE_API AMecanumVehicleAdapter : public AActor
{
GENERATED_BODY()
public:
AMecanumVehicleAdapter(const FObjectInitializer& ObjectInitializer);
UPROPERTY(BlueprintReadOnly)
double PingTime;
UFUNCTION(BlueprintCallable)
void UpdataCompensation(const TArray<double>& Value);
UFUNCTION(BlueprintCallable)
void UpdataSocket(const FString& IP, const int32 Port = 6000);
UFUNCTION(BlueprintCallable)
void UpdataInput(const FVector Value, const bool bIsBrake);
UFUNCTION(BlueprintCallable)
//~ Begin AActor Interface.
virtual void BeginPlay() override;
virtual void Tick(float DeltaSeconds) override;
virtual void EndPlay(const EEndPlayReason::Type EndPlayReason) override;
//~ End AActor Interface.
private:
ISocketSubsystem* SocketSubsystem;
FSocket* UDPSocket;
TSharedPtr<FInternetAddr> Addr;
TArray<uint8> UDPBuffer;
int32 UDPSequenceIndex = 0;
FDateTime UDPLastTime;
FDateTime UDPRecvTime[(int32)MAX_uint8 + 1];
double SpeedCompensationMax[4] = { 1.0, 1.0, 1.0, 1.0 };
double SpeedCompensationMin[4] = { 0.0, 0.0, 0.0, 0.0 };
};

View File

@@ -0,0 +1,15 @@
// Copyright Epic Games, Inc. All Rights Reserved.
using UnrealBuildTool;
using System.Collections.Generic;
public class MecanumVehicleEditorTarget : TargetRules
{
public MecanumVehicleEditorTarget( TargetInfo Target) : base(Target)
{
Type = TargetType.Editor;
DefaultBuildSettings = BuildSettingsVersion.V2;
IncludeOrderVersion = EngineIncludeOrderVersion.Unreal5_1;
ExtraModuleNames.Add("MecanumVehicle");
}
}