public Cavity(TCLSingleCavityConfig config) { Name = config.Name; Master = new MasterLaser(config.RampOffset, config.MasterLaser, this); if (config.DefaultGains.ContainsKey("Master")) { Master.Gain = config.DefaultGains["Master"]; } else { Master.Gain = 1.0; } SlaveLasers = new Dictionary <string, SlaveLaser>(); foreach (KeyValuePair <string, string> entry in config.SlaveLasers) { string laser = entry.Key; SlaveLaser slave = new SlaveLaser(laser, entry.Value, this); slave.FSRCalibration = config.FSRCalibrations[entry.Key]; if (config.DefaultGains.ContainsKey(laser)) { slave.Gain = config.DefaultGains[laser]; } else { slave.Gain = 0.0; } if (config.BlockChannels.ContainsKey(laser)) { slave.BlockChannel = config.BlockChannels[laser]; } SlaveLasers.Add(laser, slave); } }
public void DisengageLock(string cavityName, string slaveName) { SlaveLaser laser = Cavities[cavityName].SlaveLasers[slaveName]; laser.DisengageLock(); ui.UpdateSlaveUIState(cavityName, slaveName, laser.lState); }
public void EngageLock(string cavityName, string slaveName) { SlaveLaser laser = Cavities[cavityName].SlaveLasers[slaveName]; laser.ArmLock(); ui.UpdateSlaveUIState(cavityName, slaveName, laser.lState); ui.ClearErrorGraph(cavityName, slaveName); }
public void AddSlaveLaserPanel(SlaveLaser sl) { string title = sl.Name; TabPage newTab = new TabPage(title); LockControlPanel panel = new LockControlPanel(title, sl.LowerVoltageLimit, sl.UpperVoltageLimit, sl.Gain, this, this.controller); slaveLasersTab.TabPages.Add(newTab); newTab.Controls.Add(panel); slaveLasersTab.Enabled = true; SlaveLaserPanels.Add(title, panel); }
public void AddSlaveLaser(SlaveLaser sl) { string title = sl.Name; TabPage newTab = new TabPage(title); LockControlPanel panel = new LockControlPanel(title,sl.LowerVoltageLimit,sl.UpperVoltageLimit); panel.controller = this.controller; slaveLasersTab.TabPages.Add(newTab); newTab.Controls.Add(panel); slaveLasersTab.Enabled = true; slaveLasers.Add(title, panel); }
/// <summary> /// The function which gets called at the end, after breaking out of the while loop. /// </summary> private void endRamping() { tcl.DisposeAITask(); foreach (KeyValuePair <string, SlaveLaser> pair in SlaveLasers) { string slName = pair.Key; SlaveLaser sl = pair.Value; if (sl.lState != SlaveLaser.LaserState.FREE) { sl.VoltageToLaser = 0.0; sl.DisengageLock(); sl.DisposeLaserControl(); } } }
private void updateGUIForSlaveLaser(SlaveLaser laser, double[] rampData) { double[] laserScanData = laser.LatestScanData; if (laser.Fit != null) { double[] fitPoints = CavityScanFitHelper.CreatePointsFromFit(rampData, laser.Fit); ui.DisplaySlaveData(laser.ParentCavity.Name, laser.Name, rampData, laserScanData, fitPoints); if (laser.LockCount > 0) { ui.SetLaserVoltageTextBox(laser.ParentCavity.Name, laser.Name, laser.CurrentVoltage); bool laserInNormalOperatingRange = laser.CurrentVoltage <laser.UpperVoltageLimit && laser.CurrentVoltage> laser.LowerVoltageLimit; bool laserIsLocked = laser.lState == Laser.LaserState.LOCKED; ui.SetLaserOperatingLED(laser.ParentCavity.Name, laser.Name, laserIsLocked, laserInNormalOperatingRange); List <double> errorList = laser.OldFrequencyErrors; double standardDev = Math.Sqrt(errorList.Average(x => x * x)); ui.SetLaserSDTextBox(laser.ParentCavity.Name, laser.Name, standardDev); ui.AppendToErrorGraph(laser.ParentCavity.Name, laser.Name, laser.LockCount, laser.FrequencyError); } } else { ui.DisplaySlaveData(laser.ParentCavity.Name, laser.Name, rampData, laserScanData); } }
/// <summary> /// The main loop. Reads the analog inputs, fits to the data and (when locked) adjusts the slave laser voltage. /// </summary> private void mainLoop() { fits = new Dictionary <string, double[]>(); //Somewhere to store the fits for an iteration. readParametersFromUI(); //This isn't part of the loop. Do an initial setup of the parameters. ScanParameters sp = createInitialScanParameters(); double masterVoltage = 0; setupMasterVoltageOut(); writeMasterVoltageOut(0); disposeMasterVoltageOut(); initializeAIHardware(sp); CavityScanData scanData; int count = 0; while (TCLState != ControllerState.STOPPED) { scanData = acquireAI(sp); if (scanData != null) { plotCavity(scanData); if ((scanData.GetCavityData())[sp.Steps - 1] < (double)Environs.Hardware.GetInfo("TCL_MAX_INPUT_VOLTAGE")) // if the cavity ramp voltage exceeds the input voltage - do nothing { fits["masterFits"] = fitMaster(scanData); plotMaster(scanData, fits["masterFits"]); if (ui.masterLockEnableCheck.Checked == true && checkRampChannel() == true) { masterVoltage = calculateMasterVoltageShift(masterVoltage) + masterVoltage; setupMasterVoltageOut(); //write difference to analog output writeMasterVoltageOut(masterVoltage); ui.SetVtoOffsetVoltage(Math.Round(masterVoltage, 4)); ui.SetMasterFitTextBox(Math.Round((fits["masterFits"][1] - masterVoltage), 4)); disposeMasterVoltageOut(); } foreach (KeyValuePair <string, SlaveLaser> pair in SlaveLasers) { string slName = pair.Key; SlaveLaser sl = pair.Value; //Some rearrangements to fit only when log fit slave lasers parameters on and/or lock slave lasers on. plotSlaveNoFit(slName, scanData); if (ui.logCheckBox.Checked == true) { fits[slName + "Fits"] = fitSlave(slName, scanData); plotSlave(slName, scanData, fits[slName + "Fits"]); using (StreamWriter writer = new StreamWriter(Environs.FileSystem.Paths["transferCavityData"] + "log.txt", true)) { writer.WriteLine(slName + "," + DateTime.Now.ToString("h:mm:ss.ff t") + "," + Math.Round(fits["masterFits"][1], 5).ToString() + "," + Math.Round(fits[slName + "Fits"][1], 5).ToString() + "," + Math.Round(sl.VoltageToLaser, 5).ToString()); } } switch (sl.lState) { case SlaveLaser.LaserState.FREE: break; case SlaveLaser.LaserState.LOCKING: fits[slName + "Fits"] = fitSlave(slName, scanData); plotSlave(slName, scanData, fits[slName + "Fits"]); sl.CalculateLaserSetPoint(fits["masterFits"], fits[slName + "Fits"]); sl.Lock(); //RefreshErrorGraph(slName); count = 0; break; case SlaveLaser.LaserState.LOCKED: fits[slName + "Fits"] = fitSlave(slName, scanData); plotSlave(slName, scanData, fits[slName + "Fits"]); plotError(slName, new double[] { getErrorCount(slName) }, new double[] { fits[slName + "Fits"][1] - fits["masterFits"][1] - sl.LaserSetPoint }); sl.RefreshLock(fits["masterFits"], fits[slName + "Fits"]); RefreshLockParametersOnUI(sl.Name); incrementCounter(slName); count++; break; } } } else { Console.WriteLine("Cavity ramp voltage out of range"); Thread.Sleep(100); } } } endRamping(); }
/// <summary> /// The controller needs to be able to change the UI. Enabling buttons, changing the values in text boxes... /// </summary> /// <param name="name"></param> /// <param name="state"></param> public void UpdateUIState(string name, SlaveLaser.LaserState state) { ui.UpdateUIState(name, state); }
/// <summary> /// The main loop. Reads the analog inputs, fits to the data and (when locked) adjusts the slave laser voltage. /// </summary> private void mainLoop() { fits = new Dictionary <string, double[]>(); //Somewhere to store the fits for an iteration. readParametersFromUI(); //This isn't part of the loop. Do an initial setup of the parameters. ScanParameters sp = createInitialScanParameters(); double masterVoltage = 0; setupMasterVoltageOut(); writeMasterVoltageOut(0); disposeMasterVoltageOut(); initializeAIHardware(sp); CavityScanData scanData; int count = 0; while (TCLState != ControllerState.STOPPED) { scanData = acquireAI(sp); if (scanData != null) { plotCavity(scanData); if ((scanData.GetCavityData())[sp.Steps - 1] < (double)Environs.Hardware.GetInfo("TCL_MAX_INPUT_VOLTAGE")) // if the cavity ramp voltage exceeds the input voltage - do nothing { if (checkRampChannel() == true) { //if the cavity length is locked, use the set point to determine what voltage to output if (ui.masterLockEnableCheck.Checked == true) { fits["masterFits"] = fitMaster(scanData); plotMaster(scanData, fits["masterFits"]); masterVoltage = calculateMasterVoltageShift(masterVoltage) + masterVoltage; setupMasterVoltageOut(); //write difference to analog output writeMasterVoltageOut(masterVoltage); ui.SetVtoOffsetVoltage(masterVoltage); ui.SetMasterFitTextBox(fits["masterFits"][1] - masterVoltage); disposeMasterVoltageOut(); } //if the cavity length is not locked, allow the voltage out to be scanned else { plotMaster(scanData); setupMasterVoltageOut(); masterVoltage = ui.GetVtoOffsetVoltage(); writeMasterVoltageOut(masterVoltage); disposeMasterVoltageOut(); } } foreach (KeyValuePair <string, SlaveLaser> pair in SlaveLasers) { string slName = pair.Key; SlaveLaser sl = pair.Value; //Some rearrangements to fit only when log fit slave lasers parameters on and/or lock slave lasers on. plotSlaveNoFit(slName, scanData); switch (sl.lState) { case SlaveLaser.LaserState.FREE: break; case SlaveLaser.LaserState.LOCKING: fits[slName + "Fits"] = fitSlave(slName, scanData); plotSlave(slName, scanData, fits[slName + "Fits"]); sl.CalculateLaserSetPoint(fits["masterFits"], fits[slName + "Fits"]); sl.Lock(); RefreshErrorGraph(slName); count = 0; break; case SlaveLaser.LaserState.LOCKED: fits[slName + "Fits"] = fitSlave(slName, scanData); plotSlave(slName, scanData, fits[slName + "Fits"]); plotError(slName, new double[] { getErrorCount(slName) }, new double[] { fits[slName + "Fits"][1] - fits["masterFits"][1] - sl.LaserSetPoint }); sl.RefreshLock(fits["masterFits"], fits[slName + "Fits"]); RefreshLockParametersOnUI(sl.Name); incrementCounter(slName); count++; break; } if (ui.logCheckBox.Checked) { double[] masterFitParams; double[] slaveFitParams; if (!fits.TryGetValue("masterFits", out masterFitParams)) { masterFitParams = new double[4] { 0, 0, 0, 0 }; } if (!fits.TryGetValue(slName + "Fits", out slaveFitParams)) { slaveFitParams = new double[4] { 0, 0, 0, 0 }; } ; serializer.AddData(new TCLDataLog(DateTime.Now, slName, masterFitParams[1], slaveFitParams[1], sl.VoltageToLaser)); } } } else { Console.WriteLine("Cavity ramp voltage out of range"); Thread.Sleep(100); } } } endRamping(); }
internal void UpdateUIState(string name, SlaveLaser.LaserState state) { slaveLasers[name].UpdateUIState(state); }
/// <summary> /// The main loop. Reads the analog inputs, fits to the data and (when locked) adjusts the slave laser voltage. /// </summary> private void mainLoop() { fits = new Dictionary <string, double[]>(); //Somewhere to store the fits for an iteration. readParametersFromUI(); //This isn't part of the loop. Do an initial setup of the parameters. ScanParameters sp = createInitialScanParameters(); double masterVoltage = 0; setupMasterVoltageOut(); writeMasterVoltageOut(0); disposeMasterVoltageOut(); DateTime previousTime = DateTime.Now; Stopwatch stopWatch = new Stopwatch(); stopWatch.Start(); initializeAIHardware(sp); CavityScanData scanData = new CavityScanData(sp.Steps, aiChannels, config.Lasers, config.Cavity, config.MasterLaser); int count = 0; while (TCLState != ControllerState.STOPPED) { updateTime(stopWatch); stopWatch.Reset(); stopWatch.Start(); double[] lastCav = scanData.GetCavityData(); scanData = acquireAI(sp); if (ui.scanAvCheckBox.Checked == true) { scanData.SetAverageCavityData(lastCav); } if (scanData != null) { if (!ui.dissableGUIupdateCheckBox.Checked) { plotCavity(scanData); } ; if ((scanData.GetCavityData())[sp.Steps - 1] < config.MaxInputVoltage) // if the cavity ramp voltage exceeds the input voltage - do nothing { if (checkRampChannel() == true) { switch (MasterLaser.lState) { case MasterLaser.LaserState.FREE: plotMaster(scanData); masterVoltage = ui.GetVtoOffsetVoltage(); setupMasterVoltageOut(); writeMasterVoltageOut(masterVoltage); disposeMasterVoltageOut(); break; case MasterLaser.LaserState.LOCKING: fits["masterFits"] = fitMaster(scanData); plotMaster(scanData, fits["masterFits"]); masterVoltage = calculateNewMasterVoltage(masterVoltage); //write difference to analog output setupMasterVoltageOut(); writeMasterVoltageOut(masterVoltage); ui.SetVtoOffsetVoltage(masterVoltage); ui.SetMasterFitTextBox(fits["masterFits"][1] - masterVoltage); disposeMasterVoltageOut(); MasterLaser.Lock(); break; case MasterLaser.LaserState.LOCKED: if (ui.fastFitCheckBox.Checked) { fits["masterFits"] = fastfitMaster(scanData, fits["masterFits"]); } else { fits["masterFits"] = fitMaster(scanData); } if (!ui.dissableGUIupdateCheckBox.Checked) { plotMaster(scanData, fits["masterFits"]); } ; masterVoltage = calculateNewMasterVoltage(masterVoltage); //write difference to analog output setupMasterVoltageOut(); writeMasterVoltageOut(masterVoltage); ui.SetVtoOffsetVoltage(masterVoltage); ui.SetMasterFitTextBox(fits["masterFits"][1] - masterVoltage); disposeMasterVoltageOut(); break; } } foreach (KeyValuePair <string, SlaveLaser> pair in SlaveLasers) { string slName = pair.Key; SlaveLaser sl = pair.Value; //Some rearrangements to fit only when log fit slave lasers parameters on and/or lock slave lasers on. switch (sl.lState) { case SlaveLaser.LaserState.FREE: plotSlaveNoFit(slName, scanData); //RefreshVoltageOnUI(slName); break; case SlaveLaser.LaserState.LOCKING: fits[slName + "Fits"] = fitSlave(slName, scanData); plotSlave(slName, scanData, fits[slName + "Fits"]); sl.CalculateLaserSetPoint(fits["masterFits"], fits[slName + "Fits"]); sl.Lock(); //RefreshVoltageOnUI(slName); RefreshErrorGraph(slName); count = 0; break; case SlaveLaser.LaserState.LOCKED: if (ui.fastFitCheckBox.Checked) { fits[slName + "Fits"] = fastfitSlave(slName, scanData, fits[slName + "Fits"]); } else { fits[slName + "Fits"] = fitSlave(slName, scanData); } if (!ui.dissableGUIupdateCheckBox.Checked) { plotSlave(slName, scanData, fits[slName + "Fits"]); } ; if (!ui.dissableGUIupdateCheckBox.Checked) { plotError(slName, new double[] { getErrorCount(slName) }, new double[] { fits[slName + "Fits"][1] - fits["masterFits"][1] - sl.LaserSetPoint }); } ; sl.RefreshLock(fits["masterFits"], fits[slName + "Fits"]); RefreshLockParametersOnUI(sl.Name); RefreshErrorParametersOnUI(sl.Name); incrementCounter(slName); count++; break; } if (ui.logCheckBox.Checked) { double[] masterFitParams; double[] slaveFitParams; if (!fits.TryGetValue("masterFits", out masterFitParams)) { masterFitParams = new double[4] { 0, 0, 0, 0 }; } if (!fits.TryGetValue(slName + "Fits", out slaveFitParams)) { slaveFitParams = new double[4] { 0, 0, 0, 0 }; } ; serializer.AddData(new TCLDataLog(DateTime.Now, slName, masterFitParams[1], slaveFitParams[1], sl.VoltageToLaser)); } } } else { Console.WriteLine("Cavity ramp voltage out of range"); Thread.Sleep(100); } } } endRamping(); }
public void UpdateUIState(SlaveLaser.LaserState state) { switch (state) { case SlaveLaser.LaserState.FREE: lockEnableCheck.Enabled = true; VoltageToLaserTextBox.Enabled = true; LaserSetPointTextBox.Enabled = false; GainTextbox.Enabled = true; lockedLED.Value = false; VoltageTrackBar.Enabled = true; fsrTextBox.Enabled = true; break; case SlaveLaser.LaserState.LOCKING: VoltageToLaserTextBox.Enabled = false; GainTextbox.Enabled = false; lockedLED.Value = false; VoltageTrackBar.Enabled = false; fsrTextBox.Enabled = false; break; case SlaveLaser.LaserState.LOCKED: lockedLED.Value = true; break; } }