示例#1
0
        private void initializeSpectrometer()
        {
            if (spectrometer != null && !backgroundWorkerAcquisition.IsBusy)
            {
                spectrometer.close();
                spectrometer = null;
            }

            if ((spectrometer == null || !spectrometer.isOk()) && !backgroundWorkerAcquisition.IsBusy)
            {
                logger.display("Initializing spectrometer...");
                spectrometer = new SeaBreezeSpectrometer();

                spectrometer.setLogger(logger);

                string version = spectrometer.getVersion();
                if (version != null)
                {
                    this.Text = String.Format("SeaBreeze C# Demo (Demo v{0}) (SeaBreeze v{1})",
                                              Assembly.GetExecutingAssembly().GetName().Version.ToString(),
                                              version);
                }
                else
                {
                    logger.display("Warning: can't get SeaBreeze version number");
                }

                spectrometer.open();
                if (spectrometer.isOk())
                {
                    serialNumber     = spectrometer.getSerialNumber();
                    spectrometerType = spectrometer.getSpectrometerType();
                    pixels           = spectrometer.getPixelCount();
                    wavelengths      = spectrometer.getWavelengths();
                    rawSpectrum      = new double[pixels];

                    logger.display("Successfully claimed {0} with {1} pixels", spectrometerType, pixels);

                    collectionArea = spectrometer.getCollectionArea();
                    irradCal       = spectrometer.getIrradianceCalibration();
                    if (collectionArea <= 0 || irradCal == null)
                    {
                        checkBoxEnableIrradiance.Checked = false;
                        checkBoxEnableIrradiance.Enabled = false;
                    }
                    else
                    {
                        checkBoxEnableIrradiance.Enabled = true;
                        logger.display("Irradiance Collection Area = {0} cm^2", collectionArea);
                    }

                    logger.display("Electrically dark pixel indices:");
                    edcIndices = spectrometer.getEDCIndices();
                    for (int i = 0; i < edcIndices.Length; i++)
                    {
                        logger.display("  [{0}] = {1}", i, edcIndices[i]);
                    }

                    logger.display("Non-Linearity Correction Coefficients:");
                    nlcCoeffs = spectrometer.getNLCCoeffs();
                    if (nlcCoeffs != null)
                    {
                        for (int i = 0; i < nlcCoeffs.Length; i++)
                        {
                            logger.display("  [{0}] = {1}", i, nlcCoeffs[i]);
                        }
                    }

                    // buttonSave.Enabled = true;
                    btnScan.Enabled = true;
                    Refresh();
                }
                else
                {
                    logger.display("Failed to initialize spectrometer");
                    MessageBox.Show(
                        "No usable spectrometer available",
                        "SeaBreeze",
                        MessageBoxButtons.OK,
                        MessageBoxIcon.Error,
                        MessageBoxDefaultButton.Button1,
                        MessageBoxOptions.DefaultDesktopOnly,
                        false);
                }
            }
            else
            {
                logger.log("Spectrometer already initialized");
            }
        }
示例#2
0
        ////////////////////////////////////////////////////////////////////////
        // public methods
        ////////////////////////////////////////////////////////////////////////

        /// <summary>
        /// Iterate over all discoverable Wasatch Photonics USB spectrometers,
        /// and return the number found. Individual spectrometers can then be
        /// accessed via the getSpectrometer(index) call.
        /// </summary>
        /// <returns>number of Wasatch Photonics USB spectrometers found</returns>
        public int openAllSpectrometers()
        {
            logger.debug("Wasatch.NET v{0}", Assembly.GetExecutingAssembly().GetName().Version.ToString());

            SortedDictionary <string, List <Spectrometer> > sorted = new SortedDictionary <string, List <Spectrometer> >();

            // This requires libusb-1.0.dll in the path, and generates a slew of errors like:
            // MonoUsbProfileHandle : ReleaseHandle #9
            // LibUsbDotNet.LudnMonoLibUsb.MonoUsbDevice[non - UsbEndpointBase]: MonoApiError: GetDescriptor Failed
            // LibUsbDotNet.LudnMonoLibUsb.MonoUsbDevice[non - UsbEndpointBase]: Win32Error: GetLangIDs
            //
            // UsbDevice.ForceLibUsbWinBack = true;

            // This seems to be mainly for Linux
            UsbDevice.ForceLegacyLibUsb = false;

            UsbDevice.UsbErrorEvent += OnUsbError;

            UsbRegDeviceList deviceRegistries = UsbDevice.AllDevices;

            foreach (UsbRegistry usbRegistry in deviceRegistries)
            {
                String desc = String.Format("Vid:0x{0:x4} Pid:0x{1:x4} (rev:{2}) - {3}",
                                            usbRegistry.Vid,
                                            usbRegistry.Pid,
                                            (ushort)usbRegistry.Rev,
                                            usbRegistry[SPDRP.DeviceDesc]);

                if (logger.debugEnabled())
                {
                    logger.debug("USB Registry for: {0}", desc);
                    logDevice(usbRegistry);
                }

                if (usbRegistry.Vid == 0x24aa)
                {
                    Spectrometer spectrometer = new Spectrometer(usbRegistry);
                    if (spectrometer.open())
                    {
                        // sort them by model, serial (allow duplicates for unconfigured)
                        // TODO: is there any way to deterministically sort between units
                        //       without a configured unique serial number?
                        string key = String.Format("{0}-{1}", spectrometer.eeprom.model, spectrometer.eeprom.serialNumber);
                        if (!sorted.ContainsKey(key))
                        {
                            sorted.Add(key, new List <Spectrometer>());
                        }
                        sorted[key].Add(spectrometer);
                        logger.debug("openAllSpectrometers: found key {0} ({1})", key, desc);
                    }
                    else
                    {
                        logger.error("openAllSpectrometers: failed to open {0}", desc);
                    }
                }
                else
                {
                    logger.debug("openAllSpectrometers: ignored {0}", desc);
                }
            }

            // add to final list in sorted order
            spectrometers.Clear();
            foreach (KeyValuePair <string, List <Spectrometer> > pair in sorted)
            {
                foreach (Spectrometer s in pair.Value)
                {
                    spectrometers.Add(s);
                    logger.debug("openAllSpectrometers: index {0}: {1} {2}", spectrometers.Count - 1, s.model, s.serialNumber);
                }
            }

            return(spectrometers.Count);
        }