quarchpy 2.1.24.dev2__py2.py3-none-any.whl → 2.1.24.dev4__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 (63) hide show
  1. quarchpy/.idea/.name +1 -1
  2. quarchpy/.idea/workspace.xml +50 -25
  3. quarchpy/__pycache__/__init__.cpython-311.pyc +0 -0
  4. quarchpy/__pycache__/_version.cpython-311.pyc +0 -0
  5. quarchpy/__pycache__/connection.cpython-311.pyc +0 -0
  6. quarchpy/_version.py +1 -1
  7. quarchpy/_version.py.bak +1 -0
  8. quarchpy/config_files/__pycache__/__init__.cpython-311.pyc +0 -0
  9. quarchpy/config_files/__pycache__/quarch_config_parser.cpython-311.pyc +0 -0
  10. quarchpy/connection_specific/__pycache__/StreamChannels.cpython-311.pyc +0 -0
  11. quarchpy/connection_specific/__pycache__/__init__.cpython-311.pyc +0 -0
  12. quarchpy/connection_specific/__pycache__/connection_QIS.cpython-311.pyc +0 -0
  13. quarchpy/connection_specific/__pycache__/connection_QPS.cpython-311.pyc +0 -0
  14. quarchpy/connection_specific/__pycache__/connection_ReST.cpython-311.pyc +0 -0
  15. quarchpy/connection_specific/__pycache__/connection_Serial.cpython-311.pyc +0 -0
  16. quarchpy/connection_specific/__pycache__/connection_TCP.cpython-311.pyc +0 -0
  17. quarchpy/connection_specific/__pycache__/connection_USB.cpython-311.pyc +0 -0
  18. quarchpy/connection_specific/__pycache__/connection_mDNS.cpython-311.pyc +0 -0
  19. quarchpy/connection_specific/serial/__pycache__/__init__.cpython-311.pyc +0 -0
  20. quarchpy/connection_specific/serial/__pycache__/serialutil.cpython-311.pyc +0 -0
  21. quarchpy/connection_specific/serial/__pycache__/serialwin32.cpython-311.pyc +0 -0
  22. quarchpy/connection_specific/serial/__pycache__/win32.cpython-311.pyc +0 -0
  23. quarchpy/connection_specific/serial/tools/__pycache__/__init__.cpython-311.pyc +0 -0
  24. quarchpy/connection_specific/serial/tools/__pycache__/list_ports.cpython-311.pyc +0 -0
  25. quarchpy/connection_specific/serial/tools/__pycache__/list_ports_common.cpython-311.pyc +0 -0
  26. quarchpy/connection_specific/serial/tools/__pycache__/list_ports_windows.cpython-311.pyc +0 -0
  27. quarchpy/connection_specific/usb_libs/__pycache__/libusb1.cpython-311.pyc +0 -0
  28. quarchpy/connection_specific/usb_libs/__pycache__/usb1.cpython-311.pyc +0 -0
  29. quarchpy/debug/__pycache__/SystemTest.cpython-311.pyc +0 -0
  30. quarchpy/debug/__pycache__/__init__.cpython-311.pyc +0 -0
  31. quarchpy/debug/__pycache__/versionCompare.cpython-311.pyc +0 -0
  32. quarchpy/device/__pycache__/__init__.cpython-311.pyc +0 -0
  33. quarchpy/device/__pycache__/device.cpython-311.pyc +0 -0
  34. quarchpy/device/__pycache__/quarchArray.cpython-311.pyc +0 -0
  35. quarchpy/device/__pycache__/quarchPPM.cpython-311.pyc +0 -0
  36. quarchpy/device/__pycache__/quarchQPS.cpython-311.pyc +0 -0
  37. quarchpy/device/__pycache__/scanDevices.cpython-311.pyc +0 -0
  38. quarchpy/device/scanDevices.py +3 -3
  39. quarchpy/device/scanDevices.py.bak +655 -0
  40. quarchpy/disk_test/__pycache__/AbsDiskFinder.cpython-311.pyc +0 -0
  41. quarchpy/disk_test/__pycache__/DiskTargetSelection.cpython-311.pyc +0 -0
  42. quarchpy/disk_test/__pycache__/__init__.cpython-311.pyc +0 -0
  43. quarchpy/disk_test/__pycache__/iometerDiskFinder.cpython-311.pyc +0 -0
  44. quarchpy/fio/__pycache__/FIO_interface.cpython-311.pyc +0 -0
  45. quarchpy/fio/__pycache__/__init__.cpython-311.pyc +0 -0
  46. quarchpy/iometer/__pycache__/__init__.cpython-311.pyc +0 -0
  47. quarchpy/iometer/__pycache__/gen_iometer_template.cpython-311.pyc +0 -0
  48. quarchpy/iometer/__pycache__/iometerFuncs.cpython-311.pyc +0 -0
  49. quarchpy/qis/__pycache__/StreamHeaderInfo.cpython-311.pyc +0 -0
  50. quarchpy/qis/__pycache__/__init__.cpython-311.pyc +0 -0
  51. quarchpy/qis/__pycache__/qisFuncs.cpython-311.pyc +0 -0
  52. quarchpy/qps/__pycache__/__init__.cpython-311.pyc +0 -0
  53. quarchpy/qps/__pycache__/qpsFuncs.cpython-311.pyc +0 -0
  54. quarchpy/user_interface/__pycache__/__init__.cpython-311.pyc +0 -0
  55. quarchpy/user_interface/__pycache__/user_interface.cpython-311.pyc +0 -0
  56. quarchpy/utilities/__pycache__/TestCenter.cpython-311.pyc +0 -0
  57. quarchpy/utilities/__pycache__/TimeValue.cpython-311.pyc +0 -0
  58. quarchpy/utilities/__pycache__/Version.cpython-311.pyc +0 -0
  59. quarchpy/utilities/__pycache__/__init__.cpython-311.pyc +0 -0
  60. {quarchpy-2.1.24.dev2.dist-info → quarchpy-2.1.24.dev4.dist-info}/METADATA +1 -1
  61. {quarchpy-2.1.24.dev2.dist-info → quarchpy-2.1.24.dev4.dist-info}/RECORD +63 -8
  62. {quarchpy-2.1.24.dev2.dist-info → quarchpy-2.1.24.dev4.dist-info}/WHEEL +0 -0
  63. {quarchpy-2.1.24.dev2.dist-info → quarchpy-2.1.24.dev4.dist-info}/top_level.txt +0 -0
quarchpy/.idea/.name CHANGED
@@ -1 +1 @@
1
- qpsFuncs.py
1
+ scanDevices.py
@@ -57,8 +57,8 @@
57
57
  <recent name="P:\Software\Python\QuarchPy\Trunk\quarchpy" />
58
58
  </key>
59
59
  </component>
60
- <component name="RunManager" selected="Python.simple_terminal">
61
- <configuration name="HammerRegRead" type="PythonConfigurationType" factoryName="Python" temporary="true" nameIsGenerated="true">
60
+ <component name="RunManager" selected="Python.simple_terminal (1)">
61
+ <configuration name="SystemTest" type="PythonConfigurationType" factoryName="Python" temporary="true" nameIsGenerated="true">
62
62
  <module name="quarchpy" />
63
63
  <option name="INTERPRETER_OPTIONS" value="" />
64
64
  <option name="PARENT_ENVS" value="true" />
@@ -66,11 +66,11 @@
66
66
  <env name="PYTHONUNBUFFERED" value="1" />
67
67
  </envs>
68
68
  <option name="SDK_HOME" value="" />
69
- <option name="WORKING_DIRECTORY" value="$USER_HOME$/Desktop" />
70
- <option name="IS_MODULE_SDK" value="false" />
69
+ <option name="WORKING_DIRECTORY" value="$PROJECT_DIR$/debug" />
70
+ <option name="IS_MODULE_SDK" value="true" />
71
71
  <option name="ADD_CONTENT_ROOTS" value="true" />
72
72
  <option name="ADD_SOURCE_ROOTS" value="true" />
73
- <option name="SCRIPT_NAME" value="$USER_HOME$/Desktop/HammerRegRead.py" />
73
+ <option name="SCRIPT_NAME" value="$PROJECT_DIR$/debug/SystemTest.py" />
74
74
  <option name="PARAMETERS" value="" />
75
75
  <option name="SHOW_COMMAND_LINE" value="false" />
76
76
  <option name="EMULATE_TERMINAL" value="false" />
@@ -79,7 +79,7 @@
79
79
  <option name="INPUT_FILE" value="" />
80
80
  <method v="2" />
81
81
  </configuration>
82
- <configuration name="PowerExamples" type="PythonConfigurationType" factoryName="Python" temporary="true" nameIsGenerated="true">
82
+ <configuration name="TestMultiNWA" type="PythonConfigurationType" factoryName="Python" temporary="true" nameIsGenerated="true">
83
83
  <module name="Application Notes" />
84
84
  <option name="INTERPRETER_OPTIONS" value="" />
85
85
  <option name="PARENT_ENVS" value="true" />
@@ -87,11 +87,11 @@
87
87
  <env name="PYTHONUNBUFFERED" value="1" />
88
88
  </envs>
89
89
  <option name="SDK_HOME" value="" />
90
- <option name="WORKING_DIRECTORY" value="$PROJECT_DIR$/../../../../Application Notes/AN-022 - QIS Automation and post processing example/Trunk" />
90
+ <option name="WORKING_DIRECTORY" value="$PROJECT_DIR$/../../../../Application Notes" />
91
91
  <option name="IS_MODULE_SDK" value="true" />
92
92
  <option name="ADD_CONTENT_ROOTS" value="true" />
93
93
  <option name="ADD_SOURCE_ROOTS" value="true" />
94
- <option name="SCRIPT_NAME" value="$PROJECT_DIR$/../../../../Application Notes/AN-022 - QIS Automation and post processing example/Trunk/PowerExamples.py" />
94
+ <option name="SCRIPT_NAME" value="$PROJECT_DIR$/../../../../Application Notes/TestMultiNWA.py" />
95
95
  <option name="PARAMETERS" value="" />
96
96
  <option name="SHOW_COMMAND_LINE" value="false" />
97
97
  <option name="EMULATE_TERMINAL" value="false" />
@@ -100,19 +100,19 @@
100
100
  <option name="INPUT_FILE" value="" />
101
101
  <method v="2" />
102
102
  </configuration>
103
- <configuration name="SystemTest" type="PythonConfigurationType" factoryName="Python" temporary="true" nameIsGenerated="true">
104
- <module name="quarchpy" />
103
+ <configuration name="scanDevices" type="PythonConfigurationType" factoryName="Python" temporary="true" nameIsGenerated="true">
104
+ <module name="QuarchCalibration" />
105
105
  <option name="INTERPRETER_OPTIONS" value="" />
106
106
  <option name="PARENT_ENVS" value="true" />
107
107
  <envs>
108
108
  <env name="PYTHONUNBUFFERED" value="1" />
109
109
  </envs>
110
110
  <option name="SDK_HOME" value="" />
111
- <option name="WORKING_DIRECTORY" value="$PROJECT_DIR$/debug" />
111
+ <option name="WORKING_DIRECTORY" value="C:/Python311/Lib/site-packages/quarchpy/device" />
112
112
  <option name="IS_MODULE_SDK" value="true" />
113
113
  <option name="ADD_CONTENT_ROOTS" value="true" />
114
114
  <option name="ADD_SOURCE_ROOTS" value="true" />
115
- <option name="SCRIPT_NAME" value="$PROJECT_DIR$/debug/SystemTest.py" />
115
+ <option name="SCRIPT_NAME" value="C:/Python311/Lib/site-packages/quarchpy/device/scanDevices.py" />
116
116
  <option name="PARAMETERS" value="" />
117
117
  <option name="SHOW_COMMAND_LINE" value="false" />
118
118
  <option name="EMULATE_TERMINAL" value="false" />
@@ -121,19 +121,19 @@
121
121
  <option name="INPUT_FILE" value="" />
122
122
  <method v="2" />
123
123
  </configuration>
124
- <configuration name="TestPYQPSQISConnectionsSameModule" type="PythonConfigurationType" factoryName="Python" temporary="true" nameIsGenerated="true">
125
- <module name="Application Notes" />
124
+ <configuration name="simple_terminal (1)" type="PythonConfigurationType" factoryName="Python" temporary="true" nameIsGenerated="true">
125
+ <module name="quarchpy" />
126
126
  <option name="INTERPRETER_OPTIONS" value="" />
127
127
  <option name="PARENT_ENVS" value="true" />
128
128
  <envs>
129
129
  <env name="PYTHONUNBUFFERED" value="1" />
130
130
  </envs>
131
131
  <option name="SDK_HOME" value="" />
132
- <option name="WORKING_DIRECTORY" value="$PROJECT_DIR$/../../../../Application Notes/AN-006 - Python Control of Quarch Modules/Trunk" />
133
- <option name="IS_MODULE_SDK" value="true" />
132
+ <option name="WORKING_DIRECTORY" value="$PROJECT_DIR$/.." />
133
+ <option name="IS_MODULE_SDK" value="false" />
134
134
  <option name="ADD_CONTENT_ROOTS" value="true" />
135
135
  <option name="ADD_SOURCE_ROOTS" value="true" />
136
- <option name="SCRIPT_NAME" value="$PROJECT_DIR$/../../../../Application Notes/AN-006 - Python Control of Quarch Modules/Trunk/TestPYQPSQISConnectionsSameModule.py" />
136
+ <option name="SCRIPT_NAME" value="$PROJECT_DIR$/../simple_terminal.py" />
137
137
  <option name="PARAMETERS" value="" />
138
138
  <option name="SHOW_COMMAND_LINE" value="false" />
139
139
  <option name="EMULATE_TERMINAL" value="false" />
@@ -165,11 +165,11 @@
165
165
  </configuration>
166
166
  <recent_temporary>
167
167
  <list>
168
+ <item itemvalue="Python.simple_terminal (1)" />
169
+ <item itemvalue="Python.TestMultiNWA" />
168
170
  <item itemvalue="Python.simple_terminal" />
171
+ <item itemvalue="Python.scanDevices" />
169
172
  <item itemvalue="Python.SystemTest" />
170
- <item itemvalue="Python.HammerRegRead" />
171
- <item itemvalue="Python.TestPYQPSQISConnectionsSameModule" />
172
- <item itemvalue="Python.PowerExamples" />
173
173
  </list>
174
174
  </recent_temporary>
175
175
  </component>
@@ -239,7 +239,7 @@
239
239
  </line-breakpoint>
240
240
  <line-breakpoint enabled="true" suspend="THREAD" type="python-line">
241
241
  <url>file://C:/Python311/Lib/site-packages/quarchpy/run.py</url>
242
- <line>8</line>
242
+ <line>6</line>
243
243
  <option name="timeStamp" value="39" />
244
244
  </line-breakpoint>
245
245
  <line-breakpoint enabled="true" suspend="THREAD" type="python-line">
@@ -314,13 +314,38 @@
314
314
  </line-breakpoint>
315
315
  <line-breakpoint enabled="true" suspend="THREAD" type="python-line">
316
316
  <url>file://C:/Python311/Lib/site-packages/quarchpy/device/scanDevices.py</url>
317
- <line>350</line>
318
- <option name="timeStamp" value="109" />
317
+ <line>343</line>
318
+ <option name="timeStamp" value="110" />
319
319
  </line-breakpoint>
320
320
  <line-breakpoint enabled="true" suspend="THREAD" type="python-line">
321
321
  <url>file://C:/Python311/Lib/site-packages/quarchpy/device/scanDevices.py</url>
322
- <line>341</line>
323
- <option name="timeStamp" value="110" />
322
+ <line>328</line>
323
+ <option name="timeStamp" value="112" />
324
+ </line-breakpoint>
325
+ <line-breakpoint enabled="true" suspend="THREAD" type="python-line">
326
+ <url>file://$PROJECT_DIR$/device/scanDevices.py</url>
327
+ <line>186</line>
328
+ <option name="timeStamp" value="113" />
329
+ </line-breakpoint>
330
+ <line-breakpoint enabled="true" suspend="THREAD" type="python-line">
331
+ <url>file://$PROJECT_DIR$/../simple_terminal.py</url>
332
+ <line>21</line>
333
+ <option name="timeStamp" value="114" />
334
+ </line-breakpoint>
335
+ <line-breakpoint enabled="true" suspend="THREAD" type="python-line">
336
+ <url>file://$PROJECT_DIR$/../simple_terminal.py</url>
337
+ <line>13</line>
338
+ <option name="timeStamp" value="115" />
339
+ </line-breakpoint>
340
+ <line-breakpoint enabled="true" suspend="THREAD" type="python-line">
341
+ <url>file://C:/Projects/Software/Python/QuarchPy/Trunk/quarchpy/device/scanDevices.py</url>
342
+ <line>272</line>
343
+ <option name="timeStamp" value="116" />
344
+ </line-breakpoint>
345
+ <line-breakpoint enabled="true" suspend="THREAD" type="python-line">
346
+ <url>file://$PROJECT_DIR$/../../../../Application Notes/TestMultiNWA.py</url>
347
+ <line>30</line>
348
+ <option name="timeStamp" value="117" />
324
349
  </line-breakpoint>
325
350
  </breakpoints>
326
351
  <default-breakpoints>
quarchpy/_version.py CHANGED
@@ -1 +1 @@
1
- __version__ = "2.1.24.dev2"
1
+ __version__ = "2.1.24.dev4"
@@ -0,0 +1 @@
1
+ __version__ = "2.1.24.dev3"
@@ -183,6 +183,7 @@ def list_network(target_conn="all", debugPring=False, lanTimeout=1, ipAddressLoo
183
183
  # Broadcast the message.
184
184
  logging.debug("Broadcast LAN discovery message for UDP scan to all network interfaces")
185
185
  ipList = socket.gethostbyname_ex(socket.gethostname())
186
+ ipList[2].append("")
186
187
  logging.debug(os.path.basename(__file__) + ": Discovered the following interfaces: " + str(ipList))
187
188
 
188
189
 
@@ -488,7 +489,8 @@ def scanDevices(target_conn="all", lanTimeout=1, scanInArray=True, favouriteOnly
488
489
  module_type_filter=None, ipAddressLookup=None):
489
490
  foundDevices = dict()
490
491
  scannedArrays = list()
491
-
492
+ mdnsListener = MyListener()
493
+ scan_mDNS(mdnsListener)
492
494
 
493
495
  if target_conn.lower() == "all":
494
496
  foundDevices = list_USB()
@@ -497,8 +499,6 @@ def scanDevices(target_conn="all", lanTimeout=1, scanInArray=True, favouriteOnly
497
499
  #This will fail if the test machine is not connected to a network
498
500
  foundDevices = mergeDict(foundDevices, list_network("all", ipAddressLookup=ipAddressLookup, lanTimeout=lanTimeout))
499
501
  try:
500
- mdnsListener = MyListener()
501
- scan_mDNS(mdnsListener)
502
502
  foundDevices = mergeDict(foundDevices, mdnsListener.found_devices)
503
503
  except Exception as mdnsExcept:
504
504
  logging.debug("An error occurred while trying to use the mdns listner to scan\n" +str(mdnsExcept))
@@ -0,0 +1,655 @@
1
+ import time
2
+ import socket
3
+ import sys
4
+ import operator
5
+ import logging
6
+ import os
7
+
8
+ from sys import platform
9
+
10
+ from quarchpy.config_files.quarch_config_parser import return_module_type_list
11
+ from quarchpy.user_interface import*
12
+ from quarchpy.user_interface import User_interface
13
+ try:
14
+ from quarchpy.connection_specific.connection_USB import importUSB # , USBConn
15
+ except:
16
+ printText("System Compatibility issue - Is your Python architecture consistent with the Operating System?")
17
+ pass
18
+ from quarchpy.device import quarchDevice, quarchArray
19
+ from quarchpy.connection_specific.connection_Serial import serialList, serial
20
+ from quarchpy.device.quarchArray import isThisAnArrayController
21
+ from quarchpy.connection_specific.connection_USB import TQuarchUSB_IF
22
+ from quarchpy.connection_specific import connection_ReST, connection_TCP
23
+ from quarchpy.connection_specific.connection_mDNS import MyListener
24
+ from quarchpy.utilities import TestCenter
25
+
26
+
27
+ '''
28
+ Merge two dictionaries and return the result
29
+ '''
30
+ def mergeDict(x, y):
31
+ if (y is None):
32
+ return x
33
+ else:
34
+ merged = x.copy()
35
+ merged.update(y)
36
+ return merged
37
+
38
+
39
+ '''
40
+ Scan for Quarch modules across all available COM ports
41
+ '''
42
+ def list_serial(debuPrint=False):
43
+ serial_ports = serialList.comports()
44
+ serial_modules = dict()
45
+
46
+ for i in serial_ports:
47
+ logging.debug("Scanning for Quarch devices on: " + str(i))
48
+ try:
49
+ ser = serial.Serial(i[0], 19200, timeout=0.5, write_timeout=0.5)
50
+ ser.write(b'*serial?\r\n')
51
+ s = ser.read(size=64)
52
+ serial_module = s.splitlines()[1]
53
+
54
+ serial_module = str(serial_module).replace("'", "").replace("b", "")
55
+
56
+ if "QTL" not in serial_module:
57
+ serial_module = "QTL" + serial_module
58
+
59
+ module = str(i[0]), str(serial_module)
60
+
61
+ if serial_module[7] == "-" and serial_module[10] == "-":
62
+ serial_modules["SERIAL:" + str(i[0])] = serial_module
63
+ logging.debug("Located quarch module: " + serial_module)
64
+
65
+ ser.close()
66
+ logging.debug("Finished scanning for Quarch devices on: " + str(i))
67
+ except Exception as err:
68
+ logging.debug("Exception during serial scan: " + str(err))
69
+ pass
70
+ return serial_modules
71
+
72
+
73
+ '''
74
+ Scan for all Quarch devices available over USB
75
+ '''
76
+ def list_USB(debuPrint=False):
77
+ QUARCH_VENDOR_ID = 0x16d0
78
+ QUARCH_PRODUCT_ID1 = 0x0449
79
+
80
+ usb1 = importUSB()
81
+
82
+ context = usb1.USBContext()
83
+ usb_list = context.getDeviceList()
84
+
85
+ if (debuPrint): printText(usb_list)
86
+
87
+ usb_modules = dict()
88
+ hdList = []
89
+
90
+ usb_permission_error = False
91
+
92
+ for i in usb_list:
93
+ if hex(i.device_descriptor.idVendor) == hex(QUARCH_VENDOR_ID) and hex(i.device_descriptor.idProduct) == hex(
94
+ QUARCH_PRODUCT_ID1):
95
+ try:
96
+ logging.debug("Opening USB handle to quarch module: " + str(i))
97
+ i_handle = i.open()
98
+ except Exception as err:
99
+ logging.debug("USB port open exception: " + str(err))
100
+ if "LIBUSB_ERROR_ACCESS [-3]" in str(err):
101
+ logging.debug("Unable to communicate with Quarch module over USB, device may be in use already.")
102
+ if not platform == "win32":
103
+ if not os.path.isfile("/etc/udev/rules.d/20-quarchmodules.rules"):
104
+ usb_permission_error = True
105
+ usb_modules["USB:???"] = "LOCKED MODULE"
106
+
107
+
108
+ try:
109
+ module_sn = i_handle.getASCIIStringDescriptor(3)
110
+ if "1944" in module_sn or "2098" in module_sn : #use enclosure number instead of serial number
111
+ hdList.append(i)
112
+ except Exception as err:
113
+ logging.debug("USB exception on reading serial number: " + str(err))
114
+ usb_modules["USB:???"] = "LOCKED MODULE"
115
+ continue
116
+
117
+ try:
118
+ if (debuPrint): printText(i_handle.getASCIIStringDescriptor(3) + " " + i_handle.getASCIIStringDescriptor(
119
+ 2) + " " + i_handle.getASCIIStringDescriptor(1))
120
+ except Exception as err:
121
+ logging.error("USB exception on reading descriptor strings: " + str(err))
122
+ usb_modules["USB:???"] = "LOCKED MODULE"
123
+ continue
124
+
125
+ if "QTL" not in module_sn:
126
+ module_sn = "QTL" + module_sn.strip()
127
+ else:
128
+ module_sn = module_sn.strip()
129
+
130
+ if (debuPrint): printText(module_sn)
131
+
132
+ usb_modules["USB:" + module_sn] = module_sn
133
+ logging.debug("Located USB module: " + module_sn)
134
+
135
+ try:
136
+ logging.debug("Closing USB handle to quarch module: " + str(i))
137
+ i_handle.close()
138
+ except Exception as err:
139
+ logging.error("Exception on closing USB port: " + str(err))
140
+ continue
141
+
142
+ # before returning the list of usb modules scan through the list for a 1944 create a quarch device and use sendCommand("*enclosure?")
143
+
144
+ for module in hdList:
145
+
146
+ QquarchDevice = None
147
+ quarchDevice = None
148
+ quarchDevice = module
149
+ QquarchDevice = TQuarchUSB_IF(context)
150
+ QquarchDevice.connection = quarchDevice
151
+ QquarchDevice.OpenPort()
152
+ time.sleep(0.02) # sleep sometimes needed before sending comand directly after opening device
153
+ QquarchDevice.SetTimeout(2000)
154
+ serialNo = (QquarchDevice.RunCommand("*serial?")).replace("\r\n", "")
155
+ enclNo = (QquarchDevice.RunCommand("*enclosure?")).replace("\r\n", "")
156
+
157
+ keyToFind = "USB:QTL" + serialNo
158
+
159
+ if keyToFind in usb_modules:
160
+ del usb_modules[keyToFind]
161
+ usb_modules["USB:QTL" + enclNo] = "QTL" + enclNo
162
+ logging.debug("Located USB module: QTL" + enclNo)
163
+
164
+ QquarchDevice.ClosePort()
165
+ QquarchDevice.deviceHandle = None
166
+
167
+
168
+ if usb_permission_error:
169
+ logging.warning("Potential permission error accessing Quarch module(s) via USB.")
170
+ logging.warning("If unknown, run the command 'sudo python3 -m quarchpy.run debug --fixusb' to add a new usb rule.")
171
+
172
+ return usb_modules
173
+
174
+
175
+ '''
176
+ List all Quarch devices found over LAN, using a UDP broadcast scan
177
+ '''
178
+ def list_network(target_conn="all", debugPring=False, lanTimeout=1, ipAddressLookup=None):
179
+
180
+ retVal={}
181
+ lan_modules = dict()
182
+ specifiedDevice = None
183
+ # Broadcast the message.
184
+ logging.debug("Broadcast LAN discovery message for UDP scan to all network interfaces")
185
+ ipList = socket.gethostbyname_ex(socket.gethostname())
186
+ temp1= socket.gethostname()
187
+ logging.debug(os.path.basename(__file__) + ": Discovered the following interfaces: " + str(ipList))
188
+
189
+
190
+
191
+ for ip in ipList[2]:
192
+ logging.debug(os.path.basename(__file__) + ": Broadcasting on : " + ip)
193
+ try:
194
+ mySocket = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
195
+ mySocket.setsockopt(socket.SOL_SOCKET, socket.SO_BROADCAST, 1)
196
+ mySocket.settimeout(lanTimeout)
197
+ mySocket.bind((ip,56732))
198
+ except Exception as err:
199
+ logging.debug("Error while trying to bind to network interfaces: "+" Error: "+str(err))
200
+
201
+ if ipAddressLookup is not None:
202
+ # Attempts to find the device through UDP then REST
203
+ specifiedDevice = lookupDevice(str(ipAddressLookup).strip(), mySocket, lan_modules)
204
+
205
+
206
+ mySocket.sendto(b'Discovery: Who is out there?\0\n', ('255.255.255.255', 30303))
207
+ counter = 0
208
+ # Receive messages until timeout.
209
+ while True:
210
+ network_modules = {}
211
+ counter += 1
212
+ # Receive raw message until timeout, then break.
213
+ try:
214
+ msg_received = mySocket.recvfrom(256)
215
+ except Exception as e:
216
+ # check if any a device was targeted directly and allow parse
217
+ if specifiedDevice is not None:
218
+ msg_received = specifiedDevice
219
+ specifiedDevice = None
220
+ else:
221
+ break
222
+ cont = 0
223
+
224
+ # Used split \r\n since values of 13 or 10 were looked at as /r and /n when using splitlines
225
+ # This fixes for all cases except if 13 is followed by 10.
226
+ splits = msg_received[0].split(b"\r\n")
227
+ del splits[-1]
228
+ for lines in splits:
229
+ if cont <= 1:
230
+ index = cont
231
+ data = repr(lines).replace("'", "").replace("b", "")
232
+ cont += 1
233
+ else:
234
+ index = repr(lines[0]).replace("'", "")
235
+ data = repr(lines[1:]).replace("'", "").replace("b", "")
236
+ network_modules[index] = data
237
+ module_name = get_user_level_serial_number(network_modules)
238
+ logging.debug("Found UDP response: " + module_name)
239
+ ip_module = msg_received[1][0].strip()
240
+ try:
241
+ # Add a QTL before modules without it.
242
+ if "QTL" not in module_name.decode("utf-8"):
243
+ module_name = "QTL" + module_name.decode("utf-8")
244
+ except:
245
+ # Add a QTL before modules without it.
246
+ if "QTL" not in module_name:
247
+ module_name = "QTL" + module_name
248
+
249
+ # Checks if there's a value in the TELNET key.
250
+ if (target_conn.lower() == "all" or target_conn.lower() == "telnet"):
251
+ if network_modules.get("\\x8a") or network_modules.get("138"):
252
+ # Append the information to the list.
253
+ lan_modules["TELNET:" + ip_module] = module_name
254
+ logging.debug("Found Telnet module: " + module_name)
255
+
256
+ # Checks if there's a value in the REST key.
257
+ if (target_conn.lower() == "all" or target_conn.lower() == "rest"):
258
+ if network_modules.get("\\x84") or network_modules.get("132"):
259
+ # Append the information to the list.
260
+ lan_modules["REST:" + ip_module] = module_name
261
+ logging.debug("Found REST module: " + module_name)
262
+
263
+ # Checks if there's a value in the TCP key.
264
+ if (target_conn.lower() == "all" or target_conn.lower() == "tcp"):
265
+ if network_modules.get("\\x85") or network_modules.get("133"):
266
+ # Append the information to the list.
267
+ lan_modules["TCP:" + ip_module] = module_name
268
+ logging.debug("Found TCP module: " + module_name)
269
+ mySocket.close()
270
+
271
+ logging.debug("Finished UDP scan")
272
+ retVal.update(lan_modules)
273
+ return retVal
274
+
275
+
276
+
277
+ def get_user_level_serial_number(network_modules):
278
+ '''
279
+
280
+ :param network_modules:
281
+ :return:
282
+ '''
283
+ list_of_multi_module_units = ["1995"] # List of modules that require enclosure number + Port to be displayed.
284
+
285
+ # Filter the raw message to get the module and ip address.
286
+ if "134" in network_modules.keys():
287
+ module_name = network_modules.get("134").strip() # enclosure number only
288
+ for module in list_of_multi_module_units:
289
+ if module in module_name:
290
+ module_name += "-" + network_modules.get("135").strip() # enclosure number with port
291
+ break
292
+ elif "\\x86" in network_modules.keys():
293
+ module_name = network_modules.get("\\x86").strip() # enclosure number only
294
+ for module in list_of_multi_module_units:
295
+ if module in module_name:
296
+ module_name += "-" + network_modules.get("\\x87").strip() # enclosure number with port
297
+ break
298
+ else:
299
+ if "131" in network_modules.keys():
300
+ module_name = module_name = network_modules.get("131").strip() # serial number
301
+ elif "\\x83" in network_modules.keys():
302
+ module_name = module_name = network_modules.get("\\x83").strip() # serial number
303
+
304
+ return module_name
305
+
306
+
307
+ ''''''
308
+ def lookupDevice(ipAddressLookup, mySocket, lan_modules):
309
+ try:
310
+ specifiedDevice =None
311
+ # For future reference, 0 is the C terminator for a string
312
+ timeout = mySocket.gettimeout()
313
+ # mySocket.settimeout(20)
314
+ # timeout2 = mySocket.gettimeout()
315
+ logging.debug("Ipaddress lookup =" + ipAddressLookup+ " timeout = "+ str(timeout))
316
+
317
+ mySocket.sendto(b'Discovery: Who is out there?\0\n', (str(ipAddressLookup).strip(), 30303))
318
+ specifiedDevice = mySocket.recvfrom(256)
319
+ # Check to see if the response contains the connection protocol
320
+ return specifiedDevice
321
+ except Exception as e:
322
+ logging.warning("Error during UDP lookup of IP address "+ str(ipAddressLookup) +" Error: " + str(e))
323
+ logging.warning("No Quarch module found at this address. Please check the IP address and that you can ping it.\r\n")
324
+
325
+ #return None # Commented out, attempt a REST connection with IP. This is what other quarch applications do.
326
+ if specifiedDevice is None: #Only True if TCP not found or errored
327
+ try:
328
+ restCon = connection_ReST.ReSTConn(str(ipAddressLookup).replace("\r\n", ""))
329
+ restDevice = restCon.sendCommand("*enclosure?") #Try use enclosure for PPMs
330
+ if "fail" in restDevice.lower(): # This will fail nicely for other modules
331
+ restDevice = restCon.sendCommand("*serial?") # and serial number will be used in place.
332
+ if not str(restDevice).startswith("QTL"):
333
+ restDevice = "QTL" + restDevice
334
+ # Exit as device was found correctly
335
+ # Add the item to list
336
+ lan_modules["REST:" + str(ipAddressLookup).replace("\r\n", "")] = restDevice
337
+ specifiedDevice=None # Don't return rest connection, to bypass tcp parsing.
338
+ except Exception as e:
339
+ logging.warning("Error During REST scan of IP address " + str(ipAddressLookup) + " Error: " + str(e))
340
+ logging.warning("Please check the IP address and that you can ping it.\r\n")
341
+ try:
342
+ # from threading import Thread
343
+ # t = Thread(target=connection_TCP.TCPConn, args=(str(ipAddressLookup).replace("\r\n", ""),))
344
+ # t.daemon = True
345
+ # t.start()
346
+ # t.join(50)
347
+ # if t.is_alive():
348
+ # raise TimeoutError("Timeout during TCP Connection attempt.")
349
+
350
+ tcpCon= connection_TCP.TCPConn(str(ipAddressLookup).replace("\r\n", ""))
351
+ tcpDevice = tcpCon.sendCommand("*enclosure?") #Try use enclosure for PPMs
352
+ if "fail" in tcpDevice.lower(): # This will fail nicely for other modules
353
+ tcpDevice = tcpCon.sendCommand("*serial?") # and serial number will be used in place.
354
+ if not str(tcpDevice).startswith("QTL"):
355
+ tcpDevice = "QTL" + tcpDevice
356
+ # Exit as device was found correctly
357
+ # Add the item to list
358
+ lan_modules["TCP:" + str(ipAddressLookup).replace("\r\n", "")] = tcpDevice
359
+ specifiedDevice=None # Don't return tcp connection, to bypass tcp parsing.
360
+ except Exception as e:
361
+ logging.warning("Error During TCP scan of IP address " + str(ipAddressLookup) + " Error: " + str(e))
362
+ logging.warning("Please check the IP address and that you can ping it.\r\n")
363
+ # Needs to return None so previous method will not attempt another lookup.
364
+ return specifiedDevice
365
+
366
+
367
+
368
+ def getSerialNumberFromConnectionTarget(connectionTarget):
369
+ """
370
+ Takes in the connection target and returns the serial number of a module found on the standard scan.
371
+
372
+ Parameters
373
+ ----------
374
+ connectionTarget= : str
375
+ The connection target of the module you would like to know the serial number of.
376
+
377
+ Returns
378
+ -------
379
+ ret_val : str
380
+ The Serial number of the supplied device.
381
+
382
+ """
383
+ myDict = scanDevices(favouriteOnly=False)
384
+ for k,v in myDict.items():
385
+ if k == connectionTarget:
386
+ return v
387
+ return None
388
+
389
+
390
+ def get_connection_target(module_string ,scan_dictionary=None, connection_preference= None, include_conn_type = True):
391
+ """
392
+ Takes in the connection type and serial number of a module and returns the connection target.
393
+
394
+ Parameters
395
+ ----------
396
+ module_string= : str
397
+ The connection type and serial number combination eg. TCP:QTL1999-05-005.
398
+
399
+ scan_dictionary= :dict, optional
400
+ A scan dictionary can be passed so that a scan does not need to take place on every call.
401
+ This would be advised if calling this for every item in a list of serial numbers.
402
+
403
+ connection_preference= : list str, optional
404
+ The preference of which connection type to prioratise if none it given.
405
+ Defaults to "USB", "TCP", "SERIAL", "REST", "TELNET" in that order.
406
+
407
+ include_conn_type = : boolean, optional
408
+ Decided whether the connection type will appear in the return value eg. TCP:192.168.1.1 vs 192.168.1.1
409
+
410
+ Returns
411
+ -------
412
+ ret_val : str
413
+ The Connection target of the supplied device.
414
+ """
415
+ logging.debug("Getting connection target for : "+ str(module_string))
416
+ if connection_preference == None:
417
+ connection_preference = ["USB", "TCP", "SERIAL", "REST", "TELNET"]
418
+ module_string.replace("::", ":") #QIS/QPS format to QuarchPy format
419
+ delimeter_pos = module_string.find(":")
420
+ if delimeter_pos == -1:
421
+ con_type = None
422
+ serial_number = module_string.lower()
423
+ else:
424
+ con_type = module_string[:delimeter_pos]
425
+ serial_number = module_string[delimeter_pos + 1:].lower()
426
+ if serial_number.find("qtl") !=-1:
427
+ serial_number=serial_number.replace("qtl","")
428
+ if scan_dictionary is None:
429
+ logging.debug("Scanning for devices...")
430
+ scan_dictionary = scanDevices(favouriteOnly=False,filterStr=[serial_number])
431
+
432
+ ret_val="Fail Module Not Found"
433
+
434
+ if con_type is None:
435
+ connection_found = False
436
+ for con_type in connection_preference:
437
+ if connection_found is False:
438
+ for k, v in scan_dictionary.items():
439
+ if k.__contains__(con_type):
440
+ ret_val = k
441
+ connection_found = True
442
+ else:
443
+ for k, v in scan_dictionary.items():
444
+ if k.lower().__contains__(con_type.lower()):
445
+ ret_val=k
446
+
447
+ if not include_conn_type and not ret_val.__contains__("Fail"):
448
+ delimeter_pos = ret_val.find(":")
449
+ ret_val = ret_val[delimeter_pos + 1:]
450
+
451
+ return ret_val
452
+
453
+
454
+ '''
455
+ Scans for Quarch modules across the given interface(s). Returns a dictionary of module addresses and serial numbers
456
+ '''
457
+ def filter_module_type(module_type_filter, found_devices):
458
+ """
459
+ Used in scandevices to filter modules by their type.
460
+ Uses config files.
461
+
462
+ :param module_type_filter: Acceptable values are 'Cable', 'Card', 'Drive', 'Power', 'Switch'
463
+ :param found_devices: List of found devices passed from scan_devices
464
+ :return: Returns all devices in found devices that are of 'module filter type'
465
+ """
466
+ accepted_qtl_numbers = return_module_type_list(module_type_filter)
467
+ accepted_qtl_numbers = [x.lower() for x in accepted_qtl_numbers]
468
+ filtered_devices = {}
469
+ if not accepted_qtl_numbers:
470
+ return {}
471
+ for key, value in found_devices.items():
472
+ if "qtl" in str(value).lower():
473
+ qtl_num = str(value[str(value.lower()).index("qtl"):str(value).index("-")]).lower()
474
+ if any(qtl_num in x for x in accepted_qtl_numbers):
475
+ filtered_devices.update({key: value})
476
+ return filtered_devices
477
+
478
+ def scan_mDNS(mdnsListener):
479
+ from zeroconf import ServiceBrowser, Zeroconf
480
+ zeroconf = Zeroconf()
481
+ listener = mdnsListener
482
+ browser = ServiceBrowser(zeroconf, "_http._tcp.local.", listener)
483
+
484
+
485
+ '''
486
+ Scans for Quarch modules across the given interface(s). Returns a dictionary of module addresses and serial numbers
487
+ '''
488
+ def scanDevices(target_conn="all", lanTimeout=1, scanInArray=True, favouriteOnly=True,filterStr=None,
489
+ module_type_filter=None, ipAddressLookup=None):
490
+ foundDevices = dict()
491
+ scannedArrays = list()
492
+ mdnsListener = MyListener()
493
+ scan_mDNS(mdnsListener)
494
+
495
+ if target_conn.lower() == "all":
496
+ foundDevices = list_USB()
497
+ foundDevices = mergeDict(foundDevices, list_serial())
498
+ try:
499
+ #This will fail if the test machine is not connected to a network
500
+ foundDevices = mergeDict(foundDevices, list_network("all", ipAddressLookup=ipAddressLookup, lanTimeout=lanTimeout))
501
+ try:
502
+ foundDevices = mergeDict(foundDevices, mdnsListener.found_devices)
503
+ except Exception as mdnsExcept:
504
+ logging.debug("An error occurred while trying to use the mdns listner to scan\n" +str(mdnsExcept))
505
+ except Exception as e:
506
+ logging.error(e)
507
+ logging.warning("Network scan failed, check network connection")
508
+
509
+ if target_conn.lower() == "serial":
510
+ foundDevices = list_serial()
511
+
512
+ if target_conn.lower() == "usb":
513
+ foundDevices = list_USB()
514
+
515
+ if target_conn.lower() == "tcp" or target_conn.lower() == "rest" or target_conn.lower() == "telnet":
516
+ foundDevices = list_network(target_conn, ipAddressLookup=ipAddressLookup, lanTimeout=lanTimeout)
517
+
518
+ if (scanInArray):
519
+ for k, v in foundDevices.items(): # k=Connection target, v=serial number
520
+ if (k not in scannedArrays):
521
+ scannedArrays.append(k)
522
+ if (isThisAnArrayController(v)):
523
+ try:
524
+ myQuarchDevice = quarchDevice(k)
525
+ myArrayControler = quarchArray(myQuarchDevice)
526
+ scanDevices = myArrayControler.scanSubModules()
527
+ foundDevices = mergeDict(foundDevices, scanDevices)
528
+ myArrayControler.closeConnection()
529
+ except Exception as e:
530
+ logging.debug(e, exc_info=True)
531
+ logging.debug("Cannot get serial number. Quarch device may be in use by another program.")
532
+ foundDevices[k] = "DEVICE IN USE"
533
+
534
+ if (favouriteOnly):
535
+
536
+ # Sort list in order of connection type preference. Can be changed by changing position in conPref list. This must be done so that it is in the correct format for picking the favourite connections.
537
+ index = 0
538
+ sortedFoundDevices = {}
539
+ conPref = ["USB", "TCP", "SERIAL", "REST", "TELNET"]
540
+ while len(sortedFoundDevices) != len(foundDevices):
541
+ for k, v in foundDevices.items():
542
+ if conPref[index] in k:
543
+ sortedFoundDevices[k] = v
544
+ index += 1
545
+ foundDevices = sortedFoundDevices
546
+
547
+ # new dictionary only containing one favourite connection to each device.
548
+ favConFoundDevices = {}
549
+ index = 0
550
+ for k, v in sortedFoundDevices.items():
551
+ if (favConFoundDevices == {} or not v in favConFoundDevices.values()):
552
+ favConFoundDevices[k] = v
553
+ foundDevices = favConFoundDevices
554
+
555
+ # Sort by alphabetic order of key
556
+ sortedFoundDevices = {}
557
+ sortedFoundDevices = sorted(foundDevices.items(), key=operator.itemgetter(1))
558
+ foundDevices = dict(sortedFoundDevices)
559
+ if filterStr != None:
560
+ filteredDevices = {}
561
+ for k, v in foundDevices.items():
562
+ for j in filterStr:
563
+ if (j in v or "LOCKED MODULE" in v): #show locked modules too incase the module you are looking for is on the system but is locked
564
+ filteredDevices[k] = v
565
+ foundDevices = filteredDevices
566
+
567
+ # used to filter module via type ( Power / Drive / ...)
568
+ if module_type_filter:
569
+ foundDevices = filter_module_type(module_type_filter, foundDevices)
570
+
571
+ return foundDevices
572
+
573
+
574
+ '''
575
+ Prints out a list of Quarch devices nicely onto the terminal, numbering each unit
576
+ '''
577
+ def listDevices(scanDictionary):
578
+ if not scanDictionary:
579
+ printText("No quarch devices found to display")
580
+ else:
581
+ x = 1
582
+ for k, v in scanDictionary.items():
583
+ printText('{0:>3}'.format(str(x)) + " - " + '{0:<18}'.format(
584
+ v) + "\t" + k) # add padding to keep responses in line
585
+ x += 1
586
+
587
+
588
+ '''
589
+ Requests the user to select one of the devices in the given list
590
+ '''
591
+ def userSelectDevice(scanDictionary=None, scanFilterStr=None,favouriteOnly=True, message=None, title=None, nice=False, additionalOptions = None, target_conn="all"):
592
+ if User_interface.instance != None and User_interface.instance.selectedInterface == "testcenter":
593
+ nice = False
594
+ if message is None: message = "Please select a quarch device"
595
+ if title is None: title = "Select a Device"
596
+ ip_address = None
597
+ while (True):
598
+ # Scan first, if no list is supplied
599
+ if (scanDictionary is None):
600
+ printText("Scanning for devices...")
601
+ if ip_address == None:
602
+ scanDictionary = scanDevices(filterStr=scanFilterStr, favouriteOnly=favouriteOnly, target_conn=target_conn)
603
+ else:
604
+ scanDictionary = scanDevices(filterStr=scanFilterStr, favouriteOnly=favouriteOnly, target_conn=target_conn, ipAddressLookup=ip_address)
605
+
606
+ if len(scanDictionary)<1:
607
+ scanDictionary["***No Devices Found***"]="***No Devices Found***"
608
+
609
+
610
+ if nice: #Prepair the data for niceListSelection using displayTable().
611
+ if additionalOptions is None: additionalOptions = ["Specify IP Address","Rescan","Quit"]
612
+ tempList = []
613
+ tempEl = []
614
+ for k, v in scanDictionary.items():
615
+ tempEl = []
616
+ tempEl.append(v)
617
+ charPos = k.find(":")
618
+ tempEl.append(k)
619
+ tempList.append(tempEl)
620
+ adOp =[]
621
+ for option in additionalOptions:
622
+ adOp.append([option]*2) # Put option in all columns
623
+ #adOp.append([option,"-"])
624
+ userStr = listSelection(title, message, tempList, additionalOptions=adOp, indexReq=True, nice=nice, tableHeaders=["Selection", "Description"])
625
+ userStr = userStr[2] #With the data formatted in this way the ConnTarget will always be in userStr[2]
626
+
627
+ else: # Prepare data for old style selection or testCenter
628
+ devicesString = []
629
+ for k, v in scanDictionary.items():
630
+ charPos = k.find(":")
631
+ devicesString.append(k + '=' + v + ": " + k[:charPos])
632
+ devicesString = ','.join(devicesString)
633
+ if additionalOptions is None :
634
+ additionalOptions = "Specify IP Address=IP Scan,Rescan=Rescan,Quit=Quit"
635
+ userStr = listSelection(title=title,message=message,selectionList=devicesString, additionalOptions=additionalOptions)
636
+
637
+ # Process the user response
638
+ if (userStr.lower() in 'quit'):
639
+ return "quit"
640
+ elif (userStr.lower() in 'rescan'):
641
+ ip_address = None
642
+ scanDictionary = None
643
+ favouriteOnly = True
644
+ elif (userStr.lower() in 'all conn types'):
645
+ ip_address = None
646
+ scanDictionary = None
647
+ favouriteOnly = False
648
+ elif(userStr.lower() in 'specify ip address'):
649
+ ip_address = requestDialog("Please input IP Address of the module you would like to connect to: ")
650
+ scanDictionary = None
651
+ favouriteOnly = False
652
+ else:
653
+ # Return the address string of the selected module
654
+ return userStr
655
+
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: quarchpy
3
- Version: 2.1.24.dev2
3
+ Version: 2.1.24.dev4
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
@@ -2,17 +2,21 @@ quarchpy/LICENSE.rst,sha256=SmYK6o5Xs2xRaUwYT-HqNDRu9eygu6y9QwweXNttiRc,3690
2
2
  quarchpy/QuarchPy Function Listing.xlsx,sha256=NE68cZPn7b9P3wcnCsnQr3H6yBkt6D5S6dH6457X520,31245
3
3
  quarchpy/README.txt,sha256=-LbrJ5rCPGSxoBmvr9CxJVokQUDwZSjoHa43eN8bWck,980
4
4
  quarchpy/__init__.py,sha256=0aEaJ1Aduzm1g_1OvibCDm5j2PcZAh-OPdVWiXZwF_E,3090
5
- quarchpy/_version.py,sha256=DWw4P8kmZVPmZY4OHt24ZgBOot_VAm-02sScFSDUbZI,27
5
+ quarchpy/_version.py,sha256=7JXuR6Iu5TL3ORCOcm0I8fTXgxeTSfK1wjhRA_papEQ,27
6
+ quarchpy/_version.py.bak,sha256=LwRNPO0mit7fBI4ePuiG42FK_PW44fibu4bi3333LWA,27
6
7
  quarchpy/connection.py,sha256=9lPIUP4LCWkFAedc8CWorDY-3ujdAA-cyeNkSBdIv9E,2226
7
8
  quarchpy/launchQPSJ21.bat,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
8
9
  quarchpy/run.py,sha256=mRp9IGPs-wdGisKK1FG_9DciFx_V0LePH5mfkTPhsd4,9681
9
10
  quarchpy/.idea/.gitignore,sha256=4uN-1gxQ2OQcQqqfNQVkKl8WieZ_trx_6KBtqwmg-pY,50
10
- quarchpy/.idea/.name,sha256=13uySwjL8JErhUJXY1STDfm2bcai4avuZB1drMz0dck,11
11
+ quarchpy/.idea/.name,sha256=Z0w79DYY3o5FZDJpHMs2Rb_ooPlznKnemSWw-jFRCXk,14
11
12
  quarchpy/.idea/misc.xml,sha256=njbmweQkO94aRIK_Z8dZDifybOXO9VrC_K3UDiYEiTE,189
12
13
  quarchpy/.idea/modules.xml,sha256=pIQEC9RvqPyHKJcSkJ4i1fHWx6zcC-D8tNGREb6Au1Y,649
13
14
  quarchpy/.idea/quarchpy.iml,sha256=YYqwuBAzDwOyZwSwAQ8jDY5X-cmbNp-VAITW-h1uLdQ,688
14
- quarchpy/.idea/workspace.xml,sha256=43POpyW5eockuQ4xxL1YWk0bFDr1OFL0XdVRn5I_KYE,17688
15
+ quarchpy/.idea/workspace.xml,sha256=GS0y52z-EHiEpNwssZ47qFW6zbQWFcH0X2h56wpO3X0,18734
15
16
  quarchpy/.idea/inspectionProfiles/profiles_settings.xml,sha256=YXLFmX7rPNGcnKK1uX1uKYPN0fpgskYNe7t0BV7cqkY,174
17
+ quarchpy/__pycache__/__init__.cpython-311.pyc,sha256=hCNane24BOaTOLH7AuH65LSZYyBQqhMG_LRK5tVjq8g,5074
18
+ quarchpy/__pycache__/_version.cpython-311.pyc,sha256=HfUbx31bSFgB-wNMFpVZiMmA3VtV_MV6nlmjfe4DhhE,198
19
+ quarchpy/__pycache__/connection.cpython-311.pyc,sha256=ho3AhQMhS0nSVxbVoYgFpfEKXD4NYmQ65K5hUbnlvAA,3677
16
20
  quarchpy/config_files/__init__.py,sha256=bP9FM5hjP0r7s8qmWqcsVjAfHM0B4XY7cz5sTpe2HDA,290
17
21
  quarchpy/config_files/quarch_config_parser.py,sha256=mjP-uO58hVlHm25ZAFjX9Zwhn8z0np4vveLNHtx8Bt4,28891
18
22
  quarchpy/config_files/Cable_Modules/QTL1253-01 - Mini SAS Module Config v3.5 c1.3.qfg,sha256=hJnFfjsqiNZXYWHx2kn43Gnr2xqmJth4GGVd8VKU5_k,4923
@@ -225,6 +229,8 @@ quarchpy/config_files/Switch_Modules/QTL1490-xx - SATA Keyed HS Module Config v4
225
229
  quarchpy/config_files/Switch_Modules/QTL1530-xx - 1-8 DP MUX Module Config v4.000.qfg,sha256=LXfFCsOhfq23zMMawLybV7TLq2-NgDzy7xuANsYykOw,2937
226
230
  quarchpy/config_files/Switch_Modules/QTL1564-xx - 12 Port Mini SAS HD MUX Module Config v4.000.qfg,sha256=BLxvMtnvzrnaltQ1MOfghE5iilYx0weQyhgHm5isEMc,3754
227
231
  quarchpy/config_files/Switch_Modules/QTL1584-xx - 1-4 ExpressCard MUX Module Config v4.000.qfg,sha256=SxUIw_hoWjGFD-WyQl57jNpjS5D1k4SqbGYINsydu_c,1520
232
+ quarchpy/config_files/__pycache__/__init__.cpython-311.pyc,sha256=nE6cGoasfT2xsOoQ6gPiOAKYlTxVV7MuK4saXVJII04,513
233
+ quarchpy/config_files/__pycache__/quarch_config_parser.cpython-311.pyc,sha256=56gZbkRCylGHDTwByKtQLmclgP_-yHo4TfqCpYVBmn4,28182
228
234
  quarchpy/connection_specific/StreamChannels.py,sha256=_xBEgDpTCeQue-bsv3fwO3aN1JPWvbuvK3ZwTgvXB4c,601
229
235
  quarchpy/connection_specific/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
230
236
  quarchpy/connection_specific/connection_QIS.py,sha256=pYnNYU32M5g_tInT8vjquWVNfeFLjAh2imIh2rl1TLc,84667
@@ -360,6 +366,15 @@ quarchpy/connection_specific/QPS/win-amd64/resources/QuarchIcon_32x32.png,sha256
360
366
  quarchpy/connection_specific/QPS/win-amd64/resources/QuarchIcon_64x64.png,sha256=5AKs5vpm0kppyBYUT6J3uDC88Jhd5b8bI2yuV2YvYRI,3589
361
367
  quarchpy/connection_specific/QPS/win-amd64/resources/profiles/3_PHASE_PAM_AC_DEFAULT.scf,sha256=chYHStobI-z8ZeNTtfyLoFECSX6QAANk3xYC9R5WLSA,6001
362
368
  quarchpy/connection_specific/QPS/win-amd64/resources/profiles/3_PHASE_PAM_AC_FULL.scf,sha256=cxAhAocxwSBWa4jaBlvIOjwUz7zfCb1V6nJVkOrLlGE,9946
369
+ quarchpy/connection_specific/__pycache__/StreamChannels.cpython-311.pyc,sha256=YYmUcHSYpIKVvUPGdYJ0U3W4VoPp2LI7Y49vqKKpK1A,2000
370
+ quarchpy/connection_specific/__pycache__/__init__.cpython-311.pyc,sha256=LWUAdE8NP2KBYGj85A8Q7GDg-FF3m9NwwXheN2jwH_E,222
371
+ quarchpy/connection_specific/__pycache__/connection_QIS.cpython-311.pyc,sha256=TvXUCChgdNqwmaWCyxzRZD5jkYHqfXoLYtd4Btie-8o,82706
372
+ quarchpy/connection_specific/__pycache__/connection_QPS.cpython-311.pyc,sha256=SpisRWOHKpBqxuIi7yUUFD42NMce5vtjHhp3b46l_R4,9882
373
+ quarchpy/connection_specific/__pycache__/connection_ReST.cpython-311.pyc,sha256=VLbtDL1MT7IvFPw-CMTs9hAd3FoZKoBTkrU3qp2yR-c,2980
374
+ quarchpy/connection_specific/__pycache__/connection_Serial.cpython-311.pyc,sha256=AtrGc38VNHLgp970mrRq7vPI3tBHmipb7OTm8VsCD8o,2893
375
+ quarchpy/connection_specific/__pycache__/connection_TCP.cpython-311.pyc,sha256=AAyFOBCrsaqxv1TDhUkRiqrhr38g7_d7ypo2_8zVLx4,3054
376
+ quarchpy/connection_specific/__pycache__/connection_USB.cpython-311.pyc,sha256=urMpD9EVG-Yn2pjAskVaO9PNno19c9p0_dtju6AmF2k,30344
377
+ quarchpy/connection_specific/__pycache__/connection_mDNS.cpython-311.pyc,sha256=9-0DLiZoYj-szhGoPuxgX6NuZLOTdxloSG_oNEDppEk,3788
363
378
  quarchpy/connection_specific/jdk-j21-jres/JDK 21 JREs Notes.txt,sha256=DrWGO8jAw4S3HZDApTCPDTrDEmIYlK3BPx36pl2GaXI,6827
364
379
  quarchpy/connection_specific/jdk-j21-jres/lin-amd64-jdk-21-jre/release,sha256=7pWiOr3SU2IINJwflNCzV4zgi6UmWjBuUoikxy2nkW4,807
365
380
  quarchpy/connection_specific/jdk-j21-jres/lin-amd64-jdk-21-jre/bin/java,sha256=D5w14FfXlOJ1glU0Dp-NBUU60SoswZ3wwRPkAoUzTvM,12296
@@ -1186,6 +1201,10 @@ quarchpy/connection_specific/serial/serialposix.py,sha256=LUDorzZNdg2rpou_Ys0drl
1186
1201
  quarchpy/connection_specific/serial/serialutil.py,sha256=V-AeEMJyl8GvijaiildLRY8k-IOAZpW-YeBxHV2iDvg,21692
1187
1202
  quarchpy/connection_specific/serial/serialwin32.py,sha256=tMa-81Oh1c4g5nHf86v2eDnLKb7JHAG-vEQZfq2q_Jo,20087
1188
1203
  quarchpy/connection_specific/serial/win32.py,sha256=-GiHVB-QFrQfD4vHelhaEccwfW__6kC2S_46lIYLVsM,10853
1204
+ quarchpy/connection_specific/serial/__pycache__/__init__.cpython-311.pyc,sha256=duGFeTr5x0uhXGFk8Kf33DhjIROIEuT-C-flB_a7dsc,3275
1205
+ quarchpy/connection_specific/serial/__pycache__/serialutil.cpython-311.pyc,sha256=81al1YkJLeWCZTF5CjHD3V3qXMLipHvOqleoo1Acebs,29303
1206
+ quarchpy/connection_specific/serial/__pycache__/serialwin32.cpython-311.pyc,sha256=Xlly1jJOVMn2-ulUpHzO_zNZxEeKBNJ-DkHMaREdHhM,25087
1207
+ quarchpy/connection_specific/serial/__pycache__/win32.cpython-311.pyc,sha256=1XukqU40Q8eRVT84G7U0-QdItNj0hcpZufk2hM9z5xE,9565
1189
1208
  quarchpy/connection_specific/serial/threaded/__init__.py,sha256=EHay8pD__ePKaa-WvweNjWe9V1SUgZMefNnayVyiwRw,9272
1190
1209
  quarchpy/connection_specific/serial/tools/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
1191
1210
  quarchpy/connection_specific/serial/tools/hexlify_codec.py,sha256=1lvd2TFWYUsYMRt7nsyw0VfHTRfl57Hl6kdCmNhMkC4,3637
@@ -1196,6 +1215,10 @@ quarchpy/connection_specific/serial/tools/list_ports_osx.py,sha256=omNNZ4yYAEQfQ
1196
1215
  quarchpy/connection_specific/serial/tools/list_ports_posix.py,sha256=EFZtHqrOGYoLpAp-2Qjfro3G9NlceFkghoEzGBoSko4,4358
1197
1216
  quarchpy/connection_specific/serial/tools/list_ports_windows.py,sha256=Y43XEmCQIHjqTts3HSt0RDIODIs4DwiikoeMFw-a2WQ,11119
1198
1217
  quarchpy/connection_specific/serial/tools/miniterm.py,sha256=tRUuxzukL2wIF8GWCK67DlhENZXfMcUXhdprUwpe0XQ,35085
1218
+ quarchpy/connection_specific/serial/tools/__pycache__/__init__.cpython-311.pyc,sha256=r5gr43DPv4WZclmaEUaRWycgACHuxK-M_eRVebj7bwY,235
1219
+ quarchpy/connection_specific/serial/tools/__pycache__/list_ports.cpython-311.pyc,sha256=EADnZK21na9yOCQOoipw618HEcH17jIQR0k87gEJ5M4,4610
1220
+ quarchpy/connection_specific/serial/tools/__pycache__/list_ports_common.cpython-311.pyc,sha256=iPqEghkXo4wW5AigEQ8XxiwWan0CXnInbuY_xFsNDSo,5171
1221
+ quarchpy/connection_specific/serial/tools/__pycache__/list_ports_windows.cpython-311.pyc,sha256=vvqOx6lRkIV3M_Mm_CkXUbQTLFLsF976FEkdURy1LZk,12034
1199
1222
  quarchpy/connection_specific/serial/urlhandler/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
1200
1223
  quarchpy/connection_specific/serial/urlhandler/protocol_alt.py,sha256=9appz9cI17w_6wPcKPDnSK340eiaG-iHBYDm91qAbxg,1803
1201
1224
  quarchpy/connection_specific/serial/urlhandler/protocol_hwgrep.py,sha256=nEU26Rjo4GhEXG2Q1zdy7shyb3_dgXZFF94qPblawsk,2950
@@ -1210,6 +1233,8 @@ quarchpy/connection_specific/usb_libs/MS32/__init__.py,sha256=47DEQpj8HBSa-_TImW
1210
1233
  quarchpy/connection_specific/usb_libs/MS32/libusb-1.0.dll,sha256=I-lcEsC7bWOoTGACmNzenKnKlZxeOXv_fs4O2UqDwuo,97280
1211
1234
  quarchpy/connection_specific/usb_libs/MS64/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
1212
1235
  quarchpy/connection_specific/usb_libs/MS64/libusb-1.0.dll,sha256=kkMfbwPZWak7xgeZH4IYcxc6xXd764fgqQF5T_9z8yg,116224
1236
+ quarchpy/connection_specific/usb_libs/__pycache__/libusb1.cpython-311.pyc,sha256=70ngILPyxA5CouSYTM9pyEHgorbrxRyeFno-H_usqYs,36190
1237
+ quarchpy/connection_specific/usb_libs/__pycache__/usb1.cpython-311.pyc,sha256=ttUg6j6uzG77dkqfRjWu-GUbDHapFkAJB09_Vg_2LiY,105656
1213
1238
  quarchpy/debug/SystemTest.py,sha256=viZDYnXuzp3e6atS5TF_3P4cgRqTBajob3j87c4OWn8,6817
1214
1239
  quarchpy/debug/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
1215
1240
  quarchpy/debug/__main__.py,sha256=-7ofWPl6ihnVHs1xWyYzpIwzc2-qpW9GhUYV09_xl-k,48
@@ -1217,16 +1242,30 @@ quarchpy/debug/module_debug.py,sha256=_ZXaoy8q2BrhsPmJYNHa9dvmWpMMfxmaMOdOS51tyI
1217
1242
  quarchpy/debug/simple_terminal.py,sha256=YkkPQWUuG8OofrX2lce3LoxWHbDQmeJ3g2goCqrrULo,2030
1218
1243
  quarchpy/debug/upgrade_quarchpy.py,sha256=Yt8K1JPhmPH85WwvELGgGugHBtzC8amp7Gr0YNkqwL0,4298
1219
1244
  quarchpy/debug/versionCompare.py,sha256=AkJxHKd6hsnXnWr-Pmo3tc2sekL9uKOvGhYksM1dgp0,2397
1245
+ quarchpy/debug/__pycache__/SystemTest.cpython-311.pyc,sha256=_II4wVrOjqJjxaaQXUATD0NSbDnVqotECvoGUnf7eX8,10854
1246
+ quarchpy/debug/__pycache__/__init__.cpython-311.pyc,sha256=FalrCcb-Vgj0XsUZb-kW7MeTXjg1e51uHfP9T0g46kM,208
1247
+ quarchpy/debug/__pycache__/versionCompare.cpython-311.pyc,sha256=mZlODADMZWMVnSZx6RMe79MKIATfgHNlx9Yi_l-TOR0,2663
1220
1248
  quarchpy/device/__init__.py,sha256=quGTPdm5o0RsLBCwPLWA_LWMQjCgdkbh1MCcX89-rGU,559
1221
1249
  quarchpy/device/device.py,sha256=5H3lBjrwckYuew1x6JXsiXTqGTWg0fGBaYzdTD3fXRM,22294
1222
1250
  quarchpy/device/quarchArray.py,sha256=_8z6P1wCtIs2kkkAzNRc1YrT-NmGRvzd3btqa-Yl3Hc,2816
1223
1251
  quarchpy/device/quarchPPM.py,sha256=DnqkdxDjyu533RL2ZL0ISpe2nSXTkm4O6jFqAnZZf6g,3271
1224
1252
  quarchpy/device/quarchQPS.py,sha256=D6v0l-MwoABP3Lz5l3bnLJMfIpghAZZ319j4m5RRKvw,18780
1225
- quarchpy/device/scanDevices.py,sha256=j0WwPuJAFFJwP7zv-W6zMb4v0nPIUfdIU_Ntpu8UQqs,28871
1253
+ quarchpy/device/scanDevices.py,sha256=cXBnBb6_QIaIxS1qhWiMPkbYLqu34LB1v_q-c-fYROE,28871
1254
+ quarchpy/device/scanDevices.py.bak,sha256=2qq9vpaATCd9tH5P4ZIHsQ1prkR8DsW0TiDHVR244Aw,28878
1255
+ quarchpy/device/__pycache__/__init__.cpython-311.pyc,sha256=3RVGRWzAz2ikB9pqThm8OPiqpY1zsXx46t25s0eAyPY,830
1256
+ quarchpy/device/__pycache__/device.cpython-311.pyc,sha256=KoOysrTzD37BddEY6vBriQQx-YQQQD0M5RD_FI2SscQ,23708
1257
+ quarchpy/device/__pycache__/quarchArray.cpython-311.pyc,sha256=fXYuoZoVIVcq4tGEb-GXxTn79cJQ_IyfgLXlI20ZLgs,3877
1258
+ quarchpy/device/__pycache__/quarchPPM.cpython-311.pyc,sha256=NwuFww49zzwIkmFwy5sWK_FvMK7Lgwbw02L6a2aO46A,4866
1259
+ quarchpy/device/__pycache__/quarchQPS.cpython-311.pyc,sha256=oSBP_1HVZ6IFCYGvAbwDWSU2BvW6Emr1NKyKYtE9odw,23330
1260
+ quarchpy/device/__pycache__/scanDevices.cpython-311.pyc,sha256=CMQ5x6AJNw_Df2fQUUiwm3XR6OByOGMA5qn_52yBuuQ,32970
1226
1261
  quarchpy/disk_test/AbsDiskFinder.py,sha256=QhtekaSSKubikGM7aqZ916u7Cc22FLEB7CqGiEvdByc,377
1227
1262
  quarchpy/disk_test/DiskTargetSelection.py,sha256=BY3zc7mg7FPxEp9OB2yRkyYIHRwrAB6U0XrsSWZrKU4,925
1228
1263
  quarchpy/disk_test/__init__.py,sha256=3-LXyQMX5macnPaHc8J3mcJQ7faTInycD8-skQYyFbE,59
1229
1264
  quarchpy/disk_test/iometerDiskFinder.py,sha256=hdZpGbhzXRctI58bqhi3_ZVrmVtB03tIQNHgH-RZBxM,6986
1265
+ quarchpy/disk_test/__pycache__/AbsDiskFinder.cpython-311.pyc,sha256=G0SkRwPmMkMndqWs17FfIND9bicE82-R2DppeIR2CoI,1081
1266
+ quarchpy/disk_test/__pycache__/DiskTargetSelection.cpython-311.pyc,sha256=Icj4D8hQi-LI4l9WNCYDy3PHoFw4IusZ7T-FNpeLETc,983
1267
+ quarchpy/disk_test/__pycache__/__init__.cpython-311.pyc,sha256=DZCEVin-mCQoJ_A6ydid9RNMUpAUW6tNVt2ygZclTFU,292
1268
+ quarchpy/disk_test/__pycache__/iometerDiskFinder.cpython-311.pyc,sha256=gLgNMhT97jwKOkVtUkrsYm-ze0ZXlVG4BJqjYW9wAIg,8199
1230
1269
  quarchpy/docs/CHANGES.rst,sha256=2boZlL7viw5j95o72AeKsDBZJbkAJskStTjKih3AuI8,8924
1231
1270
  quarchpy/docs/Makefile,sha256=i2WHuFlgfyAPEW4ssEP8NY4cOibDJrVjvzSEU8_Ggwc,634
1232
1271
  quarchpy/docs/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
@@ -1339,23 +1378,39 @@ quarchpy/fio/__init__.py,sha256=keB7UPgsLZ8PNdnM5UKdAVPW3PBMTz6vT0AfQaigGZ0,61
1339
1378
  quarchpy/fio/fioDiskFinder.py,sha256=BfQMvIVDJzhuvmu8hmjO0xOecZ1KkCAiL98FQTcQXqQ,2965
1340
1379
  quarchpy/fio/performanceClass.py,sha256=HuhKBIb6z2yaZUU8VeKCls0PR0u82aJvKFOqb-eoZH4,38530
1341
1380
  quarchpy/fio/test_performance_class.py,sha256=bjU8taCRWPdPL4hoDqZbdzBTKihOPTmqYCaI2ZZG_Xo,20793
1381
+ quarchpy/fio/__pycache__/FIO_interface.cpython-311.pyc,sha256=lyXLcC351nESStp3-Upu4E6IA1XgFpUQkTXXvK3PVNw,12046
1382
+ quarchpy/fio/__pycache__/__init__.cpython-311.pyc,sha256=sjWpET79sgTs-1WflNDilqt004cRkp1WqVXXym1Id1o,291
1342
1383
  quarchpy/iometer/IometerTemplate.dat,sha256=BxaoPvJlAxpLgVt0y9T1jAisvZNggto9JlrVjqDifO4,2008
1343
1384
  quarchpy/iometer/__init__.py,sha256=mTPgmKsVUhvaXGqDq009vAGYZ0qrSf4W2QqWLhqGEVk,314
1344
1385
  quarchpy/iometer/gen_iometer_template.py,sha256=f0YM786dG4c1Bioq6zeclG83r8HBaffO2Pmt-hFDwkw,2163
1345
1386
  quarchpy/iometer/iometerFuncs.py,sha256=qc0GK2SiCUHU_7mGL0z35MyNCdTcfSEf2wR1zti6KDY,14178
1387
+ quarchpy/iometer/__pycache__/__init__.cpython-311.pyc,sha256=nbj8mBQZMeSLy924REUtJH01ESPX6BdjzGSxNtDNhDw,533
1388
+ quarchpy/iometer/__pycache__/gen_iometer_template.cpython-311.pyc,sha256=OBT8vYGe_iHxYUbkGC8U2QvuNGrwxev6YsNHtUuxLHY,2642
1389
+ quarchpy/iometer/__pycache__/iometerFuncs.cpython-311.pyc,sha256=n4xZmG0KF7KreBIbEEyMQsu7XKFs4zVzDvjwTeOS61U,14086
1346
1390
  quarchpy/qis/StreamHeaderInfo.py,sha256=ynKRSnZPrRK6qtREbn4YQgweY-WWlP98-gl1YB1syh8,8150
1347
1391
  quarchpy/qis/__init__.py,sha256=QRVPy96G7RUx6ldofcD-xNN4NHeNjkasSu8DXkyRB0k,307
1348
1392
  quarchpy/qis/qisFuncs.py,sha256=FhAQF-m-KtUMxBiONXlf0NoTpF6FkLoSkwFMgu4H7uQ,11721
1393
+ quarchpy/qis/__pycache__/StreamHeaderInfo.cpython-311.pyc,sha256=rP5gayKLUwsId3YGyypma-6fk_JXZv5Pwu65ChGHimY,7582
1394
+ quarchpy/qis/__pycache__/__init__.cpython-311.pyc,sha256=h7t1lhrnjVHUL4wvZJP9X3d8RRYgNZZxFPVdASB0eZ8,569
1395
+ quarchpy/qis/__pycache__/qisFuncs.cpython-311.pyc,sha256=755grz484-vAbRV0lgX9qftoN2wdR7l_ufoVDuLefh0,13816
1349
1396
  quarchpy/qps/__init__.py,sha256=5urxSvqUWmonIrhyvrSQDpNtZubfVEU8JrqRmzm4wH0,303
1350
1397
  quarchpy/qps/qpsFuncs.py,sha256=CZYQyoSwMbMgfsJCPEO2Y_h08nm4svz8CzVEBPWjoy4,12178
1398
+ quarchpy/qps/__pycache__/__init__.cpython-311.pyc,sha256=j141kJEXL31aox3lXmj2xSR0sHAXU9IVq5JnMWd-K5E,564
1399
+ quarchpy/qps/__pycache__/qpsFuncs.cpython-311.pyc,sha256=O8Jp5PeULuJe2GOSV0udVhMyVlDQFQFR8_Rv0UQsu8E,14586
1351
1400
  quarchpy/user_interface/__init__.py,sha256=ix0icQvmKUTRgvfhXK3PxiDGyITkPYY-08hFjuhbupo,298
1352
1401
  quarchpy/user_interface/user_interface.py,sha256=pL0wf9vVtO8S3_vox3duTTdSgrCVpcFKOZzwj4MMjAc,30075
1402
+ quarchpy/user_interface/__pycache__/__init__.cpython-311.pyc,sha256=2Ig69CppI4uG3Uw0VxRe4bfDP47iAt6EqQ_LfAKIvTo,258
1403
+ quarchpy/user_interface/__pycache__/user_interface.cpython-311.pyc,sha256=rdsSV_81Ga6tSMhFTEQnrRfj9_Bv_OS6oI5Ng0og_e0,33125
1353
1404
  quarchpy/utilities/BitManipulation.py,sha256=vLw2PF5z-d-2MY_yEU0l9FEBYTlCklM336XU2vPKAas,1016
1354
1405
  quarchpy/utilities/TestCenter.py,sha256=Andm9hBxIFU34snWc6uVGEVEqVbvF62Rh3czSx3kouc,4805
1355
1406
  quarchpy/utilities/TimeValue.py,sha256=nZUBT3nKICMy0zqz97fmF9sDy1h4aCdNIS7yXl0S3as,2157
1356
1407
  quarchpy/utilities/Version.py,sha256=i57qRgHwGSXf2wPVVNUZfG9Tu6f5hWxZLPy7XCw2WkQ,1578
1357
1408
  quarchpy/utilities/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
1358
- quarchpy-2.1.24.dev2.dist-info/METADATA,sha256=m4aL6t-yJqb1r3nrp4nlkqapiamFTApee804ApRPMnc,9777
1359
- quarchpy-2.1.24.dev2.dist-info/WHEEL,sha256=a-zpFRIJzOq5QfuhBzbhiA1eHTzNCJn8OdRvhdNX0Rk,110
1360
- quarchpy-2.1.24.dev2.dist-info/top_level.txt,sha256=Vc7qsvkVax7oeBaBy_e7kvJvqb_VAAJcW_MuDMmi5W8,9
1361
- quarchpy-2.1.24.dev2.dist-info/RECORD,,
1409
+ quarchpy/utilities/__pycache__/TestCenter.cpython-311.pyc,sha256=80Rr4SEmFdyqNwXqUb3IidLnPauIGDGoPnll_JV8Z48,7313
1410
+ quarchpy/utilities/__pycache__/TimeValue.cpython-311.pyc,sha256=GWzrEu1fzX7JULgrzVuFl8aVNaMUKXURUY2yAwbhXRo,2668
1411
+ quarchpy/utilities/__pycache__/Version.cpython-311.pyc,sha256=C5tM-1GBjmxJS8nlY5AjCMdPxW-oX1NmlJAGi3RRSxQ,2697
1412
+ quarchpy/utilities/__pycache__/__init__.cpython-311.pyc,sha256=UVS7BpP9Dg3A0PT2JmHeY988_h_o9XZjaCoJjOnP398,212
1413
+ quarchpy-2.1.24.dev4.dist-info/METADATA,sha256=1kmkdQwfHPHMm-HKFguSik1YPniQYSo-ttLtrATKZ4s,9777
1414
+ quarchpy-2.1.24.dev4.dist-info/WHEEL,sha256=a-zpFRIJzOq5QfuhBzbhiA1eHTzNCJn8OdRvhdNX0Rk,110
1415
+ quarchpy-2.1.24.dev4.dist-info/top_level.txt,sha256=Vc7qsvkVax7oeBaBy_e7kvJvqb_VAAJcW_MuDMmi5W8,9
1416
+ quarchpy-2.1.24.dev4.dist-info/RECORD,,