278 lines
10 KiB
C++
278 lines
10 KiB
C++
// Fill out your copyright notice in the Description page of Project Settings.
|
|
|
|
|
|
#include "TimeTestWidget.h"
|
|
|
|
#include "Components/Button.h"
|
|
#include "Components/EditableText.h"
|
|
#include "Components/TextBlock.h"
|
|
|
|
#include "TurboLinkGrpcManager.h"
|
|
#include "TurboLinkGrpcUtilities.h"
|
|
#include "TurboLinkGrpcConfig.h"
|
|
|
|
#include "SUser/UserMessage.h"
|
|
|
|
void UTimeTestWidget::NativeConstruct()
|
|
{
|
|
Super::NativeConstruct();
|
|
|
|
Button_ConnectTimeService->OnClicked.AddDynamic(this, &UTimeTestWidget::OnConnectServiceButtonClicked);
|
|
Button_ShutdownTimeService->OnClicked.AddDynamic(this, &UTimeTestWidget::OnShutdownServiceButtonClicked);
|
|
|
|
Button_CreateTimeClient->OnClicked.AddDynamic(this, &UTimeTestWidget::OnCreateClientButtonClicked);
|
|
Button_ShutdownTimeClient->OnClicked.AddDynamic(this, &UTimeTestWidget::OnShutdownClientButtonClicked);
|
|
|
|
Button_Now->OnClicked.AddDynamic(this, &UTimeTestWidget::OnNowButtonClicked);
|
|
Button_Now_Cancel->OnClicked.AddDynamic(this, &UTimeTestWidget::OnNowCancelButtonClicked);
|
|
|
|
Button_Ticktok->OnClicked.AddDynamic(this, &UTimeTestWidget::OnTicktokButtonClicked);
|
|
Button_Ticktok_Cancel->OnClicked.AddDynamic(this, &UTimeTestWidget::OnTicktokCancelButtonClicked);
|
|
|
|
Button_Watch->OnClicked.AddDynamic(this, &UTimeTestWidget::OnWatchButtonClicked);
|
|
Button_Watch_Send->OnClicked.AddDynamic(this, &UTimeTestWidget::OnWatchSendButtonClicked);
|
|
Button_Watch_Cancel->OnClicked.AddDynamic(this, &UTimeTestWidget::OnWatchCancelButtonClicked);
|
|
|
|
FString timeServiceEndPoint = UTurboLinkGrpcUtilities::GetTurboLinkGrpcConfig()->GetServiceEndPoint(TEXT("TimeService"));
|
|
TimeServiceAddress->SetText(FText::FromString(*timeServiceEndPoint));
|
|
TimeServiceAddress->SetIsReadOnly(true);
|
|
|
|
UpdateControlState();
|
|
}
|
|
|
|
void UTimeTestWidget::UpdateControlState()
|
|
{
|
|
bool serviceConnected = (TimeService!=nullptr && (TimeService->GetServiceState()==EGrpcServiceState::Ready || TimeService->GetServiceState() == EGrpcServiceState::Idle));
|
|
bool clientCreated = (TimeServiceClient != nullptr);
|
|
|
|
Button_ConnectTimeService->SetIsEnabled(TimeService == nullptr);
|
|
Button_ShutdownTimeService->SetIsEnabled(serviceConnected || (TimeService != nullptr && TimeService->GetServiceState() == EGrpcServiceState::TransientFailure));
|
|
|
|
Button_CreateTimeClient->SetIsEnabled(serviceConnected && !clientCreated);
|
|
Button_ShutdownTimeClient->SetIsEnabled(clientCreated);
|
|
|
|
Button_Now->SetIsEnabled(serviceConnected && clientCreated && TimeServiceClient->GetContextState(CtxNow) == EGrpcContextState::Done);
|
|
Button_Now_Cancel->SetIsEnabled(serviceConnected && clientCreated&& (TimeServiceClient->GetContextState(CtxNow) == EGrpcContextState::Initialing || TimeServiceClient->GetContextState(CtxNow) == EGrpcContextState::Busy));
|
|
|
|
Button_Ticktok->SetIsEnabled(serviceConnected && clientCreated && TimeServiceClient->GetContextState(CtxTicktok) == EGrpcContextState::Done);
|
|
Button_Ticktok_Cancel->SetIsEnabled(serviceConnected && clientCreated && (TimeServiceClient->GetContextState(CtxTicktok) == EGrpcContextState::Initialing || TimeServiceClient->GetContextState(CtxTicktok) == EGrpcContextState::Busy));
|
|
|
|
Button_Watch->SetIsEnabled(serviceConnected && clientCreated && TimeServiceClient->GetContextState(CtxWatch) == EGrpcContextState::Done);
|
|
Button_Watch_Send->SetIsEnabled(serviceConnected && clientCreated && TimeServiceClient->GetContextState(CtxWatch) == EGrpcContextState::Busy);
|
|
Button_Watch_Cancel->SetIsEnabled(serviceConnected && clientCreated && (TimeServiceClient->GetContextState(CtxWatch) == EGrpcContextState::Initialing || TimeServiceClient->GetContextState(CtxWatch) == EGrpcContextState::Busy));
|
|
}
|
|
|
|
void UTimeTestWidget::OnConnectServiceButtonClicked()
|
|
{
|
|
if (TimeService != nullptr) return;
|
|
UTurboLinkGrpcManager* turboLinkManager = UTurboLinkGrpcUtilities::GetTurboLinkGrpcManager(this);
|
|
|
|
//create service adapter
|
|
TimeService = Cast<UTimeService>(turboLinkManager->MakeService("TimeService"));
|
|
if (TimeService==nullptr)
|
|
{
|
|
UE_LOG(LogTemp, Error, TEXT("Can't find time service!"));
|
|
return;
|
|
}
|
|
TimeService->OnServiceStateChanged.AddUniqueDynamic(this, &UTimeTestWidget::OnTimeServiceStateChanged);
|
|
TimeService->Connect();
|
|
|
|
UpdateControlState();
|
|
}
|
|
|
|
void UTimeTestWidget::OnShutdownServiceButtonClicked()
|
|
{
|
|
if (TimeService != nullptr)
|
|
{
|
|
if (TimeServiceClient!=nullptr)
|
|
{
|
|
TimeService->RemoveClient(TimeServiceClient);
|
|
|
|
TimeServiceClient->Shutdown();
|
|
TimeServiceClient = nullptr;
|
|
}
|
|
|
|
TimeService->OnServiceStateChanged.RemoveDynamic(this, &UTimeTestWidget::OnTimeServiceStateChanged);
|
|
UTurboLinkGrpcUtilities::GetTurboLinkGrpcManager(this)->ReleaseService(TimeService);
|
|
TimeService = nullptr;
|
|
|
|
UpdateControlState();
|
|
}
|
|
}
|
|
|
|
void UTimeTestWidget::OnCreateClientButtonClicked()
|
|
{
|
|
if (TimeService != nullptr && TimeService->GetServiceState() == EGrpcServiceState::Ready)
|
|
{
|
|
if (TimeServiceClient != nullptr) return;
|
|
|
|
//create client
|
|
TimeServiceClient = TimeService->MakeClient();
|
|
TimeServiceClient->OnContextStateChange.AddUniqueDynamic(this, &UTimeTestWidget::OnContextStateChange);
|
|
TimeServiceClient->OnNowResponse.AddUniqueDynamic(this, &UTimeTestWidget::OnTimeNowResponse);
|
|
TimeServiceClient->OnTicktokResponse.AddUniqueDynamic(this, &UTimeTestWidget::OnTimeTicktokResponse);
|
|
TimeServiceClient->OnWatchResponse.AddUniqueDynamic(this, &UTimeTestWidget::OnTimeWatchResponse);
|
|
|
|
UpdateControlState();
|
|
}
|
|
}
|
|
|
|
void UTimeTestWidget::OnShutdownClientButtonClicked()
|
|
{
|
|
if (TimeServiceClient != nullptr)
|
|
{
|
|
TimeService->RemoveClient(TimeServiceClient);
|
|
|
|
TimeServiceClient->Shutdown();
|
|
TimeServiceClient = nullptr;
|
|
|
|
UpdateControlState();
|
|
}
|
|
}
|
|
|
|
void UTimeTestWidget::OnTimeServiceStateChanged(EGrpcServiceState NewState)
|
|
{
|
|
int preFixLen = FString(TEXT("EGrpcServiceState::")).Len();
|
|
TimeServiceStatus->SetText(FText::FromString(UEnum::GetValueAsString(NewState).RightChop(preFixLen)));
|
|
|
|
UpdateControlState();
|
|
}
|
|
|
|
void UTimeTestWidget::OnContextStateChange(FGrpcContextHandle Handle, EGrpcContextState State)
|
|
{
|
|
UpdateControlState();
|
|
}
|
|
|
|
void UTimeTestWidget::OnNowButtonClicked()
|
|
{
|
|
if (TimeService == nullptr ||
|
|
(TimeService->GetServiceState() != EGrpcServiceState::Ready && TimeService->GetServiceState()!= EGrpcServiceState::Idle) ||
|
|
TimeServiceClient==nullptr)
|
|
{
|
|
UE_LOG(LogTemp, Warning, TEXT("Connect to time service first!"));
|
|
return;
|
|
}
|
|
|
|
if (TimeServiceClient->GetContextState(CtxNow) != EGrpcContextState::Done)
|
|
{
|
|
UE_LOG(LogTemp, Warning, TEXT("Busy!"));
|
|
return;
|
|
}
|
|
|
|
CtxNow = TimeServiceClient->InitNow();
|
|
TimeServiceClient->Now(CtxNow, {});
|
|
}
|
|
|
|
void UTimeTestWidget::OnNowCancelButtonClicked()
|
|
{
|
|
if (TimeServiceClient && TimeServiceClient->GetContextState(CtxNow) != EGrpcContextState::Done)
|
|
{
|
|
TimeServiceClient->TryCancelContext(CtxNow);
|
|
}
|
|
}
|
|
|
|
void UTimeTestWidget::OnTimeNowResponse(FGrpcContextHandle Handle, const FGrpcResult& Result, const FGrpcGreeterNowResponse& Response)
|
|
{
|
|
if (Result.Code == EGrpcResultCode::Ok)
|
|
{
|
|
FString value = FString::Printf(TEXT("%lld"), Response.Now);
|
|
TextResultNow->SetText(FText::FromString(value));
|
|
}
|
|
else
|
|
{
|
|
TextResultNow->SetText(FText::FromString(Result.GetCodeString()));
|
|
}
|
|
}
|
|
|
|
void UTimeTestWidget::OnTicktokButtonClicked()
|
|
{
|
|
if (TimeService == nullptr ||
|
|
(TimeService->GetServiceState() != EGrpcServiceState::Ready && TimeService->GetServiceState() != EGrpcServiceState::Idle) ||
|
|
TimeServiceClient == nullptr)
|
|
{
|
|
UE_LOG(LogTemp, Warning, TEXT("Connect to time service first!"));
|
|
return;
|
|
}
|
|
|
|
if (TimeServiceClient->GetContextState(CtxTicktok) != EGrpcContextState::Done)
|
|
{
|
|
UE_LOG(LogTemp, Warning, TEXT("Busy!"));
|
|
return;
|
|
}
|
|
|
|
CtxTicktok = TimeServiceClient->InitTicktok();
|
|
|
|
FGrpcGreeterTicktokRequest request;
|
|
request.Counts = FCString::Atoi(*(TicktokCounts->GetText().ToString()));
|
|
TimeServiceClient->Ticktok(CtxTicktok, request);
|
|
}
|
|
|
|
void UTimeTestWidget::OnTimeTicktokResponse(FGrpcContextHandle Handle, const FGrpcResult& Result, const FGrpcGreeterNowResponse& Response)
|
|
{
|
|
if (Result.Code == EGrpcResultCode::Ok)
|
|
{
|
|
FString value = FString::Printf(TEXT("%lld/%d"), Response.Now, Response.Counts);
|
|
TextResultTicktok->SetText(FText::FromString(value));
|
|
}
|
|
else
|
|
{
|
|
TextResultTicktok->SetText(FText::FromString(Result.GetCodeString()));
|
|
}
|
|
}
|
|
|
|
void UTimeTestWidget::OnTicktokCancelButtonClicked()
|
|
{
|
|
if (TimeServiceClient && TimeServiceClient->GetContextState(CtxTicktok) != EGrpcContextState::Done)
|
|
{
|
|
TimeServiceClient->TryCancelContext(CtxTicktok);
|
|
}
|
|
}
|
|
|
|
void UTimeTestWidget::OnWatchButtonClicked()
|
|
{
|
|
if (TimeService == nullptr ||
|
|
(TimeService->GetServiceState() != EGrpcServiceState::Ready && TimeService->GetServiceState() != EGrpcServiceState::Idle) ||
|
|
TimeServiceClient == nullptr)
|
|
{
|
|
UE_LOG(LogTemp, Warning, TEXT("Connect to time service first!"));
|
|
return;
|
|
}
|
|
|
|
if (TimeServiceClient->GetContextState(CtxWatch) != EGrpcContextState::Done)
|
|
{
|
|
UE_LOG(LogTemp, Warning, TEXT("Busy!"));
|
|
return;
|
|
}
|
|
|
|
CtxWatch = TimeServiceClient->InitWatch();
|
|
}
|
|
|
|
void UTimeTestWidget::OnWatchSendButtonClicked()
|
|
{
|
|
if (TimeServiceClient && TimeServiceClient->GetContextState(CtxWatch) == EGrpcContextState::Busy)
|
|
{
|
|
TimeServiceClient->Watch(CtxWatch, {});
|
|
}
|
|
}
|
|
|
|
void UTimeTestWidget::OnWatchCancelButtonClicked()
|
|
{
|
|
if (TimeServiceClient && TimeServiceClient->GetContextState(CtxWatch) != EGrpcContextState::Done)
|
|
{
|
|
TimeServiceClient->TryCancel(CtxWatch);
|
|
}
|
|
}
|
|
|
|
void UTimeTestWidget::OnTimeWatchResponse(FGrpcContextHandle Handle, const FGrpcResult& Result, const FGrpcGreeterNowResponse& Response)
|
|
{
|
|
if (Result.Code == EGrpcResultCode::Ok)
|
|
{
|
|
FString value = FString::Printf(TEXT("%lld"), Response.Now);
|
|
TextResultWatch->SetText(FText::FromString(value));
|
|
}
|
|
else
|
|
{
|
|
TextResultWatch->SetText(FText::FromString(Result.GetCodeString()));
|
|
}
|
|
}
|