hardwarelibrary 2.1.0__tar.gz → 2.2.0__tar.gz
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- {hardwarelibrary-2.1.0 → hardwarelibrary-2.2.0}/CHANGELOG.md +69 -0
- {hardwarelibrary-2.1.0 → hardwarelibrary-2.2.0}/PKG-INFO +1 -1
- {hardwarelibrary-2.1.0 → hardwarelibrary-2.2.0}/hardwarelibrary/communication/debugport.py +81 -1
- hardwarelibrary-2.2.0/hardwarelibrary/communication/protocol.py +1425 -0
- {hardwarelibrary-2.1.0 → hardwarelibrary-2.2.0}/hardwarelibrary/communication/usbport.py +72 -4
- hardwarelibrary-2.2.0/hardwarelibrary/motion/sutterdevice.py +185 -0
- hardwarelibrary-2.2.0/hardwarelibrary/physicaldevice.py +494 -0
- {hardwarelibrary-2.1.0 → hardwarelibrary-2.2.0}/hardwarelibrary/tests/testPhysicalDevice.py +8 -2
- hardwarelibrary-2.2.0/hardwarelibrary/tests/testProtocolDebugPort.py +167 -0
- hardwarelibrary-2.2.0/hardwarelibrary/tests/testProtocolPrototype.py +879 -0
- {hardwarelibrary-2.1.0 → hardwarelibrary-2.2.0}/hardwarelibrary/tests/testSutterDevice.py +11 -0
- {hardwarelibrary-2.1.0 → hardwarelibrary-2.2.0}/hardwarelibrary/tests/testSutterSerialPort.py +9 -4
- {hardwarelibrary-2.1.0 → hardwarelibrary-2.2.0}/hardwarelibrary.egg-info/PKG-INFO +1 -1
- {hardwarelibrary-2.1.0 → hardwarelibrary-2.2.0}/hardwarelibrary.egg-info/SOURCES.txt +3 -0
- {hardwarelibrary-2.1.0 → hardwarelibrary-2.2.0}/hardwarelibrary.egg-info/scm_file_list.json +172 -169
- hardwarelibrary-2.2.0/hardwarelibrary.egg-info/scm_version.json +8 -0
- hardwarelibrary-2.1.0/hardwarelibrary/motion/sutterdevice.py +0 -145
- hardwarelibrary-2.1.0/hardwarelibrary/physicaldevice.py +0 -280
- hardwarelibrary-2.1.0/hardwarelibrary.egg-info/scm_version.json +0 -8
- {hardwarelibrary-2.1.0 → hardwarelibrary-2.2.0}/.claude/skills/pyhardwarelibrary/SKILL.md +0 -0
- {hardwarelibrary-2.1.0 → hardwarelibrary-2.2.0}/.gitattributes +0 -0
- {hardwarelibrary-2.1.0 → hardwarelibrary-2.2.0}/.github/workflows/publish.yml +0 -0
- {hardwarelibrary-2.1.0 → hardwarelibrary-2.2.0}/.github/workflows/tests.yml +0 -0
- {hardwarelibrary-2.1.0 → hardwarelibrary-2.2.0}/.gitignore +0 -0
- {hardwarelibrary-2.1.0 → hardwarelibrary-2.2.0}/.readthedocs.yaml +0 -0
- {hardwarelibrary-2.1.0 → hardwarelibrary-2.2.0}/CLAUDE.md +0 -0
- {hardwarelibrary-2.1.0/docs/source → hardwarelibrary-2.2.0}/README-1-USB.md +0 -0
- {hardwarelibrary-2.1.0/docs/source → hardwarelibrary-2.2.0}/README-2-RS232.md +0 -0
- {hardwarelibrary-2.1.0/docs/source → hardwarelibrary-2.2.0}/README-3-USB-Cameras.md +0 -0
- {hardwarelibrary-2.1.0/docs/source → hardwarelibrary-2.2.0}/README-4-New-device-coding-example.md +0 -0
- {hardwarelibrary-2.1.0/docs/source → hardwarelibrary-2.2.0}/README-5-Communication-ports.md +0 -0
- {hardwarelibrary-2.1.0/docs/source → hardwarelibrary-2.2.0}/README-6-DebugPort.md +0 -0
- {hardwarelibrary-2.1.0/docs/source → hardwarelibrary-2.2.0}/README-7-Sutter-ROE-200.md +0 -0
- {hardwarelibrary-2.1.0 → hardwarelibrary-2.2.0}/README.assets/Am.png +0 -0
- {hardwarelibrary-2.1.0 → hardwarelibrary-2.2.0}/README.assets/asiZwo.png +0 -0
- {hardwarelibrary-2.1.0 → hardwarelibrary-2.2.0}/README.assets/automation.png +0 -0
- {hardwarelibrary-2.1.0 → hardwarelibrary-2.2.0}/README.assets/image-20210415195013040.png +0 -0
- {hardwarelibrary-2.1.0 → hardwarelibrary-2.2.0}/README.assets/image-20210415195905341.png +0 -0
- {hardwarelibrary-2.1.0 → hardwarelibrary-2.2.0}/README.assets/image-20210417140020797.png +0 -0
- {hardwarelibrary-2.1.0 → hardwarelibrary-2.2.0}/README.assets/image-20210423112830851.png +0 -0
- {hardwarelibrary-2.1.0 → hardwarelibrary-2.2.0}/README.assets/image-20210423112945687.png +0 -0
- {hardwarelibrary-2.1.0 → hardwarelibrary-2.2.0}/README.assets/image-20210423113821265.png +0 -0
- {hardwarelibrary-2.1.0 → hardwarelibrary-2.2.0}/README.assets/image-20210423113954823.png +0 -0
- {hardwarelibrary-2.1.0 → hardwarelibrary-2.2.0}/README.assets/integra.png +0 -0
- {hardwarelibrary-2.1.0 → hardwarelibrary-2.2.0}/README.assets/integra.png.sb-90e26077-lWIRgO +0 -0
- {hardwarelibrary-2.1.0 → hardwarelibrary-2.2.0}/README.assets/preview.png +0 -0
- {hardwarelibrary-2.1.0/docs/source → hardwarelibrary-2.2.0}/README.md +0 -0
- {hardwarelibrary-2.1.0 → hardwarelibrary-2.2.0}/SCPI.md +0 -0
- {hardwarelibrary-2.1.0 → hardwarelibrary-2.2.0}/docs/Makefile +0 -0
- {hardwarelibrary-2.1.0 → hardwarelibrary-2.2.0}/docs/make.bat +0 -0
- {hardwarelibrary-2.1.0 → hardwarelibrary-2.2.0/docs/source}/README-1-USB.md +0 -0
- {hardwarelibrary-2.1.0 → hardwarelibrary-2.2.0/docs/source}/README-2-RS232.md +0 -0
- {hardwarelibrary-2.1.0 → hardwarelibrary-2.2.0/docs/source}/README-3-USB-Cameras.md +0 -0
- {hardwarelibrary-2.1.0 → hardwarelibrary-2.2.0/docs/source}/README-4-New-device-coding-example.md +0 -0
- {hardwarelibrary-2.1.0 → hardwarelibrary-2.2.0/docs/source}/README-5-Communication-ports.md +0 -0
- {hardwarelibrary-2.1.0 → hardwarelibrary-2.2.0/docs/source}/README-6-DebugPort.md +0 -0
- {hardwarelibrary-2.1.0 → hardwarelibrary-2.2.0/docs/source}/README-7-Sutter-ROE-200.md +0 -0
- {hardwarelibrary-2.1.0 → hardwarelibrary-2.2.0/docs/source}/README.md +0 -0
- {hardwarelibrary-2.1.0 → hardwarelibrary-2.2.0}/docs/source/_static/.gitkeep +0 -0
- {hardwarelibrary-2.1.0 → hardwarelibrary-2.2.0}/docs/source/api/cameras.rst +0 -0
- {hardwarelibrary-2.1.0 → hardwarelibrary-2.2.0}/docs/source/api/communication.rst +0 -0
- {hardwarelibrary-2.1.0 → hardwarelibrary-2.2.0}/docs/source/api/core.rst +0 -0
- {hardwarelibrary-2.1.0 → hardwarelibrary-2.2.0}/docs/source/api/daq.rst +0 -0
- {hardwarelibrary-2.1.0 → hardwarelibrary-2.2.0}/docs/source/api/motion.rst +0 -0
- {hardwarelibrary-2.1.0 → hardwarelibrary-2.2.0}/docs/source/api/oscilloscope.rst +0 -0
- {hardwarelibrary-2.1.0 → hardwarelibrary-2.2.0}/docs/source/api/powermeters.rst +0 -0
- {hardwarelibrary-2.1.0 → hardwarelibrary-2.2.0}/docs/source/api/sources.rst +0 -0
- {hardwarelibrary-2.1.0 → hardwarelibrary-2.2.0}/docs/source/api/spectrometers.rst +0 -0
- {hardwarelibrary-2.1.0 → hardwarelibrary-2.2.0}/docs/source/conf.py +0 -0
- {hardwarelibrary-2.1.0 → hardwarelibrary-2.2.0}/docs/source/index.rst +0 -0
- {hardwarelibrary-2.1.0 → hardwarelibrary-2.2.0}/examples/1-simple/cobolt.py +0 -0
- {hardwarelibrary-2.1.0 → hardwarelibrary-2.2.0}/examples/2-class/cobolt.py +0 -0
- {hardwarelibrary-2.1.0 → hardwarelibrary-2.2.0}/examples/3-class+debugPort/cobolt.py +0 -0
- {hardwarelibrary-2.1.0 → hardwarelibrary-2.2.0}/examples/verdig/README.md +0 -0
- {hardwarelibrary-2.1.0 → hardwarelibrary-2.2.0}/examples/verdig/status_monitor_dll.py +0 -0
- {hardwarelibrary-2.1.0 → hardwarelibrary-2.2.0}/examples/verdig/temperature_monitor_native.py +0 -0
- {hardwarelibrary-2.1.0/hardwarelibrary/communication → hardwarelibrary-2.2.0/hardwarelibrary}/.idea/inspectionProfiles/profiles_settings.xml +0 -0
- {hardwarelibrary-2.1.0 → hardwarelibrary-2.2.0}/hardwarelibrary/.idea/vcs.xml +0 -0
- {hardwarelibrary-2.1.0 → hardwarelibrary-2.2.0}/hardwarelibrary/.idea/workspace.xml +0 -0
- {hardwarelibrary-2.1.0 → hardwarelibrary-2.2.0}/hardwarelibrary/__init__.py +0 -0
- {hardwarelibrary-2.1.0 → hardwarelibrary-2.2.0}/hardwarelibrary/__main__.py +0 -0
- {hardwarelibrary-2.1.0 → hardwarelibrary-2.2.0}/hardwarelibrary/cameras/__init__.py +0 -0
- {hardwarelibrary-2.1.0 → hardwarelibrary-2.2.0}/hardwarelibrary/cameras/camera.py +0 -0
- {hardwarelibrary-2.1.0 → hardwarelibrary-2.2.0}/hardwarelibrary/capabilities.py +0 -0
- {hardwarelibrary-2.1.0 → hardwarelibrary-2.2.0}/hardwarelibrary/communication/.idea/.gitignore +0 -0
- {hardwarelibrary-2.1.0 → hardwarelibrary-2.2.0}/hardwarelibrary/communication/.idea/communication.iml +0 -0
- {hardwarelibrary-2.1.0/hardwarelibrary → hardwarelibrary-2.2.0/hardwarelibrary/communication}/.idea/inspectionProfiles/profiles_settings.xml +0 -0
- {hardwarelibrary-2.1.0 → hardwarelibrary-2.2.0}/hardwarelibrary/communication/.idea/misc.xml +0 -0
- {hardwarelibrary-2.1.0 → hardwarelibrary-2.2.0}/hardwarelibrary/communication/.idea/modules.xml +0 -0
- {hardwarelibrary-2.1.0 → hardwarelibrary-2.2.0}/hardwarelibrary/communication/.idea/vcs.xml +0 -0
- {hardwarelibrary-2.1.0 → hardwarelibrary-2.2.0}/hardwarelibrary/communication/__init__.py +0 -0
- {hardwarelibrary-2.1.0 → hardwarelibrary-2.2.0}/hardwarelibrary/communication/commands.py +0 -0
- {hardwarelibrary-2.1.0 → hardwarelibrary-2.2.0}/hardwarelibrary/communication/communicationport.py +0 -0
- {hardwarelibrary-2.1.0 → hardwarelibrary-2.2.0}/hardwarelibrary/communication/diagnostics.py +0 -0
- {hardwarelibrary-2.1.0 → hardwarelibrary-2.2.0}/hardwarelibrary/communication/hidport.py +0 -0
- {hardwarelibrary-2.1.0 → hardwarelibrary-2.2.0}/hardwarelibrary/communication/labviewtcpport.py +0 -0
- {hardwarelibrary-2.1.0 → hardwarelibrary-2.2.0}/hardwarelibrary/communication/libusb/Darwin/libusb-1.0.0.dylib +0 -0
- {hardwarelibrary-2.1.0 → hardwarelibrary-2.2.0}/hardwarelibrary/communication/libusb/MS32/libusb-1.0.dll +0 -0
- {hardwarelibrary-2.1.0 → hardwarelibrary-2.2.0}/hardwarelibrary/communication/libusb/MS64/libusb-1.0.dll +0 -0
- {hardwarelibrary-2.1.0 → hardwarelibrary-2.2.0}/hardwarelibrary/communication/prologixgpibport.py +0 -0
- {hardwarelibrary-2.1.0 → hardwarelibrary-2.2.0}/hardwarelibrary/communication/serialport.py +0 -0
- {hardwarelibrary-2.1.0 → hardwarelibrary-2.2.0}/hardwarelibrary/communication/tcpport.py +0 -0
- {hardwarelibrary-2.1.0 → hardwarelibrary-2.2.0}/hardwarelibrary/daq/__init__.py +0 -0
- {hardwarelibrary-2.1.0 → hardwarelibrary-2.2.0}/hardwarelibrary/daq/labjackdevice.py +0 -0
- {hardwarelibrary-2.1.0 → hardwarelibrary-2.2.0}/hardwarelibrary/daq/sr830device.py +0 -0
- {hardwarelibrary-2.1.0 → hardwarelibrary-2.2.0}/hardwarelibrary/devicecontroller.py +0 -0
- {hardwarelibrary-2.1.0 → hardwarelibrary-2.2.0}/hardwarelibrary/devicemanager.py +0 -0
- {hardwarelibrary-2.1.0 → hardwarelibrary-2.2.0}/hardwarelibrary/echodevice.py +0 -0
- {hardwarelibrary-2.1.0 → hardwarelibrary-2.2.0}/hardwarelibrary/manuals/Cobolt-owners-manual-0401-D0105-A.pdf +0 -0
- {hardwarelibrary-2.1.0 → hardwarelibrary-2.2.0}/hardwarelibrary/manuals/Coherent-HOPS-1-Overview-and-Runbook.md +0 -0
- {hardwarelibrary-2.1.0 → hardwarelibrary-2.2.0}/hardwarelibrary/manuals/Coherent-HOPS-2-USB-and-DLL-Protocol.md +0 -0
- {hardwarelibrary-2.1.0 → hardwarelibrary-2.2.0}/hardwarelibrary/manuals/Coherent-HOPS-3-I2C-Circuit.png +0 -0
- {hardwarelibrary-2.1.0 → hardwarelibrary-2.2.0}/hardwarelibrary/manuals/Coherent-HOPS-3-I2C-Circuit.svg +0 -0
- {hardwarelibrary-2.1.0 → hardwarelibrary-2.2.0}/hardwarelibrary/manuals/Coherent-HOPS-3-I2C-Wire-Protocol.md +0 -0
- {hardwarelibrary-2.1.0 → hardwarelibrary-2.2.0}/hardwarelibrary/manuals/Coherent_FieldMaster_GS_Manual_20199913940.pdf +0 -0
- {hardwarelibrary-2.1.0 → hardwarelibrary-2.2.0}/hardwarelibrary/manuals/HR2000+-OEM-Data-Sheet.pdf +0 -0
- {hardwarelibrary-2.1.0 → hardwarelibrary-2.2.0}/hardwarelibrary/manuals/MPC-325_OpMan.pdf +0 -0
- {hardwarelibrary-2.1.0 → hardwarelibrary-2.2.0}/hardwarelibrary/manuals/Matisse Programmer's Guide v2.4.8.pdf +0 -0
- {hardwarelibrary-2.1.0 → hardwarelibrary-2.2.0}/hardwarelibrary/manuals/Mightex CCD Line Camera Din8 Connector Description.pdf +0 -0
- {hardwarelibrary-2.1.0 → hardwarelibrary-2.2.0}/hardwarelibrary/manuals/Mightex CCD Linear Camera User Manual.pdf +0 -0
- {hardwarelibrary-2.1.0 → hardwarelibrary-2.2.0}/hardwarelibrary/manuals/Sirah-Matisse-Serial-Commands.md +0 -0
- {hardwarelibrary-2.1.0 → hardwarelibrary-2.2.0}/hardwarelibrary/manuals/Spectra-Physics-Millennia-eV-Serial-Commands.md +0 -0
- {hardwarelibrary-2.1.0 → hardwarelibrary-2.2.0}/hardwarelibrary/manuals/TDS 1000B and TDS 2000B Manual.pdf +0 -0
- {hardwarelibrary-2.1.0 → hardwarelibrary-2.2.0}/hardwarelibrary/manuals/Tektronix TDS-1002 Programming manual.pdf +0 -0
- {hardwarelibrary-2.1.0 → hardwarelibrary-2.2.0}/hardwarelibrary/manuals/USB Primer.pdf +0 -0
- {hardwarelibrary-2.1.0 → hardwarelibrary-2.2.0}/hardwarelibrary/manuals/USB2000+-OEM-Data-Sheet.pdf +0 -0
- {hardwarelibrary-2.1.0 → hardwarelibrary-2.2.0}/hardwarelibrary/manuals/USB2000-OEM-Data-Sheet.pdf +0 -0
- {hardwarelibrary-2.1.0 → hardwarelibrary-2.2.0}/hardwarelibrary/manuals/User_Manual_Integra_V3.0.pdf +0 -0
- {hardwarelibrary-2.1.0 → hardwarelibrary-2.2.0}/hardwarelibrary/manuals/usb4000-oem-data-sheet.pdf +0 -0
- {hardwarelibrary-2.1.0 → hardwarelibrary-2.2.0}/hardwarelibrary/motion/__init__.py +0 -0
- {hardwarelibrary-2.1.0 → hardwarelibrary-2.2.0}/hardwarelibrary/motion/intellidrivedevice.py +0 -0
- {hardwarelibrary-2.1.0 → hardwarelibrary-2.2.0}/hardwarelibrary/motion/linearmotiondevice.py +0 -0
- {hardwarelibrary-2.1.0 → hardwarelibrary-2.2.0}/hardwarelibrary/motion/rotationdevice.py +0 -0
- {hardwarelibrary-2.1.0 → hardwarelibrary-2.2.0}/hardwarelibrary/motion/thorlabs.py +0 -0
- {hardwarelibrary-2.1.0 → hardwarelibrary-2.2.0}/hardwarelibrary/oscilloscope/__init__.py +0 -0
- {hardwarelibrary-2.1.0 → hardwarelibrary-2.2.0}/hardwarelibrary/oscilloscope/oscilloscopedevice.py +0 -0
- {hardwarelibrary-2.1.0 → hardwarelibrary-2.2.0}/hardwarelibrary/powermeters/__init__.py +0 -0
- {hardwarelibrary-2.1.0 → hardwarelibrary-2.2.0}/hardwarelibrary/powermeters/fieldmasterdevice.py +0 -0
- {hardwarelibrary-2.1.0 → hardwarelibrary-2.2.0}/hardwarelibrary/powermeters/integradevice.py +0 -0
- {hardwarelibrary-2.1.0 → hardwarelibrary-2.2.0}/hardwarelibrary/powermeters/powermeterdevice.py +0 -0
- {hardwarelibrary-2.1.0 → hardwarelibrary-2.2.0}/hardwarelibrary/powerstrips/__init__.py +0 -0
- {hardwarelibrary-2.1.0 → hardwarelibrary-2.2.0}/hardwarelibrary/powerstrips/powerstripdevice.py +0 -0
- {hardwarelibrary-2.1.0 → hardwarelibrary-2.2.0}/hardwarelibrary/powerstrips/pwrusb.py +0 -0
- {hardwarelibrary-2.1.0 → hardwarelibrary-2.2.0}/hardwarelibrary/sources/__init__.py +0 -0
- {hardwarelibrary-2.1.0 → hardwarelibrary-2.2.0}/hardwarelibrary/sources/cobolt.py +0 -0
- {hardwarelibrary-2.1.0 → hardwarelibrary-2.2.0}/hardwarelibrary/sources/hopsdll.py +0 -0
- {hardwarelibrary-2.1.0 → hardwarelibrary-2.2.0}/hardwarelibrary/sources/hopsnative.py +0 -0
- {hardwarelibrary-2.1.0 → hardwarelibrary-2.2.0}/hardwarelibrary/sources/lasersourcedevice.py +0 -0
- {hardwarelibrary-2.1.0 → hardwarelibrary-2.2.0}/hardwarelibrary/sources/matisse.py +0 -0
- {hardwarelibrary-2.1.0 → hardwarelibrary-2.2.0}/hardwarelibrary/sources/millennia.py +0 -0
- {hardwarelibrary-2.1.0 → hardwarelibrary-2.2.0}/hardwarelibrary/sources/verdig.py +0 -0
- {hardwarelibrary-2.1.0 → hardwarelibrary-2.2.0}/hardwarelibrary/spectrometers/__init__.py +0 -0
- {hardwarelibrary-2.1.0 → hardwarelibrary-2.2.0}/hardwarelibrary/spectrometers/base.py +0 -0
- {hardwarelibrary-2.1.0 → hardwarelibrary-2.2.0}/hardwarelibrary/spectrometers/darkbulb.png +0 -0
- {hardwarelibrary-2.1.0 → hardwarelibrary-2.2.0}/hardwarelibrary/spectrometers/intelhexreader.py +0 -0
- {hardwarelibrary-2.1.0 → hardwarelibrary-2.2.0}/hardwarelibrary/spectrometers/lightbulb.png +0 -0
- {hardwarelibrary-2.1.0 → hardwarelibrary-2.2.0}/hardwarelibrary/spectrometers/oceaninsight.py +0 -0
- {hardwarelibrary-2.1.0 → hardwarelibrary-2.2.0}/hardwarelibrary/spectrometers/stellarnet.zip +0 -0
- {hardwarelibrary-2.1.0 → hardwarelibrary-2.2.0}/hardwarelibrary/spectrometers/viewer.py +0 -0
- {hardwarelibrary-2.1.0 → hardwarelibrary-2.2.0}/hardwarelibrary/tests/deprecated/cobolt.json +0 -0
- {hardwarelibrary-2.1.0 → hardwarelibrary-2.2.0}/hardwarelibrary/tests/deprecated/socketclient.py +0 -0
- {hardwarelibrary-2.1.0 → hardwarelibrary-2.2.0}/hardwarelibrary/tests/deprecated/socketmain.py +0 -0
- {hardwarelibrary-2.1.0 → hardwarelibrary-2.2.0}/hardwarelibrary/tests/deprecated/testCobolt.py +0 -0
- {hardwarelibrary-2.1.0 → hardwarelibrary-2.2.0}/hardwarelibrary/tests/deprecated/testCoboltDevice.py +0 -0
- {hardwarelibrary-2.1.0 → hardwarelibrary-2.2.0}/hardwarelibrary/tests/deprecated/testCoboltSerial.py +0 -0
- {hardwarelibrary-2.1.0 → hardwarelibrary-2.2.0}/hardwarelibrary/tests/deprecated/testIntegraSerialPort.py +0 -0
- {hardwarelibrary-2.1.0 → hardwarelibrary-2.2.0}/hardwarelibrary/tests/deprecated/testJSON.py +0 -0
- {hardwarelibrary-2.1.0 → hardwarelibrary-2.2.0}/hardwarelibrary/tests/deprecated/usbFinder.py +0 -0
- {hardwarelibrary-2.1.0 → hardwarelibrary-2.2.0}/hardwarelibrary/tests/env.py +0 -0
- {hardwarelibrary-2.1.0 → hardwarelibrary-2.2.0}/hardwarelibrary/tests/testCapabilities.py +0 -0
- {hardwarelibrary-2.1.0 → hardwarelibrary-2.2.0}/hardwarelibrary/tests/testCobolt.py +0 -0
- {hardwarelibrary-2.1.0 → hardwarelibrary-2.2.0}/hardwarelibrary/tests/testCommandRecognition.py +0 -0
- {hardwarelibrary-2.1.0 → hardwarelibrary-2.2.0}/hardwarelibrary/tests/testCommunicationPorts.py +0 -0
- {hardwarelibrary-2.1.0 → hardwarelibrary-2.2.0}/hardwarelibrary/tests/testConnectSutter.py +0 -0
- {hardwarelibrary-2.1.0 → hardwarelibrary-2.2.0}/hardwarelibrary/tests/testDeviceController.py +0 -0
- {hardwarelibrary-2.1.0 → hardwarelibrary-2.2.0}/hardwarelibrary/tests/testDeviceManager.py +0 -0
- {hardwarelibrary-2.1.0 → hardwarelibrary-2.2.0}/hardwarelibrary/tests/testFieldMasterDevice.py +0 -0
- {hardwarelibrary-2.1.0 → hardwarelibrary-2.2.0}/hardwarelibrary/tests/testGenericSerialConverter.py +0 -0
- {hardwarelibrary-2.1.0 → hardwarelibrary-2.2.0}/hardwarelibrary/tests/testIntegraDevice.py +0 -0
- {hardwarelibrary-2.1.0 → hardwarelibrary-2.2.0}/hardwarelibrary/tests/testIntellidrive.py +0 -0
- {hardwarelibrary-2.1.0 → hardwarelibrary-2.2.0}/hardwarelibrary/tests/testLabjackU3.py +0 -0
- {hardwarelibrary-2.1.0 → hardwarelibrary-2.2.0}/hardwarelibrary/tests/testLabviewTCPPort.py +0 -0
- {hardwarelibrary-2.1.0 → hardwarelibrary-2.2.0}/hardwarelibrary/tests/testLaserCapabilities.py +0 -0
- {hardwarelibrary-2.1.0 → hardwarelibrary-2.2.0}/hardwarelibrary/tests/testLinearMotionDevice.py +0 -0
- {hardwarelibrary-2.1.0 → hardwarelibrary-2.2.0}/hardwarelibrary/tests/testMapPositionsFunction.py +0 -0
- {hardwarelibrary-2.1.0 → hardwarelibrary-2.2.0}/hardwarelibrary/tests/testMatisse.py +0 -0
- {hardwarelibrary-2.1.0 → hardwarelibrary-2.2.0}/hardwarelibrary/tests/testMillennia.py +0 -0
- {hardwarelibrary-2.1.0 → hardwarelibrary-2.2.0}/hardwarelibrary/tests/testModulePyFTDI.py +0 -0
- {hardwarelibrary-2.1.0 → hardwarelibrary-2.2.0}/hardwarelibrary/tests/testModulePySerial.py +0 -0
- {hardwarelibrary-2.1.0 → hardwarelibrary-2.2.0}/hardwarelibrary/tests/testNotificationCenter.py +0 -0
- {hardwarelibrary-2.1.0 → hardwarelibrary-2.2.0}/hardwarelibrary/tests/testOISpectrometer.py +0 -0
- {hardwarelibrary-2.1.0 → hardwarelibrary-2.2.0}/hardwarelibrary/tests/testOptotuneDevice.py +0 -0
- {hardwarelibrary-2.1.0 → hardwarelibrary-2.2.0}/hardwarelibrary/tests/testOscilloscope.py +0 -0
- {hardwarelibrary-2.1.0 → hardwarelibrary-2.2.0}/hardwarelibrary/tests/testPwrUSB.py +0 -0
- {hardwarelibrary-2.1.0 → hardwarelibrary-2.2.0}/hardwarelibrary/tests/testPyUSB.py +0 -0
- {hardwarelibrary-2.1.0 → hardwarelibrary-2.2.0}/hardwarelibrary/tests/testSR830.py +0 -0
- {hardwarelibrary-2.1.0 → hardwarelibrary-2.2.0}/hardwarelibrary/tests/testSerialHardwareFLow.py +0 -0
- {hardwarelibrary-2.1.0 → hardwarelibrary-2.2.0}/hardwarelibrary/tests/testSerialPortConverters.py +0 -0
- {hardwarelibrary-2.1.0 → hardwarelibrary-2.2.0}/hardwarelibrary/tests/testTCPPort.py +0 -0
- {hardwarelibrary-2.1.0 → hardwarelibrary-2.2.0}/hardwarelibrary/tests/testTableDrivenDebugPort.py +0 -0
- {hardwarelibrary-2.1.0 → hardwarelibrary-2.2.0}/hardwarelibrary/tests/testThorlabs.py +0 -0
- {hardwarelibrary-2.1.0 → hardwarelibrary-2.2.0}/hardwarelibrary/tests/testValidation.py +0 -0
- {hardwarelibrary-2.1.0 → hardwarelibrary-2.2.0}/hardwarelibrary/tests/testVerdiG.py +0 -0
- {hardwarelibrary-2.1.0 → hardwarelibrary-2.2.0}/hardwarelibrary/tests/test_pylablib_kinesis.py +0 -0
- {hardwarelibrary-2.1.0 → hardwarelibrary-2.2.0}/hardwarelibrary/utils.py +0 -0
- {hardwarelibrary-2.1.0 → hardwarelibrary-2.2.0}/hardwarelibrary/validation.py +0 -0
- {hardwarelibrary-2.1.0 → hardwarelibrary-2.2.0}/hardwarelibrary.egg-info/dependency_links.txt +0 -0
- {hardwarelibrary-2.1.0 → hardwarelibrary-2.2.0}/hardwarelibrary.egg-info/requires.txt +0 -0
- {hardwarelibrary-2.1.0 → hardwarelibrary-2.2.0}/hardwarelibrary.egg-info/top_level.txt +0 -0
- {hardwarelibrary-2.1.0 → hardwarelibrary-2.2.0}/pyproject.toml +0 -0
- {hardwarelibrary-2.1.0 → hardwarelibrary-2.2.0}/setup.cfg +0 -0
|
@@ -6,6 +6,54 @@ API changes can land even when the minor version is unchanged.
|
|
|
6
6
|
|
|
7
7
|
## [Unreleased]
|
|
8
8
|
|
|
9
|
+
### Added
|
|
10
|
+
- **A protocol is described, not performed** (`communication/protocol.py`). A
|
|
11
|
+
`Frame` turns named values into the bytes to write and the bytes read back into
|
|
12
|
+
named values; it owns no port and stores nothing of what happened. `TextFrame`
|
|
13
|
+
states a `str.format` template and the regular expression that reads it back;
|
|
14
|
+
`BinaryFrame` states one struct format, whose constants are written on the way
|
|
15
|
+
out and *required* on the way in. A `Command` pairs two frames, a
|
|
16
|
+
`CommandDictionary` holds a device's commands and reads them from JSON. Nothing
|
|
17
|
+
is inferred anywhere: a byte order must be explicit, and so must both notations
|
|
18
|
+
of a text line.
|
|
19
|
+
- Both directions come out of the same objects. A driver writes the request and
|
|
20
|
+
reads the reply; a debug port reads the request and writes the reply. That is
|
|
21
|
+
what the old `DataCommand` needed a second encoder and decoder for, and those
|
|
22
|
+
could -- and did -- drift apart.
|
|
23
|
+
- `CommandDictionary.usage()` prints every command, its arguments and what it
|
|
24
|
+
answers, with types read off the description rather than a comment.
|
|
25
|
+
- `CommandDictionary.validate()` refuses a description that is wrong about
|
|
26
|
+
itself: a template and an expression that describe different lines, a struct
|
|
27
|
+
that packs a different number of values than it names, a command whose request
|
|
28
|
+
another command answers to first. It writes each command out with specimen
|
|
29
|
+
values made from the declared types and reads it straight back.
|
|
30
|
+
- **`ProtocolDebugPort`** (`communication/debugport.py`), a debug port with no code
|
|
31
|
+
of its own: hand it a `CommandDictionary` and it stands in for the instrument.
|
|
32
|
+
Whatever a request carries is remembered by name and whatever a reply carries is
|
|
33
|
+
answered from that memory. A command may add a `"sets"` clause for a state change
|
|
34
|
+
its bytes cannot express -- `HOME` carries nothing and still moves a stage.
|
|
35
|
+
- **`PhysicalDevice.protocol`** (default `None`) and **`PhysicalDevice.performTransaction()`**,
|
|
36
|
+
which performs one command of that protocol under the port's `transactionLock`,
|
|
37
|
+
reading by `readLength` for a binary reply and up to the terminator for a line.
|
|
38
|
+
A driver that sets `protocol` needs no send-and-receive code of its own.
|
|
39
|
+
|
|
40
|
+
### Changed
|
|
41
|
+
- **`SutterDevice` speaks through a description.** Its protocol is data, it sends
|
|
42
|
+
through `performTransaction`, and it no longer checks acknowledgements by hand:
|
|
43
|
+
the description says `MOVE`, `HOME` and `WORK` answer `b"\r"`. Its nested
|
|
44
|
+
`DebugSerialPort` is gone; `serialNumber="debug"` now gets a `ProtocolDebugPort`.
|
|
45
|
+
Callers building the debug port themselves should use
|
|
46
|
+
`ProtocolDebugPort(SutterDevice.protocol)`.
|
|
47
|
+
|
|
48
|
+
### Removed
|
|
49
|
+
- **`PhysicalDevice.sendCommand()`**. It looked a command up in `self.commands`,
|
|
50
|
+
sent it through `self.port` and handed the `Command` object back so a caller
|
|
51
|
+
could read the reply off it -- the pattern the description above exists to
|
|
52
|
+
replace. No driver in the library called it; the two tests that did now send
|
|
53
|
+
through the `Command` itself, which is all it ever did. Use
|
|
54
|
+
`performTransaction()` with a `protocol`, or a `Command`'s own `send()` while a
|
|
55
|
+
device still carries a `commands` dict.
|
|
56
|
+
|
|
9
57
|
## [2.1.0] - 2026-08-04
|
|
10
58
|
|
|
11
59
|
### Added
|
|
@@ -158,6 +206,27 @@ API changes can land even when the minor version is unchanged.
|
|
|
158
206
|
from first principles, and refreshed the class-hierarchy diagram, which was
|
|
159
207
|
stale in the same way.
|
|
160
208
|
|
|
209
|
+
## [2.0.0] - 2026-07-24
|
|
210
|
+
|
|
211
|
+
Recorded after the fact: this release was tagged without a changelog entry.
|
|
212
|
+
|
|
213
|
+
### Changed
|
|
214
|
+
- **`NotificationCenter` now comes from the standalone `notifcenter` package** on
|
|
215
|
+
PyPI, added as a dependency, rather than living in the library.
|
|
216
|
+
`hardwarelibrary/notificationcenter.py` is deleted, and the 19 imports across the
|
|
217
|
+
tree point at `from notificationcenter import ...`. `hardwarelibrary/__init__.py`
|
|
218
|
+
re-exports the external package, so `from hardwarelibrary import
|
|
219
|
+
NotificationCenter` keeps working.
|
|
220
|
+
- **The notification API is snake_case**, a clean break with no aliases, across
|
|
221
|
+
roughly 286 call sites: `addObserver` -> `add_observer`, `postNotification` ->
|
|
222
|
+
`post_notification`, `removeObserver` -> `remove_observer`, `observersCount` ->
|
|
223
|
+
`observers_count`, and the keyword arguments and attributes `notificationName`,
|
|
224
|
+
`observedObject`, `userInfo`, `notifyingObject` -> `notification_name`,
|
|
225
|
+
`observed_object`, `user_info`, `notifying_object`. Any code observing a device
|
|
226
|
+
must be updated; this is what made the release a major one. Note that the rest of
|
|
227
|
+
the library remains camelCase -- the snake_case is the external package's
|
|
228
|
+
convention, not a change of style here.
|
|
229
|
+
|
|
161
230
|
## [1.5.0] - 2026-07-22
|
|
162
231
|
|
|
163
232
|
### Added
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: hardwarelibrary
|
|
3
|
-
Version: 2.
|
|
3
|
+
Version: 2.2.0
|
|
4
4
|
Summary: Cross-platform (macOS, Windows, Linux, etc...) library to control various hardware devices mostly for scientific applications.
|
|
5
5
|
Author-email: Daniel Cote <dccote@cervo.ulaval.ca>
|
|
6
6
|
License: MIT
|
|
@@ -160,4 +160,84 @@ class TableDrivenDebugPort(DebugPort):
|
|
|
160
160
|
- bytes/str: written to the output buffer as-is
|
|
161
161
|
- None: no response is sent
|
|
162
162
|
"""
|
|
163
|
-
raise NotImplementedError("Subclasses must implement process_command")
|
|
163
|
+
raise NotImplementedError("Subclasses must implement process_command")
|
|
164
|
+
|
|
165
|
+
class ProtocolDebugPort(DebugPort):
|
|
166
|
+
"""An instrument stood in for entirely by its own protocol description.
|
|
167
|
+
|
|
168
|
+
Where TableDrivenDebugPort needs a subclass with a process_command full of
|
|
169
|
+
branches, this needs nothing at all: hand it a CommandDictionary and it
|
|
170
|
+
answers every command that dictionary describes. Two rules do the whole job,
|
|
171
|
+
and both fall out of the fact that a command's two halves name their values
|
|
172
|
+
the same way.
|
|
173
|
+
|
|
174
|
+
- whatever a request carries is remembered, by name. MOVE arrives with x, y
|
|
175
|
+
and z, so x, y and z are what the instrument now holds.
|
|
176
|
+
- whatever a reply carries is answered from that memory. GET_POSITION asks
|
|
177
|
+
for x, y and z, and gets back what MOVE left there.
|
|
178
|
+
|
|
179
|
+
A value never set reads as 0, which is the state of an instrument that has
|
|
180
|
+
just been switched on. A reply that cannot pack a 0 -- one carrying text, say
|
|
181
|
+
-- will say so rather than invent something.
|
|
182
|
+
|
|
183
|
+
The one thing no description of bytes can express is a command that changes
|
|
184
|
+
the instrument without carrying anything: HOME takes no arguments and yet
|
|
185
|
+
moves the stage to its origin. A command may therefore state a "sets" clause,
|
|
186
|
+
which is applied on arrival exactly as a request's own values are. That
|
|
187
|
+
clause is the only part of a description that talks about the instrument
|
|
188
|
+
rather than the wire, and a driver never reads it.
|
|
189
|
+
|
|
190
|
+
Recognising a request is the dictionary's work, not this class's: recognize()
|
|
191
|
+
asks each command in turn, and the header constants settle it. So there is no
|
|
192
|
+
second table of prefixes to keep in step with the driver.
|
|
193
|
+
"""
|
|
194
|
+
|
|
195
|
+
def __init__(self, protocol, delay=0, numberOfEndPoints=1):
|
|
196
|
+
"""Stand in for the instrument a description describes.
|
|
197
|
+
|
|
198
|
+
Args:
|
|
199
|
+
protocol: the CommandDictionary to answer from
|
|
200
|
+
delay: seconds of jitter to add to a read, as DebugPort applies it
|
|
201
|
+
numberOfEndPoints: how many endpoints to pretend to have
|
|
202
|
+
"""
|
|
203
|
+
super().__init__(delay=delay, numberOfEndPoints=numberOfEndPoints)
|
|
204
|
+
self.protocol = protocol
|
|
205
|
+
self.values = {}
|
|
206
|
+
|
|
207
|
+
def processInputBuffers(self, endPointIndex):
|
|
208
|
+
"""Answer whatever complete request has arrived.
|
|
209
|
+
|
|
210
|
+
Args:
|
|
211
|
+
endPointIndex: which endpoint was written to
|
|
212
|
+
|
|
213
|
+
Raises:
|
|
214
|
+
RequestDidNotMatch: when the bytes are no command of this protocol,
|
|
215
|
+
which means whatever wrote them is at fault -- a debug port that
|
|
216
|
+
quietly dropped them would hide the bug it exists to find.
|
|
217
|
+
"""
|
|
218
|
+
received = bytes(self.inputBuffers[endPointIndex])
|
|
219
|
+
if len(received) == 0:
|
|
220
|
+
return
|
|
221
|
+
|
|
222
|
+
command, arguments = self.protocol.recognize(received)
|
|
223
|
+
self.inputBuffers[endPointIndex] = bytearray()
|
|
224
|
+
|
|
225
|
+
self.values.update(arguments)
|
|
226
|
+
self.values.update(command.sets)
|
|
227
|
+
if command.expectsReply:
|
|
228
|
+
self.writeToOutputBuffer(command.encodeReply(**self.answerFor(command)),
|
|
229
|
+
endPointIndex)
|
|
230
|
+
|
|
231
|
+
def answerFor(self, command) -> dict:
|
|
232
|
+
"""The values to answer one command with, taken from what is remembered.
|
|
233
|
+
|
|
234
|
+
Args:
|
|
235
|
+
command: the command that was recognized
|
|
236
|
+
|
|
237
|
+
Returns:
|
|
238
|
+
{field name: value} for every value its reply carries, 0 for one that
|
|
239
|
+
was never set. Empty for a reply that is nothing but a fixed
|
|
240
|
+
acknowledgement, which the description supplies on its own.
|
|
241
|
+
"""
|
|
242
|
+
return {name: self.values.get(name, 0)
|
|
243
|
+
for name, _ in command.reply.parameters}
|