// Handler for all messages from the Gateway private void OnMessageHandler(object sender, MessageEventArgs e) { //Debug.Log(e.Data); if (e.Data.Contains("cmd=position")) { Vector3 position = Vector3.zero; Vector3 orientation = Vector3.zero; Quaternion orientation_quat = Quaternion.identity; string[] datasbytag = e.Data.Split(new string[] { "&uid=" }, System.StringSplitOptions.RemoveEmptyEntries); for (int i = 1; i < datasbytag.Length; i++) { bool positionUpdated = false; bool orientationUpdated = false; bool orientationQuaternion = false; bool timestampUpdated = false; string[] datas = datasbytag[i].Split('&'); string uid = datas[0]; foreach (string data in datas) { string[] datasplit = data.Split('='); // Position // Position if (datasplit[0] == "x") { positionUpdated = true; position.x = float.Parse(datasplit[1], System.Globalization.NumberStyles.Any, System.Globalization.CultureInfo.InvariantCulture); } else if (datasplit[0] == "z") { positionUpdated = true; position.y = float.Parse(datasplit[1], System.Globalization.NumberStyles.Any, System.Globalization.CultureInfo.InvariantCulture); } else if (datasplit[0] == "y") { positionUpdated = true; position.z = float.Parse(datasplit[1], System.Globalization.NumberStyles.Any, System.Globalization.CultureInfo.InvariantCulture); } else if (datasplit[0] == "ts") { timestamp = int.Parse(datasplit[1]); timestampUpdated = true; } // Orientation else if (datasplit[0] == "ox") { orientationUpdated = true; // Debug.Log("Received orientation info for " + uid); orientation.y = -float.Parse(datasplit[1], System.Globalization.NumberStyles.Any, System.Globalization.CultureInfo.InvariantCulture); orientation_quat.x = -orientation.y; } else if (datasplit[0] == "oy") { orientation.x = -float.Parse(datasplit[1], System.Globalization.NumberStyles.Any, System.Globalization.CultureInfo.InvariantCulture); orientation_quat.y = -orientation.x; } else if (datasplit[0] == "oz") { orientation.z = float.Parse(datasplit[1], System.Globalization.NumberStyles.Any, System.Globalization.CultureInfo.InvariantCulture); orientation_quat.z = orientation.z; } else if (datasplit[0] == "ow") { orientationQuaternion = true; orientation_quat.w = -float.Parse(datasplit[1], System.Globalization.NumberStyles.Any, System.Globalization.CultureInfo.InvariantCulture); } } foreach (VRTracker.Manager.VRT_Tag tag in VRTracker.Manager.VRT_Manager.Instance.tags) { if (tag.UID == uid) { if (orientationUpdated) { if (orientationQuaternion) { if (!tag.trackedEndpoints.ContainsKey(0)) { VRT_TagEndpoint endpoint = tag.gameObject.AddComponent <VRT_TagEndpoint>(); endpoint.SetTag(tag); tag.trackedEndpoints.Add(0, endpoint); } tag.trackedEndpoints[0].UpdateOrientationQuat(orientation_quat); } else { if (!tag.trackedEndpoints.ContainsKey(0)) { VRT_TagEndpoint endpoint = tag.gameObject.AddComponent <VRT_TagEndpoint>(); endpoint.SetTag(tag); tag.trackedEndpoints.Add(0, endpoint); } tag.trackedEndpoints[0].UpdateOrientation(orientation); } } if (positionUpdated) { if (!timestampUpdated) { if (!tag.trackedEndpoints.ContainsKey(0)) { VRT_TagEndpoint endpoint = tag.gameObject.AddComponent <VRT_TagEndpoint>(); endpoint.SetTag(tag); tag.trackedEndpoints.Add(0, endpoint); } tag.trackedEndpoints[0].UpdatePosition(position); } else { if (!tag.trackedEndpoints.ContainsKey(0)) { VRT_TagEndpoint endpoint = tag.gameObject.AddComponent <VRT_TagEndpoint>(); endpoint.SetTag(tag); tag.trackedEndpoints.Add(0, endpoint); } tag.trackedEndpoints[0].UpdatePosition(position, timestamp); } } } } } } else if (e.Data.Contains("cmd=specialcmd")) { string[] datas = e.Data.Split('&'); string uid = null; string command = null; foreach (string data in datas) { string[] datasplit = data.Split('='); // Tag UID sending the special command if (datasplit[0] == "uid") { uid = datasplit[1]; } // Special Command name else if (datasplit[0] == "data") { command = datasplit[1]; } } if (uid != null && command != null) { ReceiveSpecialCommand(uid, command); } } else if (e.Data.Contains("cmd=taginfos")) { string[] datas = e.Data.Split('&'); string uid = null; string status = null; int battery = 0; string version = ""; foreach (string data in datas) { string[] datasplit = data.Split('='); // Tag UID sending its informations if (datasplit[0] == "uid") { uid = datasplit[1]; } // Tag status (“lost”, “tracking”, “unassigned”) else if (datasplit[0] == "status") { status = datasplit[1]; } // Tag battery else if (datasplit[0] == "battery") { battery = int.Parse(datasplit[1]); } // Tag version else if (datasplit[0] == "version") { version = datasplit[1]; } } if (uid != null && status != null) { ReceiveTagInformations(uid, status, battery, version); } } else if (e.Data.Contains("cmd=tag")) { // Tag V2 data string[] datas = e.Data.Split('&'); string uid = null; foreach (string data in datas) { string[] datasplit = data.Split('='); // Tag UID sending the special command if (datasplit[0] == "uid") { uid = datasplit[1]; } } if (uid != null) { ReceiveSpecialData(uid, e.Data); } } else if (e.Data.Contains("cmd=error")) { // TODO Parse differnt kinds of errors Debug.LogWarning("VR Tracker : " + e.Data); if (e.Data.Contains("needmacadress")) { myws.SendAsync("cmd=mac&uid=" + VRTracker.Manager.VRT_Manager.Instance.UserUID, OnSendComplete); foreach (VRTracker.Manager.VRT_Tag tag in VRTracker.Manager.VRT_Manager.Instance.tags) { if (tag.UID != "Enter Your Tag UID") { AssignTag(tag.UID); } } } } else if (e.Data.Contains("function=needaddress")) { ReceiveAskServerIP(); } //if the message gives us an IP address, try to connect as a client to it else if (e.Data.Contains("function=address")) { string[] datas = e.Data.Split('&'); foreach (string data in datas) { string[] infos = data.Split('='); if (infos[0] == "ip") { //Debug.Log("IP received " + infos[1]); ReceiveServerIP(infos[1]); } } } else if (e.Data.Contains("cmd=availabletag")) { string[] datas = e.Data.Split('&'); // Verify if Tags connected to the system can be assoicated to the User from association File foreach (string data in datas) { string[] datasplit = data.Split('='); if (datasplit[0].Contains("tag")) { VRTracker.Manager.VRT_Manager.Instance.AddAvailableTag(datasplit[1]); } } } else if (e.Data.Contains("cmd=reoriente")) { string uid = null; string[] datas = e.Data.Split('&'); foreach (string data in datas) { string[] datasplit = data.Split('='); // Tag UID sending the special command if (datasplit[0] == "uid") { uid = datasplit[1]; } } foreach (VRTracker.Manager.VRT_Tag tag in VRTracker.Manager.VRT_Manager.Instance.tags) { if (tag.UID == uid) { Debug.Log("Resetting orientation after receiving message"); tag.ResetOrientation(); } } } else if (e.Data.Contains("cmd=offset")) { string[] datas = e.Data.Split('&'); foreach (string data in datas) { string[] datasplit = data.Split('='); // Tag UID sending the special command if (datasplit[0] == "oy") { float f; // Update rotation offset only if not null if (float.TryParse(datasplit[1], System.Globalization.NumberStyles.Any, System.Globalization.CultureInfo.InvariantCulture, out f)) { VRTracker.Manager.VRT_Manager.Instance.roomNorthOffset = f; } } } } else if (e.Data.Contains("cmd=boundaries")) { Debug.LogWarning(e.Data); string[] datas = e.Data.Split('&'); float xmin = 0.0f; float ymin = 0.0f; float xmax = 0.0f; float ymax = 0.0f; bool newBoundary = false; foreach (string data in datas) { string[] datasplit = data.Split('='); // Tag UID sending the special command if (datasplit[0] == "xmin") { xmin = float.Parse(datasplit[1], System.Globalization.NumberStyles.Any, System.Globalization.CultureInfo.InvariantCulture); newBoundary = true; } else if (datasplit[0] == "xmax") { xmax = float.Parse(datasplit[1], System.Globalization.NumberStyles.Any, System.Globalization.CultureInfo.InvariantCulture); } else if (datasplit[0] == "ymin") { ymin = float.Parse(datasplit[1], System.Globalization.NumberStyles.Any, System.Globalization.CultureInfo.InvariantCulture); } else if (datasplit[0] == "ymax") { ymax = float.Parse(datasplit[1], System.Globalization.NumberStyles.Any, System.Globalization.CultureInfo.InvariantCulture); } else if (datasplit[0] == "data") { ReceiveBoundaries(datasplit[1]); } } //Handle boundaries if (newBoundary) { CreateNewBoundaries(xmin, xmax, ymin, ymax); } } else if (e.Data.Contains("cmd=newtag") || e.Data.Contains("cmd=rectag")) { //TODO Improve implementation string[] datas = e.Data.Split('&'); foreach (string data in datas) { string[] datasplit = data.Split('='); if (datasplit[0].Contains("uid")) { foreach (VRTracker.Manager.VRT_Tag tag in VRTracker.Manager.VRT_Manager.Instance.tags) { if (tag.UID == datasplit[1]) { Debug.Log("Tag " + tag.UID + " is back ON !"); AssignTag(tag.UID); break; } } } } } //if the message gives us an IP address, try to connect as a client to it else if (e.Data.Contains("function=address")) { string[] datas = e.Data.Split('&'); foreach (string data in datas) { string[] infos = data.Split('='); if (infos[0] == "ip") { ReceiveServerIP(infos[1]); } } } else { // Debug.LogWarning("VR Tracker : Unknown data received : " + e.Data); } }
/// <summary> /// Raises the tag data event. /// Handle the data received from the tag /// </summary> /// <param name="data">Data.</param> public virtual void OnTagData(string data) { //Debug.LogWarning(data); string[] sensors = data.Split(new string[] { "&s=" }, System.StringSplitOptions.RemoveEmptyEntries); for (int i = 1; i < sensors.Length; i++) { string[] parameters = sensors[i].Split('&'); char[] sensorInfo = parameters[0].ToCharArray(); if (sensorInfo.Length != 2) { return; } Dictionary <string, string> values = new Dictionary <string, string>(); for (int j = 1; j < parameters.Length; j++) { string[] dict = parameters[j].Split('='); values.Add(dict[0], dict[1]); } // IMU if (sensorInfo[0] == '1') { Vector3 rec_orientation; Vector3 rec_acceleration; double f; double.TryParse(values["ox"], System.Globalization.NumberStyles.Any, System.Globalization.CultureInfo.InvariantCulture, out f); rec_orientation.x = (float)f; double.TryParse(values["oy"], System.Globalization.NumberStyles.Any, System.Globalization.CultureInfo.InvariantCulture, out f); rec_orientation.y = (float)f; double.TryParse(values["oz"], System.Globalization.NumberStyles.Any, System.Globalization.CultureInfo.InvariantCulture, out f); rec_orientation.z = (float)f; double.TryParse(values["ax"], System.Globalization.NumberStyles.Any, System.Globalization.CultureInfo.InvariantCulture, out f); rec_acceleration.x = (float)(f * (9.80665 / 1000.0f)); double.TryParse(values["ay"], System.Globalization.NumberStyles.Any, System.Globalization.CultureInfo.InvariantCulture, out f); rec_acceleration.y = (float)(f * (9.80665 / 1000)); double.TryParse(values["az"], System.Globalization.NumberStyles.Any, System.Globalization.CultureInfo.InvariantCulture, out f); rec_acceleration.z = (float)(f * (9.80665 / 1000)); VRT_TagEndpoint endpoint = gameObject.AddComponent <VRT_TagEndpoint>(); endpoint.SetTag(this); if (!trackedEndpoints.ContainsKey(0)) { trackedEndpoints.Add(0, endpoint); } trackedEndpoints[0].UpdateOrientationAndAcceleration(rec_orientation, rec_acceleration); } // Trackpad else if (sensorInfo[0] == '3') { string press = values["st"]; if (press == "2") { trackpadTouch = false; trackpadUp = true; } else if (press == "1" || press == "3") { trackpadTouch = true; trackpadDown = true; } float a, b; float.TryParse(values["x"], System.Globalization.NumberStyles.Any, System.Globalization.CultureInfo.InvariantCulture, out a); trackpadXY.y = -(a - (Mathf.Abs(trackpadMaxLeft - trackpadMaxRight) / 2)) / Mathf.Abs(trackpadMaxLeft - trackpadMaxRight); float.TryParse(values["y"], System.Globalization.NumberStyles.Any, System.Globalization.CultureInfo.InvariantCulture, out b); trackpadXY.x = -(b - (Mathf.Abs(trackpadMaxUp - trackpadMaxDown) / 2)) / Mathf.Abs(trackpadMaxUp - trackpadMaxDown); if (a == 0.0f && b == 0.0f) { trackpadXY = Vector2.zero; } } } }