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.
- quarchpy/_version.py +1 -1
- quarchpy/connection_specific/QPS/3rdPartyLicenses/gson-license.txt +202 -0
- quarchpy/connection_specific/QPS/3rdPartyLicenses/guava-license.txt +202 -0
- quarchpy/connection_specific/QPS/3rdPartyLicenses/jfx-license.txt +347 -0
- quarchpy/connection_specific/QPS/3rdPartyLicenses/log4j-license.txt +202 -0
- quarchpy/connection_specific/QPS/3rdPartyLicenses/nsmenufx-LICENSE.txt +24 -0
- quarchpy/connection_specific/QPS/Power-Studio-QuickStart.pdf +0 -0
- quarchpy/connection_specific/QPS/{win-amd64/QuarchPowerStudio.properties.xml → QuarchPowerStudio.properties.xml} +0 -1
- quarchpy/connection_specific/QPS/{win-amd64/app.jar → app.jar} +0 -0
- quarchpy/connection_specific/QPS/{win-amd64/app.properties → app.properties} +1 -1
- quarchpy/connection_specific/QPS/{win-amd64/commandLineOptions.txt → commandLineOptions.txt} +6 -4
- quarchpy/connection_specific/QPS/{win-amd64/qis → qis}/3rdPartyLicenses/com.sun.istack-license.html +59 -59
- quarchpy/connection_specific/QPS/{win-amd64/qis → qis}/3rdPartyLicenses/dorkbox-LICENSE.Apachev2 +217 -217
- quarchpy/connection_specific/QPS/{win-amd64/qis → qis}/3rdPartyLicenses/jSerialComm-LICENSE-APACHE-2.0 +202 -202
- quarchpy/connection_specific/QPS/{win-amd64/qis → qis}/3rdPartyLicenses/jSerialComm-LICENSE-LGPL-3.0 +165 -165
- quarchpy/connection_specific/QPS/{win-amd64/qis → qis}/3rdPartyLicenses/jakarta.activation-license.html +59 -59
- quarchpy/connection_specific/QPS/{win-amd64/qis → qis}/3rdPartyLicenses/jakarta.xml.bind-api-license.html +59 -59
- quarchpy/connection_specific/QPS/{win-amd64/qis → qis}/3rdPartyLicenses/javassist-License.html +381 -381
- quarchpy/connection_specific/QPS/{win-amd64/qis → qis}/3rdPartyLicenses/jmdns-LICENSE.txt +202 -202
- quarchpy/connection_specific/QPS/{win-amd64/qis → qis}/3rdPartyLicenses/jna-AL2.0 +177 -177
- quarchpy/connection_specific/QPS/{win-amd64/qis → qis}/3rdPartyLicenses/kotlin-stdlib-LICENSE-2.0.txt +202 -202
- quarchpy/connection_specific/QPS/{win-amd64/qis → qis}/3rdPartyLicenses/netty-LICENSE.txt +202 -202
- quarchpy/connection_specific/QPS/{win-amd64/qis → qis}/3rdPartyLicenses/netty-NOTICE.txt +239 -239
- quarchpy/connection_specific/QPS/qis/3rdPartyLicenses/slf4j-LICENSE.txt +24 -0
- quarchpy/connection_specific/QPS/{win-amd64/qis → qis}/3rdPartyLicenses/usb4java-LICENSE.md +19 -19
- quarchpy/connection_specific/QPS/{win-amd64/qis → qis}/Comms.properties.xml +102 -102
- quarchpy/connection_specific/QPS/{win-amd64/qis → qis}/QuarchInstrumentServer.properties.xml +13 -12
- quarchpy/connection_specific/QPS/{win-amd64/qis → qis}/help.txt +11 -9
- quarchpy/connection_specific/QPS/qis/qis-NoGUI.bat +3 -0
- quarchpy/connection_specific/QPS/{win-amd64/qis → qis}/qis-NoGUI.sh +6 -6
- quarchpy/connection_specific/QPS/{win-amd64/qis → qis}/qis.bat +1 -1
- quarchpy/connection_specific/QPS/qis/qis.jar +0 -0
- quarchpy/connection_specific/QPS/{win-amd64/qis → qis}/qis.sh +2 -2
- quarchpy/connection_specific/QPS/qis/qis_lib/cinterface-2.5.6-20251003.113043-1.jar +0 -0
- quarchpy/connection_specific/QPS/qis/qis_lib/jul-to-slf4j-2.0.17.jar +0 -0
- quarchpy/connection_specific/QPS/qis/qis_lib/log4j-api-2.25.0.jar +0 -0
- quarchpy/connection_specific/QPS/qis/qis_lib/log4j-core-2.25.0.jar +0 -0
- quarchpy/connection_specific/QPS/qis/qis_lib/log4j-layout-template-json-2.25.0.jar +0 -0
- quarchpy/connection_specific/QPS/qis/qis_lib/log4j-slf4j2-impl-2.25.0.jar +0 -0
- quarchpy/connection_specific/QPS/qis/qis_lib/netty-buffer-4.2.2.Final.jar +0 -0
- quarchpy/connection_specific/QPS/qis/qis_lib/netty-codec-base-4.2.2.Final.jar +0 -0
- quarchpy/connection_specific/QPS/qis/qis_lib/netty-codec-http-4.2.2.Final.jar +0 -0
- quarchpy/connection_specific/QPS/qis/qis_lib/netty-common-4.2.2.Final.jar +0 -0
- quarchpy/connection_specific/QPS/qis/qis_lib/netty-handler-4.2.2.Final.jar +0 -0
- quarchpy/connection_specific/QPS/qis/qis_lib/netty-transport-4.2.2.Final.jar +0 -0
- quarchpy/connection_specific/QPS/qis/qis_lib/quarchcommon-2.1.8-20251003.112807-1.jar +0 -0
- quarchpy/connection_specific/QPS/qis/qis_lib/slf4j-api-2.0.17.jar +0 -0
- quarchpy/connection_specific/QPS/qis/qis_lib/torridoncommon-1.2.8-20251003.113215-1.jar +0 -0
- quarchpy/connection_specific/QPS/{win-amd64/qis → qis}/qis_lib/usb4java-1.3.1.jar +0 -0
- quarchpy/connection_specific/QPS/{win-amd64/qps-command-reference.html → qps-command-reference.html} +1 -1
- quarchpy/connection_specific/QPS/qps.jar +0 -0
- quarchpy/connection_specific/QPS/qps_lib/gson-2.13.1.jar +0 -0
- quarchpy/connection_specific/QPS/qps_lib/jfa-1.2.0.jar +0 -0
- quarchpy/connection_specific/QPS/qps_lib/jfxutilities-1.0.4-20251002.100356-1.jar +0 -0
- quarchpy/connection_specific/QPS/qps_lib/jna-5.17.0.jar +0 -0
- quarchpy/connection_specific/QPS/qps_lib/jul-to-slf4j-2.0.17.jar +0 -0
- quarchpy/connection_specific/QPS/qps_lib/log4j-api-2.25.0.jar +0 -0
- quarchpy/connection_specific/QPS/qps_lib/log4j-core-2.25.0.jar +0 -0
- quarchpy/connection_specific/QPS/qps_lib/log4j-layout-template-json-2.25.0.jar +0 -0
- quarchpy/connection_specific/QPS/qps_lib/log4j-slf4j2-impl-2.25.0.jar +0 -0
- quarchpy/connection_specific/QPS/qps_lib/netty-buffer-4.2.2.Final.jar +0 -0
- quarchpy/connection_specific/QPS/qps_lib/netty-codec-base-4.2.2.Final.jar +0 -0
- quarchpy/connection_specific/QPS/qps_lib/netty-codec-http-4.2.2.Final.jar +0 -0
- quarchpy/connection_specific/QPS/qps_lib/netty-common-4.2.2.Final.jar +0 -0
- quarchpy/connection_specific/QPS/qps_lib/netty-handler-4.2.2.Final.jar +0 -0
- quarchpy/connection_specific/QPS/qps_lib/netty-transport-4.2.2.Final.jar +0 -0
- quarchpy/connection_specific/QPS/qps_lib/nsmenufx-3.1.0.jar +0 -0
- quarchpy/connection_specific/QPS/qps_lib/quarchcommon-2.1.8-20251003.112807-1.jar +0 -0
- quarchpy/connection_specific/QPS/qps_lib/qutils-1.0.2.jar +0 -0
- quarchpy/connection_specific/QPS/qps_lib/slf4j-api-2.0.17.jar +0 -0
- quarchpy/connection_specific/QPS/{win-amd64/scriptCommands.txt → scriptCommands.txt} +2 -2
- quarchpy/connection_specific/QPS/whats-new.txt +37 -0
- quarchpy/connection_specific/connection_QIS.py +1033 -1386
- quarchpy/connection_specific/connection_USB.py +1 -3
- quarchpy/connection_specific/jdk_jres/lin_amd64_jdk_jre/bin/java +0 -0
- quarchpy/connection_specific/jdk_jres/lin_amd64_jdk_jre/bin/jfr +0 -0
- quarchpy/connection_specific/jdk_jres/lin_amd64_jdk_jre/bin/jrunscript +0 -0
- quarchpy/connection_specific/jdk_jres/lin_amd64_jdk_jre/bin/jwebserver +0 -0
- quarchpy/connection_specific/jdk_jres/lin_amd64_jdk_jre/bin/keytool +0 -0
- quarchpy/connection_specific/jdk_jres/lin_amd64_jdk_jre/bin/rmiregistry +0 -0
- quarchpy/connection_specific/jdk_jres/lin_amd64_jdk_jre/conf/jaxp-strict.properties.template +123 -123
- quarchpy/connection_specific/jdk_jres/lin_amd64_jdk_jre/conf/jaxp.properties +200 -200
- quarchpy/connection_specific/jdk_jres/lin_amd64_jdk_jre/conf/logging.properties +63 -63
- quarchpy/connection_specific/jdk_jres/lin_amd64_jdk_jre/conf/management/jmxremote.access +79 -79
- quarchpy/connection_specific/jdk_jres/lin_amd64_jdk_jre/conf/management/jmxremote.password.template +114 -114
- quarchpy/connection_specific/jdk_jres/lin_amd64_jdk_jre/conf/management/management.properties +326 -326
- quarchpy/connection_specific/jdk_jres/lin_amd64_jdk_jre/conf/net.properties +162 -162
- quarchpy/connection_specific/jdk_jres/lin_amd64_jdk_jre/conf/sdp/sdp.conf.template +30 -30
- quarchpy/connection_specific/jdk_jres/lin_amd64_jdk_jre/conf/security/java.security +1517 -1517
- quarchpy/connection_specific/jdk_jres/lin_amd64_jdk_jre/conf/security/policy/README.txt +54 -54
- quarchpy/connection_specific/jdk_jres/lin_amd64_jdk_jre/conf/security/policy/limited/default_US_export.policy +6 -6
- quarchpy/connection_specific/jdk_jres/lin_amd64_jdk_jre/conf/security/policy/limited/default_local.policy +14 -14
- quarchpy/connection_specific/jdk_jres/lin_amd64_jdk_jre/conf/security/policy/limited/exempt_local.policy +13 -13
- quarchpy/connection_specific/jdk_jres/lin_amd64_jdk_jre/conf/security/policy/unlimited/default_US_export.policy +6 -6
- quarchpy/connection_specific/jdk_jres/lin_amd64_jdk_jre/conf/security/policy/unlimited/default_local.policy +6 -6
- quarchpy/connection_specific/jdk_jres/lin_amd64_jdk_jre/conf/sound.properties +39 -39
- quarchpy/connection_specific/jdk_jres/lin_amd64_jdk_jre/legal/java.base/ADDITIONAL_LICENSE_INFO +37 -37
- quarchpy/connection_specific/jdk_jres/lin_amd64_jdk_jre/legal/java.base/ASSEMBLY_EXCEPTION +27 -27
- quarchpy/connection_specific/jdk_jres/lin_amd64_jdk_jre/legal/java.base/LICENSE +347 -347
- quarchpy/connection_specific/jdk_jres/lin_amd64_jdk_jre/legal/java.base/aes.md +36 -36
- quarchpy/connection_specific/jdk_jres/lin_amd64_jdk_jre/legal/java.base/asm.md +36 -36
- quarchpy/connection_specific/jdk_jres/lin_amd64_jdk_jre/legal/java.base/c-libutl.md +35 -35
- quarchpy/connection_specific/jdk_jres/lin_amd64_jdk_jre/legal/java.base/cldr.md +100 -100
- quarchpy/connection_specific/jdk_jres/lin_amd64_jdk_jre/legal/java.base/icu.md +93 -93
- quarchpy/connection_specific/jdk_jres/lin_amd64_jdk_jre/legal/java.base/public_suffix.md +399 -399
- quarchpy/connection_specific/jdk_jres/lin_amd64_jdk_jre/legal/java.base/siphash.md +150 -150
- quarchpy/connection_specific/jdk_jres/lin_amd64_jdk_jre/legal/java.base/unicode.md +269 -269
- quarchpy/connection_specific/jdk_jres/lin_amd64_jdk_jre/legal/java.compiler/ADDITIONAL_LICENSE_INFO +37 -37
- quarchpy/connection_specific/jdk_jres/lin_amd64_jdk_jre/legal/java.compiler/ASSEMBLY_EXCEPTION +27 -27
- quarchpy/connection_specific/jdk_jres/lin_amd64_jdk_jre/legal/java.compiler/LICENSE +347 -347
- quarchpy/connection_specific/jdk_jres/lin_amd64_jdk_jre/legal/java.datatransfer/ADDITIONAL_LICENSE_INFO +37 -37
- quarchpy/connection_specific/jdk_jres/lin_amd64_jdk_jre/legal/java.datatransfer/ASSEMBLY_EXCEPTION +27 -27
- quarchpy/connection_specific/jdk_jres/lin_amd64_jdk_jre/legal/java.datatransfer/LICENSE +347 -347
- quarchpy/connection_specific/jdk_jres/lin_amd64_jdk_jre/legal/java.desktop/ADDITIONAL_LICENSE_INFO +37 -37
- quarchpy/connection_specific/jdk_jres/lin_amd64_jdk_jre/legal/java.desktop/ASSEMBLY_EXCEPTION +27 -27
- quarchpy/connection_specific/jdk_jres/lin_amd64_jdk_jre/legal/java.desktop/LICENSE +347 -347
- quarchpy/connection_specific/jdk_jres/lin_amd64_jdk_jre/legal/java.desktop/colorimaging.md +7 -7
- quarchpy/connection_specific/jdk_jres/lin_amd64_jdk_jre/legal/java.desktop/freetype.md +649 -649
- quarchpy/connection_specific/jdk_jres/lin_amd64_jdk_jre/legal/java.desktop/giflib.md +46 -46
- quarchpy/connection_specific/jdk_jres/lin_amd64_jdk_jre/legal/java.desktop/harfbuzz.md +104 -103
- quarchpy/connection_specific/jdk_jres/lin_amd64_jdk_jre/legal/java.desktop/jpeg.md +77 -77
- quarchpy/connection_specific/jdk_jres/lin_amd64_jdk_jre/legal/java.desktop/lcms.md +103 -103
- quarchpy/connection_specific/jdk_jres/lin_amd64_jdk_jre/legal/java.desktop/libpng.md +216 -215
- quarchpy/connection_specific/jdk_jres/lin_amd64_jdk_jre/legal/java.desktop/mesa3d.md +134 -134
- quarchpy/connection_specific/jdk_jres/lin_amd64_jdk_jre/legal/java.desktop/pipewire.md +46 -41
- quarchpy/connection_specific/jdk_jres/lin_amd64_jdk_jre/legal/java.desktop/xwd.md +34 -34
- quarchpy/connection_specific/jdk_jres/lin_amd64_jdk_jre/legal/java.instrument/ADDITIONAL_LICENSE_INFO +37 -37
- quarchpy/connection_specific/jdk_jres/lin_amd64_jdk_jre/legal/java.instrument/ASSEMBLY_EXCEPTION +27 -27
- quarchpy/connection_specific/jdk_jres/lin_amd64_jdk_jre/legal/java.instrument/LICENSE +347 -347
- quarchpy/connection_specific/jdk_jres/lin_amd64_jdk_jre/legal/java.logging/ADDITIONAL_LICENSE_INFO +37 -37
- quarchpy/connection_specific/jdk_jres/lin_amd64_jdk_jre/legal/java.logging/ASSEMBLY_EXCEPTION +27 -27
- quarchpy/connection_specific/jdk_jres/lin_amd64_jdk_jre/legal/java.logging/LICENSE +347 -347
- quarchpy/connection_specific/jdk_jres/lin_amd64_jdk_jre/legal/java.management/ADDITIONAL_LICENSE_INFO +37 -37
- quarchpy/connection_specific/jdk_jres/lin_amd64_jdk_jre/legal/java.management/ASSEMBLY_EXCEPTION +27 -27
- quarchpy/connection_specific/jdk_jres/lin_amd64_jdk_jre/legal/java.management/LICENSE +347 -347
- quarchpy/connection_specific/jdk_jres/lin_amd64_jdk_jre/legal/java.management.rmi/ADDITIONAL_LICENSE_INFO +37 -37
- quarchpy/connection_specific/jdk_jres/lin_amd64_jdk_jre/legal/java.management.rmi/ASSEMBLY_EXCEPTION +27 -27
- quarchpy/connection_specific/jdk_jres/lin_amd64_jdk_jre/legal/java.management.rmi/LICENSE +347 -347
- quarchpy/connection_specific/jdk_jres/lin_amd64_jdk_jre/legal/java.naming/ADDITIONAL_LICENSE_INFO +37 -37
- quarchpy/connection_specific/jdk_jres/lin_amd64_jdk_jre/legal/java.naming/ASSEMBLY_EXCEPTION +27 -27
- quarchpy/connection_specific/jdk_jres/lin_amd64_jdk_jre/legal/java.naming/LICENSE +347 -347
- quarchpy/connection_specific/jdk_jres/lin_amd64_jdk_jre/legal/java.net.http/ADDITIONAL_LICENSE_INFO +37 -37
- quarchpy/connection_specific/jdk_jres/lin_amd64_jdk_jre/legal/java.net.http/ASSEMBLY_EXCEPTION +27 -27
- quarchpy/connection_specific/jdk_jres/lin_amd64_jdk_jre/legal/java.net.http/LICENSE +347 -347
- quarchpy/connection_specific/jdk_jres/lin_amd64_jdk_jre/legal/java.prefs/ADDITIONAL_LICENSE_INFO +37 -37
- quarchpy/connection_specific/jdk_jres/lin_amd64_jdk_jre/legal/java.prefs/ASSEMBLY_EXCEPTION +27 -27
- quarchpy/connection_specific/jdk_jres/lin_amd64_jdk_jre/legal/java.prefs/LICENSE +347 -347
- quarchpy/connection_specific/jdk_jres/lin_amd64_jdk_jre/legal/java.rmi/ADDITIONAL_LICENSE_INFO +37 -37
- quarchpy/connection_specific/jdk_jres/lin_amd64_jdk_jre/legal/java.rmi/ASSEMBLY_EXCEPTION +27 -27
- quarchpy/connection_specific/jdk_jres/lin_amd64_jdk_jre/legal/java.rmi/LICENSE +347 -347
- quarchpy/connection_specific/jdk_jres/lin_amd64_jdk_jre/legal/java.scripting/ADDITIONAL_LICENSE_INFO +37 -37
- quarchpy/connection_specific/jdk_jres/lin_amd64_jdk_jre/legal/java.scripting/ASSEMBLY_EXCEPTION +27 -27
- quarchpy/connection_specific/jdk_jres/lin_amd64_jdk_jre/legal/java.scripting/LICENSE +347 -347
- quarchpy/connection_specific/jdk_jres/lin_amd64_jdk_jre/legal/java.se/ADDITIONAL_LICENSE_INFO +37 -37
- quarchpy/connection_specific/jdk_jres/lin_amd64_jdk_jre/legal/java.se/ASSEMBLY_EXCEPTION +27 -27
- quarchpy/connection_specific/jdk_jres/lin_amd64_jdk_jre/legal/java.se/LICENSE +347 -347
- quarchpy/connection_specific/jdk_jres/lin_amd64_jdk_jre/legal/java.security.jgss/ADDITIONAL_LICENSE_INFO +37 -37
- quarchpy/connection_specific/jdk_jres/lin_amd64_jdk_jre/legal/java.security.jgss/ASSEMBLY_EXCEPTION +27 -27
- quarchpy/connection_specific/jdk_jres/lin_amd64_jdk_jre/legal/java.security.jgss/LICENSE +347 -347
- quarchpy/connection_specific/jdk_jres/lin_amd64_jdk_jre/legal/java.security.sasl/ADDITIONAL_LICENSE_INFO +37 -37
- quarchpy/connection_specific/jdk_jres/lin_amd64_jdk_jre/legal/java.security.sasl/ASSEMBLY_EXCEPTION +27 -27
- quarchpy/connection_specific/jdk_jres/lin_amd64_jdk_jre/legal/java.security.sasl/LICENSE +347 -347
- quarchpy/connection_specific/jdk_jres/lin_amd64_jdk_jre/legal/java.smartcardio/ADDITIONAL_LICENSE_INFO +37 -37
- quarchpy/connection_specific/jdk_jres/lin_amd64_jdk_jre/legal/java.smartcardio/ASSEMBLY_EXCEPTION +27 -27
- quarchpy/connection_specific/jdk_jres/lin_amd64_jdk_jre/legal/java.smartcardio/LICENSE +347 -347
- quarchpy/connection_specific/jdk_jres/lin_amd64_jdk_jre/legal/java.smartcardio/pcsclite.md +57 -57
- quarchpy/connection_specific/jdk_jres/lin_amd64_jdk_jre/legal/java.sql/ADDITIONAL_LICENSE_INFO +37 -37
- quarchpy/connection_specific/jdk_jres/lin_amd64_jdk_jre/legal/java.sql/ASSEMBLY_EXCEPTION +27 -27
- quarchpy/connection_specific/jdk_jres/lin_amd64_jdk_jre/legal/java.sql/LICENSE +347 -347
- quarchpy/connection_specific/jdk_jres/lin_amd64_jdk_jre/legal/java.sql.rowset/ADDITIONAL_LICENSE_INFO +37 -37
- quarchpy/connection_specific/jdk_jres/lin_amd64_jdk_jre/legal/java.sql.rowset/ASSEMBLY_EXCEPTION +27 -27
- quarchpy/connection_specific/jdk_jres/lin_amd64_jdk_jre/legal/java.sql.rowset/LICENSE +347 -347
- quarchpy/connection_specific/jdk_jres/lin_amd64_jdk_jre/legal/java.transaction.xa/ADDITIONAL_LICENSE_INFO +37 -37
- quarchpy/connection_specific/jdk_jres/lin_amd64_jdk_jre/legal/java.transaction.xa/ASSEMBLY_EXCEPTION +27 -27
- quarchpy/connection_specific/jdk_jres/lin_amd64_jdk_jre/legal/java.transaction.xa/LICENSE +347 -347
- quarchpy/connection_specific/jdk_jres/lin_amd64_jdk_jre/legal/java.xml/ADDITIONAL_LICENSE_INFO +37 -37
- quarchpy/connection_specific/jdk_jres/lin_amd64_jdk_jre/legal/java.xml/ASSEMBLY_EXCEPTION +27 -27
- quarchpy/connection_specific/jdk_jres/lin_amd64_jdk_jre/legal/java.xml/LICENSE +347 -347
- quarchpy/connection_specific/jdk_jres/lin_amd64_jdk_jre/legal/java.xml/bcel.md +219 -219
- quarchpy/connection_specific/jdk_jres/lin_amd64_jdk_jre/legal/java.xml/dom.md +77 -77
- quarchpy/connection_specific/jdk_jres/lin_amd64_jdk_jre/legal/java.xml/jcup.md +31 -31
- quarchpy/connection_specific/jdk_jres/lin_amd64_jdk_jre/legal/java.xml/schema10part1.md +51 -51
- quarchpy/connection_specific/jdk_jres/lin_amd64_jdk_jre/legal/java.xml/schema10part2.md +50 -50
- quarchpy/connection_specific/jdk_jres/lin_amd64_jdk_jre/legal/java.xml/xalan.md +255 -255
- quarchpy/connection_specific/jdk_jres/lin_amd64_jdk_jre/legal/java.xml/xerces.md +229 -229
- quarchpy/connection_specific/jdk_jres/lin_amd64_jdk_jre/legal/java.xml/xhtml10.md +57 -57
- quarchpy/connection_specific/jdk_jres/lin_amd64_jdk_jre/legal/java.xml/xhtml10schema.md +150 -150
- quarchpy/connection_specific/jdk_jres/lin_amd64_jdk_jre/legal/java.xml/xhtml11.md +68 -68
- quarchpy/connection_specific/jdk_jres/lin_amd64_jdk_jre/legal/java.xml/xhtml11schema.md +60 -60
- quarchpy/connection_specific/jdk_jres/lin_amd64_jdk_jre/legal/java.xml/xmlspec.md +63 -63
- quarchpy/connection_specific/jdk_jres/lin_amd64_jdk_jre/legal/java.xml/xmlxsd.md +43 -43
- quarchpy/connection_specific/jdk_jres/lin_amd64_jdk_jre/legal/java.xml.crypto/ADDITIONAL_LICENSE_INFO +37 -37
- quarchpy/connection_specific/jdk_jres/lin_amd64_jdk_jre/legal/java.xml.crypto/ASSEMBLY_EXCEPTION +27 -27
- quarchpy/connection_specific/jdk_jres/lin_amd64_jdk_jre/legal/java.xml.crypto/LICENSE +347 -347
- quarchpy/connection_specific/jdk_jres/lin_amd64_jdk_jre/legal/java.xml.crypto/santuario.md +227 -227
- quarchpy/connection_specific/jdk_jres/lin_amd64_jdk_jre/legal/javafx.base/ADDITIONAL_LICENSE_INFO +37 -0
- quarchpy/connection_specific/jdk_jres/lin_amd64_jdk_jre/legal/javafx.base/ASSEMBLY_EXCEPTION +27 -0
- quarchpy/connection_specific/jdk_jres/lin_amd64_jdk_jre/legal/javafx.base/LICENSE +347 -0
- quarchpy/connection_specific/jdk_jres/lin_amd64_jdk_jre/legal/javafx.controls/ADDITIONAL_LICENSE_INFO +37 -0
- quarchpy/connection_specific/jdk_jres/lin_amd64_jdk_jre/legal/javafx.controls/ASSEMBLY_EXCEPTION +27 -0
- quarchpy/connection_specific/jdk_jres/lin_amd64_jdk_jre/legal/javafx.controls/LICENSE +347 -0
- quarchpy/connection_specific/jdk_jres/lin_amd64_jdk_jre/legal/javafx.fxml/ADDITIONAL_LICENSE_INFO +37 -0
- quarchpy/connection_specific/jdk_jres/lin_amd64_jdk_jre/legal/javafx.fxml/ASSEMBLY_EXCEPTION +27 -0
- quarchpy/connection_specific/jdk_jres/lin_amd64_jdk_jre/legal/javafx.fxml/LICENSE +347 -0
- quarchpy/connection_specific/jdk_jres/lin_amd64_jdk_jre/legal/javafx.graphics/ADDITIONAL_LICENSE_INFO +37 -0
- quarchpy/connection_specific/jdk_jres/lin_amd64_jdk_jre/legal/javafx.graphics/ASSEMBLY_EXCEPTION +27 -0
- quarchpy/connection_specific/jdk_jres/lin_amd64_jdk_jre/legal/javafx.graphics/LICENSE +347 -0
- quarchpy/connection_specific/jdk_jres/lin_amd64_jdk_jre/legal/javafx.graphics/jpeg_fx.md +43 -0
- quarchpy/connection_specific/jdk_jres/lin_amd64_jdk_jre/legal/javafx.graphics/mesa3d.md +134 -0
- quarchpy/connection_specific/jdk_jres/lin_amd64_jdk_jre/legal/javafx.graphics/pipewire.md +46 -0
- quarchpy/connection_specific/jdk_jres/lin_amd64_jdk_jre/legal/javafx.swing/ADDITIONAL_LICENSE_INFO +37 -0
- quarchpy/connection_specific/jdk_jres/lin_amd64_jdk_jre/legal/javafx.swing/ASSEMBLY_EXCEPTION +27 -0
- quarchpy/connection_specific/jdk_jres/lin_amd64_jdk_jre/legal/javafx.swing/LICENSE +347 -0
- quarchpy/connection_specific/jdk_jres/lin_amd64_jdk_jre/legal/jdk.accessibility/ADDITIONAL_LICENSE_INFO +37 -37
- quarchpy/connection_specific/jdk_jres/lin_amd64_jdk_jre/legal/jdk.accessibility/ASSEMBLY_EXCEPTION +27 -27
- quarchpy/connection_specific/jdk_jres/lin_amd64_jdk_jre/legal/jdk.accessibility/LICENSE +347 -347
- quarchpy/connection_specific/jdk_jres/lin_amd64_jdk_jre/legal/jdk.charsets/ADDITIONAL_LICENSE_INFO +37 -37
- quarchpy/connection_specific/jdk_jres/lin_amd64_jdk_jre/legal/jdk.charsets/ASSEMBLY_EXCEPTION +27 -27
- quarchpy/connection_specific/jdk_jres/lin_amd64_jdk_jre/legal/jdk.charsets/LICENSE +347 -347
- quarchpy/connection_specific/jdk_jres/lin_amd64_jdk_jre/legal/jdk.crypto.cryptoki/ADDITIONAL_LICENSE_INFO +37 -37
- quarchpy/connection_specific/jdk_jres/lin_amd64_jdk_jre/legal/jdk.crypto.cryptoki/ASSEMBLY_EXCEPTION +27 -27
- quarchpy/connection_specific/jdk_jres/lin_amd64_jdk_jre/legal/jdk.crypto.cryptoki/LICENSE +347 -347
- quarchpy/connection_specific/jdk_jres/lin_amd64_jdk_jre/legal/jdk.crypto.cryptoki/pkcs11cryptotoken.md +76 -76
- quarchpy/connection_specific/jdk_jres/lin_amd64_jdk_jre/legal/jdk.crypto.cryptoki/pkcs11wrapper.md +46 -46
- quarchpy/connection_specific/jdk_jres/lin_amd64_jdk_jre/legal/jdk.crypto.ec/ADDITIONAL_LICENSE_INFO +37 -37
- quarchpy/connection_specific/jdk_jres/lin_amd64_jdk_jre/legal/jdk.crypto.ec/ASSEMBLY_EXCEPTION +27 -27
- quarchpy/connection_specific/jdk_jres/lin_amd64_jdk_jre/legal/jdk.crypto.ec/LICENSE +347 -347
- quarchpy/connection_specific/jdk_jres/lin_amd64_jdk_jre/legal/jdk.dynalink/ADDITIONAL_LICENSE_INFO +37 -37
- quarchpy/connection_specific/jdk_jres/lin_amd64_jdk_jre/legal/jdk.dynalink/ASSEMBLY_EXCEPTION +27 -27
- quarchpy/connection_specific/jdk_jres/lin_amd64_jdk_jre/legal/jdk.dynalink/LICENSE +347 -347
- quarchpy/connection_specific/jdk_jres/lin_amd64_jdk_jre/legal/jdk.dynalink/dynalink.md +32 -32
- quarchpy/connection_specific/jdk_jres/lin_amd64_jdk_jre/legal/jdk.httpserver/ADDITIONAL_LICENSE_INFO +37 -37
- quarchpy/connection_specific/jdk_jres/lin_amd64_jdk_jre/legal/jdk.httpserver/ASSEMBLY_EXCEPTION +27 -27
- quarchpy/connection_specific/jdk_jres/lin_amd64_jdk_jre/legal/jdk.httpserver/LICENSE +347 -347
- quarchpy/connection_specific/jdk_jres/lin_amd64_jdk_jre/legal/jdk.incubator.vector/ADDITIONAL_LICENSE_INFO +37 -37
- quarchpy/connection_specific/jdk_jres/lin_amd64_jdk_jre/legal/jdk.incubator.vector/ASSEMBLY_EXCEPTION +27 -27
- quarchpy/connection_specific/jdk_jres/lin_amd64_jdk_jre/legal/jdk.incubator.vector/LICENSE +347 -347
- quarchpy/connection_specific/jdk_jres/lin_amd64_jdk_jre/legal/jdk.incubator.vector/sleef.md +439 -439
- quarchpy/connection_specific/jdk_jres/lin_amd64_jdk_jre/legal/jdk.internal.vm.ci/ADDITIONAL_LICENSE_INFO +37 -37
- quarchpy/connection_specific/jdk_jres/lin_amd64_jdk_jre/legal/jdk.internal.vm.ci/ASSEMBLY_EXCEPTION +27 -27
- quarchpy/connection_specific/jdk_jres/lin_amd64_jdk_jre/legal/jdk.internal.vm.ci/LICENSE +347 -347
- quarchpy/connection_specific/jdk_jres/lin_amd64_jdk_jre/legal/jdk.jdwp.agent/ADDITIONAL_LICENSE_INFO +37 -37
- quarchpy/connection_specific/jdk_jres/lin_amd64_jdk_jre/legal/jdk.jdwp.agent/ASSEMBLY_EXCEPTION +27 -27
- quarchpy/connection_specific/jdk_jres/lin_amd64_jdk_jre/legal/jdk.jdwp.agent/LICENSE +347 -347
- quarchpy/connection_specific/jdk_jres/lin_amd64_jdk_jre/legal/jdk.jfr/ADDITIONAL_LICENSE_INFO +37 -37
- quarchpy/connection_specific/jdk_jres/lin_amd64_jdk_jre/legal/jdk.jfr/ASSEMBLY_EXCEPTION +27 -27
- quarchpy/connection_specific/jdk_jres/lin_amd64_jdk_jre/legal/jdk.jfr/LICENSE +347 -347
- quarchpy/connection_specific/jdk_jres/lin_amd64_jdk_jre/legal/jdk.jsobject/ADDITIONAL_LICENSE_INFO +37 -37
- quarchpy/connection_specific/jdk_jres/lin_amd64_jdk_jre/legal/jdk.jsobject/ASSEMBLY_EXCEPTION +27 -27
- quarchpy/connection_specific/jdk_jres/lin_amd64_jdk_jre/legal/jdk.jsobject/LICENSE +347 -347
- quarchpy/connection_specific/jdk_jres/lin_amd64_jdk_jre/legal/jdk.localedata/ADDITIONAL_LICENSE_INFO +37 -37
- quarchpy/connection_specific/jdk_jres/lin_amd64_jdk_jre/legal/jdk.localedata/ASSEMBLY_EXCEPTION +27 -27
- quarchpy/connection_specific/jdk_jres/lin_amd64_jdk_jre/legal/jdk.localedata/LICENSE +347 -347
- quarchpy/connection_specific/jdk_jres/lin_amd64_jdk_jre/legal/jdk.localedata/cldr.md +100 -100
- quarchpy/connection_specific/jdk_jres/lin_amd64_jdk_jre/legal/jdk.localedata/thaidict.md +31 -31
- quarchpy/connection_specific/jdk_jres/lin_amd64_jdk_jre/legal/jdk.management/ADDITIONAL_LICENSE_INFO +37 -37
- quarchpy/connection_specific/jdk_jres/lin_amd64_jdk_jre/legal/jdk.management/ASSEMBLY_EXCEPTION +27 -27
- quarchpy/connection_specific/jdk_jres/lin_amd64_jdk_jre/legal/jdk.management/LICENSE +347 -347
- quarchpy/connection_specific/jdk_jres/lin_amd64_jdk_jre/legal/jdk.management.agent/ADDITIONAL_LICENSE_INFO +37 -37
- quarchpy/connection_specific/jdk_jres/lin_amd64_jdk_jre/legal/jdk.management.agent/ASSEMBLY_EXCEPTION +27 -27
- quarchpy/connection_specific/jdk_jres/lin_amd64_jdk_jre/legal/jdk.management.agent/LICENSE +347 -347
- quarchpy/connection_specific/jdk_jres/lin_amd64_jdk_jre/legal/jdk.management.jfr/ADDITIONAL_LICENSE_INFO +37 -37
- quarchpy/connection_specific/jdk_jres/lin_amd64_jdk_jre/legal/jdk.management.jfr/ASSEMBLY_EXCEPTION +27 -27
- quarchpy/connection_specific/jdk_jres/lin_amd64_jdk_jre/legal/jdk.management.jfr/LICENSE +347 -347
- quarchpy/connection_specific/jdk_jres/lin_amd64_jdk_jre/legal/jdk.naming.dns/ADDITIONAL_LICENSE_INFO +37 -37
- quarchpy/connection_specific/jdk_jres/lin_amd64_jdk_jre/legal/jdk.naming.dns/ASSEMBLY_EXCEPTION +27 -27
- quarchpy/connection_specific/jdk_jres/lin_amd64_jdk_jre/legal/jdk.naming.dns/LICENSE +347 -347
- quarchpy/connection_specific/jdk_jres/lin_amd64_jdk_jre/legal/jdk.naming.rmi/ADDITIONAL_LICENSE_INFO +37 -37
- quarchpy/connection_specific/jdk_jres/lin_amd64_jdk_jre/legal/jdk.naming.rmi/ASSEMBLY_EXCEPTION +27 -27
- quarchpy/connection_specific/jdk_jres/lin_amd64_jdk_jre/legal/jdk.naming.rmi/LICENSE +347 -347
- quarchpy/connection_specific/jdk_jres/lin_amd64_jdk_jre/legal/jdk.net/ADDITIONAL_LICENSE_INFO +37 -37
- quarchpy/connection_specific/jdk_jres/lin_amd64_jdk_jre/legal/jdk.net/ASSEMBLY_EXCEPTION +27 -27
- quarchpy/connection_specific/jdk_jres/lin_amd64_jdk_jre/legal/jdk.net/LICENSE +347 -347
- quarchpy/connection_specific/jdk_jres/lin_amd64_jdk_jre/legal/jdk.nio.mapmode/ADDITIONAL_LICENSE_INFO +37 -37
- quarchpy/connection_specific/jdk_jres/lin_amd64_jdk_jre/legal/jdk.nio.mapmode/ASSEMBLY_EXCEPTION +27 -27
- quarchpy/connection_specific/jdk_jres/lin_amd64_jdk_jre/legal/jdk.nio.mapmode/LICENSE +347 -347
- quarchpy/connection_specific/jdk_jres/lin_amd64_jdk_jre/legal/jdk.sctp/ADDITIONAL_LICENSE_INFO +37 -37
- quarchpy/connection_specific/jdk_jres/lin_amd64_jdk_jre/legal/jdk.sctp/ASSEMBLY_EXCEPTION +27 -27
- quarchpy/connection_specific/jdk_jres/lin_amd64_jdk_jre/legal/jdk.sctp/LICENSE +347 -347
- quarchpy/connection_specific/jdk_jres/lin_amd64_jdk_jre/legal/jdk.security.auth/ADDITIONAL_LICENSE_INFO +37 -37
- quarchpy/connection_specific/jdk_jres/lin_amd64_jdk_jre/legal/jdk.security.auth/ASSEMBLY_EXCEPTION +27 -27
- quarchpy/connection_specific/jdk_jres/lin_amd64_jdk_jre/legal/jdk.security.auth/LICENSE +347 -347
- quarchpy/connection_specific/jdk_jres/lin_amd64_jdk_jre/legal/jdk.security.jgss/ADDITIONAL_LICENSE_INFO +37 -37
- quarchpy/connection_specific/jdk_jres/lin_amd64_jdk_jre/legal/jdk.security.jgss/ASSEMBLY_EXCEPTION +27 -27
- quarchpy/connection_specific/jdk_jres/lin_amd64_jdk_jre/legal/jdk.security.jgss/LICENSE +347 -347
- quarchpy/connection_specific/jdk_jres/lin_amd64_jdk_jre/legal/jdk.unsupported/ADDITIONAL_LICENSE_INFO +37 -37
- quarchpy/connection_specific/jdk_jres/lin_amd64_jdk_jre/legal/jdk.unsupported/ASSEMBLY_EXCEPTION +27 -27
- quarchpy/connection_specific/jdk_jres/lin_amd64_jdk_jre/legal/jdk.unsupported/LICENSE +347 -347
- quarchpy/connection_specific/jdk_jres/lin_amd64_jdk_jre/legal/jdk.unsupported.desktop/ADDITIONAL_LICENSE_INFO +37 -37
- quarchpy/connection_specific/jdk_jres/lin_amd64_jdk_jre/legal/jdk.unsupported.desktop/ASSEMBLY_EXCEPTION +27 -27
- quarchpy/connection_specific/jdk_jres/lin_amd64_jdk_jre/legal/jdk.unsupported.desktop/LICENSE +347 -347
- quarchpy/connection_specific/jdk_jres/lin_amd64_jdk_jre/legal/jdk.xml.dom/ADDITIONAL_LICENSE_INFO +37 -37
- quarchpy/connection_specific/jdk_jres/lin_amd64_jdk_jre/legal/jdk.xml.dom/ASSEMBLY_EXCEPTION +27 -27
- quarchpy/connection_specific/jdk_jres/lin_amd64_jdk_jre/legal/jdk.xml.dom/LICENSE +347 -347
- quarchpy/connection_specific/jdk_jres/lin_amd64_jdk_jre/legal/jdk.zipfs/ADDITIONAL_LICENSE_INFO +37 -37
- quarchpy/connection_specific/jdk_jres/lin_amd64_jdk_jre/legal/jdk.zipfs/ASSEMBLY_EXCEPTION +27 -27
- quarchpy/connection_specific/jdk_jres/lin_amd64_jdk_jre/legal/jdk.zipfs/LICENSE +347 -347
- quarchpy/connection_specific/jdk_jres/lin_amd64_jdk_jre/lib/classlist +1588 -1587
- quarchpy/connection_specific/jdk_jres/lin_amd64_jdk_jre/lib/client/libjsig.so +0 -0
- quarchpy/connection_specific/jdk_jres/lin_amd64_jdk_jre/lib/client/libjvm.so +0 -0
- quarchpy/connection_specific/jdk_jres/lin_amd64_jdk_jre/lib/javafx-swt.jar +0 -0
- quarchpy/connection_specific/jdk_jres/lin_amd64_jdk_jre/lib/javafx.platform.properties +17 -0
- quarchpy/connection_specific/jdk_jres/lin_amd64_jdk_jre/lib/javafx.properties +3 -0
- quarchpy/connection_specific/jdk_jres/lin_amd64_jdk_jre/lib/jexec +0 -0
- quarchpy/connection_specific/jdk_jres/lin_amd64_jdk_jre/lib/jfr/default.jfc +1152 -1152
- quarchpy/connection_specific/jdk_jres/lin_amd64_jdk_jre/lib/jfr/profile.jfc +1151 -1151
- quarchpy/connection_specific/jdk_jres/lin_amd64_jdk_jre/lib/jrt-fs.jar +0 -0
- quarchpy/connection_specific/jdk_jres/lin_amd64_jdk_jre/lib/jspawnhelper +0 -0
- quarchpy/connection_specific/jdk_jres/lin_amd64_jdk_jre/lib/jvm.cfg +3 -2
- quarchpy/connection_specific/jdk_jres/lin_amd64_jdk_jre/lib/libawt.so +0 -0
- quarchpy/connection_specific/jdk_jres/lin_amd64_jdk_jre/lib/libawt_headless.so +0 -0
- quarchpy/connection_specific/jdk_jres/lin_amd64_jdk_jre/lib/libawt_xawt.so +0 -0
- quarchpy/connection_specific/jdk_jres/lin_amd64_jdk_jre/lib/libdecora_sse.so +0 -0
- quarchpy/connection_specific/jdk_jres/lin_amd64_jdk_jre/lib/libdt_socket.so +0 -0
- quarchpy/connection_specific/jdk_jres/lin_amd64_jdk_jre/lib/libextnet.so +0 -0
- quarchpy/connection_specific/jdk_jres/lin_amd64_jdk_jre/lib/libfontmanager.so +0 -0
- quarchpy/connection_specific/jdk_jres/lin_amd64_jdk_jre/lib/libfreetype.so +0 -0
- quarchpy/connection_specific/jdk_jres/lin_amd64_jdk_jre/lib/libglass.so +0 -0
- quarchpy/connection_specific/jdk_jres/lin_amd64_jdk_jre/lib/libglass_monocle.so +0 -0
- quarchpy/connection_specific/jdk_jres/lin_amd64_jdk_jre/lib/libglass_monocle_x11.so +0 -0
- quarchpy/connection_specific/jdk_jres/lin_amd64_jdk_jre/lib/libglassgtk3.so +0 -0
- quarchpy/connection_specific/jdk_jres/lin_amd64_jdk_jre/lib/libinstrument.so +0 -0
- quarchpy/connection_specific/jdk_jres/lin_amd64_jdk_jre/lib/libj2gss.so +0 -0
- quarchpy/connection_specific/jdk_jres/lin_amd64_jdk_jre/lib/libj2pcsc.so +0 -0
- quarchpy/connection_specific/jdk_jres/lin_amd64_jdk_jre/lib/libj2pkcs11.so +0 -0
- quarchpy/connection_specific/jdk_jres/lin_amd64_jdk_jre/lib/libjaas.so +0 -0
- quarchpy/connection_specific/jdk_jres/lin_amd64_jdk_jre/lib/libjava.so +0 -0
- quarchpy/connection_specific/jdk_jres/lin_amd64_jdk_jre/lib/libjavafx_font.so +0 -0
- quarchpy/connection_specific/jdk_jres/lin_amd64_jdk_jre/lib/libjavafx_font_freetype.so +0 -0
- quarchpy/connection_specific/jdk_jres/lin_amd64_jdk_jre/lib/libjavafx_font_pango.so +0 -0
- quarchpy/connection_specific/jdk_jres/lin_amd64_jdk_jre/lib/libjavafx_iio.so +0 -0
- quarchpy/connection_specific/jdk_jres/lin_amd64_jdk_jre/lib/libjavajpeg.so +0 -0
- quarchpy/connection_specific/jdk_jres/lin_amd64_jdk_jre/lib/libjawt.so +0 -0
- quarchpy/connection_specific/jdk_jres/lin_amd64_jdk_jre/lib/libjdwp.so +0 -0
- quarchpy/connection_specific/jdk_jres/lin_amd64_jdk_jre/lib/libjimage.so +0 -0
- quarchpy/connection_specific/jdk_jres/lin_amd64_jdk_jre/lib/libjli.so +0 -0
- quarchpy/connection_specific/jdk_jres/lin_amd64_jdk_jre/lib/libjsig.so +0 -0
- quarchpy/connection_specific/jdk_jres/lin_amd64_jdk_jre/lib/libjsound.so +0 -0
- quarchpy/connection_specific/jdk_jres/lin_amd64_jdk_jre/lib/libjsvml.so +0 -0
- quarchpy/connection_specific/jdk_jres/lin_amd64_jdk_jre/lib/liblcms.so +0 -0
- quarchpy/connection_specific/jdk_jres/lin_amd64_jdk_jre/lib/libmanagement.so +0 -0
- quarchpy/connection_specific/jdk_jres/lin_amd64_jdk_jre/lib/libmanagement_agent.so +0 -0
- quarchpy/connection_specific/jdk_jres/lin_amd64_jdk_jre/lib/libmanagement_ext.so +0 -0
- quarchpy/connection_specific/jdk_jres/lin_amd64_jdk_jre/lib/libmlib_image.so +0 -0
- quarchpy/connection_specific/jdk_jres/lin_amd64_jdk_jre/lib/libnet.so +0 -0
- quarchpy/connection_specific/jdk_jres/lin_amd64_jdk_jre/lib/libnio.so +0 -0
- quarchpy/connection_specific/jdk_jres/lin_amd64_jdk_jre/lib/libprefs.so +0 -0
- quarchpy/connection_specific/jdk_jres/lin_amd64_jdk_jre/lib/libprism_common.so +0 -0
- quarchpy/connection_specific/jdk_jres/lin_amd64_jdk_jre/lib/libprism_es2.so +0 -0
- quarchpy/connection_specific/jdk_jres/lin_amd64_jdk_jre/lib/libprism_es2_monocle.so +0 -0
- quarchpy/connection_specific/jdk_jres/lin_amd64_jdk_jre/lib/libprism_sw.so +0 -0
- quarchpy/connection_specific/jdk_jres/lin_amd64_jdk_jre/lib/librmi.so +0 -0
- quarchpy/connection_specific/jdk_jres/lin_amd64_jdk_jre/lib/libsctp.so +0 -0
- quarchpy/connection_specific/jdk_jres/lin_amd64_jdk_jre/lib/libsimdsort.so +0 -0
- quarchpy/connection_specific/jdk_jres/lin_amd64_jdk_jre/lib/libsplashscreen.so +0 -0
- quarchpy/connection_specific/jdk_jres/lin_amd64_jdk_jre/lib/libsyslookup.so +0 -0
- quarchpy/connection_specific/jdk_jres/lin_amd64_jdk_jre/lib/libverify.so +0 -0
- quarchpy/connection_specific/jdk_jres/lin_amd64_jdk_jre/lib/libzip.so +0 -0
- quarchpy/connection_specific/jdk_jres/lin_amd64_jdk_jre/lib/minimal/libjsig.so +0 -0
- quarchpy/connection_specific/jdk_jres/lin_amd64_jdk_jre/lib/minimal/libjvm.so +0 -0
- quarchpy/connection_specific/jdk_jres/lin_amd64_jdk_jre/lib/modules +0 -0
- quarchpy/connection_specific/jdk_jres/lin_amd64_jdk_jre/lib/psfont.properties.ja +119 -119
- quarchpy/connection_specific/jdk_jres/lin_amd64_jdk_jre/lib/psfontj2d.properties +323 -323
- quarchpy/connection_specific/jdk_jres/lin_amd64_jdk_jre/lib/security/blocked.certs +39 -39
- quarchpy/connection_specific/jdk_jres/lin_amd64_jdk_jre/lib/security/cacerts +0 -0
- quarchpy/connection_specific/jdk_jres/lin_amd64_jdk_jre/lib/server/libjsig.so +0 -0
- quarchpy/connection_specific/jdk_jres/lin_amd64_jdk_jre/lib/server/libjvm.so +0 -0
- quarchpy/connection_specific/jdk_jres/lin_amd64_jdk_jre/release +2 -2
- quarchpy/connection_specific/jdk_jres/mac_amd64_jdk_jre/bin/java +0 -0
- quarchpy/connection_specific/jdk_jres/mac_amd64_jdk_jre/bin/jfr +0 -0
- quarchpy/connection_specific/jdk_jres/mac_amd64_jdk_jre/bin/jrunscript +0 -0
- quarchpy/connection_specific/jdk_jres/mac_amd64_jdk_jre/bin/jwebserver +0 -0
- quarchpy/connection_specific/jdk_jres/mac_amd64_jdk_jre/bin/keytool +0 -0
- quarchpy/connection_specific/jdk_jres/mac_amd64_jdk_jre/bin/rmiregistry +0 -0
- quarchpy/connection_specific/jdk_jres/mac_amd64_jdk_jre/conf/jaxp-strict.properties.template +123 -123
- quarchpy/connection_specific/jdk_jres/mac_amd64_jdk_jre/conf/jaxp.properties +200 -200
- quarchpy/connection_specific/jdk_jres/mac_amd64_jdk_jre/conf/logging.properties +63 -63
- quarchpy/connection_specific/jdk_jres/mac_amd64_jdk_jre/conf/management/jmxremote.access +79 -79
- quarchpy/connection_specific/jdk_jres/mac_amd64_jdk_jre/conf/management/jmxremote.password.template +114 -114
- quarchpy/connection_specific/jdk_jres/mac_amd64_jdk_jre/conf/management/management.properties +326 -326
- quarchpy/connection_specific/jdk_jres/mac_amd64_jdk_jre/conf/net.properties +162 -162
- quarchpy/connection_specific/jdk_jres/mac_amd64_jdk_jre/conf/security/java.security +1518 -1518
- quarchpy/connection_specific/jdk_jres/mac_amd64_jdk_jre/conf/security/policy/README.txt +54 -54
- quarchpy/connection_specific/jdk_jres/mac_amd64_jdk_jre/conf/security/policy/limited/default_US_export.policy +6 -6
- quarchpy/connection_specific/jdk_jres/mac_amd64_jdk_jre/conf/security/policy/limited/default_local.policy +14 -14
- quarchpy/connection_specific/jdk_jres/mac_amd64_jdk_jre/conf/security/policy/limited/exempt_local.policy +13 -13
- quarchpy/connection_specific/jdk_jres/mac_amd64_jdk_jre/conf/security/policy/unlimited/default_US_export.policy +6 -6
- quarchpy/connection_specific/jdk_jres/mac_amd64_jdk_jre/conf/security/policy/unlimited/default_local.policy +6 -6
- quarchpy/connection_specific/jdk_jres/mac_amd64_jdk_jre/conf/sound.properties +39 -39
- quarchpy/connection_specific/jdk_jres/mac_amd64_jdk_jre/legal/java.base/ADDITIONAL_LICENSE_INFO +37 -37
- quarchpy/connection_specific/jdk_jres/mac_amd64_jdk_jre/legal/java.base/ASSEMBLY_EXCEPTION +27 -27
- quarchpy/connection_specific/jdk_jres/mac_amd64_jdk_jre/legal/java.base/LICENSE +347 -347
- quarchpy/connection_specific/jdk_jres/mac_amd64_jdk_jre/legal/java.base/aes.md +36 -36
- quarchpy/connection_specific/jdk_jres/mac_amd64_jdk_jre/legal/java.base/asm.md +36 -36
- quarchpy/connection_specific/jdk_jres/mac_amd64_jdk_jre/legal/java.base/c-libutl.md +35 -35
- quarchpy/connection_specific/jdk_jres/mac_amd64_jdk_jre/legal/java.base/cldr.md +100 -100
- quarchpy/connection_specific/jdk_jres/mac_amd64_jdk_jre/legal/java.base/icu.md +93 -93
- quarchpy/connection_specific/jdk_jres/mac_amd64_jdk_jre/legal/java.base/public_suffix.md +399 -399
- quarchpy/connection_specific/jdk_jres/mac_amd64_jdk_jre/legal/java.base/siphash.md +150 -150
- quarchpy/connection_specific/jdk_jres/mac_amd64_jdk_jre/legal/java.base/unicode.md +269 -269
- quarchpy/connection_specific/jdk_jres/mac_amd64_jdk_jre/legal/java.compiler/ADDITIONAL_LICENSE_INFO +37 -37
- quarchpy/connection_specific/jdk_jres/mac_amd64_jdk_jre/legal/java.compiler/ASSEMBLY_EXCEPTION +27 -27
- quarchpy/connection_specific/jdk_jres/mac_amd64_jdk_jre/legal/java.compiler/LICENSE +347 -347
- quarchpy/connection_specific/jdk_jres/mac_amd64_jdk_jre/legal/java.datatransfer/ADDITIONAL_LICENSE_INFO +37 -37
- quarchpy/connection_specific/jdk_jres/mac_amd64_jdk_jre/legal/java.datatransfer/ASSEMBLY_EXCEPTION +27 -27
- quarchpy/connection_specific/jdk_jres/mac_amd64_jdk_jre/legal/java.datatransfer/LICENSE +347 -347
- quarchpy/connection_specific/jdk_jres/mac_amd64_jdk_jre/legal/java.desktop/ADDITIONAL_LICENSE_INFO +37 -37
- quarchpy/connection_specific/jdk_jres/mac_amd64_jdk_jre/legal/java.desktop/ASSEMBLY_EXCEPTION +27 -27
- quarchpy/connection_specific/jdk_jres/mac_amd64_jdk_jre/legal/java.desktop/LICENSE +347 -347
- quarchpy/connection_specific/jdk_jres/mac_amd64_jdk_jre/legal/java.desktop/colorimaging.md +7 -7
- quarchpy/connection_specific/jdk_jres/mac_amd64_jdk_jre/legal/java.desktop/freetype.md +649 -649
- quarchpy/connection_specific/jdk_jres/mac_amd64_jdk_jre/legal/java.desktop/giflib.md +46 -46
- quarchpy/connection_specific/jdk_jres/mac_amd64_jdk_jre/legal/java.desktop/harfbuzz.md +104 -103
- quarchpy/connection_specific/jdk_jres/mac_amd64_jdk_jre/legal/java.desktop/jpeg.md +77 -77
- quarchpy/connection_specific/jdk_jres/mac_amd64_jdk_jre/legal/java.desktop/lcms.md +103 -103
- quarchpy/connection_specific/jdk_jres/mac_amd64_jdk_jre/legal/java.desktop/libpng.md +216 -215
- quarchpy/connection_specific/jdk_jres/mac_amd64_jdk_jre/legal/java.desktop/mesa3d.md +134 -134
- quarchpy/connection_specific/jdk_jres/mac_amd64_jdk_jre/legal/java.desktop/pipewire.md +46 -41
- quarchpy/connection_specific/jdk_jres/mac_amd64_jdk_jre/legal/java.desktop/xwd.md +34 -34
- quarchpy/connection_specific/jdk_jres/mac_amd64_jdk_jre/legal/java.instrument/ADDITIONAL_LICENSE_INFO +37 -37
- quarchpy/connection_specific/jdk_jres/mac_amd64_jdk_jre/legal/java.instrument/ASSEMBLY_EXCEPTION +27 -27
- quarchpy/connection_specific/jdk_jres/mac_amd64_jdk_jre/legal/java.instrument/LICENSE +347 -347
- quarchpy/connection_specific/jdk_jres/mac_amd64_jdk_jre/legal/java.logging/ADDITIONAL_LICENSE_INFO +37 -37
- quarchpy/connection_specific/jdk_jres/mac_amd64_jdk_jre/legal/java.logging/ASSEMBLY_EXCEPTION +27 -27
- quarchpy/connection_specific/jdk_jres/mac_amd64_jdk_jre/legal/java.logging/LICENSE +347 -347
- quarchpy/connection_specific/jdk_jres/mac_amd64_jdk_jre/legal/java.management/ADDITIONAL_LICENSE_INFO +37 -37
- quarchpy/connection_specific/jdk_jres/mac_amd64_jdk_jre/legal/java.management/ASSEMBLY_EXCEPTION +27 -27
- quarchpy/connection_specific/jdk_jres/mac_amd64_jdk_jre/legal/java.management/LICENSE +347 -347
- quarchpy/connection_specific/jdk_jres/mac_amd64_jdk_jre/legal/java.management.rmi/ADDITIONAL_LICENSE_INFO +37 -37
- quarchpy/connection_specific/jdk_jres/mac_amd64_jdk_jre/legal/java.management.rmi/ASSEMBLY_EXCEPTION +27 -27
- quarchpy/connection_specific/jdk_jres/mac_amd64_jdk_jre/legal/java.management.rmi/LICENSE +347 -347
- quarchpy/connection_specific/jdk_jres/mac_amd64_jdk_jre/legal/java.naming/ADDITIONAL_LICENSE_INFO +37 -37
- quarchpy/connection_specific/jdk_jres/mac_amd64_jdk_jre/legal/java.naming/ASSEMBLY_EXCEPTION +27 -27
- quarchpy/connection_specific/jdk_jres/mac_amd64_jdk_jre/legal/java.naming/LICENSE +347 -347
- quarchpy/connection_specific/jdk_jres/mac_amd64_jdk_jre/legal/java.net.http/ADDITIONAL_LICENSE_INFO +37 -37
- quarchpy/connection_specific/jdk_jres/mac_amd64_jdk_jre/legal/java.net.http/ASSEMBLY_EXCEPTION +27 -27
- quarchpy/connection_specific/jdk_jres/mac_amd64_jdk_jre/legal/java.net.http/LICENSE +347 -347
- quarchpy/connection_specific/jdk_jres/mac_amd64_jdk_jre/legal/java.prefs/ADDITIONAL_LICENSE_INFO +37 -37
- quarchpy/connection_specific/jdk_jres/mac_amd64_jdk_jre/legal/java.prefs/ASSEMBLY_EXCEPTION +27 -27
- quarchpy/connection_specific/jdk_jres/mac_amd64_jdk_jre/legal/java.prefs/LICENSE +347 -347
- quarchpy/connection_specific/jdk_jres/mac_amd64_jdk_jre/legal/java.rmi/ADDITIONAL_LICENSE_INFO +37 -37
- quarchpy/connection_specific/jdk_jres/mac_amd64_jdk_jre/legal/java.rmi/ASSEMBLY_EXCEPTION +27 -27
- quarchpy/connection_specific/jdk_jres/mac_amd64_jdk_jre/legal/java.rmi/LICENSE +347 -347
- quarchpy/connection_specific/jdk_jres/mac_amd64_jdk_jre/legal/java.scripting/ADDITIONAL_LICENSE_INFO +37 -37
- quarchpy/connection_specific/jdk_jres/mac_amd64_jdk_jre/legal/java.scripting/ASSEMBLY_EXCEPTION +27 -27
- quarchpy/connection_specific/jdk_jres/mac_amd64_jdk_jre/legal/java.scripting/LICENSE +347 -347
- quarchpy/connection_specific/jdk_jres/mac_amd64_jdk_jre/legal/java.se/ADDITIONAL_LICENSE_INFO +37 -37
- quarchpy/connection_specific/jdk_jres/mac_amd64_jdk_jre/legal/java.se/ASSEMBLY_EXCEPTION +27 -27
- quarchpy/connection_specific/jdk_jres/mac_amd64_jdk_jre/legal/java.se/LICENSE +347 -347
- quarchpy/connection_specific/jdk_jres/mac_amd64_jdk_jre/legal/java.security.jgss/ADDITIONAL_LICENSE_INFO +37 -37
- quarchpy/connection_specific/jdk_jres/mac_amd64_jdk_jre/legal/java.security.jgss/ASSEMBLY_EXCEPTION +27 -27
- quarchpy/connection_specific/jdk_jres/mac_amd64_jdk_jre/legal/java.security.jgss/LICENSE +347 -347
- quarchpy/connection_specific/jdk_jres/mac_amd64_jdk_jre/legal/java.security.sasl/ADDITIONAL_LICENSE_INFO +37 -37
- quarchpy/connection_specific/jdk_jres/mac_amd64_jdk_jre/legal/java.security.sasl/ASSEMBLY_EXCEPTION +27 -27
- quarchpy/connection_specific/jdk_jres/mac_amd64_jdk_jre/legal/java.security.sasl/LICENSE +347 -347
- quarchpy/connection_specific/jdk_jres/mac_amd64_jdk_jre/legal/java.smartcardio/ADDITIONAL_LICENSE_INFO +37 -37
- quarchpy/connection_specific/jdk_jres/mac_amd64_jdk_jre/legal/java.smartcardio/ASSEMBLY_EXCEPTION +27 -27
- quarchpy/connection_specific/jdk_jres/mac_amd64_jdk_jre/legal/java.smartcardio/LICENSE +347 -347
- quarchpy/connection_specific/jdk_jres/mac_amd64_jdk_jre/legal/java.smartcardio/pcsclite.md +57 -57
- quarchpy/connection_specific/jdk_jres/mac_amd64_jdk_jre/legal/java.sql/ADDITIONAL_LICENSE_INFO +37 -37
- quarchpy/connection_specific/jdk_jres/mac_amd64_jdk_jre/legal/java.sql/ASSEMBLY_EXCEPTION +27 -27
- quarchpy/connection_specific/jdk_jres/mac_amd64_jdk_jre/legal/java.sql/LICENSE +347 -347
- quarchpy/connection_specific/jdk_jres/mac_amd64_jdk_jre/legal/java.sql.rowset/ADDITIONAL_LICENSE_INFO +37 -37
- quarchpy/connection_specific/jdk_jres/mac_amd64_jdk_jre/legal/java.sql.rowset/ASSEMBLY_EXCEPTION +27 -27
- quarchpy/connection_specific/jdk_jres/mac_amd64_jdk_jre/legal/java.sql.rowset/LICENSE +347 -347
- quarchpy/connection_specific/jdk_jres/mac_amd64_jdk_jre/legal/java.transaction.xa/ADDITIONAL_LICENSE_INFO +37 -37
- quarchpy/connection_specific/jdk_jres/mac_amd64_jdk_jre/legal/java.transaction.xa/ASSEMBLY_EXCEPTION +27 -27
- quarchpy/connection_specific/jdk_jres/mac_amd64_jdk_jre/legal/java.transaction.xa/LICENSE +347 -347
- quarchpy/connection_specific/jdk_jres/mac_amd64_jdk_jre/legal/java.xml/ADDITIONAL_LICENSE_INFO +37 -37
- quarchpy/connection_specific/jdk_jres/mac_amd64_jdk_jre/legal/java.xml/ASSEMBLY_EXCEPTION +27 -27
- quarchpy/connection_specific/jdk_jres/mac_amd64_jdk_jre/legal/java.xml/LICENSE +347 -347
- quarchpy/connection_specific/jdk_jres/mac_amd64_jdk_jre/legal/java.xml/bcel.md +219 -219
- quarchpy/connection_specific/jdk_jres/mac_amd64_jdk_jre/legal/java.xml/dom.md +77 -77
- quarchpy/connection_specific/jdk_jres/mac_amd64_jdk_jre/legal/java.xml/jcup.md +31 -31
- quarchpy/connection_specific/jdk_jres/mac_amd64_jdk_jre/legal/java.xml/schema10part1.md +51 -51
- quarchpy/connection_specific/jdk_jres/mac_amd64_jdk_jre/legal/java.xml/schema10part2.md +50 -50
- quarchpy/connection_specific/jdk_jres/mac_amd64_jdk_jre/legal/java.xml/xalan.md +255 -255
- quarchpy/connection_specific/jdk_jres/mac_amd64_jdk_jre/legal/java.xml/xerces.md +229 -229
- quarchpy/connection_specific/jdk_jres/mac_amd64_jdk_jre/legal/java.xml/xhtml10.md +57 -57
- quarchpy/connection_specific/jdk_jres/mac_amd64_jdk_jre/legal/java.xml/xhtml10schema.md +150 -150
- quarchpy/connection_specific/jdk_jres/mac_amd64_jdk_jre/legal/java.xml/xhtml11.md +68 -68
- quarchpy/connection_specific/jdk_jres/mac_amd64_jdk_jre/legal/java.xml/xhtml11schema.md +60 -60
- quarchpy/connection_specific/jdk_jres/mac_amd64_jdk_jre/legal/java.xml/xmlspec.md +63 -63
- quarchpy/connection_specific/jdk_jres/mac_amd64_jdk_jre/legal/java.xml/xmlxsd.md +43 -43
- quarchpy/connection_specific/jdk_jres/mac_amd64_jdk_jre/legal/java.xml.crypto/ADDITIONAL_LICENSE_INFO +37 -37
- quarchpy/connection_specific/jdk_jres/mac_amd64_jdk_jre/legal/java.xml.crypto/ASSEMBLY_EXCEPTION +27 -27
- quarchpy/connection_specific/jdk_jres/mac_amd64_jdk_jre/legal/java.xml.crypto/LICENSE +347 -347
- quarchpy/connection_specific/jdk_jres/mac_amd64_jdk_jre/legal/java.xml.crypto/santuario.md +227 -227
- quarchpy/connection_specific/jdk_jres/mac_amd64_jdk_jre/legal/javafx.base/ADDITIONAL_LICENSE_INFO +37 -0
- quarchpy/connection_specific/jdk_jres/mac_amd64_jdk_jre/legal/javafx.base/ASSEMBLY_EXCEPTION +27 -0
- quarchpy/connection_specific/jdk_jres/mac_amd64_jdk_jre/legal/javafx.base/LICENSE +347 -0
- quarchpy/connection_specific/jdk_jres/mac_amd64_jdk_jre/legal/javafx.controls/ADDITIONAL_LICENSE_INFO +37 -0
- quarchpy/connection_specific/jdk_jres/mac_amd64_jdk_jre/legal/javafx.controls/ASSEMBLY_EXCEPTION +27 -0
- quarchpy/connection_specific/jdk_jres/mac_amd64_jdk_jre/legal/javafx.controls/LICENSE +347 -0
- quarchpy/connection_specific/jdk_jres/mac_amd64_jdk_jre/legal/javafx.fxml/ADDITIONAL_LICENSE_INFO +37 -0
- quarchpy/connection_specific/jdk_jres/mac_amd64_jdk_jre/legal/javafx.fxml/ASSEMBLY_EXCEPTION +27 -0
- quarchpy/connection_specific/jdk_jres/mac_amd64_jdk_jre/legal/javafx.fxml/LICENSE +347 -0
- quarchpy/connection_specific/jdk_jres/mac_amd64_jdk_jre/legal/javafx.graphics/ADDITIONAL_LICENSE_INFO +37 -0
- quarchpy/connection_specific/jdk_jres/mac_amd64_jdk_jre/legal/javafx.graphics/ASSEMBLY_EXCEPTION +27 -0
- quarchpy/connection_specific/jdk_jres/mac_amd64_jdk_jre/legal/javafx.graphics/LICENSE +347 -0
- quarchpy/connection_specific/jdk_jres/mac_amd64_jdk_jre/legal/javafx.graphics/jpeg_fx.md +43 -0
- quarchpy/connection_specific/jdk_jres/mac_amd64_jdk_jre/legal/javafx.graphics/mesa3d.md +134 -0
- quarchpy/connection_specific/jdk_jres/mac_amd64_jdk_jre/legal/javafx.graphics/pipewire.md +46 -0
- quarchpy/connection_specific/jdk_jres/mac_amd64_jdk_jre/legal/javafx.swing/ADDITIONAL_LICENSE_INFO +37 -0
- quarchpy/connection_specific/jdk_jres/mac_amd64_jdk_jre/legal/javafx.swing/ASSEMBLY_EXCEPTION +27 -0
- quarchpy/connection_specific/jdk_jres/mac_amd64_jdk_jre/legal/javafx.swing/LICENSE +347 -0
- quarchpy/connection_specific/jdk_jres/mac_amd64_jdk_jre/legal/jdk.accessibility/ADDITIONAL_LICENSE_INFO +37 -37
- quarchpy/connection_specific/jdk_jres/mac_amd64_jdk_jre/legal/jdk.accessibility/ASSEMBLY_EXCEPTION +27 -27
- quarchpy/connection_specific/jdk_jres/mac_amd64_jdk_jre/legal/jdk.accessibility/LICENSE +347 -347
- quarchpy/connection_specific/jdk_jres/mac_amd64_jdk_jre/legal/jdk.charsets/ADDITIONAL_LICENSE_INFO +37 -37
- quarchpy/connection_specific/jdk_jres/mac_amd64_jdk_jre/legal/jdk.charsets/ASSEMBLY_EXCEPTION +27 -27
- quarchpy/connection_specific/jdk_jres/mac_amd64_jdk_jre/legal/jdk.charsets/LICENSE +347 -347
- quarchpy/connection_specific/jdk_jres/mac_amd64_jdk_jre/legal/jdk.crypto.cryptoki/ADDITIONAL_LICENSE_INFO +37 -37
- quarchpy/connection_specific/jdk_jres/mac_amd64_jdk_jre/legal/jdk.crypto.cryptoki/ASSEMBLY_EXCEPTION +27 -27
- quarchpy/connection_specific/jdk_jres/mac_amd64_jdk_jre/legal/jdk.crypto.cryptoki/LICENSE +347 -347
- quarchpy/connection_specific/jdk_jres/mac_amd64_jdk_jre/legal/jdk.crypto.cryptoki/pkcs11cryptotoken.md +76 -76
- quarchpy/connection_specific/jdk_jres/mac_amd64_jdk_jre/legal/jdk.crypto.cryptoki/pkcs11wrapper.md +46 -46
- quarchpy/connection_specific/jdk_jres/mac_amd64_jdk_jre/legal/jdk.crypto.ec/ADDITIONAL_LICENSE_INFO +37 -37
- quarchpy/connection_specific/jdk_jres/mac_amd64_jdk_jre/legal/jdk.crypto.ec/ASSEMBLY_EXCEPTION +27 -27
- quarchpy/connection_specific/jdk_jres/mac_amd64_jdk_jre/legal/jdk.crypto.ec/LICENSE +347 -347
- quarchpy/connection_specific/jdk_jres/mac_amd64_jdk_jre/legal/jdk.dynalink/ADDITIONAL_LICENSE_INFO +37 -37
- quarchpy/connection_specific/jdk_jres/mac_amd64_jdk_jre/legal/jdk.dynalink/ASSEMBLY_EXCEPTION +27 -27
- quarchpy/connection_specific/jdk_jres/mac_amd64_jdk_jre/legal/jdk.dynalink/LICENSE +347 -347
- quarchpy/connection_specific/jdk_jres/mac_amd64_jdk_jre/legal/jdk.dynalink/dynalink.md +32 -32
- quarchpy/connection_specific/jdk_jres/mac_amd64_jdk_jre/legal/jdk.httpserver/ADDITIONAL_LICENSE_INFO +37 -37
- quarchpy/connection_specific/jdk_jres/mac_amd64_jdk_jre/legal/jdk.httpserver/ASSEMBLY_EXCEPTION +27 -27
- quarchpy/connection_specific/jdk_jres/mac_amd64_jdk_jre/legal/jdk.httpserver/LICENSE +347 -347
- quarchpy/connection_specific/jdk_jres/mac_amd64_jdk_jre/legal/jdk.incubator.vector/ADDITIONAL_LICENSE_INFO +37 -37
- quarchpy/connection_specific/jdk_jres/mac_amd64_jdk_jre/legal/jdk.incubator.vector/ASSEMBLY_EXCEPTION +27 -27
- quarchpy/connection_specific/jdk_jres/mac_amd64_jdk_jre/legal/jdk.incubator.vector/LICENSE +347 -347
- quarchpy/connection_specific/jdk_jres/mac_amd64_jdk_jre/legal/jdk.internal.vm.ci/ADDITIONAL_LICENSE_INFO +37 -37
- quarchpy/connection_specific/jdk_jres/mac_amd64_jdk_jre/legal/jdk.internal.vm.ci/ASSEMBLY_EXCEPTION +27 -27
- quarchpy/connection_specific/jdk_jres/mac_amd64_jdk_jre/legal/jdk.internal.vm.ci/LICENSE +347 -347
- quarchpy/connection_specific/jdk_jres/mac_amd64_jdk_jre/legal/jdk.jdwp.agent/ADDITIONAL_LICENSE_INFO +37 -37
- quarchpy/connection_specific/jdk_jres/mac_amd64_jdk_jre/legal/jdk.jdwp.agent/ASSEMBLY_EXCEPTION +27 -27
- quarchpy/connection_specific/jdk_jres/mac_amd64_jdk_jre/legal/jdk.jdwp.agent/LICENSE +347 -347
- quarchpy/connection_specific/jdk_jres/mac_amd64_jdk_jre/legal/jdk.jfr/ADDITIONAL_LICENSE_INFO +37 -37
- quarchpy/connection_specific/jdk_jres/mac_amd64_jdk_jre/legal/jdk.jfr/ASSEMBLY_EXCEPTION +27 -27
- quarchpy/connection_specific/jdk_jres/mac_amd64_jdk_jre/legal/jdk.jfr/LICENSE +347 -347
- quarchpy/connection_specific/jdk_jres/mac_amd64_jdk_jre/legal/jdk.jsobject/ADDITIONAL_LICENSE_INFO +37 -37
- quarchpy/connection_specific/jdk_jres/mac_amd64_jdk_jre/legal/jdk.jsobject/ASSEMBLY_EXCEPTION +27 -27
- quarchpy/connection_specific/jdk_jres/mac_amd64_jdk_jre/legal/jdk.jsobject/LICENSE +347 -347
- quarchpy/connection_specific/jdk_jres/mac_amd64_jdk_jre/legal/jdk.localedata/ADDITIONAL_LICENSE_INFO +37 -37
- quarchpy/connection_specific/jdk_jres/mac_amd64_jdk_jre/legal/jdk.localedata/ASSEMBLY_EXCEPTION +27 -27
- quarchpy/connection_specific/jdk_jres/mac_amd64_jdk_jre/legal/jdk.localedata/LICENSE +347 -347
- quarchpy/connection_specific/jdk_jres/mac_amd64_jdk_jre/legal/jdk.localedata/cldr.md +100 -100
- quarchpy/connection_specific/jdk_jres/mac_amd64_jdk_jre/legal/jdk.localedata/thaidict.md +31 -31
- quarchpy/connection_specific/jdk_jres/mac_amd64_jdk_jre/legal/jdk.management/ADDITIONAL_LICENSE_INFO +37 -37
- quarchpy/connection_specific/jdk_jres/mac_amd64_jdk_jre/legal/jdk.management/ASSEMBLY_EXCEPTION +27 -27
- quarchpy/connection_specific/jdk_jres/mac_amd64_jdk_jre/legal/jdk.management/LICENSE +347 -347
- quarchpy/connection_specific/jdk_jres/mac_amd64_jdk_jre/legal/jdk.management.agent/ADDITIONAL_LICENSE_INFO +37 -37
- quarchpy/connection_specific/jdk_jres/mac_amd64_jdk_jre/legal/jdk.management.agent/ASSEMBLY_EXCEPTION +27 -27
- quarchpy/connection_specific/jdk_jres/mac_amd64_jdk_jre/legal/jdk.management.agent/LICENSE +347 -347
- quarchpy/connection_specific/jdk_jres/mac_amd64_jdk_jre/legal/jdk.management.jfr/ADDITIONAL_LICENSE_INFO +37 -37
- quarchpy/connection_specific/jdk_jres/mac_amd64_jdk_jre/legal/jdk.management.jfr/ASSEMBLY_EXCEPTION +27 -27
- quarchpy/connection_specific/jdk_jres/mac_amd64_jdk_jre/legal/jdk.management.jfr/LICENSE +347 -347
- quarchpy/connection_specific/jdk_jres/mac_amd64_jdk_jre/legal/jdk.naming.dns/ADDITIONAL_LICENSE_INFO +37 -37
- quarchpy/connection_specific/jdk_jres/mac_amd64_jdk_jre/legal/jdk.naming.dns/ASSEMBLY_EXCEPTION +27 -27
- quarchpy/connection_specific/jdk_jres/mac_amd64_jdk_jre/legal/jdk.naming.dns/LICENSE +347 -347
- quarchpy/connection_specific/jdk_jres/mac_amd64_jdk_jre/legal/jdk.naming.rmi/ADDITIONAL_LICENSE_INFO +37 -37
- quarchpy/connection_specific/jdk_jres/mac_amd64_jdk_jre/legal/jdk.naming.rmi/ASSEMBLY_EXCEPTION +27 -27
- quarchpy/connection_specific/jdk_jres/mac_amd64_jdk_jre/legal/jdk.naming.rmi/LICENSE +347 -347
- quarchpy/connection_specific/jdk_jres/mac_amd64_jdk_jre/legal/jdk.net/ADDITIONAL_LICENSE_INFO +37 -37
- quarchpy/connection_specific/jdk_jres/mac_amd64_jdk_jre/legal/jdk.net/ASSEMBLY_EXCEPTION +27 -27
- quarchpy/connection_specific/jdk_jres/mac_amd64_jdk_jre/legal/jdk.net/LICENSE +347 -347
- quarchpy/connection_specific/jdk_jres/mac_amd64_jdk_jre/legal/jdk.nio.mapmode/ADDITIONAL_LICENSE_INFO +37 -37
- quarchpy/connection_specific/jdk_jres/mac_amd64_jdk_jre/legal/jdk.nio.mapmode/ASSEMBLY_EXCEPTION +27 -27
- quarchpy/connection_specific/jdk_jres/mac_amd64_jdk_jre/legal/jdk.nio.mapmode/LICENSE +347 -347
- quarchpy/connection_specific/jdk_jres/mac_amd64_jdk_jre/legal/jdk.sctp/ADDITIONAL_LICENSE_INFO +37 -37
- quarchpy/connection_specific/jdk_jres/mac_amd64_jdk_jre/legal/jdk.sctp/ASSEMBLY_EXCEPTION +27 -27
- quarchpy/connection_specific/jdk_jres/mac_amd64_jdk_jre/legal/jdk.sctp/LICENSE +347 -347
- quarchpy/connection_specific/jdk_jres/mac_amd64_jdk_jre/legal/jdk.security.auth/ADDITIONAL_LICENSE_INFO +37 -37
- quarchpy/connection_specific/jdk_jres/mac_amd64_jdk_jre/legal/jdk.security.auth/ASSEMBLY_EXCEPTION +27 -27
- quarchpy/connection_specific/jdk_jres/mac_amd64_jdk_jre/legal/jdk.security.auth/LICENSE +347 -347
- quarchpy/connection_specific/jdk_jres/mac_amd64_jdk_jre/legal/jdk.security.jgss/ADDITIONAL_LICENSE_INFO +37 -37
- quarchpy/connection_specific/jdk_jres/mac_amd64_jdk_jre/legal/jdk.security.jgss/ASSEMBLY_EXCEPTION +27 -27
- quarchpy/connection_specific/jdk_jres/mac_amd64_jdk_jre/legal/jdk.security.jgss/LICENSE +347 -347
- quarchpy/connection_specific/jdk_jres/mac_amd64_jdk_jre/legal/jdk.unsupported/ADDITIONAL_LICENSE_INFO +37 -37
- quarchpy/connection_specific/jdk_jres/mac_amd64_jdk_jre/legal/jdk.unsupported/ASSEMBLY_EXCEPTION +27 -27
- quarchpy/connection_specific/jdk_jres/mac_amd64_jdk_jre/legal/jdk.unsupported/LICENSE +347 -347
- quarchpy/connection_specific/jdk_jres/mac_amd64_jdk_jre/legal/jdk.unsupported.desktop/ADDITIONAL_LICENSE_INFO +37 -37
- quarchpy/connection_specific/jdk_jres/mac_amd64_jdk_jre/legal/jdk.unsupported.desktop/ASSEMBLY_EXCEPTION +27 -27
- quarchpy/connection_specific/jdk_jres/mac_amd64_jdk_jre/legal/jdk.unsupported.desktop/LICENSE +347 -347
- quarchpy/connection_specific/jdk_jres/mac_amd64_jdk_jre/legal/jdk.xml.dom/ADDITIONAL_LICENSE_INFO +37 -37
- quarchpy/connection_specific/jdk_jres/mac_amd64_jdk_jre/legal/jdk.xml.dom/ASSEMBLY_EXCEPTION +27 -27
- quarchpy/connection_specific/jdk_jres/mac_amd64_jdk_jre/legal/jdk.xml.dom/LICENSE +347 -347
- quarchpy/connection_specific/jdk_jres/mac_amd64_jdk_jre/legal/jdk.zipfs/ADDITIONAL_LICENSE_INFO +37 -37
- quarchpy/connection_specific/jdk_jres/mac_amd64_jdk_jre/legal/jdk.zipfs/ASSEMBLY_EXCEPTION +27 -27
- quarchpy/connection_specific/jdk_jres/mac_amd64_jdk_jre/legal/jdk.zipfs/LICENSE +347 -347
- quarchpy/connection_specific/jdk_jres/mac_amd64_jdk_jre/lib/classlist +1589 -1589
- quarchpy/connection_specific/jdk_jres/mac_amd64_jdk_jre/lib/client/libjsig.dylib +0 -0
- quarchpy/connection_specific/jdk_jres/mac_amd64_jdk_jre/lib/client/libjvm.dylib +0 -0
- quarchpy/connection_specific/jdk_jres/mac_amd64_jdk_jre/lib/fontconfig.properties.src +258 -258
- quarchpy/connection_specific/jdk_jres/mac_amd64_jdk_jre/lib/javafx-swt.jar +0 -0
- quarchpy/connection_specific/jdk_jres/mac_amd64_jdk_jre/lib/javafx.properties +3 -0
- quarchpy/connection_specific/jdk_jres/mac_amd64_jdk_jre/lib/jfr/default.jfc +1152 -1152
- quarchpy/connection_specific/jdk_jres/mac_amd64_jdk_jre/lib/jfr/profile.jfc +1151 -1151
- quarchpy/connection_specific/jdk_jres/mac_amd64_jdk_jre/lib/jrt-fs.jar +0 -0
- quarchpy/connection_specific/jdk_jres/mac_amd64_jdk_jre/lib/jspawnhelper +0 -0
- quarchpy/connection_specific/jdk_jres/mac_amd64_jdk_jre/lib/jvm.cfg +2 -2
- quarchpy/connection_specific/jdk_jres/mac_amd64_jdk_jre/lib/libawt.dylib +0 -0
- quarchpy/connection_specific/jdk_jres/mac_amd64_jdk_jre/lib/libawt_lwawt.dylib +0 -0
- quarchpy/connection_specific/jdk_jres/mac_amd64_jdk_jre/lib/libdecora_sse.dylib +0 -0
- quarchpy/connection_specific/jdk_jres/mac_amd64_jdk_jre/lib/libdt_socket.dylib +0 -0
- quarchpy/connection_specific/jdk_jres/mac_amd64_jdk_jre/lib/libextnet.dylib +0 -0
- quarchpy/connection_specific/jdk_jres/mac_amd64_jdk_jre/lib/libfontmanager.dylib +0 -0
- quarchpy/connection_specific/jdk_jres/mac_amd64_jdk_jre/lib/libfreetype.dylib +0 -0
- quarchpy/connection_specific/jdk_jres/mac_amd64_jdk_jre/lib/libglass.dylib +0 -0
- quarchpy/connection_specific/jdk_jres/mac_amd64_jdk_jre/lib/libinstrument.dylib +0 -0
- quarchpy/connection_specific/jdk_jres/mac_amd64_jdk_jre/lib/libj2gss.dylib +0 -0
- quarchpy/connection_specific/jdk_jres/mac_amd64_jdk_jre/lib/libj2pcsc.dylib +0 -0
- quarchpy/connection_specific/jdk_jres/mac_amd64_jdk_jre/lib/libj2pkcs11.dylib +0 -0
- quarchpy/connection_specific/jdk_jres/mac_amd64_jdk_jre/lib/libjaas.dylib +0 -0
- quarchpy/connection_specific/jdk_jres/mac_amd64_jdk_jre/lib/libjava.dylib +0 -0
- quarchpy/connection_specific/jdk_jres/mac_amd64_jdk_jre/lib/libjavafx_font.dylib +0 -0
- quarchpy/connection_specific/jdk_jres/mac_amd64_jdk_jre/lib/libjavafx_iio.dylib +0 -0
- quarchpy/connection_specific/jdk_jres/mac_amd64_jdk_jre/lib/libjavajpeg.dylib +0 -0
- quarchpy/connection_specific/jdk_jres/mac_amd64_jdk_jre/lib/libjawt.dylib +0 -0
- quarchpy/connection_specific/jdk_jres/mac_amd64_jdk_jre/lib/libjdwp.dylib +0 -0
- quarchpy/connection_specific/jdk_jres/mac_amd64_jdk_jre/lib/libjimage.dylib +0 -0
- quarchpy/connection_specific/jdk_jres/mac_amd64_jdk_jre/lib/libjli.dylib +0 -0
- quarchpy/connection_specific/jdk_jres/mac_amd64_jdk_jre/lib/libjsig.dylib +0 -0
- quarchpy/connection_specific/jdk_jres/mac_amd64_jdk_jre/lib/libjsound.dylib +0 -0
- quarchpy/connection_specific/jdk_jres/mac_amd64_jdk_jre/lib/liblcms.dylib +0 -0
- quarchpy/connection_specific/jdk_jres/mac_amd64_jdk_jre/lib/libmanagement.dylib +0 -0
- quarchpy/connection_specific/jdk_jres/mac_amd64_jdk_jre/lib/libmanagement_agent.dylib +0 -0
- quarchpy/connection_specific/jdk_jres/mac_amd64_jdk_jre/lib/libmanagement_ext.dylib +0 -0
- quarchpy/connection_specific/jdk_jres/mac_amd64_jdk_jre/lib/libmlib_image.dylib +0 -0
- quarchpy/connection_specific/jdk_jres/mac_amd64_jdk_jre/lib/libnet.dylib +0 -0
- quarchpy/connection_specific/jdk_jres/mac_amd64_jdk_jre/lib/libnio.dylib +0 -0
- quarchpy/connection_specific/jdk_jres/mac_amd64_jdk_jre/lib/libosx.dylib +0 -0
- quarchpy/connection_specific/jdk_jres/mac_amd64_jdk_jre/lib/libosxapp.dylib +0 -0
- quarchpy/connection_specific/jdk_jres/mac_amd64_jdk_jre/lib/libosxkrb5.dylib +0 -0
- quarchpy/connection_specific/jdk_jres/mac_amd64_jdk_jre/lib/libosxsecurity.dylib +0 -0
- quarchpy/connection_specific/jdk_jres/mac_amd64_jdk_jre/lib/libosxui.dylib +0 -0
- quarchpy/connection_specific/jdk_jres/mac_amd64_jdk_jre/lib/libprefs.dylib +0 -0
- quarchpy/connection_specific/jdk_jres/mac_amd64_jdk_jre/lib/libprism_common.dylib +0 -0
- quarchpy/connection_specific/jdk_jres/mac_amd64_jdk_jre/lib/libprism_es2.dylib +0 -0
- quarchpy/connection_specific/jdk_jres/mac_amd64_jdk_jre/lib/libprism_sw.dylib +0 -0
- quarchpy/connection_specific/jdk_jres/mac_amd64_jdk_jre/lib/librmi.dylib +0 -0
- quarchpy/connection_specific/jdk_jres/mac_amd64_jdk_jre/lib/libsplashscreen.dylib +0 -0
- quarchpy/connection_specific/jdk_jres/mac_amd64_jdk_jre/lib/libsyslookup.dylib +0 -0
- quarchpy/connection_specific/jdk_jres/mac_amd64_jdk_jre/lib/libverify.dylib +0 -0
- quarchpy/connection_specific/jdk_jres/mac_amd64_jdk_jre/lib/libzip.dylib +0 -0
- quarchpy/connection_specific/jdk_jres/mac_amd64_jdk_jre/lib/modules +0 -0
- quarchpy/connection_specific/jdk_jres/mac_amd64_jdk_jre/lib/psfont.properties.ja +119 -119
- quarchpy/connection_specific/jdk_jres/mac_amd64_jdk_jre/lib/psfontj2d.properties +323 -323
- quarchpy/connection_specific/jdk_jres/mac_amd64_jdk_jre/lib/security/blocked.certs +39 -39
- quarchpy/connection_specific/jdk_jres/mac_amd64_jdk_jre/lib/security/cacerts +0 -0
- quarchpy/connection_specific/jdk_jres/mac_amd64_jdk_jre/lib/server/libjsig.dylib +0 -0
- quarchpy/connection_specific/jdk_jres/mac_amd64_jdk_jre/lib/server/libjvm.dylib +0 -0
- quarchpy/connection_specific/jdk_jres/mac_amd64_jdk_jre/lib/shaders.metallib +0 -0
- quarchpy/connection_specific/jdk_jres/mac_amd64_jdk_jre/release +2 -2
- quarchpy/connection_specific/jdk_jres/win_amd64_jdk_jre/bin/api-ms-win-core-console-l1-1-0.dll +0 -0
- quarchpy/connection_specific/jdk_jres/win_amd64_jdk_jre/bin/api-ms-win-core-console-l1-2-0.dll +0 -0
- quarchpy/connection_specific/jdk_jres/win_amd64_jdk_jre/bin/api-ms-win-core-datetime-l1-1-0.dll +0 -0
- quarchpy/connection_specific/jdk_jres/win_amd64_jdk_jre/bin/api-ms-win-core-debug-l1-1-0.dll +0 -0
- quarchpy/connection_specific/jdk_jres/win_amd64_jdk_jre/bin/api-ms-win-core-errorhandling-l1-1-0.dll +0 -0
- quarchpy/connection_specific/jdk_jres/win_amd64_jdk_jre/bin/api-ms-win-core-fibers-l1-1-0.dll +0 -0
- quarchpy/connection_specific/jdk_jres/win_amd64_jdk_jre/bin/api-ms-win-core-file-l1-1-0.dll +0 -0
- quarchpy/connection_specific/jdk_jres/win_amd64_jdk_jre/bin/api-ms-win-core-file-l1-2-0.dll +0 -0
- quarchpy/connection_specific/jdk_jres/win_amd64_jdk_jre/bin/api-ms-win-core-file-l2-1-0.dll +0 -0
- quarchpy/connection_specific/jdk_jres/win_amd64_jdk_jre/bin/api-ms-win-core-handle-l1-1-0.dll +0 -0
- quarchpy/connection_specific/jdk_jres/win_amd64_jdk_jre/bin/api-ms-win-core-heap-l1-1-0.dll +0 -0
- quarchpy/connection_specific/jdk_jres/win_amd64_jdk_jre/bin/api-ms-win-core-interlocked-l1-1-0.dll +0 -0
- quarchpy/connection_specific/jdk_jres/win_amd64_jdk_jre/bin/api-ms-win-core-libraryloader-l1-1-0.dll +0 -0
- quarchpy/connection_specific/jdk_jres/win_amd64_jdk_jre/bin/api-ms-win-core-localization-l1-2-0.dll +0 -0
- quarchpy/connection_specific/jdk_jres/win_amd64_jdk_jre/bin/api-ms-win-core-memory-l1-1-0.dll +0 -0
- quarchpy/connection_specific/jdk_jres/win_amd64_jdk_jre/bin/api-ms-win-core-namedpipe-l1-1-0.dll +0 -0
- quarchpy/connection_specific/jdk_jres/win_amd64_jdk_jre/bin/api-ms-win-core-processenvironment-l1-1-0.dll +0 -0
- quarchpy/connection_specific/jdk_jres/win_amd64_jdk_jre/bin/api-ms-win-core-processthreads-l1-1-0.dll +0 -0
- quarchpy/connection_specific/jdk_jres/win_amd64_jdk_jre/bin/api-ms-win-core-processthreads-l1-1-1.dll +0 -0
- quarchpy/connection_specific/jdk_jres/win_amd64_jdk_jre/bin/api-ms-win-core-profile-l1-1-0.dll +0 -0
- quarchpy/connection_specific/jdk_jres/win_amd64_jdk_jre/bin/api-ms-win-core-rtlsupport-l1-1-0.dll +0 -0
- quarchpy/connection_specific/jdk_jres/win_amd64_jdk_jre/bin/api-ms-win-core-string-l1-1-0.dll +0 -0
- quarchpy/connection_specific/jdk_jres/win_amd64_jdk_jre/bin/api-ms-win-core-synch-l1-1-0.dll +0 -0
- quarchpy/connection_specific/jdk_jres/win_amd64_jdk_jre/bin/api-ms-win-core-synch-l1-2-0.dll +0 -0
- quarchpy/connection_specific/jdk_jres/win_amd64_jdk_jre/bin/api-ms-win-core-sysinfo-l1-1-0.dll +0 -0
- quarchpy/connection_specific/jdk_jres/win_amd64_jdk_jre/bin/api-ms-win-core-timezone-l1-1-0.dll +0 -0
- quarchpy/connection_specific/jdk_jres/win_amd64_jdk_jre/bin/api-ms-win-core-util-l1-1-0.dll +0 -0
- quarchpy/connection_specific/jdk_jres/win_amd64_jdk_jre/bin/api-ms-win-crt-conio-l1-1-0.dll +0 -0
- quarchpy/connection_specific/jdk_jres/win_amd64_jdk_jre/bin/api-ms-win-crt-convert-l1-1-0.dll +0 -0
- quarchpy/connection_specific/jdk_jres/win_amd64_jdk_jre/bin/api-ms-win-crt-environment-l1-1-0.dll +0 -0
- quarchpy/connection_specific/jdk_jres/win_amd64_jdk_jre/bin/api-ms-win-crt-filesystem-l1-1-0.dll +0 -0
- quarchpy/connection_specific/jdk_jres/win_amd64_jdk_jre/bin/api-ms-win-crt-heap-l1-1-0.dll +0 -0
- quarchpy/connection_specific/jdk_jres/win_amd64_jdk_jre/bin/api-ms-win-crt-locale-l1-1-0.dll +0 -0
- quarchpy/connection_specific/jdk_jres/win_amd64_jdk_jre/bin/api-ms-win-crt-math-l1-1-0.dll +0 -0
- quarchpy/connection_specific/jdk_jres/win_amd64_jdk_jre/bin/api-ms-win-crt-multibyte-l1-1-0.dll +0 -0
- quarchpy/connection_specific/jdk_jres/win_amd64_jdk_jre/bin/api-ms-win-crt-private-l1-1-0.dll +0 -0
- quarchpy/connection_specific/jdk_jres/win_amd64_jdk_jre/bin/api-ms-win-crt-process-l1-1-0.dll +0 -0
- quarchpy/connection_specific/jdk_jres/win_amd64_jdk_jre/bin/api-ms-win-crt-runtime-l1-1-0.dll +0 -0
- quarchpy/connection_specific/jdk_jres/win_amd64_jdk_jre/bin/api-ms-win-crt-stdio-l1-1-0.dll +0 -0
- quarchpy/connection_specific/jdk_jres/win_amd64_jdk_jre/bin/api-ms-win-crt-string-l1-1-0.dll +0 -0
- quarchpy/connection_specific/jdk_jres/win_amd64_jdk_jre/bin/api-ms-win-crt-time-l1-1-0.dll +0 -0
- quarchpy/connection_specific/jdk_jres/win_amd64_jdk_jre/bin/api-ms-win-crt-utility-l1-1-0.dll +0 -0
- quarchpy/connection_specific/jdk_jres/win_amd64_jdk_jre/bin/awt.dll +0 -0
- quarchpy/connection_specific/jdk_jres/win_amd64_jdk_jre/bin/client/jvm.dll +0 -0
- quarchpy/connection_specific/jdk_jres/win_amd64_jdk_jre/bin/decora_sse.dll +0 -0
- quarchpy/connection_specific/jdk_jres/win_amd64_jdk_jre/bin/dt_socket.dll +0 -0
- quarchpy/connection_specific/jdk_jres/win_amd64_jdk_jre/bin/extnet.dll +0 -0
- quarchpy/connection_specific/jdk_jres/win_amd64_jdk_jre/bin/fontmanager.dll +0 -0
- quarchpy/connection_specific/jdk_jres/win_amd64_jdk_jre/bin/freetype.dll +0 -0
- quarchpy/connection_specific/jdk_jres/win_amd64_jdk_jre/bin/glass.dll +0 -0
- quarchpy/connection_specific/jdk_jres/win_amd64_jdk_jre/bin/instrument.dll +0 -0
- quarchpy/connection_specific/jdk_jres/win_amd64_jdk_jre/bin/j2gss.dll +0 -0
- quarchpy/connection_specific/jdk_jres/win_amd64_jdk_jre/bin/j2pcsc.dll +0 -0
- quarchpy/connection_specific/jdk_jres/win_amd64_jdk_jre/bin/j2pkcs11.dll +0 -0
- quarchpy/connection_specific/jdk_jres/win_amd64_jdk_jre/bin/jaas.dll +0 -0
- quarchpy/connection_specific/jdk_jres/win_amd64_jdk_jre/bin/jabswitch.exe +0 -0
- quarchpy/connection_specific/jdk_jres/win_amd64_jdk_jre/bin/jaccessinspector.exe +0 -0
- quarchpy/connection_specific/jdk_jres/win_amd64_jdk_jre/bin/jaccesswalker.exe +0 -0
- quarchpy/connection_specific/jdk_jres/win_amd64_jdk_jre/bin/java.dll +0 -0
- quarchpy/connection_specific/jdk_jres/win_amd64_jdk_jre/bin/java.exe +0 -0
- quarchpy/connection_specific/jdk_jres/win_amd64_jdk_jre/bin/javaaccessbridge.dll +0 -0
- quarchpy/connection_specific/jdk_jres/win_amd64_jdk_jre/bin/javafx_font.dll +0 -0
- quarchpy/connection_specific/jdk_jres/win_amd64_jdk_jre/bin/javafx_iio.dll +0 -0
- quarchpy/connection_specific/jdk_jres/win_amd64_jdk_jre/bin/javajpeg.dll +0 -0
- quarchpy/connection_specific/jdk_jres/win_amd64_jdk_jre/bin/javaw.exe +0 -0
- quarchpy/connection_specific/jdk_jres/win_amd64_jdk_jre/bin/jawt.dll +0 -0
- quarchpy/connection_specific/jdk_jres/win_amd64_jdk_jre/bin/jdwp.dll +0 -0
- quarchpy/connection_specific/jdk_jres/win_amd64_jdk_jre/bin/jfr.exe +0 -0
- quarchpy/connection_specific/jdk_jres/win_amd64_jdk_jre/bin/jimage.dll +0 -0
- quarchpy/connection_specific/jdk_jres/win_amd64_jdk_jre/bin/jli.dll +0 -0
- quarchpy/connection_specific/jdk_jres/win_amd64_jdk_jre/bin/jrunscript.exe +0 -0
- quarchpy/connection_specific/jdk_jres/win_amd64_jdk_jre/bin/jsound.dll +0 -0
- quarchpy/connection_specific/jdk_jres/win_amd64_jdk_jre/bin/jsvml.dll +0 -0
- quarchpy/connection_specific/jdk_jres/win_amd64_jdk_jre/bin/jwebserver.exe +0 -0
- quarchpy/connection_specific/jdk_jres/win_amd64_jdk_jre/bin/keytool.exe +0 -0
- quarchpy/connection_specific/jdk_jres/win_amd64_jdk_jre/bin/kinit.exe +0 -0
- quarchpy/connection_specific/jdk_jres/win_amd64_jdk_jre/bin/klist.exe +0 -0
- quarchpy/connection_specific/jdk_jres/win_amd64_jdk_jre/bin/ktab.exe +0 -0
- quarchpy/connection_specific/jdk_jres/win_amd64_jdk_jre/bin/lcms.dll +0 -0
- quarchpy/connection_specific/jdk_jres/win_amd64_jdk_jre/bin/management.dll +0 -0
- quarchpy/connection_specific/jdk_jres/win_amd64_jdk_jre/bin/management_agent.dll +0 -0
- quarchpy/connection_specific/jdk_jres/win_amd64_jdk_jre/bin/management_ext.dll +0 -0
- quarchpy/connection_specific/jdk_jres/win_amd64_jdk_jre/bin/mlib_image.dll +0 -0
- quarchpy/connection_specific/jdk_jres/win_amd64_jdk_jre/bin/msvcp140.dll +0 -0
- quarchpy/connection_specific/jdk_jres/win_amd64_jdk_jre/bin/msvcp140_1.dll +0 -0
- quarchpy/connection_specific/jdk_jres/win_amd64_jdk_jre/bin/msvcp140_2.dll +0 -0
- quarchpy/connection_specific/jdk_jres/win_amd64_jdk_jre/bin/net.dll +0 -0
- quarchpy/connection_specific/jdk_jres/win_amd64_jdk_jre/bin/nio.dll +0 -0
- quarchpy/connection_specific/jdk_jres/win_amd64_jdk_jre/bin/prefs.dll +0 -0
- quarchpy/connection_specific/jdk_jres/win_amd64_jdk_jre/bin/prism_common.dll +0 -0
- quarchpy/connection_specific/jdk_jres/win_amd64_jdk_jre/bin/prism_d3d.dll +0 -0
- quarchpy/connection_specific/jdk_jres/win_amd64_jdk_jre/bin/prism_sw.dll +0 -0
- quarchpy/connection_specific/jdk_jres/win_amd64_jdk_jre/bin/rmi.dll +0 -0
- quarchpy/connection_specific/jdk_jres/win_amd64_jdk_jre/bin/rmiregistry.exe +0 -0
- quarchpy/connection_specific/jdk_jres/win_amd64_jdk_jre/bin/server/jvm.dll +0 -0
- quarchpy/connection_specific/jdk_jres/win_amd64_jdk_jre/bin/splashscreen.dll +0 -0
- quarchpy/connection_specific/jdk_jres/win_amd64_jdk_jre/bin/sspi_bridge.dll +0 -0
- quarchpy/connection_specific/jdk_jres/win_amd64_jdk_jre/bin/syslookup.dll +0 -0
- quarchpy/connection_specific/jdk_jres/win_amd64_jdk_jre/bin/ucrtbase.dll +0 -0
- quarchpy/connection_specific/jdk_jres/win_amd64_jdk_jre/bin/vcruntime140.dll +0 -0
- quarchpy/connection_specific/jdk_jres/win_amd64_jdk_jre/bin/vcruntime140_1.dll +0 -0
- quarchpy/connection_specific/jdk_jres/win_amd64_jdk_jre/bin/verify.dll +0 -0
- quarchpy/connection_specific/jdk_jres/win_amd64_jdk_jre/bin/w2k_lsa_auth.dll +0 -0
- quarchpy/connection_specific/jdk_jres/win_amd64_jdk_jre/bin/windowsaccessbridge-64.dll +0 -0
- quarchpy/connection_specific/jdk_jres/win_amd64_jdk_jre/bin/zip.dll +0 -0
- quarchpy/connection_specific/jdk_jres/win_amd64_jdk_jre/conf/jaxp-strict.properties.template +123 -123
- quarchpy/connection_specific/jdk_jres/win_amd64_jdk_jre/conf/jaxp.properties +200 -200
- quarchpy/connection_specific/jdk_jres/win_amd64_jdk_jre/conf/logging.properties +63 -63
- quarchpy/connection_specific/jdk_jres/win_amd64_jdk_jre/conf/management/jmxremote.access +79 -79
- quarchpy/connection_specific/jdk_jres/win_amd64_jdk_jre/conf/management/jmxremote.password.template +114 -114
- quarchpy/connection_specific/jdk_jres/win_amd64_jdk_jre/conf/management/management.properties +326 -326
- quarchpy/connection_specific/jdk_jres/win_amd64_jdk_jre/conf/net.properties +166 -166
- quarchpy/connection_specific/jdk_jres/win_amd64_jdk_jre/conf/security/java.security +1 -4
- quarchpy/connection_specific/jdk_jres/win_amd64_jdk_jre/conf/security/policy/README.txt +54 -54
- quarchpy/connection_specific/jdk_jres/win_amd64_jdk_jre/conf/security/policy/limited/default_US_export.policy +6 -6
- quarchpy/connection_specific/jdk_jres/win_amd64_jdk_jre/conf/security/policy/limited/default_local.policy +14 -14
- quarchpy/connection_specific/jdk_jres/win_amd64_jdk_jre/conf/security/policy/limited/exempt_local.policy +13 -13
- quarchpy/connection_specific/jdk_jres/win_amd64_jdk_jre/conf/security/policy/unlimited/default_US_export.policy +6 -6
- quarchpy/connection_specific/jdk_jres/win_amd64_jdk_jre/conf/security/policy/unlimited/default_local.policy +6 -6
- quarchpy/connection_specific/jdk_jres/win_amd64_jdk_jre/conf/sound.properties +39 -39
- quarchpy/connection_specific/jdk_jres/win_amd64_jdk_jre/legal/java.base/ADDITIONAL_LICENSE_INFO +37 -37
- quarchpy/connection_specific/jdk_jres/win_amd64_jdk_jre/legal/java.base/ASSEMBLY_EXCEPTION +27 -27
- quarchpy/connection_specific/jdk_jres/win_amd64_jdk_jre/legal/java.base/LICENSE +347 -347
- quarchpy/connection_specific/jdk_jres/win_amd64_jdk_jre/legal/java.base/aes.md +36 -36
- quarchpy/connection_specific/jdk_jres/win_amd64_jdk_jre/legal/java.base/asm.md +36 -36
- quarchpy/connection_specific/jdk_jres/win_amd64_jdk_jre/legal/java.base/c-libutl.md +35 -35
- quarchpy/connection_specific/jdk_jres/win_amd64_jdk_jre/legal/java.base/cldr.md +100 -100
- quarchpy/connection_specific/jdk_jres/win_amd64_jdk_jre/legal/java.base/icu.md +93 -93
- quarchpy/connection_specific/jdk_jres/win_amd64_jdk_jre/legal/java.base/public_suffix.md +399 -399
- quarchpy/connection_specific/jdk_jres/win_amd64_jdk_jre/legal/java.base/siphash.md +150 -150
- quarchpy/connection_specific/jdk_jres/win_amd64_jdk_jre/legal/java.base/unicode.md +269 -269
- quarchpy/connection_specific/jdk_jres/win_amd64_jdk_jre/legal/java.base/wepoll.md +34 -34
- quarchpy/connection_specific/jdk_jres/win_amd64_jdk_jre/legal/java.base/zlib.md +27 -27
- quarchpy/connection_specific/jdk_jres/win_amd64_jdk_jre/legal/java.desktop/colorimaging.md +7 -7
- quarchpy/connection_specific/jdk_jres/win_amd64_jdk_jre/legal/java.desktop/freetype.md +649 -649
- quarchpy/connection_specific/jdk_jres/win_amd64_jdk_jre/legal/java.desktop/giflib.md +46 -46
- quarchpy/connection_specific/jdk_jres/win_amd64_jdk_jre/legal/java.desktop/harfbuzz.md +103 -103
- quarchpy/connection_specific/jdk_jres/win_amd64_jdk_jre/legal/java.desktop/jpeg.md +77 -77
- quarchpy/connection_specific/jdk_jres/win_amd64_jdk_jre/legal/java.desktop/lcms.md +103 -103
- quarchpy/connection_specific/jdk_jres/win_amd64_jdk_jre/legal/java.desktop/libpng.md +215 -215
- quarchpy/connection_specific/jdk_jres/win_amd64_jdk_jre/legal/java.desktop/mesa3d.md +134 -134
- quarchpy/connection_specific/jdk_jres/win_amd64_jdk_jre/legal/java.xml/bcel.md +219 -219
- quarchpy/connection_specific/jdk_jres/win_amd64_jdk_jre/legal/java.xml/dom.md +77 -77
- quarchpy/connection_specific/jdk_jres/win_amd64_jdk_jre/legal/java.xml/jcup.md +31 -31
- quarchpy/connection_specific/jdk_jres/win_amd64_jdk_jre/legal/java.xml/schema10part1.md +51 -51
- quarchpy/connection_specific/jdk_jres/win_amd64_jdk_jre/legal/java.xml/schema10part2.md +50 -50
- quarchpy/connection_specific/jdk_jres/win_amd64_jdk_jre/legal/java.xml/xalan.md +255 -255
- quarchpy/connection_specific/jdk_jres/win_amd64_jdk_jre/legal/java.xml/xerces.md +229 -229
- quarchpy/connection_specific/jdk_jres/win_amd64_jdk_jre/legal/java.xml/xhtml10.md +57 -57
- quarchpy/connection_specific/jdk_jres/win_amd64_jdk_jre/legal/java.xml/xhtml10schema.md +150 -150
- quarchpy/connection_specific/jdk_jres/win_amd64_jdk_jre/legal/java.xml/xhtml11.md +68 -68
- quarchpy/connection_specific/jdk_jres/win_amd64_jdk_jre/legal/java.xml/xhtml11schema.md +60 -60
- quarchpy/connection_specific/jdk_jres/win_amd64_jdk_jre/legal/java.xml/xmlspec.md +63 -63
- quarchpy/connection_specific/jdk_jres/win_amd64_jdk_jre/legal/java.xml/xmlxsd.md +43 -43
- quarchpy/connection_specific/jdk_jres/win_amd64_jdk_jre/legal/java.xml.crypto/santuario.md +227 -227
- quarchpy/connection_specific/jdk_jres/win_amd64_jdk_jre/legal/javafx.base/ADDITIONAL_LICENSE_INFO +1 -0
- quarchpy/connection_specific/jdk_jres/win_amd64_jdk_jre/legal/javafx.base/ASSEMBLY_EXCEPTION +1 -0
- quarchpy/connection_specific/jdk_jres/win_amd64_jdk_jre/legal/javafx.base/LICENSE +1 -0
- quarchpy/connection_specific/jdk_jres/win_amd64_jdk_jre/legal/javafx.controls/ADDITIONAL_LICENSE_INFO +1 -0
- quarchpy/connection_specific/jdk_jres/win_amd64_jdk_jre/legal/javafx.controls/ASSEMBLY_EXCEPTION +1 -0
- quarchpy/connection_specific/jdk_jres/win_amd64_jdk_jre/legal/javafx.controls/LICENSE +1 -0
- quarchpy/connection_specific/jdk_jres/win_amd64_jdk_jre/legal/javafx.fxml/ADDITIONAL_LICENSE_INFO +1 -0
- quarchpy/connection_specific/jdk_jres/win_amd64_jdk_jre/legal/javafx.fxml/ASSEMBLY_EXCEPTION +1 -0
- quarchpy/connection_specific/jdk_jres/win_amd64_jdk_jre/legal/javafx.fxml/LICENSE +1 -0
- quarchpy/connection_specific/jdk_jres/win_amd64_jdk_jre/legal/javafx.graphics/ADDITIONAL_LICENSE_INFO +1 -0
- quarchpy/connection_specific/jdk_jres/win_amd64_jdk_jre/legal/javafx.graphics/ASSEMBLY_EXCEPTION +1 -0
- quarchpy/connection_specific/jdk_jres/win_amd64_jdk_jre/legal/javafx.graphics/LICENSE +1 -0
- quarchpy/connection_specific/jdk_jres/win_amd64_jdk_jre/legal/javafx.graphics/jpeg_fx.md +43 -0
- quarchpy/connection_specific/jdk_jres/win_amd64_jdk_jre/legal/javafx.graphics/mesa3d.md +1 -0
- quarchpy/connection_specific/jdk_jres/win_amd64_jdk_jre/legal/javafx.graphics/pipewire.md +41 -0
- quarchpy/connection_specific/jdk_jres/win_amd64_jdk_jre/legal/javafx.swing/ADDITIONAL_LICENSE_INFO +1 -0
- quarchpy/connection_specific/jdk_jres/win_amd64_jdk_jre/legal/javafx.swing/ASSEMBLY_EXCEPTION +1 -0
- quarchpy/connection_specific/jdk_jres/win_amd64_jdk_jre/legal/javafx.swing/LICENSE +1 -0
- quarchpy/connection_specific/jdk_jres/win_amd64_jdk_jre/legal/jdk.crypto.cryptoki/pkcs11cryptotoken.md +76 -76
- quarchpy/connection_specific/jdk_jres/win_amd64_jdk_jre/legal/jdk.crypto.cryptoki/pkcs11wrapper.md +46 -46
- quarchpy/connection_specific/jdk_jres/win_amd64_jdk_jre/legal/jdk.dynalink/dynalink.md +32 -32
- quarchpy/connection_specific/jdk_jres/win_amd64_jdk_jre/legal/jdk.localedata/thaidict.md +31 -31
- quarchpy/connection_specific/jdk_jres/win_amd64_jdk_jre/lib/classlist +1 -0
- quarchpy/connection_specific/jdk_jres/win_amd64_jdk_jre/lib/fontconfig.properties.src +332 -332
- quarchpy/connection_specific/jdk_jres/win_amd64_jdk_jre/lib/javafx-swt.jar +0 -0
- quarchpy/connection_specific/jdk_jres/win_amd64_jdk_jre/lib/javafx.properties +3 -0
- quarchpy/connection_specific/jdk_jres/win_amd64_jdk_jre/lib/jawt.lib +0 -0
- quarchpy/connection_specific/jdk_jres/win_amd64_jdk_jre/lib/jfr/default.jfc +1152 -1152
- quarchpy/connection_specific/jdk_jres/win_amd64_jdk_jre/lib/jfr/profile.jfc +1151 -1151
- quarchpy/connection_specific/jdk_jres/win_amd64_jdk_jre/lib/jrt-fs.jar +0 -0
- quarchpy/connection_specific/jdk_jres/win_amd64_jdk_jre/lib/jvm.cfg +2 -2
- quarchpy/connection_specific/jdk_jres/win_amd64_jdk_jre/lib/jvm.lib +0 -0
- quarchpy/connection_specific/jdk_jres/win_amd64_jdk_jre/lib/modules +0 -0
- quarchpy/connection_specific/jdk_jres/win_amd64_jdk_jre/lib/psfont.properties.ja +119 -119
- quarchpy/connection_specific/jdk_jres/win_amd64_jdk_jre/lib/psfontj2d.properties +323 -323
- quarchpy/connection_specific/jdk_jres/win_amd64_jdk_jre/lib/security/cacerts +0 -0
- quarchpy/connection_specific/jdk_jres/win_amd64_jdk_jre/lib/tzdb.dat +0 -0
- quarchpy/connection_specific/jdk_jres/win_amd64_jdk_jre/release +2 -2
- quarchpy/connection_specific/mDNS.py +3 -6
- quarchpy/debug/SystemTest.py +22 -9
- quarchpy/device/__init__.py +7 -1
- quarchpy/device/device_fixture_idn_info.py +8 -0
- quarchpy/device/device_idn_info.py +100 -0
- quarchpy/device/device_network_info.py +18 -0
- quarchpy/device/discovered_device.py +150 -0
- quarchpy/device/packet_processing.py +87 -0
- quarchpy/device/quarchPPM.py +3 -6
- quarchpy/device/scanDevices.py +81 -40
- quarchpy/docs/CHANGES.rst +14 -0
- quarchpy/install_qps.py +347 -0
- quarchpy/qis/qisFuncs.py +8 -21
- quarchpy/qps/qpsFuncs.py +17 -10
- quarchpy/run.py +85 -51
- {quarchpy-2.2.12.dev1.dist-info → quarchpy-2.2.13.dev1.dist-info}/METADATA +17 -1
- {quarchpy-2.2.12.dev1.dist-info → quarchpy-2.2.13.dev1.dist-info}/RECORD +1128 -1018
- quarchpy/connection_specific/QPS/win-amd64/Power-Studio-QuickStart.pdf +0 -0
- quarchpy/connection_specific/QPS/win-amd64/qis/qis-NoGUI.bat +0 -3
- quarchpy/connection_specific/QPS/win-amd64/qis/qis.jar +0 -0
- quarchpy/connection_specific/QPS/win-amd64/qis/qis_lib/CInterface-2.5.jar +0 -0
- quarchpy/connection_specific/QPS/win-amd64/qis/qis_lib/QuarchCommon-2.1.jar +0 -0
- quarchpy/connection_specific/QPS/win-amd64/qis/qis_lib/TorridonCommon-1.2.2.jar +0 -0
- quarchpy/connection_specific/QPS/win-amd64/qis/qis_lib/netty-all-4.1.43.Final.jar +0 -0
- quarchpy/connection_specific/QPS/win-amd64/qis/qis_lib/slf4j-api-2.0.9.jar +0 -0
- quarchpy/connection_specific/QPS/win-amd64/qis/qis_lib/slf4j-simple-2.0.9.jar +0 -0
- quarchpy/connection_specific/QPS/win-amd64/qps.jar +0 -0
- quarchpy/connection_specific/QPS/win-amd64/qps_lib/JFXUtilities-1.0.jar +0 -0
- quarchpy/connection_specific/QPS/win-amd64/qps_lib/QuarchCommon-2.1.jar +0 -0
- quarchpy/connection_specific/QPS/win-amd64/qps_lib/lin-arm64/javafx-base-24.0.1-linux-aarch64.jar +0 -0
- quarchpy/connection_specific/QPS/win-amd64/qps_lib/lin-arm64/javafx-controls-24.0.1-linux-aarch64.jar +0 -0
- quarchpy/connection_specific/QPS/win-amd64/qps_lib/lin-arm64/javafx-fxml-24.0.1-linux-aarch64.jar +0 -0
- quarchpy/connection_specific/QPS/win-amd64/qps_lib/lin-arm64/javafx-graphics-24.0.1-linux-aarch64.jar +0 -0
- quarchpy/connection_specific/QPS/win-amd64/qps_lib/lin-arm64/javafx-swing-24.0.1-linux-aarch64.jar +0 -0
- quarchpy/connection_specific/QPS/win-amd64/qps_lib/lin-x64/javafx-base-24.0.1-linux.jar +0 -0
- quarchpy/connection_specific/QPS/win-amd64/qps_lib/lin-x64/javafx-controls-24.0.1-linux.jar +0 -0
- quarchpy/connection_specific/QPS/win-amd64/qps_lib/lin-x64/javafx-fxml-24.0.1-linux.jar +0 -0
- quarchpy/connection_specific/QPS/win-amd64/qps_lib/lin-x64/javafx-graphics-24.0.1-linux.jar +0 -0
- quarchpy/connection_specific/QPS/win-amd64/qps_lib/lin-x64/javafx-swing-24.0.1-linux.jar +0 -0
- quarchpy/connection_specific/QPS/win-amd64/qps_lib/mac-arm64/javafx-base-24.0.1-mac-aarch64.jar +0 -0
- quarchpy/connection_specific/QPS/win-amd64/qps_lib/mac-arm64/javafx-controls-24.0.1-mac-aarch64.jar +0 -0
- quarchpy/connection_specific/QPS/win-amd64/qps_lib/mac-arm64/javafx-fxml-24.0.1-mac-aarch64.jar +0 -0
- quarchpy/connection_specific/QPS/win-amd64/qps_lib/mac-arm64/javafx-graphics-24.0.1-mac-aarch64.jar +0 -0
- quarchpy/connection_specific/QPS/win-amd64/qps_lib/mac-arm64/javafx-swing-24.0.1-mac-aarch64.jar +0 -0
- quarchpy/connection_specific/QPS/win-amd64/qps_lib/mac-x64/javafx-base-24.0.1-mac.jar +0 -0
- quarchpy/connection_specific/QPS/win-amd64/qps_lib/mac-x64/javafx-controls-24.0.1-mac.jar +0 -0
- quarchpy/connection_specific/QPS/win-amd64/qps_lib/mac-x64/javafx-fxml-24.0.1-mac.jar +0 -0
- quarchpy/connection_specific/QPS/win-amd64/qps_lib/mac-x64/javafx-graphics-24.0.1-mac.jar +0 -0
- quarchpy/connection_specific/QPS/win-amd64/qps_lib/mac-x64/javafx-swing-24.0.1-mac.jar +0 -0
- quarchpy/connection_specific/QPS/win-amd64/qps_lib/netty-all-4.1.43.Final.jar +0 -0
- quarchpy/connection_specific/QPS/win-amd64/qps_lib/qutils-1.0.jar +0 -0
- quarchpy/connection_specific/QPS/win-amd64/qps_lib/win-x64/javafx-base-24.0.1-win.jar +0 -0
- quarchpy/connection_specific/QPS/win-amd64/qps_lib/win-x64/javafx-controls-24.0.1-win.jar +0 -0
- quarchpy/connection_specific/QPS/win-amd64/qps_lib/win-x64/javafx-fxml-24.0.1-win.jar +0 -0
- quarchpy/connection_specific/QPS/win-amd64/qps_lib/win-x64/javafx-graphics-24.0.1-win.jar +0 -0
- quarchpy/connection_specific/QPS/win-amd64/qps_lib/win-x64/javafx-swing-24.0.1-win.jar +0 -0
- quarchpy/connection_specific/QPS/win-amd64/whats-new.txt +0 -42
- /quarchpy/connection_specific/QPS/{win-amd64/3rdPartyLicenses → 3rdPartyLicenses}/Material-Icons-license.txt +0 -0
- /quarchpy/connection_specific/QPS/{win-amd64/3rdPartyLicenses → 3rdPartyLicenses}/argparse4j-LICENSE.txt +0 -0
- /quarchpy/connection_specific/QPS/{win-amd64/3rdPartyLicenses → 3rdPartyLicenses}/com.sun.istack-license.html +0 -0
- /quarchpy/connection_specific/QPS/{win-amd64/3rdPartyLicenses → 3rdPartyLicenses}/commons-io-LICENSE-2.0.txt +0 -0
- /quarchpy/connection_specific/QPS/{win-amd64/3rdPartyLicenses → 3rdPartyLicenses}/controlsfx-license.txt +0 -0
- /quarchpy/connection_specific/QPS/{win-amd64/3rdPartyLicenses → 3rdPartyLicenses}/jakarta.activation-license.html +0 -0
- /quarchpy/connection_specific/QPS/{win-amd64/3rdPartyLicenses → 3rdPartyLicenses}/jakarta.xml.bind-api-license.html +0 -0
- /quarchpy/connection_specific/QPS/{win-amd64/3rdPartyLicenses → 3rdPartyLicenses}/netty-LICENSE.txt +0 -0
- /quarchpy/connection_specific/QPS/{win-amd64/3rdPartyLicenses → 3rdPartyLicenses}/netty-NOTICE.txt +0 -0
- /quarchpy/connection_specific/QPS/{win-amd64/qis/3rdPartyLicenses → 3rdPartyLicenses}/slf4j-LICENSE.txt +0 -0
- /quarchpy/connection_specific/QPS/{win-amd64/DeviceConfig/QTL1995-02.XML → DeviceConfig/QTL1995-02.xml} +0 -0
- /quarchpy/connection_specific/QPS/{win-amd64/DeviceConfig/QTL1999-02.XML → DeviceConfig/QTL1999-02.xml} +0 -0
- /quarchpy/connection_specific/QPS/{win-amd64/DeviceConfig/QTL2312-01.XML → DeviceConfig/QTL2312-01.xml} +0 -0
- /quarchpy/connection_specific/QPS/{win-amd64/DeviceConfig → DeviceConfig}/breaker/Cable Modules/QTL1253-01 - Mini SAS Module Config v3.5 c1.3.xml +0 -0
- /quarchpy/connection_specific/QPS/{win-amd64/DeviceConfig → DeviceConfig}/breaker/Cable Modules/QTL1253-01 - Mini SAS Module Config v4.000 c1.3.xml +0 -0
- /quarchpy/connection_specific/QPS/{win-amd64/DeviceConfig → DeviceConfig}/breaker/Cable Modules/QTL1253-02 - Mini SAS Module Config v3.5 c1.3.xml +0 -0
- /quarchpy/connection_specific/QPS/{win-amd64/DeviceConfig → DeviceConfig}/breaker/Cable Modules/QTL1253-02 - Mini SAS Module Config v4.000 c1.3.xml +0 -0
- /quarchpy/connection_specific/QPS/{win-amd64/DeviceConfig → DeviceConfig}/breaker/Cable Modules/QTL1253-xx - Mini SAS Module Config v4.003 c1.6.xml +0 -0
- /quarchpy/connection_specific/QPS/{win-amd64/DeviceConfig → DeviceConfig}/breaker/Cable Modules/QTL1271-xx - Ethernet Module Config v3.5 c1.2.xml +0 -0
- /quarchpy/connection_specific/QPS/{win-amd64/DeviceConfig → DeviceConfig}/breaker/Cable Modules/QTL1271-xx - Ethernet Module Config v4.000 c1.2.xml +0 -0
- /quarchpy/connection_specific/QPS/{win-amd64/DeviceConfig → DeviceConfig}/breaker/Cable Modules/QTL1271-xx - Ethernet Module Config v4.100 c1.3.xml +0 -0
- /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
- /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
- /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
- /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
- /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
- /quarchpy/connection_specific/QPS/{win-amd64/DeviceConfig → DeviceConfig}/breaker/Cable Modules/QTL1383-xx - eSATAp Module Config v4.000 c1.3.xml +0 -0
- /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
- /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
- /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
- /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
- /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
- /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
- /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
- /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
- /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
- /quarchpy/connection_specific/QPS/{win-amd64/DeviceConfig → DeviceConfig}/breaker/Cable Modules/QTL1971-01 - USB TypeC Module Config v4.000 c1.1.xml +0 -0
- /quarchpy/connection_specific/QPS/{win-amd64/DeviceConfig → DeviceConfig}/breaker/Cable Modules/QTL1971-02 - USB TypeC Module Config v4.000 c1.1.xml +0 -0
- /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
- /quarchpy/connection_specific/QPS/{win-amd64/DeviceConfig → DeviceConfig}/breaker/Cable Modules/QTL2058-xx - External PCIe Module Config v4.001 c1.1.xml +0 -0
- /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
- /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
- /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
- /quarchpy/connection_specific/QPS/{win-amd64/DeviceConfig → DeviceConfig}/breaker/Cable Modules/QTL2171-01 - QSFP28 Cable Module Config v4.000 c1.xml +0 -0
- /quarchpy/connection_specific/QPS/{win-amd64/DeviceConfig → DeviceConfig}/breaker/Cable Modules/QTL2171-02 - QSFP28 Cable Module Config v4.000 c1.xml +0 -0
- /quarchpy/connection_specific/QPS/{win-amd64/DeviceConfig → DeviceConfig}/breaker/Cable Modules/QTL2341-01 - Gen4 External PCIe Cable Module v4.000.xml +0 -0
- /quarchpy/connection_specific/QPS/{win-amd64/DeviceConfig → DeviceConfig}/breaker/Cable Modules/QTL2602-xx - Multiprotocol Link Breaker.xml +0 -0
- /quarchpy/connection_specific/QPS/{win-amd64/DeviceConfig → DeviceConfig}/breaker/Cable Modules/QTL2834-xx - -48V DC Breaker Module v5.000 c1.0.xml +0 -0
- /quarchpy/connection_specific/QPS/{win-amd64/DeviceConfig → DeviceConfig}/breaker/Cable Modules/QTL3000-xx - RJ-45 Cable Module v5.000 c1.4.xml +0 -0
- /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
- /quarchpy/connection_specific/QPS/{win-amd64/DeviceConfig → DeviceConfig}/breaker/Card Modules/QTL1630-01 - PCIe Card Module v4.000 c1.0.xml +0 -0
- /quarchpy/connection_specific/QPS/{win-amd64/DeviceConfig → DeviceConfig}/breaker/Card Modules/QTL1630-02 - PCIe Card Module Config v4.004 c1.2.xml +0 -0
- /quarchpy/connection_specific/QPS/{win-amd64/DeviceConfig → DeviceConfig}/breaker/Card Modules/QTL1630-02 - PCIe Card Module Config v4.005 c1.2.xml +0 -0
- /quarchpy/connection_specific/QPS/{win-amd64/DeviceConfig → DeviceConfig}/breaker/Card Modules/QTL1630-02 - PCIe Card Module Config v4.100 c1.4.xml +0 -0
- /quarchpy/connection_specific/QPS/{win-amd64/DeviceConfig → DeviceConfig}/breaker/Card Modules/QTL1630-04 - PCIe Card Module Config v4.001 c1.1.xml +0 -0
- /quarchpy/connection_specific/QPS/{win-amd64/DeviceConfig → DeviceConfig}/breaker/Card Modules/QTL1630-04 - PCIe Card Module Config v4.004 c1.2.xml +0 -0
- /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
- /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
- /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
- /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
- /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
- /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
- /quarchpy/connection_specific/QPS/{win-amd64/DeviceConfig → DeviceConfig}/breaker/Card Modules/QTL1848-01 - PCIe Lite Card Module Config v4.000.xml +0 -0
- /quarchpy/connection_specific/QPS/{win-amd64/DeviceConfig → DeviceConfig}/breaker/Card Modules/QTL1848-02 - PCIe Lite Card Module Config v4.000.xml +0 -0
- /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
- /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
- /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
- /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
- /quarchpy/connection_specific/QPS/{win-amd64/DeviceConfig → DeviceConfig}/breaker/Card Modules/QTL2067-xx - PCIe SFF Module Config v4.000 c1.1.xml +0 -0
- /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
- /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
- /quarchpy/connection_specific/QPS/{win-amd64/DeviceConfig → DeviceConfig}/breaker/Card Modules/QTL2073-01 - GEN3 PCIe Lite Card Module Config v4.001.xml +0 -0
- /quarchpy/connection_specific/QPS/{win-amd64/DeviceConfig → DeviceConfig}/breaker/Card Modules/QTL2073-01 - PCIe Lite Card Module Config v4.000.xml +0 -0
- /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
- /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
- /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
- /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
- /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
- /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
- /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
- /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
- /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
- /quarchpy/connection_specific/QPS/{win-amd64/DeviceConfig → DeviceConfig}/breaker/Card Modules/QTL2161-01 - EDSFF x8 Module Config v4.000 c1.1.xml +0 -0
- /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
- /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
- /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
- /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
- /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
- /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
- /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
- /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
- /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
- /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
- /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
- /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
- /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
- /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
- /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
- /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
- /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
- /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
- /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
- /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
- /quarchpy/connection_specific/QPS/{win-amd64/DeviceConfig → DeviceConfig}/breaker/Card Modules/QTL2403-xx - Gen4 PCIe Lite Module Config v4.000.xml +0 -0
- /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
- /quarchpy/connection_specific/QPS/{win-amd64/DeviceConfig → DeviceConfig}/breaker/Card Modules/QTL2652-xx - Gen5 PCIe Lite Module Config v4.000.xml +0 -0
- /quarchpy/connection_specific/QPS/{win-amd64/DeviceConfig → DeviceConfig}/breaker/Card Modules/QTL2652-xx - Gen5 PCIe Lite Module Config v4.003.xml +0 -0
- /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
- /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
- /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
- /quarchpy/connection_specific/QPS/{win-amd64/DeviceConfig → DeviceConfig}/breaker/Card Modules/QTL2686-xx - Gen5 EDSFF E3 x4 Breaker Config v5.000.xml +0 -0
- /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
- /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
- /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
- /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
- /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
- /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
- /quarchpy/connection_specific/QPS/{win-amd64/DeviceConfig → DeviceConfig}/breaker/Card Modules/QTL2766-xx - GEN4 EDSFF E1 x8 Breaker Config v5.000.xml +0 -0
- /quarchpy/connection_specific/QPS/{win-amd64/DeviceConfig → DeviceConfig}/breaker/Card Modules/QTL2767-xx - GEN4 EDSFF E3 x8 Breaker Config v5.000.xml +0 -0
- /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
- /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
- /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
- /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
- /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
- /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
- /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
- /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
- /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
- /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
- /quarchpy/connection_specific/QPS/{win-amd64/DeviceConfig → DeviceConfig}/breaker/Card Modules/QTL2892-xx - GEN5 EDSFF E1 x4 Breaker.xml +0 -0
- /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
- /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
- /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
- /quarchpy/connection_specific/QPS/{win-amd64/DeviceConfig → DeviceConfig}/breaker/Card Modules/QTL2925-xx - GEN5 EDSFF E1 x4 Breaker +Triggering.xml +0 -0
- /quarchpy/connection_specific/QPS/{win-amd64/DeviceConfig → DeviceConfig}/breaker/Card Modules/QTL2954-01 - fake delete.xml +0 -0
- /quarchpy/connection_specific/QPS/{win-amd64/DeviceConfig → DeviceConfig}/breaker/Drive Modules/QTL1177-xx - HS Module Config v3.5 c1.5.xml +0 -0
- /quarchpy/connection_specific/QPS/{win-amd64/DeviceConfig → DeviceConfig}/breaker/Drive Modules/QTL1177-xx - HS Module Config v4.000 c1.5.xml +0 -0
- /quarchpy/connection_specific/QPS/{win-amd64/DeviceConfig → DeviceConfig}/breaker/Drive Modules/QTL1177-xx - HS Module Config v4.006 c1.8.xml +0 -0
- /quarchpy/connection_specific/QPS/{win-amd64/DeviceConfig → DeviceConfig}/breaker/Drive Modules/QTL1215-xx - Lite Module Config v3.50.xml +0 -0
- /quarchpy/connection_specific/QPS/{win-amd64/DeviceConfig → DeviceConfig}/breaker/Drive Modules/QTL1215-xx - Lite Module Config v4.000.xml +0 -0
- /quarchpy/connection_specific/QPS/{win-amd64/DeviceConfig → DeviceConfig}/breaker/Drive Modules/QTL1301-xx - HS Lite Module Config v3.50.xml +0 -0
- /quarchpy/connection_specific/QPS/{win-amd64/DeviceConfig → DeviceConfig}/breaker/Drive Modules/QTL1301-xx - HS Lite Module Config v4.000.xml +0 -0
- /quarchpy/connection_specific/QPS/{win-amd64/DeviceConfig → DeviceConfig}/breaker/Drive Modules/QTL1429-01 - EMC HS Lite Module Config v4.000.xml +0 -0
- /quarchpy/connection_specific/QPS/{win-amd64/DeviceConfig → DeviceConfig}/breaker/Drive Modules/QTL1429-02 - EMC HS Lite Module Config v4.002.xml +0 -0
- /quarchpy/connection_specific/QPS/{win-amd64/DeviceConfig → DeviceConfig}/breaker/Drive Modules/QTL1623-03 - 12G HS Lite Module Config v4.001.xml +0 -0
- /quarchpy/connection_specific/QPS/{win-amd64/DeviceConfig → DeviceConfig}/breaker/Drive Modules/QTL1623-04 - 12G HS Lite Module Config v4.001.xml +0 -0
- /quarchpy/connection_specific/QPS/{win-amd64/DeviceConfig → DeviceConfig}/breaker/Drive Modules/QTL1680-xx - SCA2 Lite Module Config v4.001.xml +0 -0
- /quarchpy/connection_specific/QPS/{win-amd64/DeviceConfig → DeviceConfig}/breaker/Drive Modules/QTL1689-01 - 12G HS Module Config v4.001 c1.1.xml +0 -0
- /quarchpy/connection_specific/QPS/{win-amd64/DeviceConfig → DeviceConfig}/breaker/Drive Modules/QTL1689-04 - 12G HS Module Config v4.002 c1.1.xml +0 -0
- /quarchpy/connection_specific/QPS/{win-amd64/DeviceConfig → DeviceConfig}/breaker/Drive Modules/QTL1689-05 - 12G HS Module Config v4.002 c1.1.xml +0 -0
- /quarchpy/connection_specific/QPS/{win-amd64/DeviceConfig → DeviceConfig}/breaker/Drive Modules/QTL1743-02 - PCIe SFF Module Config v4.003 c1.3.xml +0 -0
- /quarchpy/connection_specific/QPS/{win-amd64/DeviceConfig → DeviceConfig}/breaker/Drive Modules/QTL1743-02 - PCIe SFF Module Config v4.006 c1.4.xml +0 -0
- /quarchpy/connection_specific/QPS/{win-amd64/DeviceConfig → DeviceConfig}/breaker/Drive Modules/QTL1743-xx - PCIe SFF Module Config v4.000 c1.1.xml +0 -0
- /quarchpy/connection_specific/QPS/{win-amd64/DeviceConfig → DeviceConfig}/breaker/Drive Modules/QTL1753-xx - 12G Lite Module Config v4.000.xml +0 -0
- /quarchpy/connection_specific/QPS/{win-amd64/DeviceConfig → DeviceConfig}/breaker/Drive Modules/QTL1921-01 - EMC 12G HS Lite Module Config v4.000.xml +0 -0
- /quarchpy/connection_specific/QPS/{win-amd64/DeviceConfig → DeviceConfig}/breaker/Drive Modules/QTL2207-01 - GEN 4 PCIe U.2 Drive Module.xml +0 -0
- /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
- /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
- /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
- /quarchpy/connection_specific/QPS/{win-amd64/DeviceConfig → DeviceConfig}/breaker/Drive Modules/QTL2207-xx - GEN 4 PCIe U.2 Drive Module.xml +0 -0
- /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
- /quarchpy/connection_specific/QPS/{win-amd64/DeviceConfig → DeviceConfig}/breaker/Drive Modules/QTL2245-xx - GEN 4 PCIe U.3 HS Drive Module.xml +0 -0
- /quarchpy/connection_specific/QPS/{win-amd64/DeviceConfig → DeviceConfig}/breaker/Drive Modules/QTL2266-01 - GEN 4 PCIe SFF HS Drive Module Triggering.xml +0 -0
- /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
- /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
- /quarchpy/connection_specific/QPS/{win-amd64/DeviceConfig → DeviceConfig}/breaker/Drive Modules/QTL2266-XX - GEN 4 PCIe SFF HS Drive Module Triggering.xml +0 -0
- /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
- /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
- /quarchpy/connection_specific/QPS/{win-amd64/DeviceConfig → DeviceConfig}/breaker/Drive Modules/QTL2542-02 - 24G SAS Drive Breaker Module v5.001.xml +0 -0
- /quarchpy/connection_specific/QPS/{win-amd64/DeviceConfig → DeviceConfig}/breaker/Drive Modules/QTL2542-xx - 24G SAS Drive Breaker v5.000 c1.1.xml +0 -0
- /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
- /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
- /quarchpy/connection_specific/QPS/{win-amd64/DeviceConfig → DeviceConfig}/breaker/Drive Modules/QTL2602-xx - Multiprotocol Link Breaker.xml +0 -0
- /quarchpy/connection_specific/QPS/{win-amd64/DeviceConfig → DeviceConfig}/breaker/Drive Modules/QTL2645-xx - Gen5 PCIe U.2 Drive Module v5.000.xml +0 -0
- /quarchpy/connection_specific/QPS/{win-amd64/DeviceConfig → DeviceConfig}/breaker/Drive Modules/QTL2645-xx - Gen5 PCIe U.2 Drive Module v5.001.xml +0 -0
- /quarchpy/connection_specific/QPS/{win-amd64/DeviceConfig → DeviceConfig}/breaker/Drive Modules/QTL2645-xx - Gen5 PCIe U.2 Drive Module v5.003.xml +0 -0
- /quarchpy/connection_specific/QPS/{win-amd64/DeviceConfig → DeviceConfig}/breaker/Drive Modules/QTL2645-xx - Gen5 PCIe U.2 Drive Module v5.007.xml +0 -0
- /quarchpy/connection_specific/QPS/{win-amd64/DeviceConfig → DeviceConfig}/breaker/Drive Modules/QTL2645-xx - Gen5 PCIe U.2 Drive Module v5.008.xml +0 -0
- /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
- /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
- /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
- /quarchpy/connection_specific/QPS/{win-amd64/DeviceConfig → DeviceConfig}/breaker/Drive Modules/QTL2651-xx - Gen5 PCIe U.2 Drive Module v5.007.xml +0 -0
- /quarchpy/connection_specific/QPS/{win-amd64/DeviceConfig → DeviceConfig}/breaker/Drive Modules/QTL2661-xx - Gen5 U.3 Drive Module + Triggering v5.000.xml +0 -0
- /quarchpy/connection_specific/QPS/{win-amd64/DeviceConfig → DeviceConfig}/breaker/Drive Modules/QTL2662-xx - Gen5 PCIe U.3 Drive Module v5.000.xml +0 -0
- /quarchpy/connection_specific/QPS/{win-amd64/DeviceConfig → DeviceConfig}/breaker/Drive Modules/QTL2757-xx - Gen5 SFF Lite Breaker Module Config v4.000.xml +0 -0
- /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
- /quarchpy/connection_specific/QPS/{win-amd64/DeviceConfig → DeviceConfig}/breaker/Drive Modules/QTL2804-xx - Gen5 MCIO to U.2 Breaker v5.001.xml +0 -0
- /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
- /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
- /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
- /quarchpy/connection_specific/QPS/{win-amd64/DeviceConfig → DeviceConfig}/breaker/Drive Modules/QTL2892-xx - Gen5 EDSFF E1 x4 Breaker v5.001.xml +0 -0
- /quarchpy/connection_specific/QPS/{win-amd64/DeviceConfig → DeviceConfig}/breaker/Drive Modules/QTL2892-xx - Gen5 EDSFF E1 x4 Breaker v5.002.xml +0 -0
- /quarchpy/connection_specific/QPS/{win-amd64/DeviceConfig → DeviceConfig}/breaker/Drive Modules/QTL2940-xx - Gen5 EDSFF E3 x8 Breaker v5.000.xml +0 -0
- /quarchpy/connection_specific/QPS/{win-amd64/DeviceConfig → DeviceConfig}/breaker/Drive Modules/QTL2941-xx - Gen5 EDSFF E3 x8 Breaker +Triggering v5.000.xml +0 -0
- /quarchpy/connection_specific/QPS/{win-amd64/DeviceConfig → DeviceConfig}/breaker/Drive Modules/Standard Drive Module Config v3.5 c1.1.xml +0 -0
- /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
- /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
- /quarchpy/connection_specific/QPS/{win-amd64/DeviceConfig → DeviceConfig}/colors/default-colors.properties +0 -0
- /quarchpy/connection_specific/QPS/{win-amd64/DeviceConfig → DeviceConfig}/colors/qtl2789-colors.properties +0 -0
- /quarchpy/connection_specific/QPS/{win-amd64/DeviceConfig → DeviceConfig}/default.xml +0 -0
- /quarchpy/connection_specific/QPS/{win-amd64/InstallType.dat → InstallType.dat} +0 -0
- /quarchpy/connection_specific/QPS/{win-amd64/license.txt → license.txt} +0 -0
- /quarchpy/connection_specific/QPS/{win-amd64/qis → qis}/README.txt +0 -0
- /quarchpy/connection_specific/QPS/{win-amd64/qis → qis}/disableterminal.txt +0 -0
- /quarchpy/connection_specific/QPS/{win-amd64/qis → qis}/license.txt +0 -0
- /quarchpy/connection_specific/QPS/{win-amd64/qis → qis}/qis_lib/Collections-2.4.jar +0 -0
- /quarchpy/connection_specific/QPS/{win-amd64/qis → qis}/qis_lib/Desktop-1.1.jar +0 -0
- /quarchpy/connection_specific/QPS/{win-amd64/qis → qis}/qis_lib/Executor-3.13.jar +0 -0
- /quarchpy/connection_specific/QPS/{win-amd64/qis → qis}/qis_lib/JNA-1.2.jar +0 -0
- /quarchpy/connection_specific/QPS/{win-amd64/qis → qis}/qis_lib/OS-1.8.jar +0 -0
- /quarchpy/connection_specific/QPS/{win-amd64/qis → qis}/qis_lib/SystemTray-4.4.jar +0 -0
- /quarchpy/connection_specific/QPS/{win-amd64/qis → qis}/qis_lib/Updates-1.1.jar +0 -0
- /quarchpy/connection_specific/QPS/{win-amd64/qis → qis}/qis_lib/Utilities-1.46.jar +0 -0
- /quarchpy/connection_specific/QPS/{win-amd64/qps_lib → qis/qis_lib}/gson-2.13.1.jar +0 -0
- /quarchpy/connection_specific/QPS/{win-amd64/qis → qis}/qis_lib/istack-commons-runtime-3.0.11.jar +0 -0
- /quarchpy/connection_specific/QPS/{win-amd64/qis → qis}/qis_lib/jakarta.activation-api-2.1.0.jar +0 -0
- /quarchpy/connection_specific/QPS/{win-amd64/qis → qis}/qis_lib/jakarta.xml.bind-api-4.0.0.jar +0 -0
- /quarchpy/connection_specific/QPS/{win-amd64/qis → qis}/qis_lib/javassist-3.29.2-GA.jar +0 -0
- /quarchpy/connection_specific/QPS/{win-amd64/qis → qis}/qis_lib/jaxb-core-4.0.0.jar +0 -0
- /quarchpy/connection_specific/QPS/{win-amd64/qis → qis}/qis_lib/jaxb-runtime-4.0.0.jar +0 -0
- /quarchpy/connection_specific/QPS/{win-amd64/qis → qis}/qis_lib/jmdns-3.6.0.jar +0 -0
- /quarchpy/connection_specific/QPS/{win-amd64/qis → qis}/qis_lib/jna-jpms-5.12.1.jar +0 -0
- /quarchpy/connection_specific/QPS/{win-amd64/qis → qis}/qis_lib/jna-platform-jpms-5.12.1.jar +0 -0
- /quarchpy/connection_specific/QPS/{win-amd64/qis → qis}/qis_lib/kotlin-stdlib-1.9.21.jar +0 -0
- /quarchpy/connection_specific/QPS/{win-amd64/qis → qis}/resources/QuarchIcon_128x128.png +0 -0
- /quarchpy/connection_specific/QPS/{win-amd64/qis → qis}/resources/QuarchIcon_16x16.png +0 -0
- /quarchpy/connection_specific/QPS/{win-amd64/qis → qis}/resources/QuarchIcon_256x256.png +0 -0
- /quarchpy/connection_specific/QPS/{win-amd64/qis → qis}/resources/QuarchIcon_32x32.png +0 -0
- /quarchpy/connection_specific/QPS/{win-amd64/qis → qis}/resources/QuarchIcon_64x64.png +0 -0
- /quarchpy/connection_specific/QPS/{win-amd64/qis → qis}/resources/filters/Example.txt +0 -0
- /quarchpy/connection_specific/QPS/{win-amd64/qis → qis}/resources/filters/iec_filters.xml +0 -0
- /quarchpy/connection_specific/QPS/{win-amd64/qis → qis}/resources/org/usb4java/darwin-x86-64/libusb4java.dylib +0 -0
- /quarchpy/connection_specific/QPS/{win-amd64/qis → qis}/resources/org/usb4java/linux-aarch64/libusb4java.so +0 -0
- /quarchpy/connection_specific/QPS/{win-amd64/qis → qis}/resources/org/usb4java/linux-arm/libusb4java.so +0 -0
- /quarchpy/connection_specific/QPS/{win-amd64/qis → qis}/resources/org/usb4java/linux-x86/libusb4java.so +0 -0
- /quarchpy/connection_specific/QPS/{win-amd64/qis → qis}/resources/org/usb4java/linux-x86-64/libusb4java.so +0 -0
- /quarchpy/connection_specific/QPS/{win-amd64/qis → qis}/resources/org/usb4java/win32-x86/libusb4java.dll +0 -0
- /quarchpy/connection_specific/QPS/{win-amd64/qis → qis}/resources/org/usb4java/win32-x86-64/libusb4java.dll +0 -0
- /quarchpy/connection_specific/QPS/{win-amd64/qis.properties.xml → qis.properties.xml} +0 -0
- /quarchpy/connection_specific/QPS/{win-amd64/qps_lib → qps_lib}/argparse4j-0.9.0.jar +0 -0
- /quarchpy/connection_specific/QPS/{win-amd64/qps_lib → qps_lib}/commons-io-2.19.0.jar +0 -0
- /quarchpy/connection_specific/QPS/{win-amd64/qps_lib → qps_lib}/controlsfx-11.2.2.jar +0 -0
- /quarchpy/connection_specific/QPS/{win-amd64/qps_lib → qps_lib}/guava-33.4.8-jre.jar +0 -0
- /quarchpy/connection_specific/QPS/{win-amd64/qps_lib → qps_lib}/istack-commons-runtime-3.0.11.jar +0 -0
- /quarchpy/connection_specific/QPS/{win-amd64/qps_lib → qps_lib}/jakarta.activation-api-2.1.0.jar +0 -0
- /quarchpy/connection_specific/QPS/{win-amd64/qps_lib → qps_lib}/jakarta.xml.bind-api-4.0.0.jar +0 -0
- /quarchpy/connection_specific/QPS/{win-amd64/qps_lib → qps_lib}/jaxb-core-4.0.0.jar +0 -0
- /quarchpy/connection_specific/QPS/{win-amd64/qps_lib → qps_lib}/jaxb-runtime-4.0.0.jar +0 -0
- /quarchpy/connection_specific/QPS/{win-amd64/qps_lib → qps_lib}/txw2-4.0.0.jar +0 -0
- /quarchpy/connection_specific/QPS/{win-amd64/resources → resources}/InstallBanner.bmp +0 -0
- /quarchpy/connection_specific/QPS/{win-amd64/resources → resources}/QPS.icns +0 -0
- /quarchpy/connection_specific/QPS/{win-amd64/resources → resources}/QPS.ico +0 -0
- /quarchpy/connection_specific/QPS/{win-amd64/resources → resources}/QPS.png +0 -0
- /quarchpy/connection_specific/QPS/{win-amd64/resources → resources}/QuarchIcon_128x128.png +0 -0
- /quarchpy/connection_specific/QPS/{win-amd64/resources → resources}/QuarchIcon_16x16.png +0 -0
- /quarchpy/connection_specific/QPS/{win-amd64/resources → resources}/QuarchIcon_256x256.png +0 -0
- /quarchpy/connection_specific/QPS/{win-amd64/resources → resources}/QuarchIcon_32x32.png +0 -0
- /quarchpy/connection_specific/QPS/{win-amd64/resources → resources}/QuarchIcon_64x64.png +0 -0
- /quarchpy/connection_specific/QPS/{win-amd64/resources → resources}/profiles/3_PHASE_PAM_AC_DEFAULT.rcf +0 -0
- /quarchpy/connection_specific/QPS/{win-amd64/resources → resources}/profiles/3_PHASE_PAM_AC_DEFAULT.scf +0 -0
- /quarchpy/connection_specific/QPS/{win-amd64/resources → resources}/profiles/3_PHASE_PAM_AC_FULL.rcf +0 -0
- /quarchpy/connection_specific/QPS/{win-amd64/resources → resources}/profiles/3_PHASE_PAM_AC_FULL.scf +0 -0
- /quarchpy/connection_specific/QPS/{win-amd64/resources → resources}/profiles/PAM_EXAMPLE_CONFIG.rcf +0 -0
- {quarchpy-2.2.12.dev1.dist-info → quarchpy-2.2.13.dev1.dist-info}/WHEEL +0 -0
- {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
|
|
5
|
-
import
|
|
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(
|
|
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
|
-
|
|
47
|
+
welcome_string = self.streamSock.recv(self.maxRxBytes).rstrip()
|
|
48
48
|
|
|
49
49
|
|
|
50
|
-
def connect(self,
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
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.
|
|
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
|
-
|
|
70
|
-
|
|
71
|
-
self.deviceDict['QIS'][0:3] = [False, 'Connected',
|
|
72
|
-
return
|
|
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.
|
|
80
|
-
if
|
|
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
|
-
|
|
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
|
|
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
|
|
145
|
+
if con_string is None:
|
|
105
146
|
cmd = "close"
|
|
106
147
|
else:
|
|
107
|
-
cmd =
|
|
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.
|
|
113
|
-
return
|
|
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
|
|
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.
|
|
118
|
-
i = self.
|
|
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.
|
|
125
|
-
args=(module,
|
|
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
|
-
|
|
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
|
|
136
|
-
|
|
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
|
-
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
|
|
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
|
-
|
|
150
|
-
|
|
151
|
-
# count += 1 --debugging to show delay
|
|
152
|
-
pass
|
|
153
|
-
# just wait until event is cleared
|
|
209
|
+
Returns:
|
|
210
|
+
None
|
|
154
211
|
|
|
155
|
-
|
|
156
|
-
|
|
157
|
-
|
|
212
|
+
"""
|
|
213
|
+
|
|
214
|
+
module_name=module.ConString
|
|
215
|
+
i = self.device_control_index(module_name)
|
|
158
216
|
self.stopFlagList[i] = False
|
|
159
|
-
|
|
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
|
|
162
|
-
# should
|
|
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
|
-
|
|
225
|
+
thread_name_list = []
|
|
167
226
|
for t1 in threading.enumerate():
|
|
168
|
-
|
|
169
|
-
|
|
170
|
-
|
|
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
|
|
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
|
|
180
|
-
|
|
181
|
-
|
|
182
|
-
|
|
183
|
-
|
|
184
|
-
|
|
185
|
-
|
|
186
|
-
|
|
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
|
-
#
|
|
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
|
|
197
|
-
if not isinstance(
|
|
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 =
|
|
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
|
|
204
|
-
raise ValueError("
|
|
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(
|
|
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(
|
|
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
|
-
#
|
|
219
|
-
|
|
220
|
-
|
|
221
|
-
|
|
222
|
-
|
|
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 " +
|
|
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 {
|
|
327
|
+
logging.error(f"Error closing file {file_name} on stream start failure: {e_close}")
|
|
235
328
|
return
|
|
236
329
|
|
|
237
|
-
|
|
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
|
-
|
|
240
|
-
while 'Header Not Available' in
|
|
241
|
-
|
|
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 >
|
|
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 {
|
|
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
|
-
|
|
254
|
-
|
|
255
|
-
|
|
256
|
-
|
|
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
|
-
|
|
260
|
-
|
|
261
|
-
|
|
352
|
+
# Initialize stream variables
|
|
353
|
+
max_file_exceeded = False
|
|
354
|
+
open_attempts = 0
|
|
262
355
|
leftover = 0
|
|
263
|
-
|
|
264
|
-
|
|
265
|
-
|
|
266
|
-
|
|
267
|
-
|
|
268
|
-
|
|
269
|
-
|
|
270
|
-
|
|
271
|
-
|
|
272
|
-
|
|
273
|
-
elif 'ms' in
|
|
274
|
-
|
|
275
|
-
|
|
276
|
-
|
|
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 {
|
|
286
|
-
raise ValueError(f"couldn't decode samplePeriod: {
|
|
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
|
-
|
|
379
|
+
base_sample_period_period_s = int(re.search(r'^\d*\.?\d*', base_sample_period).group()) * (10 ** base_sample_unit_exponent)
|
|
289
380
|
|
|
290
|
-
#
|
|
291
|
-
|
|
292
|
-
|
|
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
|
-
|
|
299
|
-
|
|
300
|
-
|
|
301
|
-
|
|
302
|
-
|
|
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
|
-
|
|
306
|
-
|
|
307
|
-
|
|
308
|
-
|
|
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
|
-
|
|
329
|
-
|
|
330
|
-
|
|
331
|
-
|
|
332
|
-
|
|
333
|
-
|
|
334
|
-
|
|
335
|
-
|
|
336
|
-
|
|
337
|
-
|
|
338
|
-
|
|
339
|
-
|
|
340
|
-
|
|
341
|
-
|
|
342
|
-
|
|
343
|
-
|
|
344
|
-
|
|
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
|
-
|
|
347
|
-
|
|
348
|
-
|
|
349
|
-
|
|
350
|
-
|
|
351
|
-
|
|
352
|
-
|
|
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
|
-
|
|
355
|
-
|
|
356
|
-
|
|
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
|
-
|
|
366
|
-
|
|
367
|
-
|
|
368
|
-
|
|
369
|
-
|
|
370
|
-
|
|
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
|
|
380
|
-
# End of
|
|
469
|
+
break # Exit stream processing loop
|
|
470
|
+
# End of stream data processing loop
|
|
381
471
|
|
|
382
|
-
|
|
383
|
-
|
|
384
|
-
|
|
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
|
-
|
|
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
|
|
480
|
+
if stream_overrun:
|
|
440
481
|
self.deviceDict[module][0:3] = [True, 'Stopped', 'Device buffer overrun - QIS buffer empty']
|
|
441
|
-
elif not
|
|
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
|
-
|
|
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
|
-
#
|
|
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 {
|
|
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
|
-
|
|
462
|
-
if
|
|
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 {
|
|
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
|
-
|
|
514
|
-
|
|
515
|
-
|
|
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
|
-
|
|
519
|
+
Args:
|
|
520
|
+
sock:
|
|
521
|
+
Optional connection socket
|
|
537
522
|
|
|
538
|
-
|
|
523
|
+
Returns:
|
|
524
|
+
A filtered iterable list of devices
|
|
539
525
|
|
|
540
|
-
|
|
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
|
-
|
|
578
|
-
|
|
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
|
-
|
|
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
|
-
|
|
607
|
-
|
|
608
|
-
|
|
609
|
-
|
|
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
|
-
|
|
615
|
-
|
|
616
|
-
|
|
617
|
-
|
|
618
|
-
|
|
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
|
-
|
|
679
|
-
|
|
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
|
-
|
|
692
|
-
|
|
693
|
-
|
|
694
|
-
|
|
695
|
-
|
|
696
|
-
return
|
|
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
|
|
561
|
+
def scan_ip(self, qis_connection, ip_address) -> bool:
|
|
699
562
|
"""
|
|
700
|
-
Triggers QIS to look at a specific IP address for a
|
|
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
|
|
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 " +
|
|
713
|
-
if not
|
|
714
|
-
|
|
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 =
|
|
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
|
|
583
|
+
return True
|
|
723
584
|
else:
|
|
724
|
-
|
|
725
|
-
|
|
726
|
-
|
|
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
|
-
|
|
732
|
-
|
|
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
|
-
|
|
735
|
-
|
|
736
|
-
|
|
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
|
-
|
|
739
|
-
'''
|
|
740
|
-
tableHeaders =["Modules"]
|
|
623
|
+
table_headers = ["Modules"]
|
|
741
624
|
ip_address = None
|
|
742
|
-
favourite =
|
|
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
|
-
|
|
630
|
+
found_devices = self.qis_scan_devices(scan=scan, preferred_connection_only=favourite)
|
|
747
631
|
elif scan and ip_address is not None:
|
|
748
|
-
|
|
632
|
+
found_devices = self.qis_scan_devices(scan=scan, preferred_connection_only=favourite, ip_address=ip_address)
|
|
749
633
|
|
|
750
|
-
|
|
751
|
-
|
|
752
|
-
|
|
753
|
-
|
|
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
|
|
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
|
|
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
|
|
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
|
-
|
|
770
|
-
|
|
771
|
-
|
|
772
|
-
|
|
773
|
-
|
|
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
|
-
|
|
777
|
-
|
|
677
|
+
# Perform the initial scan attempt
|
|
678
|
+
if ip_address is None:
|
|
679
|
+
dev_string = self.sendAndReceiveText(self.sock, '$scan')
|
|
778
680
|
else:
|
|
779
|
-
|
|
780
|
-
|
|
781
|
-
|
|
782
|
-
|
|
783
|
-
|
|
784
|
-
|
|
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
|
-
|
|
787
|
-
|
|
788
|
-
|
|
789
|
-
|
|
790
|
-
|
|
791
|
-
|
|
792
|
-
|
|
793
|
-
|
|
794
|
-
|
|
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
|
-
|
|
800
|
-
|
|
702
|
+
temp_list.append(item.split(")")[1].strip())
|
|
703
|
+
found_devices = temp_list
|
|
801
704
|
|
|
802
|
-
#If
|
|
803
|
-
#First order the devices
|
|
804
|
-
if
|
|
805
|
-
|
|
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
|
-
|
|
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
|
-
|
|
724
|
+
Returns:
|
|
725
|
+
List of devices filtered/sorted devices
|
|
726
|
+
"""
|
|
810
727
|
|
|
811
|
-
def sortFavourite(self, foundDevices):
|
|
812
728
|
index = 0
|
|
813
|
-
|
|
814
|
-
|
|
815
|
-
while len(
|
|
816
|
-
for device in
|
|
817
|
-
if
|
|
818
|
-
|
|
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
|
-
|
|
736
|
+
found_devices = sorted_found_devices
|
|
737
|
+
|
|
821
738
|
# new dictionary only containing one favourite connection to each device.
|
|
822
|
-
|
|
739
|
+
fav_con_found_devices = []
|
|
823
740
|
index = 0
|
|
824
|
-
for device in
|
|
825
|
-
if
|
|
826
|
-
|
|
827
|
-
|
|
828
|
-
return
|
|
829
|
-
|
|
830
|
-
|
|
831
|
-
|
|
832
|
-
|
|
833
|
-
|
|
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
|
-
|
|
836
|
-
|
|
837
|
-
|
|
838
|
-
|
|
839
|
-
|
|
840
|
-
|
|
841
|
-
|
|
842
|
-
|
|
843
|
-
|
|
844
|
-
|
|
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
|
-
|
|
847
|
-
|
|
848
|
-
|
|
849
|
-
|
|
850
|
-
|
|
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
|
-
|
|
856
|
-
|
|
857
|
-
|
|
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
|
|
814
|
+
if sock is None:
|
|
860
815
|
sock = self.sock
|
|
816
|
+
|
|
861
817
|
index = 2 # index of relevant line in split string
|
|
862
|
-
|
|
818
|
+
stream_status = self.send_and_receive_text(sock, send_text='stream text header', device=device)
|
|
863
819
|
|
|
864
|
-
self.qps_stream_header =
|
|
820
|
+
self.qps_stream_header = stream_status
|
|
865
821
|
|
|
866
822
|
# Check for the header format. If XML, process here
|
|
867
|
-
if
|
|
823
|
+
if self.is_xml_header(stream_status):
|
|
868
824
|
# Get the basic averaging rate (V3 header)
|
|
869
|
-
xml_root = self.
|
|
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
|
|
828
|
+
# Return the time-based averaging string
|
|
875
829
|
device_period = xml_root.find('.//devicePeriod')
|
|
876
|
-
if device_period
|
|
830
|
+
if device_period is None:
|
|
877
831
|
device_period = xml_root.find('.//devicePerioduS')
|
|
878
|
-
if device_period
|
|
832
|
+
if device_period is None:
|
|
879
833
|
device_period = xml_root.find('.//mainPeriod')
|
|
880
|
-
|
|
881
|
-
return
|
|
834
|
+
average_str = device_period.text
|
|
835
|
+
return average_str
|
|
882
836
|
# For legacy text headers, process here
|
|
883
837
|
else:
|
|
884
|
-
|
|
885
|
-
if
|
|
886
|
-
dummy =
|
|
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
|
-
|
|
889
|
-
avg =
|
|
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
|
-
|
|
897
|
-
|
|
898
|
-
|
|
899
|
-
|
|
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
|
-
|
|
924
|
-
|
|
925
|
-
|
|
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
|
|
866
|
+
if sock is None:
|
|
928
867
|
sock = self.sock
|
|
929
|
-
|
|
930
|
-
|
|
931
|
-
|
|
932
|
-
if
|
|
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.
|
|
935
|
-
# Return the time
|
|
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
|
|
878
|
+
if device_period is None:
|
|
939
879
|
device_period = xml_root.find('.//devicePerioduS')
|
|
940
|
-
if device_period
|
|
880
|
+
if device_period is None:
|
|
941
881
|
device_period = xml_root.find('.//mainPeriod')
|
|
942
|
-
if
|
|
882
|
+
if 'ns' in device_period.text:
|
|
943
883
|
time_unit = 'nS'
|
|
944
|
-
averageStr = device_period.text
|
|
945
884
|
|
|
946
|
-
#
|
|
947
|
-
|
|
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
|
|
889
|
+
if group.tag == "channels":
|
|
951
890
|
for chan in group:
|
|
952
891
|
# Avoid children that are not named channels
|
|
953
|
-
|
|
954
|
-
|
|
955
|
-
|
|
956
|
-
|
|
957
|
-
|
|
958
|
-
|
|
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
|
-
|
|
961
|
-
if 'Header Not Available' in
|
|
962
|
-
|
|
963
|
-
logging.error(
|
|
964
|
-
return
|
|
965
|
-
|
|
966
|
-
|
|
967
|
-
|
|
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
|
-
|
|
973
|
-
if
|
|
974
|
-
if
|
|
975
|
-
|
|
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
|
-
|
|
978
|
-
if
|
|
979
|
-
if
|
|
980
|
-
|
|
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
|
-
|
|
983
|
-
|
|
984
|
-
if
|
|
985
|
-
|
|
986
|
-
if
|
|
987
|
-
|
|
988
|
-
if 'Enabled' in
|
|
989
|
-
if
|
|
990
|
-
|
|
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
|
-
|
|
993
|
-
if (
|
|
994
|
-
|
|
995
|
-
return
|
|
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
|
-
|
|
1001
|
-
|
|
1002
|
-
|
|
1003
|
-
|
|
1004
|
-
|
|
1005
|
-
|
|
1006
|
-
|
|
1007
|
-
|
|
1008
|
-
|
|
1009
|
-
|
|
1010
|
-
|
|
1011
|
-
|
|
1012
|
-
|
|
1013
|
-
|
|
1014
|
-
|
|
1015
|
-
|
|
1016
|
-
|
|
1017
|
-
|
|
1018
|
-
|
|
1019
|
-
|
|
1020
|
-
|
|
1021
|
-
|
|
1022
|
-
|
|
1023
|
-
#
|
|
1024
|
-
|
|
1025
|
-
|
|
1026
|
-
|
|
1027
|
-
|
|
1028
|
-
|
|
1029
|
-
|
|
1030
|
-
|
|
1031
|
-
|
|
1032
|
-
|
|
1033
|
-
|
|
1034
|
-
|
|
1035
|
-
|
|
1036
|
-
|
|
1037
|
-
|
|
1038
|
-
|
|
1039
|
-
|
|
1040
|
-
|
|
1041
|
-
|
|
1042
|
-
|
|
1043
|
-
|
|
1044
|
-
|
|
1045
|
-
|
|
1046
|
-
|
|
1047
|
-
|
|
1048
|
-
|
|
1049
|
-
|
|
1050
|
-
|
|
1051
|
-
|
|
1052
|
-
|
|
1053
|
-
|
|
1054
|
-
|
|
1055
|
-
|
|
1056
|
-
|
|
1057
|
-
|
|
1058
|
-
|
|
1059
|
-
|
|
1060
|
-
|
|
1061
|
-
|
|
1062
|
-
|
|
1063
|
-
|
|
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
|
|
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
|
-
|
|
1109
|
-
|
|
1110
|
-
|
|
1111
|
-
|
|
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
|
-
|
|
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
|
-
|
|
1147
|
-
|
|
1148
|
-
|
|
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
|
|
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
|
|
1069
|
+
if sock is None:
|
|
1157
1070
|
sock = self.sock
|
|
1158
1071
|
count = 0
|
|
1159
|
-
while
|
|
1072
|
+
while True:
|
|
1160
1073
|
if count > 5:
|
|
1161
1074
|
break
|
|
1162
1075
|
count += 1
|
|
1163
1076
|
# Get the raw data
|
|
1164
|
-
|
|
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
|
|
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
|
|
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(
|
|
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
|
-
|
|
1182
|
-
if
|
|
1183
|
-
logging.error(device + ' Stream header version not compatible: ' + xml_root
|
|
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
|
|
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
|
-
|
|
1196
|
-
|
|
1197
|
-
|
|
1198
|
-
|
|
1199
|
-
|
|
1200
|
-
|
|
1201
|
-
|
|
1202
|
-
|
|
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
|
-
|
|
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
|
-
|
|
1296
|
-
|
|
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.
|
|
1623
|
-
res = self.
|
|
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
|
-
#
|
|
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
|
-
|
|
1635
|
-
|
|
1636
|
-
|
|
1637
|
-
|
|
1638
|
-
|
|
1639
|
-
|
|
1640
|
-
|
|
1641
|
-
|
|
1642
|
-
|
|
1643
|
-
|
|
1644
|
-
|
|
1645
|
-
|
|
1646
|
-
|
|
1647
|
-
|
|
1648
|
-
|
|
1649
|
-
|
|
1650
|
-
|
|
1651
|
-
|
|
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
|
-
|
|
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
|
|
1676
|
-
self.
|
|
1677
|
-
#Receive Response
|
|
1678
|
-
res = self.
|
|
1679
|
-
#
|
|
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
|
-
|
|
1682
|
-
self.
|
|
1683
|
-
res = self.
|
|
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.
|
|
1686
|
-
res = self.
|
|
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: " +
|
|
1186
|
+
raise (Exception("Empty response from QIS. Sent: " + send_text))
|
|
1689
1187
|
else:
|
|
1690
|
-
raise (Exception("Empty response from QIS. Sent: " +
|
|
1188
|
+
raise (Exception("Empty response from QIS. Sent: " + send_text))
|
|
1691
1189
|
|
|
1692
1190
|
if res[0] == self.cursor:
|
|
1693
|
-
logging.
|
|
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.
|
|
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.
|
|
1698
|
-
|
|
1699
|
-
|
|
1700
|
-
|
|
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
|
-
|
|
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.
|
|
1232
|
+
res += self.receive_text(sock)
|
|
1730
1233
|
|
|
1731
1234
|
# Increment count and check for max reads
|
|
1732
1235
|
count += 1
|
|
1733
|
-
if count >=
|
|
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
|
-
#
|
|
1740
|
-
logging.error("Error! Unable to retrieve response from QIS. Command: " +
|
|
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
|
|
1757
|
-
|
|
1758
|
-
|
|
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
|
-
|
|
1766
|
-
|
|
1767
|
-
|
|
1768
|
-
|
|
1769
|
-
|
|
1770
|
-
|
|
1771
|
-
|
|
1772
|
-
|
|
1773
|
-
|
|
1774
|
-
|
|
1775
|
-
|
|
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
|
-
|
|
1778
|
-
|
|
1301
|
+
max_read_repeats=50
|
|
1302
|
+
read_repeats=0
|
|
1779
1303
|
timeout_in_seconds = 10
|
|
1780
|
-
|
|
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
|
-
#
|
|
1784
|
-
#The first
|
|
1785
|
-
#We only use the read list and our socket to check if it is readable. if no timeout is specified
|
|
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
|
-
|
|
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
|
-
|
|
1802
|
-
|
|
1803
|
-
|
|
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('
|
|
1331
|
+
logging.error('Timeout: Failed to open new QIS socket and get the welcome message')
|
|
1806
1332
|
raise e
|
|
1807
1333
|
|
|
1808
|
-
|
|
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
|
|
1818
|
-
|
|
1819
|
-
|
|
1820
|
-
|
|
1821
|
-
|
|
1822
|
-
|
|
1823
|
-
|
|
1824
|
-
|
|
1825
|
-
|
|
1826
|
-
|
|
1827
|
-
|
|
1828
|
-
|
|
1829
|
-
|
|
1830
|
-
|
|
1831
|
-
|
|
1832
|
-
|
|
1833
|
-
|
|
1834
|
-
|
|
1835
|
-
|
|
1836
|
-
|
|
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)
|