Wasatch.PY is a Python application-level driver for Wasatch Photonics spectrometers. It has been tested on Windows, Linux and MacOS platforms, and is directly used by Wasatch's own ENLIGHTEN™ spectroscopy desktop GUI.
If you'd like simpler, smaller examples of how to perform individual operations against Wasatch spectrometers from Python, please also see our Python Example Scripts repository.
This project can be viewed as a conceptual successor to the earlier WasatchUSB. The main differences are that while WasatchUSB was a copy-paste of key ENLIGHTEN functionality, Wasatch.PY literally is a dependency of ENLIGHTEN. As a result, when we fix or add ENLIGHTEN features, Wasatch.PY will be updated by necessity; making the same foundational interface available to all our users.
WasatchUSB, in contrast, had the potential to drift out-of-sync with ENLIGHTEN
internals, such that customers and company might experience different results.
This new shared library exemplifies one of our core values: all about
dogfooding!
Finally, the updated project name reflects the fact that this is specifically a Python binding and implementation; for other USB-capable interfaces, see our WasatchUSB or upcoming Wasatch.CPP libraries!
Until we draft proper API documentation, these are the standard settings which can be passed to device.change_setting(). Booleans should be passed with an argument of 1 (enable) or 0 (disable).
- "laser_enable" (bool)
- "integration" (int (milliseconds))
- "detector_tec_setpoint_degC" (int)
- "detector_tec_enable" (bool)
- "degC_to_dac_coeffs" (string of 3 space-delimited floats, e.g. "1.1 2.2 3.3")
- "laser_power_perc" (int, 0 to 100 inclusive)
- "laser_temperature_setpoint_raw" (int, 0 to 127 inclusive)
- "ccd_gain" (float)
- "high_gain_mode_enable" (bool)
- "ccd_trigger" (bool)
- "scans_to_average" (int, 0 or 1 to disable)
- "bad_pixel_mode" (wasatch.common.bad_pixel_mode_none or _average))
- "log_level" (int, see Python logging levels)
Note that there are many more functions available in fid_hardware.py and sp_hardware.py (via devices.hardware) but these are not yet fully documented.
Wasatch.PY uses the Python 2.7 build of Miniconda for dependencies and package management.
Following are the general usage instructions for the included command-line demo scripts. After find specific Anaconda setup instructions for Windows, MacOS and other tested platforms.
usage: demo.py [-h] [-l LOG_LEVEL] [-o BUS_ORDER] [-i INTEGRATION_TIME_MS]
[-s SCANS_TO_AVERAGE] [-w BOXCAR_HALF_WIDTH] [-d DELAY_MS]
[-f OUTFILE] [-m MAX] [-b]
Simple demo to acquire spectra from command-line interface
optional arguments:
-h, --help show this help message and exit
-l LOG_LEVEL, --log-level LOG_LEVEL
logging level [DEBUG,INFO,WARNING,ERROR,CRITICAL]
-o BUS_ORDER, --bus-order BUS_ORDER
usb device ordinal to connect
-i INTEGRATION_TIME_MS, --integration-time-ms INTEGRATION_TIME_MS
integration time (ms, default 10)
-s SCANS_TO_AVERAGE, --scans-to-average SCANS_TO_AVERAGE
scans to average (default 1)
-w BOXCAR_HALF_WIDTH, --boxcar-half-width BOXCAR_HALF_WIDTH
boxcar half-width (default 0)
-d DELAY_MS, --delay-ms DELAY_MS
delay between integrations (ms, default 1000)
-f OUTFILE, --outfile OUTFILE
output filename (e.g. path/to/spectra.csv)
-m MAX, --max MAX max spectra to acquire (default 0, unlimited)
-b, --non-blocking non-blocking USB interface
The following session was run on Windows 10 using the Cmd shell of Git for Windows and Miniconda (Python 2.7):
C:\Users\mzieg>set PATH=%HOME%\miniconda2;%HOME%\miniconda2\scripts;%PATH%
C:\Users\mzieg>cd work\code\Wasatch.PY
C:\Users\mzieg\work\code\Wasatch.PY>conda update conda
C:\Users\mzieg\work\code\Wasatch.PY>cp environments\conda-win10.yml environment.yml
C:\Users\mzieg\work\code\Wasatch.PY>conda env create -n wasatch
Solving environment: done
Preparing transaction: done
Verifying transaction: done
Executing transaction: done
Requirement already satisfied: future==0.16.0 in c:\users\mzieg\miniconda2\envs\conda_enlighten\lib\site-packages (from -r C:\Users\mzieg\work\code\Wasatch.PY\condaenv.xq_jth.requirements.txt (line 1))
Collecting pefile==2016.3.28 (from -r C:\Users\mzieg\work\code\Wasatch.PY\condaenv.xq_jth.requirements.txt (line 2))
Requirement already satisfied: pygtail==0.7.0 in c:\users\mzieg\miniconda2\envs\conda_enlighten\lib\site-packages (from -r C:\Users\mzieg\work\code\Wasatch.PY\condaenv.xq_jth.requirements.txt (line 3))
Requirement already satisfied: pyside==1.2.4 in c:\users\mzieg\miniconda2\envs\conda_enlighten\lib\site-packages (from -r C:\Users\mzieg\work\code\Wasatch.PY\condaenv.xq_jth.requirements.txt (line 4))
Requirement already satisfied: pytest-capturelog==0.7 in c:\users\mzieg\miniconda2\envs\conda_enlighten\lib\site-packages (from -r C:\Users\mzieg\work\code\Wasatch.PY\condaenv.xq_jth.requirements.txt (line 5))
Requirement already satisfied: pytest-qt==2.1.0 in c:\users\mzieg\miniconda2\envs\conda_enlighten\lib\site-packages (from -r C:\Users\mzieg\work\code\Wasatch.PY\condaenv.xq_jth.requirements.txt (line 6))
Requirement already satisfied: pyusb==1.0.0 in c:\users\mzieg\miniconda2\envs\conda_enlighten\lib\site-packages (from -r C:\Users\mzieg\work\code\Wasatch.PY\condaenv.xq_jth.requirements.txt (line 7))
Requirement already satisfied: requests==2.13.0 in c:\users\mzieg\miniconda2\envs\conda_enlighten\lib\site-packages (from -r C:\Users\mzieg\work\code\Wasatch.PY\condaenv.xq_jth.requirements.txt (line 8))
Requirement already satisfied: py>=1.1.1 in c:\users\mzieg\miniconda2\envs\conda_wasatch\lib\site-packages (from pytest-capturelog==0.7->-r C:\Users\mzieg\work\code\Wasatch.PY\condaenv.xq_jth.requirements.txt (line 5))
Requirement already satisfied: pytest>=2.7.0 in c:\users\mzieg\miniconda2\envs\conda_wasatch\lib\site-packages (from pytest-qt==2.1.0->-r C:\Users\mzieg\work\code\Wasatch.PY\condaenv.xq_jth.requirements.txt (line 6))
Requirement already satisfied: colorama in c:\users\mzieg\miniconda2\envs\conda_wasatch\lib\site-packages (from pytest>=2.7.0->pytest-qt==2.1.0->-r C:\Users\mzieg\work\code\Wasatch.PY\condaenv.xq_jth.requirements.txt (line 6))
Installing collected packages: pefile
Found existing installation: pefile 2017.11.5
Uninstalling pefile-2017.11.5:
Successfully uninstalled pefile-2017.11.5
Successfully installed pefile-2016.3.28
C:\Users\mzieg\work\code\Wasatch.PY>activate wasatch
C:\Users\mzieg\work\code\Wasatch.PY>python demo.py --outfile data.csv --integration-time-ms 100 --delay-ms 500
2018-01-22 15:20:12,457 MainProcess wasatch.fid_hardware INFO reading EEPROM page 1
2018-01-22 15:20:12,473 MainProcess wasatch.fid_hardware INFO reading EEPROM page 0
2018-01-22 15:20:12,473 MainProcess wasatch.fid_hardware INFO reading EEPROM page 2
2018-01-22 15:20:12,490 MainProcess wasatch.fid_hardware INFO reading EEPROM page 5
2018-01-22 15:20:12,490 MainProcess wasatch.fid_hardware INFO EEPROM settings:
2018-01-22 15:20:12,490 MainProcess wasatch.fid_hardware INFO Wavecal coeff0: 399.24130249
2018-01-22 15:20:12,490 MainProcess wasatch.fid_hardware INFO Wavecal coeff1: 0.43601000309
2018-01-22 15:20:12,490 MainProcess wasatch.fid_hardware INFO Wavecal coeff2: -7.33139968361e-05
2018-01-22 15:20:12,490 MainProcess wasatch.fid_hardware INFO Wavecal coeff3: 2.80489995674e-08
2018-01-22 15:20:12,490 MainProcess wasatch.fid_hardware INFO Calibration date: 6/2
2018-01-22 15:20:12,490 MainProcess wasatch.fid_hardware INFO Calibrated by: NH
2018-01-22 15:20:12,490 MainProcess wasatch.fid_hardware INFO Excitation (nm): 0
2018-01-22 15:20:12,490 MainProcess wasatch.fid_hardware INFO Slit size (um): 50
2018-01-22 15:20:12,490 MainProcess wasatch.fid_hardware INFO degCToDAC coeff0: 6.30511975963e-10
2018-01-22 15:20:12,490 MainProcess wasatch.fid_hardware INFO degCToDAC coeff1: 1.68748300666e-07
2018-01-22 15:20:12,490 MainProcess wasatch.fid_hardware INFO degCToDAC coeff2: 0.10000000149
2018-01-22 15:20:12,490 MainProcess wasatch.fid_hardware INFO adcToDegC coeff0: 66.0
2018-01-22 15:20:12,490 MainProcess wasatch.fid_hardware INFO adcToDegC coeff1: -0.00999999977648
2018-01-22 15:20:12,490 MainProcess wasatch.fid_hardware INFO adcToDegC coeff2: -9.99999974738e-05
2018-01-22 15:20:12,505 MainProcess wasatch.fid_hardware INFO Det temp min: 20
2018-01-22 15:20:12,505 MainProcess wasatch.fid_hardware INFO Det temp max: 10
2018-01-22 15:20:12,505 MainProcess wasatch.fid_hardware INFO TEC R298: 0
2018-01-22 15:20:12,505 MainProcess wasatch.fid_hardware INFO TEC beta: 0
2018-01-22 15:20:12,505 MainProcess wasatch.fid_hardware INFO Detector name: S10141
2018-01-22 15:20:12,505 MainProcess wasatch.fid_hardware INFO Pixels: 1024
2018-01-22 15:20:12,505 MainProcess wasatch.fid_hardware INFO Pixel height: 1
2018-01-22 15:20:12,505 MainProcess wasatch.fid_hardware INFO Min integration: 1
2018-01-22 15:20:12,505 MainProcess wasatch.fid_hardware INFO Max integration: 60000
2018-01-22 15:20:12,505 MainProcess wasatch.fid_hardware INFO Bad Pixels: []
2018-01-22 15:20:12,505 MainProcess wasatch.devices INFO Connected to 0x24aa:0x1000
2018-01-22 15:20:12,505 MainProcess wasatch.devices INFO Connected to feature identification device
2018-01-22 15:20:12,520 MainProcess wasatch.devices INFO Serial: WP-00154
2018-01-22 15:20:12,520 MainProcess wasatch.devices INFO Firmware: 10.0.0.6
2018-01-22 15:20:12,520 MainProcess wasatch.devices INFO Int Time: 100
2018-01-22 15:20:12,520 MainProcess wasatch.devices INFO FPGA: 026-007
2018-01-22 15:20:12,520 MainProcess wasatch.devices INFO Gain: 1.90234375
2018-01-22 15:20:12,520 MainProcess wasatch.devices INFO Model: VIS
2018-01-22 15:20:12,520 MainProcess __main__ INFO connect: device connected
2018-01-22 15:20:12,520 MainProcess __main__ INFO Press Control-Break to interrupt...
2018-01-22 15:20:12,630 MainProcess __main__ INFO Reading: 1 Detector: 66.00 degC Min: 909.00 Max: 31491.00 Avg: 2097.14
2018-01-22 15:20:13,115 MainProcess __main__ INFO Reading: 2 Detector: 66.00 degC Min: 911.00 Max: 31394.00 Avg: 2097.02
2018-01-22 15:20:13,630 MainProcess __main__ INFO Reading: 3 Detector: 66.00 degC Min: 916.00 Max: 31253.00 Avg: 2097.88
2018-01-22 15:20:14,145 MainProcess __main__ INFO Reading: 4 Detector: 66.00 degC Min: 916.00 Max: 31432.00 Avg: 2098.49
2018-01-22 15:20:14,661 MainProcess __main__ INFO Reading: 5 Detector: 66.00 degC Min: 913.00 Max: 31460.00 Avg: 2097.57
^C
Z:\work\code\Wasatch.PY>head data.csv | cut -c1-50
time,temp,399.24,399.68,400.11,400.55,400.98,401.4 # header row + wavelengths
2018-01-22 15:20:12.630000,66.00,909.00,945.00,953
2018-01-22 15:20:13.115000,66.00,918.00,920.00,932
2018-01-22 15:20:13.630000,66.00,916.00,937.00,945
2018-01-22 15:20:14.146000,66.00,916.00,924.00,956
2018-01-22 15:20:14.661000,66.00,913.00,941.00,951
IMPORTANT: For Linux, you must copy the file udev/10-wasatch.rules from the Wasatch.PY distribution to /etc/udev/rules.d, then HUP udev or reboot. This will require root (sudo) privs, and is required to give userland applications access to USB devices matching Wasatch VID/PID.
The following was tested under Ubuntu 16.04 LTS:
$ uname -a
Linux ubuntu 4.4.0-59-generic #80-Ubuntu SMP Fri Jan 6 17:47:47 UTC 2017 x86_64 x86_64 x86_64 GNU/Linux
$ conda update -q conda
$ ln -s environments/conda-linux.yml environment.yml
$ conda env create -n wasatch
$ source activate wasatch
(wasatch) ubuntu [~/work/code/Wasatch.PY] parallels 07:17 PM $ python demo.py
2018-01-22 19:17:12,041 MainProcess wasatch.fid_hardware INFO reading EEPROM page 1
2018-01-22 19:17:12,052 MainProcess wasatch.fid_hardware INFO reading EEPROM page 0
2018-01-22 19:17:12,061 MainProcess wasatch.fid_hardware INFO reading EEPROM page 2
2018-01-22 19:17:12,071 MainProcess wasatch.fid_hardware INFO reading EEPROM page 5
2018-01-22 19:17:12,081 MainProcess wasatch.fid_hardware INFO EEPROM settings:
2018-01-22 19:17:12,081 MainProcess wasatch.fid_hardware INFO Wavecal coeff0: 399.24130249
2018-01-22 19:17:12,082 MainProcess wasatch.fid_hardware INFO Wavecal coeff1: 0.43601000309
2018-01-22 19:17:12,082 MainProcess wasatch.fid_hardware INFO Wavecal coeff2: -7.33139968361e-05
2018-01-22 19:17:12,082 MainProcess wasatch.fid_hardware INFO Wavecal coeff3: 2.80489995674e-08
2018-01-22 19:17:12,082 MainProcess wasatch.fid_hardware INFO Calibration date: 6/2
2018-01-22 19:17:12,083 MainProcess wasatch.fid_hardware INFO Calibrated by: NH
2018-01-22 19:17:12,083 MainProcess wasatch.fid_hardware INFO Excitation (nm): 0
2018-01-22 19:17:12,083 MainProcess wasatch.fid_hardware INFO Slit size (um): 50
2018-01-22 19:17:12,083 MainProcess wasatch.fid_hardware INFO degCToDAC coeff0: 6.30511975963e-10
2018-01-22 19:17:12,083 MainProcess wasatch.fid_hardware INFO degCToDAC coeff1: 1.68748300666e-07
2018-01-22 19:17:12,083 MainProcess wasatch.fid_hardware INFO degCToDAC coeff2: 0.10000000149
2018-01-22 19:17:12,083 MainProcess wasatch.fid_hardware INFO adcToDegC coeff0: 66.0
2018-01-22 19:17:12,084 MainProcess wasatch.fid_hardware INFO adcToDegC coeff1: -0.00999999977648
2018-01-22 19:17:12,084 MainProcess wasatch.fid_hardware INFO adcToDegC coeff2: -9.99999974738e-05
2018-01-22 19:17:12,084 MainProcess wasatch.fid_hardware INFO Det temp min: 20
2018-01-22 19:17:12,084 MainProcess wasatch.fid_hardware INFO Det temp max: 10
2018-01-22 19:17:12,084 MainProcess wasatch.fid_hardware INFO TEC R298: 0
2018-01-22 19:17:12,084 MainProcess wasatch.fid_hardware INFO TEC beta: 0
2018-01-22 19:17:12,084 MainProcess wasatch.fid_hardware INFO Detector name: S10141
2018-01-22 19:17:12,084 MainProcess wasatch.fid_hardware INFO Pixels: 1024
2018-01-22 19:17:12,085 MainProcess wasatch.fid_hardware INFO Pixel height: 1
2018-01-22 19:17:12,085 MainProcess wasatch.fid_hardware INFO Min integration: 1
2018-01-22 19:17:12,085 MainProcess wasatch.fid_hardware INFO Max integration: 60000
2018-01-22 19:17:12,085 MainProcess wasatch.fid_hardware INFO Bad Pixels: []
2018-01-22 19:17:12,085 MainProcess wasatch.devices INFO Connected to 0x24aa:0x1000
2018-01-22 19:17:12,085 MainProcess wasatch.devices INFO Connected to feature identification device
2018-01-22 19:17:12,112 MainProcess wasatch.devices INFO Serial: WP-00154
2018-01-22 19:17:12,112 MainProcess wasatch.devices INFO Firmware: 10.0.0.6
2018-01-22 19:17:12,112 MainProcess wasatch.devices INFO Int Time: 0
2018-01-22 19:17:12,112 MainProcess wasatch.devices INFO FPGA: 026-007
2018-01-22 19:17:12,113 MainProcess wasatch.devices INFO Gain: 1.90234375
2018-01-22 19:17:12,113 MainProcess wasatch.devices INFO Model: VIS
2018-01-22 19:17:12,113 MainProcess __main__ INFO connect: device connected
2018-01-22 19:17:12,113 MainProcess __main__ INFO Press Control-Break to interrupt...
2018-01-22 19:17:12,129 MainProcess __main__ INFO Reading: 1 Detector: 66.00 degC Min: 812.00 Max: 1333.00 Avg: 846.03
2018-01-22 19:17:13,136 MainProcess __main__ INFO Reading: 2 Detector: 66.00 degC Min: 819.00 Max: 3068.00 Avg: 900.29
2018-01-22 19:17:14,136 MainProcess __main__ INFO Reading: 3 Detector: 66.00 degC Min: 825.00 Max: 3043.00 Avg: 900.32
2018-01-22 19:17:15,138 MainProcess __main__ INFO Reading: 4 Detector: 66.00 degC Min: 821.00 Max: 3119.00 Avg: 901.80
2018-01-22 19:17:16,140 MainProcess __main__ INFO Reading: 5 Detector: 66.00 degC Min: 819.00 Max: 981.00 Avg: 844.84
^C
The following was tested under MacOS 10.13.2 ("High Sierra"):
$ conda update -q conda
$ ln -s environments/conda-macos.yml environment.yml
$ conda env create -n wasatch
Solving environment: done
Preparing transaction: done
Verifying transaction: done
Executing transaction: done
Collecting future==0.16.0 (from -r /Users/mzieg/work/code/Wasatch.PY/condaenv.LqSNvr.requirements.txt (line 1))
Collecting pygtail==0.7.0 (from -r /Users/mzieg/work/code/Wasatch.PY/condaenv.LqSNvr.requirements.txt (line 2))
Collecting pyusb==1.0.0 (from -r /Users/mzieg/work/code/Wasatch.PY/condaenv.LqSNvr.requirements.txt (line 3))
Collecting requests==2.13.0 (from -r /Users/mzieg/work/code/Wasatch.PY/condaenv.LqSNvr.requirements.txt (line 4))
Using cached requests-2.13.0-py2.py3-none-any.whl
Installing collected packages: future, pygtail, pyusb, requests
Successfully installed future-0.16.0 pygtail-0.7.0 pyusb-1.0.0 requests-2.13.0
$ source activate wasatch
$ python demo.py --outfile spectra.csv
2018-01-22 16:45:10,611 MainProcess __main__ INFO connect: device connected
2018-01-22 16:45:10,611 MainProcess __main__ INFO Press Control-Break to interrupt...
2018-01-22 16:45:10,628 MainProcess __main__ INFO Reading: 1 Detector: 66.00 degC Min: 833.00 Max: 3888.00 Avg: 940.95
2018-01-22 16:45:11,631 MainProcess __main__ INFO Reading: 2 Detector: 66.00 degC Min: 829.00 Max: 3897.00 Avg: 940.13
2018-01-22 16:45:12,635 MainProcess __main__ INFO Reading: 3 Detector: 66.00 degC Min: 829.00 Max: 3909.00 Avg: 941.80
2018-01-22 16:45:13,637 MainProcess __main__ INFO Reading: 4 Detector: 66.00 degC Min: 829.00 Max: 3878.00 Avg: 940.21
MacOS doesn't allow usb.core.find() to be called from a forked background process. This is the error message you get:
"The process has forked and you cannot use this CoreFoundation functionality
safely. You MUST exec()."
It probably traces back to this:
https://discussions.apple.com/message/5829688#message5829688
Will investigate workarounds pending prioritization, but since the default blocking mode works, this shouldn't be a major problem until we port ENLIGHTEN to MacOS.
Using Homebrew, type:
$ brew install libusb
- provide simplified blocking API
- provide rendered API documentation (http://www.sphinx-doc.org/en/master/)
- 2018-10-03 0.9.14
- fixed demo.py --outfile
- 2018-09-27 0.9.13
- fixed demo.py integration time
- 2018-09-25 0.9.12
- ARM triggering
- 2018-08-22 0.9.11
- improved exception handling
- 2018-08-14 0.9.10
- InGaAs offset/gain processing in software
- 2018-07-31 0.9.9
- added dependency on pexpect for testing
- 2018-07-31 0.9.8
- added utils.interpolate_array
- 2018-07-13 0.9.7
- converted WasatchShell into a wrapper over Wasatch.PY
- added numerous getters
- added BalanceAcquisition
- 2018-07-13 0.9.6
- added Doxyfile
- moved class/method docs to Doxygen format
- 2018-07-11 0.9.5
- added comms_init
- 2018-07-10 0.9.4
- added StatusMessage
- 2018-07-05 0.9.3
- added graph_alternating_pixels
- 2018-06-13 0.9.2
- internally track FileSpectrometer integration time state
- 2018-06-12 0.9.1
- fixed shell.py's "get_config"
- 2018-06-12 0.9.0
- taking spectra from IMX
- 2018-06-08 0.8.9
- detector_ccd/offset_odd stubbed
- fixed command de-dupping
- 2018-06-07 0.8.8
- peak math
- 2018-06-06 0.8.7
- added area_under_peak
- 2018-06-04 0.8.6
- added CommandSettings.py
- added wasatch.applog.MainLogger(enable_stdout=True)
- 2018-06-04 0.8.5
- added shell.py
- 2018-06-01 0.8.4
- added Overrides
- 2018-05-31 0.8.3
- FileSpectrometer mostly working
- 2018-05-29 0.8.2
- initial version of FileSpectrometer
- added JSON support
- 2018-05-17 0.8.1
- ARM debugs
- added set_laser_power_mW
- 2018-05-15 0.8.0
- EEPROM writing works
- 2018-05-14 0.7.4
- fixed get_ccd_gain in StrokerProtocol devices
- 2018-05-09 0.7.3
- raise exception on reading unexpected pixel count
- 2018-05-09 0.7.2
- added support for 2048-pixel FID spectrometers
- 2018-05-08 0.7.1
- updates for ENLIGHTEN 1.3.0
- 2018-04-30 0.7.0
- added SpectrometerSettings
- added SpectrometerState
- added EEPROM
- 2018-04-21 0.6.10
- Reading.session_count
- Reading.laser_power
- robustness
- 2018-04-20 0.6.9
- additional lasersec
- 2018-04-19 0.6.8
- fixed laser ramp rounding
- 2018-04-18 0.6.7
- draft area scan implementation
- 2018-04-17 0.6.6
- parameterized laser_ramp_increments
- 2018-04-16 0.6.5
- updated laser power ramping
- 2018-04-13 0.6.4
- initial laser power ramping
- 2018-04-12 0.6.3
- added get_secondary_adc_calibrated
- reads linearity, ROI from EEPROM
- 2018-04-06 0.6.2
- fixed secondary ADC endian order
- 2018-04-05 0.6.1
- StrokerProtocolDevice fixes
- FPGAOptions fixes to laser_control and laser_type
- added enable_secondary_adc
- added invert_x_axis
- better FID USB logging
- 2018-03-22 0.6.0
- starting multi-spectrometer support
- tagging before attempting switch to MonoLibUsb
- 2018-03-06 0.5.6
- added FPGAOptions
- supported more EEPROM options
- added fpga_reset()
- don't read laser temp unless has_laser
- 2018-03-02 0.5.5
- added "max_usb_interval_ms"
- de-dupe USB commands
- 2018-02-15 0.5.4
- added "min_usb_interval_ms"
- 2018-02-14 0.5.3
- added set_ccd_offset()
- 2018-01-26 0.5.2
- added set_ccd_trigger()
- 2018-01-24 0.5.1
- added get/set_laser_temperature_setpoint_raw()
- 2018-01-22 0.5.0
- initial customer release
- analyzed non-blocking issue on MacOS
- default TEC to min
- 2018-01-22 0.2.2
- tested and documented for Linux
- 2018-01-22 0.2.1
- tested and documented for MacOS
- 2018-01-22 0.2.0
- added demo.py, Windows run instructions
- 2018-01-08 0.1.2
- swapped LSB/MSB on high-gain mode
- 2018-01-05 0.1.1
- fixed laser_enable
- updated NIR high-gain mode
- 2018-01-05 0.1.0
- initial import from ENLIGHTEN