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.
Files changed (211) hide show
  1. {hardwarelibrary-2.1.0 → hardwarelibrary-2.2.0}/CHANGELOG.md +69 -0
  2. {hardwarelibrary-2.1.0 → hardwarelibrary-2.2.0}/PKG-INFO +1 -1
  3. {hardwarelibrary-2.1.0 → hardwarelibrary-2.2.0}/hardwarelibrary/communication/debugport.py +81 -1
  4. hardwarelibrary-2.2.0/hardwarelibrary/communication/protocol.py +1425 -0
  5. {hardwarelibrary-2.1.0 → hardwarelibrary-2.2.0}/hardwarelibrary/communication/usbport.py +72 -4
  6. hardwarelibrary-2.2.0/hardwarelibrary/motion/sutterdevice.py +185 -0
  7. hardwarelibrary-2.2.0/hardwarelibrary/physicaldevice.py +494 -0
  8. {hardwarelibrary-2.1.0 → hardwarelibrary-2.2.0}/hardwarelibrary/tests/testPhysicalDevice.py +8 -2
  9. hardwarelibrary-2.2.0/hardwarelibrary/tests/testProtocolDebugPort.py +167 -0
  10. hardwarelibrary-2.2.0/hardwarelibrary/tests/testProtocolPrototype.py +879 -0
  11. {hardwarelibrary-2.1.0 → hardwarelibrary-2.2.0}/hardwarelibrary/tests/testSutterDevice.py +11 -0
  12. {hardwarelibrary-2.1.0 → hardwarelibrary-2.2.0}/hardwarelibrary/tests/testSutterSerialPort.py +9 -4
  13. {hardwarelibrary-2.1.0 → hardwarelibrary-2.2.0}/hardwarelibrary.egg-info/PKG-INFO +1 -1
  14. {hardwarelibrary-2.1.0 → hardwarelibrary-2.2.0}/hardwarelibrary.egg-info/SOURCES.txt +3 -0
  15. {hardwarelibrary-2.1.0 → hardwarelibrary-2.2.0}/hardwarelibrary.egg-info/scm_file_list.json +172 -169
  16. hardwarelibrary-2.2.0/hardwarelibrary.egg-info/scm_version.json +8 -0
  17. hardwarelibrary-2.1.0/hardwarelibrary/motion/sutterdevice.py +0 -145
  18. hardwarelibrary-2.1.0/hardwarelibrary/physicaldevice.py +0 -280
  19. hardwarelibrary-2.1.0/hardwarelibrary.egg-info/scm_version.json +0 -8
  20. {hardwarelibrary-2.1.0 → hardwarelibrary-2.2.0}/.claude/skills/pyhardwarelibrary/SKILL.md +0 -0
  21. {hardwarelibrary-2.1.0 → hardwarelibrary-2.2.0}/.gitattributes +0 -0
  22. {hardwarelibrary-2.1.0 → hardwarelibrary-2.2.0}/.github/workflows/publish.yml +0 -0
  23. {hardwarelibrary-2.1.0 → hardwarelibrary-2.2.0}/.github/workflows/tests.yml +0 -0
  24. {hardwarelibrary-2.1.0 → hardwarelibrary-2.2.0}/.gitignore +0 -0
  25. {hardwarelibrary-2.1.0 → hardwarelibrary-2.2.0}/.readthedocs.yaml +0 -0
  26. {hardwarelibrary-2.1.0 → hardwarelibrary-2.2.0}/CLAUDE.md +0 -0
  27. {hardwarelibrary-2.1.0/docs/source → hardwarelibrary-2.2.0}/README-1-USB.md +0 -0
  28. {hardwarelibrary-2.1.0/docs/source → hardwarelibrary-2.2.0}/README-2-RS232.md +0 -0
  29. {hardwarelibrary-2.1.0/docs/source → hardwarelibrary-2.2.0}/README-3-USB-Cameras.md +0 -0
  30. {hardwarelibrary-2.1.0/docs/source → hardwarelibrary-2.2.0}/README-4-New-device-coding-example.md +0 -0
  31. {hardwarelibrary-2.1.0/docs/source → hardwarelibrary-2.2.0}/README-5-Communication-ports.md +0 -0
  32. {hardwarelibrary-2.1.0/docs/source → hardwarelibrary-2.2.0}/README-6-DebugPort.md +0 -0
  33. {hardwarelibrary-2.1.0/docs/source → hardwarelibrary-2.2.0}/README-7-Sutter-ROE-200.md +0 -0
  34. {hardwarelibrary-2.1.0 → hardwarelibrary-2.2.0}/README.assets/Am.png +0 -0
  35. {hardwarelibrary-2.1.0 → hardwarelibrary-2.2.0}/README.assets/asiZwo.png +0 -0
  36. {hardwarelibrary-2.1.0 → hardwarelibrary-2.2.0}/README.assets/automation.png +0 -0
  37. {hardwarelibrary-2.1.0 → hardwarelibrary-2.2.0}/README.assets/image-20210415195013040.png +0 -0
  38. {hardwarelibrary-2.1.0 → hardwarelibrary-2.2.0}/README.assets/image-20210415195905341.png +0 -0
  39. {hardwarelibrary-2.1.0 → hardwarelibrary-2.2.0}/README.assets/image-20210417140020797.png +0 -0
  40. {hardwarelibrary-2.1.0 → hardwarelibrary-2.2.0}/README.assets/image-20210423112830851.png +0 -0
  41. {hardwarelibrary-2.1.0 → hardwarelibrary-2.2.0}/README.assets/image-20210423112945687.png +0 -0
  42. {hardwarelibrary-2.1.0 → hardwarelibrary-2.2.0}/README.assets/image-20210423113821265.png +0 -0
  43. {hardwarelibrary-2.1.0 → hardwarelibrary-2.2.0}/README.assets/image-20210423113954823.png +0 -0
  44. {hardwarelibrary-2.1.0 → hardwarelibrary-2.2.0}/README.assets/integra.png +0 -0
  45. {hardwarelibrary-2.1.0 → hardwarelibrary-2.2.0}/README.assets/integra.png.sb-90e26077-lWIRgO +0 -0
  46. {hardwarelibrary-2.1.0 → hardwarelibrary-2.2.0}/README.assets/preview.png +0 -0
  47. {hardwarelibrary-2.1.0/docs/source → hardwarelibrary-2.2.0}/README.md +0 -0
  48. {hardwarelibrary-2.1.0 → hardwarelibrary-2.2.0}/SCPI.md +0 -0
  49. {hardwarelibrary-2.1.0 → hardwarelibrary-2.2.0}/docs/Makefile +0 -0
  50. {hardwarelibrary-2.1.0 → hardwarelibrary-2.2.0}/docs/make.bat +0 -0
  51. {hardwarelibrary-2.1.0 → hardwarelibrary-2.2.0/docs/source}/README-1-USB.md +0 -0
  52. {hardwarelibrary-2.1.0 → hardwarelibrary-2.2.0/docs/source}/README-2-RS232.md +0 -0
  53. {hardwarelibrary-2.1.0 → hardwarelibrary-2.2.0/docs/source}/README-3-USB-Cameras.md +0 -0
  54. {hardwarelibrary-2.1.0 → hardwarelibrary-2.2.0/docs/source}/README-4-New-device-coding-example.md +0 -0
  55. {hardwarelibrary-2.1.0 → hardwarelibrary-2.2.0/docs/source}/README-5-Communication-ports.md +0 -0
  56. {hardwarelibrary-2.1.0 → hardwarelibrary-2.2.0/docs/source}/README-6-DebugPort.md +0 -0
  57. {hardwarelibrary-2.1.0 → hardwarelibrary-2.2.0/docs/source}/README-7-Sutter-ROE-200.md +0 -0
  58. {hardwarelibrary-2.1.0 → hardwarelibrary-2.2.0/docs/source}/README.md +0 -0
  59. {hardwarelibrary-2.1.0 → hardwarelibrary-2.2.0}/docs/source/_static/.gitkeep +0 -0
  60. {hardwarelibrary-2.1.0 → hardwarelibrary-2.2.0}/docs/source/api/cameras.rst +0 -0
  61. {hardwarelibrary-2.1.0 → hardwarelibrary-2.2.0}/docs/source/api/communication.rst +0 -0
  62. {hardwarelibrary-2.1.0 → hardwarelibrary-2.2.0}/docs/source/api/core.rst +0 -0
  63. {hardwarelibrary-2.1.0 → hardwarelibrary-2.2.0}/docs/source/api/daq.rst +0 -0
  64. {hardwarelibrary-2.1.0 → hardwarelibrary-2.2.0}/docs/source/api/motion.rst +0 -0
  65. {hardwarelibrary-2.1.0 → hardwarelibrary-2.2.0}/docs/source/api/oscilloscope.rst +0 -0
  66. {hardwarelibrary-2.1.0 → hardwarelibrary-2.2.0}/docs/source/api/powermeters.rst +0 -0
  67. {hardwarelibrary-2.1.0 → hardwarelibrary-2.2.0}/docs/source/api/sources.rst +0 -0
  68. {hardwarelibrary-2.1.0 → hardwarelibrary-2.2.0}/docs/source/api/spectrometers.rst +0 -0
  69. {hardwarelibrary-2.1.0 → hardwarelibrary-2.2.0}/docs/source/conf.py +0 -0
  70. {hardwarelibrary-2.1.0 → hardwarelibrary-2.2.0}/docs/source/index.rst +0 -0
  71. {hardwarelibrary-2.1.0 → hardwarelibrary-2.2.0}/examples/1-simple/cobolt.py +0 -0
  72. {hardwarelibrary-2.1.0 → hardwarelibrary-2.2.0}/examples/2-class/cobolt.py +0 -0
  73. {hardwarelibrary-2.1.0 → hardwarelibrary-2.2.0}/examples/3-class+debugPort/cobolt.py +0 -0
  74. {hardwarelibrary-2.1.0 → hardwarelibrary-2.2.0}/examples/verdig/README.md +0 -0
  75. {hardwarelibrary-2.1.0 → hardwarelibrary-2.2.0}/examples/verdig/status_monitor_dll.py +0 -0
  76. {hardwarelibrary-2.1.0 → hardwarelibrary-2.2.0}/examples/verdig/temperature_monitor_native.py +0 -0
  77. {hardwarelibrary-2.1.0/hardwarelibrary/communication → hardwarelibrary-2.2.0/hardwarelibrary}/.idea/inspectionProfiles/profiles_settings.xml +0 -0
  78. {hardwarelibrary-2.1.0 → hardwarelibrary-2.2.0}/hardwarelibrary/.idea/vcs.xml +0 -0
  79. {hardwarelibrary-2.1.0 → hardwarelibrary-2.2.0}/hardwarelibrary/.idea/workspace.xml +0 -0
  80. {hardwarelibrary-2.1.0 → hardwarelibrary-2.2.0}/hardwarelibrary/__init__.py +0 -0
  81. {hardwarelibrary-2.1.0 → hardwarelibrary-2.2.0}/hardwarelibrary/__main__.py +0 -0
  82. {hardwarelibrary-2.1.0 → hardwarelibrary-2.2.0}/hardwarelibrary/cameras/__init__.py +0 -0
  83. {hardwarelibrary-2.1.0 → hardwarelibrary-2.2.0}/hardwarelibrary/cameras/camera.py +0 -0
  84. {hardwarelibrary-2.1.0 → hardwarelibrary-2.2.0}/hardwarelibrary/capabilities.py +0 -0
  85. {hardwarelibrary-2.1.0 → hardwarelibrary-2.2.0}/hardwarelibrary/communication/.idea/.gitignore +0 -0
  86. {hardwarelibrary-2.1.0 → hardwarelibrary-2.2.0}/hardwarelibrary/communication/.idea/communication.iml +0 -0
  87. {hardwarelibrary-2.1.0/hardwarelibrary → hardwarelibrary-2.2.0/hardwarelibrary/communication}/.idea/inspectionProfiles/profiles_settings.xml +0 -0
  88. {hardwarelibrary-2.1.0 → hardwarelibrary-2.2.0}/hardwarelibrary/communication/.idea/misc.xml +0 -0
  89. {hardwarelibrary-2.1.0 → hardwarelibrary-2.2.0}/hardwarelibrary/communication/.idea/modules.xml +0 -0
  90. {hardwarelibrary-2.1.0 → hardwarelibrary-2.2.0}/hardwarelibrary/communication/.idea/vcs.xml +0 -0
  91. {hardwarelibrary-2.1.0 → hardwarelibrary-2.2.0}/hardwarelibrary/communication/__init__.py +0 -0
  92. {hardwarelibrary-2.1.0 → hardwarelibrary-2.2.0}/hardwarelibrary/communication/commands.py +0 -0
  93. {hardwarelibrary-2.1.0 → hardwarelibrary-2.2.0}/hardwarelibrary/communication/communicationport.py +0 -0
  94. {hardwarelibrary-2.1.0 → hardwarelibrary-2.2.0}/hardwarelibrary/communication/diagnostics.py +0 -0
  95. {hardwarelibrary-2.1.0 → hardwarelibrary-2.2.0}/hardwarelibrary/communication/hidport.py +0 -0
  96. {hardwarelibrary-2.1.0 → hardwarelibrary-2.2.0}/hardwarelibrary/communication/labviewtcpport.py +0 -0
  97. {hardwarelibrary-2.1.0 → hardwarelibrary-2.2.0}/hardwarelibrary/communication/libusb/Darwin/libusb-1.0.0.dylib +0 -0
  98. {hardwarelibrary-2.1.0 → hardwarelibrary-2.2.0}/hardwarelibrary/communication/libusb/MS32/libusb-1.0.dll +0 -0
  99. {hardwarelibrary-2.1.0 → hardwarelibrary-2.2.0}/hardwarelibrary/communication/libusb/MS64/libusb-1.0.dll +0 -0
  100. {hardwarelibrary-2.1.0 → hardwarelibrary-2.2.0}/hardwarelibrary/communication/prologixgpibport.py +0 -0
  101. {hardwarelibrary-2.1.0 → hardwarelibrary-2.2.0}/hardwarelibrary/communication/serialport.py +0 -0
  102. {hardwarelibrary-2.1.0 → hardwarelibrary-2.2.0}/hardwarelibrary/communication/tcpport.py +0 -0
  103. {hardwarelibrary-2.1.0 → hardwarelibrary-2.2.0}/hardwarelibrary/daq/__init__.py +0 -0
  104. {hardwarelibrary-2.1.0 → hardwarelibrary-2.2.0}/hardwarelibrary/daq/labjackdevice.py +0 -0
  105. {hardwarelibrary-2.1.0 → hardwarelibrary-2.2.0}/hardwarelibrary/daq/sr830device.py +0 -0
  106. {hardwarelibrary-2.1.0 → hardwarelibrary-2.2.0}/hardwarelibrary/devicecontroller.py +0 -0
  107. {hardwarelibrary-2.1.0 → hardwarelibrary-2.2.0}/hardwarelibrary/devicemanager.py +0 -0
  108. {hardwarelibrary-2.1.0 → hardwarelibrary-2.2.0}/hardwarelibrary/echodevice.py +0 -0
  109. {hardwarelibrary-2.1.0 → hardwarelibrary-2.2.0}/hardwarelibrary/manuals/Cobolt-owners-manual-0401-D0105-A.pdf +0 -0
  110. {hardwarelibrary-2.1.0 → hardwarelibrary-2.2.0}/hardwarelibrary/manuals/Coherent-HOPS-1-Overview-and-Runbook.md +0 -0
  111. {hardwarelibrary-2.1.0 → hardwarelibrary-2.2.0}/hardwarelibrary/manuals/Coherent-HOPS-2-USB-and-DLL-Protocol.md +0 -0
  112. {hardwarelibrary-2.1.0 → hardwarelibrary-2.2.0}/hardwarelibrary/manuals/Coherent-HOPS-3-I2C-Circuit.png +0 -0
  113. {hardwarelibrary-2.1.0 → hardwarelibrary-2.2.0}/hardwarelibrary/manuals/Coherent-HOPS-3-I2C-Circuit.svg +0 -0
  114. {hardwarelibrary-2.1.0 → hardwarelibrary-2.2.0}/hardwarelibrary/manuals/Coherent-HOPS-3-I2C-Wire-Protocol.md +0 -0
  115. {hardwarelibrary-2.1.0 → hardwarelibrary-2.2.0}/hardwarelibrary/manuals/Coherent_FieldMaster_GS_Manual_20199913940.pdf +0 -0
  116. {hardwarelibrary-2.1.0 → hardwarelibrary-2.2.0}/hardwarelibrary/manuals/HR2000+-OEM-Data-Sheet.pdf +0 -0
  117. {hardwarelibrary-2.1.0 → hardwarelibrary-2.2.0}/hardwarelibrary/manuals/MPC-325_OpMan.pdf +0 -0
  118. {hardwarelibrary-2.1.0 → hardwarelibrary-2.2.0}/hardwarelibrary/manuals/Matisse Programmer's Guide v2.4.8.pdf +0 -0
  119. {hardwarelibrary-2.1.0 → hardwarelibrary-2.2.0}/hardwarelibrary/manuals/Mightex CCD Line Camera Din8 Connector Description.pdf +0 -0
  120. {hardwarelibrary-2.1.0 → hardwarelibrary-2.2.0}/hardwarelibrary/manuals/Mightex CCD Linear Camera User Manual.pdf +0 -0
  121. {hardwarelibrary-2.1.0 → hardwarelibrary-2.2.0}/hardwarelibrary/manuals/Sirah-Matisse-Serial-Commands.md +0 -0
  122. {hardwarelibrary-2.1.0 → hardwarelibrary-2.2.0}/hardwarelibrary/manuals/Spectra-Physics-Millennia-eV-Serial-Commands.md +0 -0
  123. {hardwarelibrary-2.1.0 → hardwarelibrary-2.2.0}/hardwarelibrary/manuals/TDS 1000B and TDS 2000B Manual.pdf +0 -0
  124. {hardwarelibrary-2.1.0 → hardwarelibrary-2.2.0}/hardwarelibrary/manuals/Tektronix TDS-1002 Programming manual.pdf +0 -0
  125. {hardwarelibrary-2.1.0 → hardwarelibrary-2.2.0}/hardwarelibrary/manuals/USB Primer.pdf +0 -0
  126. {hardwarelibrary-2.1.0 → hardwarelibrary-2.2.0}/hardwarelibrary/manuals/USB2000+-OEM-Data-Sheet.pdf +0 -0
  127. {hardwarelibrary-2.1.0 → hardwarelibrary-2.2.0}/hardwarelibrary/manuals/USB2000-OEM-Data-Sheet.pdf +0 -0
  128. {hardwarelibrary-2.1.0 → hardwarelibrary-2.2.0}/hardwarelibrary/manuals/User_Manual_Integra_V3.0.pdf +0 -0
  129. {hardwarelibrary-2.1.0 → hardwarelibrary-2.2.0}/hardwarelibrary/manuals/usb4000-oem-data-sheet.pdf +0 -0
  130. {hardwarelibrary-2.1.0 → hardwarelibrary-2.2.0}/hardwarelibrary/motion/__init__.py +0 -0
  131. {hardwarelibrary-2.1.0 → hardwarelibrary-2.2.0}/hardwarelibrary/motion/intellidrivedevice.py +0 -0
  132. {hardwarelibrary-2.1.0 → hardwarelibrary-2.2.0}/hardwarelibrary/motion/linearmotiondevice.py +0 -0
  133. {hardwarelibrary-2.1.0 → hardwarelibrary-2.2.0}/hardwarelibrary/motion/rotationdevice.py +0 -0
  134. {hardwarelibrary-2.1.0 → hardwarelibrary-2.2.0}/hardwarelibrary/motion/thorlabs.py +0 -0
  135. {hardwarelibrary-2.1.0 → hardwarelibrary-2.2.0}/hardwarelibrary/oscilloscope/__init__.py +0 -0
  136. {hardwarelibrary-2.1.0 → hardwarelibrary-2.2.0}/hardwarelibrary/oscilloscope/oscilloscopedevice.py +0 -0
  137. {hardwarelibrary-2.1.0 → hardwarelibrary-2.2.0}/hardwarelibrary/powermeters/__init__.py +0 -0
  138. {hardwarelibrary-2.1.0 → hardwarelibrary-2.2.0}/hardwarelibrary/powermeters/fieldmasterdevice.py +0 -0
  139. {hardwarelibrary-2.1.0 → hardwarelibrary-2.2.0}/hardwarelibrary/powermeters/integradevice.py +0 -0
  140. {hardwarelibrary-2.1.0 → hardwarelibrary-2.2.0}/hardwarelibrary/powermeters/powermeterdevice.py +0 -0
  141. {hardwarelibrary-2.1.0 → hardwarelibrary-2.2.0}/hardwarelibrary/powerstrips/__init__.py +0 -0
  142. {hardwarelibrary-2.1.0 → hardwarelibrary-2.2.0}/hardwarelibrary/powerstrips/powerstripdevice.py +0 -0
  143. {hardwarelibrary-2.1.0 → hardwarelibrary-2.2.0}/hardwarelibrary/powerstrips/pwrusb.py +0 -0
  144. {hardwarelibrary-2.1.0 → hardwarelibrary-2.2.0}/hardwarelibrary/sources/__init__.py +0 -0
  145. {hardwarelibrary-2.1.0 → hardwarelibrary-2.2.0}/hardwarelibrary/sources/cobolt.py +0 -0
  146. {hardwarelibrary-2.1.0 → hardwarelibrary-2.2.0}/hardwarelibrary/sources/hopsdll.py +0 -0
  147. {hardwarelibrary-2.1.0 → hardwarelibrary-2.2.0}/hardwarelibrary/sources/hopsnative.py +0 -0
  148. {hardwarelibrary-2.1.0 → hardwarelibrary-2.2.0}/hardwarelibrary/sources/lasersourcedevice.py +0 -0
  149. {hardwarelibrary-2.1.0 → hardwarelibrary-2.2.0}/hardwarelibrary/sources/matisse.py +0 -0
  150. {hardwarelibrary-2.1.0 → hardwarelibrary-2.2.0}/hardwarelibrary/sources/millennia.py +0 -0
  151. {hardwarelibrary-2.1.0 → hardwarelibrary-2.2.0}/hardwarelibrary/sources/verdig.py +0 -0
  152. {hardwarelibrary-2.1.0 → hardwarelibrary-2.2.0}/hardwarelibrary/spectrometers/__init__.py +0 -0
  153. {hardwarelibrary-2.1.0 → hardwarelibrary-2.2.0}/hardwarelibrary/spectrometers/base.py +0 -0
  154. {hardwarelibrary-2.1.0 → hardwarelibrary-2.2.0}/hardwarelibrary/spectrometers/darkbulb.png +0 -0
  155. {hardwarelibrary-2.1.0 → hardwarelibrary-2.2.0}/hardwarelibrary/spectrometers/intelhexreader.py +0 -0
  156. {hardwarelibrary-2.1.0 → hardwarelibrary-2.2.0}/hardwarelibrary/spectrometers/lightbulb.png +0 -0
  157. {hardwarelibrary-2.1.0 → hardwarelibrary-2.2.0}/hardwarelibrary/spectrometers/oceaninsight.py +0 -0
  158. {hardwarelibrary-2.1.0 → hardwarelibrary-2.2.0}/hardwarelibrary/spectrometers/stellarnet.zip +0 -0
  159. {hardwarelibrary-2.1.0 → hardwarelibrary-2.2.0}/hardwarelibrary/spectrometers/viewer.py +0 -0
  160. {hardwarelibrary-2.1.0 → hardwarelibrary-2.2.0}/hardwarelibrary/tests/deprecated/cobolt.json +0 -0
  161. {hardwarelibrary-2.1.0 → hardwarelibrary-2.2.0}/hardwarelibrary/tests/deprecated/socketclient.py +0 -0
  162. {hardwarelibrary-2.1.0 → hardwarelibrary-2.2.0}/hardwarelibrary/tests/deprecated/socketmain.py +0 -0
  163. {hardwarelibrary-2.1.0 → hardwarelibrary-2.2.0}/hardwarelibrary/tests/deprecated/testCobolt.py +0 -0
  164. {hardwarelibrary-2.1.0 → hardwarelibrary-2.2.0}/hardwarelibrary/tests/deprecated/testCoboltDevice.py +0 -0
  165. {hardwarelibrary-2.1.0 → hardwarelibrary-2.2.0}/hardwarelibrary/tests/deprecated/testCoboltSerial.py +0 -0
  166. {hardwarelibrary-2.1.0 → hardwarelibrary-2.2.0}/hardwarelibrary/tests/deprecated/testIntegraSerialPort.py +0 -0
  167. {hardwarelibrary-2.1.0 → hardwarelibrary-2.2.0}/hardwarelibrary/tests/deprecated/testJSON.py +0 -0
  168. {hardwarelibrary-2.1.0 → hardwarelibrary-2.2.0}/hardwarelibrary/tests/deprecated/usbFinder.py +0 -0
  169. {hardwarelibrary-2.1.0 → hardwarelibrary-2.2.0}/hardwarelibrary/tests/env.py +0 -0
  170. {hardwarelibrary-2.1.0 → hardwarelibrary-2.2.0}/hardwarelibrary/tests/testCapabilities.py +0 -0
  171. {hardwarelibrary-2.1.0 → hardwarelibrary-2.2.0}/hardwarelibrary/tests/testCobolt.py +0 -0
  172. {hardwarelibrary-2.1.0 → hardwarelibrary-2.2.0}/hardwarelibrary/tests/testCommandRecognition.py +0 -0
  173. {hardwarelibrary-2.1.0 → hardwarelibrary-2.2.0}/hardwarelibrary/tests/testCommunicationPorts.py +0 -0
  174. {hardwarelibrary-2.1.0 → hardwarelibrary-2.2.0}/hardwarelibrary/tests/testConnectSutter.py +0 -0
  175. {hardwarelibrary-2.1.0 → hardwarelibrary-2.2.0}/hardwarelibrary/tests/testDeviceController.py +0 -0
  176. {hardwarelibrary-2.1.0 → hardwarelibrary-2.2.0}/hardwarelibrary/tests/testDeviceManager.py +0 -0
  177. {hardwarelibrary-2.1.0 → hardwarelibrary-2.2.0}/hardwarelibrary/tests/testFieldMasterDevice.py +0 -0
  178. {hardwarelibrary-2.1.0 → hardwarelibrary-2.2.0}/hardwarelibrary/tests/testGenericSerialConverter.py +0 -0
  179. {hardwarelibrary-2.1.0 → hardwarelibrary-2.2.0}/hardwarelibrary/tests/testIntegraDevice.py +0 -0
  180. {hardwarelibrary-2.1.0 → hardwarelibrary-2.2.0}/hardwarelibrary/tests/testIntellidrive.py +0 -0
  181. {hardwarelibrary-2.1.0 → hardwarelibrary-2.2.0}/hardwarelibrary/tests/testLabjackU3.py +0 -0
  182. {hardwarelibrary-2.1.0 → hardwarelibrary-2.2.0}/hardwarelibrary/tests/testLabviewTCPPort.py +0 -0
  183. {hardwarelibrary-2.1.0 → hardwarelibrary-2.2.0}/hardwarelibrary/tests/testLaserCapabilities.py +0 -0
  184. {hardwarelibrary-2.1.0 → hardwarelibrary-2.2.0}/hardwarelibrary/tests/testLinearMotionDevice.py +0 -0
  185. {hardwarelibrary-2.1.0 → hardwarelibrary-2.2.0}/hardwarelibrary/tests/testMapPositionsFunction.py +0 -0
  186. {hardwarelibrary-2.1.0 → hardwarelibrary-2.2.0}/hardwarelibrary/tests/testMatisse.py +0 -0
  187. {hardwarelibrary-2.1.0 → hardwarelibrary-2.2.0}/hardwarelibrary/tests/testMillennia.py +0 -0
  188. {hardwarelibrary-2.1.0 → hardwarelibrary-2.2.0}/hardwarelibrary/tests/testModulePyFTDI.py +0 -0
  189. {hardwarelibrary-2.1.0 → hardwarelibrary-2.2.0}/hardwarelibrary/tests/testModulePySerial.py +0 -0
  190. {hardwarelibrary-2.1.0 → hardwarelibrary-2.2.0}/hardwarelibrary/tests/testNotificationCenter.py +0 -0
  191. {hardwarelibrary-2.1.0 → hardwarelibrary-2.2.0}/hardwarelibrary/tests/testOISpectrometer.py +0 -0
  192. {hardwarelibrary-2.1.0 → hardwarelibrary-2.2.0}/hardwarelibrary/tests/testOptotuneDevice.py +0 -0
  193. {hardwarelibrary-2.1.0 → hardwarelibrary-2.2.0}/hardwarelibrary/tests/testOscilloscope.py +0 -0
  194. {hardwarelibrary-2.1.0 → hardwarelibrary-2.2.0}/hardwarelibrary/tests/testPwrUSB.py +0 -0
  195. {hardwarelibrary-2.1.0 → hardwarelibrary-2.2.0}/hardwarelibrary/tests/testPyUSB.py +0 -0
  196. {hardwarelibrary-2.1.0 → hardwarelibrary-2.2.0}/hardwarelibrary/tests/testSR830.py +0 -0
  197. {hardwarelibrary-2.1.0 → hardwarelibrary-2.2.0}/hardwarelibrary/tests/testSerialHardwareFLow.py +0 -0
  198. {hardwarelibrary-2.1.0 → hardwarelibrary-2.2.0}/hardwarelibrary/tests/testSerialPortConverters.py +0 -0
  199. {hardwarelibrary-2.1.0 → hardwarelibrary-2.2.0}/hardwarelibrary/tests/testTCPPort.py +0 -0
  200. {hardwarelibrary-2.1.0 → hardwarelibrary-2.2.0}/hardwarelibrary/tests/testTableDrivenDebugPort.py +0 -0
  201. {hardwarelibrary-2.1.0 → hardwarelibrary-2.2.0}/hardwarelibrary/tests/testThorlabs.py +0 -0
  202. {hardwarelibrary-2.1.0 → hardwarelibrary-2.2.0}/hardwarelibrary/tests/testValidation.py +0 -0
  203. {hardwarelibrary-2.1.0 → hardwarelibrary-2.2.0}/hardwarelibrary/tests/testVerdiG.py +0 -0
  204. {hardwarelibrary-2.1.0 → hardwarelibrary-2.2.0}/hardwarelibrary/tests/test_pylablib_kinesis.py +0 -0
  205. {hardwarelibrary-2.1.0 → hardwarelibrary-2.2.0}/hardwarelibrary/utils.py +0 -0
  206. {hardwarelibrary-2.1.0 → hardwarelibrary-2.2.0}/hardwarelibrary/validation.py +0 -0
  207. {hardwarelibrary-2.1.0 → hardwarelibrary-2.2.0}/hardwarelibrary.egg-info/dependency_links.txt +0 -0
  208. {hardwarelibrary-2.1.0 → hardwarelibrary-2.2.0}/hardwarelibrary.egg-info/requires.txt +0 -0
  209. {hardwarelibrary-2.1.0 → hardwarelibrary-2.2.0}/hardwarelibrary.egg-info/top_level.txt +0 -0
  210. {hardwarelibrary-2.1.0 → hardwarelibrary-2.2.0}/pyproject.toml +0 -0
  211. {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.1.0
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}