private void Run()
        {
            Terminated = false;
            while (stop == false)
            {
                string tmp    = "";
                bool   Result = device.Scan(); //Returns true if buffer contains valid number of tics
                if (device.HALError.Code != HALErrorCode.OK)
                {
                    break;                                          //Error encountered
                }
                if (Result == true)
                {
                    Resource_MultiChannel Resource = device.ActiveDeviceDescription.Resource as Resource_MultiChannel;

                    //Receiveing Data
                    if (device.Grab() == true)
                    {//
                        if (device.HALError.CoreCode == HALCoreErrorCode.TickMiss)
                        {
                            device.HALError.Assign(device.ActiveDeviceDescription, HALErrorCode.OK); // Code = HALErrorCode.OK;
                            device.HALError.AssignCoreCode(HALCoreErrorCode.OK);                     //TickMiss
                        }
                        //Remember number of ticks in input buffer, those was read from FIFO to DataOut
                        int TicksReceived = Resource.DataBuffer.TicksReceived;
                        int ChannelCount  = Resource.InputHardwareChannelCountExternal;
                        int time_on_bus   = 0;
                        data = new int[ChannelCount, TicksReceived];
                        //process each channel in input, linked with current datasource
                        foreach (EmitterDescription em in Resource.EmitterFactory)
                        {
                            //Getting index of emitter channel in Data Out buffer
                            int HardwareIndex = em.HardwareIndex;
                            //Console.WriteLine(em.UID.ToString() + ' ' + em.HardwareIndex);
                            tmp += em.UID.ToString() + ' ' + em.HardwareIndex + newLine;
                            ThreadSupportEmitterData?.Invoke(this, tmp);
                            tmp = "";
                            if (HardwareIndex < 0)
                            {
                                continue;
                            }
                            for (long i = 0; i < TicksReceived; i++)
                            {
                                //Сырые данные полученные с прибора в единицах АЦП.
                                int value = Resource.DataBuffer.DataOut[i * ChannelCount + HardwareIndex];

                                if (em.UID == UID.AD0)
                                {
                                    if (value > 0)
                                    {
                                        UID    LogicalUID = (UID)((value & _UIDMask) >> 16);
                                        double Rvalue     = (double)(value & _RMask) / 10.0;
                                        //Attributes
                                        bool Active           = ((value & (uint)ImpedanceElementAttributes.Active) > 0) ? true : false;
                                        bool HardwareReferent = ((value & (uint)ImpedanceElementAttributes.Referent) > 0) ? true : false;
                                        Console.WriteLine(em.UID.ToString() + " UID " + LogicalUID.ToString() + " Rvalue " + Rvalue +
                                                          " Active " + Active + " HardwareReferent " + HardwareReferent);
                                    }
                                }
                                else if (em.UID == UID.AD1)
                                {
                                    if (value > 0)
                                    {
                                        /* UID.AD1 - Канал акселерометра.Значения датчиков положения тела. byte XAxis; byte YAxis;
                                         *  byte ZAxis;byte Reserved;  */
                                        byte[] ad1bytes = BitConverter.GetBytes(value);
                                        int    x        = ad1bytes[0];
                                        int    y        = ad1bytes[1];
                                        int    z        = ad1bytes[2];

                                        Console.WriteLine(em.UID.ToString() + " x " + x + " y " + y + " z " + z);
                                    }
                                }
                                else
                                {
                                    //Преобразуем значение в единицах АЦП в значение в микровольтах умножая на коэффициент квантования.
                                    float fValue    = value * em.UnitsPerSample;
                                    int   fValueInt = (int)fValue;
                                    //Преобразовываем в думерный массив

                                    data[em.HardwareIndex, i] = fValueInt;
                                }
                            }
                            time_on_bus += TicksReceived;
                        }
                        ThreadSupportTransformData?.Invoke(data);

                        ThreadSupportReseiveData?.Invoke(this, new EEGReseiveDataEventArgs((int[, ])data.Clone(), time_on_bus));
                    }
                }
                else
                {
                    Thread.Sleep(1);
                }
            }
            Terminated = true;
        }
        private void Run()
        {
            Terminated = false;
            while (stop == false)
            {
                string tmp    = "";
                bool   Result = device.Scan(); //Returns true if buffer contains valid number of tics
                if (device.HALError.Code != HALErrorCode.OK)
                {
                    break;                                          //Error encountered
                }
                if (Result == true)
                {
                    Resource_MultiChannel Resource = device.ActiveDeviceDescription.Resource as Resource_MultiChannel;

                    //Receiveing Data
                    if (device.Grab() == true)
                    {//
                        if (device.HALError.CoreCode == HALCoreErrorCode.TickMiss)
                        {
                            device.HALError.Assign(device.ActiveDeviceDescription, HALErrorCode.OK); // Code = HALErrorCode.OK;
                            device.HALError.AssignCoreCode(HALCoreErrorCode.OK);                     //TickMiss
                        }
                        //Remember number of ticks in input buffer, those was read from FIFO to DataOut
                        int TicksReceived = Resource.DataBuffer.TicksReceived;
                        int ChannelCount  = Resource.InputHardwareChannelCountExternal;
                        int time_on_bus   = 0;
                        data = new int[29, TicksReceived];
                        //process each channel in input, linked with current datasource
                        foreach (EmitterDescription em in Resource.EmitterFactory)
                        {
                            //Getting index of emitter channel in Data Out buffer
                            int HardwareIndex = em.HardwareIndex;
                            //Console.WriteLine(em.UID.ToString() + ' ' + em.HardwareIndex);
                            tmp += em.UID.ToString() + ' ' + em.HardwareIndex + newLine;
                            ThreadSupportEmitterData?.Invoke(this, tmp);
                            tmp = "";
                            if (HardwareIndex < 0)
                            {
                                continue;
                            }
                            for (long i = 0; i < TicksReceived; i++)
                            {
                                //Сырые данные полученные с прибора в единицах АЦП.
                                int value = Resource.DataBuffer.DataOut[i * ChannelCount + HardwareIndex];

                                if (em.UID.ToString() == "AD0")
                                {
                                    if (value != 0)
                                    {
                                        ImpedanceElement el = new ImpedanceElement(value);
                                        ad0Dictionary[el.LogicalUID] = (int)el.ResultValue;

                                        //Console.WriteLine(value.ToString("X8") + " " + el.ToString());
                                    }
                                }
                                else if (em.UID.ToString() == "AD1")
                                {
                                    if (value != 0)
                                    {
                                        /* UID.AD1 - Канал акселерометра.Значения датчиков положения тела. byte XAxis; byte YAxis;
                                         * byte ZAxis;byte Reserved;  */
                                        byte[] ad1bytes    = BitConverter.GetBytes(value);
                                        int[]  aclrmtr_arr = new int[] { ad1bytes[0], ad1bytes[1], ad1bytes[2] };
                                        //Console.WriteLine(em.UID.ToString() + " x " + x + " y " + y + " z " + z);
                                        ThreadSupportAccelerometerData?.Invoke(this, aclrmtr_arr);
                                    }
                                }
                                else
                                {
                                    //Преобразуем значение в единицах АЦП в значение в микровольтах умножая на коэффициент квантования.
                                    float fValue = value * em.UnitsPerSample;

                                    int fValueInt = (int)fValue;
                                    //if (fValue <0 )
                                    //    Console.WriteLine(em.UID.ToString() + ' ' + fValueInt);
                                    //Преобразовываем в думерный массив
                                    //data[em.HardwareIndex, i] = fValueInt;
                                    switch (em.UID)
                                    {
                                    case UID.FP1:
                                        data[0, i] = fValueInt;
                                        break;

                                    case UID.F3:
                                        data[1, i] = fValueInt;
                                        break;

                                    case UID.C3:
                                        data[2, i] = fValueInt;
                                        break;

                                    case UID.P3:
                                        data[3, i] = fValueInt;
                                        break;

                                    case UID.O1:
                                        data[4, i] = fValueInt;
                                        break;

                                    case UID.F7:
                                        data[5, i] = fValueInt;
                                        break;

                                    case UID.T3:
                                        data[6, i] = fValueInt;
                                        break;

                                    case UID.T5:
                                        data[7, i] = fValueInt;
                                        break;

                                    case UID.FZ:
                                        data[8, i] = fValueInt;
                                        break;

                                    case UID.PZ:
                                        data[9, i] = fValueInt;
                                        break;

                                    case UID.A1:
                                        data[10, i] = fValueInt;
                                        break;

                                    case UID.FP2:
                                        data[11, i] = fValueInt;
                                        break;

                                    case UID.F4:
                                        data[12, i] = fValueInt;
                                        break;

                                    case UID.C4:
                                        data[13, i] = fValueInt;
                                        break;

                                    case UID.P4:
                                        data[14, i] = fValueInt;
                                        break;

                                    case UID.O2:
                                        data[15, i] = fValueInt;
                                        break;

                                    case UID.F8:
                                        data[16, i] = fValueInt;
                                        break;

                                    case UID.T4:
                                        data[17, i] = fValueInt;
                                        break;

                                    case UID.T6:
                                        data[18, i] = fValueInt;
                                        break;

                                    case UID.COMPLEX1:
                                        data[19, i] = fValueInt;
                                        break;

                                    case UID.CZ:
                                        data[20, i] = fValueInt;
                                        break;

                                    case UID.COMPLEX2:
                                        data[21, i] = fValueInt;
                                        break;

                                    case UID.BIO1:
                                        data[22, i] = fValueInt;
                                        data[23, i] = fValueInt;
                                        data[24, i] = fValueInt;
                                        data[25, i] = fValueInt;
                                        data[26, i] = fValueInt;
                                        data[27, i] = fValueInt;
                                        data[28, i] = fValueInt;
                                        break;
                                    }
                                }
                            }
                            time_on_bus += TicksReceived;
                        }
                        ThreadSupportAD0Data(this, ad0Dictionary);
                        ThreadSupportTransformData?.Invoke(data);
                        ThreadSupportReseiveData?.Invoke(this, new EEGReseiveDataEventArgs((int[, ])data.Clone(), time_on_bus));
                    }
                }
                else
                {
                    Thread.Sleep(1);
                }
            }
            Terminated = true;
        }