Beispiel #1
0
        private void initializeSpectrometers()
        {
            // assume initialization will fail
            btnScan.Enabled = false;
            checkBoxEnableIrradiance.Enabled = false;

            // support re-entry
            if (numberOfSpectrometers > 0)
            {
                wrapper.closeAllSpectrometers();
            }

            // initialize everything
            specIndices       = null;
            pixels            = null;
            wavelengths       = null;
            newestSpectrum    = null;
            graphableSpectrum = null;
            serialNumbers     = null;
            modelNames        = null;
            backgroundWorkers = null;
            graphSeries       = null;
            chartSpectrum.Series.Clear();
            saveCounts      = null;
            scanning        = null;
            gpios           = null;
            bufferedSpectra = null;

            wrapper.openAllSpectrometers();
            numberOfSpectrometers = wrapper.getNumberOfSpectrometersFound();
            logger.display("Found {0} spectrometers", numberOfSpectrometers);
            if (numberOfSpectrometers < 1)
            {
                logger.display("ERROR: no spectrometers found");
                return;
            }

            specIndices              = new List <int>();
            scanning                 = new HashSet <int>();
            pixels                   = new Dictionary <int, int>();
            lampEnabled              = new Dictionary <int, bool>();
            saveCounts               = new Dictionary <int, int>();
            collectionAreas          = new Dictionary <int, double>();
            wavelengths              = new Dictionary <int, double[]>();
            newestSpectrum           = new Dictionary <int, double[]>();
            graphableSpectrum        = new Dictionary <int, double[]>();
            serialNumbers            = new Dictionary <int, string>();
            modelNames               = new Dictionary <int, string>();
            graphSeries              = new Dictionary <int, Series>();
            backgroundWorkers        = new Dictionary <int, BackgroundWorker>();
            integrationTimesMillisec = new Dictionary <int, int>();
            lastScanTimes            = new Dictionary <int, DateTime>();
            gpios           = new Dictionary <int, OmniDriver.NETGPIO>();
            bufferedSpectra = new Dictionary <int, List <Tuple <DateTime, double[]> > >();

            for (int specIndex = 0; specIndex < numberOfSpectrometers; specIndex++)
            {
                specIndices.Add(specIndex);

                // initialize metadata for each spectrometer
                integrationTimesMillisec.Add(specIndex, 100);
                serialNumbers.Add(specIndex, wrapper.getSerialNumber(specIndex));
                modelNames.Add(specIndex, wrapper.getName(specIndex));
                pixels.Add(specIndex, wrapper.getNumberOfPixels(specIndex));
                newestSpectrum.Add(specIndex, new double[pixels[specIndex]]);
                graphableSpectrum.Add(specIndex, new double[pixels[specIndex]]);
                backgroundWorkers.Add(specIndex, new BackgroundWorker());
                lampEnabled.Add(specIndex, false);
                wavelengths.Add(specIndex, wrapper.getWavelengths(specIndex));
                bufferedSpectra.Add(specIndex, new List <Tuple <DateTime, double[]> >());
                saveCounts[specIndex] = 0;

                // apply reasonable defaults
                logger.log("setting defaults for spectrometer {0}", specIndex);
                wrapper.setCorrectForElectricalDark(specIndex, 1);
                wrapper.setCorrectForDetectorNonlinearity(specIndex, 1);
                wrapper.setStrobeEnable(specIndex, 0);

                if (wrapper.isFeatureSupportedGPIO(specIndex) != 0)
                {
                    gpios.Add(specIndex, wrapper.getFeatureControllerGPIO(specIndex));

                    // initialize everything to zero (easiest way to match starting checkbox state)
                    OmniDriver.NETBitSet allBits = new OmniDriver.NETBitSet();
                    allBits.set(0);
                    gpios[specIndex].setDirectionAllBits(allBits);
                    gpios[specIndex].setMuxAllBits(allBits);
                    gpios[specIndex].setValueAllBits(allBits);
                }
                else
                {
                    gpios.Add(specIndex, null);
                }

                // create graph series
                logger.log("configuring graph for spectrometer {0}", specIndex);
                graphSeries.Add(specIndex, new Series());
                graphSeries[specIndex].ChartType = SeriesChartType.Line;
                graphSeries[specIndex].Name      = String.Format("{0}: {1} {2}", specIndex, modelNames[specIndex], serialNumbers[specIndex]);
                chartSpectrum.Series.Add(graphSeries[specIndex]);

                // create a background thread for each spectrometer (allows each to run at their own integration time, etc)
                logger.log("configuring BackgroundWorker for spectrometer {0}", specIndex);
                backgroundWorkers[specIndex].WorkerReportsProgress      = true;
                backgroundWorkers[specIndex].WorkerSupportsCancellation = true;
                backgroundWorkers[specIndex].DoWork             += backgroundWorker_DoWork;
                backgroundWorkers[specIndex].ProgressChanged    += backgroundWorker_ProgressChanged;
                backgroundWorkers[specIndex].RunWorkerCompleted += backgroundWorker_RunWorkerCompleted;

                string firmwareVersion = wrapper.getFirmwareVersion(specIndex);

                double startWavelength = -1;
                double lastWavelength  = -1;
                if (wavelengths[specIndex] != null)
                {
                    startWavelength = wavelengths[specIndex][0];
                    lastWavelength  = wavelengths[specIndex][pixels[specIndex] - 1];
                }

                logger.display("Spectrometer at index {0} is a/n {1} with serial {2}, firmware {3} and {4} pixels from {5:0.00} to {6:0.00}nm",
                               specIndex, modelNames[specIndex], serialNumbers[specIndex], firmwareVersion,
                               pixels[specIndex], startWavelength, lastWavelength);
            }

            btnScan.Enabled = true;
            Refresh();
        }