/*
     * \param str is the csv formated file
     */
    public void parse(string str)
    {
        this.myAnchorDataList.Clear();

        //string fileData = System.IO.File.ReadAllText(data);
        string[] lines    = str.Split("\n"[0]);
        string[] lineData = (lines[0].Trim()).Split(";"[0]);

        timestamp = Int32.Parse(lineData[0]);
        //Debug.Log("timestamp:" + timestamp);
        if (lineData[1] == "[UWB] LEv1")
        {
            for (int i = 0; i < nbOfAnchors; i++)
            {
                MyAnchorData anchorData = new MyAnchorData();
                anchorData.anchorId = i + 1;
                anchorData.distance = Int32.Parse(lineData[2 + i * 2]);
                anchorData.power    = Int32.Parse(lineData[3 + i * 2]);

                //anchorData.print();
                this.myAnchorDataList.Add(anchorData);
            }

            myLeResult.X = Int32.Parse(lineData[16]);
            myLeResult.Y = Int32.Parse(lineData[17]);
            myLeResult.Z = Int32.Parse(lineData[18]);
        }
        else
        {
            Debug.Log("invalid line format");
        }
    }
    // Read messages from the server
    private void OnIncomingData(string data)
    {
        string[] aData = data.Split('|');
        Debug.Log("Received from server: " + data);
        text_log_view.text = data + "\r\n";

        MyAnchorData       anchorData = new MyAnchorData();
        MyAnchorDataParser parser     = new MyAnchorDataParser(7);

        parser.parse(data);
        anchorData = parser.getAnchorData(1);

        //Debug.Log("anchorData " + anchorData.distance +"cm, "+ anchorData.power +"dBm");
        float dist = anchorData.distance / 10.0f;// / 100.0f;

        mySphere.transform.localScale = new Vector3(dist, dist, dist);

        //myRenderer = mySphere.GetComponent<MeshRenderer>();
        Color color = myRenderer.material.color;

        color.a = (anchorData.power + 109.0f) / 109.0f;
        myRenderer.material.color = color;

        MyLeResultClass leResult = parser.getLeResultData();

        myCharacter.transform.position = new Vector3(leResult.X, 1, leResult.Y);

#if MY_TEST
        switch (aData[0])
        {
        case "WhoAreYou":
            Send("Iam|" + clientName + "|" + password);
            break;

        case "Authenticated":
            SceneManager.LoadScene("ClientGameView");
            break;

        case "UnitSpawned":
            GameObject prefab  = Resources.Load("Prefabs/Unit1") as GameObject;
            GameObject go      = Instantiate(prefab);
            float      parsedX = float.Parse(aData[3], culture);
            float      parsedY = float.Parse(aData[4], culture);
            float      parsedZ = float.Parse(aData[5], culture);
            go.GetComponent <NavMeshAgent>().Warp(new Vector3(parsedX, parsedY, parsedZ));
            Unit un = go.AddComponent <Unit>();
            unitsOnMap.Add(un);
            int parsed;
            Int32.TryParse(aData[2], out parsed);
            un.unitID = parsed;

            if (aData[1] == clientName)
            {
                un.isPlayersUnit = true;
            }
            else
            {
                un.isPlayersUnit = false;
            }
            break;

        case "UnitMoved":
            if (aData[1] == clientName)
            {
                return;
            }
            else
            {
                Int32.TryParse(aData[2], out parsed);
                foreach (Unit unit in unitsOnMap)
                {
                    if (unit.unitID == parsed)
                    {
                        parsedX = float.Parse(aData[3], culture);
                        parsedY = float.Parse(aData[4], culture);
                        parsedZ = float.Parse(aData[5], culture);
                        unit.MoveTo(new Vector3(parsedX, parsedY, parsedZ));
                    }
                }
            }
            break;

        case "Synchronizing":
            int numberOfUnitsOnServersMap;
            Int32.TryParse(aData[1], out numberOfUnitsOnServersMap);
            int   serverUnitID;
            int[] serverUnitIDs = new int[numberOfUnitsOnServersMap];
            for (int i = 0; i < numberOfUnitsOnServersMap; i++)
            {
                Int32.TryParse(aData[2 + i * 4], out serverUnitID);
                serverUnitIDs[i] = serverUnitID;
                bool didFind = false;
                foreach (Unit unit in unitsOnMap)     //synchronize existing units
                {
                    if (unit.unitID == serverUnitID)
                    {
                        parsedX = float.Parse(aData[3 + i * 4], culture);
                        parsedY = float.Parse(aData[4 + i * 4], culture);
                        parsedZ = float.Parse(aData[5 + i * 4], culture);
                        unit.MoveTo(new Vector3(parsedX, parsedY, parsedZ));
                        didFind = true;
                    }
                }
                if (!didFind)     //add non-existing (at client) units
                {
                    prefab = Resources.Load("Prefabs/Unit1") as GameObject;
                    go     = Instantiate(prefab);
                    un     = go.AddComponent <Unit>();
                    unitsOnMap.Add(un);
                    un.unitID = serverUnitID;
                    parsedX   = float.Parse(aData[3 + i * 4], culture);
                    parsedY   = float.Parse(aData[4 + i * 4], culture);
                    parsedZ   = float.Parse(aData[5 + i * 4], culture);
                    go.GetComponent <NavMeshAgent>().Warp(new Vector3(parsedX, parsedY, parsedZ));
                }
            }
            //remove units which are not on server's list (like disconnected ones)
            foreach (Unit unit in unitsOnMap)
            {
                bool exists = false;
                for (int i = 0; i < serverUnitIDs.Length; i++)
                {
                    if (unit.unitID == serverUnitIDs[i])
                    {
                        exists = true;
                    }
                }
                if (!exists)
                {
                    Destroy(unit.gameObject);
                    unitsOnMap.Remove(unit);
                }
            }
            break;

        default:
            Debug.Log("Unrecognizable command received");
            break;
        }
#endif
    }