Beispiel #1
0
 protected override void OnExperimentStopped()
 {
     base.OnExperimentStopped();
     laser?.LaserOff();
     laser?.Dispose();
     lasersignalch = null;
     laser2?.LaserOff();
     laser2?.Dispose();
     laser2signalch = null;
 }
        /// <summary>
        /// FindHardware attempts to create the hardware objects
        /// and display them to the user.
        /// </summary>
        private void FindHardware(Object parameter)
        {
            //Unpack the Parameters
            WizardControl wizard = parameter as WizardControl;

            //Set the button Enable states
            wizard.Dispatcher.BeginInvoke(new DisableButtonsDelegate(this.DisableButtons));

            //Set the Cursor on the WizardControl
            wizard.Dispatcher.BeginInvoke(new ChangeCursorDelegate(this.ChangeCursor), Cursors.Wait);

            //Create the Hardware objects
            IMirror       mirror  = SHArKClassFactory.CreateIMirror();
            IPotentiostat potstat = SHArKClassFactory.CreateIPotentiostat();
            ILaser        laser   = SHArKClassFactory.CreateILaser();

            //Get the names of the hardware -- default to not found
            String mirrorName  = Strings.DeviceNotFound;
            String potstatName = Strings.DeviceNotFound;
            String laserName   = Strings.DeviceNotFound;

            if (mirror != null)
            {
                mirrorName = mirror.Name;
                mirror.Dispose();
            }


            if (potstat != null)
            {
                potstatName = potstat.Name;
                potstat.Dispose();
            }

            if (laser != null)
            {
                laserName = laser.Name;
                laser.Dispose();
            }

            //Set the labels in the Page
            wizard.Dispatcher.BeginInvoke(new SetLabelTextDelegate(this.SetLabelText), TextBlockType.Mirror, mirrorName);
            wizard.Dispatcher.BeginInvoke(new SetLabelTextDelegate(this.SetLabelText), TextBlockType.Potentiostat, potstatName);
            wizard.Dispatcher.BeginInvoke(new SetLabelTextDelegate(this.SetLabelText), TextBlockType.Laser, laserName);

            //Set the Cursor on the WizardControl
            wizard.Dispatcher.BeginInvoke(new ChangeCursorDelegate(this.ChangeCursor), Cursors.Arrow);

            //Enable the buttons as necessary
            wizard.Dispatcher.BeginInvoke(new EnableButtonsDelegate(this.EnableButtons), wizard);

            //Set the flag that the Hardware has been searched for
            this._hardwareSearched = true;
        }
Beispiel #3
0
        /// <summary>
        /// Acquire3DData is called in a separate thread to
        /// acquire the data set up in the NewSpectrumInfo
        /// object passed to the Tab.
        /// </summary>
        private void Acquire3DData()
        {
            //Set the Mouse cursor
            this._view.Dispatcher.Invoke(new SetMouseCursorDelegate(this.SetMouseCursor), Cursors.Wait);

            //Set the basic Chart Properties
            this._view.Dispatcher.Invoke(new SetDocumentNameDelegate(this.SetDocumentName), Path.GetFileName(this._newSpecInfo.FileName));
            this._view.Dispatcher.Invoke(new SetAxisRangesDelegate(this.SetAxisRanges), this._newSpecInfo.Columns - 1, this._newSpecInfo.Rows - 1);

            //Set the run state on the Chart
            this._view.Dispatcher.Invoke(new SetRunStateDelegate(this.SetRunState), true);

            //Get the Hardware objects -- just return
            //if any of them is null
            IMirror       mirror  = null;
            IPotentiostat potstat = null;
            ILaser        laser   = null;

            this.GetHardwareObjects(ref mirror, ref potstat, ref laser);

            if (mirror == null || potstat == null || laser == null)
            {
                return;
            }

            //Try to run the entire Acquisition
            try
            {
                //Initialize the new SHArKFile
                ISHArKFile file = SHArKFileFactory.Create(this._newSpecInfo.FileName, true);

                //Set the potential on the electrode
                potstat.SetPotential(this._newSpecInfo.BiasPotential);

                //Reset the Laser to the Initial Position
                this._view.Dispatcher.Invoke(new SetWindowStatusDelegate(this.SetWindowStatus), Strings.ResetInitialPosition);
                this.SetInitialLaserPosition(mirror, this._newSpecInfo.Columns, 0);

                //Finally, reset the mouse cursor so that the user
                //can see that initial processing is over
                this._view.Dispatcher.Invoke(new SetMouseCursorDelegate(this.SetMouseCursor), Cursors.Arrow);

                //Check the Poteniostat to see if the current is too
                //high to start a scan -- open the box if necessary
                if (potstat.IsCurrentSettled == false)
                {
                    this._view.Dispatcher.Invoke(new ShowDarkCurrentDialogDelegate(this.ShowDarkCurrentDialog), potstat);
                }

                //Do the acquisition while the user does not
                //want to Pause or Stop
                Int32 xIndex = 0;
                Int32 yIndex = this._newSpecInfo.Rows - 1;
                Int32 xStep  = this._newSpecInfo.StepSize;

                while (this.IsRunning == true)
                {
                    //Get the time remaining as a String
                    TimeSpan tsRemaining   = this._newSpecInfo.CalculateTimeRemaining(xIndex, yIndex);
                    String   timeRemaining = String.Format("{0:D2}:{1:D2}:{2:D2}", tsRemaining.Hours, tsRemaining.Minutes, tsRemaining.Seconds);

                    //Set the status on the Window to show that the
                    //scan is running
                    this._view.Dispatcher.Invoke(new SetWindowStatusDelegate(SetWindowStatus),
                                                 String.Format("{0} {1} Remaining", Strings.ScanRunning, timeRemaining));

                    //Get the Dark Current value from the Potentiostat
                    Double darkCurrent = potstat.GetCurrent(this._newSpecInfo.NumberCurrentSamples);

                    //Turn on the Laser and wait the specified amount of time
                    laser.SetLaserState(true);
                    Thread.Sleep(this._newSpecInfo.MillisecondsLaserOnDelay);

                    //Acquire the data for the current point
                    Double lightCurrent = potstat.GetCurrent(this._newSpecInfo.NumberCurrentSamples);

                    //Add the Point to the file
                    Point p = new Point(xIndex, yIndex, lightCurrent - darkCurrent);
                    file.AddDataPoint(p);

                    //Turn off the laser and wait the specified amount of time
                    laser.SetLaserState(false);
                    Thread.Sleep(this._newSpecInfo.MillisecondsLaserOffDelay);

                    //Set the Point in the ObservableCollection so
                    //that it updates the Chart
                    this._view.Dispatcher.Invoke(new AddPointsToChartDelegate(this.AddPointsToChart), new Point[] { p }, this._newSpecInfo.MaxCurrentValue);

                    //Determine the direction of the X-Axis movement --
                    //if this is an odd row (relative to starting at
                    //this._newSpecInfo.Rows - 1), move backward
                    xStep = this._newSpecInfo.StepSize;

                    if ((this._newSpecInfo.Rows % 2 == 0 && yIndex % 2 == 0) ||
                        (this._newSpecInfo.Rows % 2 == 1 && yIndex % 2 == 1))
                    {
                        xStep *= -1;
                    }

                    //Determine if the Y-Axis mirror needs to move.
                    //If the direction is positive, move when the
                    //X-Axis gets to Columns.  Otherwise, move when
                    //the X-Axis gets to 0.
                    if ((xStep > 0 && xIndex == this._newSpecInfo.Columns - 1) ||
                        (xStep < 0 && xIndex == 0))
                    {
                        //Move the Y-Axis Mirror
                        mirror.Move(MirrorAxis.Y, this._newSpecInfo.StepSize);

                        //Update the yIndex
                        yIndex--;
                    }

                    //Move to the next Column if necessary
                    if ((xStep > 0 && xIndex < this._newSpecInfo.Columns - 1) ||
                        (xStep < 0 && xIndex > 0))
                    {
                        //Move to the next Column
                        mirror.Move(MirrorAxis.X, xStep);

                        //Update the xIndex based on the direction
                        //of the step
                        if (xStep > 0)
                        {
                            xIndex++;
                        }
                        else
                        {
                            xIndex--;
                        }
                    }

                    //Check to see if the scan is finished
                    if (yIndex == -1 && ((xStep > 0 && xIndex == this._newSpecInfo.Columns - 1) || (xStep < 0 && xIndex == 0)))
                    {
                        this.IsRunning = false;
                    }

                    //If the user has Paused the acquisition,
                    //loop and Sleep until resumed
                    while (this.IsPaused == true && this.IsRunning == true)
                    {
                        //Stop the Laser from modulating
                        laser.SetLaserState(false);

                        //Set the status on the Window
                        this._view.Dispatcher.Invoke(new SetWindowStatusDelegate(this.SetWindowStatus),
                                                     String.Format("{0} {1} Remaining", Strings.ScanPaused, timeRemaining));

                        //Sleep for a half-second
                        Thread.Sleep(500);
                    }
                }

                //Stop the Laser from modulating
                laser.SetLaserState(false);

                //Move the Mirror back to the Initial Position
                this._view.Dispatcher.Invoke(new SetWindowStatusDelegate(this.SetWindowStatus), Strings.ResetInitialPosition);
                this.SetInitialLaserPosition(mirror, xIndex, yIndex);
            }
            catch (System.Exception e)
            {
                //Show an error message and return
                this._view.Dispatcher.Invoke(new ShowErrorDelegate(this.ShowError), e.Message);
                return;
            }
            finally
            {
                //Clean up the Hardware objects
                if (mirror != null)
                {
                    mirror.Dispose();
                }

                if (potstat != null)
                {
                    potstat.SetPotential(0.0);
                    potstat.Dispose();
                }

                if (laser != null)
                {
                    laser.SetLaserState(false);
                    laser.Dispose();
                }

                //Publish the event to notify that the Spectrum
                //has finished
                this._view.Dispatcher.Invoke(new NotifySpectrumEndedDelegate(this.NotifySpectrumEnded));

                //Reset the Window Status
                this._view.Dispatcher.Invoke(new SetWindowStatusDelegate(this.SetWindowStatus), String.Empty);
            }
        }