MCPcopy Create free account
hub / github.com/URLab-Sim/UnrealRoboticsLab / HandleReplay

Method HandleReplay

Source/URLab/Private/Bridge/RpcDispatcher.cpp:3084–3152  ·  view source on GitHub ↗

Source from the content-addressed store, hash-verified

3082}
3083
3084TSharedPtr<FJsonObject> FURLabRpcDispatcher::HandleReplay(const FString& Op, const TSharedPtr<FJsonObject>& Req)
3085{
3086 AAMjManager* Mgr = OwnerMgr.Get();
3087 if (!Mgr)
3088 return MakeError(TEXT("not_ready"), TEXT("Manager missing"));
3089 AMjReplayManager* RM = CachedReplayManager.Get();
3090 if (!RM)
3091 return MakeError(TEXT("not_ready"), TEXT("AMjReplayManager not present in scene"));
3092
3093 if (Op.Equals(TEXT("replay_load")))
3094 {
3095 FString P;
3096 if (!Req->TryGetStringField(TEXT("path"), P))
3097 return MakeError(TEXT("missing_field"), TEXT("replay_load requires 'path'"));
3098 FString FileName = FPaths::GetCleanFilename(P);
3099 bool bOk = RM->LoadRecordingFromFile(FileName);
3100 if (!bOk)
3101 return MakeError(TEXT("path_not_readable"), P);
3102 TSharedPtr<FJsonObject> Reply = MakeShared<FJsonObject>();
3103 Reply->SetStringField(TEXT("op"), TEXT("replay_load_ok"));
3104 Reply->SetStringField(TEXT("name"), FPaths::GetBaseFilename(FileName));
3105 return Reply;
3106 }
3107 if (Op.Equals(TEXT("replay_list_sessions")))
3108 {
3109 TArray<TSharedPtr<FJsonValue>> Names;
3110 for (const FString& N : RM->GetSessionNames())
3111 Names.Add(MakeShared<FJsonValueString>(N));
3112 TSharedPtr<FJsonObject> Reply = MakeShared<FJsonObject>();
3113 Reply->SetStringField(TEXT("op"), TEXT("replay_list_sessions_ok"));
3114 Reply->SetArrayField(TEXT("sessions"), Names);
3115 return Reply;
3116 }
3117 if (Op.Equals(TEXT("replay_set_active")))
3118 {
3119 FString N;
3120 if (!Req->TryGetStringField(TEXT("name"), N))
3121 return MakeError(TEXT("missing_field"), TEXT("replay_set_active requires 'name'"));
3122 if (!RM->Sessions.Contains(N))
3123 return MakeError(TEXT("replay_session_not_found"), N);
3124 RM->SetActiveSession(N);
3125 TSharedPtr<FJsonObject> Reply = MakeShared<FJsonObject>();
3126 Reply->SetStringField(TEXT("op"), TEXT("replay_set_active_ok"));
3127 return Reply;
3128 }
3129 if (Op.Equals(TEXT("replay_start")))
3130 {
3131 if (ActiveStepMode == EStepMode::Live)
3132 return MakeError(TEXT("replay_requires_stepped"),
3133 TEXT("Switch to direct or puppet before starting replay"));
3134 RM->StartReplay();
3135 int32 Total = RM->Sessions.Contains(RM->GetActiveSessionName())
3136 ? RM->Sessions[RM->GetActiveSessionName()].Frames.Num()
3137 : 0;
3138 TSharedPtr<FJsonObject> Reply = MakeShared<FJsonObject>();
3139 Reply->SetStringField(TEXT("op"), TEXT("replay_start_ok"));
3140 Reply->SetStringField(TEXT("active_session"), RM->GetActiveSessionName());
3141 Reply->SetNumberField(TEXT("total_frames"), Total);

Callers

nothing calls this directly

Calls 6

MakeErrorFunction · 0.85
LoadRecordingFromFileMethod · 0.80
GetSessionNamesMethod · 0.80
SetActiveSessionMethod · 0.80
StartReplayMethod · 0.45
StopReplayMethod · 0.45

Tested by

no test coverage detected