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

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (166) hide show
  1. quarchpy/.idea/misc.xml +4 -1
  2. quarchpy/.idea/modules.xml +0 -1
  3. quarchpy/.idea/quarchpy.iml +1 -2
  4. quarchpy/.idea/workspace.xml +28 -72
  5. quarchpy/_version.py +1 -1
  6. quarchpy/config_files/__pycache__/__init__.cpython-313.pyc +0 -0
  7. quarchpy/config_files/__pycache__/quarch_config_parser.cpython-313.pyc +0 -0
  8. quarchpy/connection_specific/QPS/win-amd64/app.jar +0 -0
  9. quarchpy/connection_specific/QPS/win-amd64/qis/README.txt +2 -2
  10. quarchpy/connection_specific/QPS/win-amd64/qis/help.txt +2 -2
  11. quarchpy/connection_specific/QPS/win-amd64/qis/qis.jar +0 -0
  12. quarchpy/connection_specific/QPS/win-amd64/qis/qis_lib/{CInterface-2.2.jar → CInterface-2.3.jar} +0 -0
  13. quarchpy/connection_specific/QPS/win-amd64/qis/qis_lib/QuarchCommon-2.0.jar +0 -0
  14. quarchpy/connection_specific/QPS/win-amd64/qis/qis_lib/TorridonCommon-1.0.jar +0 -0
  15. quarchpy/connection_specific/QPS/win-amd64/qis/qis_lib/jmdns-3.6.0.jar +0 -0
  16. quarchpy/connection_specific/QPS/win-amd64/qis/qis_lib/usb4java-1.3.1.jar +0 -0
  17. quarchpy/connection_specific/QPS/win-amd64/qps-command-reference.html +331 -0
  18. quarchpy/connection_specific/QPS/win-amd64/qps_lib/JFXUtilities-1.0.jar +0 -0
  19. quarchpy/connection_specific/QPS/win-amd64/qps_lib/QuarchCommon-2.0.jar +0 -0
  20. quarchpy/connection_specific/QPS/win-amd64/qps_lib/lin-x64/{javafx-base-21.0.4-linux.jar → javafx-base-21.0.5-linux.jar} +0 -0
  21. quarchpy/connection_specific/QPS/win-amd64/qps_lib/lin-x64/{javafx-controls-21.0.4-linux.jar → javafx-controls-21.0.5-linux.jar} +0 -0
  22. quarchpy/connection_specific/QPS/win-amd64/qps_lib/lin-x64/{javafx-fxml-21.0.4-linux.jar → javafx-fxml-21.0.5-linux.jar} +0 -0
  23. quarchpy/connection_specific/QPS/win-amd64/qps_lib/lin-x64/{javafx-graphics-21.0.4-linux.jar → javafx-graphics-21.0.5-linux.jar} +0 -0
  24. quarchpy/connection_specific/QPS/win-amd64/qps_lib/lin-x64/{javafx-swing-21.0.4-linux.jar → javafx-swing-21.0.5-linux.jar} +0 -0
  25. quarchpy/connection_specific/QPS/win-amd64/qps_lib/mac-arm64/{javafx-base-21.0.4-mac-aarch64.jar → javafx-base-21.0.5-mac-aarch64.jar} +0 -0
  26. quarchpy/connection_specific/QPS/win-amd64/qps_lib/mac-arm64/{javafx-controls-21.0.4-mac-aarch64.jar → javafx-controls-21.0.5-mac-aarch64.jar} +0 -0
  27. quarchpy/connection_specific/QPS/win-amd64/qps_lib/mac-arm64/{javafx-fxml-21.0.4-mac-aarch64.jar → javafx-fxml-21.0.5-mac-aarch64.jar} +0 -0
  28. quarchpy/connection_specific/QPS/win-amd64/qps_lib/mac-arm64/{javafx-graphics-21.0.4-mac-aarch64.jar → javafx-graphics-21.0.5-mac-aarch64.jar} +0 -0
  29. quarchpy/connection_specific/QPS/win-amd64/qps_lib/mac-arm64/{javafx-swing-21.0.4-mac-aarch64.jar → javafx-swing-21.0.5-mac-aarch64.jar} +0 -0
  30. quarchpy/connection_specific/QPS/win-amd64/qps_lib/mac-x64/{javafx-base-21.0.4-mac.jar → javafx-base-21.0.5-mac.jar} +0 -0
  31. quarchpy/connection_specific/QPS/win-amd64/qps_lib/mac-x64/{javafx-controls-21.0.4-mac.jar → javafx-controls-21.0.5-mac.jar} +0 -0
  32. quarchpy/connection_specific/QPS/win-amd64/qps_lib/mac-x64/{javafx-fxml-21.0.4-mac.jar → javafx-fxml-21.0.5-mac.jar} +0 -0
  33. quarchpy/connection_specific/QPS/win-amd64/qps_lib/mac-x64/{javafx-graphics-21.0.4-mac.jar → javafx-graphics-21.0.5-mac.jar} +0 -0
  34. quarchpy/connection_specific/QPS/win-amd64/qps_lib/mac-x64/{javafx-swing-21.0.4-mac.jar → javafx-swing-21.0.5-mac.jar} +0 -0
  35. quarchpy/connection_specific/QPS/win-amd64/qps_lib/win-x64/{javafx-base-21.0.4-win.jar → javafx-base-21.0.5-win.jar} +0 -0
  36. quarchpy/connection_specific/QPS/win-amd64/qps_lib/win-x64/{javafx-controls-21.0.4-win.jar → javafx-controls-21.0.5-win.jar} +0 -0
  37. quarchpy/connection_specific/QPS/win-amd64/qps_lib/win-x64/{javafx-fxml-21.0.4-win.jar → javafx-fxml-21.0.5-win.jar} +0 -0
  38. quarchpy/connection_specific/QPS/win-amd64/qps_lib/win-x64/{javafx-graphics-21.0.4-win.jar → javafx-graphics-21.0.5-win.jar} +0 -0
  39. quarchpy/connection_specific/QPS/win-amd64/qps_lib/win-x64/{javafx-swing-21.0.4-win.jar → javafx-swing-21.0.5-win.jar} +0 -0
  40. quarchpy/connection_specific/QPS/win-amd64/scriptCommands.txt +59 -3
  41. quarchpy/connection_specific/QPS/win-amd64/whats-new.txt +12 -20
  42. quarchpy/connection_specific/__pycache__/StreamChannels.cpython-313.pyc +0 -0
  43. quarchpy/connection_specific/__pycache__/__init__.cpython-313.pyc +0 -0
  44. quarchpy/connection_specific/__pycache__/connection_QIS.cpython-313.pyc +0 -0
  45. quarchpy/connection_specific/__pycache__/connection_QPS.cpython-313.pyc +0 -0
  46. quarchpy/connection_specific/__pycache__/connection_ReST.cpython-313.pyc +0 -0
  47. quarchpy/connection_specific/__pycache__/connection_Serial.cpython-313.pyc +0 -0
  48. quarchpy/connection_specific/__pycache__/connection_TCP.cpython-313.pyc +0 -0
  49. quarchpy/connection_specific/__pycache__/connection_Telnet.cpython-313.pyc +0 -0
  50. quarchpy/connection_specific/__pycache__/connection_USB.cpython-313.pyc +0 -0
  51. quarchpy/connection_specific/__pycache__/mDNS.cpython-313.pyc +0 -0
  52. quarchpy/connection_specific/connection_QPS.py +7 -3
  53. quarchpy/connection_specific/connection_QPS.py.bak +242 -0
  54. quarchpy/connection_specific/jdk_j21_jres/__pycache__/__init__.cpython-313.pyc +0 -0
  55. quarchpy/connection_specific/jdk_j21_jres/__pycache__/fix_permissions.cpython-313.pyc +0 -0
  56. quarchpy/connection_specific/serial/__pycache__/__init__.cpython-313.pyc +0 -0
  57. quarchpy/connection_specific/serial/__pycache__/serialutil.cpython-313.pyc +0 -0
  58. quarchpy/connection_specific/serial/__pycache__/serialwin32.cpython-313.pyc +0 -0
  59. quarchpy/connection_specific/serial/__pycache__/win32.cpython-313.pyc +0 -0
  60. quarchpy/connection_specific/serial/tools/__pycache__/__init__.cpython-313.pyc +0 -0
  61. quarchpy/connection_specific/serial/tools/__pycache__/list_ports.cpython-313.pyc +0 -0
  62. quarchpy/connection_specific/serial/tools/__pycache__/list_ports_common.cpython-313.pyc +0 -0
  63. quarchpy/connection_specific/serial/tools/__pycache__/list_ports_windows.cpython-313.pyc +0 -0
  64. quarchpy/debug/__pycache__/SystemTest.cpython-313.pyc +0 -0
  65. quarchpy/debug/__pycache__/__init__.cpython-313.pyc +0 -0
  66. quarchpy/debug/__pycache__/module_debug.cpython-313.pyc +0 -0
  67. quarchpy/debug/__pycache__/simple_terminal.cpython-313.pyc +0 -0
  68. quarchpy/debug/__pycache__/upgrade_quarchpy.cpython-313.pyc +0 -0
  69. quarchpy/debug/__pycache__/versionCompare.cpython-313.pyc +0 -0
  70. quarchpy/device/__pycache__/__init__.cpython-313.pyc +0 -0
  71. quarchpy/device/__pycache__/device.cpython-313.pyc +0 -0
  72. quarchpy/device/__pycache__/quarchArray.cpython-313.pyc +0 -0
  73. quarchpy/device/__pycache__/quarchPPM.cpython-313.pyc +0 -0
  74. quarchpy/device/__pycache__/quarchQPS.cpython-313.pyc +0 -0
  75. quarchpy/device/__pycache__/scanDevices.cpython-313.pyc +0 -0
  76. quarchpy/device/quarchPPM.py +1 -1
  77. quarchpy/disk_test/__pycache__/AbsDiskFinder.cpython-313.pyc +0 -0
  78. quarchpy/disk_test/__pycache__/DiskTargetSelection.cpython-313.pyc +0 -0
  79. quarchpy/disk_test/__pycache__/__init__.cpython-313.pyc +0 -0
  80. quarchpy/disk_test/__pycache__/iometerDiskFinder.cpython-313.pyc +0 -0
  81. quarchpy/docs/CHANGES.rst +17 -0
  82. quarchpy/docs/_build/doctrees/CHANGES.doctree +0 -0
  83. quarchpy/docs/_build/doctrees/environment.pickle +0 -0
  84. quarchpy/docs/_build/doctrees/index.doctree +0 -0
  85. quarchpy/docs/_build/doctrees/readme.doctree +0 -0
  86. quarchpy/docs/_build/doctrees/source/changelog.doctree +0 -0
  87. quarchpy/docs/_build/doctrees/source/licenses.doctree +0 -0
  88. quarchpy/docs/_build/doctrees/source/modules.doctree +0 -0
  89. quarchpy/docs/_build/doctrees/source/quarchpy.calibration.doctree +0 -0
  90. quarchpy/docs/_build/doctrees/source/quarchpy.config_files.doctree +0 -0
  91. quarchpy/docs/_build/doctrees/source/quarchpy.connection_specific.doctree +0 -0
  92. quarchpy/docs/_build/doctrees/source/quarchpy.debug.doctree +0 -0
  93. quarchpy/docs/_build/doctrees/source/quarchpy.device.doctree +0 -0
  94. quarchpy/docs/_build/doctrees/source/quarchpy.disk_test.doctree +0 -0
  95. quarchpy/docs/_build/doctrees/source/quarchpy.doctree +0 -0
  96. quarchpy/docs/_build/doctrees/source/quarchpy.fio.doctree +0 -0
  97. quarchpy/docs/_build/doctrees/source/quarchpy.iometer.doctree +0 -0
  98. quarchpy/docs/_build/doctrees/source/quarchpy.qis.doctree +0 -0
  99. quarchpy/docs/_build/doctrees/source/quarchpy.qps.doctree +0 -0
  100. quarchpy/docs/_build/doctrees/source/quarchpy.user_interface.doctree +0 -0
  101. quarchpy/docs/_build/doctrees/source/quarchpy.utilities.doctree +0 -0
  102. quarchpy/docs/_build/doctrees/source/readme.doctree +0 -0
  103. quarchpy/docs/_build/html/.buildinfo +2 -2
  104. quarchpy/docs/_build/html/.buildinfo.bak +4 -0
  105. quarchpy/docs/_build/html/CHANGES.html +176 -150
  106. quarchpy/docs/_build/html/_sources/CHANGES.rst.txt +14 -0
  107. quarchpy/docs/_build/html/_static/alabaster.css +47 -87
  108. quarchpy/docs/_build/html/_static/basic.css +3 -14
  109. quarchpy/docs/_build/html/_static/doctools.js +0 -7
  110. quarchpy/docs/_build/html/_static/github-banner.svg +5 -0
  111. quarchpy/docs/_build/html/_static/language_data.js +1 -8
  112. quarchpy/docs/_build/html/_static/pygments.css +2 -1
  113. quarchpy/docs/_build/html/_static/searchtools.js +129 -71
  114. quarchpy/docs/_build/html/genindex.html +22 -55
  115. quarchpy/docs/_build/html/index.html +90 -85
  116. quarchpy/docs/_build/html/objects.inv +0 -0
  117. quarchpy/docs/_build/html/py-modindex.html +20 -29
  118. quarchpy/docs/_build/html/readme.html +20 -19
  119. quarchpy/docs/_build/html/search.html +14 -14
  120. quarchpy/docs/_build/html/searchindex.js +1 -1
  121. quarchpy/docs/_build/html/source/changelog.html +246 -216
  122. quarchpy/docs/_build/html/source/licenses.html +20 -19
  123. quarchpy/docs/_build/html/source/modules.html +22 -21
  124. quarchpy/docs/_build/html/source/quarchpy.calibration.html +20 -19
  125. quarchpy/docs/_build/html/source/quarchpy.config_files.html +20 -19
  126. quarchpy/docs/_build/html/source/quarchpy.connection_specific.html +22 -37
  127. quarchpy/docs/_build/html/source/quarchpy.debug.html +20 -19
  128. quarchpy/docs/_build/html/source/quarchpy.device.html +21 -20
  129. quarchpy/docs/_build/html/source/quarchpy.disk_test.html +20 -19
  130. quarchpy/docs/_build/html/source/quarchpy.fio.html +22 -47
  131. quarchpy/docs/_build/html/source/quarchpy.html +22 -37
  132. quarchpy/docs/_build/html/source/quarchpy.iometer.html +26 -25
  133. quarchpy/docs/_build/html/source/quarchpy.qis.html +20 -19
  134. quarchpy/docs/_build/html/source/quarchpy.qps.html +20 -19
  135. quarchpy/docs/_build/html/source/quarchpy.user_interface.html +20 -19
  136. quarchpy/docs/_build/html/source/quarchpy.utilities.html +20 -19
  137. quarchpy/docs/_build/html/source/readme.html +20 -19
  138. quarchpy/fio/FIO_interface.py +255 -1
  139. quarchpy/fio/FIO_interface.py.bak +317 -0
  140. quarchpy/fio/__pycache__/FIO_interface.cpython-313.pyc +0 -0
  141. quarchpy/fio/__pycache__/__init__.cpython-313.pyc +0 -0
  142. quarchpy/fio/__pycache__/fioDiskFinder.cpython-313.pyc +0 -0
  143. quarchpy/iometer/__pycache__/__init__.cpython-313.pyc +0 -0
  144. quarchpy/iometer/__pycache__/gen_iometer_template.cpython-313.pyc +0 -0
  145. quarchpy/iometer/__pycache__/iometerFuncs.cpython-313.pyc +0 -0
  146. quarchpy/qis/__pycache__/StreamHeaderInfo.cpython-313.pyc +0 -0
  147. quarchpy/qis/__pycache__/__init__.cpython-313.pyc +0 -0
  148. quarchpy/qis/__pycache__/qisFuncs.cpython-313.pyc +0 -0
  149. quarchpy/qps/__pycache__/__init__.cpython-313.pyc +0 -0
  150. quarchpy/qps/__pycache__/qpsFuncs.cpython-313.pyc +0 -0
  151. quarchpy/qps/qpsFuncs.py +1 -1
  152. quarchpy/user_interface/__pycache__/__init__.cpython-313.pyc +0 -0
  153. quarchpy/user_interface/__pycache__/user_interface.cpython-313.pyc +0 -0
  154. quarchpy/utilities/__pycache__/TestCenter.cpython-313.pyc +0 -0
  155. quarchpy/utilities/__pycache__/TimeValue.cpython-313.pyc +0 -0
  156. quarchpy/utilities/__pycache__/Version.cpython-313.pyc +0 -0
  157. quarchpy/utilities/__pycache__/__init__.cpython-313.pyc +0 -0
  158. {quarchpy-2.2.5.dist-info → quarchpy-2.2.7.dev1.dist-info}/METADATA +29 -3
  159. {quarchpy-2.2.5.dist-info → quarchpy-2.2.7.dev1.dist-info}/RECORD +161 -104
  160. {quarchpy-2.2.5.dist-info → quarchpy-2.2.7.dev1.dist-info}/WHEEL +1 -1
  161. quarchpy/__pycache__/__init__.cpython-311.pyc +0 -0
  162. quarchpy/__pycache__/_version.cpython-311.pyc +0 -0
  163. quarchpy/__pycache__/connection.cpython-311.pyc +0 -0
  164. quarchpy/__pycache__/run.cpython-311.pyc +0 -0
  165. quarchpy/connection_specific/QPS/win-amd64/qis/qis_lib/jmdns-3.5.9.jar +0 -0
  166. {quarchpy-2.2.5.dist-info → quarchpy-2.2.7.dev1.dist-info}/top_level.txt +0 -0
@@ -6,10 +6,11 @@
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.qps package &#8212; quarchpy documentation</title>
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" />
9
+ <link rel="stylesheet" type="text/css" href="../_static/pygments.css?v=d1102ebc" />
10
+ <link rel="stylesheet" type="text/css" href="../_static/basic.css?v=686e5160" />
11
+ <link rel="stylesheet" type="text/css" href="../_static/alabaster.css?v=27fed22d" />
11
12
  <script src="../_static/documentation_options.js?v=5929fcd5"></script>
12
- <script src="../_static/doctools.js?v=888ff710"></script>
13
+ <script src="../_static/doctools.js?v=9bcbadda"></script>
13
14
  <script src="../_static/sphinx_highlight.js?v=dc90522c"></script>
14
15
  <link rel="index" title="Index" href="../genindex.html" />
15
16
  <link rel="search" title="Search" href="../search.html" />
@@ -18,8 +19,9 @@
18
19
 
19
20
  <link rel="stylesheet" href="../_static/custom.css" type="text/css" />
20
21
 
22
+
23
+
21
24
 
22
- <meta name="viewport" content="width=device-width, initial-scale=0.9, maximum-scale=0.9" />
23
25
 
24
26
  </head><body>
25
27
 
@@ -109,7 +111,7 @@
109
111
 
110
112
  </div>
111
113
  </div>
112
- <div class="sphinxsidebar" role="navigation" aria-label="main navigation">
114
+ <div class="sphinxsidebar" role="navigation" aria-label="Main">
113
115
  <div class="sphinxsidebarwrapper">
114
116
  <h1 class="logo"><a href="../index.html">quarchpy</a></h1>
115
117
 
@@ -120,7 +122,16 @@
120
122
 
121
123
 
122
124
 
123
- <h3>Navigation</h3>
125
+
126
+ <search id="searchbox" style="display: none" role="search">
127
+ <div class="searchformwrapper">
128
+ <form class="search" action="../search.html" method="get">
129
+ <input type="text" name="q" aria-labelledby="searchlabel" autocomplete="off" autocorrect="off" autocapitalize="off" spellcheck="false" placeholder="Search"/>
130
+ <input type="submit" value="Go" />
131
+ </form>
132
+ </div>
133
+ </search>
134
+ <script>document.getElementById('searchbox').style.display = "block"</script><h3>Navigation</h3>
124
135
  <p class="caption" role="heading"><span class="caption-text">Contents:</span></p>
125
136
  <ul class="current">
126
137
  <li class="toctree-l1"><a class="reference internal" href="changelog.html">Changelog (Quarchpy)</a></li>
@@ -145,16 +156,6 @@
145
156
  </ul></li>
146
157
  </ul>
147
158
  </div>
148
- <div id="searchbox" style="display: none" role="search">
149
- <h3 id="searchlabel">Quick search</h3>
150
- <div class="searchformwrapper">
151
- <form class="search" action="../search.html" method="get">
152
- <input type="text" name="q" aria-labelledby="searchlabel" autocomplete="off" autocorrect="off" autocapitalize="off" spellcheck="false"/>
153
- <input type="submit" value="Go" />
154
- </form>
155
- </div>
156
- </div>
157
- <script>document.getElementById('searchbox').style.display = "block"</script>
158
159
 
159
160
 
160
161
 
@@ -168,11 +169,11 @@
168
169
  <div class="clearer"></div>
169
170
  </div>
170
171
  <div class="footer">
171
- &copy;2020, Quarch Technology Ltd.
172
+ &#169;2020, Quarch Technology Ltd.
172
173
 
173
174
  |
174
- Powered by <a href="http://sphinx-doc.org/">Sphinx 7.2.6</a>
175
- &amp; <a href="https://github.com/bitprophet/alabaster">Alabaster 0.7.13</a>
175
+ Powered by <a href="https://www.sphinx-doc.org/">Sphinx 8.1.3</a>
176
+ &amp; <a href="https://alabaster.readthedocs.io">Alabaster 1.0.0</a>
176
177
 
177
178
  |
178
179
  <a href="../_sources/source/quarchpy.qps.rst.txt"
@@ -6,10 +6,11 @@
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.user_interface package &#8212; quarchpy documentation</title>
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" />
9
+ <link rel="stylesheet" type="text/css" href="../_static/pygments.css?v=d1102ebc" />
10
+ <link rel="stylesheet" type="text/css" href="../_static/basic.css?v=686e5160" />
11
+ <link rel="stylesheet" type="text/css" href="../_static/alabaster.css?v=27fed22d" />
11
12
  <script src="../_static/documentation_options.js?v=5929fcd5"></script>
12
- <script src="../_static/doctools.js?v=888ff710"></script>
13
+ <script src="../_static/doctools.js?v=9bcbadda"></script>
13
14
  <script src="../_static/sphinx_highlight.js?v=dc90522c"></script>
14
15
  <link rel="index" title="Index" href="../genindex.html" />
15
16
  <link rel="search" title="Search" href="../search.html" />
@@ -18,8 +19,9 @@
18
19
 
19
20
  <link rel="stylesheet" href="../_static/custom.css" type="text/css" />
20
21
 
22
+
23
+
21
24
 
22
- <meta name="viewport" content="width=device-width, initial-scale=0.9, maximum-scale=0.9" />
23
25
 
24
26
  </head><body>
25
27
 
@@ -201,7 +203,7 @@ interaction. The UI can be the terminal or TestCenter</p>
201
203
 
202
204
  </div>
203
205
  </div>
204
- <div class="sphinxsidebar" role="navigation" aria-label="main navigation">
206
+ <div class="sphinxsidebar" role="navigation" aria-label="Main">
205
207
  <div class="sphinxsidebarwrapper">
206
208
  <h1 class="logo"><a href="../index.html">quarchpy</a></h1>
207
209
 
@@ -212,7 +214,16 @@ interaction. The UI can be the terminal or TestCenter</p>
212
214
 
213
215
 
214
216
 
215
- <h3>Navigation</h3>
217
+
218
+ <search id="searchbox" style="display: none" role="search">
219
+ <div class="searchformwrapper">
220
+ <form class="search" action="../search.html" method="get">
221
+ <input type="text" name="q" aria-labelledby="searchlabel" autocomplete="off" autocorrect="off" autocapitalize="off" spellcheck="false" placeholder="Search"/>
222
+ <input type="submit" value="Go" />
223
+ </form>
224
+ </div>
225
+ </search>
226
+ <script>document.getElementById('searchbox').style.display = "block"</script><h3>Navigation</h3>
216
227
  <p class="caption" role="heading"><span class="caption-text">Contents:</span></p>
217
228
  <ul class="current">
218
229
  <li class="toctree-l1"><a class="reference internal" href="changelog.html">Changelog (Quarchpy)</a></li>
@@ -237,16 +248,6 @@ interaction. The UI can be the terminal or TestCenter</p>
237
248
  </ul></li>
238
249
  </ul>
239
250
  </div>
240
- <div id="searchbox" style="display: none" role="search">
241
- <h3 id="searchlabel">Quick search</h3>
242
- <div class="searchformwrapper">
243
- <form class="search" action="../search.html" method="get">
244
- <input type="text" name="q" aria-labelledby="searchlabel" autocomplete="off" autocorrect="off" autocapitalize="off" spellcheck="false"/>
245
- <input type="submit" value="Go" />
246
- </form>
247
- </div>
248
- </div>
249
- <script>document.getElementById('searchbox').style.display = "block"</script>
250
251
 
251
252
 
252
253
 
@@ -260,11 +261,11 @@ interaction. The UI can be the terminal or TestCenter</p>
260
261
  <div class="clearer"></div>
261
262
  </div>
262
263
  <div class="footer">
263
- &copy;2020, Quarch Technology Ltd.
264
+ &#169;2020, Quarch Technology Ltd.
264
265
 
265
266
  |
266
- Powered by <a href="http://sphinx-doc.org/">Sphinx 7.2.6</a>
267
- &amp; <a href="https://github.com/bitprophet/alabaster">Alabaster 0.7.13</a>
267
+ Powered by <a href="https://www.sphinx-doc.org/">Sphinx 8.1.3</a>
268
+ &amp; <a href="https://alabaster.readthedocs.io">Alabaster 1.0.0</a>
268
269
 
269
270
  |
270
271
  <a href="../_sources/source/quarchpy.user_interface.rst.txt"
@@ -6,10 +6,11 @@
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 &#8212; quarchpy documentation</title>
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" />
9
+ <link rel="stylesheet" type="text/css" href="../_static/pygments.css?v=d1102ebc" />
10
+ <link rel="stylesheet" type="text/css" href="../_static/basic.css?v=686e5160" />
11
+ <link rel="stylesheet" type="text/css" href="../_static/alabaster.css?v=27fed22d" />
11
12
  <script src="../_static/documentation_options.js?v=5929fcd5"></script>
12
- <script src="../_static/doctools.js?v=888ff710"></script>
13
+ <script src="../_static/doctools.js?v=9bcbadda"></script>
13
14
  <script src="../_static/sphinx_highlight.js?v=dc90522c"></script>
14
15
  <link rel="index" title="Index" href="../genindex.html" />
15
16
  <link rel="search" title="Search" href="../search.html" />
@@ -18,8 +19,9 @@
18
19
 
19
20
  <link rel="stylesheet" href="../_static/custom.css" type="text/css" />
20
21
 
22
+
23
+
21
24
 
22
- <meta name="viewport" content="width=device-width, initial-scale=0.9, maximum-scale=0.9" />
23
25
 
24
26
  </head><body>
25
27
 
@@ -134,7 +136,7 @@ on the reporting of the results.</p>
134
136
 
135
137
  </div>
136
138
  </div>
137
- <div class="sphinxsidebar" role="navigation" aria-label="main navigation">
139
+ <div class="sphinxsidebar" role="navigation" aria-label="Main">
138
140
  <div class="sphinxsidebarwrapper">
139
141
  <h1 class="logo"><a href="../index.html">quarchpy</a></h1>
140
142
 
@@ -145,7 +147,16 @@ on the reporting of the results.</p>
145
147
 
146
148
 
147
149
 
148
- <h3>Navigation</h3>
150
+
151
+ <search id="searchbox" style="display: none" role="search">
152
+ <div class="searchformwrapper">
153
+ <form class="search" action="../search.html" method="get">
154
+ <input type="text" name="q" aria-labelledby="searchlabel" autocomplete="off" autocorrect="off" autocapitalize="off" spellcheck="false" placeholder="Search"/>
155
+ <input type="submit" value="Go" />
156
+ </form>
157
+ </div>
158
+ </search>
159
+ <script>document.getElementById('searchbox').style.display = "block"</script><h3>Navigation</h3>
149
160
  <p class="caption" role="heading"><span class="caption-text">Contents:</span></p>
150
161
  <ul class="current">
151
162
  <li class="toctree-l1"><a class="reference internal" href="changelog.html">Changelog (Quarchpy)</a></li>
@@ -170,16 +181,6 @@ on the reporting of the results.</p>
170
181
  </ul></li>
171
182
  </ul>
172
183
  </div>
173
- <div id="searchbox" style="display: none" role="search">
174
- <h3 id="searchlabel">Quick search</h3>
175
- <div class="searchformwrapper">
176
- <form class="search" action="../search.html" method="get">
177
- <input type="text" name="q" aria-labelledby="searchlabel" autocomplete="off" autocorrect="off" autocapitalize="off" spellcheck="false"/>
178
- <input type="submit" value="Go" />
179
- </form>
180
- </div>
181
- </div>
182
- <script>document.getElementById('searchbox').style.display = "block"</script>
183
184
 
184
185
 
185
186
 
@@ -193,11 +194,11 @@ on the reporting of the results.</p>
193
194
  <div class="clearer"></div>
194
195
  </div>
195
196
  <div class="footer">
196
- &copy;2020, Quarch Technology Ltd.
197
+ &#169;2020, Quarch Technology Ltd.
197
198
 
198
199
  |
199
- Powered by <a href="http://sphinx-doc.org/">Sphinx 7.2.6</a>
200
- &amp; <a href="https://github.com/bitprophet/alabaster">Alabaster 0.7.13</a>
200
+ Powered by <a href="https://www.sphinx-doc.org/">Sphinx 8.1.3</a>
201
+ &amp; <a href="https://alabaster.readthedocs.io">Alabaster 1.0.0</a>
201
202
 
202
203
  |
203
204
  <a href="../_sources/source/quarchpy.utilities.rst.txt"
@@ -6,10 +6,11 @@
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 &#8212; quarchpy documentation</title>
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" />
9
+ <link rel="stylesheet" type="text/css" href="../_static/pygments.css?v=d1102ebc" />
10
+ <link rel="stylesheet" type="text/css" href="../_static/basic.css?v=686e5160" />
11
+ <link rel="stylesheet" type="text/css" href="../_static/alabaster.css?v=27fed22d" />
11
12
  <script src="../_static/documentation_options.js?v=5929fcd5"></script>
12
- <script src="../_static/doctools.js?v=888ff710"></script>
13
+ <script src="../_static/doctools.js?v=9bcbadda"></script>
13
14
  <script src="../_static/sphinx_highlight.js?v=dc90522c"></script>
14
15
  <link rel="index" title="Index" href="../genindex.html" />
15
16
  <link rel="search" title="Search" href="../search.html" />
@@ -18,8 +19,9 @@
18
19
 
19
20
  <link rel="stylesheet" href="../_static/custom.css" type="text/css" />
20
21
 
22
+
23
+
21
24
 
22
- <meta name="viewport" content="width=device-width, initial-scale=0.9, maximum-scale=0.9" />
23
25
 
24
26
  </head><body>
25
27
 
@@ -71,7 +73,7 @@
71
73
 
72
74
  </div>
73
75
  </div>
74
- <div class="sphinxsidebar" role="navigation" aria-label="main navigation">
76
+ <div class="sphinxsidebar" role="navigation" aria-label="Main">
75
77
  <div class="sphinxsidebarwrapper">
76
78
  <h1 class="logo"><a href="../index.html">quarchpy</a></h1>
77
79
 
@@ -82,7 +84,16 @@
82
84
 
83
85
 
84
86
 
85
- <h3>Navigation</h3>
87
+
88
+ <search id="searchbox" style="display: none" role="search">
89
+ <div class="searchformwrapper">
90
+ <form class="search" action="../search.html" method="get">
91
+ <input type="text" name="q" aria-labelledby="searchlabel" autocomplete="off" autocorrect="off" autocapitalize="off" spellcheck="false" placeholder="Search"/>
92
+ <input type="submit" value="Go" />
93
+ </form>
94
+ </div>
95
+ </search>
96
+ <script>document.getElementById('searchbox').style.display = "block"</script><h3>Navigation</h3>
86
97
  <p class="caption" role="heading"><span class="caption-text">Contents:</span></p>
87
98
  <ul class="current">
88
99
  <li class="toctree-l1"><a class="reference internal" href="changelog.html">Changelog (Quarchpy)</a></li>
@@ -106,16 +117,6 @@
106
117
  </ul></li>
107
118
  </ul>
108
119
  </div>
109
- <div id="searchbox" style="display: none" role="search">
110
- <h3 id="searchlabel">Quick search</h3>
111
- <div class="searchformwrapper">
112
- <form class="search" action="../search.html" method="get">
113
- <input type="text" name="q" aria-labelledby="searchlabel" autocomplete="off" autocorrect="off" autocapitalize="off" spellcheck="false"/>
114
- <input type="submit" value="Go" />
115
- </form>
116
- </div>
117
- </div>
118
- <script>document.getElementById('searchbox').style.display = "block"</script>
119
120
 
120
121
 
121
122
 
@@ -129,11 +130,11 @@
129
130
  <div class="clearer"></div>
130
131
  </div>
131
132
  <div class="footer">
132
- &copy;2020, Quarch Technology Ltd.
133
+ &#169;2020, Quarch Technology Ltd.
133
134
 
134
135
  |
135
- Powered by <a href="http://sphinx-doc.org/">Sphinx 7.2.6</a>
136
- &amp; <a href="https://github.com/bitprophet/alabaster">Alabaster 0.7.13</a>
136
+ Powered by <a href="https://www.sphinx-doc.org/">Sphinx 8.1.3</a>
137
+ &amp; <a href="https://alabaster.readthedocs.io">Alabaster 1.0.0</a>
137
138
 
138
139
  |
139
140
  <a href="../_sources/source/readme.rst.txt"
@@ -3,6 +3,12 @@ import time
3
3
  import json
4
4
  from datetime import datetime
5
5
  import subprocess
6
+ import json
7
+ import csv
8
+ import logging
9
+ import time
10
+ import os
11
+ from bisect import bisect_left
6
12
 
7
13
  all_outputs={"terse_version_3":"0",
8
14
  "fio_version":"1",
@@ -313,4 +319,252 @@ def runFIO(myStream, mode, fioCallbacks, user_data, arguments="", file_name=""):
313
319
  os.remove("pipe")
314
320
 
315
321
  if isinstance(arguments, dict):
316
- break
322
+ break
323
+
324
+
325
+
326
+ ### FIO postprocessing for QIS ###
327
+
328
+
329
+ def merge_fio_qis_stream(qis_stream_file, fio_output_file, unix_stream_start_time, output_file=None, rounding_option="round"):
330
+ """
331
+ Merge FIO and QIS data into a single CSV file.
332
+
333
+ For each FIO entry:
334
+ - If timestamps match, append FIO data to the corresponding QIS row.
335
+ - If no match, handle based on `rounding_option`:
336
+ - "round": Find the nearest QIS time and add FIO data to that row.
337
+ - "insert": Add a new row with blank QIS data and only FIO data.
338
+
339
+ Parameters:
340
+ qis_stream_file (str): Path to the QIS CSV file (converted to Unix time).
341
+ fio_output_file (str): Path to the FIO output file (in JSON format).
342
+ unix_stream_start_time (str): Starting Unix timestamp for the QIS stream.
343
+ output_file (str, optional): Output file path for the merged CSV. If not provided, the file is saved
344
+ with "_merged" appended to the QIS file name.
345
+ rounding_option (str): Determines how to handle mismatched times ("round" or "insert").
346
+
347
+ Returns:
348
+ str: Path to the merged CSV file.
349
+ """
350
+ # Convert QIS timestamps to Unix time
351
+ qis_converted_file = convert_qis_stream_to_unix_time(qis_stream_file, unix_stream_start_time)
352
+
353
+ # Parse QIS data
354
+ qis_data = []
355
+ with open(qis_converted_file, 'r') as qis_file:
356
+ reader = csv.reader(qis_file)
357
+ qis_headers = next(reader) #read header row
358
+ if qis_headers[-1]=="": qis_headers=qis_headers[:-1]
359
+ for row in reader:
360
+ qis_data.append(row)
361
+
362
+ # Parse FIO data
363
+ fio_data = fio_json_to_csv (fio_output_file)
364
+
365
+ # Extend QIS headers with FIO headers
366
+ fio_headers = ["block_size", "job_name", "read_iops", "write_iops"]
367
+ merged_headers = qis_headers + fio_headers
368
+
369
+ # Extract QIS times into a separate list for binary search
370
+ qis_times = [int(row[0]) for row in qis_data] # Assuming the first column is the timestamp
371
+
372
+ # Prepare merged data
373
+ merged_data = qis_data.copy()
374
+ for row in merged_data:
375
+ row.extend([""] * len(fio_headers))
376
+
377
+ # Merge FIO and QIS data
378
+ for fio_entry in fio_data:
379
+ fio_time = fio_entry["timestamp_us"]
380
+
381
+ # Binary search to find the closest QIS time
382
+ idx = bisect_left(qis_times, fio_time)
383
+ exact_match = None
384
+ if idx < len(qis_times) and qis_times[idx] == fio_time:
385
+ # Exact match found
386
+ exact_match = idx
387
+ elif idx > 0 and (idx == len(qis_times) or abs(qis_times[idx - 1] - fio_time) < abs(qis_times[idx] - fio_time)):
388
+ exact_match = idx - 1
389
+
390
+ if exact_match is not None and qis_times[exact_match] == fio_time:
391
+ # Append FIO data to the matching QIS row
392
+ qis_data[exact_match].extend([fio_entry.get(header, "") for header in fio_headers])
393
+ else:
394
+ # Log the two QIS times between which the FIO timestamp falls
395
+ lower_bound = qis_times[idx - 1] if idx > 0 else None
396
+ upper_bound = qis_times[idx] if idx < len(qis_times) else None
397
+ logging.debug(f"FIO timestamp {fio_time} falls between QIS times {lower_bound} and {upper_bound} at array position {idx - 1} and {idx}")
398
+
399
+ if rounding_option == "round":
400
+ # Find the nearest QIS time to the FIO time
401
+ nearest_idx = idx - 1 if idx > 0 and (idx == len(qis_times) or abs(qis_times[idx - 1] - fio_time) < abs(
402
+ qis_times[idx] - fio_time)) else idx
403
+ merged_data[nearest_idx] = merged_data[nearest_idx][:-4]
404
+ merged_data[nearest_idx].extend([fio_entry.get(header, "") for header in fio_headers])
405
+ elif rounding_option == "insert":
406
+ # Add a new row with blank QIS data and only FIO data at the end
407
+ blank_qis_data = [""] * len(qis_headers)
408
+ blank_qis_data[0]=fio_time
409
+ new_row = blank_qis_data + [fio_entry.get(header, "") for header in fio_headers]
410
+ merged_data.insert(idx, new_row)
411
+
412
+ # Write the merged data to a new file
413
+ if output_file is None:
414
+ output_file = qis_stream_file.replace(".csv", f"_merged_{rounding_option}.csv")
415
+ with open(output_file, 'w', newline='') as output_file_out:
416
+ writer = csv.writer(output_file_out)
417
+ writer.writerow(merged_headers)
418
+ writer.writerows(merged_data)
419
+
420
+ logging.debug(f"Merged data written to {output_file}")
421
+ os.remove(qis_converted_file) # remove the intermidiary file
422
+ return output_file
423
+
424
+ def convert_qis_stream_to_unix_time(qis_stream_file, unix_stream_start_time):
425
+ """
426
+ Converts a QIS stream CSV file to Unix time by adding the unixStreamStartTime to the first column
427
+ in each row, taking into account the time units provided in both the CSV header and the start time.
428
+
429
+ Parameters:
430
+ qis_stream_file (str): The path to the QIS stream CSV file.
431
+ unix_stream_start_time (str): The starting Unix time with units (e.g., "1737374310S", "1737374310000mS").
432
+
433
+ Returns:
434
+ str: Path to the converted CSV file.
435
+ """
436
+ # Extract the numeric value and unit from unixStreamStartTime
437
+ import re
438
+ match = re.match(r"(\d+)([a-zA-Z]+)", unix_stream_start_time)
439
+ if not match:
440
+ logging.warning("Invalid unix_stream_start_time format. Use format like '1737374310S' or '1737374310000mS'.")
441
+ return
442
+
443
+ unix_start_value = int(match.group(1))
444
+ unix_start_unit = match.group(2).lower() # Normalize to lowercase
445
+
446
+ # Unit multipliers
447
+ unit_multipliers = {'s': 1, 'ms': 1e-3, 'us': 1e-6, 'ns': 1e-9}
448
+ if unix_start_unit not in unit_multipliers:
449
+ raise ValueError(f"Unsupported time unit: {unix_start_unit}")
450
+
451
+ unix_start_in_seconds = unix_start_value * unit_multipliers[unix_start_unit]
452
+
453
+ # Determine the output file name
454
+ output_file = qis_stream_file.replace('.csv', '_converted.csv')
455
+
456
+ try:
457
+ with open(qis_stream_file, 'r') as infile, open(output_file, 'w', newline='') as outfile:
458
+ reader = csv.reader(infile)
459
+ writer = csv.writer(outfile)
460
+
461
+ # Read the header to determine the time column unit
462
+ header = next(reader)
463
+ writer.writerow(header) # Write the header to the output file
464
+
465
+ # Identify the time unit in the header (e.g., "Time uS")
466
+ time_unit = None
467
+ for col in header:
468
+ if "time" in col.lower():
469
+ time_unit_match = re.search(r"time\s+([a-zA-Z]+)", col, re.IGNORECASE)
470
+ if time_unit_match:
471
+ time_unit = time_unit_match.group(1).lower()
472
+ break
473
+
474
+ if not time_unit or time_unit not in unit_multipliers:
475
+ logging.warning(f"Unsupported or missing time unit in the header: {time_unit}")
476
+ return
477
+
478
+ # Convert time units in the CSV to seconds
479
+ time_unit_multiplier = unit_multipliers[time_unit]
480
+
481
+ # Process each row and update the first column
482
+ for row in reader:
483
+ if row and row[0].isdigit(): # Ensure the first cell is numeric
484
+ elapsed_time_in_seconds = int(row[0]) * time_unit_multiplier
485
+ new_time_in_seconds = elapsed_time_in_seconds + unix_start_in_seconds
486
+ # Convert back to the original unit for consistency
487
+ row[0] = str(int(new_time_in_seconds / time_unit_multiplier))
488
+ writer.writerow(row)
489
+
490
+ logging.debug(f"File successfully converted and saved as: {output_file}")
491
+ return output_file
492
+
493
+ except FileNotFoundError:
494
+ logging.error(f"Error: File '{qis_stream_file}' not found.")
495
+ except Exception as e:
496
+ logging.error(f"An error occurred: {e}")
497
+ #1737376756
498
+ #convertQISStreamToUnixTime("Stream1.csv", "1737376756S")
499
+
500
+
501
+
502
+ def fio_json_to_csv(output_file):
503
+ retVal=[]
504
+ isThreaded = True
505
+ #checking to see if the first line of file needs to be skipped = Windows only
506
+ if os.name == "nt":
507
+ isThreaded = False
508
+ logfile = open(output_file,"r")
509
+ #variables for parsing json
510
+ iterator = 0
511
+ jobCount = 0
512
+ jsonLines = ""
513
+ openBracketCount = 0
514
+ closeBracketCount = 0
515
+ # Init the job end time to the current start time
516
+ jobEndTime = int(round(time.time() * 1000))
517
+ for line in logfile:
518
+ if (isThreaded == False):
519
+ # skip the very first line -- (title line) --
520
+ if iterator == 0:
521
+ iterator = iterator + 1
522
+ # marking threaded as true for remainder of read > Efficiency
523
+ isThreaded = True
524
+ continue
525
+ # add to iterator - not needed, may be useful later
526
+ iterator = iterator + 1
527
+ # concat strings
528
+ jsonLines += line
529
+ # finding brackets withing json
530
+ if '{' in line:
531
+ openBracketCount = openBracketCount + 1
532
+ if '}' in line:
533
+ closeBracketCount = closeBracketCount + 1
534
+ # an equal amount of brackets denotes the end of a json object
535
+ if openBracketCount == closeBracketCount and openBracketCount != 0:
536
+ try:
537
+ # format into a json parsable string
538
+ TempJsonObject = jsonLines[0: jsonLines.rindex('}') + 1]
539
+ # parse json
540
+ jsonobject = json.loads(TempJsonObject)
541
+ # checking for first job
542
+ if (jobCount == 0):
543
+ # getting start time of job
544
+ startTime = (jsonobject['timestamp_ms'] - jsonobject['jobs'][0]['read']['runtime'])
545
+ #comment = str(arguments).replace(",", "\n").replace("}", "").replace("{", "")
546
+ jobName = str(jsonobject['jobs'][0]['jobname'])
547
+ # adding start annotation
548
+ #fioCallbacks["TEST_START"](myStream, str(startTime), jobName, comment)
549
+ logging.debug(f"first job name: {jobName} start time {startTime} ")
550
+ # pass specific data
551
+ readDataValue = jsonobject['jobs'][0]['read']['iops']
552
+ writeDataValue = jsonobject['jobs'][0]['write']['iops']
553
+ blockSize = jsonobject['global options']['bs']
554
+ # converted to ditionary - easy script use
555
+ dataValues = {"read_iops": readDataValue, "write_iops": writeDataValue, "block_size": blockSize}
556
+ jobEndTime = str(jsonobject['timestamp_ms'])
557
+ dataValues['timestamp_us']=int(jobEndTime)*1000
558
+ dataValues['job_name'] = jobName
559
+ logging.debug(str(dataValues))
560
+
561
+ retVal.append(dataValues)
562
+ # jsonLines variable is now all characters after last job + any new that come in
563
+ jsonLines = jsonLines[jsonLines.rindex('}') + 1:]
564
+ # add 1 to the job count
565
+ jobCount += 1
566
+ except Exception as e:
567
+ # exception caused by not being able to find substring -- Last json object --
568
+ logging.warning("Exception Caught\n"+ str(e))
569
+ pass
570
+ return retVal