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"); } }
//////////////////////////////////////////////////////////////////////// // 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); }