Inheritance: System.MarshalByRefObject
示例#1
0
 public static ScanPoint operator +(ScanPoint p1, ScanPoint p2)
 {
     if (p1.OnShots.Count == p2.OnShots.Count &&
         p1.OffShots.Count == p2.OffShots.Count &&
         p1.Analogs.Count == p2.Analogs.Count)
     {
         ScanPoint temp = new ScanPoint();
         temp.ScanParameter = p1.ScanParameter;
         for (int i = 0; i < p1.OnShots.Count; i++)
         {
             temp.OnShots.Add((Shot)p1.OnShots[i] + (Shot)p2.OnShots[i]);
         }
         for (int i = 0; i < p1.OffShots.Count; i++)
         {
             temp.OffShots.Add((Shot)p1.OffShots[i] + (Shot)p2.OffShots[i]);
         }
         for (int i = 0; i < p1.Analogs.Count; i++)
         {
             temp.Analogs.Add((double)p1.Analogs[i] + (double)p2.Analogs[i]);
         }
         return(temp);
     }
     else
     {
         if (p1.OnShots.Count == 0)
         {
             return(p2);
         }
         if (p2.OnShots.Count == 0)
         {
             return(p1);
         }
         return(null);
     }
 }
示例#2
0
        public static ScanPoint operator /(ScanPoint p, int n)
        {
            ScanPoint temp = new ScanPoint();

            temp.ScanParameter = p.ScanParameter;
            foreach (Shot s in p.OnShots)
            {
                temp.OnShots.Add(s / n);
            }
            foreach (Shot s in p.OffShots)
            {
                temp.OffShots.Add(s / n);
            }
            foreach (double a in p.Analogs)
            {
                temp.Analogs.Add(a / n);
            }
            return(temp);
        }
示例#3
0
 public static ScanPoint operator +(ScanPoint p1, ScanPoint p2)
 {
     if (p1.OnShots.Count == p2.OnShots.Count
         && p1.OffShots.Count == p2.OffShots.Count
         && p1.Analogs.Count == p2.Analogs.Count)
     {
         ScanPoint temp = new ScanPoint();
         temp.ScanParameter = p1.ScanParameter;
         for (int i = 0 ; i < p1.OnShots.Count ; i++)
             temp.OnShots.Add((Shot)p1.OnShots[i] + (Shot)p2.OnShots[i]);
         for (int i = 0 ; i < p1.OffShots.Count ; i++)
             temp.OffShots.Add((Shot)p1.OffShots[i] + (Shot)p2.OffShots[i]);
         for (int i = 0 ; i < p1.Analogs.Count ; i++)
             temp.Analogs.Add((double)p1.Analogs[i] + (double)p2.Analogs[i]);
         return temp;
     }
     else
     {
         if (p1.OnShots.Count == 0) return p2;
         if (p2.OnShots.Count == 0) return p1;
         return null;
     }
 }
示例#4
0
        private ScanPoint GetAverageScanPoint(double lowGate, double highGate)
        {
            Scan   ss = GetSortedScan();
            double scanParameterStart = ((ScanPoint)ss.points[0]).ScanParameter;
            double scanParameterEnd   = ((ScanPoint)ss.points[points.Count - 1]).ScanParameter;
            int    low = (int)Math.Ceiling(ss.points.Count * (lowGate - scanParameterStart) /
                                           (scanParameterEnd - scanParameterStart));
            int high = (int)Math.Floor(ss.points.Count * (highGate - scanParameterStart) /
                                       (scanParameterEnd - scanParameterStart));

            if (low < 0)
            {
                low = 0;
            }
            if (low >= ss.points.Count)
            {
                low = ss.points.Count - 2;
            }
            if (high < low)
            {
                high = low + 1;
            }
            if (high >= ss.points.Count)
            {
                high = ss.points.Count - 1;
            }

            ScanPoint temp = new ScanPoint();

            for (int i = low; i < high; i++)
            {
                temp += (ScanPoint)ss.points[i];
            }

            return(temp / (high - low));
        }
示例#5
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;
            }
        }
示例#6
0
 public void AddScanPoint(ScanPoint sp)
 {
     currentScan.Points.Add(sp);
 }
示例#7
0
        private ScanPoint GetAverageScanPoint(double lowGate, double highGate)
        {
            Scan ss = GetSortedScan();
            double scanParameterStart = ((ScanPoint)ss.points[0]).ScanParameter;
            double scanParameterEnd = ((ScanPoint)ss.points[points.Count -1]).ScanParameter;
            int low = (int)Math.Ceiling(ss.points.Count * (lowGate - scanParameterStart) /
                (scanParameterEnd - scanParameterStart));
            int high = (int)Math.Floor(ss.points.Count * (highGate - scanParameterStart) /
                (scanParameterEnd - scanParameterStart));
            if (low < 0) low = 0;
            if (low >= ss.points.Count) low = ss.points.Count - 2;
            if (high < low) high = low + 1;
            if (high >= ss.points.Count) high = ss.points.Count -1;

            ScanPoint temp = new ScanPoint();
            for (int i = low ; i < high ; i++) temp += (ScanPoint)ss.points[i];

            return temp /(high-low);
        }
示例#8
0
 public static ScanPoint operator /(ScanPoint p, int n)
 {
     ScanPoint temp = new ScanPoint();
     temp.ScanParameter = p.ScanParameter;
     foreach (Shot s in p.OnShots) temp.OnShots.Add(s/n);
     foreach (Shot s in p.OffShots) temp.OffShots.Add(s/n);
     foreach (double a in p.Analogs) temp.Analogs.Add(a/n);
     return temp;
 }