初始化提交
This commit is contained in:
15
Source/MecanumVehicle.Target.cs
Normal file
15
Source/MecanumVehicle.Target.cs
Normal 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");
|
||||
}
|
||||
}
|
31
Source/MecanumVehicle/MecanumVehicle.Build.cs
Normal file
31
Source/MecanumVehicle/MecanumVehicle.Build.cs
Normal 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",
|
||||
}
|
||||
);
|
||||
}
|
||||
}
|
6
Source/MecanumVehicle/MecanumVehicle.cpp
Normal file
6
Source/MecanumVehicle/MecanumVehicle.cpp
Normal 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" );
|
6
Source/MecanumVehicle/MecanumVehicle.h
Normal file
6
Source/MecanumVehicle/MecanumVehicle.h
Normal file
@@ -0,0 +1,6 @@
|
||||
// Copyright Epic Games, Inc. All Rights Reserved.
|
||||
|
||||
#pragma once
|
||||
|
||||
#include "CoreMinimal.h"
|
||||
|
127
Source/MecanumVehicle/MecanumVehicleAdapter.cpp
Normal file
127
Source/MecanumVehicle/MecanumVehicleAdapter.cpp
Normal 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);
|
||||
}
|
59
Source/MecanumVehicle/MecanumVehicleAdapter.h
Normal file
59
Source/MecanumVehicle/MecanumVehicleAdapter.h
Normal 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 };
|
||||
|
||||
};
|
15
Source/MecanumVehicleEditor.Target.cs
Normal file
15
Source/MecanumVehicleEditor.Target.cs
Normal 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");
|
||||
}
|
||||
}
|
Reference in New Issue
Block a user