quarchpy 2.2.12.dev1__py2.py3-none-any.whl → 2.2.13.dev1__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 (1168) hide show
  1. quarchpy/_version.py +1 -1
  2. quarchpy/connection_specific/QPS/3rdPartyLicenses/gson-license.txt +202 -0
  3. quarchpy/connection_specific/QPS/3rdPartyLicenses/guava-license.txt +202 -0
  4. quarchpy/connection_specific/QPS/3rdPartyLicenses/jfx-license.txt +347 -0
  5. quarchpy/connection_specific/QPS/3rdPartyLicenses/log4j-license.txt +202 -0
  6. quarchpy/connection_specific/QPS/3rdPartyLicenses/nsmenufx-LICENSE.txt +24 -0
  7. quarchpy/connection_specific/QPS/Power-Studio-QuickStart.pdf +0 -0
  8. quarchpy/connection_specific/QPS/{win-amd64/QuarchPowerStudio.properties.xml → QuarchPowerStudio.properties.xml} +0 -1
  9. quarchpy/connection_specific/QPS/{win-amd64/app.jar → app.jar} +0 -0
  10. quarchpy/connection_specific/QPS/{win-amd64/app.properties → app.properties} +1 -1
  11. quarchpy/connection_specific/QPS/{win-amd64/commandLineOptions.txt → commandLineOptions.txt} +6 -4
  12. quarchpy/connection_specific/QPS/{win-amd64/qis → qis}/3rdPartyLicenses/com.sun.istack-license.html +59 -59
  13. quarchpy/connection_specific/QPS/{win-amd64/qis → qis}/3rdPartyLicenses/dorkbox-LICENSE.Apachev2 +217 -217
  14. quarchpy/connection_specific/QPS/{win-amd64/qis → qis}/3rdPartyLicenses/jSerialComm-LICENSE-APACHE-2.0 +202 -202
  15. quarchpy/connection_specific/QPS/{win-amd64/qis → qis}/3rdPartyLicenses/jSerialComm-LICENSE-LGPL-3.0 +165 -165
  16. quarchpy/connection_specific/QPS/{win-amd64/qis → qis}/3rdPartyLicenses/jakarta.activation-license.html +59 -59
  17. quarchpy/connection_specific/QPS/{win-amd64/qis → qis}/3rdPartyLicenses/jakarta.xml.bind-api-license.html +59 -59
  18. quarchpy/connection_specific/QPS/{win-amd64/qis → qis}/3rdPartyLicenses/javassist-License.html +381 -381
  19. quarchpy/connection_specific/QPS/{win-amd64/qis → qis}/3rdPartyLicenses/jmdns-LICENSE.txt +202 -202
  20. quarchpy/connection_specific/QPS/{win-amd64/qis → qis}/3rdPartyLicenses/jna-AL2.0 +177 -177
  21. quarchpy/connection_specific/QPS/{win-amd64/qis → qis}/3rdPartyLicenses/kotlin-stdlib-LICENSE-2.0.txt +202 -202
  22. quarchpy/connection_specific/QPS/{win-amd64/qis → qis}/3rdPartyLicenses/netty-LICENSE.txt +202 -202
  23. quarchpy/connection_specific/QPS/{win-amd64/qis → qis}/3rdPartyLicenses/netty-NOTICE.txt +239 -239
  24. quarchpy/connection_specific/QPS/qis/3rdPartyLicenses/slf4j-LICENSE.txt +24 -0
  25. quarchpy/connection_specific/QPS/{win-amd64/qis → qis}/3rdPartyLicenses/usb4java-LICENSE.md +19 -19
  26. quarchpy/connection_specific/QPS/{win-amd64/qis → qis}/Comms.properties.xml +102 -102
  27. quarchpy/connection_specific/QPS/{win-amd64/qis → qis}/QuarchInstrumentServer.properties.xml +13 -12
  28. quarchpy/connection_specific/QPS/{win-amd64/qis → qis}/help.txt +11 -9
  29. quarchpy/connection_specific/QPS/qis/qis-NoGUI.bat +3 -0
  30. quarchpy/connection_specific/QPS/{win-amd64/qis → qis}/qis-NoGUI.sh +6 -6
  31. quarchpy/connection_specific/QPS/{win-amd64/qis → qis}/qis.bat +1 -1
  32. quarchpy/connection_specific/QPS/qis/qis.jar +0 -0
  33. quarchpy/connection_specific/QPS/{win-amd64/qis → qis}/qis.sh +2 -2
  34. quarchpy/connection_specific/QPS/qis/qis_lib/cinterface-2.5.6-20251003.113043-1.jar +0 -0
  35. quarchpy/connection_specific/QPS/qis/qis_lib/jul-to-slf4j-2.0.17.jar +0 -0
  36. quarchpy/connection_specific/QPS/qis/qis_lib/log4j-api-2.25.0.jar +0 -0
  37. quarchpy/connection_specific/QPS/qis/qis_lib/log4j-core-2.25.0.jar +0 -0
  38. quarchpy/connection_specific/QPS/qis/qis_lib/log4j-layout-template-json-2.25.0.jar +0 -0
  39. quarchpy/connection_specific/QPS/qis/qis_lib/log4j-slf4j2-impl-2.25.0.jar +0 -0
  40. quarchpy/connection_specific/QPS/qis/qis_lib/netty-buffer-4.2.2.Final.jar +0 -0
  41. quarchpy/connection_specific/QPS/qis/qis_lib/netty-codec-base-4.2.2.Final.jar +0 -0
  42. quarchpy/connection_specific/QPS/qis/qis_lib/netty-codec-http-4.2.2.Final.jar +0 -0
  43. quarchpy/connection_specific/QPS/qis/qis_lib/netty-common-4.2.2.Final.jar +0 -0
  44. quarchpy/connection_specific/QPS/qis/qis_lib/netty-handler-4.2.2.Final.jar +0 -0
  45. quarchpy/connection_specific/QPS/qis/qis_lib/netty-transport-4.2.2.Final.jar +0 -0
  46. quarchpy/connection_specific/QPS/qis/qis_lib/quarchcommon-2.1.8-20251003.112807-1.jar +0 -0
  47. quarchpy/connection_specific/QPS/qis/qis_lib/slf4j-api-2.0.17.jar +0 -0
  48. quarchpy/connection_specific/QPS/qis/qis_lib/torridoncommon-1.2.8-20251003.113215-1.jar +0 -0
  49. quarchpy/connection_specific/QPS/{win-amd64/qis → qis}/qis_lib/usb4java-1.3.1.jar +0 -0
  50. quarchpy/connection_specific/QPS/{win-amd64/qps-command-reference.html → qps-command-reference.html} +1 -1
  51. quarchpy/connection_specific/QPS/qps.jar +0 -0
  52. quarchpy/connection_specific/QPS/qps_lib/gson-2.13.1.jar +0 -0
  53. quarchpy/connection_specific/QPS/qps_lib/jfa-1.2.0.jar +0 -0
  54. quarchpy/connection_specific/QPS/qps_lib/jfxutilities-1.0.4-20251002.100356-1.jar +0 -0
  55. quarchpy/connection_specific/QPS/qps_lib/jna-5.17.0.jar +0 -0
  56. quarchpy/connection_specific/QPS/qps_lib/jul-to-slf4j-2.0.17.jar +0 -0
  57. quarchpy/connection_specific/QPS/qps_lib/log4j-api-2.25.0.jar +0 -0
  58. quarchpy/connection_specific/QPS/qps_lib/log4j-core-2.25.0.jar +0 -0
  59. quarchpy/connection_specific/QPS/qps_lib/log4j-layout-template-json-2.25.0.jar +0 -0
  60. quarchpy/connection_specific/QPS/qps_lib/log4j-slf4j2-impl-2.25.0.jar +0 -0
  61. quarchpy/connection_specific/QPS/qps_lib/netty-buffer-4.2.2.Final.jar +0 -0
  62. quarchpy/connection_specific/QPS/qps_lib/netty-codec-base-4.2.2.Final.jar +0 -0
  63. quarchpy/connection_specific/QPS/qps_lib/netty-codec-http-4.2.2.Final.jar +0 -0
  64. quarchpy/connection_specific/QPS/qps_lib/netty-common-4.2.2.Final.jar +0 -0
  65. quarchpy/connection_specific/QPS/qps_lib/netty-handler-4.2.2.Final.jar +0 -0
  66. quarchpy/connection_specific/QPS/qps_lib/netty-transport-4.2.2.Final.jar +0 -0
  67. quarchpy/connection_specific/QPS/qps_lib/nsmenufx-3.1.0.jar +0 -0
  68. quarchpy/connection_specific/QPS/qps_lib/quarchcommon-2.1.8-20251003.112807-1.jar +0 -0
  69. quarchpy/connection_specific/QPS/qps_lib/qutils-1.0.2.jar +0 -0
  70. quarchpy/connection_specific/QPS/qps_lib/slf4j-api-2.0.17.jar +0 -0
  71. quarchpy/connection_specific/QPS/{win-amd64/scriptCommands.txt → scriptCommands.txt} +2 -2
  72. quarchpy/connection_specific/QPS/whats-new.txt +37 -0
  73. quarchpy/connection_specific/connection_QIS.py +1033 -1386
  74. quarchpy/connection_specific/connection_USB.py +1 -3
  75. quarchpy/connection_specific/jdk_jres/lin_amd64_jdk_jre/bin/java +0 -0
  76. quarchpy/connection_specific/jdk_jres/lin_amd64_jdk_jre/bin/jfr +0 -0
  77. quarchpy/connection_specific/jdk_jres/lin_amd64_jdk_jre/bin/jrunscript +0 -0
  78. quarchpy/connection_specific/jdk_jres/lin_amd64_jdk_jre/bin/jwebserver +0 -0
  79. quarchpy/connection_specific/jdk_jres/lin_amd64_jdk_jre/bin/keytool +0 -0
  80. quarchpy/connection_specific/jdk_jres/lin_amd64_jdk_jre/bin/rmiregistry +0 -0
  81. quarchpy/connection_specific/jdk_jres/lin_amd64_jdk_jre/conf/jaxp-strict.properties.template +123 -123
  82. quarchpy/connection_specific/jdk_jres/lin_amd64_jdk_jre/conf/jaxp.properties +200 -200
  83. quarchpy/connection_specific/jdk_jres/lin_amd64_jdk_jre/conf/logging.properties +63 -63
  84. quarchpy/connection_specific/jdk_jres/lin_amd64_jdk_jre/conf/management/jmxremote.access +79 -79
  85. quarchpy/connection_specific/jdk_jres/lin_amd64_jdk_jre/conf/management/jmxremote.password.template +114 -114
  86. quarchpy/connection_specific/jdk_jres/lin_amd64_jdk_jre/conf/management/management.properties +326 -326
  87. quarchpy/connection_specific/jdk_jres/lin_amd64_jdk_jre/conf/net.properties +162 -162
  88. quarchpy/connection_specific/jdk_jres/lin_amd64_jdk_jre/conf/sdp/sdp.conf.template +30 -30
  89. quarchpy/connection_specific/jdk_jres/lin_amd64_jdk_jre/conf/security/java.security +1517 -1517
  90. quarchpy/connection_specific/jdk_jres/lin_amd64_jdk_jre/conf/security/policy/README.txt +54 -54
  91. quarchpy/connection_specific/jdk_jres/lin_amd64_jdk_jre/conf/security/policy/limited/default_US_export.policy +6 -6
  92. quarchpy/connection_specific/jdk_jres/lin_amd64_jdk_jre/conf/security/policy/limited/default_local.policy +14 -14
  93. quarchpy/connection_specific/jdk_jres/lin_amd64_jdk_jre/conf/security/policy/limited/exempt_local.policy +13 -13
  94. quarchpy/connection_specific/jdk_jres/lin_amd64_jdk_jre/conf/security/policy/unlimited/default_US_export.policy +6 -6
  95. quarchpy/connection_specific/jdk_jres/lin_amd64_jdk_jre/conf/security/policy/unlimited/default_local.policy +6 -6
  96. quarchpy/connection_specific/jdk_jres/lin_amd64_jdk_jre/conf/sound.properties +39 -39
  97. quarchpy/connection_specific/jdk_jres/lin_amd64_jdk_jre/legal/java.base/ADDITIONAL_LICENSE_INFO +37 -37
  98. quarchpy/connection_specific/jdk_jres/lin_amd64_jdk_jre/legal/java.base/ASSEMBLY_EXCEPTION +27 -27
  99. quarchpy/connection_specific/jdk_jres/lin_amd64_jdk_jre/legal/java.base/LICENSE +347 -347
  100. quarchpy/connection_specific/jdk_jres/lin_amd64_jdk_jre/legal/java.base/aes.md +36 -36
  101. quarchpy/connection_specific/jdk_jres/lin_amd64_jdk_jre/legal/java.base/asm.md +36 -36
  102. quarchpy/connection_specific/jdk_jres/lin_amd64_jdk_jre/legal/java.base/c-libutl.md +35 -35
  103. quarchpy/connection_specific/jdk_jres/lin_amd64_jdk_jre/legal/java.base/cldr.md +100 -100
  104. quarchpy/connection_specific/jdk_jres/lin_amd64_jdk_jre/legal/java.base/icu.md +93 -93
  105. quarchpy/connection_specific/jdk_jres/lin_amd64_jdk_jre/legal/java.base/public_suffix.md +399 -399
  106. quarchpy/connection_specific/jdk_jres/lin_amd64_jdk_jre/legal/java.base/siphash.md +150 -150
  107. quarchpy/connection_specific/jdk_jres/lin_amd64_jdk_jre/legal/java.base/unicode.md +269 -269
  108. quarchpy/connection_specific/jdk_jres/lin_amd64_jdk_jre/legal/java.compiler/ADDITIONAL_LICENSE_INFO +37 -37
  109. quarchpy/connection_specific/jdk_jres/lin_amd64_jdk_jre/legal/java.compiler/ASSEMBLY_EXCEPTION +27 -27
  110. quarchpy/connection_specific/jdk_jres/lin_amd64_jdk_jre/legal/java.compiler/LICENSE +347 -347
  111. quarchpy/connection_specific/jdk_jres/lin_amd64_jdk_jre/legal/java.datatransfer/ADDITIONAL_LICENSE_INFO +37 -37
  112. quarchpy/connection_specific/jdk_jres/lin_amd64_jdk_jre/legal/java.datatransfer/ASSEMBLY_EXCEPTION +27 -27
  113. quarchpy/connection_specific/jdk_jres/lin_amd64_jdk_jre/legal/java.datatransfer/LICENSE +347 -347
  114. quarchpy/connection_specific/jdk_jres/lin_amd64_jdk_jre/legal/java.desktop/ADDITIONAL_LICENSE_INFO +37 -37
  115. quarchpy/connection_specific/jdk_jres/lin_amd64_jdk_jre/legal/java.desktop/ASSEMBLY_EXCEPTION +27 -27
  116. quarchpy/connection_specific/jdk_jres/lin_amd64_jdk_jre/legal/java.desktop/LICENSE +347 -347
  117. quarchpy/connection_specific/jdk_jres/lin_amd64_jdk_jre/legal/java.desktop/colorimaging.md +7 -7
  118. quarchpy/connection_specific/jdk_jres/lin_amd64_jdk_jre/legal/java.desktop/freetype.md +649 -649
  119. quarchpy/connection_specific/jdk_jres/lin_amd64_jdk_jre/legal/java.desktop/giflib.md +46 -46
  120. quarchpy/connection_specific/jdk_jres/lin_amd64_jdk_jre/legal/java.desktop/harfbuzz.md +104 -103
  121. quarchpy/connection_specific/jdk_jres/lin_amd64_jdk_jre/legal/java.desktop/jpeg.md +77 -77
  122. quarchpy/connection_specific/jdk_jres/lin_amd64_jdk_jre/legal/java.desktop/lcms.md +103 -103
  123. quarchpy/connection_specific/jdk_jres/lin_amd64_jdk_jre/legal/java.desktop/libpng.md +216 -215
  124. quarchpy/connection_specific/jdk_jres/lin_amd64_jdk_jre/legal/java.desktop/mesa3d.md +134 -134
  125. quarchpy/connection_specific/jdk_jres/lin_amd64_jdk_jre/legal/java.desktop/pipewire.md +46 -41
  126. quarchpy/connection_specific/jdk_jres/lin_amd64_jdk_jre/legal/java.desktop/xwd.md +34 -34
  127. quarchpy/connection_specific/jdk_jres/lin_amd64_jdk_jre/legal/java.instrument/ADDITIONAL_LICENSE_INFO +37 -37
  128. quarchpy/connection_specific/jdk_jres/lin_amd64_jdk_jre/legal/java.instrument/ASSEMBLY_EXCEPTION +27 -27
  129. quarchpy/connection_specific/jdk_jres/lin_amd64_jdk_jre/legal/java.instrument/LICENSE +347 -347
  130. quarchpy/connection_specific/jdk_jres/lin_amd64_jdk_jre/legal/java.logging/ADDITIONAL_LICENSE_INFO +37 -37
  131. quarchpy/connection_specific/jdk_jres/lin_amd64_jdk_jre/legal/java.logging/ASSEMBLY_EXCEPTION +27 -27
  132. quarchpy/connection_specific/jdk_jres/lin_amd64_jdk_jre/legal/java.logging/LICENSE +347 -347
  133. quarchpy/connection_specific/jdk_jres/lin_amd64_jdk_jre/legal/java.management/ADDITIONAL_LICENSE_INFO +37 -37
  134. quarchpy/connection_specific/jdk_jres/lin_amd64_jdk_jre/legal/java.management/ASSEMBLY_EXCEPTION +27 -27
  135. quarchpy/connection_specific/jdk_jres/lin_amd64_jdk_jre/legal/java.management/LICENSE +347 -347
  136. quarchpy/connection_specific/jdk_jres/lin_amd64_jdk_jre/legal/java.management.rmi/ADDITIONAL_LICENSE_INFO +37 -37
  137. quarchpy/connection_specific/jdk_jres/lin_amd64_jdk_jre/legal/java.management.rmi/ASSEMBLY_EXCEPTION +27 -27
  138. quarchpy/connection_specific/jdk_jres/lin_amd64_jdk_jre/legal/java.management.rmi/LICENSE +347 -347
  139. quarchpy/connection_specific/jdk_jres/lin_amd64_jdk_jre/legal/java.naming/ADDITIONAL_LICENSE_INFO +37 -37
  140. quarchpy/connection_specific/jdk_jres/lin_amd64_jdk_jre/legal/java.naming/ASSEMBLY_EXCEPTION +27 -27
  141. quarchpy/connection_specific/jdk_jres/lin_amd64_jdk_jre/legal/java.naming/LICENSE +347 -347
  142. quarchpy/connection_specific/jdk_jres/lin_amd64_jdk_jre/legal/java.net.http/ADDITIONAL_LICENSE_INFO +37 -37
  143. quarchpy/connection_specific/jdk_jres/lin_amd64_jdk_jre/legal/java.net.http/ASSEMBLY_EXCEPTION +27 -27
  144. quarchpy/connection_specific/jdk_jres/lin_amd64_jdk_jre/legal/java.net.http/LICENSE +347 -347
  145. quarchpy/connection_specific/jdk_jres/lin_amd64_jdk_jre/legal/java.prefs/ADDITIONAL_LICENSE_INFO +37 -37
  146. quarchpy/connection_specific/jdk_jres/lin_amd64_jdk_jre/legal/java.prefs/ASSEMBLY_EXCEPTION +27 -27
  147. quarchpy/connection_specific/jdk_jres/lin_amd64_jdk_jre/legal/java.prefs/LICENSE +347 -347
  148. quarchpy/connection_specific/jdk_jres/lin_amd64_jdk_jre/legal/java.rmi/ADDITIONAL_LICENSE_INFO +37 -37
  149. quarchpy/connection_specific/jdk_jres/lin_amd64_jdk_jre/legal/java.rmi/ASSEMBLY_EXCEPTION +27 -27
  150. quarchpy/connection_specific/jdk_jres/lin_amd64_jdk_jre/legal/java.rmi/LICENSE +347 -347
  151. quarchpy/connection_specific/jdk_jres/lin_amd64_jdk_jre/legal/java.scripting/ADDITIONAL_LICENSE_INFO +37 -37
  152. quarchpy/connection_specific/jdk_jres/lin_amd64_jdk_jre/legal/java.scripting/ASSEMBLY_EXCEPTION +27 -27
  153. quarchpy/connection_specific/jdk_jres/lin_amd64_jdk_jre/legal/java.scripting/LICENSE +347 -347
  154. quarchpy/connection_specific/jdk_jres/lin_amd64_jdk_jre/legal/java.se/ADDITIONAL_LICENSE_INFO +37 -37
  155. quarchpy/connection_specific/jdk_jres/lin_amd64_jdk_jre/legal/java.se/ASSEMBLY_EXCEPTION +27 -27
  156. quarchpy/connection_specific/jdk_jres/lin_amd64_jdk_jre/legal/java.se/LICENSE +347 -347
  157. quarchpy/connection_specific/jdk_jres/lin_amd64_jdk_jre/legal/java.security.jgss/ADDITIONAL_LICENSE_INFO +37 -37
  158. quarchpy/connection_specific/jdk_jres/lin_amd64_jdk_jre/legal/java.security.jgss/ASSEMBLY_EXCEPTION +27 -27
  159. quarchpy/connection_specific/jdk_jres/lin_amd64_jdk_jre/legal/java.security.jgss/LICENSE +347 -347
  160. quarchpy/connection_specific/jdk_jres/lin_amd64_jdk_jre/legal/java.security.sasl/ADDITIONAL_LICENSE_INFO +37 -37
  161. quarchpy/connection_specific/jdk_jres/lin_amd64_jdk_jre/legal/java.security.sasl/ASSEMBLY_EXCEPTION +27 -27
  162. quarchpy/connection_specific/jdk_jres/lin_amd64_jdk_jre/legal/java.security.sasl/LICENSE +347 -347
  163. quarchpy/connection_specific/jdk_jres/lin_amd64_jdk_jre/legal/java.smartcardio/ADDITIONAL_LICENSE_INFO +37 -37
  164. quarchpy/connection_specific/jdk_jres/lin_amd64_jdk_jre/legal/java.smartcardio/ASSEMBLY_EXCEPTION +27 -27
  165. quarchpy/connection_specific/jdk_jres/lin_amd64_jdk_jre/legal/java.smartcardio/LICENSE +347 -347
  166. quarchpy/connection_specific/jdk_jres/lin_amd64_jdk_jre/legal/java.smartcardio/pcsclite.md +57 -57
  167. quarchpy/connection_specific/jdk_jres/lin_amd64_jdk_jre/legal/java.sql/ADDITIONAL_LICENSE_INFO +37 -37
  168. quarchpy/connection_specific/jdk_jres/lin_amd64_jdk_jre/legal/java.sql/ASSEMBLY_EXCEPTION +27 -27
  169. quarchpy/connection_specific/jdk_jres/lin_amd64_jdk_jre/legal/java.sql/LICENSE +347 -347
  170. quarchpy/connection_specific/jdk_jres/lin_amd64_jdk_jre/legal/java.sql.rowset/ADDITIONAL_LICENSE_INFO +37 -37
  171. quarchpy/connection_specific/jdk_jres/lin_amd64_jdk_jre/legal/java.sql.rowset/ASSEMBLY_EXCEPTION +27 -27
  172. quarchpy/connection_specific/jdk_jres/lin_amd64_jdk_jre/legal/java.sql.rowset/LICENSE +347 -347
  173. quarchpy/connection_specific/jdk_jres/lin_amd64_jdk_jre/legal/java.transaction.xa/ADDITIONAL_LICENSE_INFO +37 -37
  174. quarchpy/connection_specific/jdk_jres/lin_amd64_jdk_jre/legal/java.transaction.xa/ASSEMBLY_EXCEPTION +27 -27
  175. quarchpy/connection_specific/jdk_jres/lin_amd64_jdk_jre/legal/java.transaction.xa/LICENSE +347 -347
  176. quarchpy/connection_specific/jdk_jres/lin_amd64_jdk_jre/legal/java.xml/ADDITIONAL_LICENSE_INFO +37 -37
  177. quarchpy/connection_specific/jdk_jres/lin_amd64_jdk_jre/legal/java.xml/ASSEMBLY_EXCEPTION +27 -27
  178. quarchpy/connection_specific/jdk_jres/lin_amd64_jdk_jre/legal/java.xml/LICENSE +347 -347
  179. quarchpy/connection_specific/jdk_jres/lin_amd64_jdk_jre/legal/java.xml/bcel.md +219 -219
  180. quarchpy/connection_specific/jdk_jres/lin_amd64_jdk_jre/legal/java.xml/dom.md +77 -77
  181. quarchpy/connection_specific/jdk_jres/lin_amd64_jdk_jre/legal/java.xml/jcup.md +31 -31
  182. quarchpy/connection_specific/jdk_jres/lin_amd64_jdk_jre/legal/java.xml/schema10part1.md +51 -51
  183. quarchpy/connection_specific/jdk_jres/lin_amd64_jdk_jre/legal/java.xml/schema10part2.md +50 -50
  184. quarchpy/connection_specific/jdk_jres/lin_amd64_jdk_jre/legal/java.xml/xalan.md +255 -255
  185. quarchpy/connection_specific/jdk_jres/lin_amd64_jdk_jre/legal/java.xml/xerces.md +229 -229
  186. quarchpy/connection_specific/jdk_jres/lin_amd64_jdk_jre/legal/java.xml/xhtml10.md +57 -57
  187. quarchpy/connection_specific/jdk_jres/lin_amd64_jdk_jre/legal/java.xml/xhtml10schema.md +150 -150
  188. quarchpy/connection_specific/jdk_jres/lin_amd64_jdk_jre/legal/java.xml/xhtml11.md +68 -68
  189. quarchpy/connection_specific/jdk_jres/lin_amd64_jdk_jre/legal/java.xml/xhtml11schema.md +60 -60
  190. quarchpy/connection_specific/jdk_jres/lin_amd64_jdk_jre/legal/java.xml/xmlspec.md +63 -63
  191. quarchpy/connection_specific/jdk_jres/lin_amd64_jdk_jre/legal/java.xml/xmlxsd.md +43 -43
  192. quarchpy/connection_specific/jdk_jres/lin_amd64_jdk_jre/legal/java.xml.crypto/ADDITIONAL_LICENSE_INFO +37 -37
  193. quarchpy/connection_specific/jdk_jres/lin_amd64_jdk_jre/legal/java.xml.crypto/ASSEMBLY_EXCEPTION +27 -27
  194. quarchpy/connection_specific/jdk_jres/lin_amd64_jdk_jre/legal/java.xml.crypto/LICENSE +347 -347
  195. quarchpy/connection_specific/jdk_jres/lin_amd64_jdk_jre/legal/java.xml.crypto/santuario.md +227 -227
  196. quarchpy/connection_specific/jdk_jres/lin_amd64_jdk_jre/legal/javafx.base/ADDITIONAL_LICENSE_INFO +37 -0
  197. quarchpy/connection_specific/jdk_jres/lin_amd64_jdk_jre/legal/javafx.base/ASSEMBLY_EXCEPTION +27 -0
  198. quarchpy/connection_specific/jdk_jres/lin_amd64_jdk_jre/legal/javafx.base/LICENSE +347 -0
  199. quarchpy/connection_specific/jdk_jres/lin_amd64_jdk_jre/legal/javafx.controls/ADDITIONAL_LICENSE_INFO +37 -0
  200. quarchpy/connection_specific/jdk_jres/lin_amd64_jdk_jre/legal/javafx.controls/ASSEMBLY_EXCEPTION +27 -0
  201. quarchpy/connection_specific/jdk_jres/lin_amd64_jdk_jre/legal/javafx.controls/LICENSE +347 -0
  202. quarchpy/connection_specific/jdk_jres/lin_amd64_jdk_jre/legal/javafx.fxml/ADDITIONAL_LICENSE_INFO +37 -0
  203. quarchpy/connection_specific/jdk_jres/lin_amd64_jdk_jre/legal/javafx.fxml/ASSEMBLY_EXCEPTION +27 -0
  204. quarchpy/connection_specific/jdk_jres/lin_amd64_jdk_jre/legal/javafx.fxml/LICENSE +347 -0
  205. quarchpy/connection_specific/jdk_jres/lin_amd64_jdk_jre/legal/javafx.graphics/ADDITIONAL_LICENSE_INFO +37 -0
  206. quarchpy/connection_specific/jdk_jres/lin_amd64_jdk_jre/legal/javafx.graphics/ASSEMBLY_EXCEPTION +27 -0
  207. quarchpy/connection_specific/jdk_jres/lin_amd64_jdk_jre/legal/javafx.graphics/LICENSE +347 -0
  208. quarchpy/connection_specific/jdk_jres/lin_amd64_jdk_jre/legal/javafx.graphics/jpeg_fx.md +43 -0
  209. quarchpy/connection_specific/jdk_jres/lin_amd64_jdk_jre/legal/javafx.graphics/mesa3d.md +134 -0
  210. quarchpy/connection_specific/jdk_jres/lin_amd64_jdk_jre/legal/javafx.graphics/pipewire.md +46 -0
  211. quarchpy/connection_specific/jdk_jres/lin_amd64_jdk_jre/legal/javafx.swing/ADDITIONAL_LICENSE_INFO +37 -0
  212. quarchpy/connection_specific/jdk_jres/lin_amd64_jdk_jre/legal/javafx.swing/ASSEMBLY_EXCEPTION +27 -0
  213. quarchpy/connection_specific/jdk_jres/lin_amd64_jdk_jre/legal/javafx.swing/LICENSE +347 -0
  214. quarchpy/connection_specific/jdk_jres/lin_amd64_jdk_jre/legal/jdk.accessibility/ADDITIONAL_LICENSE_INFO +37 -37
  215. quarchpy/connection_specific/jdk_jres/lin_amd64_jdk_jre/legal/jdk.accessibility/ASSEMBLY_EXCEPTION +27 -27
  216. quarchpy/connection_specific/jdk_jres/lin_amd64_jdk_jre/legal/jdk.accessibility/LICENSE +347 -347
  217. quarchpy/connection_specific/jdk_jres/lin_amd64_jdk_jre/legal/jdk.charsets/ADDITIONAL_LICENSE_INFO +37 -37
  218. quarchpy/connection_specific/jdk_jres/lin_amd64_jdk_jre/legal/jdk.charsets/ASSEMBLY_EXCEPTION +27 -27
  219. quarchpy/connection_specific/jdk_jres/lin_amd64_jdk_jre/legal/jdk.charsets/LICENSE +347 -347
  220. quarchpy/connection_specific/jdk_jres/lin_amd64_jdk_jre/legal/jdk.crypto.cryptoki/ADDITIONAL_LICENSE_INFO +37 -37
  221. quarchpy/connection_specific/jdk_jres/lin_amd64_jdk_jre/legal/jdk.crypto.cryptoki/ASSEMBLY_EXCEPTION +27 -27
  222. quarchpy/connection_specific/jdk_jres/lin_amd64_jdk_jre/legal/jdk.crypto.cryptoki/LICENSE +347 -347
  223. quarchpy/connection_specific/jdk_jres/lin_amd64_jdk_jre/legal/jdk.crypto.cryptoki/pkcs11cryptotoken.md +76 -76
  224. quarchpy/connection_specific/jdk_jres/lin_amd64_jdk_jre/legal/jdk.crypto.cryptoki/pkcs11wrapper.md +46 -46
  225. quarchpy/connection_specific/jdk_jres/lin_amd64_jdk_jre/legal/jdk.crypto.ec/ADDITIONAL_LICENSE_INFO +37 -37
  226. quarchpy/connection_specific/jdk_jres/lin_amd64_jdk_jre/legal/jdk.crypto.ec/ASSEMBLY_EXCEPTION +27 -27
  227. quarchpy/connection_specific/jdk_jres/lin_amd64_jdk_jre/legal/jdk.crypto.ec/LICENSE +347 -347
  228. quarchpy/connection_specific/jdk_jres/lin_amd64_jdk_jre/legal/jdk.dynalink/ADDITIONAL_LICENSE_INFO +37 -37
  229. quarchpy/connection_specific/jdk_jres/lin_amd64_jdk_jre/legal/jdk.dynalink/ASSEMBLY_EXCEPTION +27 -27
  230. quarchpy/connection_specific/jdk_jres/lin_amd64_jdk_jre/legal/jdk.dynalink/LICENSE +347 -347
  231. quarchpy/connection_specific/jdk_jres/lin_amd64_jdk_jre/legal/jdk.dynalink/dynalink.md +32 -32
  232. quarchpy/connection_specific/jdk_jres/lin_amd64_jdk_jre/legal/jdk.httpserver/ADDITIONAL_LICENSE_INFO +37 -37
  233. quarchpy/connection_specific/jdk_jres/lin_amd64_jdk_jre/legal/jdk.httpserver/ASSEMBLY_EXCEPTION +27 -27
  234. quarchpy/connection_specific/jdk_jres/lin_amd64_jdk_jre/legal/jdk.httpserver/LICENSE +347 -347
  235. quarchpy/connection_specific/jdk_jres/lin_amd64_jdk_jre/legal/jdk.incubator.vector/ADDITIONAL_LICENSE_INFO +37 -37
  236. quarchpy/connection_specific/jdk_jres/lin_amd64_jdk_jre/legal/jdk.incubator.vector/ASSEMBLY_EXCEPTION +27 -27
  237. quarchpy/connection_specific/jdk_jres/lin_amd64_jdk_jre/legal/jdk.incubator.vector/LICENSE +347 -347
  238. quarchpy/connection_specific/jdk_jres/lin_amd64_jdk_jre/legal/jdk.incubator.vector/sleef.md +439 -439
  239. quarchpy/connection_specific/jdk_jres/lin_amd64_jdk_jre/legal/jdk.internal.vm.ci/ADDITIONAL_LICENSE_INFO +37 -37
  240. quarchpy/connection_specific/jdk_jres/lin_amd64_jdk_jre/legal/jdk.internal.vm.ci/ASSEMBLY_EXCEPTION +27 -27
  241. quarchpy/connection_specific/jdk_jres/lin_amd64_jdk_jre/legal/jdk.internal.vm.ci/LICENSE +347 -347
  242. quarchpy/connection_specific/jdk_jres/lin_amd64_jdk_jre/legal/jdk.jdwp.agent/ADDITIONAL_LICENSE_INFO +37 -37
  243. quarchpy/connection_specific/jdk_jres/lin_amd64_jdk_jre/legal/jdk.jdwp.agent/ASSEMBLY_EXCEPTION +27 -27
  244. quarchpy/connection_specific/jdk_jres/lin_amd64_jdk_jre/legal/jdk.jdwp.agent/LICENSE +347 -347
  245. quarchpy/connection_specific/jdk_jres/lin_amd64_jdk_jre/legal/jdk.jfr/ADDITIONAL_LICENSE_INFO +37 -37
  246. quarchpy/connection_specific/jdk_jres/lin_amd64_jdk_jre/legal/jdk.jfr/ASSEMBLY_EXCEPTION +27 -27
  247. quarchpy/connection_specific/jdk_jres/lin_amd64_jdk_jre/legal/jdk.jfr/LICENSE +347 -347
  248. quarchpy/connection_specific/jdk_jres/lin_amd64_jdk_jre/legal/jdk.jsobject/ADDITIONAL_LICENSE_INFO +37 -37
  249. quarchpy/connection_specific/jdk_jres/lin_amd64_jdk_jre/legal/jdk.jsobject/ASSEMBLY_EXCEPTION +27 -27
  250. quarchpy/connection_specific/jdk_jres/lin_amd64_jdk_jre/legal/jdk.jsobject/LICENSE +347 -347
  251. quarchpy/connection_specific/jdk_jres/lin_amd64_jdk_jre/legal/jdk.localedata/ADDITIONAL_LICENSE_INFO +37 -37
  252. quarchpy/connection_specific/jdk_jres/lin_amd64_jdk_jre/legal/jdk.localedata/ASSEMBLY_EXCEPTION +27 -27
  253. quarchpy/connection_specific/jdk_jres/lin_amd64_jdk_jre/legal/jdk.localedata/LICENSE +347 -347
  254. quarchpy/connection_specific/jdk_jres/lin_amd64_jdk_jre/legal/jdk.localedata/cldr.md +100 -100
  255. quarchpy/connection_specific/jdk_jres/lin_amd64_jdk_jre/legal/jdk.localedata/thaidict.md +31 -31
  256. quarchpy/connection_specific/jdk_jres/lin_amd64_jdk_jre/legal/jdk.management/ADDITIONAL_LICENSE_INFO +37 -37
  257. quarchpy/connection_specific/jdk_jres/lin_amd64_jdk_jre/legal/jdk.management/ASSEMBLY_EXCEPTION +27 -27
  258. quarchpy/connection_specific/jdk_jres/lin_amd64_jdk_jre/legal/jdk.management/LICENSE +347 -347
  259. quarchpy/connection_specific/jdk_jres/lin_amd64_jdk_jre/legal/jdk.management.agent/ADDITIONAL_LICENSE_INFO +37 -37
  260. quarchpy/connection_specific/jdk_jres/lin_amd64_jdk_jre/legal/jdk.management.agent/ASSEMBLY_EXCEPTION +27 -27
  261. quarchpy/connection_specific/jdk_jres/lin_amd64_jdk_jre/legal/jdk.management.agent/LICENSE +347 -347
  262. quarchpy/connection_specific/jdk_jres/lin_amd64_jdk_jre/legal/jdk.management.jfr/ADDITIONAL_LICENSE_INFO +37 -37
  263. quarchpy/connection_specific/jdk_jres/lin_amd64_jdk_jre/legal/jdk.management.jfr/ASSEMBLY_EXCEPTION +27 -27
  264. quarchpy/connection_specific/jdk_jres/lin_amd64_jdk_jre/legal/jdk.management.jfr/LICENSE +347 -347
  265. quarchpy/connection_specific/jdk_jres/lin_amd64_jdk_jre/legal/jdk.naming.dns/ADDITIONAL_LICENSE_INFO +37 -37
  266. quarchpy/connection_specific/jdk_jres/lin_amd64_jdk_jre/legal/jdk.naming.dns/ASSEMBLY_EXCEPTION +27 -27
  267. quarchpy/connection_specific/jdk_jres/lin_amd64_jdk_jre/legal/jdk.naming.dns/LICENSE +347 -347
  268. quarchpy/connection_specific/jdk_jres/lin_amd64_jdk_jre/legal/jdk.naming.rmi/ADDITIONAL_LICENSE_INFO +37 -37
  269. quarchpy/connection_specific/jdk_jres/lin_amd64_jdk_jre/legal/jdk.naming.rmi/ASSEMBLY_EXCEPTION +27 -27
  270. quarchpy/connection_specific/jdk_jres/lin_amd64_jdk_jre/legal/jdk.naming.rmi/LICENSE +347 -347
  271. quarchpy/connection_specific/jdk_jres/lin_amd64_jdk_jre/legal/jdk.net/ADDITIONAL_LICENSE_INFO +37 -37
  272. quarchpy/connection_specific/jdk_jres/lin_amd64_jdk_jre/legal/jdk.net/ASSEMBLY_EXCEPTION +27 -27
  273. quarchpy/connection_specific/jdk_jres/lin_amd64_jdk_jre/legal/jdk.net/LICENSE +347 -347
  274. quarchpy/connection_specific/jdk_jres/lin_amd64_jdk_jre/legal/jdk.nio.mapmode/ADDITIONAL_LICENSE_INFO +37 -37
  275. quarchpy/connection_specific/jdk_jres/lin_amd64_jdk_jre/legal/jdk.nio.mapmode/ASSEMBLY_EXCEPTION +27 -27
  276. quarchpy/connection_specific/jdk_jres/lin_amd64_jdk_jre/legal/jdk.nio.mapmode/LICENSE +347 -347
  277. quarchpy/connection_specific/jdk_jres/lin_amd64_jdk_jre/legal/jdk.sctp/ADDITIONAL_LICENSE_INFO +37 -37
  278. quarchpy/connection_specific/jdk_jres/lin_amd64_jdk_jre/legal/jdk.sctp/ASSEMBLY_EXCEPTION +27 -27
  279. quarchpy/connection_specific/jdk_jres/lin_amd64_jdk_jre/legal/jdk.sctp/LICENSE +347 -347
  280. quarchpy/connection_specific/jdk_jres/lin_amd64_jdk_jre/legal/jdk.security.auth/ADDITIONAL_LICENSE_INFO +37 -37
  281. quarchpy/connection_specific/jdk_jres/lin_amd64_jdk_jre/legal/jdk.security.auth/ASSEMBLY_EXCEPTION +27 -27
  282. quarchpy/connection_specific/jdk_jres/lin_amd64_jdk_jre/legal/jdk.security.auth/LICENSE +347 -347
  283. quarchpy/connection_specific/jdk_jres/lin_amd64_jdk_jre/legal/jdk.security.jgss/ADDITIONAL_LICENSE_INFO +37 -37
  284. quarchpy/connection_specific/jdk_jres/lin_amd64_jdk_jre/legal/jdk.security.jgss/ASSEMBLY_EXCEPTION +27 -27
  285. quarchpy/connection_specific/jdk_jres/lin_amd64_jdk_jre/legal/jdk.security.jgss/LICENSE +347 -347
  286. quarchpy/connection_specific/jdk_jres/lin_amd64_jdk_jre/legal/jdk.unsupported/ADDITIONAL_LICENSE_INFO +37 -37
  287. quarchpy/connection_specific/jdk_jres/lin_amd64_jdk_jre/legal/jdk.unsupported/ASSEMBLY_EXCEPTION +27 -27
  288. quarchpy/connection_specific/jdk_jres/lin_amd64_jdk_jre/legal/jdk.unsupported/LICENSE +347 -347
  289. quarchpy/connection_specific/jdk_jres/lin_amd64_jdk_jre/legal/jdk.unsupported.desktop/ADDITIONAL_LICENSE_INFO +37 -37
  290. quarchpy/connection_specific/jdk_jres/lin_amd64_jdk_jre/legal/jdk.unsupported.desktop/ASSEMBLY_EXCEPTION +27 -27
  291. quarchpy/connection_specific/jdk_jres/lin_amd64_jdk_jre/legal/jdk.unsupported.desktop/LICENSE +347 -347
  292. quarchpy/connection_specific/jdk_jres/lin_amd64_jdk_jre/legal/jdk.xml.dom/ADDITIONAL_LICENSE_INFO +37 -37
  293. quarchpy/connection_specific/jdk_jres/lin_amd64_jdk_jre/legal/jdk.xml.dom/ASSEMBLY_EXCEPTION +27 -27
  294. quarchpy/connection_specific/jdk_jres/lin_amd64_jdk_jre/legal/jdk.xml.dom/LICENSE +347 -347
  295. quarchpy/connection_specific/jdk_jres/lin_amd64_jdk_jre/legal/jdk.zipfs/ADDITIONAL_LICENSE_INFO +37 -37
  296. quarchpy/connection_specific/jdk_jres/lin_amd64_jdk_jre/legal/jdk.zipfs/ASSEMBLY_EXCEPTION +27 -27
  297. quarchpy/connection_specific/jdk_jres/lin_amd64_jdk_jre/legal/jdk.zipfs/LICENSE +347 -347
  298. quarchpy/connection_specific/jdk_jres/lin_amd64_jdk_jre/lib/classlist +1588 -1587
  299. quarchpy/connection_specific/jdk_jres/lin_amd64_jdk_jre/lib/client/libjsig.so +0 -0
  300. quarchpy/connection_specific/jdk_jres/lin_amd64_jdk_jre/lib/client/libjvm.so +0 -0
  301. quarchpy/connection_specific/jdk_jres/lin_amd64_jdk_jre/lib/javafx-swt.jar +0 -0
  302. quarchpy/connection_specific/jdk_jres/lin_amd64_jdk_jre/lib/javafx.platform.properties +17 -0
  303. quarchpy/connection_specific/jdk_jres/lin_amd64_jdk_jre/lib/javafx.properties +3 -0
  304. quarchpy/connection_specific/jdk_jres/lin_amd64_jdk_jre/lib/jexec +0 -0
  305. quarchpy/connection_specific/jdk_jres/lin_amd64_jdk_jre/lib/jfr/default.jfc +1152 -1152
  306. quarchpy/connection_specific/jdk_jres/lin_amd64_jdk_jre/lib/jfr/profile.jfc +1151 -1151
  307. quarchpy/connection_specific/jdk_jres/lin_amd64_jdk_jre/lib/jrt-fs.jar +0 -0
  308. quarchpy/connection_specific/jdk_jres/lin_amd64_jdk_jre/lib/jspawnhelper +0 -0
  309. quarchpy/connection_specific/jdk_jres/lin_amd64_jdk_jre/lib/jvm.cfg +3 -2
  310. quarchpy/connection_specific/jdk_jres/lin_amd64_jdk_jre/lib/libawt.so +0 -0
  311. quarchpy/connection_specific/jdk_jres/lin_amd64_jdk_jre/lib/libawt_headless.so +0 -0
  312. quarchpy/connection_specific/jdk_jres/lin_amd64_jdk_jre/lib/libawt_xawt.so +0 -0
  313. quarchpy/connection_specific/jdk_jres/lin_amd64_jdk_jre/lib/libdecora_sse.so +0 -0
  314. quarchpy/connection_specific/jdk_jres/lin_amd64_jdk_jre/lib/libdt_socket.so +0 -0
  315. quarchpy/connection_specific/jdk_jres/lin_amd64_jdk_jre/lib/libextnet.so +0 -0
  316. quarchpy/connection_specific/jdk_jres/lin_amd64_jdk_jre/lib/libfontmanager.so +0 -0
  317. quarchpy/connection_specific/jdk_jres/lin_amd64_jdk_jre/lib/libfreetype.so +0 -0
  318. quarchpy/connection_specific/jdk_jres/lin_amd64_jdk_jre/lib/libglass.so +0 -0
  319. quarchpy/connection_specific/jdk_jres/lin_amd64_jdk_jre/lib/libglass_monocle.so +0 -0
  320. quarchpy/connection_specific/jdk_jres/lin_amd64_jdk_jre/lib/libglass_monocle_x11.so +0 -0
  321. quarchpy/connection_specific/jdk_jres/lin_amd64_jdk_jre/lib/libglassgtk3.so +0 -0
  322. quarchpy/connection_specific/jdk_jres/lin_amd64_jdk_jre/lib/libinstrument.so +0 -0
  323. quarchpy/connection_specific/jdk_jres/lin_amd64_jdk_jre/lib/libj2gss.so +0 -0
  324. quarchpy/connection_specific/jdk_jres/lin_amd64_jdk_jre/lib/libj2pcsc.so +0 -0
  325. quarchpy/connection_specific/jdk_jres/lin_amd64_jdk_jre/lib/libj2pkcs11.so +0 -0
  326. quarchpy/connection_specific/jdk_jres/lin_amd64_jdk_jre/lib/libjaas.so +0 -0
  327. quarchpy/connection_specific/jdk_jres/lin_amd64_jdk_jre/lib/libjava.so +0 -0
  328. quarchpy/connection_specific/jdk_jres/lin_amd64_jdk_jre/lib/libjavafx_font.so +0 -0
  329. quarchpy/connection_specific/jdk_jres/lin_amd64_jdk_jre/lib/libjavafx_font_freetype.so +0 -0
  330. quarchpy/connection_specific/jdk_jres/lin_amd64_jdk_jre/lib/libjavafx_font_pango.so +0 -0
  331. quarchpy/connection_specific/jdk_jres/lin_amd64_jdk_jre/lib/libjavafx_iio.so +0 -0
  332. quarchpy/connection_specific/jdk_jres/lin_amd64_jdk_jre/lib/libjavajpeg.so +0 -0
  333. quarchpy/connection_specific/jdk_jres/lin_amd64_jdk_jre/lib/libjawt.so +0 -0
  334. quarchpy/connection_specific/jdk_jres/lin_amd64_jdk_jre/lib/libjdwp.so +0 -0
  335. quarchpy/connection_specific/jdk_jres/lin_amd64_jdk_jre/lib/libjimage.so +0 -0
  336. quarchpy/connection_specific/jdk_jres/lin_amd64_jdk_jre/lib/libjli.so +0 -0
  337. quarchpy/connection_specific/jdk_jres/lin_amd64_jdk_jre/lib/libjsig.so +0 -0
  338. quarchpy/connection_specific/jdk_jres/lin_amd64_jdk_jre/lib/libjsound.so +0 -0
  339. quarchpy/connection_specific/jdk_jres/lin_amd64_jdk_jre/lib/libjsvml.so +0 -0
  340. quarchpy/connection_specific/jdk_jres/lin_amd64_jdk_jre/lib/liblcms.so +0 -0
  341. quarchpy/connection_specific/jdk_jres/lin_amd64_jdk_jre/lib/libmanagement.so +0 -0
  342. quarchpy/connection_specific/jdk_jres/lin_amd64_jdk_jre/lib/libmanagement_agent.so +0 -0
  343. quarchpy/connection_specific/jdk_jres/lin_amd64_jdk_jre/lib/libmanagement_ext.so +0 -0
  344. quarchpy/connection_specific/jdk_jres/lin_amd64_jdk_jre/lib/libmlib_image.so +0 -0
  345. quarchpy/connection_specific/jdk_jres/lin_amd64_jdk_jre/lib/libnet.so +0 -0
  346. quarchpy/connection_specific/jdk_jres/lin_amd64_jdk_jre/lib/libnio.so +0 -0
  347. quarchpy/connection_specific/jdk_jres/lin_amd64_jdk_jre/lib/libprefs.so +0 -0
  348. quarchpy/connection_specific/jdk_jres/lin_amd64_jdk_jre/lib/libprism_common.so +0 -0
  349. quarchpy/connection_specific/jdk_jres/lin_amd64_jdk_jre/lib/libprism_es2.so +0 -0
  350. quarchpy/connection_specific/jdk_jres/lin_amd64_jdk_jre/lib/libprism_es2_monocle.so +0 -0
  351. quarchpy/connection_specific/jdk_jres/lin_amd64_jdk_jre/lib/libprism_sw.so +0 -0
  352. quarchpy/connection_specific/jdk_jres/lin_amd64_jdk_jre/lib/librmi.so +0 -0
  353. quarchpy/connection_specific/jdk_jres/lin_amd64_jdk_jre/lib/libsctp.so +0 -0
  354. quarchpy/connection_specific/jdk_jres/lin_amd64_jdk_jre/lib/libsimdsort.so +0 -0
  355. quarchpy/connection_specific/jdk_jres/lin_amd64_jdk_jre/lib/libsplashscreen.so +0 -0
  356. quarchpy/connection_specific/jdk_jres/lin_amd64_jdk_jre/lib/libsyslookup.so +0 -0
  357. quarchpy/connection_specific/jdk_jres/lin_amd64_jdk_jre/lib/libverify.so +0 -0
  358. quarchpy/connection_specific/jdk_jres/lin_amd64_jdk_jre/lib/libzip.so +0 -0
  359. quarchpy/connection_specific/jdk_jres/lin_amd64_jdk_jre/lib/minimal/libjsig.so +0 -0
  360. quarchpy/connection_specific/jdk_jres/lin_amd64_jdk_jre/lib/minimal/libjvm.so +0 -0
  361. quarchpy/connection_specific/jdk_jres/lin_amd64_jdk_jre/lib/modules +0 -0
  362. quarchpy/connection_specific/jdk_jres/lin_amd64_jdk_jre/lib/psfont.properties.ja +119 -119
  363. quarchpy/connection_specific/jdk_jres/lin_amd64_jdk_jre/lib/psfontj2d.properties +323 -323
  364. quarchpy/connection_specific/jdk_jres/lin_amd64_jdk_jre/lib/security/blocked.certs +39 -39
  365. quarchpy/connection_specific/jdk_jres/lin_amd64_jdk_jre/lib/security/cacerts +0 -0
  366. quarchpy/connection_specific/jdk_jres/lin_amd64_jdk_jre/lib/server/libjsig.so +0 -0
  367. quarchpy/connection_specific/jdk_jres/lin_amd64_jdk_jre/lib/server/libjvm.so +0 -0
  368. quarchpy/connection_specific/jdk_jres/lin_amd64_jdk_jre/release +2 -2
  369. quarchpy/connection_specific/jdk_jres/mac_amd64_jdk_jre/bin/java +0 -0
  370. quarchpy/connection_specific/jdk_jres/mac_amd64_jdk_jre/bin/jfr +0 -0
  371. quarchpy/connection_specific/jdk_jres/mac_amd64_jdk_jre/bin/jrunscript +0 -0
  372. quarchpy/connection_specific/jdk_jres/mac_amd64_jdk_jre/bin/jwebserver +0 -0
  373. quarchpy/connection_specific/jdk_jres/mac_amd64_jdk_jre/bin/keytool +0 -0
  374. quarchpy/connection_specific/jdk_jres/mac_amd64_jdk_jre/bin/rmiregistry +0 -0
  375. quarchpy/connection_specific/jdk_jres/mac_amd64_jdk_jre/conf/jaxp-strict.properties.template +123 -123
  376. quarchpy/connection_specific/jdk_jres/mac_amd64_jdk_jre/conf/jaxp.properties +200 -200
  377. quarchpy/connection_specific/jdk_jres/mac_amd64_jdk_jre/conf/logging.properties +63 -63
  378. quarchpy/connection_specific/jdk_jres/mac_amd64_jdk_jre/conf/management/jmxremote.access +79 -79
  379. quarchpy/connection_specific/jdk_jres/mac_amd64_jdk_jre/conf/management/jmxremote.password.template +114 -114
  380. quarchpy/connection_specific/jdk_jres/mac_amd64_jdk_jre/conf/management/management.properties +326 -326
  381. quarchpy/connection_specific/jdk_jres/mac_amd64_jdk_jre/conf/net.properties +162 -162
  382. quarchpy/connection_specific/jdk_jres/mac_amd64_jdk_jre/conf/security/java.security +1518 -1518
  383. quarchpy/connection_specific/jdk_jres/mac_amd64_jdk_jre/conf/security/policy/README.txt +54 -54
  384. quarchpy/connection_specific/jdk_jres/mac_amd64_jdk_jre/conf/security/policy/limited/default_US_export.policy +6 -6
  385. quarchpy/connection_specific/jdk_jres/mac_amd64_jdk_jre/conf/security/policy/limited/default_local.policy +14 -14
  386. quarchpy/connection_specific/jdk_jres/mac_amd64_jdk_jre/conf/security/policy/limited/exempt_local.policy +13 -13
  387. quarchpy/connection_specific/jdk_jres/mac_amd64_jdk_jre/conf/security/policy/unlimited/default_US_export.policy +6 -6
  388. quarchpy/connection_specific/jdk_jres/mac_amd64_jdk_jre/conf/security/policy/unlimited/default_local.policy +6 -6
  389. quarchpy/connection_specific/jdk_jres/mac_amd64_jdk_jre/conf/sound.properties +39 -39
  390. quarchpy/connection_specific/jdk_jres/mac_amd64_jdk_jre/legal/java.base/ADDITIONAL_LICENSE_INFO +37 -37
  391. quarchpy/connection_specific/jdk_jres/mac_amd64_jdk_jre/legal/java.base/ASSEMBLY_EXCEPTION +27 -27
  392. quarchpy/connection_specific/jdk_jres/mac_amd64_jdk_jre/legal/java.base/LICENSE +347 -347
  393. quarchpy/connection_specific/jdk_jres/mac_amd64_jdk_jre/legal/java.base/aes.md +36 -36
  394. quarchpy/connection_specific/jdk_jres/mac_amd64_jdk_jre/legal/java.base/asm.md +36 -36
  395. quarchpy/connection_specific/jdk_jres/mac_amd64_jdk_jre/legal/java.base/c-libutl.md +35 -35
  396. quarchpy/connection_specific/jdk_jres/mac_amd64_jdk_jre/legal/java.base/cldr.md +100 -100
  397. quarchpy/connection_specific/jdk_jres/mac_amd64_jdk_jre/legal/java.base/icu.md +93 -93
  398. quarchpy/connection_specific/jdk_jres/mac_amd64_jdk_jre/legal/java.base/public_suffix.md +399 -399
  399. quarchpy/connection_specific/jdk_jres/mac_amd64_jdk_jre/legal/java.base/siphash.md +150 -150
  400. quarchpy/connection_specific/jdk_jres/mac_amd64_jdk_jre/legal/java.base/unicode.md +269 -269
  401. quarchpy/connection_specific/jdk_jres/mac_amd64_jdk_jre/legal/java.compiler/ADDITIONAL_LICENSE_INFO +37 -37
  402. quarchpy/connection_specific/jdk_jres/mac_amd64_jdk_jre/legal/java.compiler/ASSEMBLY_EXCEPTION +27 -27
  403. quarchpy/connection_specific/jdk_jres/mac_amd64_jdk_jre/legal/java.compiler/LICENSE +347 -347
  404. quarchpy/connection_specific/jdk_jres/mac_amd64_jdk_jre/legal/java.datatransfer/ADDITIONAL_LICENSE_INFO +37 -37
  405. quarchpy/connection_specific/jdk_jres/mac_amd64_jdk_jre/legal/java.datatransfer/ASSEMBLY_EXCEPTION +27 -27
  406. quarchpy/connection_specific/jdk_jres/mac_amd64_jdk_jre/legal/java.datatransfer/LICENSE +347 -347
  407. quarchpy/connection_specific/jdk_jres/mac_amd64_jdk_jre/legal/java.desktop/ADDITIONAL_LICENSE_INFO +37 -37
  408. quarchpy/connection_specific/jdk_jres/mac_amd64_jdk_jre/legal/java.desktop/ASSEMBLY_EXCEPTION +27 -27
  409. quarchpy/connection_specific/jdk_jres/mac_amd64_jdk_jre/legal/java.desktop/LICENSE +347 -347
  410. quarchpy/connection_specific/jdk_jres/mac_amd64_jdk_jre/legal/java.desktop/colorimaging.md +7 -7
  411. quarchpy/connection_specific/jdk_jres/mac_amd64_jdk_jre/legal/java.desktop/freetype.md +649 -649
  412. quarchpy/connection_specific/jdk_jres/mac_amd64_jdk_jre/legal/java.desktop/giflib.md +46 -46
  413. quarchpy/connection_specific/jdk_jres/mac_amd64_jdk_jre/legal/java.desktop/harfbuzz.md +104 -103
  414. quarchpy/connection_specific/jdk_jres/mac_amd64_jdk_jre/legal/java.desktop/jpeg.md +77 -77
  415. quarchpy/connection_specific/jdk_jres/mac_amd64_jdk_jre/legal/java.desktop/lcms.md +103 -103
  416. quarchpy/connection_specific/jdk_jres/mac_amd64_jdk_jre/legal/java.desktop/libpng.md +216 -215
  417. quarchpy/connection_specific/jdk_jres/mac_amd64_jdk_jre/legal/java.desktop/mesa3d.md +134 -134
  418. quarchpy/connection_specific/jdk_jres/mac_amd64_jdk_jre/legal/java.desktop/pipewire.md +46 -41
  419. quarchpy/connection_specific/jdk_jres/mac_amd64_jdk_jre/legal/java.desktop/xwd.md +34 -34
  420. quarchpy/connection_specific/jdk_jres/mac_amd64_jdk_jre/legal/java.instrument/ADDITIONAL_LICENSE_INFO +37 -37
  421. quarchpy/connection_specific/jdk_jres/mac_amd64_jdk_jre/legal/java.instrument/ASSEMBLY_EXCEPTION +27 -27
  422. quarchpy/connection_specific/jdk_jres/mac_amd64_jdk_jre/legal/java.instrument/LICENSE +347 -347
  423. quarchpy/connection_specific/jdk_jres/mac_amd64_jdk_jre/legal/java.logging/ADDITIONAL_LICENSE_INFO +37 -37
  424. quarchpy/connection_specific/jdk_jres/mac_amd64_jdk_jre/legal/java.logging/ASSEMBLY_EXCEPTION +27 -27
  425. quarchpy/connection_specific/jdk_jres/mac_amd64_jdk_jre/legal/java.logging/LICENSE +347 -347
  426. quarchpy/connection_specific/jdk_jres/mac_amd64_jdk_jre/legal/java.management/ADDITIONAL_LICENSE_INFO +37 -37
  427. quarchpy/connection_specific/jdk_jres/mac_amd64_jdk_jre/legal/java.management/ASSEMBLY_EXCEPTION +27 -27
  428. quarchpy/connection_specific/jdk_jres/mac_amd64_jdk_jre/legal/java.management/LICENSE +347 -347
  429. quarchpy/connection_specific/jdk_jres/mac_amd64_jdk_jre/legal/java.management.rmi/ADDITIONAL_LICENSE_INFO +37 -37
  430. quarchpy/connection_specific/jdk_jres/mac_amd64_jdk_jre/legal/java.management.rmi/ASSEMBLY_EXCEPTION +27 -27
  431. quarchpy/connection_specific/jdk_jres/mac_amd64_jdk_jre/legal/java.management.rmi/LICENSE +347 -347
  432. quarchpy/connection_specific/jdk_jres/mac_amd64_jdk_jre/legal/java.naming/ADDITIONAL_LICENSE_INFO +37 -37
  433. quarchpy/connection_specific/jdk_jres/mac_amd64_jdk_jre/legal/java.naming/ASSEMBLY_EXCEPTION +27 -27
  434. quarchpy/connection_specific/jdk_jres/mac_amd64_jdk_jre/legal/java.naming/LICENSE +347 -347
  435. quarchpy/connection_specific/jdk_jres/mac_amd64_jdk_jre/legal/java.net.http/ADDITIONAL_LICENSE_INFO +37 -37
  436. quarchpy/connection_specific/jdk_jres/mac_amd64_jdk_jre/legal/java.net.http/ASSEMBLY_EXCEPTION +27 -27
  437. quarchpy/connection_specific/jdk_jres/mac_amd64_jdk_jre/legal/java.net.http/LICENSE +347 -347
  438. quarchpy/connection_specific/jdk_jres/mac_amd64_jdk_jre/legal/java.prefs/ADDITIONAL_LICENSE_INFO +37 -37
  439. quarchpy/connection_specific/jdk_jres/mac_amd64_jdk_jre/legal/java.prefs/ASSEMBLY_EXCEPTION +27 -27
  440. quarchpy/connection_specific/jdk_jres/mac_amd64_jdk_jre/legal/java.prefs/LICENSE +347 -347
  441. quarchpy/connection_specific/jdk_jres/mac_amd64_jdk_jre/legal/java.rmi/ADDITIONAL_LICENSE_INFO +37 -37
  442. quarchpy/connection_specific/jdk_jres/mac_amd64_jdk_jre/legal/java.rmi/ASSEMBLY_EXCEPTION +27 -27
  443. quarchpy/connection_specific/jdk_jres/mac_amd64_jdk_jre/legal/java.rmi/LICENSE +347 -347
  444. quarchpy/connection_specific/jdk_jres/mac_amd64_jdk_jre/legal/java.scripting/ADDITIONAL_LICENSE_INFO +37 -37
  445. quarchpy/connection_specific/jdk_jres/mac_amd64_jdk_jre/legal/java.scripting/ASSEMBLY_EXCEPTION +27 -27
  446. quarchpy/connection_specific/jdk_jres/mac_amd64_jdk_jre/legal/java.scripting/LICENSE +347 -347
  447. quarchpy/connection_specific/jdk_jres/mac_amd64_jdk_jre/legal/java.se/ADDITIONAL_LICENSE_INFO +37 -37
  448. quarchpy/connection_specific/jdk_jres/mac_amd64_jdk_jre/legal/java.se/ASSEMBLY_EXCEPTION +27 -27
  449. quarchpy/connection_specific/jdk_jres/mac_amd64_jdk_jre/legal/java.se/LICENSE +347 -347
  450. quarchpy/connection_specific/jdk_jres/mac_amd64_jdk_jre/legal/java.security.jgss/ADDITIONAL_LICENSE_INFO +37 -37
  451. quarchpy/connection_specific/jdk_jres/mac_amd64_jdk_jre/legal/java.security.jgss/ASSEMBLY_EXCEPTION +27 -27
  452. quarchpy/connection_specific/jdk_jres/mac_amd64_jdk_jre/legal/java.security.jgss/LICENSE +347 -347
  453. quarchpy/connection_specific/jdk_jres/mac_amd64_jdk_jre/legal/java.security.sasl/ADDITIONAL_LICENSE_INFO +37 -37
  454. quarchpy/connection_specific/jdk_jres/mac_amd64_jdk_jre/legal/java.security.sasl/ASSEMBLY_EXCEPTION +27 -27
  455. quarchpy/connection_specific/jdk_jres/mac_amd64_jdk_jre/legal/java.security.sasl/LICENSE +347 -347
  456. quarchpy/connection_specific/jdk_jres/mac_amd64_jdk_jre/legal/java.smartcardio/ADDITIONAL_LICENSE_INFO +37 -37
  457. quarchpy/connection_specific/jdk_jres/mac_amd64_jdk_jre/legal/java.smartcardio/ASSEMBLY_EXCEPTION +27 -27
  458. quarchpy/connection_specific/jdk_jres/mac_amd64_jdk_jre/legal/java.smartcardio/LICENSE +347 -347
  459. quarchpy/connection_specific/jdk_jres/mac_amd64_jdk_jre/legal/java.smartcardio/pcsclite.md +57 -57
  460. quarchpy/connection_specific/jdk_jres/mac_amd64_jdk_jre/legal/java.sql/ADDITIONAL_LICENSE_INFO +37 -37
  461. quarchpy/connection_specific/jdk_jres/mac_amd64_jdk_jre/legal/java.sql/ASSEMBLY_EXCEPTION +27 -27
  462. quarchpy/connection_specific/jdk_jres/mac_amd64_jdk_jre/legal/java.sql/LICENSE +347 -347
  463. quarchpy/connection_specific/jdk_jres/mac_amd64_jdk_jre/legal/java.sql.rowset/ADDITIONAL_LICENSE_INFO +37 -37
  464. quarchpy/connection_specific/jdk_jres/mac_amd64_jdk_jre/legal/java.sql.rowset/ASSEMBLY_EXCEPTION +27 -27
  465. quarchpy/connection_specific/jdk_jres/mac_amd64_jdk_jre/legal/java.sql.rowset/LICENSE +347 -347
  466. quarchpy/connection_specific/jdk_jres/mac_amd64_jdk_jre/legal/java.transaction.xa/ADDITIONAL_LICENSE_INFO +37 -37
  467. quarchpy/connection_specific/jdk_jres/mac_amd64_jdk_jre/legal/java.transaction.xa/ASSEMBLY_EXCEPTION +27 -27
  468. quarchpy/connection_specific/jdk_jres/mac_amd64_jdk_jre/legal/java.transaction.xa/LICENSE +347 -347
  469. quarchpy/connection_specific/jdk_jres/mac_amd64_jdk_jre/legal/java.xml/ADDITIONAL_LICENSE_INFO +37 -37
  470. quarchpy/connection_specific/jdk_jres/mac_amd64_jdk_jre/legal/java.xml/ASSEMBLY_EXCEPTION +27 -27
  471. quarchpy/connection_specific/jdk_jres/mac_amd64_jdk_jre/legal/java.xml/LICENSE +347 -347
  472. quarchpy/connection_specific/jdk_jres/mac_amd64_jdk_jre/legal/java.xml/bcel.md +219 -219
  473. quarchpy/connection_specific/jdk_jres/mac_amd64_jdk_jre/legal/java.xml/dom.md +77 -77
  474. quarchpy/connection_specific/jdk_jres/mac_amd64_jdk_jre/legal/java.xml/jcup.md +31 -31
  475. quarchpy/connection_specific/jdk_jres/mac_amd64_jdk_jre/legal/java.xml/schema10part1.md +51 -51
  476. quarchpy/connection_specific/jdk_jres/mac_amd64_jdk_jre/legal/java.xml/schema10part2.md +50 -50
  477. quarchpy/connection_specific/jdk_jres/mac_amd64_jdk_jre/legal/java.xml/xalan.md +255 -255
  478. quarchpy/connection_specific/jdk_jres/mac_amd64_jdk_jre/legal/java.xml/xerces.md +229 -229
  479. quarchpy/connection_specific/jdk_jres/mac_amd64_jdk_jre/legal/java.xml/xhtml10.md +57 -57
  480. quarchpy/connection_specific/jdk_jres/mac_amd64_jdk_jre/legal/java.xml/xhtml10schema.md +150 -150
  481. quarchpy/connection_specific/jdk_jres/mac_amd64_jdk_jre/legal/java.xml/xhtml11.md +68 -68
  482. quarchpy/connection_specific/jdk_jres/mac_amd64_jdk_jre/legal/java.xml/xhtml11schema.md +60 -60
  483. quarchpy/connection_specific/jdk_jres/mac_amd64_jdk_jre/legal/java.xml/xmlspec.md +63 -63
  484. quarchpy/connection_specific/jdk_jres/mac_amd64_jdk_jre/legal/java.xml/xmlxsd.md +43 -43
  485. quarchpy/connection_specific/jdk_jres/mac_amd64_jdk_jre/legal/java.xml.crypto/ADDITIONAL_LICENSE_INFO +37 -37
  486. quarchpy/connection_specific/jdk_jres/mac_amd64_jdk_jre/legal/java.xml.crypto/ASSEMBLY_EXCEPTION +27 -27
  487. quarchpy/connection_specific/jdk_jres/mac_amd64_jdk_jre/legal/java.xml.crypto/LICENSE +347 -347
  488. quarchpy/connection_specific/jdk_jres/mac_amd64_jdk_jre/legal/java.xml.crypto/santuario.md +227 -227
  489. quarchpy/connection_specific/jdk_jres/mac_amd64_jdk_jre/legal/javafx.base/ADDITIONAL_LICENSE_INFO +37 -0
  490. quarchpy/connection_specific/jdk_jres/mac_amd64_jdk_jre/legal/javafx.base/ASSEMBLY_EXCEPTION +27 -0
  491. quarchpy/connection_specific/jdk_jres/mac_amd64_jdk_jre/legal/javafx.base/LICENSE +347 -0
  492. quarchpy/connection_specific/jdk_jres/mac_amd64_jdk_jre/legal/javafx.controls/ADDITIONAL_LICENSE_INFO +37 -0
  493. quarchpy/connection_specific/jdk_jres/mac_amd64_jdk_jre/legal/javafx.controls/ASSEMBLY_EXCEPTION +27 -0
  494. quarchpy/connection_specific/jdk_jres/mac_amd64_jdk_jre/legal/javafx.controls/LICENSE +347 -0
  495. quarchpy/connection_specific/jdk_jres/mac_amd64_jdk_jre/legal/javafx.fxml/ADDITIONAL_LICENSE_INFO +37 -0
  496. quarchpy/connection_specific/jdk_jres/mac_amd64_jdk_jre/legal/javafx.fxml/ASSEMBLY_EXCEPTION +27 -0
  497. quarchpy/connection_specific/jdk_jres/mac_amd64_jdk_jre/legal/javafx.fxml/LICENSE +347 -0
  498. quarchpy/connection_specific/jdk_jres/mac_amd64_jdk_jre/legal/javafx.graphics/ADDITIONAL_LICENSE_INFO +37 -0
  499. quarchpy/connection_specific/jdk_jres/mac_amd64_jdk_jre/legal/javafx.graphics/ASSEMBLY_EXCEPTION +27 -0
  500. quarchpy/connection_specific/jdk_jres/mac_amd64_jdk_jre/legal/javafx.graphics/LICENSE +347 -0
  501. quarchpy/connection_specific/jdk_jres/mac_amd64_jdk_jre/legal/javafx.graphics/jpeg_fx.md +43 -0
  502. quarchpy/connection_specific/jdk_jres/mac_amd64_jdk_jre/legal/javafx.graphics/mesa3d.md +134 -0
  503. quarchpy/connection_specific/jdk_jres/mac_amd64_jdk_jre/legal/javafx.graphics/pipewire.md +46 -0
  504. quarchpy/connection_specific/jdk_jres/mac_amd64_jdk_jre/legal/javafx.swing/ADDITIONAL_LICENSE_INFO +37 -0
  505. quarchpy/connection_specific/jdk_jres/mac_amd64_jdk_jre/legal/javafx.swing/ASSEMBLY_EXCEPTION +27 -0
  506. quarchpy/connection_specific/jdk_jres/mac_amd64_jdk_jre/legal/javafx.swing/LICENSE +347 -0
  507. quarchpy/connection_specific/jdk_jres/mac_amd64_jdk_jre/legal/jdk.accessibility/ADDITIONAL_LICENSE_INFO +37 -37
  508. quarchpy/connection_specific/jdk_jres/mac_amd64_jdk_jre/legal/jdk.accessibility/ASSEMBLY_EXCEPTION +27 -27
  509. quarchpy/connection_specific/jdk_jres/mac_amd64_jdk_jre/legal/jdk.accessibility/LICENSE +347 -347
  510. quarchpy/connection_specific/jdk_jres/mac_amd64_jdk_jre/legal/jdk.charsets/ADDITIONAL_LICENSE_INFO +37 -37
  511. quarchpy/connection_specific/jdk_jres/mac_amd64_jdk_jre/legal/jdk.charsets/ASSEMBLY_EXCEPTION +27 -27
  512. quarchpy/connection_specific/jdk_jres/mac_amd64_jdk_jre/legal/jdk.charsets/LICENSE +347 -347
  513. quarchpy/connection_specific/jdk_jres/mac_amd64_jdk_jre/legal/jdk.crypto.cryptoki/ADDITIONAL_LICENSE_INFO +37 -37
  514. quarchpy/connection_specific/jdk_jres/mac_amd64_jdk_jre/legal/jdk.crypto.cryptoki/ASSEMBLY_EXCEPTION +27 -27
  515. quarchpy/connection_specific/jdk_jres/mac_amd64_jdk_jre/legal/jdk.crypto.cryptoki/LICENSE +347 -347
  516. quarchpy/connection_specific/jdk_jres/mac_amd64_jdk_jre/legal/jdk.crypto.cryptoki/pkcs11cryptotoken.md +76 -76
  517. quarchpy/connection_specific/jdk_jres/mac_amd64_jdk_jre/legal/jdk.crypto.cryptoki/pkcs11wrapper.md +46 -46
  518. quarchpy/connection_specific/jdk_jres/mac_amd64_jdk_jre/legal/jdk.crypto.ec/ADDITIONAL_LICENSE_INFO +37 -37
  519. quarchpy/connection_specific/jdk_jres/mac_amd64_jdk_jre/legal/jdk.crypto.ec/ASSEMBLY_EXCEPTION +27 -27
  520. quarchpy/connection_specific/jdk_jres/mac_amd64_jdk_jre/legal/jdk.crypto.ec/LICENSE +347 -347
  521. quarchpy/connection_specific/jdk_jres/mac_amd64_jdk_jre/legal/jdk.dynalink/ADDITIONAL_LICENSE_INFO +37 -37
  522. quarchpy/connection_specific/jdk_jres/mac_amd64_jdk_jre/legal/jdk.dynalink/ASSEMBLY_EXCEPTION +27 -27
  523. quarchpy/connection_specific/jdk_jres/mac_amd64_jdk_jre/legal/jdk.dynalink/LICENSE +347 -347
  524. quarchpy/connection_specific/jdk_jres/mac_amd64_jdk_jre/legal/jdk.dynalink/dynalink.md +32 -32
  525. quarchpy/connection_specific/jdk_jres/mac_amd64_jdk_jre/legal/jdk.httpserver/ADDITIONAL_LICENSE_INFO +37 -37
  526. quarchpy/connection_specific/jdk_jres/mac_amd64_jdk_jre/legal/jdk.httpserver/ASSEMBLY_EXCEPTION +27 -27
  527. quarchpy/connection_specific/jdk_jres/mac_amd64_jdk_jre/legal/jdk.httpserver/LICENSE +347 -347
  528. quarchpy/connection_specific/jdk_jres/mac_amd64_jdk_jre/legal/jdk.incubator.vector/ADDITIONAL_LICENSE_INFO +37 -37
  529. quarchpy/connection_specific/jdk_jres/mac_amd64_jdk_jre/legal/jdk.incubator.vector/ASSEMBLY_EXCEPTION +27 -27
  530. quarchpy/connection_specific/jdk_jres/mac_amd64_jdk_jre/legal/jdk.incubator.vector/LICENSE +347 -347
  531. quarchpy/connection_specific/jdk_jres/mac_amd64_jdk_jre/legal/jdk.internal.vm.ci/ADDITIONAL_LICENSE_INFO +37 -37
  532. quarchpy/connection_specific/jdk_jres/mac_amd64_jdk_jre/legal/jdk.internal.vm.ci/ASSEMBLY_EXCEPTION +27 -27
  533. quarchpy/connection_specific/jdk_jres/mac_amd64_jdk_jre/legal/jdk.internal.vm.ci/LICENSE +347 -347
  534. quarchpy/connection_specific/jdk_jres/mac_amd64_jdk_jre/legal/jdk.jdwp.agent/ADDITIONAL_LICENSE_INFO +37 -37
  535. quarchpy/connection_specific/jdk_jres/mac_amd64_jdk_jre/legal/jdk.jdwp.agent/ASSEMBLY_EXCEPTION +27 -27
  536. quarchpy/connection_specific/jdk_jres/mac_amd64_jdk_jre/legal/jdk.jdwp.agent/LICENSE +347 -347
  537. quarchpy/connection_specific/jdk_jres/mac_amd64_jdk_jre/legal/jdk.jfr/ADDITIONAL_LICENSE_INFO +37 -37
  538. quarchpy/connection_specific/jdk_jres/mac_amd64_jdk_jre/legal/jdk.jfr/ASSEMBLY_EXCEPTION +27 -27
  539. quarchpy/connection_specific/jdk_jres/mac_amd64_jdk_jre/legal/jdk.jfr/LICENSE +347 -347
  540. quarchpy/connection_specific/jdk_jres/mac_amd64_jdk_jre/legal/jdk.jsobject/ADDITIONAL_LICENSE_INFO +37 -37
  541. quarchpy/connection_specific/jdk_jres/mac_amd64_jdk_jre/legal/jdk.jsobject/ASSEMBLY_EXCEPTION +27 -27
  542. quarchpy/connection_specific/jdk_jres/mac_amd64_jdk_jre/legal/jdk.jsobject/LICENSE +347 -347
  543. quarchpy/connection_specific/jdk_jres/mac_amd64_jdk_jre/legal/jdk.localedata/ADDITIONAL_LICENSE_INFO +37 -37
  544. quarchpy/connection_specific/jdk_jres/mac_amd64_jdk_jre/legal/jdk.localedata/ASSEMBLY_EXCEPTION +27 -27
  545. quarchpy/connection_specific/jdk_jres/mac_amd64_jdk_jre/legal/jdk.localedata/LICENSE +347 -347
  546. quarchpy/connection_specific/jdk_jres/mac_amd64_jdk_jre/legal/jdk.localedata/cldr.md +100 -100
  547. quarchpy/connection_specific/jdk_jres/mac_amd64_jdk_jre/legal/jdk.localedata/thaidict.md +31 -31
  548. quarchpy/connection_specific/jdk_jres/mac_amd64_jdk_jre/legal/jdk.management/ADDITIONAL_LICENSE_INFO +37 -37
  549. quarchpy/connection_specific/jdk_jres/mac_amd64_jdk_jre/legal/jdk.management/ASSEMBLY_EXCEPTION +27 -27
  550. quarchpy/connection_specific/jdk_jres/mac_amd64_jdk_jre/legal/jdk.management/LICENSE +347 -347
  551. quarchpy/connection_specific/jdk_jres/mac_amd64_jdk_jre/legal/jdk.management.agent/ADDITIONAL_LICENSE_INFO +37 -37
  552. quarchpy/connection_specific/jdk_jres/mac_amd64_jdk_jre/legal/jdk.management.agent/ASSEMBLY_EXCEPTION +27 -27
  553. quarchpy/connection_specific/jdk_jres/mac_amd64_jdk_jre/legal/jdk.management.agent/LICENSE +347 -347
  554. quarchpy/connection_specific/jdk_jres/mac_amd64_jdk_jre/legal/jdk.management.jfr/ADDITIONAL_LICENSE_INFO +37 -37
  555. quarchpy/connection_specific/jdk_jres/mac_amd64_jdk_jre/legal/jdk.management.jfr/ASSEMBLY_EXCEPTION +27 -27
  556. quarchpy/connection_specific/jdk_jres/mac_amd64_jdk_jre/legal/jdk.management.jfr/LICENSE +347 -347
  557. quarchpy/connection_specific/jdk_jres/mac_amd64_jdk_jre/legal/jdk.naming.dns/ADDITIONAL_LICENSE_INFO +37 -37
  558. quarchpy/connection_specific/jdk_jres/mac_amd64_jdk_jre/legal/jdk.naming.dns/ASSEMBLY_EXCEPTION +27 -27
  559. quarchpy/connection_specific/jdk_jres/mac_amd64_jdk_jre/legal/jdk.naming.dns/LICENSE +347 -347
  560. quarchpy/connection_specific/jdk_jres/mac_amd64_jdk_jre/legal/jdk.naming.rmi/ADDITIONAL_LICENSE_INFO +37 -37
  561. quarchpy/connection_specific/jdk_jres/mac_amd64_jdk_jre/legal/jdk.naming.rmi/ASSEMBLY_EXCEPTION +27 -27
  562. quarchpy/connection_specific/jdk_jres/mac_amd64_jdk_jre/legal/jdk.naming.rmi/LICENSE +347 -347
  563. quarchpy/connection_specific/jdk_jres/mac_amd64_jdk_jre/legal/jdk.net/ADDITIONAL_LICENSE_INFO +37 -37
  564. quarchpy/connection_specific/jdk_jres/mac_amd64_jdk_jre/legal/jdk.net/ASSEMBLY_EXCEPTION +27 -27
  565. quarchpy/connection_specific/jdk_jres/mac_amd64_jdk_jre/legal/jdk.net/LICENSE +347 -347
  566. quarchpy/connection_specific/jdk_jres/mac_amd64_jdk_jre/legal/jdk.nio.mapmode/ADDITIONAL_LICENSE_INFO +37 -37
  567. quarchpy/connection_specific/jdk_jres/mac_amd64_jdk_jre/legal/jdk.nio.mapmode/ASSEMBLY_EXCEPTION +27 -27
  568. quarchpy/connection_specific/jdk_jres/mac_amd64_jdk_jre/legal/jdk.nio.mapmode/LICENSE +347 -347
  569. quarchpy/connection_specific/jdk_jres/mac_amd64_jdk_jre/legal/jdk.sctp/ADDITIONAL_LICENSE_INFO +37 -37
  570. quarchpy/connection_specific/jdk_jres/mac_amd64_jdk_jre/legal/jdk.sctp/ASSEMBLY_EXCEPTION +27 -27
  571. quarchpy/connection_specific/jdk_jres/mac_amd64_jdk_jre/legal/jdk.sctp/LICENSE +347 -347
  572. quarchpy/connection_specific/jdk_jres/mac_amd64_jdk_jre/legal/jdk.security.auth/ADDITIONAL_LICENSE_INFO +37 -37
  573. quarchpy/connection_specific/jdk_jres/mac_amd64_jdk_jre/legal/jdk.security.auth/ASSEMBLY_EXCEPTION +27 -27
  574. quarchpy/connection_specific/jdk_jres/mac_amd64_jdk_jre/legal/jdk.security.auth/LICENSE +347 -347
  575. quarchpy/connection_specific/jdk_jres/mac_amd64_jdk_jre/legal/jdk.security.jgss/ADDITIONAL_LICENSE_INFO +37 -37
  576. quarchpy/connection_specific/jdk_jres/mac_amd64_jdk_jre/legal/jdk.security.jgss/ASSEMBLY_EXCEPTION +27 -27
  577. quarchpy/connection_specific/jdk_jres/mac_amd64_jdk_jre/legal/jdk.security.jgss/LICENSE +347 -347
  578. quarchpy/connection_specific/jdk_jres/mac_amd64_jdk_jre/legal/jdk.unsupported/ADDITIONAL_LICENSE_INFO +37 -37
  579. quarchpy/connection_specific/jdk_jres/mac_amd64_jdk_jre/legal/jdk.unsupported/ASSEMBLY_EXCEPTION +27 -27
  580. quarchpy/connection_specific/jdk_jres/mac_amd64_jdk_jre/legal/jdk.unsupported/LICENSE +347 -347
  581. quarchpy/connection_specific/jdk_jres/mac_amd64_jdk_jre/legal/jdk.unsupported.desktop/ADDITIONAL_LICENSE_INFO +37 -37
  582. quarchpy/connection_specific/jdk_jres/mac_amd64_jdk_jre/legal/jdk.unsupported.desktop/ASSEMBLY_EXCEPTION +27 -27
  583. quarchpy/connection_specific/jdk_jres/mac_amd64_jdk_jre/legal/jdk.unsupported.desktop/LICENSE +347 -347
  584. quarchpy/connection_specific/jdk_jres/mac_amd64_jdk_jre/legal/jdk.xml.dom/ADDITIONAL_LICENSE_INFO +37 -37
  585. quarchpy/connection_specific/jdk_jres/mac_amd64_jdk_jre/legal/jdk.xml.dom/ASSEMBLY_EXCEPTION +27 -27
  586. quarchpy/connection_specific/jdk_jres/mac_amd64_jdk_jre/legal/jdk.xml.dom/LICENSE +347 -347
  587. quarchpy/connection_specific/jdk_jres/mac_amd64_jdk_jre/legal/jdk.zipfs/ADDITIONAL_LICENSE_INFO +37 -37
  588. quarchpy/connection_specific/jdk_jres/mac_amd64_jdk_jre/legal/jdk.zipfs/ASSEMBLY_EXCEPTION +27 -27
  589. quarchpy/connection_specific/jdk_jres/mac_amd64_jdk_jre/legal/jdk.zipfs/LICENSE +347 -347
  590. quarchpy/connection_specific/jdk_jres/mac_amd64_jdk_jre/lib/classlist +1589 -1589
  591. quarchpy/connection_specific/jdk_jres/mac_amd64_jdk_jre/lib/client/libjsig.dylib +0 -0
  592. quarchpy/connection_specific/jdk_jres/mac_amd64_jdk_jre/lib/client/libjvm.dylib +0 -0
  593. quarchpy/connection_specific/jdk_jres/mac_amd64_jdk_jre/lib/fontconfig.properties.src +258 -258
  594. quarchpy/connection_specific/jdk_jres/mac_amd64_jdk_jre/lib/javafx-swt.jar +0 -0
  595. quarchpy/connection_specific/jdk_jres/mac_amd64_jdk_jre/lib/javafx.properties +3 -0
  596. quarchpy/connection_specific/jdk_jres/mac_amd64_jdk_jre/lib/jfr/default.jfc +1152 -1152
  597. quarchpy/connection_specific/jdk_jres/mac_amd64_jdk_jre/lib/jfr/profile.jfc +1151 -1151
  598. quarchpy/connection_specific/jdk_jres/mac_amd64_jdk_jre/lib/jrt-fs.jar +0 -0
  599. quarchpy/connection_specific/jdk_jres/mac_amd64_jdk_jre/lib/jspawnhelper +0 -0
  600. quarchpy/connection_specific/jdk_jres/mac_amd64_jdk_jre/lib/jvm.cfg +2 -2
  601. quarchpy/connection_specific/jdk_jres/mac_amd64_jdk_jre/lib/libawt.dylib +0 -0
  602. quarchpy/connection_specific/jdk_jres/mac_amd64_jdk_jre/lib/libawt_lwawt.dylib +0 -0
  603. quarchpy/connection_specific/jdk_jres/mac_amd64_jdk_jre/lib/libdecora_sse.dylib +0 -0
  604. quarchpy/connection_specific/jdk_jres/mac_amd64_jdk_jre/lib/libdt_socket.dylib +0 -0
  605. quarchpy/connection_specific/jdk_jres/mac_amd64_jdk_jre/lib/libextnet.dylib +0 -0
  606. quarchpy/connection_specific/jdk_jres/mac_amd64_jdk_jre/lib/libfontmanager.dylib +0 -0
  607. quarchpy/connection_specific/jdk_jres/mac_amd64_jdk_jre/lib/libfreetype.dylib +0 -0
  608. quarchpy/connection_specific/jdk_jres/mac_amd64_jdk_jre/lib/libglass.dylib +0 -0
  609. quarchpy/connection_specific/jdk_jres/mac_amd64_jdk_jre/lib/libinstrument.dylib +0 -0
  610. quarchpy/connection_specific/jdk_jres/mac_amd64_jdk_jre/lib/libj2gss.dylib +0 -0
  611. quarchpy/connection_specific/jdk_jres/mac_amd64_jdk_jre/lib/libj2pcsc.dylib +0 -0
  612. quarchpy/connection_specific/jdk_jres/mac_amd64_jdk_jre/lib/libj2pkcs11.dylib +0 -0
  613. quarchpy/connection_specific/jdk_jres/mac_amd64_jdk_jre/lib/libjaas.dylib +0 -0
  614. quarchpy/connection_specific/jdk_jres/mac_amd64_jdk_jre/lib/libjava.dylib +0 -0
  615. quarchpy/connection_specific/jdk_jres/mac_amd64_jdk_jre/lib/libjavafx_font.dylib +0 -0
  616. quarchpy/connection_specific/jdk_jres/mac_amd64_jdk_jre/lib/libjavafx_iio.dylib +0 -0
  617. quarchpy/connection_specific/jdk_jres/mac_amd64_jdk_jre/lib/libjavajpeg.dylib +0 -0
  618. quarchpy/connection_specific/jdk_jres/mac_amd64_jdk_jre/lib/libjawt.dylib +0 -0
  619. quarchpy/connection_specific/jdk_jres/mac_amd64_jdk_jre/lib/libjdwp.dylib +0 -0
  620. quarchpy/connection_specific/jdk_jres/mac_amd64_jdk_jre/lib/libjimage.dylib +0 -0
  621. quarchpy/connection_specific/jdk_jres/mac_amd64_jdk_jre/lib/libjli.dylib +0 -0
  622. quarchpy/connection_specific/jdk_jres/mac_amd64_jdk_jre/lib/libjsig.dylib +0 -0
  623. quarchpy/connection_specific/jdk_jres/mac_amd64_jdk_jre/lib/libjsound.dylib +0 -0
  624. quarchpy/connection_specific/jdk_jres/mac_amd64_jdk_jre/lib/liblcms.dylib +0 -0
  625. quarchpy/connection_specific/jdk_jres/mac_amd64_jdk_jre/lib/libmanagement.dylib +0 -0
  626. quarchpy/connection_specific/jdk_jres/mac_amd64_jdk_jre/lib/libmanagement_agent.dylib +0 -0
  627. quarchpy/connection_specific/jdk_jres/mac_amd64_jdk_jre/lib/libmanagement_ext.dylib +0 -0
  628. quarchpy/connection_specific/jdk_jres/mac_amd64_jdk_jre/lib/libmlib_image.dylib +0 -0
  629. quarchpy/connection_specific/jdk_jres/mac_amd64_jdk_jre/lib/libnet.dylib +0 -0
  630. quarchpy/connection_specific/jdk_jres/mac_amd64_jdk_jre/lib/libnio.dylib +0 -0
  631. quarchpy/connection_specific/jdk_jres/mac_amd64_jdk_jre/lib/libosx.dylib +0 -0
  632. quarchpy/connection_specific/jdk_jres/mac_amd64_jdk_jre/lib/libosxapp.dylib +0 -0
  633. quarchpy/connection_specific/jdk_jres/mac_amd64_jdk_jre/lib/libosxkrb5.dylib +0 -0
  634. quarchpy/connection_specific/jdk_jres/mac_amd64_jdk_jre/lib/libosxsecurity.dylib +0 -0
  635. quarchpy/connection_specific/jdk_jres/mac_amd64_jdk_jre/lib/libosxui.dylib +0 -0
  636. quarchpy/connection_specific/jdk_jres/mac_amd64_jdk_jre/lib/libprefs.dylib +0 -0
  637. quarchpy/connection_specific/jdk_jres/mac_amd64_jdk_jre/lib/libprism_common.dylib +0 -0
  638. quarchpy/connection_specific/jdk_jres/mac_amd64_jdk_jre/lib/libprism_es2.dylib +0 -0
  639. quarchpy/connection_specific/jdk_jres/mac_amd64_jdk_jre/lib/libprism_sw.dylib +0 -0
  640. quarchpy/connection_specific/jdk_jres/mac_amd64_jdk_jre/lib/librmi.dylib +0 -0
  641. quarchpy/connection_specific/jdk_jres/mac_amd64_jdk_jre/lib/libsplashscreen.dylib +0 -0
  642. quarchpy/connection_specific/jdk_jres/mac_amd64_jdk_jre/lib/libsyslookup.dylib +0 -0
  643. quarchpy/connection_specific/jdk_jres/mac_amd64_jdk_jre/lib/libverify.dylib +0 -0
  644. quarchpy/connection_specific/jdk_jres/mac_amd64_jdk_jre/lib/libzip.dylib +0 -0
  645. quarchpy/connection_specific/jdk_jres/mac_amd64_jdk_jre/lib/modules +0 -0
  646. quarchpy/connection_specific/jdk_jres/mac_amd64_jdk_jre/lib/psfont.properties.ja +119 -119
  647. quarchpy/connection_specific/jdk_jres/mac_amd64_jdk_jre/lib/psfontj2d.properties +323 -323
  648. quarchpy/connection_specific/jdk_jres/mac_amd64_jdk_jre/lib/security/blocked.certs +39 -39
  649. quarchpy/connection_specific/jdk_jres/mac_amd64_jdk_jre/lib/security/cacerts +0 -0
  650. quarchpy/connection_specific/jdk_jres/mac_amd64_jdk_jre/lib/server/libjsig.dylib +0 -0
  651. quarchpy/connection_specific/jdk_jres/mac_amd64_jdk_jre/lib/server/libjvm.dylib +0 -0
  652. quarchpy/connection_specific/jdk_jres/mac_amd64_jdk_jre/lib/shaders.metallib +0 -0
  653. quarchpy/connection_specific/jdk_jres/mac_amd64_jdk_jre/release +2 -2
  654. quarchpy/connection_specific/jdk_jres/win_amd64_jdk_jre/bin/api-ms-win-core-console-l1-1-0.dll +0 -0
  655. quarchpy/connection_specific/jdk_jres/win_amd64_jdk_jre/bin/api-ms-win-core-console-l1-2-0.dll +0 -0
  656. quarchpy/connection_specific/jdk_jres/win_amd64_jdk_jre/bin/api-ms-win-core-datetime-l1-1-0.dll +0 -0
  657. quarchpy/connection_specific/jdk_jres/win_amd64_jdk_jre/bin/api-ms-win-core-debug-l1-1-0.dll +0 -0
  658. quarchpy/connection_specific/jdk_jres/win_amd64_jdk_jre/bin/api-ms-win-core-errorhandling-l1-1-0.dll +0 -0
  659. quarchpy/connection_specific/jdk_jres/win_amd64_jdk_jre/bin/api-ms-win-core-fibers-l1-1-0.dll +0 -0
  660. quarchpy/connection_specific/jdk_jres/win_amd64_jdk_jre/bin/api-ms-win-core-file-l1-1-0.dll +0 -0
  661. quarchpy/connection_specific/jdk_jres/win_amd64_jdk_jre/bin/api-ms-win-core-file-l1-2-0.dll +0 -0
  662. quarchpy/connection_specific/jdk_jres/win_amd64_jdk_jre/bin/api-ms-win-core-file-l2-1-0.dll +0 -0
  663. quarchpy/connection_specific/jdk_jres/win_amd64_jdk_jre/bin/api-ms-win-core-handle-l1-1-0.dll +0 -0
  664. quarchpy/connection_specific/jdk_jres/win_amd64_jdk_jre/bin/api-ms-win-core-heap-l1-1-0.dll +0 -0
  665. quarchpy/connection_specific/jdk_jres/win_amd64_jdk_jre/bin/api-ms-win-core-interlocked-l1-1-0.dll +0 -0
  666. quarchpy/connection_specific/jdk_jres/win_amd64_jdk_jre/bin/api-ms-win-core-libraryloader-l1-1-0.dll +0 -0
  667. quarchpy/connection_specific/jdk_jres/win_amd64_jdk_jre/bin/api-ms-win-core-localization-l1-2-0.dll +0 -0
  668. quarchpy/connection_specific/jdk_jres/win_amd64_jdk_jre/bin/api-ms-win-core-memory-l1-1-0.dll +0 -0
  669. quarchpy/connection_specific/jdk_jres/win_amd64_jdk_jre/bin/api-ms-win-core-namedpipe-l1-1-0.dll +0 -0
  670. quarchpy/connection_specific/jdk_jres/win_amd64_jdk_jre/bin/api-ms-win-core-processenvironment-l1-1-0.dll +0 -0
  671. quarchpy/connection_specific/jdk_jres/win_amd64_jdk_jre/bin/api-ms-win-core-processthreads-l1-1-0.dll +0 -0
  672. quarchpy/connection_specific/jdk_jres/win_amd64_jdk_jre/bin/api-ms-win-core-processthreads-l1-1-1.dll +0 -0
  673. quarchpy/connection_specific/jdk_jres/win_amd64_jdk_jre/bin/api-ms-win-core-profile-l1-1-0.dll +0 -0
  674. quarchpy/connection_specific/jdk_jres/win_amd64_jdk_jre/bin/api-ms-win-core-rtlsupport-l1-1-0.dll +0 -0
  675. quarchpy/connection_specific/jdk_jres/win_amd64_jdk_jre/bin/api-ms-win-core-string-l1-1-0.dll +0 -0
  676. quarchpy/connection_specific/jdk_jres/win_amd64_jdk_jre/bin/api-ms-win-core-synch-l1-1-0.dll +0 -0
  677. quarchpy/connection_specific/jdk_jres/win_amd64_jdk_jre/bin/api-ms-win-core-synch-l1-2-0.dll +0 -0
  678. quarchpy/connection_specific/jdk_jres/win_amd64_jdk_jre/bin/api-ms-win-core-sysinfo-l1-1-0.dll +0 -0
  679. quarchpy/connection_specific/jdk_jres/win_amd64_jdk_jre/bin/api-ms-win-core-timezone-l1-1-0.dll +0 -0
  680. quarchpy/connection_specific/jdk_jres/win_amd64_jdk_jre/bin/api-ms-win-core-util-l1-1-0.dll +0 -0
  681. quarchpy/connection_specific/jdk_jres/win_amd64_jdk_jre/bin/api-ms-win-crt-conio-l1-1-0.dll +0 -0
  682. quarchpy/connection_specific/jdk_jres/win_amd64_jdk_jre/bin/api-ms-win-crt-convert-l1-1-0.dll +0 -0
  683. quarchpy/connection_specific/jdk_jres/win_amd64_jdk_jre/bin/api-ms-win-crt-environment-l1-1-0.dll +0 -0
  684. quarchpy/connection_specific/jdk_jres/win_amd64_jdk_jre/bin/api-ms-win-crt-filesystem-l1-1-0.dll +0 -0
  685. quarchpy/connection_specific/jdk_jres/win_amd64_jdk_jre/bin/api-ms-win-crt-heap-l1-1-0.dll +0 -0
  686. quarchpy/connection_specific/jdk_jres/win_amd64_jdk_jre/bin/api-ms-win-crt-locale-l1-1-0.dll +0 -0
  687. quarchpy/connection_specific/jdk_jres/win_amd64_jdk_jre/bin/api-ms-win-crt-math-l1-1-0.dll +0 -0
  688. quarchpy/connection_specific/jdk_jres/win_amd64_jdk_jre/bin/api-ms-win-crt-multibyte-l1-1-0.dll +0 -0
  689. quarchpy/connection_specific/jdk_jres/win_amd64_jdk_jre/bin/api-ms-win-crt-private-l1-1-0.dll +0 -0
  690. quarchpy/connection_specific/jdk_jres/win_amd64_jdk_jre/bin/api-ms-win-crt-process-l1-1-0.dll +0 -0
  691. quarchpy/connection_specific/jdk_jres/win_amd64_jdk_jre/bin/api-ms-win-crt-runtime-l1-1-0.dll +0 -0
  692. quarchpy/connection_specific/jdk_jres/win_amd64_jdk_jre/bin/api-ms-win-crt-stdio-l1-1-0.dll +0 -0
  693. quarchpy/connection_specific/jdk_jres/win_amd64_jdk_jre/bin/api-ms-win-crt-string-l1-1-0.dll +0 -0
  694. quarchpy/connection_specific/jdk_jres/win_amd64_jdk_jre/bin/api-ms-win-crt-time-l1-1-0.dll +0 -0
  695. quarchpy/connection_specific/jdk_jres/win_amd64_jdk_jre/bin/api-ms-win-crt-utility-l1-1-0.dll +0 -0
  696. quarchpy/connection_specific/jdk_jres/win_amd64_jdk_jre/bin/awt.dll +0 -0
  697. quarchpy/connection_specific/jdk_jres/win_amd64_jdk_jre/bin/client/jvm.dll +0 -0
  698. quarchpy/connection_specific/jdk_jres/win_amd64_jdk_jre/bin/decora_sse.dll +0 -0
  699. quarchpy/connection_specific/jdk_jres/win_amd64_jdk_jre/bin/dt_socket.dll +0 -0
  700. quarchpy/connection_specific/jdk_jres/win_amd64_jdk_jre/bin/extnet.dll +0 -0
  701. quarchpy/connection_specific/jdk_jres/win_amd64_jdk_jre/bin/fontmanager.dll +0 -0
  702. quarchpy/connection_specific/jdk_jres/win_amd64_jdk_jre/bin/freetype.dll +0 -0
  703. quarchpy/connection_specific/jdk_jres/win_amd64_jdk_jre/bin/glass.dll +0 -0
  704. quarchpy/connection_specific/jdk_jres/win_amd64_jdk_jre/bin/instrument.dll +0 -0
  705. quarchpy/connection_specific/jdk_jres/win_amd64_jdk_jre/bin/j2gss.dll +0 -0
  706. quarchpy/connection_specific/jdk_jres/win_amd64_jdk_jre/bin/j2pcsc.dll +0 -0
  707. quarchpy/connection_specific/jdk_jres/win_amd64_jdk_jre/bin/j2pkcs11.dll +0 -0
  708. quarchpy/connection_specific/jdk_jres/win_amd64_jdk_jre/bin/jaas.dll +0 -0
  709. quarchpy/connection_specific/jdk_jres/win_amd64_jdk_jre/bin/jabswitch.exe +0 -0
  710. quarchpy/connection_specific/jdk_jres/win_amd64_jdk_jre/bin/jaccessinspector.exe +0 -0
  711. quarchpy/connection_specific/jdk_jres/win_amd64_jdk_jre/bin/jaccesswalker.exe +0 -0
  712. quarchpy/connection_specific/jdk_jres/win_amd64_jdk_jre/bin/java.dll +0 -0
  713. quarchpy/connection_specific/jdk_jres/win_amd64_jdk_jre/bin/java.exe +0 -0
  714. quarchpy/connection_specific/jdk_jres/win_amd64_jdk_jre/bin/javaaccessbridge.dll +0 -0
  715. quarchpy/connection_specific/jdk_jres/win_amd64_jdk_jre/bin/javafx_font.dll +0 -0
  716. quarchpy/connection_specific/jdk_jres/win_amd64_jdk_jre/bin/javafx_iio.dll +0 -0
  717. quarchpy/connection_specific/jdk_jres/win_amd64_jdk_jre/bin/javajpeg.dll +0 -0
  718. quarchpy/connection_specific/jdk_jres/win_amd64_jdk_jre/bin/javaw.exe +0 -0
  719. quarchpy/connection_specific/jdk_jres/win_amd64_jdk_jre/bin/jawt.dll +0 -0
  720. quarchpy/connection_specific/jdk_jres/win_amd64_jdk_jre/bin/jdwp.dll +0 -0
  721. quarchpy/connection_specific/jdk_jres/win_amd64_jdk_jre/bin/jfr.exe +0 -0
  722. quarchpy/connection_specific/jdk_jres/win_amd64_jdk_jre/bin/jimage.dll +0 -0
  723. quarchpy/connection_specific/jdk_jres/win_amd64_jdk_jre/bin/jli.dll +0 -0
  724. quarchpy/connection_specific/jdk_jres/win_amd64_jdk_jre/bin/jrunscript.exe +0 -0
  725. quarchpy/connection_specific/jdk_jres/win_amd64_jdk_jre/bin/jsound.dll +0 -0
  726. quarchpy/connection_specific/jdk_jres/win_amd64_jdk_jre/bin/jsvml.dll +0 -0
  727. quarchpy/connection_specific/jdk_jres/win_amd64_jdk_jre/bin/jwebserver.exe +0 -0
  728. quarchpy/connection_specific/jdk_jres/win_amd64_jdk_jre/bin/keytool.exe +0 -0
  729. quarchpy/connection_specific/jdk_jres/win_amd64_jdk_jre/bin/kinit.exe +0 -0
  730. quarchpy/connection_specific/jdk_jres/win_amd64_jdk_jre/bin/klist.exe +0 -0
  731. quarchpy/connection_specific/jdk_jres/win_amd64_jdk_jre/bin/ktab.exe +0 -0
  732. quarchpy/connection_specific/jdk_jres/win_amd64_jdk_jre/bin/lcms.dll +0 -0
  733. quarchpy/connection_specific/jdk_jres/win_amd64_jdk_jre/bin/management.dll +0 -0
  734. quarchpy/connection_specific/jdk_jres/win_amd64_jdk_jre/bin/management_agent.dll +0 -0
  735. quarchpy/connection_specific/jdk_jres/win_amd64_jdk_jre/bin/management_ext.dll +0 -0
  736. quarchpy/connection_specific/jdk_jres/win_amd64_jdk_jre/bin/mlib_image.dll +0 -0
  737. quarchpy/connection_specific/jdk_jres/win_amd64_jdk_jre/bin/msvcp140.dll +0 -0
  738. quarchpy/connection_specific/jdk_jres/win_amd64_jdk_jre/bin/msvcp140_1.dll +0 -0
  739. quarchpy/connection_specific/jdk_jres/win_amd64_jdk_jre/bin/msvcp140_2.dll +0 -0
  740. quarchpy/connection_specific/jdk_jres/win_amd64_jdk_jre/bin/net.dll +0 -0
  741. quarchpy/connection_specific/jdk_jres/win_amd64_jdk_jre/bin/nio.dll +0 -0
  742. quarchpy/connection_specific/jdk_jres/win_amd64_jdk_jre/bin/prefs.dll +0 -0
  743. quarchpy/connection_specific/jdk_jres/win_amd64_jdk_jre/bin/prism_common.dll +0 -0
  744. quarchpy/connection_specific/jdk_jres/win_amd64_jdk_jre/bin/prism_d3d.dll +0 -0
  745. quarchpy/connection_specific/jdk_jres/win_amd64_jdk_jre/bin/prism_sw.dll +0 -0
  746. quarchpy/connection_specific/jdk_jres/win_amd64_jdk_jre/bin/rmi.dll +0 -0
  747. quarchpy/connection_specific/jdk_jres/win_amd64_jdk_jre/bin/rmiregistry.exe +0 -0
  748. quarchpy/connection_specific/jdk_jres/win_amd64_jdk_jre/bin/server/jvm.dll +0 -0
  749. quarchpy/connection_specific/jdk_jres/win_amd64_jdk_jre/bin/splashscreen.dll +0 -0
  750. quarchpy/connection_specific/jdk_jres/win_amd64_jdk_jre/bin/sspi_bridge.dll +0 -0
  751. quarchpy/connection_specific/jdk_jres/win_amd64_jdk_jre/bin/syslookup.dll +0 -0
  752. quarchpy/connection_specific/jdk_jres/win_amd64_jdk_jre/bin/ucrtbase.dll +0 -0
  753. quarchpy/connection_specific/jdk_jres/win_amd64_jdk_jre/bin/vcruntime140.dll +0 -0
  754. quarchpy/connection_specific/jdk_jres/win_amd64_jdk_jre/bin/vcruntime140_1.dll +0 -0
  755. quarchpy/connection_specific/jdk_jres/win_amd64_jdk_jre/bin/verify.dll +0 -0
  756. quarchpy/connection_specific/jdk_jres/win_amd64_jdk_jre/bin/w2k_lsa_auth.dll +0 -0
  757. quarchpy/connection_specific/jdk_jres/win_amd64_jdk_jre/bin/windowsaccessbridge-64.dll +0 -0
  758. quarchpy/connection_specific/jdk_jres/win_amd64_jdk_jre/bin/zip.dll +0 -0
  759. quarchpy/connection_specific/jdk_jres/win_amd64_jdk_jre/conf/jaxp-strict.properties.template +123 -123
  760. quarchpy/connection_specific/jdk_jres/win_amd64_jdk_jre/conf/jaxp.properties +200 -200
  761. quarchpy/connection_specific/jdk_jres/win_amd64_jdk_jre/conf/logging.properties +63 -63
  762. quarchpy/connection_specific/jdk_jres/win_amd64_jdk_jre/conf/management/jmxremote.access +79 -79
  763. quarchpy/connection_specific/jdk_jres/win_amd64_jdk_jre/conf/management/jmxremote.password.template +114 -114
  764. quarchpy/connection_specific/jdk_jres/win_amd64_jdk_jre/conf/management/management.properties +326 -326
  765. quarchpy/connection_specific/jdk_jres/win_amd64_jdk_jre/conf/net.properties +166 -166
  766. quarchpy/connection_specific/jdk_jres/win_amd64_jdk_jre/conf/security/java.security +1 -4
  767. quarchpy/connection_specific/jdk_jres/win_amd64_jdk_jre/conf/security/policy/README.txt +54 -54
  768. quarchpy/connection_specific/jdk_jres/win_amd64_jdk_jre/conf/security/policy/limited/default_US_export.policy +6 -6
  769. quarchpy/connection_specific/jdk_jres/win_amd64_jdk_jre/conf/security/policy/limited/default_local.policy +14 -14
  770. quarchpy/connection_specific/jdk_jres/win_amd64_jdk_jre/conf/security/policy/limited/exempt_local.policy +13 -13
  771. quarchpy/connection_specific/jdk_jres/win_amd64_jdk_jre/conf/security/policy/unlimited/default_US_export.policy +6 -6
  772. quarchpy/connection_specific/jdk_jres/win_amd64_jdk_jre/conf/security/policy/unlimited/default_local.policy +6 -6
  773. quarchpy/connection_specific/jdk_jres/win_amd64_jdk_jre/conf/sound.properties +39 -39
  774. quarchpy/connection_specific/jdk_jres/win_amd64_jdk_jre/legal/java.base/ADDITIONAL_LICENSE_INFO +37 -37
  775. quarchpy/connection_specific/jdk_jres/win_amd64_jdk_jre/legal/java.base/ASSEMBLY_EXCEPTION +27 -27
  776. quarchpy/connection_specific/jdk_jres/win_amd64_jdk_jre/legal/java.base/LICENSE +347 -347
  777. quarchpy/connection_specific/jdk_jres/win_amd64_jdk_jre/legal/java.base/aes.md +36 -36
  778. quarchpy/connection_specific/jdk_jres/win_amd64_jdk_jre/legal/java.base/asm.md +36 -36
  779. quarchpy/connection_specific/jdk_jres/win_amd64_jdk_jre/legal/java.base/c-libutl.md +35 -35
  780. quarchpy/connection_specific/jdk_jres/win_amd64_jdk_jre/legal/java.base/cldr.md +100 -100
  781. quarchpy/connection_specific/jdk_jres/win_amd64_jdk_jre/legal/java.base/icu.md +93 -93
  782. quarchpy/connection_specific/jdk_jres/win_amd64_jdk_jre/legal/java.base/public_suffix.md +399 -399
  783. quarchpy/connection_specific/jdk_jres/win_amd64_jdk_jre/legal/java.base/siphash.md +150 -150
  784. quarchpy/connection_specific/jdk_jres/win_amd64_jdk_jre/legal/java.base/unicode.md +269 -269
  785. quarchpy/connection_specific/jdk_jres/win_amd64_jdk_jre/legal/java.base/wepoll.md +34 -34
  786. quarchpy/connection_specific/jdk_jres/win_amd64_jdk_jre/legal/java.base/zlib.md +27 -27
  787. quarchpy/connection_specific/jdk_jres/win_amd64_jdk_jre/legal/java.desktop/colorimaging.md +7 -7
  788. quarchpy/connection_specific/jdk_jres/win_amd64_jdk_jre/legal/java.desktop/freetype.md +649 -649
  789. quarchpy/connection_specific/jdk_jres/win_amd64_jdk_jre/legal/java.desktop/giflib.md +46 -46
  790. quarchpy/connection_specific/jdk_jres/win_amd64_jdk_jre/legal/java.desktop/harfbuzz.md +103 -103
  791. quarchpy/connection_specific/jdk_jres/win_amd64_jdk_jre/legal/java.desktop/jpeg.md +77 -77
  792. quarchpy/connection_specific/jdk_jres/win_amd64_jdk_jre/legal/java.desktop/lcms.md +103 -103
  793. quarchpy/connection_specific/jdk_jres/win_amd64_jdk_jre/legal/java.desktop/libpng.md +215 -215
  794. quarchpy/connection_specific/jdk_jres/win_amd64_jdk_jre/legal/java.desktop/mesa3d.md +134 -134
  795. quarchpy/connection_specific/jdk_jres/win_amd64_jdk_jre/legal/java.xml/bcel.md +219 -219
  796. quarchpy/connection_specific/jdk_jres/win_amd64_jdk_jre/legal/java.xml/dom.md +77 -77
  797. quarchpy/connection_specific/jdk_jres/win_amd64_jdk_jre/legal/java.xml/jcup.md +31 -31
  798. quarchpy/connection_specific/jdk_jres/win_amd64_jdk_jre/legal/java.xml/schema10part1.md +51 -51
  799. quarchpy/connection_specific/jdk_jres/win_amd64_jdk_jre/legal/java.xml/schema10part2.md +50 -50
  800. quarchpy/connection_specific/jdk_jres/win_amd64_jdk_jre/legal/java.xml/xalan.md +255 -255
  801. quarchpy/connection_specific/jdk_jres/win_amd64_jdk_jre/legal/java.xml/xerces.md +229 -229
  802. quarchpy/connection_specific/jdk_jres/win_amd64_jdk_jre/legal/java.xml/xhtml10.md +57 -57
  803. quarchpy/connection_specific/jdk_jres/win_amd64_jdk_jre/legal/java.xml/xhtml10schema.md +150 -150
  804. quarchpy/connection_specific/jdk_jres/win_amd64_jdk_jre/legal/java.xml/xhtml11.md +68 -68
  805. quarchpy/connection_specific/jdk_jres/win_amd64_jdk_jre/legal/java.xml/xhtml11schema.md +60 -60
  806. quarchpy/connection_specific/jdk_jres/win_amd64_jdk_jre/legal/java.xml/xmlspec.md +63 -63
  807. quarchpy/connection_specific/jdk_jres/win_amd64_jdk_jre/legal/java.xml/xmlxsd.md +43 -43
  808. quarchpy/connection_specific/jdk_jres/win_amd64_jdk_jre/legal/java.xml.crypto/santuario.md +227 -227
  809. quarchpy/connection_specific/jdk_jres/win_amd64_jdk_jre/legal/javafx.base/ADDITIONAL_LICENSE_INFO +1 -0
  810. quarchpy/connection_specific/jdk_jres/win_amd64_jdk_jre/legal/javafx.base/ASSEMBLY_EXCEPTION +1 -0
  811. quarchpy/connection_specific/jdk_jres/win_amd64_jdk_jre/legal/javafx.base/LICENSE +1 -0
  812. quarchpy/connection_specific/jdk_jres/win_amd64_jdk_jre/legal/javafx.controls/ADDITIONAL_LICENSE_INFO +1 -0
  813. quarchpy/connection_specific/jdk_jres/win_amd64_jdk_jre/legal/javafx.controls/ASSEMBLY_EXCEPTION +1 -0
  814. quarchpy/connection_specific/jdk_jres/win_amd64_jdk_jre/legal/javafx.controls/LICENSE +1 -0
  815. quarchpy/connection_specific/jdk_jres/win_amd64_jdk_jre/legal/javafx.fxml/ADDITIONAL_LICENSE_INFO +1 -0
  816. quarchpy/connection_specific/jdk_jres/win_amd64_jdk_jre/legal/javafx.fxml/ASSEMBLY_EXCEPTION +1 -0
  817. quarchpy/connection_specific/jdk_jres/win_amd64_jdk_jre/legal/javafx.fxml/LICENSE +1 -0
  818. quarchpy/connection_specific/jdk_jres/win_amd64_jdk_jre/legal/javafx.graphics/ADDITIONAL_LICENSE_INFO +1 -0
  819. quarchpy/connection_specific/jdk_jres/win_amd64_jdk_jre/legal/javafx.graphics/ASSEMBLY_EXCEPTION +1 -0
  820. quarchpy/connection_specific/jdk_jres/win_amd64_jdk_jre/legal/javafx.graphics/LICENSE +1 -0
  821. quarchpy/connection_specific/jdk_jres/win_amd64_jdk_jre/legal/javafx.graphics/jpeg_fx.md +43 -0
  822. quarchpy/connection_specific/jdk_jres/win_amd64_jdk_jre/legal/javafx.graphics/mesa3d.md +1 -0
  823. quarchpy/connection_specific/jdk_jres/win_amd64_jdk_jre/legal/javafx.graphics/pipewire.md +41 -0
  824. quarchpy/connection_specific/jdk_jres/win_amd64_jdk_jre/legal/javafx.swing/ADDITIONAL_LICENSE_INFO +1 -0
  825. quarchpy/connection_specific/jdk_jres/win_amd64_jdk_jre/legal/javafx.swing/ASSEMBLY_EXCEPTION +1 -0
  826. quarchpy/connection_specific/jdk_jres/win_amd64_jdk_jre/legal/javafx.swing/LICENSE +1 -0
  827. quarchpy/connection_specific/jdk_jres/win_amd64_jdk_jre/legal/jdk.crypto.cryptoki/pkcs11cryptotoken.md +76 -76
  828. quarchpy/connection_specific/jdk_jres/win_amd64_jdk_jre/legal/jdk.crypto.cryptoki/pkcs11wrapper.md +46 -46
  829. quarchpy/connection_specific/jdk_jres/win_amd64_jdk_jre/legal/jdk.dynalink/dynalink.md +32 -32
  830. quarchpy/connection_specific/jdk_jres/win_amd64_jdk_jre/legal/jdk.localedata/thaidict.md +31 -31
  831. quarchpy/connection_specific/jdk_jres/win_amd64_jdk_jre/lib/classlist +1 -0
  832. quarchpy/connection_specific/jdk_jres/win_amd64_jdk_jre/lib/fontconfig.properties.src +332 -332
  833. quarchpy/connection_specific/jdk_jres/win_amd64_jdk_jre/lib/javafx-swt.jar +0 -0
  834. quarchpy/connection_specific/jdk_jres/win_amd64_jdk_jre/lib/javafx.properties +3 -0
  835. quarchpy/connection_specific/jdk_jres/win_amd64_jdk_jre/lib/jawt.lib +0 -0
  836. quarchpy/connection_specific/jdk_jres/win_amd64_jdk_jre/lib/jfr/default.jfc +1152 -1152
  837. quarchpy/connection_specific/jdk_jres/win_amd64_jdk_jre/lib/jfr/profile.jfc +1151 -1151
  838. quarchpy/connection_specific/jdk_jres/win_amd64_jdk_jre/lib/jrt-fs.jar +0 -0
  839. quarchpy/connection_specific/jdk_jres/win_amd64_jdk_jre/lib/jvm.cfg +2 -2
  840. quarchpy/connection_specific/jdk_jres/win_amd64_jdk_jre/lib/jvm.lib +0 -0
  841. quarchpy/connection_specific/jdk_jres/win_amd64_jdk_jre/lib/modules +0 -0
  842. quarchpy/connection_specific/jdk_jres/win_amd64_jdk_jre/lib/psfont.properties.ja +119 -119
  843. quarchpy/connection_specific/jdk_jres/win_amd64_jdk_jre/lib/psfontj2d.properties +323 -323
  844. quarchpy/connection_specific/jdk_jres/win_amd64_jdk_jre/lib/security/cacerts +0 -0
  845. quarchpy/connection_specific/jdk_jres/win_amd64_jdk_jre/lib/tzdb.dat +0 -0
  846. quarchpy/connection_specific/jdk_jres/win_amd64_jdk_jre/release +2 -2
  847. quarchpy/connection_specific/mDNS.py +3 -6
  848. quarchpy/debug/SystemTest.py +22 -9
  849. quarchpy/device/__init__.py +7 -1
  850. quarchpy/device/device_fixture_idn_info.py +8 -0
  851. quarchpy/device/device_idn_info.py +100 -0
  852. quarchpy/device/device_network_info.py +18 -0
  853. quarchpy/device/discovered_device.py +150 -0
  854. quarchpy/device/packet_processing.py +87 -0
  855. quarchpy/device/quarchPPM.py +3 -6
  856. quarchpy/device/scanDevices.py +81 -40
  857. quarchpy/docs/CHANGES.rst +14 -0
  858. quarchpy/install_qps.py +347 -0
  859. quarchpy/qis/qisFuncs.py +8 -21
  860. quarchpy/qps/qpsFuncs.py +17 -10
  861. quarchpy/run.py +85 -51
  862. {quarchpy-2.2.12.dev1.dist-info → quarchpy-2.2.13.dev1.dist-info}/METADATA +17 -1
  863. {quarchpy-2.2.12.dev1.dist-info → quarchpy-2.2.13.dev1.dist-info}/RECORD +1128 -1018
  864. quarchpy/connection_specific/QPS/win-amd64/Power-Studio-QuickStart.pdf +0 -0
  865. quarchpy/connection_specific/QPS/win-amd64/qis/qis-NoGUI.bat +0 -3
  866. quarchpy/connection_specific/QPS/win-amd64/qis/qis.jar +0 -0
  867. quarchpy/connection_specific/QPS/win-amd64/qis/qis_lib/CInterface-2.5.jar +0 -0
  868. quarchpy/connection_specific/QPS/win-amd64/qis/qis_lib/QuarchCommon-2.1.jar +0 -0
  869. quarchpy/connection_specific/QPS/win-amd64/qis/qis_lib/TorridonCommon-1.2.2.jar +0 -0
  870. quarchpy/connection_specific/QPS/win-amd64/qis/qis_lib/netty-all-4.1.43.Final.jar +0 -0
  871. quarchpy/connection_specific/QPS/win-amd64/qis/qis_lib/slf4j-api-2.0.9.jar +0 -0
  872. quarchpy/connection_specific/QPS/win-amd64/qis/qis_lib/slf4j-simple-2.0.9.jar +0 -0
  873. quarchpy/connection_specific/QPS/win-amd64/qps.jar +0 -0
  874. quarchpy/connection_specific/QPS/win-amd64/qps_lib/JFXUtilities-1.0.jar +0 -0
  875. quarchpy/connection_specific/QPS/win-amd64/qps_lib/QuarchCommon-2.1.jar +0 -0
  876. quarchpy/connection_specific/QPS/win-amd64/qps_lib/lin-arm64/javafx-base-24.0.1-linux-aarch64.jar +0 -0
  877. quarchpy/connection_specific/QPS/win-amd64/qps_lib/lin-arm64/javafx-controls-24.0.1-linux-aarch64.jar +0 -0
  878. quarchpy/connection_specific/QPS/win-amd64/qps_lib/lin-arm64/javafx-fxml-24.0.1-linux-aarch64.jar +0 -0
  879. quarchpy/connection_specific/QPS/win-amd64/qps_lib/lin-arm64/javafx-graphics-24.0.1-linux-aarch64.jar +0 -0
  880. quarchpy/connection_specific/QPS/win-amd64/qps_lib/lin-arm64/javafx-swing-24.0.1-linux-aarch64.jar +0 -0
  881. quarchpy/connection_specific/QPS/win-amd64/qps_lib/lin-x64/javafx-base-24.0.1-linux.jar +0 -0
  882. quarchpy/connection_specific/QPS/win-amd64/qps_lib/lin-x64/javafx-controls-24.0.1-linux.jar +0 -0
  883. quarchpy/connection_specific/QPS/win-amd64/qps_lib/lin-x64/javafx-fxml-24.0.1-linux.jar +0 -0
  884. quarchpy/connection_specific/QPS/win-amd64/qps_lib/lin-x64/javafx-graphics-24.0.1-linux.jar +0 -0
  885. quarchpy/connection_specific/QPS/win-amd64/qps_lib/lin-x64/javafx-swing-24.0.1-linux.jar +0 -0
  886. quarchpy/connection_specific/QPS/win-amd64/qps_lib/mac-arm64/javafx-base-24.0.1-mac-aarch64.jar +0 -0
  887. quarchpy/connection_specific/QPS/win-amd64/qps_lib/mac-arm64/javafx-controls-24.0.1-mac-aarch64.jar +0 -0
  888. quarchpy/connection_specific/QPS/win-amd64/qps_lib/mac-arm64/javafx-fxml-24.0.1-mac-aarch64.jar +0 -0
  889. quarchpy/connection_specific/QPS/win-amd64/qps_lib/mac-arm64/javafx-graphics-24.0.1-mac-aarch64.jar +0 -0
  890. quarchpy/connection_specific/QPS/win-amd64/qps_lib/mac-arm64/javafx-swing-24.0.1-mac-aarch64.jar +0 -0
  891. quarchpy/connection_specific/QPS/win-amd64/qps_lib/mac-x64/javafx-base-24.0.1-mac.jar +0 -0
  892. quarchpy/connection_specific/QPS/win-amd64/qps_lib/mac-x64/javafx-controls-24.0.1-mac.jar +0 -0
  893. quarchpy/connection_specific/QPS/win-amd64/qps_lib/mac-x64/javafx-fxml-24.0.1-mac.jar +0 -0
  894. quarchpy/connection_specific/QPS/win-amd64/qps_lib/mac-x64/javafx-graphics-24.0.1-mac.jar +0 -0
  895. quarchpy/connection_specific/QPS/win-amd64/qps_lib/mac-x64/javafx-swing-24.0.1-mac.jar +0 -0
  896. quarchpy/connection_specific/QPS/win-amd64/qps_lib/netty-all-4.1.43.Final.jar +0 -0
  897. quarchpy/connection_specific/QPS/win-amd64/qps_lib/qutils-1.0.jar +0 -0
  898. quarchpy/connection_specific/QPS/win-amd64/qps_lib/win-x64/javafx-base-24.0.1-win.jar +0 -0
  899. quarchpy/connection_specific/QPS/win-amd64/qps_lib/win-x64/javafx-controls-24.0.1-win.jar +0 -0
  900. quarchpy/connection_specific/QPS/win-amd64/qps_lib/win-x64/javafx-fxml-24.0.1-win.jar +0 -0
  901. quarchpy/connection_specific/QPS/win-amd64/qps_lib/win-x64/javafx-graphics-24.0.1-win.jar +0 -0
  902. quarchpy/connection_specific/QPS/win-amd64/qps_lib/win-x64/javafx-swing-24.0.1-win.jar +0 -0
  903. quarchpy/connection_specific/QPS/win-amd64/whats-new.txt +0 -42
  904. /quarchpy/connection_specific/QPS/{win-amd64/3rdPartyLicenses → 3rdPartyLicenses}/Material-Icons-license.txt +0 -0
  905. /quarchpy/connection_specific/QPS/{win-amd64/3rdPartyLicenses → 3rdPartyLicenses}/argparse4j-LICENSE.txt +0 -0
  906. /quarchpy/connection_specific/QPS/{win-amd64/3rdPartyLicenses → 3rdPartyLicenses}/com.sun.istack-license.html +0 -0
  907. /quarchpy/connection_specific/QPS/{win-amd64/3rdPartyLicenses → 3rdPartyLicenses}/commons-io-LICENSE-2.0.txt +0 -0
  908. /quarchpy/connection_specific/QPS/{win-amd64/3rdPartyLicenses → 3rdPartyLicenses}/controlsfx-license.txt +0 -0
  909. /quarchpy/connection_specific/QPS/{win-amd64/3rdPartyLicenses → 3rdPartyLicenses}/jakarta.activation-license.html +0 -0
  910. /quarchpy/connection_specific/QPS/{win-amd64/3rdPartyLicenses → 3rdPartyLicenses}/jakarta.xml.bind-api-license.html +0 -0
  911. /quarchpy/connection_specific/QPS/{win-amd64/3rdPartyLicenses → 3rdPartyLicenses}/netty-LICENSE.txt +0 -0
  912. /quarchpy/connection_specific/QPS/{win-amd64/3rdPartyLicenses → 3rdPartyLicenses}/netty-NOTICE.txt +0 -0
  913. /quarchpy/connection_specific/QPS/{win-amd64/qis/3rdPartyLicenses → 3rdPartyLicenses}/slf4j-LICENSE.txt +0 -0
  914. /quarchpy/connection_specific/QPS/{win-amd64/DeviceConfig/QTL1995-02.XML → DeviceConfig/QTL1995-02.xml} +0 -0
  915. /quarchpy/connection_specific/QPS/{win-amd64/DeviceConfig/QTL1999-02.XML → DeviceConfig/QTL1999-02.xml} +0 -0
  916. /quarchpy/connection_specific/QPS/{win-amd64/DeviceConfig/QTL2312-01.XML → DeviceConfig/QTL2312-01.xml} +0 -0
  917. /quarchpy/connection_specific/QPS/{win-amd64/DeviceConfig → DeviceConfig}/breaker/Cable Modules/QTL1253-01 - Mini SAS Module Config v3.5 c1.3.xml +0 -0
  918. /quarchpy/connection_specific/QPS/{win-amd64/DeviceConfig → DeviceConfig}/breaker/Cable Modules/QTL1253-01 - Mini SAS Module Config v4.000 c1.3.xml +0 -0
  919. /quarchpy/connection_specific/QPS/{win-amd64/DeviceConfig → DeviceConfig}/breaker/Cable Modules/QTL1253-02 - Mini SAS Module Config v3.5 c1.3.xml +0 -0
  920. /quarchpy/connection_specific/QPS/{win-amd64/DeviceConfig → DeviceConfig}/breaker/Cable Modules/QTL1253-02 - Mini SAS Module Config v4.000 c1.3.xml +0 -0
  921. /quarchpy/connection_specific/QPS/{win-amd64/DeviceConfig → DeviceConfig}/breaker/Cable Modules/QTL1253-xx - Mini SAS Module Config v4.003 c1.6.xml +0 -0
  922. /quarchpy/connection_specific/QPS/{win-amd64/DeviceConfig → DeviceConfig}/breaker/Cable Modules/QTL1271-xx - Ethernet Module Config v3.5 c1.2.xml +0 -0
  923. /quarchpy/connection_specific/QPS/{win-amd64/DeviceConfig → DeviceConfig}/breaker/Cable Modules/QTL1271-xx - Ethernet Module Config v4.000 c1.2.xml +0 -0
  924. /quarchpy/connection_specific/QPS/{win-amd64/DeviceConfig → DeviceConfig}/breaker/Cable Modules/QTL1271-xx - Ethernet Module Config v4.100 c1.3.xml +0 -0
  925. /quarchpy/connection_specific/QPS/{win-amd64/DeviceConfig → DeviceConfig}/breaker/Cable Modules/QTL1292-xx - SFP+ Cable Pull Module Config v4.000 c1.1.xml +0 -0
  926. /quarchpy/connection_specific/QPS/{win-amd64/DeviceConfig → DeviceConfig}/breaker/Cable Modules/QTL1309-04 - USB 3.0 Module Config v4.003 c1.2.xml +0 -0
  927. /quarchpy/connection_specific/QPS/{win-amd64/DeviceConfig → DeviceConfig}/breaker/Cable Modules/QTL1309-xx - USB 3.0 Module Config v3.5 c1.1.xml +0 -0
  928. /quarchpy/connection_specific/QPS/{win-amd64/DeviceConfig → DeviceConfig}/breaker/Cable Modules/QTL1309-xx - USB 3.0 Module Config v4.000 c1.1.xml +0 -0
  929. /quarchpy/connection_specific/QPS/{win-amd64/DeviceConfig → DeviceConfig}/breaker/Cable Modules/QTL1366-xx - QSFP Cable Pull Module Config v4.000 c1.1.xml +0 -0
  930. /quarchpy/connection_specific/QPS/{win-amd64/DeviceConfig → DeviceConfig}/breaker/Cable Modules/QTL1383-xx - eSATAp Module Config v4.000 c1.3.xml +0 -0
  931. /quarchpy/connection_specific/QPS/{win-amd64/DeviceConfig → DeviceConfig}/breaker/Cable Modules/QTL1521-02 - Mini SAS HD Module Config v4.000 c1.1.xml +0 -0
  932. /quarchpy/connection_specific/QPS/{win-amd64/DeviceConfig → DeviceConfig}/breaker/Cable Modules/QTL1521-03 - Mini SAS HD Module Config v4.000 c1.1.xml +0 -0
  933. /quarchpy/connection_specific/QPS/{win-amd64/DeviceConfig → DeviceConfig}/breaker/Cable Modules/QTL1521-05 - Mini SAS HD Module Config v4.005 c1.1.xml +0 -0
  934. /quarchpy/connection_specific/QPS/{win-amd64/DeviceConfig → DeviceConfig}/breaker/Cable Modules/QTL1521-05 - Mini SAS HD Module Config v4.007 c1.2.xml +0 -0
  935. /quarchpy/connection_specific/QPS/{win-amd64/DeviceConfig → DeviceConfig}/breaker/Cable Modules/QTL1521-xx - Mini SAS HD Module Config v4.003 c1.5.xml +0 -0
  936. /quarchpy/connection_specific/QPS/{win-amd64/DeviceConfig → DeviceConfig}/breaker/Cable Modules/QTL1663-xx - Quad QSFP Cable Pull Module Config v4.000 c1.1.xml +0 -0
  937. /quarchpy/connection_specific/QPS/{win-amd64/DeviceConfig → DeviceConfig}/breaker/Cable Modules/QTL1675-05 - Mini SAS HD Module w Triggering Config v4.007 c1.3.xml +0 -0
  938. /quarchpy/connection_specific/QPS/{win-amd64/DeviceConfig → DeviceConfig}/breaker/Cable Modules/QTL1675-xx - Mini SAS HD Module w Triggering Config v4.000 c1.1.xml +0 -0
  939. /quarchpy/connection_specific/QPS/{win-amd64/DeviceConfig → DeviceConfig}/breaker/Cable Modules/QTL1917-xx - Dual SFP+ Cable Pull Module Config v4.000 c1.1.xml +0 -0
  940. /quarchpy/connection_specific/QPS/{win-amd64/DeviceConfig → DeviceConfig}/breaker/Cable Modules/QTL1971-01 - USB TypeC Module Config v4.000 c1.1.xml +0 -0
  941. /quarchpy/connection_specific/QPS/{win-amd64/DeviceConfig → DeviceConfig}/breaker/Cable Modules/QTL1971-02 - USB TypeC Module Config v4.000 c1.1.xml +0 -0
  942. /quarchpy/connection_specific/QPS/{win-amd64/DeviceConfig → DeviceConfig}/breaker/Cable Modules/QTL2022-xx - RJ-45 Cable Module Config v4.104 c1.3.xml +0 -0
  943. /quarchpy/connection_specific/QPS/{win-amd64/DeviceConfig → DeviceConfig}/breaker/Cable Modules/QTL2058-xx - External PCIe Module Config v4.001 c1.1.xml +0 -0
  944. /quarchpy/connection_specific/QPS/{win-amd64/DeviceConfig → DeviceConfig}/breaker/Cable Modules/QTL2138-01 - SFP28 Cable Pull Module Config v4.000 c1.1.xml +0 -0
  945. /quarchpy/connection_specific/QPS/{win-amd64/DeviceConfig → DeviceConfig}/breaker/Cable Modules/QTL2146-01 - Gen4 OCuLink Cable Module Config v4.001 c1.1.xml +0 -0
  946. /quarchpy/connection_specific/QPS/{win-amd64/DeviceConfig → DeviceConfig}/breaker/Cable Modules/QTL2162-01 - 24G mini SAS HD Cable Break Module Config v4.000 c1.xml +0 -0
  947. /quarchpy/connection_specific/QPS/{win-amd64/DeviceConfig → DeviceConfig}/breaker/Cable Modules/QTL2171-01 - QSFP28 Cable Module Config v4.000 c1.xml +0 -0
  948. /quarchpy/connection_specific/QPS/{win-amd64/DeviceConfig → DeviceConfig}/breaker/Cable Modules/QTL2171-02 - QSFP28 Cable Module Config v4.000 c1.xml +0 -0
  949. /quarchpy/connection_specific/QPS/{win-amd64/DeviceConfig → DeviceConfig}/breaker/Cable Modules/QTL2341-01 - Gen4 External PCIe Cable Module v4.000.xml +0 -0
  950. /quarchpy/connection_specific/QPS/{win-amd64/DeviceConfig → DeviceConfig}/breaker/Cable Modules/QTL2602-xx - Multiprotocol Link Breaker.xml +0 -0
  951. /quarchpy/connection_specific/QPS/{win-amd64/DeviceConfig → DeviceConfig}/breaker/Cable Modules/QTL2834-xx - -48V DC Breaker Module v5.000 c1.0.xml +0 -0
  952. /quarchpy/connection_specific/QPS/{win-amd64/DeviceConfig → DeviceConfig}/breaker/Cable Modules/QTL3000-xx - RJ-45 Cable Module v5.000 c1.4.xml +0 -0
  953. /quarchpy/connection_specific/QPS/{win-amd64/DeviceConfig → DeviceConfig}/breaker/Card Modules/QTL1069-xx - SBB 2.0 Module Config v3.5 c1.1.xml +0 -0
  954. /quarchpy/connection_specific/QPS/{win-amd64/DeviceConfig → DeviceConfig}/breaker/Card Modules/QTL1630-01 - PCIe Card Module v4.000 c1.0.xml +0 -0
  955. /quarchpy/connection_specific/QPS/{win-amd64/DeviceConfig → DeviceConfig}/breaker/Card Modules/QTL1630-02 - PCIe Card Module Config v4.004 c1.2.xml +0 -0
  956. /quarchpy/connection_specific/QPS/{win-amd64/DeviceConfig → DeviceConfig}/breaker/Card Modules/QTL1630-02 - PCIe Card Module Config v4.005 c1.2.xml +0 -0
  957. /quarchpy/connection_specific/QPS/{win-amd64/DeviceConfig → DeviceConfig}/breaker/Card Modules/QTL1630-02 - PCIe Card Module Config v4.100 c1.4.xml +0 -0
  958. /quarchpy/connection_specific/QPS/{win-amd64/DeviceConfig → DeviceConfig}/breaker/Card Modules/QTL1630-04 - PCIe Card Module Config v4.001 c1.1.xml +0 -0
  959. /quarchpy/connection_specific/QPS/{win-amd64/DeviceConfig → DeviceConfig}/breaker/Card Modules/QTL1630-04 - PCIe Card Module Config v4.004 c1.2.xml +0 -0
  960. /quarchpy/connection_specific/QPS/{win-amd64/DeviceConfig → DeviceConfig}/breaker/Card Modules/QTL1688-01 - PCIe Card Module w Triggering Config v4.004 c1.2.xml +0 -0
  961. /quarchpy/connection_specific/QPS/{win-amd64/DeviceConfig → DeviceConfig}/breaker/Card Modules/QTL1688-01 - PCIe Card Module w Triggering Config v4.006 c1.3.xml +0 -0
  962. /quarchpy/connection_specific/QPS/{win-amd64/DeviceConfig → DeviceConfig}/breaker/Card Modules/QTL1688-03 - PCIe Card Module w Triggering Config v4.001 c1.1.xml +0 -0
  963. /quarchpy/connection_specific/QPS/{win-amd64/DeviceConfig → DeviceConfig}/breaker/Card Modules/QTL1688-03 - PCIe Card Module w Triggering Config v4.004 c1.2.xml +0 -0
  964. /quarchpy/connection_specific/QPS/{win-amd64/DeviceConfig → DeviceConfig}/breaker/Card Modules/QTL1688-04 - PCIe Card Module w Triggering Config v4.005 c1.5.xml +0 -0
  965. /quarchpy/connection_specific/QPS/{win-amd64/DeviceConfig → DeviceConfig}/breaker/Card Modules/QTL1688-05 - PCIe Card Module w Triggering Config v4.005 c1.xml +0 -0
  966. /quarchpy/connection_specific/QPS/{win-amd64/DeviceConfig → DeviceConfig}/breaker/Card Modules/QTL1848-01 - PCIe Lite Card Module Config v4.000.xml +0 -0
  967. /quarchpy/connection_specific/QPS/{win-amd64/DeviceConfig → DeviceConfig}/breaker/Card Modules/QTL1848-02 - PCIe Lite Card Module Config v4.000.xml +0 -0
  968. /quarchpy/connection_specific/QPS/{win-amd64/DeviceConfig → DeviceConfig}/breaker/Card Modules/QTL1919-01 - PCIe x8 Card Module Config v4.001 c1.4.xml +0 -0
  969. /quarchpy/connection_specific/QPS/{win-amd64/DeviceConfig → DeviceConfig}/breaker/Card Modules/QTL1920-01 - PCIe x8 Card Module w Triggering Config v4.000 c1.3.xml +0 -0
  970. /quarchpy/connection_specific/QPS/{win-amd64/DeviceConfig → DeviceConfig}/breaker/Card Modules/QTL2019-xx - M.2 Horizontal Card Module Config v4.002 c1.1.xml +0 -0
  971. /quarchpy/connection_specific/QPS/{win-amd64/DeviceConfig → DeviceConfig}/breaker/Card Modules/QTL2034-xx - M.2 M-Key Vertical Module Config v4.001 c1.1.xml +0 -0
  972. /quarchpy/connection_specific/QPS/{win-amd64/DeviceConfig → DeviceConfig}/breaker/Card Modules/QTL2067-xx - PCIe SFF Module Config v4.000 c1.1.xml +0 -0
  973. /quarchpy/connection_specific/QPS/{win-amd64/DeviceConfig → DeviceConfig}/breaker/Card Modules/QTL2067-xx - Sanblaze 2 Drive Riser Card Config v4.006 c1.4.xml +0 -0
  974. /quarchpy/connection_specific/QPS/{win-amd64/DeviceConfig → DeviceConfig}/breaker/Card Modules/QTL2067-xx - Sanblaze 2 Drive Riser Card Config v4.007 c1.4.xml +0 -0
  975. /quarchpy/connection_specific/QPS/{win-amd64/DeviceConfig → DeviceConfig}/breaker/Card Modules/QTL2073-01 - GEN3 PCIe Lite Card Module Config v4.001.xml +0 -0
  976. /quarchpy/connection_specific/QPS/{win-amd64/DeviceConfig → DeviceConfig}/breaker/Card Modules/QTL2073-01 - PCIe Lite Card Module Config v4.000.xml +0 -0
  977. /quarchpy/connection_specific/QPS/{win-amd64/DeviceConfig → DeviceConfig}/breaker/Card Modules/QTL2074-01 - GEN3 PCIe HS Card Module v4.005 c1.4.xml +0 -0
  978. /quarchpy/connection_specific/QPS/{win-amd64/DeviceConfig → DeviceConfig}/breaker/Card Modules/QTL2074-01 - PCIe Card Module Config CurrentLimit v4.004 c1.2.xml +0 -0
  979. /quarchpy/connection_specific/QPS/{win-amd64/DeviceConfig → DeviceConfig}/breaker/Card Modules/QTL2087-xx - PCIe GEN4 Card Module w Triggering Config v4.001 c1.1.xml +0 -0
  980. /quarchpy/connection_specific/QPS/{win-amd64/DeviceConfig → DeviceConfig}/breaker/Card Modules/QTL2087-xx - PCIe GEN4 Card Module w Triggering Config v4.001 c1.3.xml +0 -0
  981. /quarchpy/connection_specific/QPS/{win-amd64/DeviceConfig → DeviceConfig}/breaker/Card Modules/QTL2087-xx - PCIe GEN4 Card Module w Triggering Config v5.000 c1.4.xml +0 -0
  982. /quarchpy/connection_specific/QPS/{win-amd64/DeviceConfig → DeviceConfig}/breaker/Card Modules/QTL2094-01 - Sanblaze Dualport Riser Card Config v4.001 c1.1.xml +0 -0
  983. /quarchpy/connection_specific/QPS/{win-amd64/DeviceConfig → DeviceConfig}/breaker/Card Modules/QTL2128-xx - PCIe GEN4 Card Module w Triggering Config v4.000 c1.1.xml +0 -0
  984. /quarchpy/connection_specific/QPS/{win-amd64/DeviceConfig → DeviceConfig}/breaker/Card Modules/QTL2128-xx - PCIe GEN4 Card Module w Triggering Config v4.001 c1.4.xml +0 -0
  985. /quarchpy/connection_specific/QPS/{win-amd64/DeviceConfig → DeviceConfig}/breaker/Card Modules/QTL2135-xx - PCIe GEN4 Card Module w Triggering Config - Inrush Limit v4.001 c1.4.xml +0 -0
  986. /quarchpy/connection_specific/QPS/{win-amd64/DeviceConfig → DeviceConfig}/breaker/Card Modules/QTL2161-01 - EDSFF x8 Module Config v4.000 c1.1.xml +0 -0
  987. /quarchpy/connection_specific/QPS/{win-amd64/DeviceConfig → DeviceConfig}/breaker/Card Modules/QTL2171-xx - EDSFF x8 Module w Triggering Config 4.001 c1.1.xml +0 -0
  988. /quarchpy/connection_specific/QPS/{win-amd64/DeviceConfig → DeviceConfig}/breaker/Card Modules/QTL2203-01 - Sanblaze Dualport Rack Riser Card Config v4.000 c1.1.xml +0 -0
  989. /quarchpy/connection_specific/QPS/{win-amd64/DeviceConfig → DeviceConfig}/breaker/Card Modules/QTL2203-01 - Sanblaze Dualport Rack Riser Card Config v4.005 c1.5.xml +0 -0
  990. /quarchpy/connection_specific/QPS/{win-amd64/DeviceConfig → DeviceConfig}/breaker/Card Modules/QTL2272-01 - GEN4 EDSFF x8 Module Config v4.000 c1.1.xml +0 -0
  991. /quarchpy/connection_specific/QPS/{win-amd64/DeviceConfig → DeviceConfig}/breaker/Card Modules/QTL2282-01 - Sanblaze Singleport Rack Riser Card Config v4.000 c1.1.xml +0 -0
  992. /quarchpy/connection_specific/QPS/{win-amd64/DeviceConfig → DeviceConfig}/breaker/Card Modules/QTL2282-01 - Sanblaze Singleport Rack Riser Card Config v4.002 c1.2.xml +0 -0
  993. /quarchpy/connection_specific/QPS/{win-amd64/DeviceConfig → DeviceConfig}/breaker/Card Modules/QTL2318-01 - SANBlaze U.2 Rack Riser Card Config v4.000 c1.1.xml +0 -0
  994. /quarchpy/connection_specific/QPS/{win-amd64/DeviceConfig → DeviceConfig}/breaker/Card Modules/QTL2322-03 - GEN4 M.2 M-Key Vertical Breaker Module Config v5.001 c1.3.xml +0 -0
  995. /quarchpy/connection_specific/QPS/{win-amd64/DeviceConfig → DeviceConfig}/breaker/Card Modules/QTL2322-xx - GEN4 M.2 M-Key Vertical Breaker Module Config v5.000 c1.1.xml +0 -0
  996. /quarchpy/connection_specific/QPS/{win-amd64/DeviceConfig → DeviceConfig}/breaker/Card Modules/QTL2334-xx - Gen4 EDSFF x4 Card Module Config v4.000 c1.1.xml +0 -0
  997. /quarchpy/connection_specific/QPS/{win-amd64/DeviceConfig → DeviceConfig}/breaker/Card Modules/QTL2351-xx - GEN4 EDSFF x4 Card Module +Triggering Config v4.000 c1.1.xml +0 -0
  998. /quarchpy/connection_specific/QPS/{win-amd64/DeviceConfig → DeviceConfig}/breaker/Card Modules/QTL2351-xx - GEN4 EDSFF x4 Card Module +Triggering Config v4.001 c1.2.xml +0 -0
  999. /quarchpy/connection_specific/QPS/{win-amd64/DeviceConfig → DeviceConfig}/breaker/Card Modules/QTL2357-xx - PCIe GEN5 Card Module Config v5.000 c1.1.xml +0 -0
  1000. /quarchpy/connection_specific/QPS/{win-amd64/DeviceConfig → DeviceConfig}/breaker/Card Modules/QTL2358-xx - PCIe GEN5 Card Module w Triggering Config v5.000 c1.1.xml +0 -0
  1001. /quarchpy/connection_specific/QPS/{win-amd64/DeviceConfig → DeviceConfig}/breaker/Card Modules/QTL2378-xx - SANBlaze U.3 Rack Riser Card Config v4.000 c1.1.xml +0 -0
  1002. /quarchpy/connection_specific/QPS/{win-amd64/DeviceConfig → DeviceConfig}/breaker/Card Modules/QTL2378-xx - SANBlaze U.3 Rack Riser Card Config v4.001 c1.2.xml +0 -0
  1003. /quarchpy/connection_specific/QPS/{win-amd64/DeviceConfig → DeviceConfig}/breaker/Card Modules/QTL2395-01 - GEN4 M.2 M-Key Vertical Breaker Module w Triggering Config v5.000 c1.1.xml +0 -0
  1004. /quarchpy/connection_specific/QPS/{win-amd64/DeviceConfig → DeviceConfig}/breaker/Card Modules/QTL2395-02 - GEN4 M.2 M-Key Vertical Breaker Module w Triggering Config v5.001 c1.3.xml +0 -0
  1005. /quarchpy/connection_specific/QPS/{win-amd64/DeviceConfig → DeviceConfig}/breaker/Card Modules/QTL2395-03 - GEN4 M.2 M-Key Vertical Breaker Module w Triggering Config v5.001 c1.3.xml +0 -0
  1006. /quarchpy/connection_specific/QPS/{win-amd64/DeviceConfig → DeviceConfig}/breaker/Card Modules/QTL2396-xx - PCIe GEN5 Card Module w inrush Config v5.000 c1.1.xml +0 -0
  1007. /quarchpy/connection_specific/QPS/{win-amd64/DeviceConfig → DeviceConfig}/breaker/Card Modules/QTL2403-xx - Gen4 PCIe Lite Module Config v4.000.xml +0 -0
  1008. /quarchpy/connection_specific/QPS/{win-amd64/DeviceConfig → DeviceConfig}/breaker/Card Modules/QTL2515-xx - PCIe GEN4 Card Module w Triggering - Inrush Limit Config v4.001 c1.3.xml +0 -0
  1009. /quarchpy/connection_specific/QPS/{win-amd64/DeviceConfig → DeviceConfig}/breaker/Card Modules/QTL2652-xx - Gen5 PCIe Lite Module Config v4.000.xml +0 -0
  1010. /quarchpy/connection_specific/QPS/{win-amd64/DeviceConfig → DeviceConfig}/breaker/Card Modules/QTL2652-xx - Gen5 PCIe Lite Module Config v4.003.xml +0 -0
  1011. /quarchpy/connection_specific/QPS/{win-amd64/DeviceConfig → DeviceConfig}/breaker/Card Modules/QTL2658-xx - Gen5 PCIe Lite Module w Inrush Config v4.000.xml +0 -0
  1012. /quarchpy/connection_specific/QPS/{win-amd64/DeviceConfig → DeviceConfig}/breaker/Card Modules/QTL2661-xx - GEN5 PCIe U.3 Breaker Config w Triggering v5.000 c1.1.xml +0 -0
  1013. /quarchpy/connection_specific/QPS/{win-amd64/DeviceConfig → DeviceConfig}/breaker/Card Modules/QTL2662-xx - GEN5 PCIe U.3 Breaker Config v5.000 c1.1.xml +0 -0
  1014. /quarchpy/connection_specific/QPS/{win-amd64/DeviceConfig → DeviceConfig}/breaker/Card Modules/QTL2686-xx - Gen5 EDSFF E3 x4 Breaker Config v5.000.xml +0 -0
  1015. /quarchpy/connection_specific/QPS/{win-amd64/DeviceConfig → DeviceConfig}/breaker/Card Modules/QTL2686-xx - Gen5 EDSFF E3 x4 Breaker Config v5.001 c1.2.xml +0 -0
  1016. /quarchpy/connection_specific/QPS/{win-amd64/DeviceConfig → DeviceConfig}/breaker/Card Modules/QTL2686-xx - Gen5 EDSFF E3 x4 Breaker Config v5.002 c1.4.xml +0 -0
  1017. /quarchpy/connection_specific/QPS/{win-amd64/DeviceConfig → DeviceConfig}/breaker/Card Modules/QTL2686-xx - Gen5 EDSFF E3 x4 Breaker v5.000 c1.1.xml +0 -0
  1018. /quarchpy/connection_specific/QPS/{win-amd64/DeviceConfig → DeviceConfig}/breaker/Card Modules/QTL2692-xx - Gen5 EDSFF E3 x4 Breaker +Triggering Config v5.000.xml +0 -0
  1019. /quarchpy/connection_specific/QPS/{win-amd64/DeviceConfig → DeviceConfig}/breaker/Card Modules/QTL2692-xx - Gen5 EDSFF E3 x4 Breaker w Triggering Config v5.001 c1.2.xml +0 -0
  1020. /quarchpy/connection_specific/QPS/{win-amd64/DeviceConfig → DeviceConfig}/breaker/Card Modules/QTL2692-xx - Gen5 EDSFF E3 x4 Breaker w Triggering v5.000 c1.1.xml +0 -0
  1021. /quarchpy/connection_specific/QPS/{win-amd64/DeviceConfig → DeviceConfig}/breaker/Card Modules/QTL2766-xx - GEN4 EDSFF E1 x8 Breaker Config v5.000.xml +0 -0
  1022. /quarchpy/connection_specific/QPS/{win-amd64/DeviceConfig → DeviceConfig}/breaker/Card Modules/QTL2767-xx - GEN4 EDSFF E3 x8 Breaker Config v5.000.xml +0 -0
  1023. /quarchpy/connection_specific/QPS/{win-amd64/DeviceConfig → DeviceConfig}/breaker/Card Modules/QTL2768-xx - GEN4 EDSFF E3 2T x8 Breaker Config v5.000.xml +0 -0
  1024. /quarchpy/connection_specific/QPS/{win-amd64/DeviceConfig → DeviceConfig}/breaker/Card Modules/QTL2776-xx - GEN4 EDSFF E1 x8 Breaker +Triggering Config v5.000.xml +0 -0
  1025. /quarchpy/connection_specific/QPS/{win-amd64/DeviceConfig → DeviceConfig}/breaker/Card Modules/QTL2777-xx - GEN4 EDSFF E3 x8 Breaker +Triggering Config v5.000.xml +0 -0
  1026. /quarchpy/connection_specific/QPS/{win-amd64/DeviceConfig → DeviceConfig}/breaker/Card Modules/QTL2778-xx - GEN4 EDSFF E3 2T x8 Breaker +Triggering Config v5.000.xml +0 -0
  1027. /quarchpy/connection_specific/QPS/{win-amd64/DeviceConfig → DeviceConfig}/breaker/Card Modules/QTL2798-xx - PCIe GEN5 Card Module w Triggering w Inrush Limit Config v5.000 c1.1.xml +0 -0
  1028. /quarchpy/connection_specific/QPS/{win-amd64/DeviceConfig → DeviceConfig}/breaker/Card Modules/QTL2804-xx - GEN5 MCIO x4 to U.2 Breaker Config v5.000 c1.1.xml +0 -0
  1029. /quarchpy/connection_specific/QPS/{win-amd64/DeviceConfig → DeviceConfig}/breaker/Card Modules/QTL2805-xx - GEN5 MCIO x4 to U.2 Breaker + Triggering Config v5.000 c1.1.xml +0 -0
  1030. /quarchpy/connection_specific/QPS/{win-amd64/DeviceConfig → DeviceConfig}/breaker/Card Modules/QTL2813-xx - Gen5 AIC to U.2 Breaker v5.002 c1.3.xml +0 -0
  1031. /quarchpy/connection_specific/QPS/{win-amd64/DeviceConfig → DeviceConfig}/breaker/Card Modules/QTL2814-xx - GEN5 AIC to U.2 Breaker + Triggering Config v5.000 c1.1 .xml +0 -0
  1032. /quarchpy/connection_specific/QPS/{win-amd64/DeviceConfig → DeviceConfig}/breaker/Card Modules/QTL2814-xx - Gen5 AIC to U.2 Breaker + Triggering Config v5.002 c1.3.xml +0 -0
  1033. /quarchpy/connection_specific/QPS/{win-amd64/DeviceConfig → DeviceConfig}/breaker/Card Modules/QTL2892-xx - GEN5 EDSFF E1 x4 Breaker.xml +0 -0
  1034. /quarchpy/connection_specific/QPS/{win-amd64/DeviceConfig → DeviceConfig}/breaker/Card Modules/QTL2901-xx - GEN5 M.2 M-Key Horizontal Breaker Config v5.000 c1.1.xml +0 -0
  1035. /quarchpy/connection_specific/QPS/{win-amd64/DeviceConfig → DeviceConfig}/breaker/Card Modules/QTL2902-xx - GEN5 M.2 M-Key Horizontal Breaker w Triggering Config v5.000 c1.1.xml +0 -0
  1036. /quarchpy/connection_specific/QPS/{win-amd64/DeviceConfig → DeviceConfig}/breaker/Card Modules/QTL2902-xx- -Gen5 M.2 Horizontal Breaker +Triggering Config 5.000 c1.1.xml +0 -0
  1037. /quarchpy/connection_specific/QPS/{win-amd64/DeviceConfig → DeviceConfig}/breaker/Card Modules/QTL2925-xx - GEN5 EDSFF E1 x4 Breaker +Triggering.xml +0 -0
  1038. /quarchpy/connection_specific/QPS/{win-amd64/DeviceConfig → DeviceConfig}/breaker/Card Modules/QTL2954-01 - fake delete.xml +0 -0
  1039. /quarchpy/connection_specific/QPS/{win-amd64/DeviceConfig → DeviceConfig}/breaker/Drive Modules/QTL1177-xx - HS Module Config v3.5 c1.5.xml +0 -0
  1040. /quarchpy/connection_specific/QPS/{win-amd64/DeviceConfig → DeviceConfig}/breaker/Drive Modules/QTL1177-xx - HS Module Config v4.000 c1.5.xml +0 -0
  1041. /quarchpy/connection_specific/QPS/{win-amd64/DeviceConfig → DeviceConfig}/breaker/Drive Modules/QTL1177-xx - HS Module Config v4.006 c1.8.xml +0 -0
  1042. /quarchpy/connection_specific/QPS/{win-amd64/DeviceConfig → DeviceConfig}/breaker/Drive Modules/QTL1215-xx - Lite Module Config v3.50.xml +0 -0
  1043. /quarchpy/connection_specific/QPS/{win-amd64/DeviceConfig → DeviceConfig}/breaker/Drive Modules/QTL1215-xx - Lite Module Config v4.000.xml +0 -0
  1044. /quarchpy/connection_specific/QPS/{win-amd64/DeviceConfig → DeviceConfig}/breaker/Drive Modules/QTL1301-xx - HS Lite Module Config v3.50.xml +0 -0
  1045. /quarchpy/connection_specific/QPS/{win-amd64/DeviceConfig → DeviceConfig}/breaker/Drive Modules/QTL1301-xx - HS Lite Module Config v4.000.xml +0 -0
  1046. /quarchpy/connection_specific/QPS/{win-amd64/DeviceConfig → DeviceConfig}/breaker/Drive Modules/QTL1429-01 - EMC HS Lite Module Config v4.000.xml +0 -0
  1047. /quarchpy/connection_specific/QPS/{win-amd64/DeviceConfig → DeviceConfig}/breaker/Drive Modules/QTL1429-02 - EMC HS Lite Module Config v4.002.xml +0 -0
  1048. /quarchpy/connection_specific/QPS/{win-amd64/DeviceConfig → DeviceConfig}/breaker/Drive Modules/QTL1623-03 - 12G HS Lite Module Config v4.001.xml +0 -0
  1049. /quarchpy/connection_specific/QPS/{win-amd64/DeviceConfig → DeviceConfig}/breaker/Drive Modules/QTL1623-04 - 12G HS Lite Module Config v4.001.xml +0 -0
  1050. /quarchpy/connection_specific/QPS/{win-amd64/DeviceConfig → DeviceConfig}/breaker/Drive Modules/QTL1680-xx - SCA2 Lite Module Config v4.001.xml +0 -0
  1051. /quarchpy/connection_specific/QPS/{win-amd64/DeviceConfig → DeviceConfig}/breaker/Drive Modules/QTL1689-01 - 12G HS Module Config v4.001 c1.1.xml +0 -0
  1052. /quarchpy/connection_specific/QPS/{win-amd64/DeviceConfig → DeviceConfig}/breaker/Drive Modules/QTL1689-04 - 12G HS Module Config v4.002 c1.1.xml +0 -0
  1053. /quarchpy/connection_specific/QPS/{win-amd64/DeviceConfig → DeviceConfig}/breaker/Drive Modules/QTL1689-05 - 12G HS Module Config v4.002 c1.1.xml +0 -0
  1054. /quarchpy/connection_specific/QPS/{win-amd64/DeviceConfig → DeviceConfig}/breaker/Drive Modules/QTL1743-02 - PCIe SFF Module Config v4.003 c1.3.xml +0 -0
  1055. /quarchpy/connection_specific/QPS/{win-amd64/DeviceConfig → DeviceConfig}/breaker/Drive Modules/QTL1743-02 - PCIe SFF Module Config v4.006 c1.4.xml +0 -0
  1056. /quarchpy/connection_specific/QPS/{win-amd64/DeviceConfig → DeviceConfig}/breaker/Drive Modules/QTL1743-xx - PCIe SFF Module Config v4.000 c1.1.xml +0 -0
  1057. /quarchpy/connection_specific/QPS/{win-amd64/DeviceConfig → DeviceConfig}/breaker/Drive Modules/QTL1753-xx - 12G Lite Module Config v4.000.xml +0 -0
  1058. /quarchpy/connection_specific/QPS/{win-amd64/DeviceConfig → DeviceConfig}/breaker/Drive Modules/QTL1921-01 - EMC 12G HS Lite Module Config v4.000.xml +0 -0
  1059. /quarchpy/connection_specific/QPS/{win-amd64/DeviceConfig → DeviceConfig}/breaker/Drive Modules/QTL2207-01 - GEN 4 PCIe U.2 Drive Module.xml +0 -0
  1060. /quarchpy/connection_specific/QPS/{win-amd64/DeviceConfig → DeviceConfig}/breaker/Drive Modules/QTL2207-02 - GEN 4 PCIe U.2 Drive Module v5.000.xml +0 -0
  1061. /quarchpy/connection_specific/QPS/{win-amd64/DeviceConfig → DeviceConfig}/breaker/Drive Modules/QTL2207-03 - GEN 4 PCIe SFF HS Drive Module Triggering v5.001.xml +0 -0
  1062. /quarchpy/connection_specific/QPS/{win-amd64/DeviceConfig → DeviceConfig}/breaker/Drive Modules/QTL2207-xx - GEN 4 PCIe U.2 Drive Module v4.001.xml +0 -0
  1063. /quarchpy/connection_specific/QPS/{win-amd64/DeviceConfig → DeviceConfig}/breaker/Drive Modules/QTL2207-xx - GEN 4 PCIe U.2 Drive Module.xml +0 -0
  1064. /quarchpy/connection_specific/QPS/{win-amd64/DeviceConfig → DeviceConfig}/breaker/Drive Modules/QTL2245-01 - GEN 4 PCIe U.3 HS Drive Module v4.000.xml +0 -0
  1065. /quarchpy/connection_specific/QPS/{win-amd64/DeviceConfig → DeviceConfig}/breaker/Drive Modules/QTL2245-xx - GEN 4 PCIe U.3 HS Drive Module.xml +0 -0
  1066. /quarchpy/connection_specific/QPS/{win-amd64/DeviceConfig → DeviceConfig}/breaker/Drive Modules/QTL2266-01 - GEN 4 PCIe SFF HS Drive Module Triggering.xml +0 -0
  1067. /quarchpy/connection_specific/QPS/{win-amd64/DeviceConfig → DeviceConfig}/breaker/Drive Modules/QTL2266-02 - GEN 4 PCIe SFF HS Drive Module Triggering v4.002.xml +0 -0
  1068. /quarchpy/connection_specific/QPS/{win-amd64/DeviceConfig → DeviceConfig}/breaker/Drive Modules/QTL2266-03 - GEN 4 PCIe SFF HS Drive Module Triggering v5.001.xml +0 -0
  1069. /quarchpy/connection_specific/QPS/{win-amd64/DeviceConfig → DeviceConfig}/breaker/Drive Modules/QTL2266-XX - GEN 4 PCIe SFF HS Drive Module Triggering.xml +0 -0
  1070. /quarchpy/connection_specific/QPS/{win-amd64/DeviceConfig → DeviceConfig}/breaker/Drive Modules/QTL2270-01 - GEN 4 PCIe U.3 HS Drive Module Triggering v4.000.xml +0 -0
  1071. /quarchpy/connection_specific/QPS/{win-amd64/DeviceConfig → DeviceConfig}/breaker/Drive Modules/QTL2270-xx - GEN 4 PCIe U.3 HS Drive Module Triggering.xml +0 -0
  1072. /quarchpy/connection_specific/QPS/{win-amd64/DeviceConfig → DeviceConfig}/breaker/Drive Modules/QTL2542-02 - 24G SAS Drive Breaker Module v5.001.xml +0 -0
  1073. /quarchpy/connection_specific/QPS/{win-amd64/DeviceConfig → DeviceConfig}/breaker/Drive Modules/QTL2542-xx - 24G SAS Drive Breaker v5.000 c1.1.xml +0 -0
  1074. /quarchpy/connection_specific/QPS/{win-amd64/DeviceConfig → DeviceConfig}/breaker/Drive Modules/QTL2543-xx - 24G SAS Drive Breaker +Triggering v5.000 c1.1.xml +0 -0
  1075. /quarchpy/connection_specific/QPS/{win-amd64/DeviceConfig → DeviceConfig}/breaker/Drive Modules/QTL2543-xx - 24G SAS Drive Breaker +Triggering v5.001 c1.3.xml +0 -0
  1076. /quarchpy/connection_specific/QPS/{win-amd64/DeviceConfig → DeviceConfig}/breaker/Drive Modules/QTL2602-xx - Multiprotocol Link Breaker.xml +0 -0
  1077. /quarchpy/connection_specific/QPS/{win-amd64/DeviceConfig → DeviceConfig}/breaker/Drive Modules/QTL2645-xx - Gen5 PCIe U.2 Drive Module v5.000.xml +0 -0
  1078. /quarchpy/connection_specific/QPS/{win-amd64/DeviceConfig → DeviceConfig}/breaker/Drive Modules/QTL2645-xx - Gen5 PCIe U.2 Drive Module v5.001.xml +0 -0
  1079. /quarchpy/connection_specific/QPS/{win-amd64/DeviceConfig → DeviceConfig}/breaker/Drive Modules/QTL2645-xx - Gen5 PCIe U.2 Drive Module v5.003.xml +0 -0
  1080. /quarchpy/connection_specific/QPS/{win-amd64/DeviceConfig → DeviceConfig}/breaker/Drive Modules/QTL2645-xx - Gen5 PCIe U.2 Drive Module v5.007.xml +0 -0
  1081. /quarchpy/connection_specific/QPS/{win-amd64/DeviceConfig → DeviceConfig}/breaker/Drive Modules/QTL2645-xx - Gen5 PCIe U.2 Drive Module v5.008.xml +0 -0
  1082. /quarchpy/connection_specific/QPS/{win-amd64/DeviceConfig → DeviceConfig}/breaker/Drive Modules/QTL2651-xx - Gen5 PCIe U.2 Drive Module + Triggering v5.000.xml +0 -0
  1083. /quarchpy/connection_specific/QPS/{win-amd64/DeviceConfig → DeviceConfig}/breaker/Drive Modules/QTL2651-xx - Gen5 PCIe U.2 Drive Module + Triggering v5.001.xml +0 -0
  1084. /quarchpy/connection_specific/QPS/{win-amd64/DeviceConfig → DeviceConfig}/breaker/Drive Modules/QTL2651-xx - Gen5 PCIe U.2 Drive Module + Triggering v5.003.xml +0 -0
  1085. /quarchpy/connection_specific/QPS/{win-amd64/DeviceConfig → DeviceConfig}/breaker/Drive Modules/QTL2651-xx - Gen5 PCIe U.2 Drive Module v5.007.xml +0 -0
  1086. /quarchpy/connection_specific/QPS/{win-amd64/DeviceConfig → DeviceConfig}/breaker/Drive Modules/QTL2661-xx - Gen5 U.3 Drive Module + Triggering v5.000.xml +0 -0
  1087. /quarchpy/connection_specific/QPS/{win-amd64/DeviceConfig → DeviceConfig}/breaker/Drive Modules/QTL2662-xx - Gen5 PCIe U.3 Drive Module v5.000.xml +0 -0
  1088. /quarchpy/connection_specific/QPS/{win-amd64/DeviceConfig → DeviceConfig}/breaker/Drive Modules/QTL2757-xx - Gen5 SFF Lite Breaker Module Config v4.000.xml +0 -0
  1089. /quarchpy/connection_specific/QPS/{win-amd64/DeviceConfig → DeviceConfig}/breaker/Drive Modules/QTL2804-xx - Gen5 MCIO to U.2 Breaker +Triggering v5.003.xml +0 -0
  1090. /quarchpy/connection_specific/QPS/{win-amd64/DeviceConfig → DeviceConfig}/breaker/Drive Modules/QTL2804-xx - Gen5 MCIO to U.2 Breaker v5.001.xml +0 -0
  1091. /quarchpy/connection_specific/QPS/{win-amd64/DeviceConfig → DeviceConfig}/breaker/Drive Modules/QTL2805-xx - Gen5 MCIO to U.2 Breaker +Triggering v5.001.xml +0 -0
  1092. /quarchpy/connection_specific/QPS/{win-amd64/DeviceConfig → DeviceConfig}/breaker/Drive Modules/QTL2805-xx - Gen5 MCIO to U.2 Breaker +Triggering v5.002.xml +0 -0
  1093. /quarchpy/connection_specific/QPS/{win-amd64/DeviceConfig → DeviceConfig}/breaker/Drive Modules/QTL2805-xx - Gen5 MCIO to U.2 Breaker +Triggering v5.003.xml +0 -0
  1094. /quarchpy/connection_specific/QPS/{win-amd64/DeviceConfig → DeviceConfig}/breaker/Drive Modules/QTL2892-xx - Gen5 EDSFF E1 x4 Breaker v5.001.xml +0 -0
  1095. /quarchpy/connection_specific/QPS/{win-amd64/DeviceConfig → DeviceConfig}/breaker/Drive Modules/QTL2892-xx - Gen5 EDSFF E1 x4 Breaker v5.002.xml +0 -0
  1096. /quarchpy/connection_specific/QPS/{win-amd64/DeviceConfig → DeviceConfig}/breaker/Drive Modules/QTL2940-xx - Gen5 EDSFF E3 x8 Breaker v5.000.xml +0 -0
  1097. /quarchpy/connection_specific/QPS/{win-amd64/DeviceConfig → DeviceConfig}/breaker/Drive Modules/QTL2941-xx - Gen5 EDSFF E3 x8 Breaker +Triggering v5.000.xml +0 -0
  1098. /quarchpy/connection_specific/QPS/{win-amd64/DeviceConfig → DeviceConfig}/breaker/Drive Modules/Standard Drive Module Config v3.5 c1.1.xml +0 -0
  1099. /quarchpy/connection_specific/QPS/{win-amd64/DeviceConfig → DeviceConfig}/breaker/Switch Modules/QTL1490-xx - SATA Keyed HS Module Config v4.003 c1.6.xml +0 -0
  1100. /quarchpy/connection_specific/QPS/{win-amd64/DeviceConfig → DeviceConfig}/breaker/Switch Modules/QTL1490-xx - SATA Keyed HS Module Config v4.006 c1.8.xml +0 -0
  1101. /quarchpy/connection_specific/QPS/{win-amd64/DeviceConfig → DeviceConfig}/colors/default-colors.properties +0 -0
  1102. /quarchpy/connection_specific/QPS/{win-amd64/DeviceConfig → DeviceConfig}/colors/qtl2789-colors.properties +0 -0
  1103. /quarchpy/connection_specific/QPS/{win-amd64/DeviceConfig → DeviceConfig}/default.xml +0 -0
  1104. /quarchpy/connection_specific/QPS/{win-amd64/InstallType.dat → InstallType.dat} +0 -0
  1105. /quarchpy/connection_specific/QPS/{win-amd64/license.txt → license.txt} +0 -0
  1106. /quarchpy/connection_specific/QPS/{win-amd64/qis → qis}/README.txt +0 -0
  1107. /quarchpy/connection_specific/QPS/{win-amd64/qis → qis}/disableterminal.txt +0 -0
  1108. /quarchpy/connection_specific/QPS/{win-amd64/qis → qis}/license.txt +0 -0
  1109. /quarchpy/connection_specific/QPS/{win-amd64/qis → qis}/qis_lib/Collections-2.4.jar +0 -0
  1110. /quarchpy/connection_specific/QPS/{win-amd64/qis → qis}/qis_lib/Desktop-1.1.jar +0 -0
  1111. /quarchpy/connection_specific/QPS/{win-amd64/qis → qis}/qis_lib/Executor-3.13.jar +0 -0
  1112. /quarchpy/connection_specific/QPS/{win-amd64/qis → qis}/qis_lib/JNA-1.2.jar +0 -0
  1113. /quarchpy/connection_specific/QPS/{win-amd64/qis → qis}/qis_lib/OS-1.8.jar +0 -0
  1114. /quarchpy/connection_specific/QPS/{win-amd64/qis → qis}/qis_lib/SystemTray-4.4.jar +0 -0
  1115. /quarchpy/connection_specific/QPS/{win-amd64/qis → qis}/qis_lib/Updates-1.1.jar +0 -0
  1116. /quarchpy/connection_specific/QPS/{win-amd64/qis → qis}/qis_lib/Utilities-1.46.jar +0 -0
  1117. /quarchpy/connection_specific/QPS/{win-amd64/qps_lib → qis/qis_lib}/gson-2.13.1.jar +0 -0
  1118. /quarchpy/connection_specific/QPS/{win-amd64/qis → qis}/qis_lib/istack-commons-runtime-3.0.11.jar +0 -0
  1119. /quarchpy/connection_specific/QPS/{win-amd64/qis → qis}/qis_lib/jakarta.activation-api-2.1.0.jar +0 -0
  1120. /quarchpy/connection_specific/QPS/{win-amd64/qis → qis}/qis_lib/jakarta.xml.bind-api-4.0.0.jar +0 -0
  1121. /quarchpy/connection_specific/QPS/{win-amd64/qis → qis}/qis_lib/javassist-3.29.2-GA.jar +0 -0
  1122. /quarchpy/connection_specific/QPS/{win-amd64/qis → qis}/qis_lib/jaxb-core-4.0.0.jar +0 -0
  1123. /quarchpy/connection_specific/QPS/{win-amd64/qis → qis}/qis_lib/jaxb-runtime-4.0.0.jar +0 -0
  1124. /quarchpy/connection_specific/QPS/{win-amd64/qis → qis}/qis_lib/jmdns-3.6.0.jar +0 -0
  1125. /quarchpy/connection_specific/QPS/{win-amd64/qis → qis}/qis_lib/jna-jpms-5.12.1.jar +0 -0
  1126. /quarchpy/connection_specific/QPS/{win-amd64/qis → qis}/qis_lib/jna-platform-jpms-5.12.1.jar +0 -0
  1127. /quarchpy/connection_specific/QPS/{win-amd64/qis → qis}/qis_lib/kotlin-stdlib-1.9.21.jar +0 -0
  1128. /quarchpy/connection_specific/QPS/{win-amd64/qis → qis}/resources/QuarchIcon_128x128.png +0 -0
  1129. /quarchpy/connection_specific/QPS/{win-amd64/qis → qis}/resources/QuarchIcon_16x16.png +0 -0
  1130. /quarchpy/connection_specific/QPS/{win-amd64/qis → qis}/resources/QuarchIcon_256x256.png +0 -0
  1131. /quarchpy/connection_specific/QPS/{win-amd64/qis → qis}/resources/QuarchIcon_32x32.png +0 -0
  1132. /quarchpy/connection_specific/QPS/{win-amd64/qis → qis}/resources/QuarchIcon_64x64.png +0 -0
  1133. /quarchpy/connection_specific/QPS/{win-amd64/qis → qis}/resources/filters/Example.txt +0 -0
  1134. /quarchpy/connection_specific/QPS/{win-amd64/qis → qis}/resources/filters/iec_filters.xml +0 -0
  1135. /quarchpy/connection_specific/QPS/{win-amd64/qis → qis}/resources/org/usb4java/darwin-x86-64/libusb4java.dylib +0 -0
  1136. /quarchpy/connection_specific/QPS/{win-amd64/qis → qis}/resources/org/usb4java/linux-aarch64/libusb4java.so +0 -0
  1137. /quarchpy/connection_specific/QPS/{win-amd64/qis → qis}/resources/org/usb4java/linux-arm/libusb4java.so +0 -0
  1138. /quarchpy/connection_specific/QPS/{win-amd64/qis → qis}/resources/org/usb4java/linux-x86/libusb4java.so +0 -0
  1139. /quarchpy/connection_specific/QPS/{win-amd64/qis → qis}/resources/org/usb4java/linux-x86-64/libusb4java.so +0 -0
  1140. /quarchpy/connection_specific/QPS/{win-amd64/qis → qis}/resources/org/usb4java/win32-x86/libusb4java.dll +0 -0
  1141. /quarchpy/connection_specific/QPS/{win-amd64/qis → qis}/resources/org/usb4java/win32-x86-64/libusb4java.dll +0 -0
  1142. /quarchpy/connection_specific/QPS/{win-amd64/qis.properties.xml → qis.properties.xml} +0 -0
  1143. /quarchpy/connection_specific/QPS/{win-amd64/qps_lib → qps_lib}/argparse4j-0.9.0.jar +0 -0
  1144. /quarchpy/connection_specific/QPS/{win-amd64/qps_lib → qps_lib}/commons-io-2.19.0.jar +0 -0
  1145. /quarchpy/connection_specific/QPS/{win-amd64/qps_lib → qps_lib}/controlsfx-11.2.2.jar +0 -0
  1146. /quarchpy/connection_specific/QPS/{win-amd64/qps_lib → qps_lib}/guava-33.4.8-jre.jar +0 -0
  1147. /quarchpy/connection_specific/QPS/{win-amd64/qps_lib → qps_lib}/istack-commons-runtime-3.0.11.jar +0 -0
  1148. /quarchpy/connection_specific/QPS/{win-amd64/qps_lib → qps_lib}/jakarta.activation-api-2.1.0.jar +0 -0
  1149. /quarchpy/connection_specific/QPS/{win-amd64/qps_lib → qps_lib}/jakarta.xml.bind-api-4.0.0.jar +0 -0
  1150. /quarchpy/connection_specific/QPS/{win-amd64/qps_lib → qps_lib}/jaxb-core-4.0.0.jar +0 -0
  1151. /quarchpy/connection_specific/QPS/{win-amd64/qps_lib → qps_lib}/jaxb-runtime-4.0.0.jar +0 -0
  1152. /quarchpy/connection_specific/QPS/{win-amd64/qps_lib → qps_lib}/txw2-4.0.0.jar +0 -0
  1153. /quarchpy/connection_specific/QPS/{win-amd64/resources → resources}/InstallBanner.bmp +0 -0
  1154. /quarchpy/connection_specific/QPS/{win-amd64/resources → resources}/QPS.icns +0 -0
  1155. /quarchpy/connection_specific/QPS/{win-amd64/resources → resources}/QPS.ico +0 -0
  1156. /quarchpy/connection_specific/QPS/{win-amd64/resources → resources}/QPS.png +0 -0
  1157. /quarchpy/connection_specific/QPS/{win-amd64/resources → resources}/QuarchIcon_128x128.png +0 -0
  1158. /quarchpy/connection_specific/QPS/{win-amd64/resources → resources}/QuarchIcon_16x16.png +0 -0
  1159. /quarchpy/connection_specific/QPS/{win-amd64/resources → resources}/QuarchIcon_256x256.png +0 -0
  1160. /quarchpy/connection_specific/QPS/{win-amd64/resources → resources}/QuarchIcon_32x32.png +0 -0
  1161. /quarchpy/connection_specific/QPS/{win-amd64/resources → resources}/QuarchIcon_64x64.png +0 -0
  1162. /quarchpy/connection_specific/QPS/{win-amd64/resources → resources}/profiles/3_PHASE_PAM_AC_DEFAULT.rcf +0 -0
  1163. /quarchpy/connection_specific/QPS/{win-amd64/resources → resources}/profiles/3_PHASE_PAM_AC_DEFAULT.scf +0 -0
  1164. /quarchpy/connection_specific/QPS/{win-amd64/resources → resources}/profiles/3_PHASE_PAM_AC_FULL.rcf +0 -0
  1165. /quarchpy/connection_specific/QPS/{win-amd64/resources → resources}/profiles/3_PHASE_PAM_AC_FULL.scf +0 -0
  1166. /quarchpy/connection_specific/QPS/{win-amd64/resources → resources}/profiles/PAM_EXAMPLE_CONFIG.rcf +0 -0
  1167. {quarchpy-2.2.12.dev1.dist-info → quarchpy-2.2.13.dev1.dist-info}/WHEEL +0 -0
  1168. {quarchpy-2.2.12.dev1.dist-info → quarchpy-2.2.13.dev1.dist-info}/top_level.txt +0 -0
@@ -1,15 +1,15 @@
1
- import socket
2
- import re
3
1
  import gzip
4
- import datetime
5
- import select
2
+ import re
3
+ import socket
6
4
  import threading
7
- import struct
8
- from io import StringIO
9
- from quarchpy.user_interface import *
10
5
  import xml.etree.ElementTree as ET
6
+ from io import StringIO
7
+
8
+ import select
11
9
  from connection_specific.StreamChannels import StreamGroups
12
10
 
11
+ from quarchpy.user_interface import *
12
+
13
13
 
14
14
  # QisInterface provides a way of connecting to a Quarch backend running at the specified ip address and port, defaults to localhost and 9722
15
15
  class QisInterface:
@@ -25,7 +25,7 @@ class QisInterface:
25
25
  self.deviceList = []
26
26
  self.deviceDict = {}
27
27
  self.dictSemaphore = threading.Semaphore()
28
- self.connect(connectionMessage = connectionMessage)
28
+ self.connect(connection_message = connectionMessage)
29
29
  self.stripesEvent = threading.Event()
30
30
 
31
31
  self.qps_stream_header = None
@@ -44,47 +44,70 @@ class QisInterface:
44
44
  self.pythonVersion = sys.version[0]
45
45
  self.cursor = '>'
46
46
  #clear packets
47
- welcomeString = self.streamSock.recv(self.maxRxBytes).rstrip()
47
+ welcome_string = self.streamSock.recv(self.maxRxBytes).rstrip()
48
48
 
49
49
 
50
- def connect(self, connectionMessage = True):
51
- '''
52
- Connect() tries to open a socket on the host and port specified in the objects variables
53
- If successful it returns the backends welcome string. If it fails it returns a string saying unable to connect
54
- The backend should be running and host and port set before running this function. Normally it should be called at the beggining
55
- of talking to the backend and left open until finished talking when the disconnect() function should be ran
50
+ def connect(self, connection_message: bool = True) -> str:
51
+ """
52
+ Opens the connection to the QIS backend
53
+
54
+ Args:
55
+ connection_message:
56
+ Defaults to True. If set to False, suppresses the warning message about an
57
+ instance already running on the specified port. This can be useful when
58
+ using `isQisRunning()` from `qisFuncs`.
59
+
60
+ Raises:
61
+ Exception:
62
+ If the connection fails or the welcome string is not received an exception is raised
63
+
64
+ Returns:
65
+ The welcome string received from the backend server upon a successful
66
+ connection. This will confirm the QIS version but is generally not used other than
67
+ for debugging
68
+ """
56
69
 
57
- Param:
58
- connectionMessage: boolean, optional
59
- Set to False if you don't want a warning message to appear when an instance is already running on that port. Useful when using isQisRunning() from qisFuncs
60
- '''
61
70
  try:
62
- self.deviceDictSetup('QIS')
71
+ self.device_dict_setup('QIS')
63
72
  self.sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
64
73
  self.sock.settimeout(5)
65
74
  self.sock.connect((self.host, self.port))
66
75
 
67
76
  #clear packets
68
77
  try:
69
- welcomeString = self.sock.recv(self.maxRxBytes).rstrip()
70
- welcomeString = 'Connected@' + str(self.host) + ':' + str(self.port) + ' ' + '\n ' + str(welcomeString)
71
- self.deviceDict['QIS'][0:3] = [False, 'Connected', welcomeString]
72
- return welcomeString
78
+ welcome_string = self.sock.recv(self.maxRxBytes).rstrip()
79
+ welcome_string = 'Connected@' + str(self.host) + ':' + str(self.port) + ' ' + '\n ' + str(welcome_string)
80
+ self.deviceDict['QIS'][0:3] = [False, 'Connected', welcome_string]
81
+ return welcome_string
73
82
  except Exception as e:
74
83
  logging.error('No welcome received. Unable to connect to Quarch backend on specified host and port (' + self.host + ':' + str(self.port) + ')')
75
84
  logging.error('Is backend running and host accessible?')
76
85
  self.deviceDict['QIS'][0:3] = [True, 'Disconnected', 'Unable to connect to QIS']
77
86
  raise e
78
87
  except Exception as e:
79
- self.deviceDictSetup('QIS')
80
- if connectionMessage:
88
+ self.device_dict_setup('QIS')
89
+ if connection_message:
81
90
  logging.error('Unable to connect to Quarch backend on specified host and port (' + self.host + ':' + str(self.port) + ').')
82
91
  logging.error('Is backend running and host accessible?')
83
92
  self.deviceDict['QIS'][0:3] = [True, 'Disconnected', 'Unable to connect to QIS']
84
93
  raise e
85
94
 
86
- # Tries to close the socket to specified host and port.
87
- def disconnect(self):
95
+
96
+ def disconnect(self) -> str:
97
+ """
98
+ Disconnects the current connection to the QIS backend.
99
+
100
+ This method attempts to gracefully disconnect from the backend server and updates
101
+ the connection state in the device dictionary. If an error occurs during the
102
+ disconnection process, the state is updated to indicate the failure, and the
103
+ exception is re-raised
104
+
105
+ Returns:
106
+ str: A message indicating that the disconnection process has started.
107
+
108
+ Raises:
109
+ Exception: Propagates any exception that occurs during the disconnection process.
110
+ """
88
111
  res = 'Disconnecting from backend'
89
112
  try:
90
113
  self.sock.shutdown(socket.SHUT_RDWR)
@@ -98,368 +121,383 @@ class QisInterface:
98
121
  raise e
99
122
  return res
100
123
 
101
- def closeConnection(self, sock=None, conString=None):
124
+ def close_connection(self, sock=None, con_string: str=None) -> str:
125
+ """
126
+ Orders QIS to release a given device (or all devices if no connection string is specified)
127
+ This is more important for TCP connected devices as the socket is held open until
128
+ specifically released.
129
+
130
+ Args:
131
+ sock:
132
+ The socket object to close the connection to. Defaults to the existing socket.
133
+ con_string:
134
+ Specify the device ID to close, otherwise all devices will be closed
135
+
136
+ Raises:
137
+ ConnectionResetError: Raised if the socket connection has already been reset.
138
+
139
+ Returns:
140
+ The response received after sending the close command. On success, this will be: 'OK'
141
+
142
+ """
102
143
  if sock is None:
103
144
  sock = self.sock
104
- if conString is None:
145
+ if con_string is None:
105
146
  cmd = "close"
106
147
  else:
107
- cmd = conString + " close"
148
+ cmd = con_string + " close"
108
149
  try:
109
150
  response = self.sendAndReceiveText(sock, cmd)
110
151
  return response
111
152
  except ConnectionResetError:
112
- logging.warning('Unable to close connection to QIS, QIS may be already closed')
113
- return None
153
+ logging.error('Unable to close connection to device(s), QIS may be already closed')
154
+ return "FAIL: Unable to close connection to device(s), QIS may be already closed"
114
155
 
115
- def startStream(self, module, fileName, fileMaxMB, streamName, streamAverage, releaseOnData, separator, streamDuration=None, inMemoryData=None, outputFileHandle=None, useGzip=None):
156
+ def start_stream(self, module: str, file_name: str, max_file_size: int, release_on_data: bool, separator: str, stream_duration: float=None, in_memory_data: StringIO=None, output_file_handle=None, use_gzip: bool=None):
157
+ """
158
+ Begins a stream process which will record data from the module to a CSV file or in memory CSV equivalent
159
+
160
+ Args:
161
+ module:
162
+ The ID of the module for which the stream is being initiated.
163
+ file_name:
164
+ The target file path+name for storing the streamed data in CSV form.
165
+ max_file_size:
166
+ The maximum size in megabytes allowed for the output file.
167
+ release_on_data:
168
+ If set, blocks further streams until this one has started
169
+ separator:
170
+ The value separator used to format the streamed CSV data.
171
+ stream_duration:
172
+ The duration (in seconds) for which the streaming process should run. Unlimited if None.
173
+ in_memory_data:
174
+ An in memory CSV StringIO as an alternate to file output
175
+ output_file_handle:
176
+ A file handle to an output file where the stream data is written as an alternate to a file name
177
+ use_gzip:
178
+ A flag indicating whether the output file should be compressed using gzip to reduce disk use
179
+
180
+ Returns:
181
+ None
182
+ """
116
183
  self.StreamRunSentSemaphore.acquire()
117
- self.deviceDictSetup('QIS')
118
- i = self.deviceMulti(module)
184
+ self.device_dict_setup('QIS')
185
+ i = self.device_control_index(module)
119
186
  self.stopFlagList[i] = True
120
187
  self.stripesEvent.set()
121
188
  self.module_xml_header = None
122
189
 
123
- # Create the thread
124
- t1 = threading.Thread(target=self.startStreamThread, name=module,
125
- args=(module, fileName, fileMaxMB, streamName, streamAverage, releaseOnData, separator, streamDuration, inMemoryData, outputFileHandle, useGzip))
190
+ # Create the worker thread to handle stream processing
191
+ t1 = threading.Thread(target=self.start_stream_thread, name=module,
192
+ args=(module, file_name, max_file_size, release_on_data, separator, stream_duration, in_memory_data, output_file_handle, use_gzip))
126
193
  # Start the thread
127
194
  t1.start()
128
195
 
129
- # count = 0
130
- while (self.stripesEvent.is_set()):
131
- # count += 1 --debugging to show delay
196
+ while self.stripesEvent.is_set():
132
197
  pass
133
- # just wait until event is cleared
134
198
 
135
- def startStreamQPS(self, module, fileName, fileMaxMB, streamName, streamAverage, releaseOnData, separator):
136
- self.StreamRunSentSemaphore.acquire()
137
- self.deviceDictSetup('QIS')
138
- i = self.deviceMulti(module)
139
- self.stopFlagList[i] = True
140
- self.stripesEvent.set()
141
- self.module_xml_header = None
199
+ def stop_stream(self, module, blocking:bool = True):
200
+ """
142
201
 
143
- # Create the thread
144
- t1 = threading.Thread(target=self.startStreamThreadQPS, name=module,
145
- args=(module, fileName, fileMaxMB, streamName, streamAverage, releaseOnData, separator))
146
- # Start the thread
147
- t1.start()
202
+ Args:
203
+ module:
204
+ The quarchPPM module instance for which the streaming process is to be stopped.
205
+ blocking:
206
+ If set to True, the function will block and wait until the module has
207
+ completely stopped streaming. Defaults to True.
148
208
 
149
- # count = 0
150
- while (self.stripesEvent.is_set()):
151
- # count += 1 --debugging to show delay
152
- pass
153
- # just wait until event is cleared
209
+ Returns:
210
+ None
154
211
 
155
- def stopStream(self, module, blocking = True):
156
- moduleName=module.ConString
157
- i = self.deviceMulti(moduleName)
212
+ """
213
+
214
+ module_name=module.ConString
215
+ i = self.device_control_index(module_name)
158
216
  self.stopFlagList[i] = False
159
- # Wait until the stream thread is finished before returning to user.
217
+
218
+ # Wait until the stream thread is finished before returning to the user.
160
219
  # This means this function will block until the QIS buffer is emptied by the second while
161
- # loop in startStreanThread. This may take some time, especially at low averaging but
162
- # should gurantee the data won't be lost and QIS buffer is emptied.
220
+ # loop in startStreamThread. This may take some time, especially at low averaging,
221
+ # but should guarantee the data won't be lost and QIS buffer is emptied.
163
222
  if blocking:
164
223
  running = True
165
224
  while running:
166
- threadNameList = []
225
+ thread_name_list = []
167
226
  for t1 in threading.enumerate():
168
- threadNameList.append(t1.name)
169
- moduleStreaming= module.sendCommand("rec stream?").lower() #checking if module thinks its streaming.
170
- moduleStreaming2= module.sendCommand("stream?").lower() #checking if the module has told qis it has stopped streaming.
227
+ thread_name_list.append(t1.name)
228
+ module_streaming= module.sendCommand("rec stream?").lower() #checking if module thinks its streaming.
229
+ module_streaming2= module.sendCommand("stream?").lower() #checking if the module has told qis it has stopped streaming.
171
230
 
172
- if (moduleName in threadNameList or "running" in moduleStreaming or "running" in moduleStreaming2):
231
+ if module_name in thread_name_list or "running" in module_streaming or "running" in module_streaming2:
173
232
  time.sleep(0.1)
174
-
175
233
  else:
176
234
  running = False
177
- time.sleep(0.1)
178
235
 
179
- def startStreamThread(self, module, fileName, fileMaxMB, streamName, streamAverage, releaseOnData, separator,
180
- streamDuration=None, inMemoryData=None, output_file_handle=None, use_gzip=False):
181
- # This is the function that is run when t1 is created. It is run in a seperate thread from
182
- # the main application so streaming can happen without blocking the main application from
183
- # doing other things. Within this function/thread you have to be very careful not to try
184
- # and 'communicate' with anything from other threads. If you do, you MUST use a thread safe
185
- # way of communicating. The thread creates it's own socket and should use that, NOT the objects socket
186
- # (which some of the comms with module functions will use by default).
236
+ def start_stream_thread(self, module: str, file_name: str, max_file_size: float, release_on_data: bool, separator: str,
237
+ stream_duration: int=None, in_memory_data=None, output_file_handle=None, use_gzip: bool=False):
238
+ """
239
+
240
+ Args:
241
+ module:
242
+ The name of the module from which data is to be streamed.
243
+ file_name:
244
+ The path to the file where streamed data will be written. Mandatory if neither an in-memory
245
+ buffer (in_memory_data) nor an external file handle (output_file_handle) is provided.
246
+ max_file_size:
247
+ The maximum permissible file size in MB. After reaching this limit, streaming to the current
248
+ file will stop
249
+ release_on_data:
250
+ True to prevent the stream lock from releasing until data has been received
251
+ separator:
252
+ Custom separator used to CSV data
253
+ stream_duration:
254
+ Duration of streaming in seconds, relative to the sampling period. Defaults to streaming
255
+ indefinitely.
256
+ in_memory_data:
257
+ An in-memory buffer of type StringIO to hold streamed data. If set, data is written here
258
+ instead of a file.
259
+ output_file_handle:
260
+ A pre-opened file handle where data will be written. If set, file_name is ignored.
261
+ use_gzip:
262
+ If True, writes streamed data to a gzip-compressed file.
263
+
264
+ Raises:
265
+ TypeError
266
+ If in_memory_data is passed but is not of type StringIO.
267
+ ValueError
268
+ If file_name is not provided and neither in_memory_data nor output_file_handle is given.
269
+ Also raised for invalid or undecodable sampling periods.
270
+
271
+ Returns:
272
+ None
273
+ """
187
274
 
188
275
  f = None
276
+ max_mb_val = 0
189
277
  file_opened_by_function = False # True if this function opens the file
190
278
  is_in_memory_stream = False # True if using inMemoryData (StringIO)
191
279
 
192
- # Priority: 1. output_file_handle, 2. inMemoryData, 3. open new file
280
+ # Output priority: 1. output_file_handle, 2. inMemoryData, 3. A new a file
193
281
  if output_file_handle is not None:
194
282
  f = output_file_handle
195
283
  # Caller is responsible for the handle's mode (e.g., text/binary) and type.
196
- elif inMemoryData is not None:
197
- if not isinstance(inMemoryData, StringIO):
284
+ elif in_memory_data is not None:
285
+ if not isinstance(in_memory_data, StringIO):
198
286
  raise TypeError("Error! The parameter 'inMemoryData' must be of type StringIO.")
199
- f = inMemoryData
287
+ f = in_memory_data
200
288
  is_in_memory_stream = True
201
289
  else:
202
290
  # No external handle or in-memory buffer, so open a file.
203
- if not fileName: # fileName is mandatory if we are to open a file.
204
- raise ValueError("fileName must be provided if output_file_handle and inMemoryData are None.")
291
+ if not file_name: # fileName is mandatory if we are to open a file.
292
+ raise ValueError("fie_name must be provided if output_file_handle and in_memory_data are None.")
205
293
  file_opened_by_function = True
206
294
  if use_gzip:
207
295
  # Open in text mode ('wt'). Encoding 'utf-8' is a good default.
208
296
  # gzip.open in text mode handles newline conversions.
209
- f = gzip.open(fileName, 'wt', encoding='utf-8')
297
+ f = gzip.open(file_name, 'wt', encoding='utf-8')
210
298
  else:
211
299
  # Open in text mode ('w').
212
300
  # newline='' ensures that '\n' is written as '\n' on all platforms.
213
- f = open(fileName, 'w', encoding='utf-8', newline='')
214
-
215
- # This variable was declared but seemed unused before its first assignment.
216
- stripes = ['Empty Header']
301
+ f = open(file_name, 'w', encoding='utf-8', newline='')
217
302
 
218
- # Send stream command so module starts streaming data into the backends buffer
219
- streamRes = self.sendAndReceiveCmd(self.streamSock, 'rec stream', device=module, betweenCommandDelay=0)
220
- # printText(streamRes) # Assuming printText is a custom logging/debug function
221
- if 'rec stream : OK' in streamRes:
222
- if releaseOnData is False:
303
+ # Check for a valid max file size limit
304
+ if max_file_size is not None:
305
+ try:
306
+ max_mb_val = int(max_file_size)
307
+ except (ValueError, TypeError):
308
+ logging.warning(f"Invalid max_file_size parameter: {max_file_size}. No limit will be applied")
309
+ max_file_size = None
310
+
311
+ # Send stream command so the module starts streaming data into the backends buffer
312
+ stream_res = self.send_command('rec stream', device=module, qis_socket=self.streamSock)
313
+ # Check the stream started
314
+ if 'OK' in stream_res:
315
+ if not release_on_data:
223
316
  self.StreamRunSentSemaphore.release()
224
317
  self.stripesEvent.clear()
225
318
  self.deviceDict[module][0:3] = [False, 'Running', 'Stream Running']
226
319
  else:
227
320
  self.StreamRunSentSemaphore.release()
228
321
  self.stripesEvent.clear()
229
- self.deviceDict[module][0:3] = [True, 'Stopped', module + " couldn't start because " + streamRes]
322
+ self.deviceDict[module][0:3] = [True, 'Stopped', module + " couldn't start because " + stream_res]
230
323
  if file_opened_by_function and f:
231
324
  try:
232
325
  f.close()
233
326
  except Exception as e_close:
234
- logging.error(f"Error closing file {fileName} on stream start failure: {e_close}")
327
+ logging.error(f"Error closing file {file_name} on stream start failure: {e_close}")
235
328
  return
236
329
 
237
- baseSamplePeriod = self.streamHeaderAverage(device=module, sock=self.streamSock)
330
+ # Poll for the stream header to become available. This is needed to configure the output file
331
+ base_sample_period = self.stream_header_average(device=module, sock=self.streamSock)
238
332
  count = 0
239
- maxTries = 10
240
- while 'Header Not Available' in baseSamplePeriod:
241
- baseSamplePeriod = self.streamHeaderAverage(device=module, sock=self.streamSock)
333
+ max_tries = 10
334
+ while 'Header Not Available' in base_sample_period:
335
+ base_sample_period = self.stream_header_average(device=module, sock=self.streamSock)
242
336
  time.sleep(0.1)
243
337
  count += 1
244
- if count > maxTries:
338
+ if count > max_tries:
245
339
  self.deviceDict[module][0:3] = [True, 'Stopped', 'Header not available']
246
340
  if file_opened_by_function and f:
247
341
  try:
248
342
  f.close()
249
343
  except Exception as e_close:
250
- logging.error(f"Error closing file {fileName} on header failure: {e_close}")
344
+ logging.error(f"Error closing file {file_name} on header failure: {e_close}")
251
345
  return # Changed from exit() for cleaner thread termination
252
346
 
253
- version = self.streamHeaderVersion(device=module, sock=self.streamSock) # version seems unused
254
- timeStampHeader = datetime.datetime.now().strftime("%H:%M:%S:%f %d/%m/%y") # timeStampHeader seems unused
255
- formatHeader = self.streamHeaderFormat(device=module, sock=self.streamSock)
256
- formatHeader = formatHeader.replace(", ", separator)
257
- f.write(formatHeader + '\n')
347
+ # Format the header and write it to the output file
348
+ format_header = self.stream_header_format(device=module, sock=self.streamSock)
349
+ format_header = format_header.replace(", ", separator)
350
+ f.write(format_header + '\n')
258
351
 
259
- numStripesPerRead = 4096
260
- maxFileExceeded = False
261
- openAttempts = 0 # Used in except IOError block
352
+ # Initialize stream variables
353
+ max_file_exceeded = False
354
+ open_attempts = 0
262
355
  leftover = 0
263
- remainingStripes = []
264
- streamOverrun = False
265
- streamComplete = False
266
-
267
- if 'ns' in baseSamplePeriod.lower():
268
- baseSampleUnitText = 'ns'
269
- baseSampleUnitExponent = -9
270
- elif 'us' in baseSamplePeriod.lower():
271
- baseSampleUnitText = 'us'
272
- baseSampleUnitExponent = -6
273
- elif 'ms' in baseSamplePeriod.lower():
274
- baseSampleUnitText = 'ms'
275
- baseSampleUnitExponent = -3
276
- elif 'S' in baseSamplePeriod.lower(): # Original was 'S', assuming it means 's'
277
- baseSampleUnitText = 's'
278
- baseSampleUnitExponent = 0
356
+ remaining_stripes = []
357
+ stream_overrun = False
358
+ stream_complete = False
359
+ stream_status_str = ""
360
+
361
+ # Calculate and verify stripe rate information
362
+ if 'ns' in base_sample_period.lower():
363
+ base_sample_unit_exponent = -9
364
+ elif 'us' in base_sample_period.lower():
365
+ base_sample_unit_exponent = -6
366
+ elif 'ms' in base_sample_period.lower():
367
+ base_sample_unit_exponent = -3
368
+ elif 'S' in base_sample_period.lower(): # Original was 'S', assuming it means 's'
369
+ base_sample_unit_exponent = 0
279
370
  else:
280
371
  # Clean up and raise error if baseSamplePeriod is undecodable
281
372
  if file_opened_by_function and f:
282
373
  try:
283
374
  f.close()
284
375
  except Exception as e_close:
285
- logging.error(f"Error closing file {fileName} due to ValueError: {e_close}")
286
- raise ValueError(f"couldn't decode samplePeriod: {baseSamplePeriod}")
376
+ logging.error(f"Error closing file {file_name} due to ValueError: {e_close}")
377
+ raise ValueError(f"couldn't decode samplePeriod: {base_sample_period}")
287
378
 
288
- baseSamplePeriodS = int(re.search(r'^\d*\.?\d*', baseSamplePeriod).group()) * (10 ** baseSampleUnitExponent)
379
+ base_sample_period_period_s = int(re.search(r'^\d*\.?\d*', base_sample_period).group()) * (10 ** base_sample_unit_exponent)
289
380
 
290
- # The following re-opening of the file is removed as f is already open in 'w' or 'wt' mode
291
- # and subsequent writes will append.
292
- # if inMemoryData is None:
293
- # f = open(fileName, 'a', newline='')
294
-
295
- isRun = True
296
- while isRun:
381
+ # Now we loop to process the stripes of data as they are available
382
+ is_run = True
383
+ while is_run:
297
384
  try:
298
- i = self.deviceMulti(module)
299
- while self.stopFlagList[i] and (not streamOverrun) and (not streamComplete):
300
- streamOverrun, removeChar, newStripes = self.streamGetStripesText(self.streamSock, module, numStripesPerRead)
301
- newStripes = newStripes.replace(' ', separator) # Replace spaces globally first
302
- if streamOverrun:
385
+ # Check for exit flags. These can be from user request (stopFlagList) or from the stream
386
+ # process ending
387
+ i = self.device_control_index(module)
388
+ while self.stopFlagList[i] and (not stream_overrun) and (not stream_complete):
389
+
390
+ # Read a block of stripes from QIS
391
+ stream_status_str, new_stripes = self.stream_get_stripes_text(self.streamSock, module)
392
+
393
+ # Overrun is a termination event where the stream stopped earlier than desired and must
394
+ # be flagged to the user
395
+ if "overrun" in stream_status_str:
396
+ stream_overrun = True
303
397
  self.deviceDict[module][0:3] = [True, 'Stopped', 'Device buffer overrun']
398
+ if "eof" in stream_status_str:
399
+ stream_complete = True
304
400
 
305
- isEmpty = (removeChar == -6 and len(newStripes) == 6)
306
-
307
- if not isEmpty:
308
- current_file_mb = 0.0
309
- if is_in_memory_stream:
310
- current_file_mb = f.tell() / 1048576.0
311
- elif fileName: # For file-based output (opened here or external handle with known fileName)
312
- try:
313
- # os.stat reflects the size on disk. For buffered writes (incl. gzip),
314
- # this might not be the exact current unwritten buffer size + disk size
315
- # without a flush, but it's what the original code relied on.
316
- statInfo = os.stat(fileName)
317
- current_file_mb = statInfo.st_size / 1048576.0
318
- except FileNotFoundError:
319
- current_file_mb = 0.0 # File might not exist yet or fileName is not locatable
320
- except Exception as e_stat:
321
- logging.warning(f"Could not get file size for {fileName}: {e_stat}")
322
- current_file_mb = 0.0 # Default to small size on error
323
- else:
324
- # output_file_handle was given, but fileName was None. Cannot check disk size.
325
- # Assume it's okay or managed by caller. fileMaxMB check effectively bypassed.
326
- current_file_mb = 0.0
401
+ # Continue here if there are stripes to process
402
+ if len(new_stripes) > 0:
403
+ # switch in the correct value seperator
404
+ new_stripes = new_stripes.replace(' ', separator)
327
405
 
328
- try:
329
- # Ensure fileMaxMB can be converted to int. If not, skip file size check for this iteration.
330
- max_mb_val = int(fileMaxMB)
331
- except (ValueError, TypeError):
332
- logging.warning(f"Invalid fileMaxMB value: {fileMaxMB}. Skipping size check for this iteration.")
333
- max_mb_val = float('inf') # Effectively disable check if invalid
334
-
335
- if current_file_mb < max_mb_val:
336
- if releaseOnData: # Note: Original was `releaseOnData == True`
337
- self.StreamRunSentSemaphore.release()
338
- self.stripesEvent.clear()
339
- releaseOnData = False # Prevent re-releasing
340
- if streamAverage is not None:
341
- # Assuming self.averageStripes handles writing to f
342
- leftover, remainingStripes = self.averageStripes(leftover, stripesPerAverage,
343
- newStripes[:removeChar], f,
344
- remainingStripes)
406
+ # Track the total size of the file here if needed
407
+ if max_file_size is not None:
408
+ current_file_mb = 0.0
409
+ if is_in_memory_stream:
410
+ current_file_mb = f.tell() / 1048576.0
411
+ elif file_name:
412
+ try:
413
+ # os.stat reflects the size on disk. For buffered writes (incl. gzip),
414
+ # this might not be the exact current unwritten buffer size + disk size
415
+ # without a flush, but it's an decent estimate.
416
+ stat_info = os.stat(file_name)
417
+ current_file_mb = stat_info.st_size / 1048576.0
418
+ except FileNotFoundError:
419
+ current_file_mb = 0.0 # File might not exist yet or fileName is not locatable
420
+ except Exception as e_stat:
421
+ logging.warning(f"Could not get file size for {file_name}: {e_stat}")
422
+ current_file_mb = 0.0 # Default to small size on error
345
423
  else:
346
- if streamDuration is not None:
347
- lastLine = newStripes.splitlines()[-3] # the last data line is followed by 'eof' and '>'
348
- lastTime = lastLine.split(separator)[0]
349
-
350
- if int(lastTime) < int(streamDuration / (10 ** baseSampleUnitExponent)):
351
- # newStripes was already globally space-replaced.
352
- f.write(newStripes[:removeChar])
424
+ # output_file_handle was given, but fileName was None. Cannot check disk size.
425
+ # Assume it's okay or managed by the caller. fileMaxMB check effectively bypassed.
426
+ current_file_mb = 0.0
427
+
428
+ # Flag the limit has been exceeded
429
+ if current_file_mb > max_mb_val:
430
+ max_file_exceeded = True
431
+ max_file_status = self.stream_buffer_status(device=module, sock=self.streamSock)
432
+ f.write('Warning: Max file size exceeded before end of stream.\n')
433
+ f.write('Unrecorded stripes in buffer when file full: ' + max_file_status + '.\n')
434
+ self.deviceDict[module][0:3] = [True, 'Stopped', 'User defined max filesize reached']
435
+ break # Exit stream processing loop
436
+
437
+ # Release the stream semaphore now we have data
438
+ if release_on_data:
439
+ self.StreamRunSentSemaphore.release()
440
+ self.stripesEvent.clear()
441
+ release_on_data = False
442
+
443
+ # If a duration has been set, track it based on the time of the last stripe
444
+ if stream_duration is not None:
445
+ last_line = new_stripes.splitlines()[-1]
446
+ last_time = last_line.split(separator)[0]
447
+
448
+ # Write all the stripes if we can
449
+ if int(last_time) < int(stream_duration / (10 ** base_sample_unit_exponent)):
450
+ f.write(new_stripes)
451
+ # Otherwise only write stripes within the duration limit
452
+ else:
453
+ for this_line in new_stripes.splitlines():
454
+ this_time_str = this_line.split(separator)[0]
455
+ if int(this_time_str) < int(stream_duration / (10 ** base_sample_unit_exponent)):
456
+ f.write(this_line + '\r\n') # Put the CR back on the end
353
457
  else:
354
- for thisLine in newStripes.splitlines()[:-2]: # Process lines before 'eof' and '>'
355
- thisTimeStr = thisLine.split(separator)[0]
356
- if int(thisTimeStr) < int(streamDuration / (10 ** baseSampleUnitExponent)):
357
- f.write(thisLine + '\r\n') # Put the CR back on the end
358
- else:
359
- streamComplete = True
360
- break
361
- else:
362
- # newStripes was already globally space-replaced.
363
- f.write(newStripes[:removeChar])
458
+ stream_complete = True
459
+ break
460
+ # Default to writing all stripes
364
461
  else:
365
- maxFileExceeded = True
366
- maxFileStatus = self.streamBufferStatus(device=module, sock=self.streamSock)
367
- f.write('Warning: Max file size exceeded before end of stream.\n')
368
- f.write(
369
- 'Unrecorded stripes in buffer when file full: ' + maxFileStatus + '.\n') # Added newline for clarity
370
- self.deviceDict[module][0:3] = [True, 'Stopped', 'User defined max filesize reached']
371
- break # Exit inner while loop
372
- else: # isEmpty == True
373
- time.sleep(0.1)
374
- streamStatus = self.streamRunningStatus(device=module, sock=self.streamSock)
375
- if streamOverrun:
376
- break # Exit inner while loop
377
- elif "Stopped" in streamStatus:
462
+ f.write(new_stripes)
463
+ # If we have no data
464
+ else:
465
+ if stream_overrun:
466
+ break # Exit stream processing loop
467
+ elif "stopped" in stream_status_str:
378
468
  self.deviceDict[module][0:3] = [True, 'Stopped', 'User halted stream']
379
- break # Exit inner while loop
380
- # End of inner while self.stopFlagList... loop
469
+ break # Exit stream processing loop
470
+ # End of stream data processing loop
381
471
 
382
- self.sendAndReceiveCmd(self.streamSock, 'rec stop', device=module, betweenCommandDelay=0)
383
- streamState = self.sendAndReceiveCmd(self.streamSock, 'stream?', device=module, betweenCommandDelay=0)
384
- while "stopped" not in streamState.lower():
472
+ # Ensure the stream is fully stopped, though standard exit cases should have ended it already
473
+ self.send_command('rec stop', device=module, qis_socket=self.streamSock)
474
+ stream_state = self.send_command('stream?', device=module, qis_socket=self.streamSock)
475
+ while "stopped" not in stream_state.lower():
385
476
  logging.debug("waiting for stream? to return stopped")
386
477
  time.sleep(0.1)
387
- streamState = self.sendAndReceiveCmd(self.streamSock, 'stream?', device=module, betweenCommandDelay=0)
388
-
389
- if (not streamOverrun) and (not maxFileExceeded):
390
- self.deviceDict[module][0:3] = [False, 'Stopped', 'Stream stopped - emptying buffer']
391
-
392
- if not maxFileExceeded:
393
- streamOverrun_final, removeChar_final, newStripes_final = self.streamGetStripesText(self.streamSock, module, numStripesPerRead)
394
- isEmpty_final = (removeChar_final == -6 and len(newStripes_final) == 6)
395
-
396
- while not isEmpty_final:
397
- current_file_mb_final = 0.0
398
- if is_in_memory_stream:
399
- current_file_mb_final = f.tell() / 1048576.0
400
- elif fileName:
401
- try:
402
- statInfo = os.stat(fileName)
403
- current_file_mb_final = statInfo.st_size / 1048576.0
404
- except Exception:
405
- current_file_mb_final = 0.0
406
- else:
407
- current_file_mb_final = 0.0
408
-
409
- try:
410
- max_mb_val_final = int(fileMaxMB)
411
- except (ValueError, TypeError):
412
- max_mb_val_final = float('inf') # Effectively disable
413
-
414
- if current_file_mb_final < max_mb_val_final:
415
- if not streamComplete: # Check if stream was already completed due to duration
416
- if (streamAverage != None):
417
- leftover, remainingStripes = self.averageStripes(leftover, stripesPerAverage,
418
- newStripes_final[
419
- :removeChar_final], f,
420
- remainingStripes)
421
- else:
422
- newStripes_final = newStripes_final.replace(' ', separator) # Ensure replacement
423
- f.write(newStripes_final[:removeChar_final])
424
- else:
425
- if not maxFileExceeded: # Only write warning if not already written
426
- maxFileStatus_final = self.streamBufferStatus(device=module, sock=self.streamSock)
427
- f.write('Warning: Max file size exceeded before end of stream.\n') # Changed from b''
428
- f.write('Unrecorded stripes in buffer when file full: ' + maxFileStatus_final + '.\n') # Changed from b'', added newline
429
- logging.warning('Max file size exceeded. Some data has not been saved to file: ' + maxFileStatus_final + '.')
430
- maxFileExceeded = True # Set flag
431
- self.deviceDict[module][0:3] = [True, 'Stopped', 'User defined max filesize reached']
432
- break # Exit emptying loop
433
-
434
- streamOverrun_final, removeChar_final, newStripes_final = self.streamGetStripesText(
435
- self.streamSock, module, numStripesPerRead, skipStatusCheck=True)
436
- isEmpty_final = (removeChar_final == -6 and len(newStripes_final) == (
437
- 6 if newStripes_final else 0)) # handle newStripes_final potentially being None
478
+ stream_state = self.send_command('stream?', device=module, qis_socket=self.streamSock)
438
479
 
439
- if streamOverrun: # This check is after emptying buffer; might need re-evaluation if overrun can happen during emptying
480
+ if stream_overrun:
440
481
  self.deviceDict[module][0:3] = [True, 'Stopped', 'Device buffer overrun - QIS buffer empty']
441
- elif not maxFileExceeded: # If not overrun and not exceeded file size
482
+ elif not max_file_exceeded:
442
483
  self.deviceDict[module][0:3] = [False, 'Stopped', 'Stream stopped']
443
- # If maxFileExceeded is true, the status is already set.
444
484
 
445
- time.sleep(0.2)
446
- isRun = False # Exit main while isRun loop
485
+ is_run = False # Exit main while loop
447
486
  except IOError as err:
448
487
  logging.error(f"IOError in startStreamThread for module {module}: {err}")
449
- # f might have been closed by the system if it's a pipe and the other end closed,
450
- # or other severe IO errors.
451
- # Attempt to close only if this function opened it and it seems like it might be openable/closable.
488
+ # f might have been closed by the system if it's a pipe and the other end closed or other severe errors.
489
+ # Attempt to close only if this function opened it, and it seems like it might be openable/closable.
452
490
  if file_opened_by_function and f is not None:
453
491
  try:
454
492
  if not f.closed:
455
493
  f.close()
456
494
  except Exception as e_close:
457
- logging.error(f"Error closing file {fileName} during IOError handling: {e_close}")
495
+ logging.error(f"Error closing file {file_name} during IOError handling: {e_close}")
458
496
  f = None # Avoid trying to close again in finally if error persists
459
497
 
460
498
  time.sleep(0.5)
461
- openAttempts += 1
462
- if openAttempts > 4:
499
+ open_attempts += 1
500
+ if open_attempts > 4:
463
501
  logging.error(f"Too many IOErrors in QisInterface for module {module}. Raising error.")
464
502
  # Set device status before raising, if possible
465
503
  self.deviceDict[module][0:3] = [True, 'Stopped', f'IOError limit exceeded: {err}']
@@ -470,621 +508,499 @@ class QisInterface:
470
508
  if not f.closed: # Check if not already closed (e.g. in IOError block)
471
509
  f.close()
472
510
  except Exception as e_close:
473
- logging.error(f"Error closing file {fileName} in finally block: {e_close}")
474
- # If output_file_handle was passed, caller is responsible for closing.
475
- # If inMemoryData was passed, it's managed by caller.
476
- # The original `else: inMemoryData = f` is removed as inMemoryData (StringIO) is mutated in-place.
477
-
478
- # This is the function that is ran when t1 is created. It is ran in a seperate thread from
479
- # the main application so streaming can happen without blocking the main application from
480
- # doing other things. Within this function/thread you have to be very careful not to try
481
- # and 'communicate' with anything from other threads. If you do, you MUST use a thread safe
482
- # way of communicating. The thread creates it's own socket and should use that NOT the objects socket
483
- # (which some of the comms with module functions will use by default).
484
-
485
- def startStreamThreadQPS(self, module, fileName, fileMaxMB, streamName, streamAverage, releaseOnData, separator):
486
-
487
- # Start module streaming and then read stream data
488
- # self.sendAndReceiveCmd(self.streamSock, 'stream mode resample 10mS', device=module, betweenCommandDelay=0)
489
- self.sendAndReceiveCmd(self.streamSock, 'stream mode header v3', device=module, betweenCommandDelay=0)
490
- self.sendAndReceiveCmd(self.streamSock, 'stream mode power enable', device=module, betweenCommandDelay=0)
491
- self.sendAndReceiveCmd(self.streamSock, 'stream mode power total enable', device=module, betweenCommandDelay=0)
492
-
493
- self.qps_record_start_time = time.time() * 1000
494
-
495
- stripes = ['Empty Header']
496
- # Send stream command so module starts streaming data into the backends buffer
497
- streamRes = self.sendAndReceiveCmd(self.streamSock, 'rec stream', device=module, betweenCommandDelay=0)
498
- # printText(streamRes)
499
- if ('rec stream : OK' in streamRes):
500
- if (releaseOnData == False):
501
- self.StreamRunSentSemaphore.release()
502
- self.stripesEvent.clear()
503
- self.deviceDict[module][0:3] = [False, 'Running', 'Stream Running']
504
- else:
505
- self.StreamRunSentSemaphore.release()
506
- self.stripesEvent.clear()
507
- self.deviceDict[module][0:3] = [True, 'Stopped', module + " couldn't start because " + streamRes]
508
- return
509
-
510
- # If recording to file then get header for file
511
- if (fileName is not None):
511
+ logging.error(f"Error closing file {file_name} in finally block: {e_close}")
512
+ # If output_file_handle was passed, the caller is responsible for closing.
513
+ # If inMemoryData was passed, it's managed by the caller.
512
514
 
513
- baseSamplePeriod = self.streamHeaderAverage(device=module, sock=self.streamSock)
514
- count = 0
515
- maxTries = 10
516
- while 'Header Not Available' in baseSamplePeriod:
517
- baseSamplePeriod = self.streamHeaderAverage(device=module, sock=self.streamSock)
518
- time.sleep(0.1)
519
- count += 1
520
- if count > maxTries:
521
- self.deviceDict[module][0:3] = [True, 'Stopped', 'Header not available']
522
- exit()
523
- version = self.streamHeaderVersion(device=module, sock=self.streamSock)
524
-
525
- numStripesPerRead = 4096
526
- maxFileExceeded = False
527
- openAttempts = 0
528
- leftover = 0
529
- remainingStripes = []
530
- streamOverrun = False
531
- # if streamAverage != None:
532
- # # Matt converting streamAveraging into number
533
- # streamAverage = self.convertStreamAverage(streamAverage)
534
- # stripesPerAverage = float(streamAverage) / (float(baseSamplePeriodS) * 4e-6)
515
+ def get_device_list(self, sock=None) -> filter:
516
+ """
517
+ returns a list of device IDs that are available for connection
535
518
 
536
- isRun = True
519
+ Args:
520
+ sock:
521
+ Optional connection socket
537
522
 
538
- self.create_dir_structure(module, fileName)
523
+ Returns:
524
+ A filtered iterable list of devices
539
525
 
540
- while isRun:
541
- try:
542
- # with open(fileName, 'ab') as f:
543
- # Until the event threadRunEvent is set externally to this thread,
544
- # loop and read from the stream
545
- i = self.deviceMulti(module)
546
- while self.stopFlagList[i] and (not streamOverrun):
547
- # now = time.time()
548
- streamOverrun, removeChar, newStripes = self.streamGetStripesText(self.streamSock, module,
549
- numStripesPerRead)
550
- newStripes = newStripes.replace(' ',separator)
551
-
552
- if streamOverrun:
553
- self.deviceDict[module][0:3] = [True, 'Stopped', 'Device buffer overrun']
554
- if (removeChar == -6 and len(newStripes) == 6):
555
- isEmpty = True
556
- else:
557
- isEmpty = False
558
- if isEmpty == False:
559
- # Writes in file if not too big else stops streaming
560
- # Writing multiple stripes
561
- if "\r\n" in y:
562
- y = y.split("\r\n")
563
-
564
- if self.has_digitals:
565
- # Write qps files for PAM
566
- for stripes in y:
567
- if stripes:
568
- stripe = stripes.split(",")
569
- self.write_stripe_to_files_PAM(stripe)
570
- else:
571
- # Write qps files for PPM
572
- for stripes in y:
573
- if stripes:
574
- stripe = stripes.split(",")
575
- self.write_stripe_to_files_HD(stripe)
526
+ """
576
527
 
577
- else:
578
- if self.has_digitals:
579
- # Write qps files for PAM
580
- for stripes in y:
581
- if stripes:
582
- stripe = stripes.split(",")
583
- self.write_stripe_to_files_PAM(stripe)
584
- else:
585
- # Write qps files for PPM
586
- for stripes in y:
587
- if stripes:
588
- stripe = stripes.split(",")
589
- self.write_stripe_to_files_HD(stripe)
528
+ if sock is None:
529
+ sock = self.sock
590
530
 
531
+ dev_string = self.sendAndReceiveText(sock, '$list')
532
+ dev_string = dev_string.replace('>', '')
533
+ dev_string = dev_string.replace(r'\d+\) ', '')
534
+ dev_string = dev_string.split('\r\n')
535
+ dev_string = filter(None, dev_string) #remove empty elements
591
536
 
592
- else:
593
- # there's no stripes in the buffer - it's not filling up fast -
594
- # sleeps so we don't spam qis with requests (seems to make QIS crash)
595
- # it might be clever to change the sleep time accoring to the situation
596
- # e.g. wait longer with higher averaging or lots of no stripes in a row
597
- time.sleep(0.1)
598
- streamStatus = self.streamRunningStatus(device=module, sock=self.streamSock)
599
- if streamOverrun:
600
- # printText('QisInterface overrun - breaking')
601
- break
602
- elif "Stopped" in streamStatus:
603
- self.deviceDict[module][0:3] = [True, 'Stopped', 'User halted stream']
604
- break
537
+ return dev_string
605
538
 
606
- # printText('Left while 1')
607
- self.sendAndReceiveCmd(self.streamSock, 'rec stop', device=module, betweenCommandDelay=0)
608
- # streamState = self.sendAndReceiveCmd(self.streamSock, 'stream?', device=module, betweenCommandDelay=0) # use "stream?" rather than "rec stream?" as it checks both QIS AND the device.
609
- # while "stopped" not in streamState.lower():
610
- # logging.debug("waiting for stream? to contained stopped")
611
- # time.sleep(0.1)
612
- # streamState = self.sendAndReceiveCmd(self.streamSock, 'stream?', device=module,betweenCommandDelay=0) # use "stream?" rather than "rec stream?" as it checks both QIS AND the device.
539
+ def get_list_details(self, sock=None) -> list:
540
+ """
541
+ Extended version of get_device_list which also returns the additional details
542
+ fields for each module
613
543
 
614
- isRun = False
615
- except IOError as err:
616
- # printText('\n\n!!!!!!!!!!!!!!!!!!!! IO Error in QisInterface !!!!!!!!!!!!!!!!!!!!\n\n')
617
- time.sleep(0.5)
618
- openAttempts += 1
619
- if openAttempts > 4:
620
- logging.error(
621
- '\n\n!!!!!!!!!!!!!!!!!!!! Too many IO Errors in QisInterface !!!!!!!!!!!!!!!!!!!!\n\n')
622
- raise err
623
-
624
- self.create_index_file()
625
- if self.has_digitals:
626
- self.create_index_file_digitals()
627
-
628
- self.create_qps_file(module)
629
-
630
- def write_stripe_to_files_HD(self, stripe):
631
- # Cycle through items in stripe
632
- for index, item in enumerate(stripe):
633
- if index == 0:
634
- continue
635
- with open(os.path.join(self.qps_record_dir_path, "data000",
636
- "data000_00" + index - 1 + "_000000000"),
637
- "a") as file1:#changed from ab to a as all data should be in string format now regardless of py2 or py3
638
-
639
- x = struct.pack(">d", int(item))
640
- # logging.debug(item, x)
641
- file1.write(x)
642
-
643
- def write_stripe_to_files_PAM(self, stripe):
644
- # Note to reader - List should be ordered 1>x on analogue and digitals
645
- counter = 0
646
- for group in self.streamGroups.groups:
647
- for i, channel in enumerate(group.channels):
648
- # incrementing here so we skip stripe[0] which is time
649
- counter += 1
650
-
651
- x = i
652
- while len(str(x)) < 3:
653
- x = "0" + str(x)
654
-
655
- # Write all in group 0 to analogue
656
- if group.group_id == 0:
657
-
658
- with open(os.path.join(self.qps_record_dir_path, "data000",
659
- "data000_"+x+"_000000000"),
660
- "a") as file1:#changed from ab to a as all data should be in string format now regardless of py2 or py3
661
- x = struct.pack(">d", int(stripe[counter]))
662
- # logging.debug(item, x)
663
- file1.write(x)
664
- else:
665
- # Write all in group 1 to digital
666
- with open(os.path.join(self.qps_record_dir_path, "data101",
667
- "data101_"+x+"_000000000"),
668
- "a") as file1:#changed from ab to a as all data should be in string format now regardless of py2 or py3
669
- x = struct.pack(">d", int(stripe[counter]))
670
- # logging.debug(item, x)
671
- file1.write(x)
672
-
673
- # Query the backend for a list of connected modules. A $scan command is sent to refresh the list of devices,
674
- # Then a wait occurs while the backend discovers devices (network ones can take a while) and then a list of device name strings is returned
675
- # The objects connection needs to be opened (connect()) before this is used
676
- def getDeviceList(self, sock=None):
544
+ Args:
545
+ sock:
546
+ Optional connection socket
547
+ Returns:
548
+ Iterable list of strings containing the details of each device available for connection.
677
549
 
678
- if sock == None:
679
- sock = self.sock
680
- devString = self.sendAndReceiveText(sock, '$list')
681
- devString = devString.replace('>', '')
682
- devString = devString.replace(r'\d+\) ', '')
683
- devString = devString.split('\r\n')
684
- devString = filter(None, devString) #remove empty elements
685
- return devString
686
-
687
- def get_list_details(self, sock=None):
688
- if sock == None:
550
+ """
551
+ if sock is None:
689
552
  sock = self.sock
690
553
 
691
- devString = self.sendAndReceiveText(sock, '$list details')
692
- devString = devString.replace('>', '')
693
- devString = devString.replace(r'\d+\) ', '')
694
- devString = devString.split('\r\n')
695
- devString = [x for x in devString if x] # remove empty elements
696
- return devString
554
+ dev_string = self.sendAndReceiveText(sock, '$list details')
555
+ dev_string = dev_string.replace('>', '')
556
+ dev_string = dev_string.replace(r'\d+\) ', '')
557
+ dev_string = dev_string.split('\r\n')
558
+ dev_string = [x for x in dev_string if x] # remove empty elements
559
+ return dev_string
697
560
 
698
- def scanIP(QisConnection, ipAddress):
561
+ def scan_ip(self, qis_connection, ip_address) -> bool:
699
562
  """
700
- Triggers QIS to look at a specific IP address for a quarch module
563
+ Triggers QIS to look at a specific IP address for a module
564
+
565
+ Arguments
701
566
 
702
- Parameters
703
- ----------
704
567
  QisConnection : QpsInterface
705
- The interface to the instance of QPS you would like to use for the scan.
568
+ The interface to the instance of QIS you would like to use for the scan.
706
569
  ipAddress : str
707
570
  The IP address of the module you are looking for eg '192.168.123.123'
708
- sleep : int, optional
709
- This optional variable sleeps to allow the network to scan for the module before allowing new commands to be sent to QIS.
710
571
  """
711
572
 
712
- logging.debug("Starting QIS IP Address Lookup at " + ipAddress)
713
- if not ipAddress.lower().__contains__("tcp::"):
714
- ipAddress = "TCP::" + ipAddress
573
+ logging.debug("Starting QIS IP Address Lookup at " + ip_address)
574
+ if not ip_address.lower().__contains__("tcp::"):
575
+ ip_address = "TCP::" + ip_address
715
576
  response = "No response from QIS Scan"
716
577
  try:
717
- response = QisConnection.sendCmd(cmd="$scan " + ipAddress, expectedResponse=True)
718
- # valid response is "Located device: 192.168.1.2"
578
+ response = qis_connection.send_command("$scan " + ip_address)
579
+ # The valid response is "Located device: 192.168.1.2"
719
580
  if "located" in response.lower():
720
581
  logging.debug(response)
721
582
  # return the valid response
722
- return response
583
+ return True
723
584
  else:
724
- if "startup" not in response.lower():
725
- logging.warning("No module found at " + ipAddress)
726
- logging.warning(response)
727
- return response
585
+ logging.warning("No module found at " + ip_address)
586
+ logging.warning(response)
587
+ return False
728
588
 
729
589
  except Exception as e:
590
+ logging.warning("No module found at " + ip_address)
730
591
  logging.warning(e)
731
- if "startup" not in response.lower():
732
- logging.warning("No module found at " + ipAddress)
592
+ return False
593
+
594
+
595
+ def get_qis_module_selection(self, preferred_connection_only=True, additional_options="DEF_ARGS", scan=True) -> str:
596
+ """
597
+ Scans for available modules and allows the user to select one through an interactive selection process.
598
+ Can also handle additional custom options and some built-in ones such as rescanning
599
+
600
+ Arguments:
601
+ preferred_connection_only : bool
602
+ by default (True), returns only one preferred connection eg: USB for simplicity
603
+ additional_options: list
604
+ Additional operational options provided during module selection, such as rescan,
605
+ all connection types, and IP scan. Defaults to ['rescan', 'all con types', 'ip scan']. These allow the
606
+ additional options to be given to the user and handled in the top level script
607
+ scan : bool
608
+ Indicates whether to initiate a rescanning process for devices before listing. Defaults to True and
609
+ will take longer to return
610
+
611
+ Returns:
612
+ str: The identifier of the selected module, or the action selected from the additional options.
613
+
614
+ Raises:
615
+ KeyError: Raised when unexpected keys are found in the scanned device data.
616
+ ValueError: Raised if no valid selection is made or the provided IP address is invalid.
617
+ """
733
618
 
734
- def GetQisModuleSelection(self, favouriteOnly=True , additionalOptions=['rescan', 'all con types', 'ip scan'], scan=True):
735
- '''
736
- Fuction used to list the available deviced to QIS and present them to the user for selection.
619
+ # Avoid mutable warning by adding the argument list in the function rather than the header
620
+ if additional_options == "DEF_ARGS":
621
+ additional_options = ['rescan', 'all con types', 'ip scan']
737
622
 
738
- Returns myDeviceID - Str the connection string used to connect to the selected device.
739
- '''
740
- tableHeaders =["Modules"]
623
+ table_headers = ["Modules"]
741
624
  ip_address = None
742
- favourite = favouriteOnly
625
+ favourite = preferred_connection_only
743
626
  while True:
744
627
  printText("Scanning for modules...")
628
+ found_devices = None
745
629
  if scan and ip_address is None:
746
- foundDevices = self.qis_scan_devices(scan=scan, favouriteOnly=favourite)
630
+ found_devices = self.qis_scan_devices(scan=scan, preferred_connection_only=favourite)
747
631
  elif scan and ip_address is not None:
748
- foundDevices = self.qis_scan_devices(scan=scan, favouriteOnly=favourite, ipAddress=ip_address)
632
+ found_devices = self.qis_scan_devices(scan=scan, preferred_connection_only=favourite, ip_address=ip_address)
749
633
 
750
- myDeviceID = listSelection(title="Select a module",message="Select a module",selectionList=foundDevices,
751
- additionalOptions= additionalOptions, nice=True, tableHeaders=tableHeaders,
752
- indexReq=True)
753
- if myDeviceID.lower() == 'rescan':
634
+ my_device_id = listSelection(title="Select a module",message="Select a module",
635
+ selectionList=found_devices, additionalOptions= additional_options,
636
+ nice=True, tableHeaders=table_headers, indexReq=True)
637
+
638
+ if my_device_id.lower() == 'rescan':
754
639
  favourite = True
755
640
  ip_address = None
756
641
  continue
757
- elif myDeviceID.lower() == 'all con types':
642
+ elif my_device_id.lower() == 'all con types':
758
643
  favourite = False
759
644
  printText("Displaying all connection types...")
760
645
  continue
761
- elif myDeviceID.lower() == 'ip scan':
646
+ elif my_device_id.lower() == 'ip scan':
762
647
  ip_address = requestDialog(title="Please input the IP Address you would like to scan")
763
648
  favourite = False
764
649
  continue
765
650
  break
766
651
 
767
- return myDeviceID
652
+ return my_device_id
653
+
654
+ def qis_scan_devices(self, scan=True, preferred_connection_only=True, ip_address=None) -> list:
655
+ """
656
+ Begins a scan for devices and returns a simple list of devices
657
+
658
+ Args:
659
+ scan:
660
+ Should a scan be initiated? If False, the function will return immediately with the list
661
+ preferred_connection_only:
662
+ The default (True), returns only one preferred connection eg: USB for simplicity
663
+ ip_address:
664
+ IP address of the module you are looking for eg '192.168.123.123'
665
+
666
+ Returns:
667
+ list: List of module strings found during scan
668
+ """
768
669
 
769
- def qis_scan_devices(self, scan=True, favouriteOnly=True, ipAddress=None):
770
- deviceList = []
771
- foundDevices = "1"
772
- foundDevices2 = "2" # this is used to check if new modules are being discovered or if all have been found.
773
- scanWait = 2 # The number of seconds waited between the two scans.
670
+ device_list = []
671
+ found_devices = "1"
672
+ found_devices2 = "2" # this is used to check if new modules are being discovered or if all have been found.
673
+ scan_wait = 2 # The number of seconds waited between the scan and the initial list
674
+ list_wait = 1 # The time between checks for new devices in the list
774
675
 
775
676
  if scan:
776
- if ipAddress == None:
777
- devString = self.sendAndReceiveText(self.sock, '$scan')
677
+ # Perform the initial scan attempt
678
+ if ip_address is None:
679
+ dev_string = self.sendAndReceiveText(self.sock, '$scan')
778
680
  else:
779
- devString = self.sendAndReceiveText(self.sock, '$scan TCP::' + ipAddress)
780
- time.sleep(scanWait)
781
- while foundDevices not in foundDevices2:
782
- foundDevices = self.sendAndReceiveText(self.sock, '$list')
783
- time.sleep(scanWait)
784
- foundDevices2 = self.sendAndReceiveText(self.sock, '$list')
681
+ dev_string = self.sendAndReceiveText(self.sock, '$scan TCP::' + ip_address)
682
+ # Wait for devices to enumerate
683
+ time.sleep(scan_wait)
684
+ # While new devices are being found, extend the wait time
685
+ while found_devices not in found_devices2:
686
+ found_devices = self.sendAndReceiveText(self.sock, '$list')
687
+ time.sleep(list_wait)
688
+ found_devices2 = self.sendAndReceiveText(self.sock, '$list')
785
689
  else:
786
- foundDevices = self.sendAndReceiveText(self.sock, '$list')
787
-
788
- if not "no devices found" in foundDevices.lower():
789
- foundDevices = foundDevices.replace('>', '')
790
- #foundDevices = foundDevices.replace(r'\d\) ', '')
791
- # printText('"' + devString + '"')
792
- foundDevices = foundDevices.split('\r\n')
793
- #Can't stream over REST! Removing all REST connections.
794
- tempList= list()
795
- for item in foundDevices:
690
+ found_devices = self.sendAndReceiveText(self.sock, '$list')
691
+
692
+ # If we found devices, process them into a list to return
693
+ if not "no devices found" in found_devices.lower():
694
+ found_devices = found_devices.replace('>', '')
695
+ found_devices = found_devices.split('\r\n')
696
+ # Can't stream over REST. Removing all REST connections.
697
+ temp_list= list()
698
+ for item in found_devices:
796
699
  if item is None or "rest" in item.lower() or item == "":
797
700
  pass
798
701
  else:
799
- tempList.append(item.split(")")[1].strip())
800
- foundDevices = tempList
702
+ temp_list.append(item.split(")")[1].strip())
703
+ found_devices = temp_list
801
704
 
802
- #If favourite only is True then only show one connection type for each module connected.
803
- #First order the devices in preference type and then pick the first con type found for each module.
804
- if (favouriteOnly):
805
- foundDevices = self.sortFavourite(foundDevices)
705
+ # If the preferred connection only flag is True, then only show one connection type for each module connected.
706
+ # First, order the devices by their preference type and then pick the first con type found for each module.
707
+ if preferred_connection_only:
708
+ found_devices = self.sort_favourite(found_devices)
806
709
  else:
807
- foundDevices = ["***No Devices Found***"]
710
+ found_devices = ["***No Devices Found***"]
711
+
712
+ return found_devices
713
+
714
+ def sort_favourite(self, found_devices) -> list:
715
+ """
716
+ Reduces the list of located devices by referencing to the preferred type of connection. Only
717
+ one connection type will be returned for each module for easier user selection. ie: A module connected
718
+ on both USB and TCP will now only return with USB
719
+
720
+ Args:
721
+ found_devices:
722
+ List of located devices from a scan operation
808
723
 
809
- return foundDevices
724
+ Returns:
725
+ List of devices filtered/sorted devices
726
+ """
810
727
 
811
- def sortFavourite(self, foundDevices):
812
728
  index = 0
813
- sortedFoundDevices = []
814
- conPref = ["USB", "TCP", "SERIAL", "REST", "TELNET"]
815
- while len(sortedFoundDevices) != len(foundDevices):
816
- for device in foundDevices:
817
- if conPref[index] in device.upper():
818
- sortedFoundDevices.append(device)
729
+ sorted_found_devices = []
730
+ con_pref = ["USB", "TCP", "SERIAL", "REST", "TELNET"]
731
+ while len(sorted_found_devices) != len(found_devices):
732
+ for device in found_devices:
733
+ if con_pref[index] in device.upper():
734
+ sorted_found_devices.append(device)
819
735
  index += 1
820
- foundDevices = sortedFoundDevices
736
+ found_devices = sorted_found_devices
737
+
821
738
  # new dictionary only containing one favourite connection to each device.
822
- favConFoundDevices = []
739
+ fav_con_found_devices = []
823
740
  index = 0
824
- for device in sortedFoundDevices:
825
- if (favConFoundDevices == [] or not device.split("::")[1] in str(favConFoundDevices)):
826
- favConFoundDevices.append(device)
827
- foundDevices = favConFoundDevices
828
- return foundDevices
829
-
830
- # Query stream status for a device attached to backend
831
- # The objects connection needs to be opened (connect()) before this is used
832
- def streamRunningStatus(self, device, sock=None):
833
- if sock == None:
741
+ for device in sorted_found_devices:
742
+ if fav_con_found_devices == [] or not device.split("::")[1] in str(fav_con_found_devices):
743
+ fav_con_found_devices.append(device)
744
+ found_devices = fav_con_found_devices
745
+ return found_devices
746
+
747
+ def stream_running_status(self, device, sock=None) -> str:
748
+ """
749
+ returns a single word status string for a given device. Generally this will be running, overrun, or stopped
750
+
751
+ Arguments
752
+
753
+ device : str
754
+ The device ID to target
755
+ sock:
756
+ The socket to communicate over, or None to use the default.
757
+
758
+ Returns:
759
+ str: Single word status string to show the operation of streaming
760
+ """
761
+ if sock is None:
834
762
  sock = self.sock
835
- index = 0 # index of relevant line in split string
836
- streamStatus = self.sendAndReceiveText(sock, 'stream?', device)
837
- streamStatus = streamStatus.split('\r\n')
838
- streamStatus[index] = re.sub(r':', '', streamStatus[index]) #remove :
839
- return streamStatus[index]
840
-
841
- # Query stream buffer status for a device attached to backend
842
- # The objects connection needs to be opened (connect()) before this is used
843
- def streamBufferStatus(self, device, sock=None):
844
- if sock == None:
763
+
764
+ index = 0
765
+ stream_status = self.sendAndReceiveText(sock, 'stream?', device)
766
+
767
+ # Split the response, select the first time and trim the colon
768
+ status_parts = stream_status.split('\r\n')
769
+ stream_status = re.sub(r':', '', status_parts[index])
770
+ return stream_status
771
+
772
+ def stream_buffer_status(self, device, sock=None) -> str:
773
+ """
774
+ returns the info on the stripes buffered during the stream
775
+
776
+ Arguments
777
+
778
+ device : str
779
+ The device ID to target
780
+ sock:
781
+ The socket to communicate over, or None to use the default.
782
+
783
+ Returns:
784
+ str: String with the numbers of stripes buffered
785
+ """
786
+ if sock is None:
845
787
  sock = self.sock
846
- index = 1 # index of relevant line in split string
847
- streamStatus = self.sendAndReceiveText(sock, 'stream?', device)
848
- streamStatus = streamStatus.split('\r\n')
849
- streamStatus[index] = re.sub(r'^Stripes Buffered: ', '', streamStatus[index])
850
- return streamStatus[index]
788
+
789
+ index = 1
790
+ stream_status = self.sendAndReceiveText(sock, 'stream?', device)
791
+
792
+ # Split the response, select the second the info on the stripes buffered
793
+ status_lines = stream_status.split('\r\n')
794
+ stream_status = re.sub(r'^Stripes Buffered: ', '', status_lines[index])
795
+ return stream_status
851
796
 
852
797
  # TODO: MD - This function should be replaced with a more generic method of accessing the header
853
798
  # The return of a string with concatenated value and units should be replaced with something easier to parse
854
- #
855
- # Get the averaging used on the last/current stream
856
- # The objects connection needs to be opened (connect()) before this is used
857
- def streamHeaderAverage(self, device, sock=None):
799
+ def stream_header_average(self, device, sock=None) -> str:
800
+ """
801
+ Gets the averaging used on the current stream, required for processing the stripe data returned from QIS
802
+
803
+ Arguments
804
+
805
+ device : str
806
+ The device ID to target
807
+ sock:
808
+ The socket to communicate over, or None to use the default.
809
+
810
+ Returns:
811
+ str: String with the rate and unit
812
+ """
858
813
  try:
859
- if sock == None:
814
+ if sock is None:
860
815
  sock = self.sock
816
+
861
817
  index = 2 # index of relevant line in split string
862
- streamStatus = self.sendAndReceiveText(sock, sentText='stream text header', device=device)
818
+ stream_status = self.send_and_receive_text(sock, send_text='stream text header', device=device)
863
819
 
864
- self.qps_stream_header = streamStatus
820
+ self.qps_stream_header = stream_status
865
821
 
866
822
  # Check for the header format. If XML, process here
867
- if (self.isXmlHeader(streamStatus)):
823
+ if self.is_xml_header(stream_status):
868
824
  # Get the basic averaging rate (V3 header)
869
- xml_root = self.getStreamXmlHeader(device=device, sock=sock)
870
-
871
- # For QPS streaming, stream header v3 command has already been issued before this
825
+ xml_root = self.get_stream_xml_header(device=device, sock=sock)
872
826
  self.module_xml_header = xml_root
873
827
 
874
- # Return the time based averaging string
828
+ # Return the time-based averaging string
875
829
  device_period = xml_root.find('.//devicePeriod')
876
- if device_period == None:
830
+ if device_period is None:
877
831
  device_period = xml_root.find('.//devicePerioduS')
878
- if device_period == None:
832
+ if device_period is None:
879
833
  device_period = xml_root.find('.//mainPeriod')
880
- averageStr = device_period.text
881
- return averageStr
834
+ average_str = device_period.text
835
+ return average_str
882
836
  # For legacy text headers, process here
883
837
  else:
884
- streamStatus = streamStatus.split('\r\n')
885
- if('Header Not Available' in streamStatus[0]):
886
- dummy = streamStatus[0] + '. Check stream has been run on device.'
838
+ status_lines = stream_status.split('\r\n')
839
+ if 'Header Not Available' in status_lines[0]:
840
+ dummy = status_lines[0] + '. Check stream has been run on device.'
887
841
  return dummy
888
- streamStatus[index] = re.sub(r'^Average: ', '', streamStatus[index])
889
- avg = streamStatus[index]
842
+ average_str = re.sub(r'^Average: ', '', status_lines[index])
843
+ avg = average_str
890
844
  avg = 2 ** int(avg)
891
845
  return '{}'.format(avg)
892
846
  except Exception as e:
893
847
  logging.error(device + ' Unable to get stream average.' + self.host + ':' + str(self.port))
894
848
  raise e
895
849
 
896
- # Get the version of the stream and convert to string for the specified device
897
- # The objects connection needs to be opened (connect()) before this is used
898
- def streamHeaderVersion(self, device, sock=None):
899
- try:
900
- if sock == None:
901
- sock = self.sock
902
- index = 0 # index of relevant line in split string
903
- streamStatus = self.sendAndReceiveText(sock,'stream text header', device)
904
- streamStatus = streamStatus.split('\r\n')
905
- if 'Header Not Available' in streamStatus[0]:
906
- str = streamStatus[0] + '. Check stream has been ran on device.'
907
- logging.error(str)
908
- return str
909
- version = re.sub(r'^Version: ', '', streamStatus[index])
910
- if version == '3':
911
- version = 'Original PPM'
912
- elif version == '4':
913
- version = 'XLC PPM'
914
- elif version == '5':
915
- version = 'HD PPM'
916
- else:
917
- version = 'Unknown stream version'
918
- return version
919
- except Exception as e:
920
- logging.error(device + ' Unable to get stream version.' + self.host + ':' + str(self.port))
921
- raise e
850
+ def stream_header_format(self, device, sock=None) -> str:
851
+ """
852
+ Formats the stream header for use at the top of a CSV file. This adds the appropriate time column and
853
+ each of the channel data columns
922
854
 
923
- # Get a header string giving which measurements are returned in the string for the specified device
924
- # The objects connection needs to be opened (connect()) before this is used
925
- def streamHeaderFormat(self, device, sock=None):
855
+ Arguments
856
+
857
+ device:
858
+ The device ID to target
859
+ sock:
860
+ The socket to communicate over, or None to use the default.
861
+
862
+ Returns:
863
+ str: Get the CSV formatted header string for the current stream
864
+ """
926
865
  try:
927
- if sock == None:
866
+ if sock is None:
928
867
  sock = self.sock
929
- index = 1 # index of relevant line in split string STREAM MODE HEADER [?|V1,V2,V3]
930
- streamStatus = self.sendAndReceiveText(sock,'stream text header', device)
931
- # Check if this is a new XML form header
932
- if (self.isXmlHeader (streamStatus)):
868
+
869
+ index = 1
870
+ stream_status = self.sendAndReceiveText(sock,'stream text header', device)
871
+ # Check if this is an XML form header
872
+ if self.is_xml_header (stream_status):
933
873
  # Get the basic averaging rate (V3 header)
934
- xml_root = self.getStreamXmlHeader (device=device, sock=sock)
935
- # Return the time based averaging string
874
+ xml_root = self.get_stream_xml_header (device=device, sock=sock)
875
+ # Return the time-based averaging string
936
876
  device_period = xml_root.find('.//devicePeriod')
937
877
  time_unit = 'uS'
938
- if device_period == None:
878
+ if device_period is None:
939
879
  device_period = xml_root.find('.//devicePerioduS')
940
- if device_period == None:
880
+ if device_period is None:
941
881
  device_period = xml_root.find('.//mainPeriod')
942
- if ('ns' in device_period.text):
882
+ if 'ns' in device_period.text:
943
883
  time_unit = 'nS'
944
- averageStr = device_period.text
945
884
 
946
- # Time column always first
947
- formatHeader = 'Time ' + time_unit + ','
885
+ # The time column always first
886
+ format_header = 'Time ' + time_unit + ','
948
887
  # Find the channels section of each group and iterate through it to add the channel columns
949
888
  for group in xml_root.iter():
950
- if (group.tag == "channels"):
889
+ if group.tag == "channels":
951
890
  for chan in group:
952
891
  # Avoid children that are not named channels
953
- if (chan.find('.//name') is not None):
954
- nameStr = chan.find('.//name').text
955
- unitStr = chan.find('.//units').text
956
- formatHeader = formatHeader + nameStr + " " + unitStr + ","
957
- return formatHeader
958
- # Handle legacy text headers here
892
+ if (chan.find('.//name') is not None):
893
+ name_str = chan.find('.//name').text
894
+ group_str = chan.find('.//group').text
895
+ unit_str = chan.find('.//units').text
896
+ format_header = format_header + name_str + " " + group_str + " " + unit_str + ","
897
+ format_header = format_header.rstrip(",")
898
+ return format_header
959
899
  else:
960
- streamStatus = streamStatus.split('\r\n')
961
- if 'Header Not Available' in streamStatus[0]:
962
- str = streamStatus[0] + '. Check stream has been ran on device.'
963
- logging.error(str)
964
- return str
965
- outputMode = self.sendAndReceiveText(sock,'Config Output Mode?', device)
966
- powerMode = self.sendAndReceiveText(sock,'stream mode power?', device)
967
- format = int(re.sub(r'^Format: ', '', streamStatus[index]))
900
+ stream_status = stream_status.split('\r\n')
901
+ if 'Header Not Available' in stream_status[0]:
902
+ err_str = stream_status[0] + '. Check stream has been ran on device.'
903
+ logging.error(err_str)
904
+ return err_str
905
+ output_mode = self.sendAndReceiveText(sock,'Config Output Mode?', device)
906
+ power_mode = self.sendAndReceiveText(sock,'stream mode power?', device)
907
+ data_format = int(re.sub(r'^Format: ', '', stream_status[index]))
968
908
  b0 = 1 #12V_I
969
909
  b1 = 1 << 1 #12V_V
970
910
  b2 = 1 << 2 #5V_I
971
911
  b3 = 1 << 3 #5V_V
972
- formatHeader = 'StripeNum, Trig, '
973
- if format & b3:
974
- if ('3V3' in outputMode):
975
- formatHeader = formatHeader + '3V3_V,'
912
+ format_header = 'StripeNum, Trig, '
913
+ if data_format & b3:
914
+ if '3V3' in output_mode:
915
+ format_header = format_header + '3V3_V,'
976
916
  else:
977
- formatHeader = formatHeader + '5V_V,'
978
- if format & b2:
979
- if ('3V3' in outputMode):
980
- formatHeader = formatHeader + ' 3V3_I,'
917
+ format_header = format_header + '5V_V,'
918
+ if data_format & b2:
919
+ if '3V3' in output_mode:
920
+ format_header = format_header + ' 3V3_I,'
981
921
  else:
982
- formatHeader = formatHeader + ' 5V_I,'
983
-
984
- if format & b1:
985
- formatHeader = formatHeader + ' 12V_V,'
986
- if format & b0:
987
- formatHeader = formatHeader + ' 12V_I'
988
- if 'Enabled' in powerMode:
989
- if ('3V3' in outputMode):
990
- formatHeader = formatHeader + ' 3V3_P'
922
+ format_header = format_header + ' 5V_I,'
923
+
924
+ if data_format & b1:
925
+ format_header = format_header + ' 12V_V,'
926
+ if data_format & b0:
927
+ format_header = format_header + ' 12V_I'
928
+ if 'Enabled' in power_mode:
929
+ if '3V3' in output_mode:
930
+ format_header = format_header + ' 3V3_P'
991
931
  else:
992
- formatHeader = formatHeader + ' 5V_P'
993
- if ((format & b1) or (format & b0)):
994
- formatHeader = formatHeader + ' 12V_P'
995
- return formatHeader
932
+ format_header = format_header + ' 5V_P'
933
+ if (data_format & b1) or (data_format & b0):
934
+ format_header = format_header + ' 12V_P'
935
+ return format_header
996
936
  except Exception as e:
997
937
  logging.error(device + ' Unable to get stream format.' + self.host + ':' + '{}'.format(self.port))
998
938
  raise e
999
939
 
1000
- # Get stripes out of the backends stream buffer for the specified device using text commands
1001
- # The objects connection needs to be opened (connect()) before this is used
1002
- def streamGetStripesText(self, sock, device, numStripes=4096, skipStatusCheck=False):
1003
-
1004
- bufferStatus = False
1005
- # Allows the status check to be skipped when emptying the buffer after streaming has stopped (saving time)
1006
- if (skipStatusCheck == False):
1007
- streamStatus = self.sendAndReceiveText(sock, 'stream?', device)
1008
- if ('Overrun' in streamStatus) or ('8388608 of 8388608' in streamStatus):
1009
- bufferStatus = True
1010
- stripes = self.sendAndReceiveText(sock, 'stream text all', device, readUntilCursor=True)
1011
- # time.sleep(0.001)
1012
- if stripes[-1:] != self.cursor:
1013
- return "Error no cursor returned."
1014
- else:
1015
- genEndOfFile = 'eof\r\n>'
1016
- if stripes[-6:] == genEndOfFile:
1017
- removeChar = -6
1018
- else:
1019
- removeChar = -1
1020
-
1021
- # stripes = stripes.split('\r\n')
1022
- # stripes = filter(None, stripes) #remove empty sting elements
1023
- #printText(stripes)
1024
- return bufferStatus, removeChar, stripes
1025
-
1026
- def avgStringFromPwr(self, avgPwrTwo):
1027
- if(avgPwrTwo==0):
1028
- return '0'
1029
- elif(avgPwrTwo==1):
1030
- return '2'
1031
- elif(avgPwrTwo > 1 and avgPwrTwo < 10 ):
1032
- avg = 2 ** int(avgPwrTwo)
1033
- return '{}'.format(avg)
1034
- elif(avgPwrTwo==10):
1035
- return '1k'
1036
- elif(avgPwrTwo==11):
1037
- return '2k'
1038
- elif(avgPwrTwo==12):
1039
- return '4k'
1040
- elif(avgPwrTwo==13):
1041
- return '8k'
1042
- elif(avgPwrTwo==14):
1043
- return '16k'
1044
- elif(avgPwrTwo==15):
1045
- return '32k'
1046
- else:
1047
- return 'Invalid Average Value'
1048
-
1049
- # TODO: MD Thinks this implements software averaging, is unused and now performed in QIS
1050
- # Works out average values of timescales longer than max device averaging
1051
- def averageStripes(self, leftover, streamAverage, newStripes, f, remainingStripes = []):
1052
- newString = str(newStripes)
1053
- newList = []
1054
- if remainingStripes == []:
1055
- newList = newString.split('\r\n')
1056
- else:
1057
- newList = remainingStripes
1058
- newList.extend(newString.split('\r\n'))
1059
- numElements = newList[0].count(' ') + 1
1060
- streamTotalAverage = leftover + streamAverage
1061
- splitList = [] * numElements
1062
- if len(newList) < streamTotalAverage:
1063
- remainingStripes = newList[:-1]
1064
- return leftover, remainingStripes
1065
- runningAverage = [0] * (len(newList[0].split(' ')) - 2)
1066
- j = 0
1067
- z = 1
1068
- for i in newList[:-1]:
1069
- splitList = i.split(' ')
1070
- splitNumbers = [int(x) for x in splitList[2:]]
1071
- runningAverage = [sum(x) for x in zip(runningAverage, splitNumbers)]
1072
- if z == math.floor(streamTotalAverage):
1073
- finalAverage = splitList[0:2] + [str(round(x / streamAverage)) for x in runningAverage]
1074
- for counter in xrange(len(finalAverage)-1):
1075
- finalAverage[counter] = finalAverage[counter] + ' '
1076
- for x in finalAverage:
1077
- f.write(x)
1078
- f.write('\r\n')
1079
- streamTotalAverage += streamAverage
1080
- j += 1
1081
- z += 1
1082
- remainingStripes = newList[int(math.floor(j * streamAverage + leftover)):-1]
1083
- leftover = (streamTotalAverage - streamAverage) % 1
1084
- return leftover, remainingStripes
1085
-
1086
- def deviceMulti(self, device):
1087
- if (device in self.deviceList):
940
+ def stream_get_stripes_text(self, sock, device: str) -> tuple[str, str]:
941
+ """
942
+ Retrieve and process text data from a QIS stream.
943
+ We try to ready a block of data and also check for end of data and error cases
944
+
945
+ Args:
946
+ sock:
947
+ The socket instance used for communication with the device.
948
+ device:
949
+ The device ID string
950
+
951
+ Returns:
952
+ A tuple containing:
953
+ - The status of the data stream as a comma seperated list of status items
954
+ - The retrieved text data from the stream.
955
+ """
956
+
957
+ stream_status = "running"
958
+ is_end_of_block = False
959
+
960
+ # Try and read the next blocks of stripes from QIS
961
+ stripes = self.sendAndReceiveText(sock, 'stream text all', device)
962
+
963
+ # The 'eof' marker ONLY indicates that the full number of requested stripes was not available.
964
+ # More may be found later.
965
+ if stripes.endswith("eof\r\n>"):
966
+ is_end_of_block = True
967
+ stripes = stripes.rstrip("eof\r\n>")
968
+ # The current reader seems to lose the final line feeds, so check for this
969
+ if len(stripes) > 0:
970
+ if not stripes.endswith("\r\n"):
971
+ stripes += "\r\n"
972
+
973
+ # If there is an unusually small data set, check the stream status to make sure data is coming
974
+ # 7 is a little arbitrary, but smaller than any possible stripe size. Over calling will not matter anyway
975
+ if len(stripes) < 7 or is_end_of_block:
976
+ current_status = self.sendAndReceiveText(sock, 'stream?', device).lower()
977
+ if "running" in current_status:
978
+ stream_status = "running"
979
+ elif "overrun" in current_status or "out of buffer" in current_status:
980
+ stream_status = "overrun"
981
+ elif "stopped" in current_status:
982
+ stream_status = "stopped"
983
+ # If the stream is stopped and at end of block, we have read all the data
984
+ if is_end_of_block:
985
+ stream_status = stream_status + "eof"
986
+
987
+ return stream_status, stripes
988
+
989
+ def device_control_index(self, device) -> int:
990
+ """
991
+ Returns the index of the device in the control lists. If the device is not
992
+ registered, then it is added first. This is a key part of allowing us to
993
+ track the status of multiple streaming devices and manage them from outside
994
+ their streaming thread
995
+
996
+ Args:
997
+ device:
998
+ Device ID string
999
+ Returns:
1000
+ Index of the device in the various control lists
1001
+
1002
+ """
1003
+ if device in self.deviceList:
1088
1004
  return self.deviceList.index(device)
1089
1005
  else:
1090
1006
  self.listSemaphore.acquire()
@@ -1093,7 +1009,17 @@ class QisInterface:
1093
1009
  self.listSemaphore.release()
1094
1010
  return self.deviceList.index(device)
1095
1011
 
1096
- def deviceDictSetup(self, module):
1012
+ def device_dict_setup(self, module) -> None:
1013
+ """
1014
+ Adds a dictionary entry for a new module we are connecting to (including the base QIS connection)
1015
+ This is used for tracking the status of modules throughout the streaming process
1016
+
1017
+ Args:
1018
+ module:
1019
+
1020
+ Returns:
1021
+ None
1022
+ """
1097
1023
  if module in self.deviceDict.keys():
1098
1024
  return
1099
1025
  elif module == 'QIS':
@@ -1105,83 +1031,70 @@ class QisInterface:
1105
1031
  self.deviceDict[module] = [False, 'Stopped', "User hasn't started stream"]
1106
1032
  self.dictSemaphore.release()
1107
1033
 
1108
- def streamInterrupt(self):
1109
- for key in self.deviceDict.keys():
1110
- if self.deviceDict[key][0]:
1111
- return True
1112
- return False
1113
-
1114
- def interruptList(self):
1115
- streamIssueList = []
1116
- for key in self.deviceDict.keys():
1117
- if self.deviceDict[key][0]:
1118
- streamIssue = [key]
1119
- streamIssue.append(self.deviceDict[key][1])
1120
- streamIssue.append(self.deviceDict[key][2])
1121
- streamIssueList.append(streamIssue)
1122
- return streamIssueList
1123
-
1124
- def waitStop(self):
1125
- running = 1
1126
- while running != 0:
1127
- threadNameList = []
1128
- for t1 in threading.enumerate():
1129
- threadNameList.append(t1.name)
1130
- running = 0
1131
- for module in self.deviceList:
1132
- if (module in threadNameList):
1133
- running += 1
1134
- time.sleep(0.5)
1135
- time.sleep(1)
1136
-
1137
- def convertStreamAverage (self, streamAveraging):
1138
- returnValue = 32000;
1139
- if ("k" in streamAveraging):
1140
- returnValue = streamAveraging.replace("k", "000")
1141
- else:
1142
- returnValue = streamAveraging
1034
+ # Pass in a stream header and we check if it is XML or legacy format
1035
+ def is_xml_header (self, header_text) -> bool:
1036
+ """
1037
+ Checks if the given header string is in XML format (as apposed to legacy text format) or an invalid string
1143
1038
 
1144
- return returnValue
1039
+ Args:
1040
+ header_text:
1041
+ The header string to evaluate
1042
+ Returns:
1043
+ True if the header is in XML form
1145
1044
 
1146
- # Pass in a stream header and we check if it is XML or legacy format
1147
- def isXmlHeader (self, headerText):
1148
- if('?xml version=' not in headerText):
1149
- return False;
1045
+ """
1046
+ if '?xml version=' not in header_text:
1047
+ return False
1150
1048
  else:
1151
1049
  return True
1152
1050
 
1153
1051
  # Internal function. Gets the stream header and parses it into useful information
1154
- def getStreamXmlHeader (self, device, sock=None):
1052
+ def get_stream_xml_header (self, device, sock=None) -> ET.Element:
1053
+ """
1054
+ Gets the XML format header from an attached device (which must have run or be running a stream)
1055
+ Parses the string into XML and returns the root element
1056
+
1057
+ Args:
1058
+ device:
1059
+ Device ID to return from
1060
+ sock:
1061
+ Optional QIS socket to use for communication.
1062
+
1063
+ Returns:
1064
+
1065
+ """
1066
+ header_data = None
1067
+
1155
1068
  try:
1156
- if sock == None:
1069
+ if sock is None:
1157
1070
  sock = self.sock
1158
1071
  count = 0
1159
- while(True):
1072
+ while True:
1160
1073
  if count > 5:
1161
1074
  break
1162
1075
  count += 1
1163
1076
  # Get the raw data
1164
- headerData = self.sendAndReceiveText(sock, sentText='stream text header', device=device)
1077
+ header_data = self.send_and_receive_text(sock, send_text='stream text header', device=device)
1165
1078
 
1166
1079
  # Check for no header (no stream started)
1167
- if('Header Not Available' in headerData):
1080
+ if 'Header Not Available' in header_data:
1168
1081
  logging.error(device + ' Stream header not available.' + self.host + ':' + str(self.port))
1169
1082
  continue
1170
1083
 
1171
1084
  # Check for XML format
1172
- if('?xml version=' not in headerData):
1085
+ if '?xml version=' not in header_data:
1173
1086
  logging.error(device + ' Header not in XML form.' + self.host + ':' + str(self.port))
1174
1087
  continue
1175
1088
 
1176
1089
  break
1177
- # Parse XML into structured format
1178
- xml_root = ET.fromstring(headerData)
1090
+ # Parse XML into a structured format
1091
+ xml_root = ET.fromstring(header_data)
1179
1092
 
1180
1093
  # Check header format is supported by quarchpy
1181
- versionStr = xml_root.find('.//version').text
1182
- if ('V3' not in versionStr):
1183
- logging.error(device + ' Stream header version not compatible: ' + xml_root['version'].text + '.' + self.host + ':' + str(self.port))
1184
- raise Exception ("Stream header version not supported");
1094
+ version_str = xml_root.find('.//version').text
1095
+ if 'V3' not in version_str:
1096
+ logging.error(device + ' Stream header version not compatible: ' + xml_root.find('version').text + '.' + self.host + ':' + str(self.port))
1097
+ raise Exception ("Stream header version not supported")
1185
1098
 
1186
1099
  # Return the XML structure for the code to use
1187
1100
  return xml_root
@@ -1190,516 +1103,106 @@ class QisInterface:
1190
1103
  logging.error(device + ' Exception while parsing stream header XML.' + self.host + ':' + str(self.port))
1191
1104
  raise e
1192
1105
 
1193
- def create_dir_structure(self, module, directory=None):
1106
+ def send_command (self, command: str, device: str = '', qis_socket: socket.socket=None, no_cursor_expected: bool=False, no_response_expected: bool=False, command_delay: float=0.0) -> str:
1194
1107
  """
1195
- Creates the QPS directory structure and (empty) files to be written to
1196
-
1197
- I've put a bunch of try-except just to be sure the directory is correctly created.
1198
- ( There's probably a better way of doing this than this )
1199
-
1200
- :param: module: String - Module string
1201
- :param: directory: String - Name of directory for QPS stream (defaults to default recording location if invalid)
1202
- :return: success: Boolean - Was the file structure created successfully?
1108
+ Sends a command and returns the response as a string. Multiple lines are escaped with CRLF.
1109
+ The command is sent to the QIS socket, and depending on the command will be replied by either QIS
1110
+ or the hardware module.
1111
+
1112
+ Args:
1113
+ command:
1114
+ Command string
1115
+ device:
1116
+ Optional Device ID string to send the command to. Use default/blank for QIS direct commands
1117
+ qis_socket:
1118
+ Optional Socket to use for the command, if the default is not wanted
1119
+ no_cursor_expected:
1120
+ Optional Flag true if the command does not return a cursor, so we should not wait for it
1121
+ no_response_expected:
1122
+ Optional Flag true if the command does not return a response, so we should not wait for it.
1123
+ command_delay:
1124
+ Optional delay to prevent commands running in close succession. Timed in seconds.
1125
+ Returns:
1126
+ Command response string or None if no response expected
1203
1127
  """
1204
-
1205
- directory = self.create_qps_directory(directory)
1206
-
1207
- digital_count = 0
1208
- non_dig_counter = 0
1209
- self.streamGroups = StreamGroups()
1210
- for index, i in enumerate(self.module_xml_header.findall('.//channels')):
1211
- self.streamGroups.add_group(index)
1212
- for item in i.findall('.//channel'):
1213
- self.streamGroups.groups[index].add_channel(item.find(".//name"), item.find(".//group"), item.find(".//dataPosition"))
1214
- if item.find(".//group").text == "Digital":
1215
- digital_count += 1
1216
- self.has_digitals = True
1217
- else:
1218
- non_dig_counter += 1
1219
-
1220
- # Inner folders for analogue and digital signals streaming
1221
- in_folder_analogue = "data000"
1222
- try:
1223
- inner_path_analogues = os.path.join(directory, in_folder_analogue)
1224
- os.mkdir(inner_path_analogues)
1225
- except:
1226
- logging.warning("Failed to make inner directory for analogue signals " + inner_path_analogues)
1227
- return False
1228
-
1229
- in_folder_digitals = "data101"
1230
- if self.has_digitals:
1231
- try:
1232
- inner_path_digitals = os.path.join(directory, in_folder_digitals)
1233
- os.mkdir(inner_path_digitals)
1234
- except:
1235
- logging.warning("Failed to make inner directory for digital signals "+ inner_path_digitals)
1236
- return False
1237
-
1238
- logging.debug("Steaming to : " + self.qps_record_dir_path)
1239
-
1240
- logging.debug("Creating qps data files")
1241
- try:
1242
- for i in range(non_dig_counter):
1243
- file_name = "data000_00"+i+"_000000000"
1244
- f = open(os.path.join(inner_path_analogues, file_name), "w")
1245
- f.close()
1246
- for i in range(digital_count):
1247
- x = i
1248
- while len(str(x)) < 3:
1249
- x = "0" + str(x)
1250
- file_name = "data101_"+x+"_000000000"
1251
- f = open(os.path.join(inner_path_digitals, file_name), "w")
1252
- f.close()
1253
- except:
1254
- logging.warning("failed to create qps data files for analogue signals")
1255
- return False
1256
-
1257
- logging.debug("Finished creating qps data files")
1258
-
1259
- logging.debug("Creating qps upper level files")
1260
- try:
1261
- file_names = ["annotations.xml", "notes.txt", "triggers.txt"]
1262
- for file_nome in file_names:
1263
- f = open(os.path.join(self.qps_record_dir_path, file_nome), "w")
1264
- f.close()
1265
- except Exception as err:
1266
- logging.warning("failed to create qps upper level files, "+err)
1267
- return False
1268
-
1269
- try:
1270
- # Adding data000.idx separate as it's written in bytes not normal text
1271
- f = open(os.path.join(self.qps_record_dir_path, "data000.idx"), "wb")
1272
- f.close()
1273
- if digital_count > 0:
1274
- f = open(os.path.join(self.qps_record_dir_path, "data101.idx"), "wb")
1275
- f.close()
1276
- except Exception as err:
1277
- logging.warning("failed to create data000.idx file, "+err)
1278
- return False
1279
-
1280
- logging.debug("Finished creating QPS dir structure")
1281
-
1282
- return True
1283
-
1284
- def create_qps_directory(self, directory):
1285
- folder_name = None
1286
- # Checking if there was a directory passed; and if it's a valid directory
1287
- if not directory:
1288
- directory = os.path.join(os.path.expanduser("~"), "AppData", "Local", "Quarch", "QPS", "Recordings")
1289
- logging.debug("No directory specified")
1290
- elif not os.path.isdir(directory):
1291
- new_dir = os.path.join(str(os.path.expanduser("~"), "AppData", "Local", "Quarch", "QPS", "Recordings"))
1292
- logging.warning(directory+" was not a valid directory, streaming to default location: \n"+new_dir)
1293
- directory = new_dir
1128
+ if no_response_expected:
1129
+ self.send_text(qis_socket, command, device)
1130
+ return ""
1294
1131
  else:
1295
- # Split the directory into a path of folders
1296
- folder_name = str(directory).split(os.sep)
1297
- # last folder name is the name we want
1298
- folder_name = folder_name[-1]
1299
- # Make it known to the entire class that the path we're streaming to is the one sent across by the user
1300
- self.qps_record_dir_path = directory
1301
-
1302
- # If no folder name for the stream was passed, then default to 'quarchpy_recording' and a timestamp
1303
- if not folder_name:
1304
- folder_name = "quarchpy_recording"
1305
- folder_name = folder_name + "-" + time.time()
1306
- path = os.path.join(directory, self.qps_stream_folder_name)
1307
- os.mkdir(path)
1308
- self.qps_record_dir_path = path
1309
-
1310
- self.qps_stream_folder_name = folder_name
1311
-
1312
- return directory
1313
-
1314
- def create_index_file(self):
1315
- """
1316
- Create the necessary index file for QPS data000.idx
1317
-
1318
- For future revisions, this should be updated if there are file limits on each data file
1319
- Current implementation assumes only 1 of each data file are made.
1320
-
1321
- No Return./
1322
- """
1323
-
1324
- stream_header_size = -1
1325
-
1326
- my_byte_array = []
1327
-
1328
- # tree = ET.ElementTree(ET.fromstring(self.module_xml_header[:-1]))
1329
- tree = self.module_xml_header
1330
-
1331
- return_b_array = []
1332
- outBuffer = []
1333
- x = 20
1334
- stream_header_size = 20
1335
-
1336
- temp_dict = {"channels": 0}
1337
-
1338
- return_b_array, stream_header_size = self.add_header_to_byte_array(return_b_array, stream_header_size,
1339
- temp_dict, tree, is_digital=False)
1340
-
1341
- self.add_header_to_buffer(outBuffer, return_b_array, stream_header_size, temp_dict)
1342
-
1343
- # Attempting to read the size of the first file in data files
1344
- file = os.path.join(self.qps_record_dir_path, "data000", "data000_000_000000000")
1345
- data = None
1346
- with open(file, "rb") as f:
1347
- data = f.read() # if you only wanted to read 512 bytes, do .read(512)
1348
-
1349
- if not data:
1350
- raise "No data written to file"
1351
-
1352
- num_records = len(data) / 8
1353
- logging.debug("num_record = " + num_records)
1354
- return_b_array.append(int(num_records).to_bytes(4, byteorder='big'))
1355
-
1356
- start_number = 0
1357
- logging.debug("start_record = " + start_number)
1358
- return_b_array.append(start_number.to_bytes(8, byteorder='big'))
1359
-
1360
- num_records = num_records - 1
1361
- logging.debug("last_Record_number = "+num_records)
1362
- return_b_array.append(int(num_records).to_bytes(8, byteorder='big'))
1363
-
1364
- # Add names of every file in data000 dir here.
1365
- files = os.listdir(os.path.join(self.qps_record_dir_path, "data000"))
1366
- for file3 in files:
1367
- # print(file)
1368
- item = strToBb(file3, False)
1369
- # print(item)
1370
- while len(item) < 32:
1371
- item.append("\x00")
1372
- # print(item)
1373
- return_b_array.append(item)
1374
-
1375
- with open(os.path.join(self.qps_record_dir_path, "data000.idx"), "ab") as f:
1376
- for item in outBuffer:
1377
- # print(item)
1378
- # print(type(item))
1379
- f.write(bytes(item))
1380
- # f.write(outBuffer)
1381
-
1382
- with open(os.path.join(self.qps_record_dir_path, "data000.idx"), "ab") as f:
1383
- self.write_b_array_to_idx_file(f, return_b_array)
1384
-
1385
- def create_index_file_digitals(self):
1386
- """
1387
- Create the necessary index file for QPS data101.idx
1388
-
1389
- For future revisions, this should be updated if there are file limits on each data file
1390
- Current implementation assumes only 1 of each data file are made.
1391
-
1392
- No Return.
1393
- """
1394
-
1395
- stream_header_size = -1
1396
- my_byte_array = []
1397
- tree = self.module_xml_header
1398
- return_b_array = []
1399
- outBuffer = []
1400
- temp_dict = {}
1401
-
1402
- return_b_array, stream_header_size = self.add_header_to_byte_array(return_b_array, stream_header_size,
1403
- temp_dict, tree, is_digital=True)
1404
-
1405
- self.add_header_to_buffer(outBuffer, return_b_array, stream_header_size, temp_dict)
1406
-
1407
- # Attempting to read the size of the first file in data files
1408
- file = os.path.join(self.qps_record_dir_path, "data101", "data101_000_000000000")
1409
- data = None
1410
- with open(file, "rb") as f:
1411
- data = f.read() # if you only wanted to read 512 bytes, do .read(512)
1412
-
1413
- if not data:
1414
- raise "No data written to file"
1415
-
1416
- num_records = len(data) / 8
1417
- logging.debug("num_record = "+ num_records)
1418
- return_b_array.append(int(num_records).to_bytes(4, byteorder='big'))
1419
-
1420
- start_number = 0
1421
- logging.debug("start_record = "+start_number)
1422
- return_b_array.append(start_number.to_bytes(8, byteorder='big'))
1423
-
1424
- num_records = num_records - 1
1425
- logging.debug("last_Record_number = "+ num_records)
1426
- return_b_array.append(int(num_records).to_bytes(8, byteorder='big'))
1427
-
1428
- # Add names of every file in data000 dir here.
1429
- files = os.listdir(os.path.join(self.qps_record_dir_path, "data101"))
1430
- for file3 in files:
1431
- # print(file)
1432
- item = strToBb(file3, False)
1433
- # print(item)
1434
- while len(item) < 32:
1435
- item.append("\x00")
1436
- # print(item)
1437
- return_b_array.append(item)
1438
-
1439
- with open(os.path.join(self.qps_record_dir_path, "data101.idx"), "ab") as f:
1440
- for item in outBuffer:
1441
- f.write(bytes(item))
1442
-
1443
- with open(os.path.join(self.qps_record_dir_path, "data101.idx"), "ab") as f:
1444
- self.write_b_array_to_idx_file(f, return_b_array)
1445
-
1446
- def add_header_to_byte_array(self, return_b_array, stream_header_size, temp_dict, tree, is_digital=False):
1447
- for element in tree:
1448
- if "legacyVersion" in element.tag:
1449
- intItem = element.text
1450
- temp_dict[element.tag] = intItem
1451
- # my_byte_array.append(int.to_bytes(intItem, 'big'))
1452
- if "legacyAverage" in element.tag:
1453
- intItem = element.text
1454
- temp_dict[element.tag] = intItem
1455
- # my_byte_array.append(int.to_bytes(intItem, 'big'))
1456
- if "legacyFormat" in element.tag:
1457
- intItem = element.text
1458
- temp_dict[element.tag] = intItem
1459
- # my_byte_array.append(int.to_bytes(intItem, 'big'))
1460
- if "mainPeriod" in element.tag:
1461
- intItem = element.text
1462
- intItem = intItem[:-2]
1463
- temp_dict[element.tag] = intItem
1464
- if "channels" in element.tag:
1465
- counter = 0
1466
- for child in element:
1467
- for child2 in child:
1468
- if "group" in child2.tag:
1469
- if is_digital:
1470
- if str(child2.text).lower() == "digital":
1471
- counter += 1
1472
- else:
1473
- if str(child2.text).lower() != "digital":
1474
- counter += 1
1475
-
1476
- temp_dict[element.tag] = counter
1477
-
1478
- return_b_array = []
1479
-
1480
- stream_header_size = 20
1481
-
1482
- # Cycle through all the channels.
1483
- for child in element:
1484
-
1485
- if child.tag == "groupId":
1486
- continue
1487
-
1488
- if is_digital:
1489
- # skip channel if we're only looking for digitals
1490
- if not str(child.find(".//group").text).lower() == "digital":
1491
- continue
1492
- else:
1493
- # skip if we're looking for analogues
1494
- if str(child.find(".//group").text).lower() == "digital":
1495
- continue
1496
-
1497
- # my_byte_array.append(int.to_bytes(5, 'big'))
1498
- return_b_array.append(int(5).to_bytes(4, byteorder='big'))
1499
- stream_header_size += 4
1500
- name = None
1501
-
1502
- for child2 in child:
1503
-
1504
- if "group" in child2.tag:
1505
- my_byte_array = strToBb(str(child2.text))
1506
- return_b_array.append(my_byte_array)
1507
- # QPS index file requires name tag come after group tag.
1508
- return_b_array.append(name)
1509
- stream_header_size += len(my_byte_array)
1510
-
1511
- if "name" in child2.tag:
1512
- my_byte_array = strToBb(str(child2.text))
1513
- name = my_byte_array
1514
- stream_header_size += len(my_byte_array)
1515
-
1516
- if "units" in child2.tag:
1517
- my_byte_array = strToBb(str(child2.text))
1518
- return_b_array.append(my_byte_array)
1519
- stream_header_size += len(my_byte_array)
1520
-
1521
- """
1522
- # Unclear if the only thing here is TRUE
1523
- bb = strToBB( Boolean.toString( cdr.isUsePrefixStr() ));
1524
- bbList.add(bb);
1525
- retVal += bb.capacity();
1526
- """
1527
- my_byte_array = strToBb(str("true"))
1528
- return_b_array.append(my_byte_array)
1529
- stream_header_size += len(my_byte_array)
1530
-
1531
- if "maxTValue" in child2.tag:
1532
- my_byte_array = strToBb(str(child2.text))
1533
- return_b_array.append(my_byte_array)
1534
- stream_header_size += len(my_byte_array)
1535
-
1536
- return return_b_array, stream_header_size
1537
-
1538
- def add_header_to_buffer(self, outBuffer, return_b_array, stream_header_size, temp_dict):
1539
- number = 2
1540
- outBuffer.append(number.to_bytes(4, byteorder='big'))
1541
- logging.debug("indexVersion : "+ number)
1542
-
1543
- number = 1 if self.has_digitals else 0
1544
- outBuffer.append(number.to_bytes(4, byteorder='big'))
1545
- logging.debug("value0 : "+ number)
1546
- number = stream_header_size
1547
- outBuffer.append(number.to_bytes(4, byteorder='big'))
1548
- logging.debug("header_size : "+number)
1549
- logging.debug("legacyVersion : "+ temp_dict['legacyVersion'])
1550
- outBuffer.append(int(temp_dict["legacyVersion"]).to_bytes(4, byteorder='big'))
1551
- logging.debug("legacyAverage : " + temp_dict['legacyAverage'])
1552
- outBuffer.append(int(temp_dict["legacyAverage"]).to_bytes(4, byteorder='big'))
1553
- logging.debug("legacyFormat : "+temp_dict['legacyFormat'])
1554
- outBuffer.append(int(temp_dict["legacyFormat"]).to_bytes(4, byteorder='big'))
1555
- logging.debug("mainPeriod : "+temp_dict['mainPeriod'])
1556
- outBuffer.append(int(temp_dict["mainPeriod"]).to_bytes(4, byteorder='big'))
1557
- logging.debug("channels : "+temp_dict['channels'])
1558
- outBuffer.append(int(temp_dict["channels"]).to_bytes(4, byteorder='big'))
1559
- return_b_array.append(int(self.qps_record_start_time).to_bytes(8, byteorder='big'))
1560
- index_record_state = True
1561
- logging.debug(int(1))
1562
- return_b_array.append(int(1).to_bytes(1, byteorder='big'))
1563
- record_type = 1
1564
- logging.debug("record type : "+int(index_record_state))
1565
- return_b_array.append(int(record_type).to_bytes(1, byteorder='big'))
1566
-
1567
- def write_b_array_to_idx_file(self, f, return_b_array):
1568
- # print(return_b_array)
1569
- for item in return_b_array:
1570
- # print(item)
1571
- if isinstance(item, int):
1572
- # 'f.write(str(item).encode())
1573
- # print(item)
1574
- f.write(bytes([item]))
1575
- continue
1576
- if isinstance(item, bytes):
1577
- # print(item)
1578
- f.write(bytes(item))
1579
- continue
1580
- if isinstance(item, list):
1581
- for character in item:
1582
- if isinstance(character, int):
1583
- f.write(bytes([character]))
1584
- continue
1585
- elif isinstance(item, bytes):
1586
- f.write(item)
1587
- continue
1588
- else:
1589
- f.write(str(character).encode())
1590
- continue
1591
-
1592
- def create_qps_file(self, module):
1593
- """
1594
- Creates the end QPS file that is used to open QPS
1595
-
1596
- :param module: Module QTL number that was used for the stream
1597
- :return:
1598
- """
1599
-
1600
- with open(os.path.join(self.qps_record_dir_path, self.qps_stream_folder_name + ".qps"), "w") as f:
1601
- x = datetime.datetime.fromtimestamp(self.qps_record_start_time / 1000.0)
1602
- x = str(x).split(".")
1603
- x = x[0]
1604
- x = x.replace("-", " ")
1605
- f.write("Started: "+x+"\n")
1606
- f.write("Device: " + module + "\n")
1607
- f.write("Fixture: \n")
1608
-
1609
- x = datetime.datetime.now()
1610
- x = str(x).split(".")
1611
- x = x[0]
1612
- x = x.replace("-", " ")
1613
- f.write("Saved: "+x+ "\n")
1614
-
1615
-
1616
- def sendCommand(self, cmd, device="", timeout=20,sock=None,readUntilCursor=True, betweenCommandDelay=0.0, expectedResponse=True):
1617
- '''Send command is used to send a command to QIS and as far as I can see it has no difference than sendAndReceiveCmd'''
1618
- if expectedResponse is True:
1619
- if sock == None:
1620
- sock = self.sock
1132
+ if qis_socket is None:
1133
+ qis_socket = self.sock
1621
1134
  if not (device == ''):
1622
- self.deviceDictSetup(device)
1623
- res = self.sendAndReceiveText(sock, cmd, device, readUntilCursor)
1624
- if (betweenCommandDelay > 0):
1625
- time.sleep(betweenCommandDelay)
1135
+ self.device_dict_setup(device)
1136
+ res = self.send_and_receive_text(qis_socket, command, device, not no_cursor_expected)
1626
1137
 
1627
- # If ends with cursor get rid of it
1138
+ # This is a poor sleep mechanism! Better would be to track time since the last command
1139
+ if command_delay > 0:
1140
+ time.sleep(command_delay)
1141
+
1142
+ # Trim the expected cursor at the end of the response
1628
1143
  if res[-3:] == '\r\n>':
1629
1144
  res = res[:-3] # remove last three chars - '\r\n>'
1630
1145
  elif res[-2:] == '\n>':
1631
1146
  res = res[:-2] # remove last 2 chars - '\n>'
1632
1147
  return res
1633
1148
 
1634
- else :
1635
- self.sendText(sock, cmd, device)
1636
- return
1637
-
1638
- # when sending commands to module (as opposed to back end)
1639
- # If read until cursor is set to True (which is default) then keep reading response until a cursor is returned as the last character of result string
1640
- # After command is sent wait for betweenCommandDelay which defaults to 0 but can be specified to add a delay between commands
1641
- # The objects connection needs to be opened (connect()) before this is used
1642
- def sendCmd(self, device='', cmd='$help', sock=None, readUntilCursor=True, betweenCommandDelay=0.0, expectedResponse = True):
1643
- '''Send command is used to send a command to QIS and as far as I can see it has no difference than sendAndReceiveCmd'''
1644
- if expectedResponse is True:
1645
- res = self.sendAndReceiveCmd(device=device, cmd=cmd, sock=sock, readUntilCursor=readUntilCursor, betweenCommandDelay=betweenCommandDelay)
1646
- #If ends with cursor get rid of it
1647
- if res[-1:] == self.cursor:
1648
- res = res[:-3] #remove last three chars - hopefully '\r\n>'
1649
- return res
1650
- else :
1651
- self.sendText(sock, cmd, device)
1652
- return
1149
+ def send_and_receive_text(self, sock, send_text='$help', device='', read_until_cursor=True) -> str:
1150
+ """
1151
+ Internal function for command handling. This handles complex cases such as timeouts and XML
1152
+ response formatting, which conflicts with the default cursor
1153
+
1154
+ Args:
1155
+ sock:
1156
+ The socket to communicate over
1157
+ send_text:
1158
+ The command text to send
1159
+ device:
1160
+ Optional device ID to send the command to
1161
+ read_until_cursor:
1162
+ Flag to indicate if we should read until the cursor is returned
1163
+
1164
+ Returns:
1165
+ Response string from the module
1166
+ """
1653
1167
 
1654
- def sendAndReceiveCmd(self, sock=None, cmd='$help', device='', readUntilCursor=True, betweenCommandDelay=0.0):
1655
- if sock==None:
1656
- sock = self.sock
1657
- if not (device == ''):
1658
- self.deviceDictSetup(device)
1659
- res = self.sendAndReceiveText(sock, cmd, device, readUntilCursor)
1660
- if (betweenCommandDelay > 0):
1661
- time.sleep(betweenCommandDelay)
1662
- #If ends with cursor get rid of it
1663
- if res[-1:] == '>':
1664
- res = res[:-3] #remove last three chars - hopefully '\r\n>'
1665
- return cmd + ' : ' + res
1666
-
1667
- def sendAndReceiveText(self, sock, sentText='$help', device='', readUntilCursor=True):
1668
- # Send text to QIS
1669
- # The objects connection needs to be opened (connect()) before this is used
1670
- # If read until cursor is set to True (which is default) then keep reading response until a cursor is returned as the last character of result string
1671
-
1672
- # do sendText
1168
+ # Avoid multiple threads trying to send at once. QIS only has a single socket for all devices
1673
1169
  self.sockSemaphore.acquire()
1674
1170
  try:
1675
- #Send Text
1676
- self.sendText(sock, sentText, device)
1677
- #Receive Response
1678
- res = self.receiveText(sock)
1679
- # Error Check / validate response
1171
+ # Send the command
1172
+ self.send_text(sock, send_text, device)
1173
+ # Receive Response
1174
+ res = self.receive_text(sock)
1175
+ # If we get no response, log an error and try to flush using a simple stream query command
1176
+ # If that works, we retry our command. In fail cases we raise an exception and abort as
1177
+ # the connection is bad
1680
1178
  if len(res) == 0:
1681
- #logging.error("Empty response from QIS.")
1682
- self.sendText(sock, "stream?", device)
1683
- res = self.receiveText(sock)
1179
+ logging.error("Empty response from QIS for cmd: " + send_text + ". To device: " + device)
1180
+ self.send_text(sock, "stream?", device)
1181
+ res = self.receive_text(sock)
1684
1182
  if len(res) != 0:
1685
- self.sendText(sock, sentText, device)
1686
- res = self.receiveText(sock)
1183
+ self.send_text(sock, send_text, device)
1184
+ res = self.receive_text(sock)
1687
1185
  if len(res) == 0:
1688
- raise (Exception("Empty response from QIS. Sent: " + sentText))
1186
+ raise (Exception("Empty response from QIS. Sent: " + send_text))
1689
1187
  else:
1690
- raise (Exception("Empty response from QIS. Sent: " + sentText))
1188
+ raise (Exception("Empty response from QIS. Sent: " + send_text))
1691
1189
 
1692
1190
  if res[0] == self.cursor:
1693
- logging.warning('Only returned a cursor from QIS. Sent: ' + sentText)
1191
+ logging.error('Only returned a cursor from QIS. Sent: ' + send_text)
1192
+ raise (Exception("Only returned a cursor from QIS. Sent: " + send_text))
1694
1193
  if 'Create Socket Fail' == res[0]: # If create socked fail (between QIS and tcp/ip module)
1695
- logging.warning(res[0])
1194
+ logging.error(res[0])
1195
+ raise (Exception("Failed to open QIS to module socked. Sent: " + send_text))
1696
1196
  if 'Connection Timeout' == res[0]:
1697
- logging.warning(res[0])
1698
- # If reading until a cursor comes back then keep reading until a cursor appears or max tries exceeded
1699
- if readUntilCursor:
1700
- import xml.etree.ElementTree as ET
1197
+ logging.error(res[0])
1198
+ raise (Exception("Connection timeout from QIS. Sent: " + send_text))
1199
+
1200
+ # If reading until a cursor comes back, then keep reading until a cursor appears or max tries exceeded
1201
+ # Because large XML responses are possible, we need to validate them as complete before looking
1202
+ # for a final cursor
1203
+ if read_until_cursor:
1701
1204
 
1702
- maxReads = 1000
1205
+ max_reads = 1000
1703
1206
  count = 1
1704
1207
  is_xml = False
1705
1208
 
@@ -1726,111 +1229,255 @@ class QisInterface:
1726
1229
  break
1727
1230
 
1728
1231
  # Receive more data
1729
- res += self.receiveText(sock)
1232
+ res += self.receive_text(sock)
1730
1233
 
1731
1234
  # Increment count and check for max reads
1732
1235
  count += 1
1733
- if count >= maxReads:
1236
+ if count >= max_reads:
1734
1237
  raise Exception('Count = Error: max reads exceeded before response was complete')
1735
1238
 
1736
1239
  return res
1737
1240
 
1738
1241
  except Exception as e:
1739
- #something went wrong during send qis cmd
1740
- logging.error("Error! Unable to retrieve response from QIS. Command: " + sentText)
1242
+ # Something went wrong during send qis cmd
1243
+ logging.error("Error! Unable to retrieve response from QIS. Command: " + send_text)
1741
1244
  logging.error(e)
1742
1245
  raise e
1743
1246
  finally:
1744
1247
  self.sockSemaphore.release()
1745
1248
 
1249
+ def receive_text(self, sock) -> str:
1250
+ """
1251
+ Received bytes from the socket and converts to a test string
1252
+ Args:
1253
+ sock:
1254
+ Socket to communicate over
1255
+
1256
+ Returns:
1257
+
1258
+ """
1259
+ res = bytearray()
1260
+ res.extend(self.rx_bytes(sock))
1261
+ res = res.decode()
1746
1262
 
1747
- def receiveText(self, sock):
1748
- if self.pythonVersion == '3':
1749
- res = bytearray()
1750
- res.extend(self.rxBytes(sock))
1751
- res = res.decode()
1752
- else:
1753
- res = self.rxBytes(sock)
1754
1263
  return res
1755
1264
 
1756
- def sendText(self, sock, message='$help', device=''):
1757
- # Send text to QIS, don't read it's response
1758
- # The objects connection needs to be opened (connect()) before this is used
1265
+ def send_text(self, sock, message='$help', device='') -> bool:
1266
+ """
1267
+
1268
+ Args:
1269
+ sock:
1270
+ Socket to communicate over
1271
+ message:
1272
+ text command to send
1273
+ device:
1274
+ Optional device ID to target with the command
1275
+
1276
+ Returns:
1277
+
1278
+ """
1279
+ # Send text to QIS, don't read its response
1759
1280
  if device != '':
1760
- #specialTimeout = '%500000'
1761
- #message = device + ' ' + specialTimeout + ' ' + message
1762
1281
  message = device + ' ' + message
1763
- #printText('Sending: "' + message + '" ' + self.host + ':' + str(self.port))
1764
1282
 
1765
- if self.pythonVersion == 2:
1766
- sock.sendall(message + '\r\n')
1767
- else:
1768
- convM = message + '\r\n'
1769
- sock.sendall(convM.encode('utf-8'))
1770
- return 'Sent:' + message
1771
-
1772
- def rxBytes(self,sock):
1773
- #sock.setblocking(0) #make socket non-blocking
1774
- #printText('rxBytes')
1775
- maxExceptions=10
1283
+ conv_mess = message + '\r\n'
1284
+ sock.sendall(conv_mess.encode('utf-8'))
1285
+ return True
1286
+
1287
+ def rx_bytes(self,sock) -> bytes:
1288
+ """
1289
+ Reads an array of bytes from the socket as part of handling a command response
1290
+
1291
+ Args:
1292
+ sock:
1293
+ Socket to communicate over
1294
+ Returns:
1295
+ Bytes read
1296
+
1297
+ """
1298
+
1299
+ max_exceptions=10
1776
1300
  exceptions=0
1777
- maxReadRepeats=50
1778
- readRepeats=0
1301
+ max_read_repeats=50
1302
+ read_repeats=0
1779
1303
  timeout_in_seconds = 10
1780
- #Keep trying to read bytes until we get some, unless number of read repeads or exceptions is exceeded
1304
+
1305
+ #Keep trying to read bytes until we get some, unless the number of read repeats or exceptions is exceeded
1781
1306
  while True:
1782
1307
  try:
1783
- #select.select returns a list of waitable objects which are ready. On windows it has to be sockets.
1784
- #The first arguement is a list of objects to wait for reading, second writing, third 'exceptional condition'
1785
- #We only use the read list and our socket to check if it is readable. if no timeout is specified then it blocks until it becomes readable.
1308
+ # Select.select returns a list of waitable objects which are ready. On Windows, it has to be sockets.
1309
+ # The first argument is a list of objects to wait for reading, second writing, third 'exceptional condition'
1310
+ # We only use the read list and our socket to check if it is readable. if no timeout is specified,
1311
+ # then it blocks until it becomes readable.
1312
+ # TODO: AN: It is very unclear why we try to open a new socket if data is not ready.
1313
+ # This would seem like a hard failure case!
1786
1314
  ready = select.select([sock], [], [], timeout_in_seconds)
1787
- #time.sleep(0.1)
1788
- #ready = [1,2]
1789
1315
  if ready[0]:
1790
1316
  ret = sock.recv(self.maxRxBytes)
1791
- #time.sleep(0.1)
1792
1317
  return ret
1318
+ # If the socket is not ready for read, open a new one
1793
1319
  else:
1794
- #printText('rxBytes - readRepeats + 1')
1795
-
1320
+ logging.error("Timeout: No bytes were available to read from QIS")
1321
+ logging.debug("Opening new QIS socket")
1796
1322
  sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
1797
1323
  sock.connect((self.host, self.port))
1798
1324
  sock.settimeout(5)
1799
1325
 
1800
1326
  try:
1801
- welcomeString = self.sock.recv(self.maxRxBytes).rstrip()
1802
- welcomeString = 'Connected@' + self.host + ':' + str(self.port) + ' ' + '\n ' + welcomeString
1803
- printText('New Welcome:' + welcomeString)
1327
+ welcome_string = self.sock.recv(self.maxRxBytes).rstrip()
1328
+ welcome_string = 'Connected@' + self.host + ':' + str(self.port) + ' ' + '\n ' + welcome_string
1329
+ logging.debug("Socket opened: " + welcome_string)
1804
1330
  except Exception as e:
1805
- logging.error('tried and failed to get new welcome')
1331
+ logging.error('Timeout: Failed to open new QIS socket and get the welcome message')
1806
1332
  raise e
1807
1333
 
1808
- readRepeats=readRepeats+1
1334
+ read_repeats=read_repeats+1
1809
1335
  time.sleep(0.5)
1810
1336
 
1811
1337
  except Exception as e:
1812
- #printText('rxBytes - exceptions + 1')
1813
- exceptions=exceptions+1
1814
- time.sleep(0.5)
1815
1338
  raise e
1816
1339
 
1817
- #If read repeats has been exceeded we failed to get any data on this read.
1818
- # !!! This is likely to break whatever called us !!!
1819
- if readRepeats >= maxReadRepeats:
1820
- logging.error('Max read repeats exceeded - returning.')
1821
- return 'No data received from QIS'
1822
- #If number of exceptions exceeded then give up by exiting
1823
- if exceptions >= maxExceptions:
1824
- logging.error('Max exceptions exceeded - exiting') #exceptions are probably 10035 non-blocking socket could not complete immediatley
1825
- exit()
1826
-
1827
-
1828
- def strToBb(string_in, add_length=True):
1829
- length = len(str(string_in))
1830
- b_array = []
1831
- if add_length:
1832
- b_array.append(length)
1833
- for character in str(string_in):
1834
- b_array.append(character)
1835
-
1836
- return b_array
1340
+ # If we read no data, its probably an error, but there may be cases where an empty response is valid
1341
+ if read_repeats >= max_read_repeats:
1342
+ logging.error('Max read repeats exceeded')
1343
+ return b''
1344
+
1345
+ def closeConnection(self, sock=None, conString: str=None) -> str:
1346
+ """
1347
+ deprecated:: 2.2.13
1348
+ Use `close_connection` instead.
1349
+ """
1350
+ return self.close_connection (sock=sock, con_string=conString)
1351
+
1352
+ def startStream(self, module: str, fileName: str, fileMaxMB: int, releaseOnData: bool, separator: str,
1353
+ streamDuration: int = None, inMemoryData=None, outputFileHandle=None, useGzip: bool = None):
1354
+ """
1355
+ deprecated:: 2.2.13
1356
+ Use `start_stream` instead.
1357
+ """
1358
+ return self.start_stream(module, fileName, fileMaxMB, releaseOnData, separator, streamDuration, inMemoryData, outputFileHandle, useGzip)
1359
+
1360
+ def stopStream(self, module, blocking=True):
1361
+ """
1362
+ deprecated:: 2.2.13
1363
+ Use `stop_stream` instead.
1364
+ """
1365
+ return self.stop_stream(module, blocking)
1366
+
1367
+ def getDeviceList(self, sock=None):
1368
+ """
1369
+ deprecated:: 2.2.13
1370
+ Use `start_stream_thread_qps` instead.
1371
+ """
1372
+ return self.get_device_list(sock)
1373
+
1374
+ def scanIP(self, QisConnection, ipAddress):
1375
+ """
1376
+ deprecated:: 2.2.13
1377
+ Use `scan_ip` instead.
1378
+ """
1379
+ return self.scan_ip(QisConnection, ipAddress)
1380
+
1381
+ def GetQisModuleSelection(self, favouriteOnly=True, additionalOptions=['rescan', 'all con types', 'ip scan'],
1382
+ scan=True):
1383
+ """
1384
+ deprecated:: 2.2.13
1385
+ Use `get_qis_module_selection` instead.
1386
+ """
1387
+ return self.get_qis_module_selection(favouriteOnly, additionalOptions, scan)
1388
+
1389
+ def sendCommand(self, cmd, device="", timeout=20,sock=None,readUntilCursor=True, betweenCommandDelay=0.0, expectedResponse=True) -> str:
1390
+ """
1391
+ deprecated:: 2.2.13
1392
+ Use `send_command` instead.
1393
+ """
1394
+ return self.send_command(cmd, device, sock, False, not expectedResponse, betweenCommandDelay)
1395
+
1396
+ def sendCmd(self, device='', cmd='$help', sock=None, readUntilCursor=True, betweenCommandDelay=0.0, expectedResponse = True) -> str:
1397
+ """
1398
+ deprecated:: 2.2.13
1399
+ Use `send_command` instead.
1400
+ """
1401
+ return self.send_command(cmd, device, sock, not readUntilCursor, not expectedResponse, betweenCommandDelay)
1402
+
1403
+ def sendAndReceiveCmd(self, sock=None, cmd='$help', device='', readUntilCursor=True, betweenCommandDelay=0.0) -> str:
1404
+ """
1405
+ deprecated:: 2.2.13
1406
+ Use `send_command` instead.
1407
+ """
1408
+ return self.send_command(cmd, device, sock, not readUntilCursor, no_response_expected=False, command_delay=betweenCommandDelay)
1409
+
1410
+ def streamRunningStatus(self, device: str) -> str:
1411
+ """
1412
+ deprecated:: 2.2.13
1413
+ Use `stream_running_status` instead.
1414
+ """
1415
+ return self.stream_running_status(device)
1416
+
1417
+ def streamHeaderFormat(self, device, sock=None) -> str:
1418
+ """
1419
+ deprecated:: 2.2.13
1420
+ Use `stream_header_format` instead.
1421
+ """
1422
+ return self.stream_header_format(device, sock)
1423
+
1424
+ def streamInterrupt(self) -> bool:
1425
+ """
1426
+ deprecated:: 2.2.13
1427
+ No indication this is used anywhere
1428
+ """
1429
+ for key in self.deviceDict.keys():
1430
+ if self.deviceDict[key][0]:
1431
+ return True
1432
+ return False
1433
+
1434
+ def interruptList(self):
1435
+ """
1436
+ deprecated:: 2.2.13
1437
+ No indication this is used anywhere
1438
+ """
1439
+ streamIssueList = []
1440
+ for key in self.deviceDict.keys():
1441
+ if self.deviceDict[key][0]:
1442
+ streamIssue = [key]
1443
+ streamIssue.append(self.deviceDict[key][1])
1444
+ streamIssue.append(self.deviceDict[key][2])
1445
+ streamIssueList.append(streamIssue)
1446
+ return streamIssueList
1447
+
1448
+ def waitStop(self):
1449
+ """
1450
+ deprecated:: 2.2.13
1451
+ No indication this is used anywhere
1452
+ """
1453
+ running = 1
1454
+ while running != 0:
1455
+ threadNameList = []
1456
+ for t1 in threading.enumerate():
1457
+ threadNameList.append(t1.name)
1458
+ running = 0
1459
+ for module in self.deviceList:
1460
+ if (module in threadNameList):
1461
+ running += 1
1462
+ time.sleep(0.5)
1463
+ time.sleep(1)
1464
+
1465
+ def convertStreamAverage (self, streamAveraging):
1466
+ """
1467
+ deprecated:: 2.2.13
1468
+ No indication this is used anywhere
1469
+ """
1470
+ returnValue = 32000
1471
+ if ("k" in streamAveraging):
1472
+ returnValue = streamAveraging.replace("k", "000")
1473
+ else:
1474
+ returnValue = streamAveraging
1475
+
1476
+ return returnValue
1477
+
1478
+ def sendAndReceiveText(self, sock, sendText='$help', device='', readUntilCursor=True) -> str:
1479
+ """
1480
+ deprecated:: 2.2.13
1481
+ Use `send_and_receive_text` instead.
1482
+ """
1483
+ return self.send_and_receive_text(sock, send_text=sendText, device=device, read_until_cursor=readUntilCursor)