private IEnumerator ConnectToMyndband()
    {
        clientSocket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
        while (clientSocket == null || !clientSocket.Connected)
        {
            myndbandState = MyndbandState.Connecting;
            onMyndbandStateChanged.Invoke(Enum.GetName(typeof(MyndbandState), myndbandState), "Establishing connection to ThinkGear Socket..");
            yield return(new WaitForSeconds(0.5f));

            try {
                clientSocket.Connect(new IPEndPoint(IPAddress.Parse("127.0.0.1"), 13854));
            } catch (SocketException e)
            {
                UnityEngine.Debug.LogError(e.Message);
                myndbandState = MyndbandState.Disconnected;
                onMyndbandStateChanged.Invoke(Enum.GetName(typeof(MyndbandState), myndbandState), "Could not connect to the ThinkGear Socket..");
            }
            if (myndbandState == MyndbandState.Disconnected)
            {
                yield return(new WaitForSeconds(2f));
            }
        }
        onMyndbandStateChanged.Invoke(Enum.GetName(typeof(MyndbandState), myndbandState), "Waiting for data..Make sure that Myndband is paired with PC.");
        byte[] myWriteBuffer = Encoding.ASCII.GetBytes(@"{""enableRawOutput"": true, ""format"": ""Json""}");
        SendData(myWriteBuffer);
        stream = new NetworkStream(clientSocket, true);
        StateObject state = new StateObject();

        state.workSocket = clientSocket;
        stream.BeginRead(state.buffer, 0, StateObject.BufferSize, new AsyncCallback(ReceiveCallback), state);
        StartCoroutine("ParseData");
        yield return(null);
    }
 void Start()
 {
     if (instance == null)
     {
         instance = this;
     }
     DontDestroyOnLoad(this);
     rawEegPacketList         = new List <MyndbandEvent>();
     loggedRawEegList         = new List <MyndbandEvent>();
     myndbandPacketList       = new List <MyndbandEvent>();
     loggedmyndbandPacketList = new List <MyndbandEvent>();
     myndbandState            = MyndbandState.Disconnected;
     onMyndbandStateChanged.Invoke(Enum.GetName(typeof(MyndbandState), myndbandState), "");
     StartCoroutine("ConnectToMyndband");
 }
    private IEnumerator ParseData()
    {
        while (true)
        {
            if (rawEegPacketList.Count > 0)
            {
                if (myndbandState == MyndbandState.Connecting)
                {
                    myndbandState = MyndbandState.ReceivingData;
                }
                rawEegData = null;
                try {
                    rawEegData = (IDictionary)JsonConvert.Import(typeof(IDictionary), rawEegPacketList.Last().packet);
                } catch (System.Exception e) {
                }
                if (rawEegData != null)
                {
                    if (myndbandState != MyndbandState.ReceivingData)
                    {
                        myndbandState = MyndbandState.ReceivingData;
                        StartCoroutine("UpdateSignalStrength");
                    }
                    if (UpdateRawdataEvent != null)
                    {
                        UpdateRawdataEvent(int.Parse(rawEegData["rawEeg"].ToString()));
                    }
                }
            }
            if (myndbandPacketList.Count > 0)
            {
                myndbandData = null;
                try {
                    myndbandData = (IDictionary)JsonConvert.Import(typeof(IDictionary), myndbandPacketList.Last().packet);
                } catch (System.Exception e) {
                }

                if (myndbandData != null)
                {
                    if (myndbandData.Contains("status"))
                    {
                        if (myndbandState != MyndbandState.Connected && myndbandState != MyndbandState.ReceivingData)
                        {
                            myndbandState = MyndbandState.Connected;
                            string subStatus = "Socket is " + myndbandData["status"].ToString() + "..Make sure that Myndband is paired with PC.";
                            onMyndbandStateChanged.Invoke(Enum.GetName(typeof(MyndbandState), myndbandState), subStatus);
                        }
                    }
                    if (myndbandData.Contains("poorSignalLevel"))
                    {
                        signalStrength = int.Parse(myndbandData["poorSignalLevel"].ToString());
                        if (UpdatePoorSignalEvent != null)
                        {
                            UpdatePoorSignalEvent(int.Parse(myndbandData["poorSignalLevel"].ToString()));
                        }

                        if (myndbandData.Contains("eSense"))
                        {
                            IDictionary eSense = (IDictionary)myndbandData["eSense"];
                            if (UpdateAttentionEvent != null)
                            {
                                UpdateAttentionEvent(int.Parse(eSense["attention"].ToString()));
                            }
                            if (UpdateMeditationEvent != null)
                            {
                                UpdateMeditationEvent(int.Parse(eSense["meditation"].ToString()));
                            }
                        }

                        if (myndbandData.Contains("eegPower"))
                        {
                            IDictionary eegPowers = (IDictionary)myndbandData["eegPower"];
                            if (UpdateDeltaEvent != null)
                            {
                                UpdateDeltaEvent(float.Parse(eegPowers["delta"].ToString()));
                            }
                            if (UpdateThetaEvent != null)
                            {
                                UpdateThetaEvent(float.Parse(eegPowers["theta"].ToString()));
                            }
                            if (UpdateLowAlphaEvent != null)
                            {
                                UpdateLowAlphaEvent(float.Parse(eegPowers["lowAlpha"].ToString()));
                            }
                            if (UpdateHighAlphaEvent != null)
                            {
                                UpdateHighAlphaEvent(float.Parse(eegPowers["highAlpha"].ToString()));
                            }
                            if (UpdateLowBetaEvent != null)
                            {
                                UpdateLowBetaEvent(float.Parse(eegPowers["lowBeta"].ToString()));
                            }
                            if (UpdateHighBetaEvent != null)
                            {
                                UpdateHighBetaEvent(float.Parse(eegPowers["highBeta"].ToString()));
                            }
                            if (UpdateLowGammaEvent != null)
                            {
                                UpdateLowGammaEvent(float.Parse(eegPowers["lowGamma"].ToString()));
                            }
                            if (UpdateHighGammaEvent != null)
                            {
                                UpdateHighGammaEvent(float.Parse(eegPowers["highGamma"].ToString()));
                            }
                        }
                    }
                    else if (myndbandData.Contains("blinkStrength") && UpdateBlinkEvent != null)
                    {
                        UpdateBlinkEvent(int.Parse(myndbandData["blinkStrength"].ToString()));
                    }
                }
            }
            yield return(new WaitForSeconds(updateFrequency));
        }
    }