// change a parameter in the current profile. The way that the plugin is selected is a cheesy hack - // clearly the commandProcessor/pluginManager/settingsReflector design is inadequate // The group mode flag is also a cheesy hack, but might be quite useful public void AdjustProfileParameter(String plugin, String parameter, String newValue, bool groupMode) { SettingsReflector sr = new SettingsReflector(); if (!groupMode) { sr.SetField(profileManager.Processor.PluginForString(profileManager.CurrentProfile, plugin), parameter, newValue); } else { ArrayList profiles = profileManager.ProfilesInGroup(profileManager.CurrentProfile.Group); foreach (Profile p in profiles) { sr.SetField(profileManager.Processor.PluginForString(p, plugin), parameter, newValue); } } }
private void Acquire() { try { // lock a monitor onto the acquisitor, to synchronise with the controller // when acquiring a set number of scans - the monitor is released in // AcquisitionFinishing() Monitor.Enter(AcquisitorMonitorLock); // initialise all of the plugins config.outputPlugin.AcquisitionStarting(); config.pgPlugin.AcquisitionStarting(); config.shotGathererPlugin.AcquisitionStarting(); config.switchPlugin.AcquisitionStarting(); config.yagPlugin.AcquisitionStarting(); config.analogPlugin.AcquisitionStarting(); for (int scanNumber = 0;; scanNumber++) { // prepare for the scan start config.outputPlugin.ScanStarting(); config.pgPlugin.ScanStarting(); config.shotGathererPlugin.ScanStarting(); config.switchPlugin.ScanStarting(); config.yagPlugin.ScanStarting(); config.analogPlugin.ScanStarting(); for (int pointNumber = 0; pointNumber < (int)config.outputPlugin.Settings["pointsPerScan"]; pointNumber++) { // calculate the new scan parameter and move the scan along config.outputPlugin.ScanParameter = NextScanParameter(pointNumber, scanNumber); // check for a change in the pg parameters lock (this) { if (tweakFlag) { // now it's safe to update the pattern generator settings // and ask the pg to reload SettingsReflector sr = new SettingsReflector(); sr.SetField(config.pgPlugin, latestTweak.parameter, latestTweak.newValue.ToString()); config.pgPlugin.ReloadPattern(); tweakFlag = false; } } ScanPoint sp = new ScanPoint(); sp.ScanParameter = config.outputPlugin.ScanParameter; for (int shotNum = 0; shotNum < (int)(config.outputPlugin.Settings["shotsPerPoint"]); shotNum++) { // Set the switch state config.switchPlugin.State = true; // wait for the data gatherer to finish config.shotGathererPlugin.ArmAndWait(); // read out the data sp.OnShots.Add(config.shotGathererPlugin.Shot); if ((bool)config.switchPlugin.Settings["switchActive"]) { config.switchPlugin.State = false; config.shotGathererPlugin.ArmAndWait(); sp.OffShots.Add(config.shotGathererPlugin.Shot); } } // sample the analog channels and add them to the ScanPoint config.analogPlugin.ArmAndWait(); sp.Analogs.AddRange(config.analogPlugin.Analogs); // send up the data bundle DataEventArgs evArgs = new DataEventArgs(); evArgs.point = sp; OnData(evArgs); // check for exit if (CheckIfStopping()) { AcquisitionFinishing(config); return; } } // prepare for the start of the next scan OnScanFinished(); config.pgPlugin.ScanFinished(); config.yagPlugin.ScanFinished(); config.outputPlugin.ScanFinished(); config.shotGathererPlugin.ScanFinished(); config.switchPlugin.ScanFinished(); config.analogPlugin.ScanFinished(); // I think that this pause will workaround an annoying threading bug // I should probably be less cheezy and put a lock in, but I'm not really // sure that I know what the bug is as it's intermittent (and rare). Thread.Sleep(750); // check if we are finished scanning if (scanNumber + 1 == numberOfScans) { backendState = AcquisitorState.stopped; // set the controller state to stopped Controller.GetController().appState = Controller.AppState.stopped; AcquisitionFinishing(config); return; } } } catch (Exception e) { // last chance exception handler - this stops a rogue exception in the // acquire loop from killing the whole program Console.Error.Write(e.Message + e.StackTrace); MessageBox.Show("Exception caught in acquire loop.\nTake care - the program " + "is probably unstable.\n" + e.Message + "\n" + e.StackTrace, "Acquire error", MessageBoxButtons.OK, MessageBoxIcon.Error); // Try and stop the pattern gracefully before the program dies config.pgPlugin.AcquisitionFinished(); lock (this) backendState = AcquisitorState.stopped; } }
public void Run() { manager.Window.WriteLine("ScanMaster command shell."); for (;;) { String command = manager.Window.GetNextLine(); if (manager.CurrentProfile == null) { manager.Window.WriteLine("No profile selected !"); continue; } if (Controller.GetController().appState != Controller.AppState.stopped) { if (command.StartsWith("tweak")) { manager.Window.WriteLine("Entering tweak mode ..."); TweakMode(command); continue; } manager.Window.WriteLine("Only tweak is available when acquiring."); continue; } // info on the current profile if (command == "i") { manager.Window.WriteLine(manager.CurrentProfile.ToString()); continue; } // update profile set to incorporate any newly introduced settings if (command == "refresh") { manager.UpdateProfiles(); manager.Window.WriteLine("Updated profiles."); continue; } if (command == "g") { if (groupEditMode) { groupEditMode = false; manager.Window.WriteLine("Group edit mode is off"); manager.Window.Prompt = ":> "; manager.Window.OutputColor = System.Drawing.Color.Lime; continue; } else { groupEditMode = true; manager.Window.WriteLine("Group edit mode is on. Current group " + manager.CurrentProfile.Group); manager.Window.Prompt = manager.CurrentProfile.Group + ":> "; manager.Window.OutputColor = System.Drawing.Color.White; continue; } } // anything after here (apart from a syntax error) will change the profiles // so this is an appropriate point to manager.ProfilesChanged = true; if (command.StartsWith("set") && groupEditMode) { manager.Window.WriteLine("You can't set things in group mode."); continue; } // changing plugins if (command == "set out") { String[] plugins = PluginRegistry.GetRegistry().GetOutputPlugins(); int r = ChoosePluginDialog(plugins); if (r != -1) { manager.CurrentProfile.AcquisitorConfig.SetOutputPlugin(plugins[r]); } continue; } if (command == "set shot") { String[] plugins = PluginRegistry.GetRegistry().GetShotGathererPlugins(); int r = ChoosePluginDialog(plugins); if (r != -1) { manager.CurrentProfile.AcquisitorConfig.SetShotGathererPlugin(plugins[r]); } continue; } if (command == "set pg") { String[] plugins = PluginRegistry.GetRegistry().GetPatternPlugins(); int r = ChoosePluginDialog(plugins); if (r != -1) { manager.CurrentProfile.AcquisitorConfig.SetPatternPlugin(plugins[r]); } continue; } if (command == "set yag") { String[] plugins = PluginRegistry.GetRegistry().GetYAGPlugins(); int r = ChoosePluginDialog(plugins); if (r != -1) { manager.CurrentProfile.AcquisitorConfig.SetYAGPlugin(plugins[r]); } continue; } if (command == "set analog") { String[] plugins = PluginRegistry.GetRegistry().GetAnalogPlugins(); int r = ChoosePluginDialog(plugins); if (r != -1) { manager.CurrentProfile.AcquisitorConfig.SetAnalogPlugin(plugins[r]); } continue; } if (command == "set switch") { String[] plugins = PluginRegistry.GetRegistry().GetSwitchPlugins(); int r = ChoosePluginDialog(plugins); if (r != -1) { manager.CurrentProfile.AcquisitorConfig.SetSwitchPlugin(plugins[r]); } continue; } // changing group if (command.StartsWith("set group")) { String[] bits = command.Split(new char[] { ' ' }); if (bits.Length != 3) { manager.Window.WriteLine("Syntax error."); continue; } manager.CurrentProfile.Group = bits[2]; manager.Window.WriteLine("Group changed"); continue; } // listing plugin settings if (command == "out") { String settings = sr.ListSettings(manager.CurrentProfile.AcquisitorConfig.outputPlugin); manager.Window.WriteLine(settings); continue; } if (command == "analog") { String settings = sr.ListSettings(manager.CurrentProfile.AcquisitorConfig.analogPlugin); manager.Window.WriteLine(settings); continue; } if (command == "switch") { String settings = sr.ListSettings(manager.CurrentProfile.AcquisitorConfig.switchPlugin); manager.Window.WriteLine(settings); continue; } if (command == "pg") { String settings = sr.ListSettings(manager.CurrentProfile.AcquisitorConfig.pgPlugin); manager.Window.WriteLine(settings); continue; } if (command == "yag") { String settings = sr.ListSettings(manager.CurrentProfile.AcquisitorConfig.yagPlugin); manager.Window.WriteLine(settings); continue; } if (command == "shot") { String settings = sr.ListSettings(manager.CurrentProfile.AcquisitorConfig.shotGathererPlugin); manager.Window.WriteLine(settings); continue; } if (command == "gui") { manager.Window.WriteLine("tofUpdate " + manager.CurrentProfile.GUIConfig.updateTOFsEvery); manager.Window.WriteLine("spectraUpdate " + manager.CurrentProfile.GUIConfig.updateSpectraEvery); manager.Window.WriteLine("switch " + manager.CurrentProfile.GUIConfig.displaySwitch); manager.Window.WriteLine("average " + manager.CurrentProfile.GUIConfig.average); continue; } // changing plugin settings if (command.StartsWith("out:") | command.StartsWith("analog:") | command.StartsWith("pg:") | command.StartsWith("yag:") | command.StartsWith("switch:") | command.StartsWith("shot:") | command.StartsWith("gui:")) { String[] bits = command.Split(new char[] { ':', ' ' }); if (bits.Length != 3) { manager.Window.WriteLine("Syntax error."); continue; } // special case for GUI settings (it's not a plugin) if (bits[0] == "gui") { if (groupEditMode) { manager.Window.WriteLine("Sorry, but, hilariously, there is no " + "group edit mode for GUI settings."); continue; } GUIConfiguration guiConfig = manager.CurrentProfile.GUIConfig; try { if (bits[1] == "tofUpdate") { guiConfig.updateTOFsEvery = Convert.ToInt32(bits[2]); manager.Window.WriteLine("GUI:tofUpdate updated."); continue; } if (bits[1] == "spectraUpdate") { guiConfig.updateSpectraEvery = Convert.ToInt32(bits[2]); manager.Window.WriteLine("GUI:spectraUpdate updated."); continue; } if (bits[1] == "switch") { guiConfig.displaySwitch = Convert.ToBoolean(bits[2]); manager.Window.WriteLine("GUI:switch updated."); continue; } if (bits[1] == "average") { guiConfig.average = Convert.ToBoolean(bits[2]); manager.Window.WriteLine("GUI:average updated."); continue; } manager.Window.WriteLine("Unrecognised parameter"); } catch (Exception) { manager.Window.WriteLine("Error."); } } else { if (groupEditMode) { // first, check to make sure that every profile in the group has such // a setting. ArrayList groupProfiles = manager.ProfilesInGroup(manager.CurrentProfile.Group); bool fieldFlag = true; foreach (Profile p in groupProfiles) { AcquisitorPlugin pl = PluginForString(p, bits[0]); if (!sr.HasField(pl, bits[1])) { fieldFlag = false; } } if (!fieldFlag) { manager.Window.WriteLine("You can only change the value of a setting in group " + "edit mode if all profiles in the group have that setting."); continue; } // if so, then set them all foreach (Profile p in groupProfiles) { AcquisitorPlugin plugin = PluginForString(p, bits[0]); if (sr.SetField(plugin, bits[1], bits[2])) { manager.Window.WriteLine(p.Name + ":" + bits[0] + ":" + bits[1] + " modified."); } else { manager.Window.WriteLine("Error setting field"); } } } else { AcquisitorPlugin plugin = PluginForString(manager.CurrentProfile, bits[0]); if (sr.SetField(plugin, bits[1], bits[2])) { manager.Window.WriteLine(bits[0] + ":" + bits[1] + " modified."); } else { manager.Window.WriteLine("Error setting field"); } } } continue; } // tweaking a setting // if we reach here there must be a syntax error manager.Window.WriteLine("Syntax error"); } }