private void RunLoop()
        {
            /* IEnumerable<PXCMCapture.DeviceInfo> devices = this.GetDevices();
             if (devices.Count() == 0)
             {
                 throw new Smithers.Reading.FrameData.ScannerNotFoundException("No devices found");
             }
             PXCMCapture.DeviceInfo device = devices.First();
             if (devices.Count() > 1)
             {
                 Console.WriteLine(String.Format("More than one device, using this one: {0}", device.name));
             }
             _senseManager.captureManager.FilterByDeviceInfo(device);*/

            pxcmStatus status;
            status = _senseManager.EnableStream(PXCMCapture.StreamType.STREAM_TYPE_COLOR, Frame.COLOR_WIDTH, Frame.COLOR_HEIGHT, Frame.COLOR_RATE);
            if (status != pxcmStatus.PXCM_STATUS_NO_ERROR)
            {
                _logger.info("Unable to enable color stream:" + status.ToString());
                throw new Smithers.Reading.FrameData.ScannerNotFoundException("Unable to enable color stream");
            }

            _logger.info("Color Stream Enabled:" + status.ToString());
            //status = _senseManager.EnableStream(PXCMCapture.StreamType.STREAM_TYPE_DEPTH, 0, 0, Frame.DEPTH_RATE);
            status = _senseManager.EnableStream(PXCMCapture.StreamType.STREAM_TYPE_DEPTH, Frame.DEPTH_WIDTH, Frame.DEPTH_HEIGHT, Frame.DEPTH_RATE);
            if (status != pxcmStatus.PXCM_STATUS_NO_ERROR)
            {
                _logger.info("Unable to enable depth stream:" + status.ToString());
                throw new Smithers.Reading.FrameData.ScannerNotFoundException("Unable to enable depth stream");
            }

            _logger.info("Depth Stream Enabled:" + status.ToString());

            //status = _senseManager.EnableStream(PXCMCapture.StreamType.STREAM_TYPE_LEFT, Frame.DEPTH_WIDTH, Frame.DEPTH_HEIGHT, Frame.DEPTH_RATE);
            //if (status != pxcmStatus.PXCM_STATUS_NO_ERROR)
            //{
            //    throw new Smithers.Reading.FrameData.ScannerNotFoundException("Unable to enable depth stream");
            //}

            //status = _senseManager.EnableStream(PXCMCapture.StreamType.STREAM_TYPE_RIGHT, Frame.DEPTH_WIDTH, Frame.DEPTH_HEIGHT, Frame.DEPTH_RATE);
            //if (status != pxcmStatus.PXCM_STATUS_NO_ERROR)
            //{
            //    throw new Smithers.Reading.FrameData.ScannerNotFoundException("Unable to enable depth stream");
            //}
            status = _senseManager.EnableScenePerception();
            if (status != pxcmStatus.PXCM_STATUS_NO_ERROR)
            {
                _logger.info("Unable to enable scene perception:" + status.ToString());
                throw new Smithers.Reading.FrameData.ScannerNotFoundException("Scene Perception failed");
            }
            _logger.info("Scene Perception Enabled:" + status.ToString());

            _perceptionHandle = _senseManager.QueryScenePerception();

            status = _senseManager.Init();
            if (status != pxcmStatus.PXCM_STATUS_NO_ERROR)
            {
                _logger.info("Unable to open sensor in the above mode:" + status.ToString());
                throw new Smithers.Reading.FrameData.ScannerNotFoundException("Init failed");
            }

            _logger.info("Sensor Initialized Successfully:" + status.ToString());

            PXCMImage.ImageInfo depthInfo = new PXCMImage.ImageInfo();
            PXCMImage.ImageInfo colorInfo = new PXCMImage.ImageInfo();

            depthInfo.height = Frame.DEPTH_HEIGHT;
            depthInfo.width = Frame.DEPTH_WIDTH;
            colorInfo.height = Frame.COLOR_HEIGHT;
            colorInfo.width = Frame.COLOR_WIDTH;

            /* For UV Mapping & Projection only: Save certain properties */
            Projection projection = new Projection(_senseManager.session, _senseManager.captureManager.device, depthInfo, colorInfo);

            AccelerometerReading accelerometerReading;

            AccelerometerStats acceleroStats = new AccelerometerStats();
            //bool firstFrameRecord = true;
               // bool firstFrameNotRecord = false;
            //pxcmStatus stsInitRecord = pxcmStatus.PXCM_STATUS_PROCESS_FAILED;
            while (!_stop)
            {
                //PXCMCapture.Device.MirrorMode mirrorMode = this.Mirrored ? PXCMCapture.Device.MirrorMode.MIRROR_MODE_HORIZONTAL : PXCMCapture.Device.MirrorMode.MIRROR_MODE_DISABLED;
                //{
                //    _senseManager.captureManager.device.SetMirrorMode(mirrorMode);
                //}

                /* Wait until a frame is ready: Synchronized or Asynchronous */

                //if ((Record || Playback) && firstFrameRecord)
                //{
                //    stsInitRecord = InitRecordPlay();
                //    if (this.StartCapture != null)
                //    {
                //        EventArgs eventArgs = new EventArgs();
                //        this.StartCapture(this, eventArgs);
                //    }
                //    firstFrameRecord = false;
                //    firstFrameNotRecord = true;
                //}
                //if (!Record && !Playback && firstFrameNotRecord)
                //{
                //    InitRecordPlay();
                //    if (this.ShotSavedSuccess != null)
                //    {
                //        EventArgs eventArgs = new EventArgs();
                //        this.ShotSavedSuccess(this, eventArgs);
                //    }
                //    firstFrameRecord = true;
                //    firstFrameNotRecord = false;
                //}
                //-------
                status = _senseManager.AcquireFrame(this.Synced);
                if (status != pxcmStatus.PXCM_STATUS_NO_ERROR)
                {
                    continue;
                }
                MemoryFrame frame = _pool.ObjectFromPool();
                ///* Display images */

                PXCMCapture.Sample sample;

                sample = _senseManager.QueryScenePerceptionSample();

                if (sample == null)
                    sample = _senseManager.QuerySample();

                //if (_perceptionHandle != null && sample !=null)
                //{
                //    _perceptionHandle.GetCameraPose(frame.CameraPose);
                //    frame.TrackingAccuracy = _perceptionHandle.QueryTrackingAccuracy().ToString();
                //    frame.VoxelResolution = _perceptionHandle.QueryVoxelResolution().ToString();

                //    float sceneQuality = _perceptionHandle.CheckSceneQuality(sample);

                //    if (sceneQuality > 0.3f && _perceptionPaused && !_capturing)
                //    {
                //        _perceptionPaused = false;
                //        _senseManager.PauseScenePerception(false);
                //        _perceptionHandle.Reset(_initPose);
                //    }
                //    else if (!(frame.TrackingAccuracy == "HIGH" || frame.TrackingAccuracy == "MID") && !_capturing)
                //    {
                //        ResetScenePerception();
                //    }
                //}

                //if (this.Accelerometer != null)
                //{
                //    accelerometerReading =  Accelerometer.GetCurrentReading();
                //    acceleroStats.accX = accelerometerReading.AccelerationX;
                //    acceleroStats.accY = accelerometerReading.AccelerationY;
                //    acceleroStats.accZ = accelerometerReading.AccelerationZ;
                //    acceleroStats.timestamp = accelerometerReading.Timestamp;

                //    frame.AcceleroStats = acceleroStats;
                //}

                if (sample.color != null)
                {
                    sample.color.CopyToByteArray(frame.BufferColor);

                    frame.ColorTimeStamp = sample.color.QueryTimeStamp();
                }
                if (sample.depth != null)
                {
                    sample.depth.CopyToByteArray(frame.BufferDepth);
                    sample.depth.CopyToByteArray(frame.BufferDepthPreview, true);

                    frame.DepthTimeStamp = sample.depth.timeStamp;
                }

            #if DEBUG
                if (sample.left != null)
                {
                    sample.left.CopyToByteArray(frame.BufferIRLeft);
                }

                if (sample.right != null)
                {
                    sample.right.CopyToByteArray(frame.BufferIRRight);
                }

                // Get mapping.
                if (sample.depth != null)
                {
                    projection.DepthToCameraCoordinates(sample.depth, frame.DepthToCameraMapping);
                }
            #endif
                //frame.LowConfidenceDepthValue = projection.InvalidDepthValue;

                using (Handle<MemoryFrame> frameHandle = new Handle<MemoryFrame>(frame, _pool))
                {
                    FrameArrivedEventArgs eventArgs = new FrameArrivedEventArgs() { FrameHandle = frameHandle };

                    if (this.FrameArrived != null)
                    {
                        this.FrameArrived(this, eventArgs);
                    }
                }
                _senseManager.ReleaseFrame();

               //int bitmap_width, bitmap_height;
                //byte[] bitmap_data;

                //PXCMCapture.StreamType[] streams = form.QueryStreams();
                //bool streamState = false;
                //for (int s = 0; s < PXCMCapture.STREAM_LIMIT; s++)
                //{
                //    streamState = streamState || form.GetStreamState(PXCMCapture.StreamTypeFromIndex(s));
                //}
                //if (streamState)
                //{
                //    for (int inx = 0; inx < 2; inx++)
                //        if (sample[streams[inx]] != null)
                //        {
                //            form.SetImage(inx, sample[streams[inx]]);
                //        }
                //}
                //else
                //{
                //    if (form.GetProjectionState() && sample.color != null && sample.depth != null)
                //    {
                //        bitmap_data = projection.DepthToColorCoordinatesByFunction(sample.color, sample.depth, form.GetDotsState(), out bitmap_width, out bitmap_height);
                //        form.SetBitmap(0, bitmap_width, bitmap_height, bitmap_data);
                //    }
                //    if (form.GetUVMapState() && sample.color != null && sample.depth != null)
                //    {
                //        bitmap_data = projection.DepthToColorCoordinatesByUVMAP(sample.color, sample.depth, form.GetDotsState(), out bitmap_width, out bitmap_height);
                //        form.SetBitmap(0, bitmap_width, bitmap_height, bitmap_data);
                //    }
                //    if (form.GetInvUVMapState() && sample.color != null && sample.depth != null)
                //    {
                //        bitmap_data = projection.ColorToDepthCoordinatesByInvUVMap(sample.color, sample.depth, form.GetDotsState(), out bitmap_width, out bitmap_height);
                //        form.SetBitmap(0, bitmap_width, bitmap_height, bitmap_data);
                //    }

                //    if (sample.depth != null)
                //    {
                //        bitmap_data = GetRGB32Pixels(sample.depth, out bitmap_width, out bitmap_height);
                //        form.SetBitmap(1, bitmap_width, bitmap_height, bitmap_data);
                //    }
                //}
                //form.UpdatePanel();

            }
            //projection.Dispose();
        }
        private void RunLoop()
        {
            /* IEnumerable<PXCMCapture.DeviceInfo> devices = this.GetDevices();
             * if (devices.Count() == 0)
             * {
             *   throw new Smithers.Reading.FrameData.ScannerNotFoundException("No devices found");
             * }
             * PXCMCapture.DeviceInfo device = devices.First();
             * if (devices.Count() > 1)
             * {
             *   Console.WriteLine(String.Format("More than one device, using this one: {0}", device.name));
             * }
             * _senseManager.captureManager.FilterByDeviceInfo(device);*/

            pxcmStatus status;

            status = _senseManager.EnableStream(PXCMCapture.StreamType.STREAM_TYPE_COLOR, Frame.COLOR_WIDTH, Frame.COLOR_HEIGHT, Frame.COLOR_RATE);
            if (status != pxcmStatus.PXCM_STATUS_NO_ERROR)
            {
                _logger.info("Unable to enable color stream:" + status.ToString());
                throw new Smithers.Reading.FrameData.ScannerNotFoundException("Unable to enable color stream");
            }

            _logger.info("Color Stream Enabled:" + status.ToString());
            //status = _senseManager.EnableStream(PXCMCapture.StreamType.STREAM_TYPE_DEPTH, 0, 0, Frame.DEPTH_RATE);
            status = _senseManager.EnableStream(PXCMCapture.StreamType.STREAM_TYPE_DEPTH, Frame.DEPTH_WIDTH, Frame.DEPTH_HEIGHT, Frame.DEPTH_RATE);
            if (status != pxcmStatus.PXCM_STATUS_NO_ERROR)
            {
                _logger.info("Unable to enable depth stream:" + status.ToString());
                throw new Smithers.Reading.FrameData.ScannerNotFoundException("Unable to enable depth stream");
            }

            _logger.info("Depth Stream Enabled:" + status.ToString());

            //status = _senseManager.EnableStream(PXCMCapture.StreamType.STREAM_TYPE_LEFT, Frame.DEPTH_WIDTH, Frame.DEPTH_HEIGHT, Frame.DEPTH_RATE);
            //if (status != pxcmStatus.PXCM_STATUS_NO_ERROR)
            //{
            //    throw new Smithers.Reading.FrameData.ScannerNotFoundException("Unable to enable depth stream");
            //}

            //status = _senseManager.EnableStream(PXCMCapture.StreamType.STREAM_TYPE_RIGHT, Frame.DEPTH_WIDTH, Frame.DEPTH_HEIGHT, Frame.DEPTH_RATE);
            //if (status != pxcmStatus.PXCM_STATUS_NO_ERROR)
            //{
            //    throw new Smithers.Reading.FrameData.ScannerNotFoundException("Unable to enable depth stream");
            //}
            status = _senseManager.EnableScenePerception();
            if (status != pxcmStatus.PXCM_STATUS_NO_ERROR)
            {
                _logger.info("Unable to enable scene perception:" + status.ToString());
                throw new Smithers.Reading.FrameData.ScannerNotFoundException("Scene Perception failed");
            }
            _logger.info("Scene Perception Enabled:" + status.ToString());

            _perceptionHandle = _senseManager.QueryScenePerception();

            status = _senseManager.Init();
            if (status != pxcmStatus.PXCM_STATUS_NO_ERROR)
            {
                _logger.info("Unable to open sensor in the above mode:" + status.ToString());
                throw new Smithers.Reading.FrameData.ScannerNotFoundException("Init failed");
            }

            _logger.info("Sensor Initialized Successfully:" + status.ToString());

            PXCMImage.ImageInfo depthInfo = new PXCMImage.ImageInfo();
            PXCMImage.ImageInfo colorInfo = new PXCMImage.ImageInfo();

            depthInfo.height = Frame.DEPTH_HEIGHT;
            depthInfo.width  = Frame.DEPTH_WIDTH;
            colorInfo.height = Frame.COLOR_HEIGHT;
            colorInfo.width  = Frame.COLOR_WIDTH;

            /* For UV Mapping & Projection only: Save certain properties */
            Projection projection = new Projection(_senseManager.session, _senseManager.captureManager.device, depthInfo, colorInfo);

            AccelerometerReading accelerometerReading;

            AccelerometerStats acceleroStats = new AccelerometerStats();

            //bool firstFrameRecord = true;
            // bool firstFrameNotRecord = false;
            //pxcmStatus stsInitRecord = pxcmStatus.PXCM_STATUS_PROCESS_FAILED;
            while (!_stop)
            {
                //PXCMCapture.Device.MirrorMode mirrorMode = this.Mirrored ? PXCMCapture.Device.MirrorMode.MIRROR_MODE_HORIZONTAL : PXCMCapture.Device.MirrorMode.MIRROR_MODE_DISABLED;
                //{
                //    _senseManager.captureManager.device.SetMirrorMode(mirrorMode);
                //}

                /* Wait until a frame is ready: Synchronized or Asynchronous */


                //if ((Record || Playback) && firstFrameRecord)
                //{
                //    stsInitRecord = InitRecordPlay();
                //    if (this.StartCapture != null)
                //    {
                //        EventArgs eventArgs = new EventArgs();
                //        this.StartCapture(this, eventArgs);
                //    }
                //    firstFrameRecord = false;
                //    firstFrameNotRecord = true;
                //}
                //if (!Record && !Playback && firstFrameNotRecord)
                //{
                //    InitRecordPlay();
                //    if (this.ShotSavedSuccess != null)
                //    {
                //        EventArgs eventArgs = new EventArgs();
                //        this.ShotSavedSuccess(this, eventArgs);
                //    }
                //    firstFrameRecord = true;
                //    firstFrameNotRecord = false;
                //}
                //-------
                status = _senseManager.AcquireFrame(this.Synced);
                if (status != pxcmStatus.PXCM_STATUS_NO_ERROR)
                {
                    continue;
                }
                MemoryFrame frame = _pool.ObjectFromPool();
                ///* Display images */

                PXCMCapture.Sample sample;

                sample = _senseManager.QueryScenePerceptionSample();

                if (sample == null)
                {
                    sample = _senseManager.QuerySample();
                }

                //if (_perceptionHandle != null && sample !=null)
                //{
                //    _perceptionHandle.GetCameraPose(frame.CameraPose);
                //    frame.TrackingAccuracy = _perceptionHandle.QueryTrackingAccuracy().ToString();
                //    frame.VoxelResolution = _perceptionHandle.QueryVoxelResolution().ToString();

                //    float sceneQuality = _perceptionHandle.CheckSceneQuality(sample);

                //    if (sceneQuality > 0.3f && _perceptionPaused && !_capturing)
                //    {
                //        _perceptionPaused = false;
                //        _senseManager.PauseScenePerception(false);
                //        _perceptionHandle.Reset(_initPose);
                //    }
                //    else if (!(frame.TrackingAccuracy == "HIGH" || frame.TrackingAccuracy == "MID") && !_capturing)
                //    {
                //        ResetScenePerception();
                //    }
                //}

                //if (this.Accelerometer != null)
                //{
                //    accelerometerReading =  Accelerometer.GetCurrentReading();
                //    acceleroStats.accX = accelerometerReading.AccelerationX;
                //    acceleroStats.accY = accelerometerReading.AccelerationY;
                //    acceleroStats.accZ = accelerometerReading.AccelerationZ;
                //    acceleroStats.timestamp = accelerometerReading.Timestamp;

                //    frame.AcceleroStats = acceleroStats;
                //}

                if (sample.color != null)
                {
                    sample.color.CopyToByteArray(frame.BufferColor);

                    frame.ColorTimeStamp = sample.color.QueryTimeStamp();
                }
                if (sample.depth != null)
                {
                    sample.depth.CopyToByteArray(frame.BufferDepth);
                    sample.depth.CopyToByteArray(frame.BufferDepthPreview, true);

                    frame.DepthTimeStamp = sample.depth.timeStamp;
                }

#if DEBUG
                if (sample.left != null)
                {
                    sample.left.CopyToByteArray(frame.BufferIRLeft);
                }

                if (sample.right != null)
                {
                    sample.right.CopyToByteArray(frame.BufferIRRight);
                }

                // Get mapping.
                if (sample.depth != null)
                {
                    projection.DepthToCameraCoordinates(sample.depth, frame.DepthToCameraMapping);
                }
#endif
                //frame.LowConfidenceDepthValue = projection.InvalidDepthValue;


                using (Handle <MemoryFrame> frameHandle = new Handle <MemoryFrame>(frame, _pool))
                {
                    FrameArrivedEventArgs eventArgs = new FrameArrivedEventArgs()
                    {
                        FrameHandle = frameHandle
                    };

                    if (this.FrameArrived != null)
                    {
                        this.FrameArrived(this, eventArgs);
                    }
                }
                _senseManager.ReleaseFrame();

                //int bitmap_width, bitmap_height;
                //byte[] bitmap_data;

                //PXCMCapture.StreamType[] streams = form.QueryStreams();
                //bool streamState = false;
                //for (int s = 0; s < PXCMCapture.STREAM_LIMIT; s++)
                //{
                //    streamState = streamState || form.GetStreamState(PXCMCapture.StreamTypeFromIndex(s));
                //}
                //if (streamState)
                //{
                //    for (int inx = 0; inx < 2; inx++)
                //        if (sample[streams[inx]] != null)
                //        {
                //            form.SetImage(inx, sample[streams[inx]]);
                //        }
                //}
                //else
                //{
                //    if (form.GetProjectionState() && sample.color != null && sample.depth != null)
                //    {
                //        bitmap_data = projection.DepthToColorCoordinatesByFunction(sample.color, sample.depth, form.GetDotsState(), out bitmap_width, out bitmap_height);
                //        form.SetBitmap(0, bitmap_width, bitmap_height, bitmap_data);
                //    }
                //    if (form.GetUVMapState() && sample.color != null && sample.depth != null)
                //    {
                //        bitmap_data = projection.DepthToColorCoordinatesByUVMAP(sample.color, sample.depth, form.GetDotsState(), out bitmap_width, out bitmap_height);
                //        form.SetBitmap(0, bitmap_width, bitmap_height, bitmap_data);
                //    }
                //    if (form.GetInvUVMapState() && sample.color != null && sample.depth != null)
                //    {
                //        bitmap_data = projection.ColorToDepthCoordinatesByInvUVMap(sample.color, sample.depth, form.GetDotsState(), out bitmap_width, out bitmap_height);
                //        form.SetBitmap(0, bitmap_width, bitmap_height, bitmap_data);
                //    }

                //    if (sample.depth != null)
                //    {
                //        bitmap_data = GetRGB32Pixels(sample.depth, out bitmap_width, out bitmap_height);
                //        form.SetBitmap(1, bitmap_width, bitmap_height, bitmap_data);
                //    }
                //}
                //form.UpdatePanel();
            }
            //projection.Dispose();
        }