public ProcessorModeFormat ProcessorMode = ProcessorModeFormat.Michael; // set the mode for processor here


        public Manager(MainWindow parent)  // Construct function
        {
            if (ProcessorMode == ProcessorModeFormat.Michael)
                datafeed = new DataFeed(DataFeed.DataSource.Kinect, DataFeed.RangeModeFormat.Near);
            else
                datafeed = new DataFeed(DataFeed.DataSource.Kinect, DataFeed.RangeModeFormat.Default);
            
            #region Create and arrange Images
            int total_processors = 2;
            processors = new Processor[total_processors];
            for (int i = 0; i < total_processors; i++)
            {
                processors[i] = new Processor(this);
                processors[i].lower = 100;
                processors[i].upper = 1000;
                Image image = processors[i].getImage();
                parent.mainContainer.Children.Add(image);
            }
            #endregion

            #region Processor configurations
			
            
            if (ProcessorMode == ProcessorModeFormat.Michael)
            {
                processors[0].updatePipeline(
                    // Show the rgb image
                                            Filter.Step.CopyColor
                    // Show the depth image                                         
                    // Filter.Step.Depth    

                    // Show the Color Labelling                                         
                    // Filter.Step.PaintWhite,
                    // Filter.Step.MatchColors
                    );

                //processors[0].updatePipeline(Filter.Step.ColorMatch);
                //processors[1].SetTestModule(Processor.ShowExtractedFeatureFormat.PredictOnePixelCPU | Processor.ShowExtractedFeatureFormat.ShowTransformedForOnePixel); // 
                // one should call SetTestModule to active the FeatureExtractionLib

                //processors[1].SetTestModule(Processor.ShowExtractedFeatureFormat.PredictAllPixelsGPU); 
                processors[1].setFeatureExtraction(Processor.ShowExtractedFeatureFormat.ShowTransformedForOnePixel); 
                processors[1].updatePipeline(
                    // Show the rgb image
                    // Filter.Step.CopyColor
                    // Show the depth image 
                    Filter.Step.PaintWhite,
                 //   Filter.Step.Crop,
                    Filter.Step.PaintGreen,
                    Filter.Step.CopyDepth,
                //    Filter.Step.MatchColors,
                //    Filter.Step.FeatureExtractOnEnable,
                    Filter.Step.ShowOverlay


                    // Show Mapped Depth Using RGB
                    // Filter.Step.PaintWhite,
                    // Filter.Step.MappedDepth
                    // Show the Color Labelling
                    // Filter.Step.PaintWhite,
                    // Filter.Step.MatchColors
                    // Denoise
                    //                        Filter.Step.Denoise
                );
            }
            else if (ProcessorMode == ProcessorModeFormat.Arun) {
                processors[0].setFeatureExtraction(Processor.ShowExtractedFeatureFormat.ShowTransformedForOnePixel); 
                processors[0].updatePipeline(
                    Filter.Step.PaintWhite,
                    Filter.Step.Crop,
                    Filter.Step.PaintGreen,
                    //Filter.Step.CopyColor,
                    Filter.Step.MatchColors,
                    Filter.Step.FeatureExtractOnEnable,
                    Filter.Step.ShowOverlay
                );


                processors[1].setFeatureExtraction(Processor.ShowExtractedFeatureFormat.PredictAllPixelsGPU);
                processors[1].updatePipeline(
                    Filter.Step.PaintGreen,
                    Filter.Step.Crop,
                    Filter.Step.CopyDepth,
                    //Filter.Step.EnablePredict,
                    //Filter.Step.PredictOnEnable,
                    Filter.Step.ShowOverlay);
                
                 
                /*processors[1].SetTestModule(Processor.ShowExtractedFeatureFormat.ShowTransformedForOnePixel);
                processors[1].updatePipeline(
                   Processor.Step.PaintGreen,
                   Processor.Step.Depth,
                   Processor.Step.OverlayOffset
                );*/
                
            }
            #endregion

            poller = new Thread(new ThreadStart(this.poll));
        }
        private ProcessorModeFormat processor_mode_ = ProcessorModeFormat.Michael; // set the mode for processor here

        public Manager(MainWindow parent)  // Construct function
        {
            if (processor_mode_ == ProcessorModeFormat.Michael)
                datafeed = new DataFeed(DataFeed.DataSource.Kinect, DataFeed.RangeModeFormat.Near);
            else
                datafeed = new DataFeed(DataFeed.DataSource.Kinect, DataFeed.RangeModeFormat.Default);
            
            #region Create one processor
            // the processor is passed by the current object and the main window controller
            // Note about the new design: there is only one processor which do all the processing, and pass the processed image to a
            // corresponding image control element
            processor = new Processor(processor_mode_, parent);
            processor.lower = 100;
            processor.upper = 1000;
            setDensity(0.91);
            setRadius(10);
            //    Image image = processors[i].getImage();
            //    parent.mainContainer.Children.Add(image);
            #endregion

            #region Processor configurations
            if (processor_mode_ == ProcessorModeFormat.Michael)
            {
                // Whic pipelines to show is decided by the processor.
                processor.setFeatureExtraction(Processor.ShowExtractedFeatureFormat.PredictAllPixelsGPU); 
                
                /*
                processors[0].updatePipeline(
                    // Show the rgb image
                                            Filter.Step.CopyColor
                    // Show the depth image                                         
                    // Filter.Step.Depth    

                    // Show the Color Labelling                                         
                    // Filter.Step.PaintWhite,
                    // Filter.Step.MatchColors
                    );

                //processors[0].updatePipeline(Filter.Step.ColorMatch);
                //processors[1].SetTestModule(Processor.ShowExtractedFeatureFormat.PredictOnePixelCPU | Processor.ShowExtractedFeatureFormat.ShowTransformedForOnePixel); // 
                // one should call SetTestModule to active the FeatureExtractionLib
                processors[1].setFeatureExtraction(Processor.ShowExtractedFeatureFormat.PredictAllPixelsGPU); 
                processors[1].updatePipeline(
                    // Show the rgb image
                    // Filter.Step.CopyColor
                    // Show the depth image                                         
                                            Filter.Step.CopyDepth,
                                            Filter.Step.EnablePredict,
                                            Filter.Step.PerPixelClassificationOnEnable,
                                            Filter.Step.PoolingOnPerPixelClassification,
                                            Filter.Step.ShowOverlay
                    // Show Mapped Depth Using RGB
                    // Filter.Step.PaintWhite,
                    // Filter.Step.MappedDepth
                    // Show the Color Labelling
                    // Filter.Step.PaintWhite,
                    // Filter.Step.MatchColors
                    // Denoise
                    //                        Filter.Step.Denoise
                );
                 */ 
            }
            else if (processor_mode_ == ProcessorModeFormat.Arun) {
                /*
                processors[0].setFeatureExtraction(Processor.ShowExtractedFeatureFormat.ShowTransformedForOnePixel); 
                processors[0].updatePipeline(
                    Filter.Step.PaintWhite,
                    Filter.Step.Crop,
                    Filter.Step.PaintGreen,
                    //Filter.Step.CopyColor,
                    //Filter.Step.MatchColors,
                    //Filter.Step.FeatureExtractOnEnable,
                    Filter.Step.ShowOverlay
                );


                processors[1].setFeatureExtraction(Processor.ShowExtractedFeatureFormat.PredictAllPixelsGPU);
                processors[1].updatePipeline(
                    //Filter.Step.PaintGreen,
                    //Filter.Step.Crop,
                    Filter.Step.CopyDepth,
                    Filter.Step.EnablePredict,
                    Filter.Step.PerPixelClassificationOnEnable,
                    Filter.Step.PoolingOnPerPixelClassification,
                    Filter.Step.ShowOverlay);
                
                */ 
                /*processors[1].SetTestModule(Processor.ShowExtractedFeatureFormat.ShowTransformedForOnePixel);
                processors[1].updatePipeline(
                   Processor.Step.PaintGreen,
                   Processor.Step.Depth,
                   Processor.Step.OverlayOffset
                );*/
                
            }
            #endregion

            // why using a new thread? (Michael)
            poller = new Thread(new ThreadStart(this.poll));
        }