diff --git a/server/worldanalysis/src/ETSI.ARF.OpenAPI.WorldAnalysis/ETSI-ARF/ControllersImpl/CapabilitiesImpl.cs b/server/worldanalysis/src/ETSI.ARF.OpenAPI.WorldAnalysis/ETSI-ARF/ControllersImpl/CapabilitiesImpl.cs index f5b295dbd0fd7947827e6245e3242783088b7754..f9c1a3543df47330a2fc2d11b904b5e75c1f85a0 100644 --- a/server/worldanalysis/src/ETSI.ARF.OpenAPI.WorldAnalysis/ETSI-ARF/ControllersImpl/CapabilitiesImpl.cs +++ b/server/worldanalysis/src/ETSI.ARF.OpenAPI.WorldAnalysis/ETSI-ARF/ControllersImpl/CapabilitiesImpl.cs @@ -53,27 +53,17 @@ namespace ETSI.ARF.OpenAPI.WorldAnalysis.Controllers /// </summary> public override IActionResult GetCapabilities([FromHeader (Name = "token")]string token, [FromHeader (Name = "sessionID")]string sessionID) { - // Get all capabilities from all anchors/trackables - // test - EncodingInformationStructure enc = new EncodingInformationStructure(); - enc.DataFormat = EncodingInformationStructure.DataFormatEnum.OTHEREnum; - enc.VarVersion = "12345"; + // todo: compare token and sessionID - Capability capability = new Capability(); - capability.TrackableType = TrackableType.FIDUCIALMARKEREnum; - capability.EncodingInformation = enc; - capability.Accuracy = 1; - capability.Framerate = 24; - capability.Latency = 0; + // Get all capabilities from all anchors/trackables // Create list - List<Capability> capabilities = new List<Capability>(); - //capabilities.Add(capability); - capabilities.AddRange(WorldAnalysisModules.Singleton.GetCapabilities()); + List<Capability> capabilitiesList = new List<Capability>(); + capabilitiesList.AddRange(WorldAnalysisModules.Singleton.GetCapabilities()); - // Create repsonse object + // Create response object GetCapabilities200Response response = new GetCapabilities200Response(); - response.Capabilities = capabilities; + response.Capabilities = capabilitiesList; return new ObjectResult(response); //return StatusCode(405, "Not supported yet!"); } @@ -83,11 +73,16 @@ namespace ETSI.ARF.OpenAPI.WorldAnalysis.Controllers /// </summary> public override IActionResult GetSupport([FromRoute (Name = "trackableOrAnchorUUID")][Required]Guid trackableOrAnchorUUID, [FromHeader (Name = "token")]string token, [FromHeader (Name = "sessionID")]string sessionID) { - Capability capability = new Capability(); - capability.Framerate = 24; - capability.Latency = 0; - capability.TrackableType = TrackableType.FIDUCIALMARKEREnum; - return (null != capability) ? new ObjectResult(capability) : StatusCode(404, "Not found, could not find capability for UUID: " + trackableOrAnchorUUID); + // todo: compare token and sessionID + + // Create list + List<Capability> capabilitiesList = new List<Capability>(); + capabilitiesList.AddRange(WorldAnalysisModules.Singleton.GetCapabilitiesFromUuid(trackableOrAnchorUUID)); + + // Create response object + GetSupport200Response response = new GetSupport200Response(); + response.Capabilities = capabilitiesList; + return new ObjectResult(response); //return StatusCode(405, "Not supported yet!"); } } diff --git a/server/worldanalysis/src/ETSI.ARF.OpenAPI.WorldAnalysis/ETSI-ARF/ControllersImpl/PoseImpl.cs b/server/worldanalysis/src/ETSI.ARF.OpenAPI.WorldAnalysis/ETSI-ARF/ControllersImpl/PoseImpl.cs index 3489e85d45538f43d5758bef2b392613c95ebe67..2efde9582b63456818e9cdf7a4580eaace02aecc 100644 --- a/server/worldanalysis/src/ETSI.ARF.OpenAPI.WorldAnalysis/ETSI-ARF/ControllersImpl/PoseImpl.cs +++ b/server/worldanalysis/src/ETSI.ARF.OpenAPI.WorldAnalysis/ETSI-ARF/ControllersImpl/PoseImpl.cs @@ -53,6 +53,8 @@ namespace ETSI.ARF.OpenAPI.WorldAnalysis.Controllers /// </summary> public override IActionResult ConfigureFramerate([FromBody]PoseConfiguration poseConfiguration, [FromHeader (Name = "token")]string token, [FromHeader (Name = "sessionID")]string sessionID) { + // todo: compare token and sessionID + return StatusCode(405, "Not supported yet!"); } @@ -61,6 +63,8 @@ namespace ETSI.ARF.OpenAPI.WorldAnalysis.Controllers /// </summary> public override IActionResult GetPose([FromRoute (Name = "trackableOrAnchorUUID")][Required]Guid trackableOrAnchorUUID, [FromQuery (Name = "mode")][Required()]ModeWorldAnalysis mode, [FromHeader (Name = "token")]string token, [FromHeader (Name = "sessionID")]string sessionID) { + // todo: compare token and sessionID + return StatusCode(405, "Not supported yet!"); } @@ -72,11 +76,33 @@ namespace ETSI.ARF.OpenAPI.WorldAnalysis.Controllers return StatusCode(405, "Not supported yet!"); } +#pragma warning disable CS1591 // Fehlendes XML-Kommentar für öffentlich sichtbaren Typ oder Element + + // + // Management of subscriptions + // + /// <summary> + /// Dictionnary of susbscription informations for poses, for each item, stored using the UUID of the item (anchor/trackable) + /// </summary> + private Dictionary<Guid, SubscriptionInfo> m_subscriptionsPoses = new Dictionary<Guid, SubscriptionInfo>(); + + public struct SubscriptionInfo + { + public Guid uuid; // id of subscription (id is defined by the WA server) + public Guid uuidTarget; // id trackable or anchor + public DateTime timeValidity; //The duration of the validity of the subscription + public Pose pose; + //public PoseCallback callback; + } +#pragma warning restore CS1591 // Fehlendes XML-Kommentar für öffentlich sichtbaren Typ oder Element + /// <summary> /// Get information about a subscription /// </summary> public override IActionResult GetSubscription([FromRoute (Name = "subscriptionUUID")][Required]Guid subscriptionUUID, [FromHeader (Name = "token")]string token, [FromHeader (Name = "sessionID")]string sessionID) { + // todo: compare token and sessionID + return StatusCode(405, "Not supported yet!"); } @@ -85,12 +111,37 @@ namespace ETSI.ARF.OpenAPI.WorldAnalysis.Controllers /// </summary> public override IActionResult SubscribeToPose([FromBody]SubscribeToPoseRequest subscribeToPoseRequest, [FromHeader (Name = "token")]string token, [FromHeader (Name = "sessionID")]string sessionID) { + // todo: compare token and sessionID + + int validity = subscribeToPoseRequest.Validity; // todo: is to handle here or by the client? + + // We add the subscription + SubscriptionInfo sub = new SubscriptionInfo(); + sub.uuid = new Guid(); + sub.timeValidity = DateTime.Now.AddMilliseconds(validity / 1000.0f); + sub.pose = new Pose(); + sub.pose.Mode = subscribeToPoseRequest.Mode[0]; + sub.uuidTarget = subscribeToPoseRequest.Target; + m_subscriptionsPoses.Add(sub.uuid, sub); + SubscribeToPose200Response response = new SubscribeToPose200Response(); - response.Target = subscribeToPoseRequest.Target; - response.Mode = subscribeToPoseRequest.Mode[0]; - response.WebhookUrl = ""; - response.WebsocketUrl = Request.Host.ToString(); ; - + response.Uuid = sub.uuid; + response.Validity = validity; + response.Target = sub.uuidTarget; + response.Mode = sub.pose.Mode; + if (string.IsNullOrEmpty(subscribeToPoseRequest.WebhookUrl)) + { + response.WebhookUrl = ""; + response.WebsocketUrl = Request.Host.ToString(); + // Notice: starting websocket server is done autom. by the client, when calling "URL:/ws" + + // todo: register the client, so the websocket will send to it pose updates + } + else + { + response.WebhookUrl = subscribeToPoseRequest.WebhookUrl; + response.WebsocketUrl = null; + } return new ObjectResult(response); //return StatusCode(405, "Not supported yet!"); } @@ -100,6 +151,8 @@ namespace ETSI.ARF.OpenAPI.WorldAnalysis.Controllers /// </summary> public override IActionResult UnsubscribeFromPose([FromRoute (Name = "subscriptionUUID")][Required]Guid subscriptionUUID, [FromHeader (Name = "token")]string token, [FromHeader (Name = "sessionID")]string sessionID) { + // todo: compare token and sessionID + return StatusCode(405, "Not supported yet!"); } @@ -108,6 +161,8 @@ namespace ETSI.ARF.OpenAPI.WorldAnalysis.Controllers /// </summary> public override IActionResult UpdateSubscription([FromRoute (Name = "subscriptionUUID")][Required]Guid subscriptionUUID, [FromBody]UpdateSubscriptionRequest updateSubscriptionRequest, [FromHeader (Name = "token")]string token, [FromHeader (Name = "sessionID")]string sessionID) { + // todo: compare token and sessionID + return StatusCode(405, "Not supported yet!"); } } diff --git a/server/worldanalysis/src/ETSI.ARF.OpenAPI.WorldAnalysis/ETSI-ARF/ControllersImpl/WebSocketController.cs b/server/worldanalysis/src/ETSI.ARF.OpenAPI.WorldAnalysis/ETSI-ARF/ControllersImpl/WebSocketController.cs index 1ad10767b3f823d036e376261f5f9e4261d304e0..072271569df7a96b2b514511021fb4edc570cd96 100644 --- a/server/worldanalysis/src/ETSI.ARF.OpenAPI.WorldAnalysis/ETSI-ARF/ControllersImpl/WebSocketController.cs +++ b/server/worldanalysis/src/ETSI.ARF.OpenAPI.WorldAnalysis/ETSI-ARF/ControllersImpl/WebSocketController.cs @@ -166,7 +166,7 @@ namespace ETSI.ARF.OpenAPI.WorldAnalysis.Controllers if (firstTime) { // Register the client/module - if (msg.StartsWith("Module:")) + if (msg.StartsWith("RegisterModule:")) { registered = true; firstTime = false; @@ -179,7 +179,7 @@ namespace ETSI.ARF.OpenAPI.WorldAnalysis.Controllers await SendText(webSocket, "ARF World Analysis Server: You are now registered as a module: " + currentName); } } - else if (msg.StartsWith("Client:")) + else if (msg.StartsWith("RegisterClient:")) { registered = true; firstTime = false; @@ -200,13 +200,13 @@ namespace ETSI.ARF.OpenAPI.WorldAnalysis.Controllers } else if (registered) { - if (msg.StartsWith("StartSendingPose")) + if (msg.StartsWith("PoseStart")) { if (msg.Contains(':')) timeCnt = int.Parse(msg.Split(':')[1]); else timeCnt = 3; await SendPose(webSocket); } - else if (msg.StartsWith("Time")) + else if (msg.StartsWith("TimeStart")) { if (msg.Contains(':')) timeCnt = int.Parse(msg.Split(':')[1]); else timeCnt = 3; diff --git a/server/worldanalysis/src/ETSI.ARF.OpenAPI.WorldAnalysis/ETSI-ARF/WorldAnalysisModules.cs b/server/worldanalysis/src/ETSI.ARF.OpenAPI.WorldAnalysis/ETSI-ARF/WorldAnalysisModules.cs index 951472f76a19731d1b7877d92b8014378eb587d7..f4b3938d658a8f2a0852013ba111832b9412611a 100644 --- a/server/worldanalysis/src/ETSI.ARF.OpenAPI.WorldAnalysis/ETSI-ARF/WorldAnalysisModules.cs +++ b/server/worldanalysis/src/ETSI.ARF.OpenAPI.WorldAnalysis/ETSI-ARF/WorldAnalysisModules.cs @@ -41,6 +41,19 @@ namespace ETSI.ARF.OpenAPI.WorldAnalysis } return list; } + + public List<Capability> GetCapabilitiesFromUuid(Guid trackableOrAnchorUUID) + { + List<Capability> list = new List<Capability>(); + foreach (var item in modules) + { + // todo: Check if uuid has the capability? + // Get the world object from the storage via the module? + + list.AddRange(item.capabilities); + } + return list; + } } } #pragma warning restore CS1591 // Fehlendes XML-Kommentar für öffentlich sichtbaren Typ oder Element diff --git a/server/worldanalysis/src/ETSI.ARF.OpenAPI.WorldAnalysis/Program.cs b/server/worldanalysis/src/ETSI.ARF.OpenAPI.WorldAnalysis/Program.cs index 95e22062027cf8674a23366f548a3e07c48c5d15..1fba73140c56dfc242fd22c8b795c3bf7a51801f 100644 --- a/server/worldanalysis/src/ETSI.ARF.OpenAPI.WorldAnalysis/Program.cs +++ b/server/worldanalysis/src/ETSI.ARF.OpenAPI.WorldAnalysis/Program.cs @@ -27,7 +27,7 @@ namespace ETSI.ARF.OpenAPI.WorldAnalysis .ConfigureWebHostDefaults(webBuilder => { webBuilder.UseStartup<Startup>() - .UseUrls("http://0.0.0.0:8080/"); + .UseUrls("http://0.0.0.0:44301/"); // SylR: Wichtig!!! }); } }