Exemple #1
0
        // 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);
                }
            }
        }
Exemple #2
0
        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");
            }
        }