Esempio n. 1
0
        // 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);
            }
        }
Esempio n. 2
0
        /// <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;
                    }
                }
            }
        }