TransferCavityLock.Controller.rampLoop C# (CSharp) Method

rampLoop() private method

The main loop. Scans the cavity, looks at photodiodes, corrects the cavity scan range for the next scan and locks the laser. It does a first scan of the data before starting. It then enters a loop where the next scan is prepared. The preparation varies depending on the ControllerState. Once all the preparation is done, the next scan is started. And so on.
private rampLoop ( ) : void
return void
        private void rampLoop()
        {
            readParametersFromUI();
            ScanParameters sp = createInitialScanParameters();
            initializeHardware();
            CavityScanData scanData = scan(sp);

            double[] masterDataFit;
            double[] slaveDataFit;
            System.IO.StreamWriter file = new System.IO.StreamWriter("c:\\cavityData.txt");
            while (State != ControllerState.STOPPED)
            {
                displayData(sp, scanData);

                masterDataFit = CavityScanFitHelper.FitLorenzianToMasterData(scanData, sp.Low, sp.High);
                saveFitData(file, masterDataFit[1]);
                displayMasterFit(sp, masterDataFit);
                slaveDataFit = CavityScanFitHelper.FitLorenzianToSlaveData(scanData, sp.Low, sp.High);
                saveFitData(file, slaveDataFit[1]);
                displaySlaveFit(sp, slaveDataFit);

                switch (State)
                {
                    case ControllerState.FREERUNNING:
                        releaseLaser();
                        break;

                    case ControllerState.CAVITYSTABILIZED:
                        ScanOffset = calculateNewScanCentre(sp, masterDataFit);
                        sp.High = ScanOffset + scanWidth;
                        sp.Low = ScanOffset - scanWidth;

                        setToLaserEngaged();
                        break;

                    case ControllerState.LASERLOCKING:
                        ScanOffset = calculateNewScanCentre(sp, masterDataFit);
                        sp.High = ScanOffset + scanWidth;
                        sp.Low = ScanOffset - scanWidth;

                        LaserSetPoint = CalculateLaserSetPoint(masterDataFit, slaveDataFit);

                        State = ControllerState.LASERLOCKED;
                        ui.updateUIState(State);
                        break;

                    case ControllerState.LASERLOCKED:
                        ScanOffset = calculateNewScanCentre(sp, masterDataFit);
                        sp.High = ScanOffset + scanWidth;
                        sp.Low = ScanOffset - scanWidth;

                        LaserSetPoint = tweakSetPoint(LaserSetPoint); //does nothing if not tweaked

                        /*Console.WriteLine("width=" + slaveDataFit[0].ToString() + ", centre =" + slaveDataFit[1].ToString()
                            + ", amp=" + slaveDataFit[2].ToString() + ", offset=" + slaveDataFit[3].ToString());*/

                        double shift = calculateDeviationFromSetPoint(LaserSetPoint, masterDataFit, slaveDataFit);
                        VoltageToLaser = calculateNewVoltageToLaser(VoltageToLaser, shift);

                        break;

                }
                if (lState == LaserState.BUSY)
                {
                    tcl.SetLaserVoltage(VoltageToLaser);
                }

                scanData = scan(sp);
            }
            file.Close();
            finalizeRamping();
        }