quarchpy 2.2.7.dev1__py2.py3-none-any.whl → 2.2.8__py2.py3-none-any.whl

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 (208) hide show
  1. quarchpy/_version.py +1 -1
  2. quarchpy/connection_specific/QPS/win-amd64/{License/argparse4j-license.txt → 3rdPartyLicenses/argparse4j-LICENSE.txt} +23 -25
  3. quarchpy/connection_specific/QPS/win-amd64/3rdPartyLicenses/com.sun.istack-license.html +59 -0
  4. quarchpy/connection_specific/QPS/win-amd64/3rdPartyLicenses/commons-io-LICENSE-2.0.txt +202 -0
  5. quarchpy/connection_specific/QPS/win-amd64/3rdPartyLicenses/controlsfx-license.txt +29 -0
  6. quarchpy/connection_specific/QPS/win-amd64/3rdPartyLicenses/jakarta.activation-license.html +59 -0
  7. quarchpy/connection_specific/QPS/win-amd64/3rdPartyLicenses/jakarta.xml.bind-api-license.html +59 -0
  8. quarchpy/connection_specific/QPS/win-amd64/3rdPartyLicenses/netty-LICENSE.txt +202 -0
  9. quarchpy/connection_specific/QPS/win-amd64/3rdPartyLicenses/netty-NOTICE.txt +239 -0
  10. quarchpy/connection_specific/QPS/win-amd64/InstallType.dat +1 -0
  11. quarchpy/connection_specific/QPS/win-amd64/app.jar +0 -0
  12. quarchpy/connection_specific/QPS/win-amd64/app.properties +6 -0
  13. quarchpy/connection_specific/QPS/win-amd64/license.txt +1 -0
  14. quarchpy/connection_specific/QPS/win-amd64/qis/3rdPartyLicenses/com.sun.istack-license.html +59 -0
  15. quarchpy/connection_specific/QPS/win-amd64/qis/3rdPartyLicenses/dorkbox-LICENSE.Apachev2 +218 -0
  16. quarchpy/connection_specific/QPS/win-amd64/qis/3rdPartyLicenses/jSerialComm-LICENSE-APACHE-2.0 +202 -0
  17. quarchpy/connection_specific/QPS/win-amd64/qis/3rdPartyLicenses/jSerialComm-LICENSE-LGPL-3.0 +165 -0
  18. quarchpy/connection_specific/QPS/win-amd64/qis/3rdPartyLicenses/jakarta.activation-license.html +59 -0
  19. quarchpy/connection_specific/QPS/win-amd64/qis/3rdPartyLicenses/jakarta.xml.bind-api-license.html +59 -0
  20. quarchpy/connection_specific/QPS/win-amd64/qis/3rdPartyLicenses/javassist-License.html +381 -0
  21. quarchpy/connection_specific/QPS/win-amd64/qis/3rdPartyLicenses/jmdns-LICENSE.txt +202 -0
  22. quarchpy/connection_specific/QPS/win-amd64/qis/3rdPartyLicenses/jna-AL2.0 +177 -0
  23. quarchpy/connection_specific/QPS/win-amd64/qis/3rdPartyLicenses/kotlin-stdlib-LICENSE-2.0.txt +202 -0
  24. quarchpy/connection_specific/QPS/win-amd64/qis/3rdPartyLicenses/netty-LICENSE.txt +202 -0
  25. quarchpy/connection_specific/QPS/win-amd64/qis/3rdPartyLicenses/netty-NOTICE.txt +239 -0
  26. quarchpy/connection_specific/QPS/win-amd64/qis/3rdPartyLicenses/slf4j-LICENSE.txt +24 -0
  27. quarchpy/connection_specific/QPS/win-amd64/qis/3rdPartyLicenses/usb4java-LICENSE.md +20 -0
  28. quarchpy/connection_specific/QPS/win-amd64/qis/help.txt +50 -17
  29. quarchpy/connection_specific/QPS/win-amd64/qis/license.txt +1 -0
  30. quarchpy/connection_specific/QPS/win-amd64/qis/qis.jar +0 -0
  31. quarchpy/connection_specific/QPS/win-amd64/qis/qis_lib/CInterface-2.3.jar +0 -0
  32. quarchpy/connection_specific/QPS/win-amd64/qis/qis_lib/QuarchCommon-2.0.jar +0 -0
  33. quarchpy/connection_specific/QPS/win-amd64/qis/qis_lib/{TorridonCommon-1.0.jar → TorridonCommon-1.1.jar} +0 -0
  34. quarchpy/connection_specific/QPS/win-amd64/qis/qis_lib/jmdns-3.5.9.jar +0 -0
  35. quarchpy/connection_specific/QPS/win-amd64/qis/qis_lib/usb4java-1.3.1.jar +0 -0
  36. quarchpy/connection_specific/QPS/win-amd64/qps-command-reference.html +104 -104
  37. quarchpy/connection_specific/QPS/win-amd64/qps.jar +0 -0
  38. quarchpy/connection_specific/QPS/win-amd64/qps_lib/JFXUtilities-1.0.jar +0 -0
  39. quarchpy/connection_specific/QPS/win-amd64/qps_lib/QuarchCommon-2.0.jar +0 -0
  40. quarchpy/connection_specific/QPS/win-amd64/qps_lib/commons-io-2.18.0.jar +0 -0
  41. quarchpy/connection_specific/QPS/win-amd64/qps_lib/lin-arm64/javafx-base-21.0.6-linux-aarch64.jar +0 -0
  42. quarchpy/connection_specific/QPS/win-amd64/qps_lib/lin-arm64/javafx-controls-21.0.6-linux-aarch64.jar +0 -0
  43. quarchpy/connection_specific/QPS/win-amd64/qps_lib/lin-arm64/javafx-fxml-21.0.6-linux-aarch64.jar +0 -0
  44. quarchpy/connection_specific/QPS/win-amd64/qps_lib/lin-arm64/javafx-graphics-21.0.6-linux-aarch64.jar +0 -0
  45. quarchpy/connection_specific/QPS/win-amd64/qps_lib/lin-arm64/javafx-swing-21.0.6-linux-aarch64.jar +0 -0
  46. quarchpy/connection_specific/QPS/win-amd64/qps_lib/lin-x64/{javafx-base-21.0.5-linux.jar → javafx-base-21.0.6-linux.jar} +0 -0
  47. quarchpy/connection_specific/QPS/win-amd64/qps_lib/lin-x64/{javafx-controls-21.0.5-linux.jar → javafx-controls-21.0.6-linux.jar} +0 -0
  48. quarchpy/connection_specific/QPS/win-amd64/qps_lib/lin-x64/{javafx-fxml-21.0.5-linux.jar → javafx-fxml-21.0.6-linux.jar} +0 -0
  49. quarchpy/connection_specific/QPS/win-amd64/qps_lib/lin-x64/{javafx-graphics-21.0.5-linux.jar → javafx-graphics-21.0.6-linux.jar} +0 -0
  50. quarchpy/connection_specific/QPS/win-amd64/qps_lib/lin-x64/{javafx-swing-21.0.5-linux.jar → javafx-swing-21.0.6-linux.jar} +0 -0
  51. quarchpy/connection_specific/QPS/win-amd64/qps_lib/{mac-x64/javafx-base-21.0.5-mac.jar → mac-arm64/javafx-base-21.0.6-mac-aarch64.jar} +0 -0
  52. quarchpy/connection_specific/QPS/win-amd64/qps_lib/mac-arm64/{javafx-controls-21.0.5-mac-aarch64.jar → javafx-controls-21.0.6-mac-aarch64.jar} +0 -0
  53. quarchpy/connection_specific/QPS/win-amd64/qps_lib/{mac-x64/javafx-fxml-21.0.5-mac.jar → mac-arm64/javafx-fxml-21.0.6-mac-aarch64.jar} +0 -0
  54. quarchpy/connection_specific/QPS/win-amd64/qps_lib/mac-arm64/{javafx-graphics-21.0.5-mac-aarch64.jar → javafx-graphics-21.0.6-mac-aarch64.jar} +0 -0
  55. quarchpy/connection_specific/QPS/win-amd64/qps_lib/{mac-x64/javafx-swing-21.0.5-mac.jar → mac-arm64/javafx-swing-21.0.6-mac-aarch64.jar} +0 -0
  56. quarchpy/connection_specific/QPS/win-amd64/qps_lib/{mac-arm64/javafx-base-21.0.5-mac-aarch64.jar → mac-x64/javafx-base-21.0.6-mac.jar} +0 -0
  57. quarchpy/connection_specific/QPS/win-amd64/qps_lib/mac-x64/{javafx-controls-21.0.5-mac.jar → javafx-controls-21.0.6-mac.jar} +0 -0
  58. quarchpy/connection_specific/QPS/win-amd64/qps_lib/{mac-arm64/javafx-fxml-21.0.5-mac-aarch64.jar → mac-x64/javafx-fxml-21.0.6-mac.jar} +0 -0
  59. quarchpy/connection_specific/QPS/win-amd64/qps_lib/mac-x64/{javafx-graphics-21.0.5-mac.jar → javafx-graphics-21.0.6-mac.jar} +0 -0
  60. quarchpy/connection_specific/QPS/win-amd64/qps_lib/{mac-arm64/javafx-swing-21.0.5-mac-aarch64.jar → mac-x64/javafx-swing-21.0.6-mac.jar} +0 -0
  61. quarchpy/connection_specific/QPS/win-amd64/qps_lib/qutils-1.0.jar +0 -0
  62. quarchpy/connection_specific/QPS/win-amd64/qps_lib/win-x64/{javafx-base-21.0.5-win.jar → javafx-base-21.0.6-win.jar} +0 -0
  63. quarchpy/connection_specific/QPS/win-amd64/qps_lib/win-x64/{javafx-controls-21.0.5-win.jar → javafx-controls-21.0.6-win.jar} +0 -0
  64. quarchpy/connection_specific/QPS/win-amd64/qps_lib/win-x64/{javafx-fxml-21.0.5-win.jar → javafx-fxml-21.0.6-win.jar} +0 -0
  65. quarchpy/connection_specific/QPS/win-amd64/qps_lib/win-x64/{javafx-graphics-21.0.5-win.jar → javafx-graphics-21.0.6-win.jar} +0 -0
  66. quarchpy/connection_specific/QPS/win-amd64/qps_lib/win-x64/{javafx-swing-21.0.5-win.jar → javafx-swing-21.0.6-win.jar} +0 -0
  67. quarchpy/connection_specific/QPS/win-amd64/scriptCommands.txt +4 -4
  68. quarchpy/connection_specific/QPS/win-amd64/whats-new.txt +20 -12
  69. quarchpy/connection_specific/connection_QIS.py +1 -0
  70. quarchpy/debug/SystemTest.py +30 -15
  71. quarchpy/device/quarchQPS.py +93 -68
  72. quarchpy/docs/CHANGES.rst +8 -0
  73. quarchpy/docs/_build/doctrees/CHANGES.doctree +0 -0
  74. quarchpy/docs/_build/doctrees/environment.pickle +0 -0
  75. quarchpy/docs/_build/doctrees/source/changelog.doctree +0 -0
  76. quarchpy/docs/_build/doctrees/source/quarchpy.fio.doctree +0 -0
  77. quarchpy/docs/_build/html/CHANGES.html +145 -139
  78. quarchpy/docs/_build/html/_sources/CHANGES.rst.txt +7 -0
  79. quarchpy/docs/_build/html/genindex.html +8 -2
  80. quarchpy/docs/_build/html/index.html +71 -70
  81. quarchpy/docs/_build/html/objects.inv +0 -0
  82. quarchpy/docs/_build/html/searchindex.js +1 -1
  83. quarchpy/docs/_build/html/source/changelog.html +216 -209
  84. quarchpy/docs/_build/html/source/quarchpy.fio.html +64 -0
  85. quarchpy/docs/_build/html/source/quarchpy.html +3 -0
  86. quarchpy/fio/{test_performance_class.py → HIDEtest_performance_class.py} +1 -1
  87. quarchpy/fio_tests_file.fio +1 -0
  88. quarchpy/qis/qisFuncs.py +38 -41
  89. quarchpy/qps/qpsFuncs.py +7 -10
  90. quarchpy/tests/test_device/test_scanDevices.py +21 -0
  91. quarchpy/utilities/utils.py +64 -0
  92. {quarchpy-2.2.7.dev1.dist-info → quarchpy-2.2.8.dist-info}/METADATA +10 -2
  93. {quarchpy-2.2.7.dev1.dist-info → quarchpy-2.2.8.dist-info}/RECORD +99 -172
  94. {quarchpy-2.2.7.dev1.dist-info → quarchpy-2.2.8.dist-info}/WHEEL +1 -1
  95. quarchpy/.idea/.gitignore +0 -3
  96. quarchpy/.idea/inspectionProfiles/Project_Default.xml +0 -12
  97. quarchpy/.idea/inspectionProfiles/profiles_settings.xml +0 -6
  98. quarchpy/.idea/misc.xml +0 -7
  99. quarchpy/.idea/modules.xml +0 -8
  100. quarchpy/.idea/quarchpy.iml +0 -12
  101. quarchpy/.idea/workspace.xml +0 -75
  102. quarchpy/_version.py.bak +0 -1
  103. quarchpy/config_files/__pycache__/__init__.cpython-311.pyc +0 -0
  104. quarchpy/config_files/__pycache__/__init__.cpython-313.pyc +0 -0
  105. quarchpy/config_files/__pycache__/quarch_config_parser.cpython-311.pyc +0 -0
  106. quarchpy/config_files/__pycache__/quarch_config_parser.cpython-313.pyc +0 -0
  107. quarchpy/connection_specific/QPS/win-amd64/License/Netty-license.txt +0 -143
  108. quarchpy/connection_specific/QPS/win-amd64/License/controlsfx-license.txt +0 -26
  109. quarchpy/connection_specific/QPS/win-amd64/License/usb4java-license.txt +0 -167
  110. quarchpy/connection_specific/QPS/win-amd64/launchQPSJ21.bat +0 -4
  111. quarchpy/connection_specific/QPS/win-amd64/launchQPSJ21.sh +0 -4
  112. quarchpy/connection_specific/__pycache__/StreamChannels.cpython-313.pyc +0 -0
  113. quarchpy/connection_specific/__pycache__/__init__.cpython-313.pyc +0 -0
  114. quarchpy/connection_specific/__pycache__/connection_QIS.cpython-313.pyc +0 -0
  115. quarchpy/connection_specific/__pycache__/connection_QPS.cpython-313.pyc +0 -0
  116. quarchpy/connection_specific/__pycache__/connection_ReST.cpython-313.pyc +0 -0
  117. quarchpy/connection_specific/__pycache__/connection_Serial.cpython-313.pyc +0 -0
  118. quarchpy/connection_specific/__pycache__/connection_TCP.cpython-313.pyc +0 -0
  119. quarchpy/connection_specific/__pycache__/connection_Telnet.cpython-313.pyc +0 -0
  120. quarchpy/connection_specific/__pycache__/connection_USB.cpython-313.pyc +0 -0
  121. quarchpy/connection_specific/__pycache__/mDNS.cpython-313.pyc +0 -0
  122. quarchpy/connection_specific/connection_QPS.py.bak +0 -242
  123. quarchpy/connection_specific/jdk_j21_jres/__pycache__/__init__.cpython-313.pyc +0 -0
  124. quarchpy/connection_specific/jdk_j21_jres/__pycache__/fix_permissions.cpython-313.pyc +0 -0
  125. quarchpy/connection_specific/serial/__pycache__/__init__.cpython-313.pyc +0 -0
  126. quarchpy/connection_specific/serial/__pycache__/serialutil.cpython-313.pyc +0 -0
  127. quarchpy/connection_specific/serial/__pycache__/serialwin32.cpython-313.pyc +0 -0
  128. quarchpy/connection_specific/serial/__pycache__/win32.cpython-313.pyc +0 -0
  129. quarchpy/connection_specific/serial/tools/__pycache__/__init__.cpython-313.pyc +0 -0
  130. quarchpy/connection_specific/serial/tools/__pycache__/list_ports.cpython-313.pyc +0 -0
  131. quarchpy/connection_specific/serial/tools/__pycache__/list_ports_common.cpython-313.pyc +0 -0
  132. quarchpy/connection_specific/serial/tools/__pycache__/list_ports_windows.cpython-313.pyc +0 -0
  133. quarchpy/debug/__pycache__/SystemTest.cpython-311.pyc +0 -0
  134. quarchpy/debug/__pycache__/SystemTest.cpython-313.pyc +0 -0
  135. quarchpy/debug/__pycache__/__init__.cpython-311.pyc +0 -0
  136. quarchpy/debug/__pycache__/__init__.cpython-313.pyc +0 -0
  137. quarchpy/debug/__pycache__/module_debug.cpython-311.pyc +0 -0
  138. quarchpy/debug/__pycache__/module_debug.cpython-313.pyc +0 -0
  139. quarchpy/debug/__pycache__/simple_terminal.cpython-311.pyc +0 -0
  140. quarchpy/debug/__pycache__/simple_terminal.cpython-313.pyc +0 -0
  141. quarchpy/debug/__pycache__/upgrade_quarchpy.cpython-311.pyc +0 -0
  142. quarchpy/debug/__pycache__/upgrade_quarchpy.cpython-313.pyc +0 -0
  143. quarchpy/debug/__pycache__/versionCompare.cpython-311.pyc +0 -0
  144. quarchpy/debug/__pycache__/versionCompare.cpython-313.pyc +0 -0
  145. quarchpy/device/__pycache__/__init__.cpython-311.pyc +0 -0
  146. quarchpy/device/__pycache__/__init__.cpython-313.pyc +0 -0
  147. quarchpy/device/__pycache__/device.cpython-311.pyc +0 -0
  148. quarchpy/device/__pycache__/device.cpython-313.pyc +0 -0
  149. quarchpy/device/__pycache__/quarchArray.cpython-311.pyc +0 -0
  150. quarchpy/device/__pycache__/quarchArray.cpython-313.pyc +0 -0
  151. quarchpy/device/__pycache__/quarchPPM.cpython-311.pyc +0 -0
  152. quarchpy/device/__pycache__/quarchPPM.cpython-313.pyc +0 -0
  153. quarchpy/device/__pycache__/quarchQPS.cpython-311.pyc +0 -0
  154. quarchpy/device/__pycache__/quarchQPS.cpython-313.pyc +0 -0
  155. quarchpy/device/__pycache__/scanDevices.cpython-311.pyc +0 -0
  156. quarchpy/device/__pycache__/scanDevices.cpython-313.pyc +0 -0
  157. quarchpy/device/quarchQPS.py.bak +0 -398
  158. quarchpy/disk_test/__pycache__/AbsDiskFinder.cpython-311.pyc +0 -0
  159. quarchpy/disk_test/__pycache__/AbsDiskFinder.cpython-313.pyc +0 -0
  160. quarchpy/disk_test/__pycache__/DiskTargetSelection.cpython-311.pyc +0 -0
  161. quarchpy/disk_test/__pycache__/DiskTargetSelection.cpython-313.pyc +0 -0
  162. quarchpy/disk_test/__pycache__/__init__.cpython-311.pyc +0 -0
  163. quarchpy/disk_test/__pycache__/__init__.cpython-313.pyc +0 -0
  164. quarchpy/disk_test/__pycache__/iometerDiskFinder.cpython-311.pyc +0 -0
  165. quarchpy/disk_test/__pycache__/iometerDiskFinder.cpython-313.pyc +0 -0
  166. quarchpy/docs/CHANGES.rst.bak +0 -430
  167. quarchpy/docs/_build/html/.buildinfo.bak +0 -4
  168. quarchpy/docs/_build/html/_static/github-banner.svg +0 -5
  169. quarchpy/fio/FIO_interface.py.bak +0 -317
  170. quarchpy/fio/__pycache__/FIO_interface.cpython-311.pyc +0 -0
  171. quarchpy/fio/__pycache__/FIO_interface.cpython-313.pyc +0 -0
  172. quarchpy/fio/__pycache__/__init__.cpython-311.pyc +0 -0
  173. quarchpy/fio/__pycache__/__init__.cpython-313.pyc +0 -0
  174. quarchpy/fio/__pycache__/fioDiskFinder.cpython-311.pyc +0 -0
  175. quarchpy/fio/__pycache__/fioDiskFinder.cpython-313.pyc +0 -0
  176. quarchpy/iometer/__pycache__/__init__.cpython-311.pyc +0 -0
  177. quarchpy/iometer/__pycache__/__init__.cpython-313.pyc +0 -0
  178. quarchpy/iometer/__pycache__/gen_iometer_template.cpython-311.pyc +0 -0
  179. quarchpy/iometer/__pycache__/gen_iometer_template.cpython-313.pyc +0 -0
  180. quarchpy/iometer/__pycache__/iometerFuncs.cpython-311.pyc +0 -0
  181. quarchpy/iometer/__pycache__/iometerFuncs.cpython-313.pyc +0 -0
  182. quarchpy/qis/__pycache__/StreamHeaderInfo.cpython-311.pyc +0 -0
  183. quarchpy/qis/__pycache__/StreamHeaderInfo.cpython-313.pyc +0 -0
  184. quarchpy/qis/__pycache__/__init__.cpython-311.pyc +0 -0
  185. quarchpy/qis/__pycache__/__init__.cpython-313.pyc +0 -0
  186. quarchpy/qis/__pycache__/qisFuncs.cpython-311.pyc +0 -0
  187. quarchpy/qis/__pycache__/qisFuncs.cpython-313.pyc +0 -0
  188. quarchpy/qps/__pycache__/__init__.cpython-311.pyc +0 -0
  189. quarchpy/qps/__pycache__/__init__.cpython-313.pyc +0 -0
  190. quarchpy/qps/__pycache__/qpsFuncs.cpython-311.pyc +0 -0
  191. quarchpy/qps/__pycache__/qpsFuncs.cpython-313.pyc +0 -0
  192. quarchpy/user_interface/__pycache__/__init__.cpython-311.pyc +0 -0
  193. quarchpy/user_interface/__pycache__/__init__.cpython-313.pyc +0 -0
  194. quarchpy/user_interface/__pycache__/user_interface.cpython-311.pyc +0 -0
  195. quarchpy/user_interface/__pycache__/user_interface.cpython-313.pyc +0 -0
  196. quarchpy/utilities/__pycache__/TestCenter.cpython-311.pyc +0 -0
  197. quarchpy/utilities/__pycache__/TestCenter.cpython-313.pyc +0 -0
  198. quarchpy/utilities/__pycache__/TimeValue.cpython-311.pyc +0 -0
  199. quarchpy/utilities/__pycache__/TimeValue.cpython-313.pyc +0 -0
  200. quarchpy/utilities/__pycache__/Version.cpython-311.pyc +0 -0
  201. quarchpy/utilities/__pycache__/Version.cpython-313.pyc +0 -0
  202. quarchpy/utilities/__pycache__/__init__.cpython-311.pyc +0 -0
  203. quarchpy/utilities/__pycache__/__init__.cpython-313.pyc +0 -0
  204. /quarchpy/connection_specific/QPS/win-amd64/{License → 3rdPartyLicenses}/Material-Icons-license.txt +0 -0
  205. /quarchpy/connection_specific/QPS/win-amd64/DeviceConfig/{QTL1995-02.XML → QTL1995-02.xml} +0 -0
  206. /quarchpy/connection_specific/QPS/win-amd64/DeviceConfig/{QTL1999-02.XML → QTL1999-02.xml} +0 -0
  207. /quarchpy/connection_specific/QPS/win-amd64/DeviceConfig/{QTL2312-01.XML → QTL2312-01.xml} +0 -0
  208. {quarchpy-2.2.7.dev1.dist-info → quarchpy-2.2.8.dist-info}/top_level.txt +0 -0
@@ -1,7 +1,7 @@
1
1
  QPS Command Summary
2
2
  Copyright (c) Quarch Ltd
3
- QPS v1.44.2
4
- Generated: 14 Jan 2025
3
+ QPS v1.46
4
+ Generated: 10 Apr 2025
5
5
 
6
6
 
7
7
  *** Commands ***
@@ -390,7 +390,7 @@ Version: 2
390
390
  See also: $qps hide
391
391
 
392
392
  Command: $read
393
- Description: Reads data between from a given start time and either end time or number of records
393
+ Description: Reads data between a given start time and either end time or number of records
394
394
  Version: 1
395
395
  See also: $stream read
396
396
  Arguments
@@ -1084,7 +1084,7 @@ $qps hide ~ Hides the QPS application
1084
1084
 
1085
1085
  $qps show ~ Shows the QPS application
1086
1086
 
1087
- $read ~ Reads data between from a given start time and either end time or number of records
1087
+ $read ~ Reads data between a given start time and either end time or number of records
1088
1088
 
1089
1089
  $save csv ~ Saves to CSV format
1090
1090
 
@@ -1,31 +1,39 @@
1
1
  *** What's New In Quarch Power Studio ***
2
2
 
3
- 14th January 2025
3
+ 31st March 2025
4
4
 
5
- QPS version 1.45
6
- QIS version 1.47
5
+ QPS version 1.46
6
+ QIS version 1.48
7
7
 
8
8
 
9
9
 
10
10
  *** New Features ***
11
11
 
12
- Improved help menu links and additional documentation
12
+ Import of custom channel data for CSV via the GUI
13
13
 
14
- Data valid synthetic channel for AC compliance testing
14
+ Direct access to QIS terminal, recording folder and documentation
15
15
 
16
- Improved import speed for custom user data
16
+ Auto check and download of USB driver on windows
17
17
 
18
- Reduced time from start stream, until data is first displayed
18
+ Optional warning when QPS recordings exceed a set level
19
19
 
20
- Added notification for locked devices that are open in other applications
20
+ Java memory heap size can be set in preferences
21
21
 
22
- Improved checking of analysis files when loading
22
+ Chart read optimisation speeds up performance when channels are not visible
23
+
24
+ Added synthetic AC channel option to show when data is invalid (outside SPEC calibration)
25
+
26
+ Added notification on connection screen if a device is locked by another process
27
+
28
+ Recordings are validated on load, clear warning given if anything is wrong
23
29
 
24
30
 
25
31
  *** Major Fixes ***
26
32
 
27
- Fixed issues with window resizing on multiple monitors
33
+ Fixed issue with QPS files not deleting
34
+
35
+ Fixed bug where channel ordering was not consistent
28
36
 
29
- Improved thread cycling which reduced performance
37
+ Fixed issue with synthetic channels enables not working
30
38
 
31
- Fixed duplicate logging lines
39
+ Fixed issue with timeline corruption when expanded over multiple screens
@@ -1682,6 +1682,7 @@ class QisInterface:
1682
1682
 
1683
1683
  except Exception as e:
1684
1684
  #something went wrong during send qis cmd
1685
+ logging.error("Error! Unable to retrieve response from QIS. Command: " + sentText)
1685
1686
  logging.error(e)
1686
1687
  raise e
1687
1688
  finally:
@@ -1,5 +1,6 @@
1
1
  from quarchpy import *
2
2
  from quarchpy.device import *
3
+ from quarchpy.connection_specific.jdk_j21_jres.fix_permissions import main as fix_permissions, find_java_permissions
3
4
  try:
4
5
  from importlib.metadata import distribution
5
6
  except:
@@ -48,6 +49,11 @@ def test_system_info():
48
49
  print(str(bytes(subprocess.check_output(['cat', '/etc/os-release'], stderr=subprocess.STDOUT)).decode()))
49
50
  print("Platform Release: " + platform.release())
50
51
 
52
+ print("\nPYTHON\n------")
53
+ try:
54
+ print("Python Version: " + sys.version)
55
+ except:
56
+ print("Unable to detect Python version")
51
57
  try:
52
58
  print("Quarchpy Version: " + get_quarchpy_version())
53
59
  except:
@@ -57,14 +63,8 @@ def test_system_info():
57
63
  except Exception as e:
58
64
  print(e)
59
65
  print("Unable to detect Quarchpy location")
60
- try:
61
- print("Python Version: " + sys.version)
62
- except:
63
- print("Unable to detect Python version")
64
- try:
65
- print("QIS version number: " + get_QIS_version())
66
- except:
67
- print("Unable to detect QIS version")
66
+
67
+ print("\nJAVA\n----")
68
68
  try:
69
69
  javaVersion = bytes(subprocess.check_output(['java', '-version'], stderr=subprocess.STDOUT)).decode()
70
70
  print("Java Version: " + str(javaVersion))
@@ -78,12 +78,17 @@ def test_system_info():
78
78
  print("Unable to detect java location"
79
79
  "If Java is not installed then QIS and QPS will NOT run")
80
80
  try:
81
- find_java_permissions()
81
+ execute_permissions, message=find_java_permissions()
82
+ print("Execute Permissions: ",execute_permissions, "\n",message)
82
83
  except:
83
84
  print("Unable to get j21 java permissions")
85
+ try:
86
+ print("\nQIS version number: " + get_QIS_version())
87
+ except Exception as e:
88
+ print("\nUnable to detect QIS version. Exception:" +str(e))
84
89
 
85
- # Scan for all quarch devices on the system
86
90
 
91
+ # Scan for all quarch devices on the system
87
92
  def QuarchSimpleIdentify(device1):
88
93
  """
89
94
  Prints basic identification test data on the specified module, compatible with all Quarch devices
@@ -92,7 +97,7 @@ def QuarchSimpleIdentify(device1):
92
97
  ----------
93
98
  device1: quarchDevice
94
99
  Open connection to a quarch device
95
-
100
+
96
101
  """
97
102
  # Print the module name
98
103
  print("MODULE IDENTIFY TEST")
@@ -105,6 +110,7 @@ def QuarchSimpleIdentify(device1):
105
110
  print("Module Identity Information: ")
106
111
  print(device1.sendCommand("*idn?"))
107
112
 
113
+
108
114
  def get_QIS_version():
109
115
  """
110
116
  Returns the version of QIS. This is the version of QIS currenty running on the local system if one exists.
@@ -114,15 +120,20 @@ def get_QIS_version():
114
120
  -------
115
121
  version: str
116
122
  String representation of the QIS version number
117
-
123
+
118
124
  """
119
125
 
120
126
  qis_version = ""
121
127
  my_close_qis = False
122
- if isQisRunning() == False:
128
+ try:
129
+ qisRunning=isQisRunning()
130
+ except Exception as e:
131
+ print("Exception occurred while checking if qis was already running. Error:\n"+str(e))
132
+
133
+ if qisRunning == False:
123
134
  my_close_qis = True
124
135
  startLocalQis(headless=True)
125
-
136
+
126
137
  myQis = qisInterface()
127
138
  qis_version = myQis.sendAndReceiveCmd(cmd="$version")
128
139
  if "No Target Device Specified" in qis_version:
@@ -131,6 +142,7 @@ def get_QIS_version():
131
142
  myQis.sendAndReceiveCmd(cmd = "$shutdown")
132
143
  return qis_version
133
144
 
145
+
134
146
  def get_java_location():
135
147
  """
136
148
  Returns the location of java.
@@ -148,14 +160,16 @@ def get_java_location():
148
160
  location = "Unable to detect OS to check java version."
149
161
  return location
150
162
 
163
+
151
164
  def get_quarchpy_version():
152
165
  try:
153
166
  return __version__
154
167
  except:
155
168
  return "Unknown"
156
169
 
170
+
157
171
  def fix_usb():
158
- content_to_write = "SUBSYSTEM==\"usb\", ATTRS{idVendor}==\"16d0\", MODE=\"0666\"" \
172
+ content_to_write = "SUBSYSTEM==\"usb\", ATTRS{idVendor}==\"16d0\", MODE=\"0666\"\n" \
159
173
  "SUBSYSTEM==\"usb_device\", ATTRS{idVendor}==\"16d0\", MODE=\"0666\""
160
174
 
161
175
  if "centos" in str(platform.platform()).lower():
@@ -199,6 +213,7 @@ def main (args=None):
199
213
  test_communication()
200
214
 
201
215
 
216
+
202
217
  if __name__ == "__main__":
203
218
  main([])
204
219
  #find_java_permissions()
@@ -1,6 +1,8 @@
1
1
  from quarchpy.device import quarchDevice
2
2
  from quarchpy.utilities.Version import Version
3
3
  from quarchpy.user_interface.user_interface import requestDialog
4
+ from quarchpy.utilities.utils import check_stream_stopped_status, check_export_status
5
+
4
6
  import os, time, datetime, sys, logging
5
7
 
6
8
  if sys.version_info[0] < 3:
@@ -29,24 +31,24 @@ class quarchQPS(quarchDevice):
29
31
  self.IP_address = quarchDevice.connectionObj.qps.host
30
32
  self.port_number = quarchDevice.connectionObj.qps.port
31
33
 
32
- def startStream(self, directory, unserInput=True):
34
+ def startStream(self, directory, unserInput=True, streamDuration=""):
33
35
  """
34
36
  directory - str - desired stream dir
35
37
  unserInput=True - if a failure occurs userInput=True allows user to rectify problem with user input. set to False if user interaction is not available (automating).
36
38
  """
37
39
  #time.sleep(1) # TODO remove this sleep once script->QPS timeing issue resolved. This works fine in the meantime
38
- return quarchStream(self.quarchDevice, directory, unserInput)
40
+ return quarchStream(self.quarchDevice, directory, unserInput, streamDuration)
39
41
 
40
42
 
41
43
  class quarchStream:
42
- def __init__(self, quarchQPS, directory, unserInput=True):
44
+ def __init__(self, quarchQPS, directory, unserInput=True, streamDuration=""):
43
45
  self.connectionObj = quarchQPS.connectionObj
44
46
  self.IP_address = quarchQPS.connectionObj.qps.host
45
47
  self.port_number = quarchQPS.connectionObj.qps.port
46
48
  self.ConString = quarchQPS.ConString
47
49
  self.ConType = quarchQPS.ConType
48
- time.sleep(1)
49
- response = self.startQPSStream(directory)
50
+ # time.sleep(1) # TODO Nabil - Is this required?
51
+ response = self.startQPSStream(directory, streamDuration)
50
52
  if not "fail:" in response.lower():
51
53
  return
52
54
  else:
@@ -55,18 +57,19 @@ class quarchStream:
55
57
  else:
56
58
  self.failCheck(response)
57
59
 
58
- def startQPSStream(self, newDirectory):
59
- '''STARTS the stream '''
60
- response = self.connectionObj.qps.sendCmdVerbose("$start stream \"" + str(newDirectory) + "\"")
60
+ def startQPSStream(self, newDirectory, streamDuration=""):
61
+ '''STARTS the QPS stream '''
62
+ # Set the stream duration if required.
63
+ response = self.connectionObj.qps.sendCmdVerbose("$start stream \"" + str(newDirectory) + "\" " + str(streamDuration))
61
64
  if "Error" in response:
62
- response = self.connectionObj.qps.sendCmdVerbose("$start stream " + str(newDirectory))
65
+ response = self.connectionObj.qps.sendCmdVerbose("$start stream " + str(newDirectory) + " " + streamDuration)
63
66
  return response
64
67
 
65
68
  def failCheck(self, response):
66
69
  ''' handles failed starting of stream that requires input from user to fix.'''
67
70
  while "fail:" in response.lower():
68
71
  if "Fail: Directory already exists" in response:
69
- newDir = requestDialog(message=response+" Please enter a new file name:")
72
+ newDir = requestDialog(message=response + " Please enter a new file name:")
70
73
  response = self.startQPSStream(newDir)
71
74
  else: # If its a failure we don't know how to handle.
72
75
  raise Exception(response)
@@ -112,7 +115,7 @@ class quarchStream:
112
115
 
113
116
  return retVal
114
117
 
115
- def stats_to_CSV(self, file_name=""):
118
+ def stats_to_CSV(self, file_name="", poll_till_complete=False, check_interval=0.5):
116
119
  """
117
120
  Saves the statistics grid to a csv file
118
121
 
@@ -130,43 +133,50 @@ class quarchStream:
130
133
  command_response = self.connectionObj.qps.sendCmdVerbose("$stats to csv \"" + file_name + "\"", timeout=60)
131
134
  if command_response.startswith("Fail"):
132
135
  raise Exception(command_response)
136
+
137
+ if poll_till_complete:
138
+ is_exporting = check_export_status(self.get_stats_export_status())
139
+ while is_exporting:
140
+ is_exporting = check_export_status(self.get_stats_export_status())
141
+ time.sleep(check_interval)
133
142
  return command_response
134
143
 
135
144
  def get_custom_stats_range(self, start_time, end_time):
136
145
  """
137
- Returns the QPS statistics information over a specific time ignoring any set annotations.
138
-
139
- Parameters
140
- ----------
141
- start_time = : str
142
- The time in seconds you would like the stats to start this can be in integer or string format.
143
- or using the following format to specify daysDhours:minutes:seconds.milliseconds
144
- xxxDxx:xx:xx.xxxx
145
- end_time = : str
146
- The time in seconds you would like the stats to stop this can be in integer or string format
147
- or using the following format to specify daysDhours:minutes:seconds.milliseconds
148
- xxxDxx:xx:xx.xxxx
149
- Returns
150
- -------
151
- df = : dataframe
152
- The response text from QPS. If successful "ok. Saving stats to : file_name" otherwise returns the exception thrown
146
+ Returns the QPS statistics information over a specific time ignoring any set annotations.
147
+
148
+ Parameters
149
+ ----------
150
+ start_time = : str
151
+ The time in seconds you would like the stats to start this can be in integer or string format.
152
+ or using the following format to specify daysDhours:minutes:seconds.milliseconds
153
+ xxxDxx:xx:xx.xxxx
154
+ end_time = : str
155
+ The time in seconds you would like the stats to stop this can be in integer or string format
156
+ or using the following format to specify daysDhours:minutes:seconds.milliseconds
157
+ xxxDxx:xx:xx.xxxx
158
+ Returns
159
+ -------
160
+ df = : dataframe
161
+ The response text from QPS. If successful "ok. Saving stats to : file_name" otherwise returns the exception thrown
153
162
  """
154
163
  try:
155
164
  import warnings
156
165
  import pandas as pd
157
166
  warnings.simplefilter(action='ignore', category=FutureWarning)
158
- except:
167
+ except ImportError:
159
168
  logging.warning("pandas not imported correctly")
169
+
160
170
  command_response = self.connectionObj.qps.sendCmdVerbose(
161
171
  "$get custom stats range " + str(start_time) + " " + str(end_time), timeout=60)
172
+
162
173
  if command_response.startswith("Fail"):
163
174
  raise Exception(command_response)
164
175
  test_data = StringIO(command_response)
176
+
165
177
  try:
166
178
  pd.set_option('display.max_columns', None)
167
179
  pd.set_option('display.width', 1024)
168
- # df = pd.read_csv(test_data, sep=",", header=[0,1])
169
- # pandas.read_csv() replaced error_bad_lines with on_bad_lines from v1.3.0
170
180
  if Version.is_v1_ge_v2(pd.__version__, "1.3.0"):
171
181
  df = pd.read_csv(test_data, sep=",", header=[0, 1], on_bad_lines="skip")
172
182
  else:
@@ -187,9 +197,9 @@ class quarchStream:
187
197
 
188
198
  def getStreamState(self):
189
199
  """
190
- Askes QPS for the stream status.
200
+ Asks QPS for the stream status.
191
201
  QPS stream state != Module stream state.
192
- This is different from "rec stream?" cmd to the module as it will return "streaming" when the module is nolonger streaming but QPS is still receiveing stream data from the module.
202
+ This is different from "rec stream?" cmd to the module as it will return "streaming" when the module is no longer streaming but QPS is still receiveing stream data from the module.
193
203
  ei the module has stopped streaming but is emptying the stream buffer.
194
204
  """
195
205
  command_response = self.connectionObj.qps.sendCmdVerbose("$stream state")
@@ -197,9 +207,8 @@ class quarchStream:
197
207
  raise Exception(command_response)
198
208
  return (command_response)
199
209
 
200
-
201
210
  def addAnnotation(self, title, annotationTime=0, extraText="", yPos="", titleColor="", annotationColor="",
202
- annotationType="", timeFormat="unix"):
211
+ annotationType="", annotationGroup="", timeFormat="unix"):
203
212
  """
204
213
  Adds a custom annotation to stream with given parameters.
205
214
 
@@ -230,14 +239,15 @@ class quarchStream:
230
239
  annotationType = annotationType.lower()
231
240
  annotationTime = str(annotationTime)
232
241
 
233
- if (annotationTime[0].isalpha() or annotationTime[-1].isalpha()):
234
- timeFormat="elapsed"
235
- if annotationTime.startswith("e"): #Old format allowed e to be used to pass elapsed time in seconds "e2" -> 2s + elapsed
236
- annotationTime=annotationTime[1:]+"s"
242
+ if annotationTime[0].isalpha() or annotationTime[-1].isalpha():
243
+ timeFormat = "elapsed"
244
+ if annotationTime.startswith(
245
+ "e"): #Old format allowed e to be used to pass elapsed time in seconds "e2" -> 2s + elapsed
246
+ annotationTime = annotationTime[1:] + "s"
237
247
 
238
- elif annotationTime=="0":
239
- annotationTime=current_milli_time()
240
- timeFormat="unix"
248
+ elif annotationTime == "0":
249
+ annotationTime = current_milli_time()
250
+ timeFormat = "unix"
241
251
 
242
252
  if annotationType == "" or annotationType == "annotation":
243
253
  annotationType = "annotate"
@@ -249,24 +259,23 @@ class quarchStream:
249
259
  # return retString
250
260
 
251
261
  title = title.replace("\n", "\\n")
252
- cmd="$stream annotation add "+" time="+str(annotationTime)+ " text=\""+title+"\""
253
- if extraText!="":
262
+ cmd = "$stream annotation add " + " time=" + str(annotationTime) + " text=\"" + title + "\""
263
+ if extraText != "":
254
264
  extraText = extraText.replace("\n", "\\n")
255
- cmd+=" extraText=\"" +str(extraText)+"\""
256
- if yPos!= "":
257
- cmd+=" yPos="+str(yPos)
258
- if type!="":
259
- cmd+=" type="+ str(annotationType)
260
- if annotationColor!="":
261
- cmd+=" colour="+str(annotationColor)
262
- if titleColor!="":
263
- cmd+=" textColour="+str(titleColor)
264
- if timeFormat!="":
265
- cmd+=" timeFormat="+str(timeFormat)
265
+ cmd += " extraText=\"" + str(extraText) + "\""
266
+ if yPos != "":
267
+ cmd += " yPos=" + str(yPos)
268
+ if type != "":
269
+ cmd += " type=" + str(annotationType)
270
+ if annotationColor != "":
271
+ cmd += " colour=" + str(annotationColor)
272
+ if titleColor != "":
273
+ cmd += " textColour=" + str(titleColor)
274
+ if timeFormat != "":
275
+ cmd += " timeFormat=" + str(timeFormat)
266
276
 
267
277
  return self.connectionObj.qps.sendCmdVerbose(cmd)
268
278
 
269
-
270
279
  def addComment(self, title, commentTime=0, extraText="", yPos="", titleColor="", commentColor="", annotationType="",
271
280
  annotationGroup="", timeFormat="unix"):
272
281
  # Comments are just annotations that do not affect the statistics grid.
@@ -277,7 +286,8 @@ class quarchStream:
277
286
  titleColor=titleColor, annotationColor=commentColor, annotationType=annotationType,
278
287
  annotationGroup=annotationGroup, timeFormat=timeFormat)
279
288
 
280
- def saveCSV(self, filePath, linesPerFile=None, cr=None, delimiter=None, timeout=60):
289
+ def saveCSV(self, filePath, linesPerFile=None, cr=None, delimiter=None, timeout=60, pollTillComplete=False,
290
+ checkInterval=0.5):
281
291
  """
282
292
  Saves the stream to csv file at specified location
283
293
 
@@ -311,6 +321,12 @@ class quarchStream:
311
321
  if delimiter != None:
312
322
  args += " -s" + delimiter
313
323
 
324
+ if pollTillComplete:
325
+ is_exporting = check_export_status(self.get_stream_export_status())
326
+ while is_exporting:
327
+ is_exporting = check_export_status(self.get_stream_export_status())
328
+ time.sleep(checkInterval)
329
+
314
330
  # , filePath, linesPerFile, cr, delimiter
315
331
  return self.connectionObj.qps.sendCmdVerbose("$save csv \"" + filePath + "\" " + args, timeout=timeout)
316
332
 
@@ -336,17 +352,22 @@ class quarchStream:
336
352
  def channels(self):
337
353
  return self.connectionObj.qps.sendCmdVerbose("$channels").splitlines()
338
354
 
339
- def stopStream(self):
340
- return self.connectionObj.qps.sendCmdVerbose("$stop stream")
341
-
342
- def stopStreamAndAllowBufferToEmpty(self, checkInterval=0.5):
343
- self.stopStream()
344
- streamState = self.getStreamState().lower()
345
- while "running" in streamState:
346
- logging.debug("Stream buffer still emptying: " + streamState)
347
- time.sleep(checkInterval)
355
+ def stopStream(self, pollTillComplete=False, checkInterval=0.5):
356
+ # Stop the stream
357
+ response = self.connectionObj.qps.sendCmdVerbose("$stop stream")
358
+ # Poll till stream has completed if required
359
+ if pollTillComplete:
360
+ # Get the current stream status
348
361
  streamState = self.getStreamState().lower()
349
- logging.debug("QPS no longer Streaming: " + streamState)
362
+ # Verify the stream stopped correctly
363
+ response = check_stream_stopped_status(streamState)
364
+ while "running" in streamState:
365
+ logging.debug("Stream buffer still emptying: " + streamState)
366
+ streamState = self.getStreamState().lower()
367
+ response = check_stream_stopped_status(streamState)
368
+ time.sleep(checkInterval)
369
+
370
+ return response
350
371
 
351
372
  def hideAllDefaultChannels(self):
352
373
 
@@ -386,8 +407,12 @@ class quarchStream:
386
407
  dataPointTime = qpsNowStr()
387
408
  else:
388
409
  dataPointTime = int(dataPointTime)
389
- logging.warning("$stream data add " + channelName + " " + groupName + " " + str(dataPointTime) + " " + str(
390
- dataValue) + " " + timeFormat)
391
410
  self.connectionObj.qps.sendCmdVerbose(
392
411
  "$stream data add " + channelName + " " + groupName + " " + str(dataPointTime) + " " + str(
393
412
  dataValue) + " " + timeFormat)
413
+
414
+ def get_stream_export_status(self):
415
+ return self.connectionObj.qps.sendCmdVerbose("$stream export status")
416
+
417
+ def get_stats_export_status(self):
418
+ return self.connectionObj.qps.sendCmdVerbose("$stream stats export status")
quarchpy/docs/CHANGES.rst CHANGED
@@ -14,6 +14,14 @@ Change Log
14
14
  ----------
15
15
 
16
16
 
17
+ 2.2.8
18
+ -----
19
+ - New QPS 1.46 and QIS 1.48
20
+
21
+ 2.2.7
22
+ -----
23
+ - Bug fix for QIS 1.47 missing lib for linux only
24
+
17
25
  2.2.6
18
26
  -----
19
27
  - New QPS 1.45 and QIS 1.47