Skip to content

Commit

Permalink
Merge pull request #106 from Kapim/master
Browse files Browse the repository at this point in the history
timeouts added to server calls
  • Loading branch information
Kapim authored Apr 27, 2020
2 parents 6b21da9 + 62eb201 commit 9f3e751
Show file tree
Hide file tree
Showing 9 changed files with 209 additions and 152 deletions.
4 changes: 2 additions & 2 deletions arcor2_AREditor/Assets/BASE/Scripts/ActionObject.cs
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
using UnityEngine;
using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;

namespace Base {
public abstract class ActionObject : Clickable, IActionProvider, IActionPointParent {
Expand Down Expand Up @@ -72,7 +72,7 @@ public virtual bool SceneInteractable() {
return (GameManager.Instance.GetGameState() == GameManager.GameStateEnum.SceneEditor);
}

public async void LoadEndEffectors() {
public async Task LoadEndEffectors() {
List<IO.Swagger.Model.IdValue> idValues = new List<IO.Swagger.Model.IdValue>();
EndEffectors = await GameManager.Instance.GetActionParamValues(Data.Id, "end_effector_id", idValues);
}
Expand Down
7 changes: 5 additions & 2 deletions arcor2_AREditor/Assets/BASE/Scripts/ActionsManager.cs
Original file line number Diff line number Diff line change
Expand Up @@ -105,10 +105,13 @@ public void UpdateService(IO.Swagger.Model.SceneService sceneService) {
OnServicesUpdated?.Invoke(this, new ServiceEventArgs(service));
}

public void AddService(IO.Swagger.Model.SceneService sceneService) {
public async Task AddService(IO.Swagger.Model.SceneService sceneService) {
Debug.Assert(!ServicesData.ContainsKey(sceneService.Type));
if (servicesMetadata.TryGetValue(sceneService.Type, out ServiceMetadata serviceMetadata)) {
Service service = new Service(sceneService, serviceMetadata);
Service service = new Service(sceneService, serviceMetadata);
if (service.IsRobot()) {
await service.LoadRobots();
}
ServicesData.Add(sceneService.Type, service);
OnServicesUpdated?.Invoke(this, new ServiceEventArgs(service));
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -5,8 +5,11 @@
public class CloseProjectDialog : Dialog
{

public void CloseProject() {
Base.GameManager.Instance.CloseProject(true);
public async void CloseProject() {
bool result = await Base.GameManager.Instance.CloseProject(true);
if (result) {
Base.GameManager.Instance.LoadingScreen.SetActive(true);
}
WindowManager.CloseWindow();
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,7 @@ public class CloseSceneDialog : Dialog {


public async void CloseScene() {
await Base.GameManager.Instance.CloseScene(true);
bool result = await Base.GameManager.Instance.CloseScene(true);
WindowManager.CloseWindow();
}
}
70 changes: 50 additions & 20 deletions arcor2_AREditor/Assets/BASE/Scripts/GameManager.cs
Original file line number Diff line number Diff line change
Expand Up @@ -87,7 +87,7 @@ public class GameManager : Singleton<GameManager> {

public const string ApiVersion = "0.6.1";

public readonly string EditorVersion = "0.5.0-alpha.2";
public readonly string EditorVersion = "0.5.0";
public List<IO.Swagger.Model.ListProjectsResponseData> Projects = new List<IO.Swagger.Model.ListProjectsResponseData>();
public List<IO.Swagger.Model.PackageSummary> Packages = new List<IO.Swagger.Model.PackageSummary>();
public List<IO.Swagger.Model.IdDesc> Scenes = new List<IO.Swagger.Model.IdDesc>();
Expand Down Expand Up @@ -175,14 +175,19 @@ private void Start() {
private async void OnConnectionStatusChanged(ConnectionStatusEnum newState) {
switch (newState) {
case ConnectionStatusEnum.Connected:
IO.Swagger.Model.SystemInfoData systemInfo = await WebsocketManager.Instance.GetSystemInfo();
if (!await CheckApiVersion(systemInfo)) {
try {
IO.Swagger.Model.SystemInfoData systemInfo = await WebsocketManager.Instance.GetSystemInfo();
if (!await CheckApiVersion(systemInfo)) {
throw new RequestFailedException();
}
ServerVersion.text = "Editor version: " + EditorVersion +
"\nServer version: " + systemInfo.Version;
} catch (RequestFailedException ex) {
DisconnectFromSever();
EndLoading();
Notifications.Instance.ShowNotification("Connection failed", "");
return;
}
ServerVersion.text = "Editor version: " + EditorVersion +
"\nServer version: " + systemInfo.Version;

ConnectionInfo.text = WebsocketManager.Instance.APIDomainWS;
MenuManager.Instance.DisableAllMenus();
Expand Down Expand Up @@ -272,8 +277,15 @@ private void OnActionsLoaded(object sender, EventArgs e) {
}

public async Task UpdateActionObjects(string highlighteObject = null) {
List<IO.Swagger.Model.ObjectTypeMeta> objectTypeMetas = await WebsocketManager.Instance.GetObjectTypes();
await ActionsManager.Instance.UpdateObjects(objectTypeMetas, highlighteObject);
try {
List<IO.Swagger.Model.ObjectTypeMeta> objectTypeMetas = await WebsocketManager.Instance.GetObjectTypes();
await ActionsManager.Instance.UpdateObjects(objectTypeMetas, highlighteObject);
} catch (RequestFailedException ex) {
Debug.LogError(ex);
Notifications.Instance.SaveLogs(Scene.Instance.Data, GameManager.Instance.CurrentProject, "Failed to update action objects");
GameManager.Instance.DisconnectFromSever();
}

}

public async Task UpdateServices() {
Expand Down Expand Up @@ -339,7 +351,7 @@ public async void ProjectBaseUpdated(Project data) {
}

// SceneUpdated is called from server, when another GUI makes some change.
public async void SceneUpdated(IO.Swagger.Model.Scene scene) {
public async Task SceneUpdated(IO.Swagger.Model.Scene scene) {
StartLoading();
bool sceneOpened = false;

Expand Down Expand Up @@ -375,8 +387,8 @@ public async void SceneUpdated(IO.Swagger.Model.Scene scene) {
Scene.Instance.LoadSettings(scene.Id);
}

Scene.Instance.UpdateActionObjects();
Scene.Instance.UpdateServices();
await Scene.Instance.UpdateActionObjects();
await Scene.Instance.UpdateServices();

sceneReady = true;
if (sceneOpened)
Expand Down Expand Up @@ -506,8 +518,8 @@ public void SceneObjectBaseUpdated(SceneObject sceneObject) {
}
}

public void SceneObjectAdded(SceneObject sceneObject) {
ActionObject actionObject = Scene.Instance.SpawnActionObject(sceneObject.Id, sceneObject.Type, false, sceneObject.Name);
public async Task SceneObjectAdded(SceneObject sceneObject) {
ActionObject actionObject = await Scene.Instance.SpawnActionObject(sceneObject.Id, sceneObject.Type, false, sceneObject.Name);
actionObject.ActionObjectUpdate(sceneObject, Scene.Instance.ActionObjectsVisible, Scene.Instance.ActionObjectsInteractive);
}

Expand Down Expand Up @@ -664,18 +676,37 @@ public string GetSceneId(string name) {
}

public async Task LoadScenes() {
Scenes = await WebsocketManager.Instance.LoadScenes();
OnSceneListChanged?.Invoke(this, EventArgs.Empty);
try {
Scenes = await WebsocketManager.Instance.LoadScenes();
OnSceneListChanged?.Invoke(this, EventArgs.Empty);
} catch (RequestFailedException ex) {
Debug.LogError(ex);
Notifications.Instance.SaveLogs(Scene.Instance.Data, GameManager.Instance.CurrentProject, "Failed to update action objects");
GameManager.Instance.DisconnectFromSever();
}
}

public async Task LoadProjects() {
Projects = await WebsocketManager.Instance.LoadProjects();
OnProjectsListChanged?.Invoke(this, EventArgs.Empty);
try {
Projects = await WebsocketManager.Instance.LoadProjects();
OnProjectsListChanged?.Invoke(this, EventArgs.Empty);
} catch (RequestFailedException ex) {
Debug.LogError(ex);
Notifications.Instance.SaveLogs(Scene.Instance.Data, GameManager.Instance.CurrentProject, "Failed to update action objects");
GameManager.Instance.DisconnectFromSever();
}
}

public async Task LoadPackages() {
Packages = await WebsocketManager.Instance.LoadPackages();
OnPackagesListChanged?.Invoke(this, EventArgs.Empty);
return; // temporairly disabled
try {
Packages = await WebsocketManager.Instance.LoadPackages();
OnPackagesListChanged?.Invoke(this, EventArgs.Empty);
} catch (RequestFailedException ex) {
Debug.LogError(ex);
Notifications.Instance.SaveLogs(Scene.Instance.Data, GameManager.Instance.CurrentProject, "Failed to update action objects");
GameManager.Instance.DisconnectFromSever();
}
}

public async Task<IO.Swagger.Model.SaveSceneResponse> SaveScene() {
Expand Down Expand Up @@ -883,7 +914,7 @@ public async Task<bool> CloseScene(bool force) {
loadedScene = "";
bool success = await WebsocketManager.Instance.CloseScene(force);
if (success) {
OpenMainScreen();
StartLoading();
Scene.Instance.Data = null;
}
return success;
Expand All @@ -893,7 +924,6 @@ public async Task<bool> CloseProject(bool force) {
loadedScene = "";
bool success = await WebsocketManager.Instance.CloseProject(force);
if (success) {
OpenMainScreen();
OnCloseProject?.Invoke(this, EventArgs.Empty);
Scene.Instance.Data = null;
}
Expand Down
21 changes: 12 additions & 9 deletions arcor2_AREditor/Assets/BASE/Scripts/Scene.cs
Original file line number Diff line number Diff line change
Expand Up @@ -38,6 +38,8 @@ public bool RobotsEEVisible {

private Dictionary<string, RobotEE> EndEffectors = new Dictionary<string, RobotEE>();

private Dictionary<string, List<string>> robotsWithEndEffector = new Dictionary<string, List<string>>();

// Update is called once per frame
private void Update() {
// Activates scene if the AREditor is in SceneEditor mode and scene is interactable (no windows are openned).
Expand Down Expand Up @@ -75,7 +77,7 @@ private void Update() {
}

private void Start() {
GameManager.Instance.OnLoadScene += OnSceneOrProjectLoaded;
//GameManager.Instance.OnLoadScene += OnSceneOrProjectLoaded;
GameManager.Instance.OnLoadProject += OnSceneOrProjectLoaded;
}

Expand All @@ -95,7 +97,7 @@ private void CleanRobotEE() {

private async void UpdateEndEffectors() {
if (GameManager.Instance.GetGameState() == GameManager.GameStateEnum.ProjectEditor || GameManager.Instance.GetGameState() == GameManager.GameStateEnum.SceneEditor) {
foreach (KeyValuePair<string, List<string>> robotWithEndEffector in GetAllRobotsWithEndEffectors()) {
foreach (KeyValuePair<string, List<string>> robotWithEndEffector in robotsWithEndEffector) {
foreach (string ee in robotWithEndEffector.Value) {
try {
IO.Swagger.Model.Pose pose = await WebsocketManager.Instance.GetEndEffectorPose(robotWithEndEffector.Key, ee);
Expand All @@ -118,8 +120,9 @@ private async void UpdateEndEffectors() {
}

public void ShowRobotsEE() {
robotsWithEndEffector = GetAllRobotsWithEndEffectors();
RobotsEEVisible = true;
InvokeRepeating("UpdateEndEffectors", 0, 0.5f);
InvokeRepeating("UpdateEndEffectors", 1, 0.5f);
PlayerPrefsHelper.SaveBool("scene/" + Data.Id + "/RobotsEEVisibility", true);

}
Expand Down Expand Up @@ -197,7 +200,7 @@ public void SceneBaseUpdated(IO.Swagger.Model.Scene scene) {

#region ACTION_OBJECTS

public ActionObject SpawnActionObject(string id, string type, bool updateScene = true, string name = "") {
public async Task<ActionObject> SpawnActionObject(string id, string type, bool updateScene = true, string name = "") {
if (!ActionsManager.Instance.ActionObjectMetadata.TryGetValue(type, out ActionObjectMetadata aom)) {
return null;
}
Expand Down Expand Up @@ -234,7 +237,7 @@ public ActionObject SpawnActionObject(string id, string type, bool updateScene =
// Add the Action Object into scene reference
ActionObjects.Add(id, actionObject);
if (aom.Robot) {
actionObject.LoadEndEffectors();
await actionObject.LoadEndEffectors();
}

return actionObject;
Expand Down Expand Up @@ -295,10 +298,10 @@ public List<ActionObject> GetActionObjectsRobots() {
/// <summary>
/// Updates action GameObjects in ActionObjects dict based on the data present in IO.Swagger.Model.Scene Data.
/// </summary>
public void UpdateActionObjects() {
public async Task UpdateActionObjects() {
List<string> currentAO = new List<string>();
foreach (IO.Swagger.Model.SceneObject aoSwagger in Data.Objects) {
ActionObject actionObject = SpawnActionObject(aoSwagger.Id, aoSwagger.Type, false, aoSwagger.Name);
ActionObject actionObject = await SpawnActionObject(aoSwagger.Id, aoSwagger.Type, false, aoSwagger.Name);
actionObject.ActionObjectUpdate(aoSwagger, ActionObjectsVisible, ActionObjectsInteractive);
currentAO.Add(aoSwagger.Id);
}
Expand All @@ -309,10 +312,10 @@ public void UpdateActionObjects() {
/// Updates all services from scene data.
/// Only called when whole scene arrived, i.e. when client is connected or scene is opened, so all service needs to be added.
/// </summary>
public void UpdateServices() {
public async Task UpdateServices() {
ActionsManager.Instance.ClearServices(); //just to be sure
foreach (IO.Swagger.Model.SceneService service in Data.Services) {
ActionsManager.Instance.AddService(service);
await ActionsManager.Instance.AddService(service);
}
}

Expand Down
4 changes: 1 addition & 3 deletions arcor2_AREditor/Assets/BASE/Scripts/Service.cs
Original file line number Diff line number Diff line change
Expand Up @@ -16,9 +16,7 @@ public ServiceMetadata Metadata {
public Service(IO.Swagger.Model.SceneService service, ServiceMetadata metadata) {
Metadata = metadata;
Data = service;
if (metadata.Robot) {
LoadRobots();
}

}

public string GetProviderName() {
Expand Down
Loading

0 comments on commit 9f3e751

Please sign in to comment.