quarchpy 2.1.24.dev5__py2.py3-none-any.whl → 2.1.25__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/__pycache__/__init__.cpython-311.pyc +0 -0
- quarchpy/__pycache__/_version.cpython-311.pyc +0 -0
- quarchpy/__pycache__/connection.cpython-311.pyc +0 -0
- quarchpy/__pycache__/run.cpython-311.pyc +0 -0
- quarchpy/_version.py +1 -1
- quarchpy/config_files/__pycache__/__init__.cpython-311.pyc +0 -0
- quarchpy/config_files/__pycache__/quarch_config_parser.cpython-311.pyc +0 -0
- quarchpy/connection_specific/QPS/qis/qis.jar +0 -0
- quarchpy/connection_specific/QPS/qis/qis_lib/{CInterface-1.7.9.jar → CInterface-1.8.2.jar} +0 -0
- quarchpy/connection_specific/QPS/qis/qis_lib/{CInterface-1.8.0.jar → CInterface-1.9.jar} +0 -0
- quarchpy/connection_specific/QPS/{qps_lib/QuarchCommon-0.2.12.jar → qis/qis_lib/QuarchCommon-0.2.13.jar} +0 -0
- quarchpy/connection_specific/QPS/qps.jar +0 -0
- quarchpy/connection_specific/QPS/{qis/qis_lib/QuarchCommon-0.2.12.jar → qps_lib/QuarchCommon-0.2.13.jar} +0 -0
- quarchpy/connection_specific/QPS/qps_lib/{qis-1.41.jar → qis-1.43.jar} +0 -0
- quarchpy/connection_specific/QPS/resources/InstallBanner.bmp +0 -0
- quarchpy/connection_specific/QPS/resources/QPS.ico +0 -0
- quarchpy/connection_specific/QPS/resources/QPS.png +0 -0
- quarchpy/connection_specific/QPS/resources/QuarchIcon_128x128.png +0 -0
- quarchpy/connection_specific/QPS/resources/QuarchIcon_16x16.png +0 -0
- quarchpy/connection_specific/QPS/resources/QuarchIcon_256x256.png +0 -0
- quarchpy/connection_specific/QPS/resources/QuarchIcon_32x32.png +0 -0
- quarchpy/connection_specific/QPS/resources/QuarchIcon_64x64.png +0 -0
- quarchpy/connection_specific/QPS/scriptCommands.txt +17 -2
- quarchpy/connection_specific/__pycache__/StreamChannels.cpython-311.pyc +0 -0
- quarchpy/connection_specific/__pycache__/__init__.cpython-311.pyc +0 -0
- quarchpy/connection_specific/__pycache__/connection_QIS.cpython-311.pyc +0 -0
- quarchpy/connection_specific/__pycache__/connection_QPS.cpython-311.pyc +0 -0
- quarchpy/connection_specific/__pycache__/connection_ReST.cpython-311.pyc +0 -0
- quarchpy/connection_specific/__pycache__/connection_Serial.cpython-311.pyc +0 -0
- quarchpy/connection_specific/__pycache__/connection_TCP.cpython-311.pyc +0 -0
- quarchpy/connection_specific/__pycache__/connection_Telnet.cpython-311.pyc +0 -0
- quarchpy/connection_specific/__pycache__/connection_USB.cpython-311.pyc +0 -0
- quarchpy/connection_specific/__pycache__/mDNS.cpython-311.pyc +0 -0
- quarchpy/connection_specific/connection_QPS.py +52 -0
- quarchpy/connection_specific/mDNS.py +126 -0
- quarchpy/connection_specific/serial/__pycache__/__init__.cpython-311.pyc +0 -0
- quarchpy/connection_specific/serial/__pycache__/serialutil.cpython-311.pyc +0 -0
- quarchpy/connection_specific/serial/__pycache__/serialwin32.cpython-311.pyc +0 -0
- quarchpy/connection_specific/serial/__pycache__/win32.cpython-311.pyc +0 -0
- quarchpy/connection_specific/serial/tools/__pycache__/__init__.cpython-311.pyc +0 -0
- quarchpy/connection_specific/serial/tools/__pycache__/list_ports.cpython-311.pyc +0 -0
- quarchpy/connection_specific/serial/tools/__pycache__/list_ports_common.cpython-311.pyc +0 -0
- quarchpy/connection_specific/serial/tools/__pycache__/list_ports_windows.cpython-311.pyc +0 -0
- quarchpy/debug/__pycache__/SystemTest.cpython-311.pyc +0 -0
- quarchpy/debug/__pycache__/__init__.cpython-311.pyc +0 -0
- quarchpy/debug/__pycache__/module_debug.cpython-311.pyc +0 -0
- quarchpy/debug/__pycache__/simple_terminal.cpython-311.pyc +0 -0
- quarchpy/debug/__pycache__/upgrade_quarchpy.cpython-311.pyc +0 -0
- quarchpy/debug/__pycache__/versionCompare.cpython-311.pyc +0 -0
- quarchpy/device/__pycache__/__init__.cpython-311.pyc +0 -0
- quarchpy/device/__pycache__/device.cpython-311.pyc +0 -0
- quarchpy/device/__pycache__/quarchArray.cpython-311.pyc +0 -0
- quarchpy/device/__pycache__/quarchPPM.cpython-311.pyc +0 -0
- quarchpy/device/__pycache__/quarchQPS.cpython-311.pyc +0 -0
- quarchpy/device/__pycache__/scanDevices.cpython-311.pyc +0 -0
- quarchpy/device/device.py +72 -22
- quarchpy/device/scanDevices.py +26 -11
- quarchpy/disk_test/__pycache__/AbsDiskFinder.cpython-311.pyc +0 -0
- quarchpy/disk_test/__pycache__/DiskTargetSelection.cpython-311.pyc +0 -0
- quarchpy/disk_test/__pycache__/__init__.cpython-311.pyc +0 -0
- quarchpy/disk_test/__pycache__/iometerDiskFinder.cpython-311.pyc +0 -0
- quarchpy/docs/CHANGES.rst +9 -0
- quarchpy/docs/_build/doctrees/CHANGES.doctree +0 -0
- quarchpy/docs/_build/doctrees/environment.pickle +0 -0
- quarchpy/docs/_build/doctrees/source/changelog.doctree +0 -0
- quarchpy/docs/_build/doctrees/source/quarchpy.connection_specific.doctree +0 -0
- quarchpy/docs/_build/doctrees/source/quarchpy.device.doctree +0 -0
- quarchpy/docs/_build/doctrees/source/quarchpy.qps.doctree +0 -0
- quarchpy/docs/_build/html/CHANGES.html +132 -119
- quarchpy/docs/_build/html/_sources/CHANGES.rst.txt +9 -0
- quarchpy/docs/_build/html/genindex.html +4 -0
- quarchpy/docs/_build/html/index.html +62 -60
- quarchpy/docs/_build/html/objects.inv +0 -0
- quarchpy/docs/_build/html/readme.html +6 -7
- quarchpy/docs/_build/html/searchindex.js +1 -1
- quarchpy/docs/_build/html/source/changelog.html +194 -179
- quarchpy/docs/_build/html/source/licenses.html +6 -7
- quarchpy/docs/_build/html/source/quarchpy.connection_specific.html +10 -0
- quarchpy/docs/_build/html/source/quarchpy.device.html +1 -1
- quarchpy/docs/_build/html/source/quarchpy.html +2 -0
- quarchpy/docs/_build/html/source/quarchpy.iometer.html +6 -7
- quarchpy/docs/_build/html/source/quarchpy.qps.html +2 -2
- quarchpy/docs/_build/html/source/quarchpy.utilities.html +6 -7
- quarchpy/docs/_build/html/source/readme.html +6 -7
- quarchpy/fio/__pycache__/FIO_interface.cpython-311.pyc +0 -0
- quarchpy/fio/__pycache__/__init__.cpython-311.pyc +0 -0
- quarchpy/fio/__pycache__/fioDiskFinder.cpython-311.pyc +0 -0
- quarchpy/iometer/__pycache__/__init__.cpython-311.pyc +0 -0
- quarchpy/iometer/__pycache__/gen_iometer_template.cpython-311.pyc +0 -0
- quarchpy/iometer/__pycache__/iometerFuncs.cpython-311.pyc +0 -0
- quarchpy/qis/__pycache__/StreamHeaderInfo.cpython-311.pyc +0 -0
- quarchpy/qis/__pycache__/__init__.cpython-311.pyc +0 -0
- quarchpy/qis/__pycache__/qisFuncs.cpython-311.pyc +0 -0
- quarchpy/qps/__pycache__/__init__.cpython-311.pyc +0 -0
- quarchpy/qps/__pycache__/qpsFuncs.cpython-311.pyc +0 -0
- quarchpy/qps/qpsFuncs.py +20 -10
- quarchpy/qps/qpsFuncs.py.bak +281 -0
- quarchpy/user_interface/__pycache__/__init__.cpython-311.pyc +0 -0
- quarchpy/user_interface/__pycache__/user_interface.cpython-311.pyc +0 -0
- quarchpy/user_interface/user_interface.py +3 -1
- quarchpy/utilities/__pycache__/TestCenter.cpython-311.pyc +0 -0
- quarchpy/utilities/__pycache__/TimeValue.cpython-311.pyc +0 -0
- quarchpy/utilities/__pycache__/Version.cpython-311.pyc +0 -0
- quarchpy/utilities/__pycache__/__init__.cpython-311.pyc +0 -0
- {quarchpy-2.1.24.dev5.dist-info → quarchpy-2.1.25.dist-info}/METADATA +10 -1
- {quarchpy-2.1.24.dev5.dist-info → quarchpy-2.1.25.dist-info}/RECORD +108 -57
- quarchpy/connection_specific/QPS/qis/qis_lib/CInterface-1.7.04.jar +0 -0
- quarchpy/connection_specific/QPS/qis/qis_lib/CInterface-1.7.8.jar +0 -0
- quarchpy/connection_specific/QPS/qis/qis_lib/CInterface-1.8.1.jar +0 -0
- quarchpy/connection_specific/QPS/qis/qis_lib/QuarchCommon-0.2.6.jar +0 -0
- quarchpy/connection_specific/QPS/qis/qis_lib/QuarchCommon-0.2.9.jar +0 -0
- quarchpy/connection_specific/QPS/qis/qis_lib/commons-csv-1.8.jar +0 -0
- quarchpy/connection_specific/QPS/qis/qis_lib/commons-lang3-3.2.1.jar +0 -0
- quarchpy/connection_specific/QPS/qis/resources/filters/filters.csv +0 -1004
- quarchpy/connection_specific/QPS/qps_lib/QuarchCommon-0.2.6.jar +0 -0
- quarchpy/connection_specific/QPS/qps_lib/QuarchCommon-0.2.9.jar +0 -0
- quarchpy/connection_specific/QPS/qps_lib/commons-lang3-3.12.0.jar +0 -0
- quarchpy/connection_specific/QPS/qps_lib/jfxtras-labs-8.0-r6.jar +0 -0
- quarchpy/connection_specific/QPS/qps_lib/opencsv-5.9.jar +0 -0
- quarchpy/connection_specific/QPS/qps_lib/qis-1.39.jar +0 -0
- quarchpy/connection_specific/QPS/qps_lib/qis-1.40.jar +0 -0
- quarchpy/connection_specific/connection_mDNS.py +0 -40
- {quarchpy-2.1.24.dev5.dist-info → quarchpy-2.1.25.dist-info}/WHEEL +0 -0
- {quarchpy-2.1.24.dev5.dist-info → quarchpy-2.1.25.dist-info}/top_level.txt +0 -0
@@ -6,8 +6,8 @@
|
|
6
6
|
<meta name="viewport" content="width=device-width, initial-scale=1.0" /><meta name="viewport" content="width=device-width, initial-scale=1" />
|
7
7
|
|
8
8
|
<title>LICENSES — quarchpy documentation</title>
|
9
|
-
<link rel="stylesheet" type="text/css" href="../_static/pygments.css?v=
|
10
|
-
<link rel="stylesheet" type="text/css" href="../_static/alabaster.css?v=
|
9
|
+
<link rel="stylesheet" type="text/css" href="../_static/pygments.css?v=b3523f8e" />
|
10
|
+
<link rel="stylesheet" type="text/css" href="../_static/alabaster.css?v=039e1c02" />
|
11
11
|
<script src="../_static/documentation_options.js?v=5929fcd5"></script>
|
12
12
|
<script src="../_static/doctools.js?v=888ff710"></script>
|
13
13
|
<script src="../_static/sphinx_highlight.js?v=dc90522c"></script>
|
@@ -17,9 +17,8 @@
|
|
17
17
|
|
18
18
|
<link rel="stylesheet" href="../_static/custom.css" type="text/css" />
|
19
19
|
|
20
|
-
|
21
|
-
|
22
20
|
|
21
|
+
<meta name="viewport" content="width=device-width, initial-scale=0.9, maximum-scale=0.9" />
|
23
22
|
|
24
23
|
</head><body>
|
25
24
|
|
@@ -164,11 +163,11 @@ License Identifiers that are here available: <a class="reference external" href=
|
|
164
163
|
<div class="clearer"></div>
|
165
164
|
</div>
|
166
165
|
<div class="footer">
|
167
|
-
|
166
|
+
©2020, Quarch Technology Ltd.
|
168
167
|
|
169
168
|
|
|
170
|
-
Powered by <a href="
|
171
|
-
& <a href="https://alabaster
|
169
|
+
Powered by <a href="http://sphinx-doc.org/">Sphinx 7.2.6</a>
|
170
|
+
& <a href="https://github.com/bitprophet/alabaster">Alabaster 0.7.13</a>
|
172
171
|
|
173
172
|
|
|
174
173
|
<a href="../_sources/source/licenses.rst.txt"
|
@@ -370,6 +370,16 @@ Current implementation assumes only 1 of each data file are made.</p>
|
|
370
370
|
<span class="sig-name descname"><span class="pre">getDeviceList</span></span><span class="sig-paren">(</span><em class="sig-param"><span class="n"><span class="pre">scan</span></span><span class="o"><span class="pre">=</span></span><span class="default_value"><span class="pre">True</span></span></em>, <em class="sig-param"><span class="n"><span class="pre">ipAddress</span></span><span class="o"><span class="pre">=</span></span><span class="default_value"><span class="pre">None</span></span></em><span class="sig-paren">)</span><a class="headerlink" href="#quarchpy.connection_specific.connection_QPS.QpsInterface.getDeviceList" title="Link to this definition">¶</a></dt>
|
371
371
|
<dd></dd></dl>
|
372
372
|
|
373
|
+
<dl class="py method">
|
374
|
+
<dt class="sig sig-object py" id="quarchpy.connection_specific.connection_QPS.QpsInterface.get_list_details">
|
375
|
+
<span class="sig-name descname"><span class="pre">get_list_details</span></span><span class="sig-paren">(</span><em class="sig-param"><span class="n"><span class="pre">sock</span></span><span class="o"><span class="pre">=</span></span><span class="default_value"><span class="pre">None</span></span></em><span class="sig-paren">)</span><a class="headerlink" href="#quarchpy.connection_specific.connection_QPS.QpsInterface.get_list_details" title="Link to this definition">¶</a></dt>
|
376
|
+
<dd></dd></dl>
|
377
|
+
|
378
|
+
<dl class="py method">
|
379
|
+
<dt class="sig sig-object py" id="quarchpy.connection_specific.connection_QPS.QpsInterface.open_recording">
|
380
|
+
<span class="sig-name descname"><span class="pre">open_recording</span></span><span class="sig-paren">(</span><em class="sig-param"><span class="n"><span class="pre">file_path</span></span></em>, <em class="sig-param"><span class="n"><span class="pre">cmdTimeout</span></span><span class="o"><span class="pre">=</span></span><span class="default_value"><span class="pre">5</span></span></em>, <em class="sig-param"><span class="n"><span class="pre">pollInterval</span></span><span class="o"><span class="pre">=</span></span><span class="default_value"><span class="pre">3</span></span></em>, <em class="sig-param"><span class="n"><span class="pre">startOpenTimout</span></span><span class="o"><span class="pre">=</span></span><span class="default_value"><span class="pre">5</span></span></em><span class="sig-paren">)</span><a class="headerlink" href="#quarchpy.connection_specific.connection_QPS.QpsInterface.open_recording" title="Link to this definition">¶</a></dt>
|
381
|
+
<dd></dd></dl>
|
382
|
+
|
373
383
|
<dl class="py method">
|
374
384
|
<dt class="sig sig-object py" id="quarchpy.connection_specific.connection_QPS.QpsInterface.recv">
|
375
385
|
<span class="sig-name descname"><span class="pre">recv</span></span><span class="sig-paren">(</span><span class="sig-paren">)</span><a class="headerlink" href="#quarchpy.connection_specific.connection_QPS.QpsInterface.recv" title="Link to this definition">¶</a></dt>
|
@@ -578,7 +578,7 @@ Defaults to “USB”, “TCP”, “SERIAL”, “REST”, “TELNET” in that
|
|
578
578
|
|
579
579
|
<dl class="py function">
|
580
580
|
<dt class="sig sig-object py" id="quarchpy.device.scanDevices.scan_mDNS">
|
581
|
-
<span class="sig-prename descclassname"><span class="pre">quarchpy.device.scanDevices.</span></span><span class="sig-name descname"><span class="pre">scan_mDNS</span></span><span class="sig-paren">(</span><em class="sig-param"><span class="n"><span class="pre">mdnsListener</span></span></em><span class="sig-paren">)</span><a class="headerlink" href="#quarchpy.device.scanDevices.scan_mDNS" title="Link to this definition">¶</a></dt>
|
581
|
+
<span class="sig-prename descclassname"><span class="pre">quarchpy.device.scanDevices.</span></span><span class="sig-name descname"><span class="pre">scan_mDNS</span></span><span class="sig-paren">(</span><em class="sig-param"><span class="n"><span class="pre">mdnsListener</span></span></em>, <em class="sig-param"><span class="n"><span class="pre">zeroconf</span></span><span class="o"><span class="pre">=</span></span><span class="default_value"><span class="pre">None</span></span></em><span class="sig-paren">)</span><a class="headerlink" href="#quarchpy.device.scanDevices.scan_mDNS" title="Link to this definition">¶</a></dt>
|
582
582
|
<dd></dd></dl>
|
583
583
|
|
584
584
|
<dl class="py function">
|
@@ -393,6 +393,8 @@
|
|
393
393
|
<li class="toctree-l4"><a class="reference internal" href="quarchpy.connection_specific.html#quarchpy.connection_specific.connection_QPS.QpsInterface.connect"><code class="docutils literal notranslate"><span class="pre">QpsInterface.connect()</span></code></a></li>
|
394
394
|
<li class="toctree-l4"><a class="reference internal" href="quarchpy.connection_specific.html#quarchpy.connection_specific.connection_QPS.QpsInterface.disconnect"><code class="docutils literal notranslate"><span class="pre">QpsInterface.disconnect()</span></code></a></li>
|
395
395
|
<li class="toctree-l4"><a class="reference internal" href="quarchpy.connection_specific.html#quarchpy.connection_specific.connection_QPS.QpsInterface.getDeviceList"><code class="docutils literal notranslate"><span class="pre">QpsInterface.getDeviceList()</span></code></a></li>
|
396
|
+
<li class="toctree-l4"><a class="reference internal" href="quarchpy.connection_specific.html#quarchpy.connection_specific.connection_QPS.QpsInterface.get_list_details"><code class="docutils literal notranslate"><span class="pre">QpsInterface.get_list_details()</span></code></a></li>
|
397
|
+
<li class="toctree-l4"><a class="reference internal" href="quarchpy.connection_specific.html#quarchpy.connection_specific.connection_QPS.QpsInterface.open_recording"><code class="docutils literal notranslate"><span class="pre">QpsInterface.open_recording()</span></code></a></li>
|
396
398
|
<li class="toctree-l4"><a class="reference internal" href="quarchpy.connection_specific.html#quarchpy.connection_specific.connection_QPS.QpsInterface.recv"><code class="docutils literal notranslate"><span class="pre">QpsInterface.recv()</span></code></a></li>
|
397
399
|
<li class="toctree-l4"><a class="reference internal" href="quarchpy.connection_specific.html#quarchpy.connection_specific.connection_QPS.QpsInterface.scanIP"><code class="docutils literal notranslate"><span class="pre">QpsInterface.scanIP()</span></code></a></li>
|
398
400
|
<li class="toctree-l4"><a class="reference internal" href="quarchpy.connection_specific.html#quarchpy.connection_specific.connection_QPS.QpsInterface.send"><code class="docutils literal notranslate"><span class="pre">QpsInterface.send()</span></code></a></li>
|
@@ -6,8 +6,8 @@
|
|
6
6
|
<meta name="viewport" content="width=device-width, initial-scale=1.0" /><meta name="viewport" content="width=device-width, initial-scale=1" />
|
7
7
|
|
8
8
|
<title>quarchpy.iometer package — quarchpy documentation</title>
|
9
|
-
<link rel="stylesheet" type="text/css" href="../_static/pygments.css?v=
|
10
|
-
<link rel="stylesheet" type="text/css" href="../_static/alabaster.css?v=
|
9
|
+
<link rel="stylesheet" type="text/css" href="../_static/pygments.css?v=b3523f8e" />
|
10
|
+
<link rel="stylesheet" type="text/css" href="../_static/alabaster.css?v=039e1c02" />
|
11
11
|
<script src="../_static/documentation_options.js?v=5929fcd5"></script>
|
12
12
|
<script src="../_static/doctools.js?v=888ff710"></script>
|
13
13
|
<script src="../_static/sphinx_highlight.js?v=dc90522c"></script>
|
@@ -18,9 +18,8 @@
|
|
18
18
|
|
19
19
|
<link rel="stylesheet" href="../_static/custom.css" type="text/css" />
|
20
20
|
|
21
|
-
|
22
|
-
|
23
21
|
|
22
|
+
<meta name="viewport" content="width=device-width, initial-scale=0.9, maximum-scale=0.9" />
|
24
23
|
|
25
24
|
</head><body>
|
26
25
|
|
@@ -254,11 +253,11 @@ Reads the data into a dictionary</p>
|
|
254
253
|
<div class="clearer"></div>
|
255
254
|
</div>
|
256
255
|
<div class="footer">
|
257
|
-
|
256
|
+
©2020, Quarch Technology Ltd.
|
258
257
|
|
259
258
|
|
|
260
|
-
Powered by <a href="
|
261
|
-
& <a href="https://alabaster
|
259
|
+
Powered by <a href="http://sphinx-doc.org/">Sphinx 7.2.6</a>
|
260
|
+
& <a href="https://github.com/bitprophet/alabaster">Alabaster 0.7.13</a>
|
262
261
|
|
263
262
|
|
|
264
263
|
<a href="../_sources/source/quarchpy.iometer.rst.txt"
|
@@ -51,7 +51,7 @@
|
|
51
51
|
<dl class="py function">
|
52
52
|
<dt class="sig sig-object py" id="quarchpy.qps.qpsFuncs.isQpsRunning">
|
53
53
|
<span class="sig-prename descclassname"><span class="pre">quarchpy.qps.qpsFuncs.</span></span><span class="sig-name descname"><span class="pre">isQpsRunning</span></span><span class="sig-paren">(</span><em class="sig-param"><span class="n"><span class="pre">host</span></span><span class="o"><span class="pre">=</span></span><span class="default_value"><span class="pre">'127.0.0.1'</span></span></em>, <em class="sig-param"><span class="n"><span class="pre">port</span></span><span class="o"><span class="pre">=</span></span><span class="default_value"><span class="pre">9822</span></span></em>, <em class="sig-param"><span class="n"><span class="pre">timeout</span></span><span class="o"><span class="pre">=</span></span><span class="default_value"><span class="pre">0</span></span></em><span class="sig-paren">)</span><a class="headerlink" href="#quarchpy.qps.qpsFuncs.isQpsRunning" title="Link to this definition">¶</a></dt>
|
54
|
-
<dd><p>This func will return true if QPS is running with a working QIS connection
|
54
|
+
<dd><p>This func will return true if QPS is running with a working QIS connection.</p>
|
55
55
|
</dd></dl>
|
56
56
|
|
57
57
|
<dl class="py function">
|
@@ -110,7 +110,7 @@ Assumes</p>
|
|
110
110
|
<dl class="py function">
|
111
111
|
<dt class="sig sig-object py" id="quarchpy.qps.isQpsRunning">
|
112
112
|
<span class="sig-prename descclassname"><span class="pre">quarchpy.qps.</span></span><span class="sig-name descname"><span class="pre">isQpsRunning</span></span><span class="sig-paren">(</span><em class="sig-param"><span class="n"><span class="pre">host</span></span><span class="o"><span class="pre">=</span></span><span class="default_value"><span class="pre">'127.0.0.1'</span></span></em>, <em class="sig-param"><span class="n"><span class="pre">port</span></span><span class="o"><span class="pre">=</span></span><span class="default_value"><span class="pre">9822</span></span></em>, <em class="sig-param"><span class="n"><span class="pre">timeout</span></span><span class="o"><span class="pre">=</span></span><span class="default_value"><span class="pre">0</span></span></em><span class="sig-paren">)</span><a class="headerlink" href="#quarchpy.qps.isQpsRunning" title="Link to this definition">¶</a></dt>
|
113
|
-
<dd><p>This func will return true if QPS is running with a working QIS connection
|
113
|
+
<dd><p>This func will return true if QPS is running with a working QIS connection.</p>
|
114
114
|
</dd></dl>
|
115
115
|
|
116
116
|
<dl class="py attribute">
|
@@ -6,8 +6,8 @@
|
|
6
6
|
<meta name="viewport" content="width=device-width, initial-scale=1.0" /><meta name="viewport" content="width=device-width, initial-scale=1" />
|
7
7
|
|
8
8
|
<title>quarchpy.utilities package — quarchpy documentation</title>
|
9
|
-
<link rel="stylesheet" type="text/css" href="../_static/pygments.css?v=
|
10
|
-
<link rel="stylesheet" type="text/css" href="../_static/alabaster.css?v=
|
9
|
+
<link rel="stylesheet" type="text/css" href="../_static/pygments.css?v=b3523f8e" />
|
10
|
+
<link rel="stylesheet" type="text/css" href="../_static/alabaster.css?v=039e1c02" />
|
11
11
|
<script src="../_static/documentation_options.js?v=5929fcd5"></script>
|
12
12
|
<script src="../_static/doctools.js?v=888ff710"></script>
|
13
13
|
<script src="../_static/sphinx_highlight.js?v=dc90522c"></script>
|
@@ -18,9 +18,8 @@
|
|
18
18
|
|
19
19
|
<link rel="stylesheet" href="../_static/custom.css" type="text/css" />
|
20
20
|
|
21
|
-
|
22
|
-
|
23
21
|
|
22
|
+
<meta name="viewport" content="width=device-width, initial-scale=0.9, maximum-scale=0.9" />
|
24
23
|
|
25
24
|
</head><body>
|
26
25
|
|
@@ -194,11 +193,11 @@ on the reporting of the results.</p>
|
|
194
193
|
<div class="clearer"></div>
|
195
194
|
</div>
|
196
195
|
<div class="footer">
|
197
|
-
|
196
|
+
©2020, Quarch Technology Ltd.
|
198
197
|
|
199
198
|
|
|
200
|
-
Powered by <a href="
|
201
|
-
& <a href="https://alabaster
|
199
|
+
Powered by <a href="http://sphinx-doc.org/">Sphinx 7.2.6</a>
|
200
|
+
& <a href="https://github.com/bitprophet/alabaster">Alabaster 0.7.13</a>
|
202
201
|
|
203
202
|
|
|
204
203
|
<a href="../_sources/source/quarchpy.utilities.rst.txt"
|
@@ -6,8 +6,8 @@
|
|
6
6
|
<meta name="viewport" content="width=device-width, initial-scale=1.0" /><meta name="viewport" content="width=device-width, initial-scale=1" />
|
7
7
|
|
8
8
|
<title>Quarchpy - Readme — quarchpy documentation</title>
|
9
|
-
<link rel="stylesheet" type="text/css" href="../_static/pygments.css?v=
|
10
|
-
<link rel="stylesheet" type="text/css" href="../_static/alabaster.css?v=
|
9
|
+
<link rel="stylesheet" type="text/css" href="../_static/pygments.css?v=b3523f8e" />
|
10
|
+
<link rel="stylesheet" type="text/css" href="../_static/alabaster.css?v=039e1c02" />
|
11
11
|
<script src="../_static/documentation_options.js?v=5929fcd5"></script>
|
12
12
|
<script src="../_static/doctools.js?v=888ff710"></script>
|
13
13
|
<script src="../_static/sphinx_highlight.js?v=dc90522c"></script>
|
@@ -18,9 +18,8 @@
|
|
18
18
|
|
19
19
|
<link rel="stylesheet" href="../_static/custom.css" type="text/css" />
|
20
20
|
|
21
|
-
|
22
|
-
|
23
21
|
|
22
|
+
<meta name="viewport" content="width=device-width, initial-scale=0.9, maximum-scale=0.9" />
|
24
23
|
|
25
24
|
</head><body>
|
26
25
|
|
@@ -130,11 +129,11 @@
|
|
130
129
|
<div class="clearer"></div>
|
131
130
|
</div>
|
132
131
|
<div class="footer">
|
133
|
-
|
132
|
+
©2020, Quarch Technology Ltd.
|
134
133
|
|
135
134
|
|
|
136
|
-
Powered by <a href="
|
137
|
-
& <a href="https://alabaster
|
135
|
+
Powered by <a href="http://sphinx-doc.org/">Sphinx 7.2.6</a>
|
136
|
+
& <a href="https://github.com/bitprophet/alabaster">Alabaster 0.7.13</a>
|
138
137
|
|
139
138
|
|
|
140
139
|
<a href="../_sources/source/readme.rst.txt"
|
Binary file
|
Binary file
|
Binary file
|
Binary file
|
Binary file
|
Binary file
|
Binary file
|
Binary file
|
Binary file
|
Binary file
|
Binary file
|
quarchpy/qps/qpsFuncs.py
CHANGED
@@ -14,7 +14,7 @@ import logging
|
|
14
14
|
|
15
15
|
def isQpsRunning(host='127.0.0.1', port=9822, timeout=0):
|
16
16
|
'''
|
17
|
-
This func will return true if QPS is running with a working QIS connection.
|
17
|
+
This func will return true if QPS is running with a working QIS connection.
|
18
18
|
'''
|
19
19
|
myQps=None
|
20
20
|
logging.debug("Checking if QPS is running")
|
@@ -73,10 +73,11 @@ def startLocalQps(keepQisRunning=False, args=[], timeout=30, startQPSMinimised=T
|
|
73
73
|
if keepQisRunning:
|
74
74
|
if not isQisRunning():
|
75
75
|
startLocalQis()
|
76
|
-
# if startQPSMinimised == True: #TODO add to release for QPS 1.38
|
77
|
-
# args.append("CCS=MIN")
|
78
76
|
temp =""
|
79
77
|
args = temp.join(args)
|
78
|
+
if startQPSMinimised == True: #TODO add to release for QPS 1.38
|
79
|
+
if "-ccs=" not in args.lower():
|
80
|
+
args +=" -ccs=MIN"
|
80
81
|
|
81
82
|
QpsPath = os.path.dirname(os.path.abspath(__file__))
|
82
83
|
QpsPath, junk = os.path.split(QpsPath)
|
@@ -93,16 +94,25 @@ def startLocalQps(keepQisRunning=False, args=[], timeout=30, startQPSMinimised=T
|
|
93
94
|
else:
|
94
95
|
process = subprocess.Popen(command, stdout=subprocess.PIPE, stderr=subprocess.PIPE, text=True, shell=True)
|
95
96
|
|
96
|
-
|
97
|
-
|
98
|
-
|
99
|
-
|
97
|
+
startTime = time.time()
|
98
|
+
while not isQpsRunning():
|
99
|
+
time.sleep(0.2)
|
100
|
+
_get_std_msg_and_err_from_QPS_process(process)
|
101
|
+
if time.time() - startTime > timeout:
|
102
|
+
os.chdir(current_dir)
|
103
|
+
raise TimeoutError("QPS failed to launch within timelimit of " + str(timeout) + " sec.")
|
104
|
+
logging.debug("QPS detected after " + str(time.time() - startTime) + "s")
|
105
|
+
|
106
|
+
while not isQisRunning():
|
107
|
+
if time.time() - startTime > timeout:
|
108
|
+
raise TimeoutError(
|
109
|
+
"QPS did launch but QIS did not respond during the timeout time of " + str(timeout) + " sec.")
|
110
|
+
time.sleep(0.2)
|
111
|
+
logging.debug("QIS detected after " + str(time.time() - startTime) + "s")
|
100
112
|
|
101
|
-
if time.time() - startTime > timeout:
|
102
|
-
os.chdir(current_dir)
|
103
|
-
raise TimeoutError("QPS failed to launch within timelimit of " + str(timeout) + " sec.")
|
104
113
|
# return current working directory
|
105
114
|
os.chdir(current_dir)
|
115
|
+
return
|
106
116
|
|
107
117
|
def reader(stream, q, source, lock,stop_flag):
|
108
118
|
'''
|
@@ -0,0 +1,281 @@
|
|
1
|
+
from threading import Thread, Lock, Event, active_count
|
2
|
+
from queue import Queue, Empty
|
3
|
+
import time
|
4
|
+
import os, sys
|
5
|
+
import datetime
|
6
|
+
import platform
|
7
|
+
from quarchpy.qis import isQisRunning, startLocalQis
|
8
|
+
from quarchpy.connection_specific.connection_QIS import QisInterface
|
9
|
+
from quarchpy.connection_specific.connection_QPS import QpsInterface
|
10
|
+
from quarchpy.user_interface import *
|
11
|
+
import subprocess
|
12
|
+
import logging
|
13
|
+
|
14
|
+
|
15
|
+
def isQpsRunning(host='127.0.0.1', port=9822, timeout=0):
|
16
|
+
'''
|
17
|
+
This func will return true if QPS is running with a working QIS connection.
|
18
|
+
'''
|
19
|
+
myQps=None
|
20
|
+
logging.debug("Checking if QPS is running")
|
21
|
+
start = time.time()
|
22
|
+
while True:
|
23
|
+
try:
|
24
|
+
myQps = QpsInterface(host, port)
|
25
|
+
break
|
26
|
+
except Exception as e:
|
27
|
+
logging.debug("Error when making QPS interface. QPS may not be running.")
|
28
|
+
logging.debug(e)
|
29
|
+
if (time.time() - start) > timeout:
|
30
|
+
break
|
31
|
+
if myQps is None:
|
32
|
+
logging.debug("QPS is not running")
|
33
|
+
return False
|
34
|
+
|
35
|
+
logging.debug("Checking if QPS reports a QIS connection") # "$qis status" returns connected if it has ever had a QIS connection.
|
36
|
+
answer=0
|
37
|
+
counter=0
|
38
|
+
while True:
|
39
|
+
answer = myQps.sendCmdVerbose(cmd="$qis status")
|
40
|
+
if answer.lower()=="connected":
|
41
|
+
logging.debug("QPS Running With QIS Connected")
|
42
|
+
break
|
43
|
+
else:
|
44
|
+
logging.debug("QPS Running QIS NOT found. Waiting and retrying.")
|
45
|
+
time.sleep(0.5)
|
46
|
+
counter += 1
|
47
|
+
if counter > 5:
|
48
|
+
logging.debug("QPS Running QIS NOT found after "+str(counter)+" attempts.")
|
49
|
+
return False
|
50
|
+
|
51
|
+
logging.debug("Checking if QPS/QIS comms are running")
|
52
|
+
start = time.time()
|
53
|
+
while True:
|
54
|
+
try:
|
55
|
+
answer = myQps.sendCmdVerbose(cmd="$list")
|
56
|
+
break
|
57
|
+
except:
|
58
|
+
pass
|
59
|
+
if (time.time() - start) > timeout:
|
60
|
+
break
|
61
|
+
|
62
|
+
# check for a 1 showing the first module to be displayed, or a no module/device error message.
|
63
|
+
if answer[0] == "1" or "no device" in str(answer).lower() or "no module" in str(answer).lower():
|
64
|
+
logging.debug("QPS and QIS are running and responding with valid $list info")
|
65
|
+
return True
|
66
|
+
else:
|
67
|
+
logging.debug("QPS did not return expected output from $list")
|
68
|
+
logging.debug("$list: " + str(answer))
|
69
|
+
return False
|
70
|
+
|
71
|
+
|
72
|
+
def startLocalQps(keepQisRunning=False, args=[], timeout=30, startQPSMinimised=True):
|
73
|
+
if keepQisRunning:
|
74
|
+
if not isQisRunning():
|
75
|
+
startLocalQis()
|
76
|
+
if startQPSMinimised == True: #TODO add to release for QPS 1.38
|
77
|
+
args.append("CCS=MIN")
|
78
|
+
temp =""
|
79
|
+
args = temp.join(args)
|
80
|
+
|
81
|
+
QpsPath = os.path.dirname(os.path.abspath(__file__))
|
82
|
+
QpsPath, junk = os.path.split(QpsPath)
|
83
|
+
QpsPath = os.path.join(QpsPath, "connection_specific", "QPS", "qps.jar")
|
84
|
+
current_dir = os.getcwd()
|
85
|
+
os.chdir(os.path.dirname(QpsPath))
|
86
|
+
|
87
|
+
command = "java -jar \"" + QpsPath + "\"" + " " + str(args)
|
88
|
+
if "-logging=ON" in str(args): #If logging to a terminal window is on then os.system should be used to keep a window open to view logging.
|
89
|
+
os.system(command)
|
90
|
+
else:
|
91
|
+
if sys.version_info[0] < 3:
|
92
|
+
process = subprocess.Popen(command, stdout=subprocess.PIPE, stderr=subprocess.PIPE, shell=True)
|
93
|
+
else:
|
94
|
+
process = subprocess.Popen(command, stdout=subprocess.PIPE, stderr=subprocess.PIPE, text=True, shell=True)
|
95
|
+
|
96
|
+
startTime = time.time()
|
97
|
+
while not isQpsRunning():
|
98
|
+
time.sleep(0.2)
|
99
|
+
_get_std_msg_and_err_from_QPS_process(process)
|
100
|
+
if time.time() - startTime > timeout:
|
101
|
+
os.chdir(current_dir)
|
102
|
+
raise TimeoutError("QPS failed to launch within timelimit of " + str(timeout) + " sec.")
|
103
|
+
logging.debug("QPS detected after " + str(time.time() - startTime) + "s")
|
104
|
+
|
105
|
+
while not isQisRunning():
|
106
|
+
if time.time() - startTime > timeout:
|
107
|
+
raise TimeoutError(
|
108
|
+
"QPS did launch but QIS did not respond during the timeout time of " + str(timeout) + " sec.")
|
109
|
+
time.sleep(0.2)
|
110
|
+
logging.debug("QIS detected after " + str(time.time() - startTime) + "s")
|
111
|
+
|
112
|
+
# return current working directory
|
113
|
+
os.chdir(current_dir)
|
114
|
+
return
|
115
|
+
|
116
|
+
def reader(stream, q, source, lock,stop_flag):
|
117
|
+
'''
|
118
|
+
Used to read output and place it in a queue for multithreaded reading
|
119
|
+
:param stream:
|
120
|
+
:param q:
|
121
|
+
:param source:
|
122
|
+
:param lock: The lock for the queue
|
123
|
+
:param stop_flag: Flag to exit the loop and close the thread
|
124
|
+
:return: None
|
125
|
+
'''
|
126
|
+
while not stop_flag.is_set():
|
127
|
+
line = stream.readline()
|
128
|
+
if not line:
|
129
|
+
break
|
130
|
+
with lock:
|
131
|
+
q.put((source, line.strip()))
|
132
|
+
|
133
|
+
def _get_std_msg_and_err_from_QPS_process(process):
|
134
|
+
'''
|
135
|
+
Uses multithreading to check for stderr and stdmsg passed by the process that launches QPS
|
136
|
+
This allows the user to understand why QPS might not have appeared.
|
137
|
+
:param process: The Process Used to launch QPS
|
138
|
+
:return: None
|
139
|
+
'''
|
140
|
+
# Read back stdmsg and stderr in seperate threads so they are non blocking
|
141
|
+
q = Queue()
|
142
|
+
lock = Lock()
|
143
|
+
stop_flag = Event()
|
144
|
+
|
145
|
+
t1 = Thread(target=reader, args=[process.stdout, q, 'stdout', lock, stop_flag])
|
146
|
+
t2 = Thread(target=reader, args=[process.stderr, q, 'stderr', lock, stop_flag])
|
147
|
+
t1.start()
|
148
|
+
t2.start()
|
149
|
+
counter = 0
|
150
|
+
# check for stderr or stdmsg from the queue
|
151
|
+
while counter <= 3: # If 3 empty reads from the queue then move on to see if QPS is running.
|
152
|
+
try:
|
153
|
+
source, line = q.get(timeout=1) # Wait for 1 second for new lines
|
154
|
+
counter = 0
|
155
|
+
if source == "stderr":
|
156
|
+
logging.error(f"{source}: {line}")
|
157
|
+
else:
|
158
|
+
printText(f"{source}: {line}")
|
159
|
+
except Empty:
|
160
|
+
counter += 1
|
161
|
+
stop_flag.set() #Close the threads and return to the main loop where QPS is check to see if its started yet
|
162
|
+
|
163
|
+
|
164
|
+
def closeQps(host='127.0.0.1', port=9822):
|
165
|
+
myQps = QpsInterface(host, port)
|
166
|
+
myQps.sendCmdVerbose("$shutdown")
|
167
|
+
del myQps
|
168
|
+
time.sleep(1) #needed as calling "isQpsRunning()" will throw an error if it ties to connect while shutdown is in progress.
|
169
|
+
|
170
|
+
def GetQpsModuleSelection(QpsConnection, favouriteOnly=True, additionalOptions=['rescan', 'all con types', 'ip scan'], scan=True):
|
171
|
+
favourite = favouriteOnly
|
172
|
+
ip_address = None
|
173
|
+
while True:
|
174
|
+
printText("QPS scanning for devices")
|
175
|
+
tableHeaders = ["Module"]
|
176
|
+
# Request a list of all USB and LAN accessible power modules
|
177
|
+
if ip_address == None:
|
178
|
+
devList = QpsConnection.getDeviceList(scan=scan)
|
179
|
+
else:
|
180
|
+
devList = QpsConnection.getDeviceList(scan=scan, ipAddress=ip_address)
|
181
|
+
if "no device" in devList[0].lower() or "no module" in devList[0].lower():
|
182
|
+
favourite = False # If no device found conPref wont match and will bugout
|
183
|
+
|
184
|
+
# Removes rest devices
|
185
|
+
devList = [x for x in devList if "rest" not in x]
|
186
|
+
message = "Select a quarch module"
|
187
|
+
|
188
|
+
if (favourite):
|
189
|
+
index = 0
|
190
|
+
sortedDevList = []
|
191
|
+
conPref = ["USB", "TCP", "SERIAL", "REST", "TELNET"]
|
192
|
+
while len(sortedDevList) != len(devList):
|
193
|
+
for device in devList:
|
194
|
+
if conPref[index] in device.upper():
|
195
|
+
sortedDevList.append(device)
|
196
|
+
index += 1
|
197
|
+
devList = sortedDevList
|
198
|
+
|
199
|
+
# new dictionary only containing one favourite connection to each device.
|
200
|
+
favConDevList = []
|
201
|
+
index = 0
|
202
|
+
for device in sortedDevList:
|
203
|
+
if (favConDevList == [] or not device.split("::")[1] in str(favConDevList)):
|
204
|
+
favConDevList.append(device)
|
205
|
+
devList = favConDevList
|
206
|
+
|
207
|
+
if User_interface.instance != None and User_interface.instance.selectedInterface == "testcenter":
|
208
|
+
tempString = ""
|
209
|
+
for module in devList:
|
210
|
+
tempString+=module+"="+module+","
|
211
|
+
devList = tempString[0:-1]
|
212
|
+
|
213
|
+
|
214
|
+
myDeviceID = listSelection(title=message, message=message, selectionList=devList,
|
215
|
+
additionalOptions=additionalOptions, nice=True, tableHeaders=tableHeaders, indexReq=True)
|
216
|
+
|
217
|
+
if myDeviceID in 'rescan':
|
218
|
+
ip_address = None
|
219
|
+
favourite = True
|
220
|
+
continue
|
221
|
+
elif myDeviceID in 'all con types':
|
222
|
+
printText('Displaying all conection types...')
|
223
|
+
favourite = False
|
224
|
+
continue
|
225
|
+
elif myDeviceID in 'ip scan':
|
226
|
+
ip_address = requestDialog("Please input IP Address of the module you would like to connect to: ")
|
227
|
+
favourite = False
|
228
|
+
continue
|
229
|
+
else:
|
230
|
+
return myDeviceID
|
231
|
+
|
232
|
+
|
233
|
+
|
234
|
+
|
235
|
+
'''
|
236
|
+
Legacy function to handle old scripts which call an adjustTime function to get QPS format time.
|
237
|
+
This is now done in the QPS module level, so this function returns a integer linux millisecond value
|
238
|
+
as per the old one
|
239
|
+
'''
|
240
|
+
|
241
|
+
|
242
|
+
def legacyAdjustTime(timestamp):
|
243
|
+
return timestamp
|
244
|
+
|
245
|
+
|
246
|
+
'''
|
247
|
+
Simple function to convert a timestamp or Python datetime object into QPS format time
|
248
|
+
QPS requires time in mS with no decimal point, so this is converted here
|
249
|
+
'''
|
250
|
+
|
251
|
+
|
252
|
+
def toQpsTimeStamp(timestamp):
|
253
|
+
"""
|
254
|
+
DEPRECATED - QPS expects time passed as a string and error handling is done in QPS.
|
255
|
+
Returns the parameter passed as a valid qps timestamp
|
256
|
+
Assumes
|
257
|
+
|
258
|
+
# 1620817118182 - ACCEPTED value for QPS - Milliseconds, 13 chars
|
259
|
+
|
260
|
+
# 1620817126 - time.time() Value - Seconds
|
261
|
+
|
262
|
+
:param int/float/datetime: Timestamp, mS
|
263
|
+
:return: int : QPS valid time, mS
|
264
|
+
"""
|
265
|
+
|
266
|
+
# Python datetime object
|
267
|
+
if (type(timestamp) is datetime):
|
268
|
+
newTime = time.mktime(timestamp.timetuple())
|
269
|
+
return int(newTime * 1000)
|
270
|
+
# If numeric, assume standard unix time in milliseconds
|
271
|
+
elif (type(timestamp) is float or type(timestamp) is int):
|
272
|
+
return int(timestamp)
|
273
|
+
else:
|
274
|
+
# Try if its a numeric value string first (assumed to be milliseconds)
|
275
|
+
try:
|
276
|
+
timestamp = float(timestamp)
|
277
|
+
return int(timestamp)
|
278
|
+
# Fall back to assuming a standard format time string
|
279
|
+
except:
|
280
|
+
newTime = time.mktime(datetime.datetime.strptime(timestamp, "%Y-%m-%d %H:%M:%S:%f").timetuple())
|
281
|
+
return int(newTime * 1000)
|
Binary file
|
Binary file
|
@@ -292,13 +292,15 @@ printProgressBar (iteration,total,prefix='',suffix='',decimals=1,length=100,fill
|
|
292
292
|
|
293
293
|
'''
|
294
294
|
def progressBar(iteration, total, prefix='', suffix='', decimals=1, fill='█', fullWidth=100):
|
295
|
+
iteration = float(iteration)
|
296
|
+
total = float(total)
|
295
297
|
if iteration >= 0 and total > 0:
|
296
298
|
|
297
299
|
if User_interface.instance != None and User_interface.instance.selectedInterface == "testcenter":
|
298
300
|
TestCenter.testPoint ("Quarch_Host.ShowTaskProgress","Title=Task Progress", "Iteration="+str(int(iteration)), "Total="+str(int(total)), stack_level=2);
|
299
301
|
|
300
302
|
else:
|
301
|
-
percent = ("{0:." + str(decimals) + "f}").format(100 * (iteration /
|
303
|
+
percent = ("{0:." + str(decimals) + "f}").format(100 * (iteration / total))
|
302
304
|
length = fullWidth - (len(prefix)+len(suffix)+len(percent) +4) #the length of the bar must scale acording to anything else on the line
|
303
305
|
|
304
306
|
filledLength = int(length * iteration // total)
|
Binary file
|
Binary file
|
Binary file
|
Binary file
|
@@ -1,6 +1,6 @@
|
|
1
1
|
Metadata-Version: 2.1
|
2
2
|
Name: quarchpy
|
3
|
-
Version: 2.1.
|
3
|
+
Version: 2.1.25
|
4
4
|
Summary: This packpage offers Python support for Quarch Technology modules.
|
5
5
|
Author: Quarch Technology ltd
|
6
6
|
Author-email: support@quarch.com
|
@@ -36,6 +36,15 @@ Quarchpy
|
|
36
36
|
Change Log
|
37
37
|
----------
|
38
38
|
|
39
|
+
2.1.25
|
40
|
+
------
|
41
|
+
- New QPS 1.40 and Qis 1.43
|
42
|
+
- mdns scanning added to quarchpy
|
43
|
+
|
44
|
+
2.1.24
|
45
|
+
------
|
46
|
+
- Yanked
|
47
|
+
|
39
48
|
2.1.23
|
40
49
|
------
|
41
50
|
- QIS and QPS devices and interfaces can use sendCommand to send comannds to the modules and to the applications uniformly
|