quarchpy 2.2.9.dev4__py2.py3-none-any.whl → 2.2.9.dev5__py2.py3-none-any.whl
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- quarchpy/__init__.py +1 -1
- quarchpy/__pycache__/__init__.cpython-310.pyc +0 -0
- quarchpy/__pycache__/_version.cpython-310.pyc +0 -0
- quarchpy/__pycache__/connection.cpython-310.pyc +0 -0
- quarchpy/_version.py +1 -1
- quarchpy/config_files/Cable_Modules/QTL1253-01 - Mini SAS Module Config v3.5 c1.3.qfg +196 -196
- quarchpy/config_files/Cable_Modules/QTL1253-01 - Mini SAS Module Config v4.000 c1.3.qfg +198 -198
- quarchpy/config_files/Cable_Modules/QTL1253-02 - Mini SAS Module Config v3.5 c1.3.qfg +196 -196
- quarchpy/config_files/Cable_Modules/QTL1253-02 - Mini SAS Module Config v4.000 c1.3.qfg +198 -198
- quarchpy/config_files/Cable_Modules/QTL1253-xx - Mini SAS Module Config v4.003 c1.6.qfg +197 -197
- quarchpy/config_files/Cable_Modules/QTL1271-xx - Ethernet Module Config v3.5 c1.2.qfg +188 -188
- quarchpy/config_files/Cable_Modules/QTL1271-xx - Ethernet Module Config v4.000 c1.2.qfg +190 -190
- quarchpy/config_files/Cable_Modules/QTL1271-xx - Ethernet Module Config v4.100 c1.3.qfg +189 -189
- quarchpy/config_files/Cable_Modules/QTL1292-xx - SFP+ Cable Pull Module Config v4.000 c1.1.qfg +154 -154
- quarchpy/config_files/Cable_Modules/QTL1309-04 - USB 3.0 Module Config v4.003 c1.2.qfg +187 -187
- quarchpy/config_files/Cable_Modules/QTL1309-xx - USB 3.0 Module Config v3.5 c1.1.qfg +187 -187
- quarchpy/config_files/Cable_Modules/QTL1309-xx - USB 3.0 Module Config v4.000 c1.1.qfg +188 -188
- quarchpy/config_files/Cable_Modules/QTL1366-xx - QSFP Cable Pull Module Config v4.000 c1.1.qfg +209 -209
- quarchpy/config_files/Cable_Modules/QTL1383-xx - eSATAp Module Config v4.000 c1.3.qfg +190 -190
- quarchpy/config_files/Cable_Modules/QTL1521-02 - Mini SAS HD Module Config v4.000 c1.1.qfg +210 -210
- quarchpy/config_files/Cable_Modules/QTL1521-03 - Mini SAS HD Module Config v4.000 c1.1.qfg +210 -210
- quarchpy/config_files/Cable_Modules/QTL1521-05 - Mini SAS HD Module Config v4.005 c1.1.qfg +209 -209
- quarchpy/config_files/Cable_Modules/QTL1521-05 - Mini SAS HD Module Config v4.007 c1.2.qfg +209 -209
- quarchpy/config_files/Cable_Modules/QTL1521-xx - Mini SAS HD Module Config v4.003 c1.5.qfg +209 -209
- quarchpy/config_files/Cable_Modules/QTL1663-xx - Quad QSFP Cable Pull Module Config v4.000 c1.1.qfg +308 -308
- quarchpy/config_files/Cable_Modules/QTL1675-05 - Mini SAS HD Module w Triggering Config v4.007 c1.3.qfg +211 -211
- quarchpy/config_files/Cable_Modules/QTL1675-xx - Mini SAS HD Module w Triggering Config v4.000 c1.1.qfg +210 -210
- quarchpy/config_files/Cable_Modules/QTL1917-xx - Dual SFP+ Cable Pull Module Config v4.000 c1.1.qfg +174 -174
- quarchpy/config_files/Cable_Modules/QTL1971-01 - USB TypeC Module Config v4.000 c1.1.qfg +203 -203
- quarchpy/config_files/Cable_Modules/QTL1971-02 - USB TypeC Module Config v4.000 c1.1.qfg +203 -203
- quarchpy/config_files/Cable_Modules/QTL2022-xx - RJ-45 Cable Module Config v4.104 c1.3.QFG +189 -189
- quarchpy/config_files/Cable_Modules/QTL2058-xx - External PCIe Module Config v4.001 c1.1.qfg +209 -209
- quarchpy/config_files/Cable_Modules/QTL2138-01 - SFP28 Cable Pull Module Config v4.000 c1.1.qfg +154 -154
- quarchpy/config_files/Cable_Modules/QTL2146-01 - Gen4 OCuLink Cable Module Config v4.001 c1.1.qfg +212 -212
- quarchpy/config_files/Cable_Modules/QTL2162-01 - 24G mini SAS HD Cable Break Module Config v4.000 c1.qfg +209 -209
- quarchpy/config_files/Cable_Modules/QTL2171-01 - QSFP28 Cable Module Config v4.000 c1.qfg +198 -198
- quarchpy/config_files/Cable_Modules/QTL2171-02 - QSFP28 Cable Module Config v4.000 c1.qfg +198 -198
- quarchpy/config_files/Cable_Modules/QTL2341-01 - Gen4 External PCIe Cable Module v4.000.qfg +209 -209
- quarchpy/config_files/Cable_Modules/QTL2602-xx - Multiprotocol Link Breaker.qfg +178 -178
- quarchpy/config_files/Cable_Modules/QTL2834-xx - -48V DC Breaker Module v5.000 c1.0.qfg +177 -177
- quarchpy/config_files/Card_Modules/QTL1069-xx - SBB 2.0 Module Config v3.5 c1.1.qfg +366 -366
- quarchpy/config_files/Card_Modules/QTL1630-01 - PCIe Card Module v4.000 c1.0.qfg +280 -280
- quarchpy/config_files/Card_Modules/QTL1630-02 - PCIe Card Module Config v4.004 c1.2.qfg +283 -283
- quarchpy/config_files/Card_Modules/QTL1630-02 - PCIe Card Module Config v4.005 c1.2.qfg +283 -283
- quarchpy/config_files/Card_Modules/QTL1630-02 - PCIe Card Module Config v4.100 c1.4.qfg +284 -284
- quarchpy/config_files/Card_Modules/QTL1630-04 - PCIe Card Module Config v4.001 c1.1.qfg +287 -287
- quarchpy/config_files/Card_Modules/QTL1630-04 - PCIe Card Module Config v4.004 c1.2.qfg +287 -287
- quarchpy/config_files/Card_Modules/QTL1688-01 - PCIe Card Module w Triggering Config v4.004 c1.2.qfg +284 -284
- quarchpy/config_files/Card_Modules/QTL1688-01 - PCIe Card Module w Triggering Config v4.006 c1.3.qfg +285 -285
- quarchpy/config_files/Card_Modules/QTL1688-03 - PCIe Card Module w Triggering Config v4.001 c1.1.qfg +286 -286
- quarchpy/config_files/Card_Modules/QTL1688-03 - PCIe Card Module w Triggering Config v4.004 c1.2.qfg +288 -288
- quarchpy/config_files/Card_Modules/QTL1688-04 - PCIe Card Module w Triggering Config v4.005 c1.5.qfg +288 -288
- quarchpy/config_files/Card_Modules/QTL1688-05 - PCIe Card Module w Triggering Config v4.005 c1.qfg +288 -288
- quarchpy/config_files/Card_Modules/QTL1848-01 - PCIe Lite Card Module Config v4.000.qfg +122 -122
- quarchpy/config_files/Card_Modules/QTL1848-02 - PCIe Lite Card Module Config v4.000.qfg +134 -134
- quarchpy/config_files/Card_Modules/QTL1919-01 - PCIe x8 Card Module Config v4.001 c1.4.qfg +247 -247
- quarchpy/config_files/Card_Modules/QTL1920-01 - PCIe x8 Card Module w Triggering Config v4.000 c1.3.qfg +247 -247
- quarchpy/config_files/Card_Modules/QTL2019-xx - M.2 Horizontal Card Module Config v4.002 c1.1.qfg +219 -219
- quarchpy/config_files/Card_Modules/QTL2034-xx - M.2 M-Key Vertical Module Config v4.001 c1.1.qfg +221 -221
- quarchpy/config_files/Card_Modules/QTL2067-xx - PCIe SFF Module Config v4.000 c1.1.qfg +248 -248
- quarchpy/config_files/Card_Modules/QTL2067-xx - Sanblaze 2 Drive Riser Card Config v4.006 c1.4.qfg +256 -256
- quarchpy/config_files/Card_Modules/QTL2067-xx - Sanblaze 2 Drive Riser Card Config v4.007 c1.4.qfg +256 -256
- quarchpy/config_files/Card_Modules/QTL2073-01 - GEN3 PCIe Lite Card Module Config v4.001.qfg +134 -134
- quarchpy/config_files/Card_Modules/QTL2073-01 - PCIe Lite Card Module Config v4.000.qfg +134 -134
- quarchpy/config_files/Card_Modules/QTL2074-01 - GEN3 PCIe HS Card Module v4.005 c1.4.qfg +287 -287
- quarchpy/config_files/Card_Modules/QTL2074-01 - PCIe Card Module Config CurrentLimit v4.004 c1.2.qfg +287 -287
- quarchpy/config_files/Card_Modules/QTL2087-xx - PCIe GEN4 Card Module w Triggering Config v4.001 c1.1.qfg +287 -287
- quarchpy/config_files/Card_Modules/QTL2087-xx - PCIe GEN4 Card Module w Triggering Config v4.001 c1.3.qfg +277 -277
- quarchpy/config_files/Card_Modules/QTL2087-xx - PCIe GEN4 Card Module w Triggering Config v5.000 c1.4.qfg +277 -277
- quarchpy/config_files/Card_Modules/QTL2094-01 - Sanblaze Dualport Riser Card Config v4.001 c1.1.qfg +223 -223
- quarchpy/config_files/Card_Modules/QTL2128-xx - PCIe GEN4 Card Module w Triggering Config v4.000 c1.1.qfg +287 -287
- quarchpy/config_files/Card_Modules/QTL2128-xx - PCIe GEN4 Card Module w Triggering Config v4.001 c1.4.qfg +277 -277
- quarchpy/config_files/Card_Modules/QTL2135-xx - PCIe GEN4 Card Module w Triggering Config - Inrush Limit v4.001 c1.4.qfg +277 -277
- quarchpy/config_files/Card_Modules/QTL2161-01 - EDSFF x8 Module Config v4.000 c1.1.qfg +210 -210
- quarchpy/config_files/Card_Modules/QTL2171-xx - EDSFF x8 Module w Triggering Config 4.001 c1.1.qfg +213 -213
- quarchpy/config_files/Card_Modules/QTL2203-01 - Sanblaze Dualport Rack Riser Card Config v4.000 c1.1.qfg +218 -218
- quarchpy/config_files/Card_Modules/QTL2203-01 - Sanblaze Dualport Rack Riser Card Config v4.005 c1.5.qfg +218 -218
- quarchpy/config_files/Card_Modules/QTL2272-01 - GEN4 EDSFF x8 Module Config v4.000 c1.1.qfg +211 -211
- quarchpy/config_files/Card_Modules/QTL2282-01 - Sanblaze Singleport Rack Riser Card Config v4.000 c1.1.qfg +212 -212
- quarchpy/config_files/Card_Modules/QTL2282-01 - Sanblaze Singleport Rack Riser Card Config v4.002 c1.2.qfg +212 -212
- quarchpy/config_files/Card_Modules/QTL2318-01 - SANBlaze U.2 Rack Riser Card Config v4.000 c1.1.qfg +218 -218
- quarchpy/config_files/Card_Modules/QTL2322-03 - GEN4 M.2 M-Key Vertical Breaker Module Config v5.001 c1.3.qfg +220 -220
- quarchpy/config_files/Card_Modules/QTL2322-xx - GEN4 M.2 M-Key Vertical Breaker Module Config v5.000 c1.1.qfg +208 -208
- quarchpy/config_files/Card_Modules/QTL2334-xx - Gen4 EDSFF x4 Card Module Config v4.000 c1.1.qfg +187 -187
- quarchpy/config_files/Card_Modules/QTL2351-xx - GEN4 EDSFF x4 Card Module +Triggering Config v4.000 c1.1.qfg +189 -189
- quarchpy/config_files/Card_Modules/QTL2351-xx - GEN4 EDSFF x4 Card Module +Triggering Config v4.001 c1.2.qfg +190 -190
- quarchpy/config_files/Card_Modules/QTL2357-xx - PCIe GEN5 Card Module Config v5.000 c1.1.qfg +282 -282
- quarchpy/config_files/Card_Modules/QTL2358-xx - PCIe GEN5 Card Module w Triggering Config v5.000 c1.1.qfg +283 -283
- quarchpy/config_files/Card_Modules/QTL2378-xx - SANBlaze U.3 Rack Riser Card Config v4.000 c1.1.qfg +215 -215
- quarchpy/config_files/Card_Modules/QTL2378-xx - SANBlaze U.3 Rack Riser Card Config v4.001 c1.2.qfg +217 -217
- quarchpy/config_files/Card_Modules/QTL2395-01 - GEN4 M.2 M-Key Vertical Breaker Module w Triggering Config v5.000 c1.1.qfg +208 -208
- quarchpy/config_files/Card_Modules/QTL2395-02 - GEN4 M.2 M-Key Vertical Breaker Module w Triggering Config v5.001 c1.3.qfg +220 -220
- quarchpy/config_files/Card_Modules/QTL2395-03 - GEN4 M.2 M-Key Vertical Breaker Module w Triggering Config v5.001 c1.3.qfg +220 -220
- quarchpy/config_files/Card_Modules/QTL2396-xx - PCIe GEN5 Card Module w inrush Config v5.000 c1.1.qfg +282 -282
- quarchpy/config_files/Card_Modules/QTL2403-xx - Gen4 PCIe Lite Module Config v4.000.qfg +135 -135
- quarchpy/config_files/Card_Modules/QTL2515-xx - PCIe GEN4 Card Module w Triggering - Inrush Limit Config v4.001 c1.3.qfg +277 -277
- quarchpy/config_files/Card_Modules/QTL2652-xx - Gen5 PCIe Lite Module Config v4.000.qfg +130 -130
- quarchpy/config_files/Card_Modules/QTL2652-xx - Gen5 PCIe Lite Module Config v4.003.qfg +137 -137
- quarchpy/config_files/Card_Modules/QTL2658-xx - Gen5 PCIe Lite Module w Inrush Config v4.000.qfg +130 -130
- quarchpy/config_files/Card_Modules/QTL2661-xx - GEN5 PCIe U.3 Breaker Config w Triggering v5.000 c1.1.qfg +229 -229
- quarchpy/config_files/Card_Modules/QTL2662-xx - GEN5 PCIe U.3 Breaker Config v5.000 c1.1.qfg +228 -228
- quarchpy/config_files/Card_Modules/QTL2686-xx - Gen5 EDSFF E3 x4 Breaker Config v5.000.qfg +230 -230
- quarchpy/config_files/Card_Modules/QTL2686-xx - Gen5 EDSFF E3 x4 Breaker Config v5.001 c1.2.qfg +233 -233
- quarchpy/config_files/Card_Modules/QTL2686-xx - Gen5 EDSFF E3 x4 Breaker v5.000 c1.1.qfg +230 -230
- quarchpy/config_files/Card_Modules/QTL2692-xx - Gen5 EDSFF E3 x4 Breaker +Triggering Config v5.000.qfg +230 -230
- quarchpy/config_files/Card_Modules/QTL2692-xx - Gen5 EDSFF E3 x4 Breaker w Triggering Config v5.001 c1.2.qfg +233 -233
- quarchpy/config_files/Card_Modules/QTL2692-xx - Gen5 EDSFF E3 x4 Breaker w Triggering v5.000 c1.1.qfg +230 -230
- quarchpy/config_files/Card_Modules/QTL2766-xx - GEN4 EDSFF E1 x8 Breaker Config v5.000.qfg +253 -253
- quarchpy/config_files/Card_Modules/QTL2767-xx - GEN4 EDSFF E3 x8 Breaker Config v5.000.qfg +253 -253
- quarchpy/config_files/Card_Modules/QTL2768-xx - GEN4 EDSFF E3 2T x8 Breaker Config v5.000.qfg +253 -253
- quarchpy/config_files/Card_Modules/QTL2776-xx - GEN4 EDSFF E1 x8 Breaker +Triggering Config v5.000.qfg +253 -253
- quarchpy/config_files/Card_Modules/QTL2777-xx - GEN4 EDSFF E3 x8 Breaker +Triggering Config v5.000.qfg +253 -253
- quarchpy/config_files/Card_Modules/QTL2778-xx - GEN4 EDSFF E3 2T x8 Breaker +Triggering Config v5.000.qfg +253 -253
- quarchpy/config_files/Card_Modules/QTL2798-xx - PCIe GEN5 Card Module w Triggering w Inrush Limit Config v5.000 c1.1.qfg +283 -283
- quarchpy/config_files/Card_Modules/QTL2804-xx - GEN5 MCIO x4 to U.2 Breaker Config v5.000 c1.1.qfg +234 -234
- quarchpy/config_files/Card_Modules/QTL2805-xx - GEN5 MCIO x4 to U.2 Breaker + Triggering Config v5.000 c1.1.qfg +234 -234
- quarchpy/config_files/Card_Modules/QTL2814-xx - GEN5 AIC to U.2 Breaker + Triggering Config v5.000 c1.1 .qfg +233 -233
- quarchpy/config_files/Card_Modules/QTL2892-xx - GEN5 EDSFF E1 x4 Breaker.qfg +233 -233
- quarchpy/config_files/Card_Modules/QTL2925-xx - GEN5 EDSFF E1 x4 Breaker +Triggering.qfg +233 -233
- quarchpy/config_files/Drive_Modules/QTL1177-xx - HS Module Config v3.5 c1.5.qfg +198 -198
- quarchpy/config_files/Drive_Modules/QTL1177-xx - HS Module Config v4.000 c1.5.qfg +200 -200
- quarchpy/config_files/Drive_Modules/QTL1177-xx - HS Module Config v4.006 c1.8.qfg +199 -199
- quarchpy/config_files/Drive_Modules/QTL1215-xx - Lite Module Config v3.50.qfg +118 -118
- quarchpy/config_files/Drive_Modules/QTL1215-xx - Lite Module Config v4.000.qfg +118 -118
- quarchpy/config_files/Drive_Modules/QTL1301-xx - HS Lite Module Config v3.50.qfg +129 -129
- quarchpy/config_files/Drive_Modules/QTL1301-xx - HS Lite Module Config v4.000.qfg +129 -129
- quarchpy/config_files/Drive_Modules/QTL1429-01 - EMC HS Lite Module Config v4.000.qfg +129 -129
- quarchpy/config_files/Drive_Modules/QTL1429-02 - EMC HS Lite Module Config v4.002.qfg +120 -120
- quarchpy/config_files/Drive_Modules/QTL1623-03 - 12G HS Lite Module Config v4.001.qfg +128 -128
- quarchpy/config_files/Drive_Modules/QTL1623-04 - 12G HS Lite Module Config v4.001.qfg +128 -128
- quarchpy/config_files/Drive_Modules/QTL1680-xx - SCA2 Lite Module Config v4.001.qfg +135 -135
- quarchpy/config_files/Drive_Modules/QTL1689-01 - 12G HS Module Config v4.001 c1.1.qfg +199 -199
- quarchpy/config_files/Drive_Modules/QTL1689-04 - 12G HS Module Config v4.002 c1.1.qfg +196 -196
- quarchpy/config_files/Drive_Modules/QTL1689-05 - 12G HS Module Config v4.002 c1.1.qfg +196 -196
- quarchpy/config_files/Drive_Modules/QTL1743-02 - PCIe SFF Module Config v4.003 c1.3.qfg +222 -222
- quarchpy/config_files/Drive_Modules/QTL1743-02 - PCIe SFF Module Config v4.006 c1.4.qfg +213 -213
- quarchpy/config_files/Drive_Modules/QTL1743-xx - PCIe SFF Module Config v4.000 c1.1.qfg +221 -221
- quarchpy/config_files/Drive_Modules/QTL1753-xx - 12G Lite Module Config v4.000.qfg +116 -116
- quarchpy/config_files/Drive_Modules/QTL1921-01 - EMC 12G HS Lite Module Config v4.000.qfg +120 -120
- quarchpy/config_files/Drive_Modules/QTL2207-01 - GEN 4 PCIe U.2 Drive Module.qfg +217 -217
- quarchpy/config_files/Drive_Modules/QTL2207-02 - GEN 4 PCIe U.2 Drive Module v5.000.qfg +220 -220
- quarchpy/config_files/Drive_Modules/QTL2207-03 - GEN 4 PCIe SFF HS Drive Module Triggering v5.001.qfg +221 -221
- quarchpy/config_files/Drive_Modules/QTL2207-xx - GEN 4 PCIe U.2 Drive Module v4.001.qfg +219 -219
- quarchpy/config_files/Drive_Modules/QTL2207-xx - GEN 4 PCIe U.2 Drive Module.qfg +219 -219
- quarchpy/config_files/Drive_Modules/QTL2245-01 - GEN 4 PCIe U.3 HS Drive Module v4.000.qfg +223 -223
- quarchpy/config_files/Drive_Modules/QTL2245-xx - GEN 4 PCIe U.3 HS Drive Module.qfg +229 -229
- quarchpy/config_files/Drive_Modules/QTL2266-01 - GEN 4 PCIe SFF HS Drive Module Triggering.qfg +219 -219
- quarchpy/config_files/Drive_Modules/QTL2266-02 - GEN 4 PCIe SFF HS Drive Module Triggering v4.002.qfg +220 -220
- quarchpy/config_files/Drive_Modules/QTL2266-03 - GEN 4 PCIe SFF HS Drive Module Triggering v5.001.qfg +221 -221
- quarchpy/config_files/Drive_Modules/QTL2266-XX - GEN 4 PCIe SFF HS Drive Module Triggering.qfg +219 -219
- quarchpy/config_files/Drive_Modules/QTL2270-01 - GEN 4 PCIe U.3 HS Drive Module Triggering v4.000.qfg +225 -225
- quarchpy/config_files/Drive_Modules/QTL2270-xx - GEN 4 PCIe U.3 HS Drive Module Triggering.qfg +230 -230
- quarchpy/config_files/Drive_Modules/QTL2542-02 - 24G SAS Drive Breaker Module v5.001.qfg +194 -194
- quarchpy/config_files/Drive_Modules/QTL2542-xx - 24G SAS Drive Breaker v5.000 c1.1.qfg +194 -194
- quarchpy/config_files/Drive_Modules/QTL2543-xx - 24G SAS Drive Breaker +Triggering v5.000 c1.1.qfg +195 -195
- quarchpy/config_files/Drive_Modules/QTL2602-xx - Multiprotocol Link Breaker.qfg +178 -178
- quarchpy/config_files/Drive_Modules/QTL2645-xx - Gen5 PCIe U.2 Drive Module v5.000.qfg +227 -227
- quarchpy/config_files/Drive_Modules/QTL2645-xx - Gen5 PCIe U.2 Drive Module v5.001.qfg +227 -227
- quarchpy/config_files/Drive_Modules/QTL2645-xx - Gen5 PCIe U.2 Drive Module v5.003.qfg +227 -227
- quarchpy/config_files/Drive_Modules/QTL2645-xx - Gen5 PCIe U.2 Drive Module v5.007.qfg +229 -229
- quarchpy/config_files/Drive_Modules/QTL2651-xx - Gen5 PCIe U.2 Drive Module + Triggering v5.000.qfg +228 -228
- quarchpy/config_files/Drive_Modules/QTL2651-xx - Gen5 PCIe U.2 Drive Module + Triggering v5.001.qfg +228 -228
- quarchpy/config_files/Drive_Modules/QTL2651-xx - Gen5 PCIe U.2 Drive Module + Triggering v5.003.qfg +228 -228
- quarchpy/config_files/Drive_Modules/QTL2651-xx - Gen5 PCIe U.2 Drive Module v5.007.qfg +230 -230
- quarchpy/config_files/Drive_Modules/QTL2661-xx - Gen5 U.3 Drive Module + Triggering v5.000.qfg +229 -229
- quarchpy/config_files/Drive_Modules/QTL2662-xx - Gen5 PCIe U.3 Drive Module v5.000.qfg +228 -228
- quarchpy/config_files/Drive_Modules/QTL2757-xx - Gen5 SFF Lite Breaker Module Config v4.000.qfg +140 -140
- quarchpy/config_files/Drive_Modules/QTL2804-xx - Gen5 MCIO to U.2 Breaker +Triggering v5.003.qfg +253 -253
- quarchpy/config_files/Drive_Modules/QTL2804-xx - Gen5 MCIO to U.2 Breaker v5.001.qfg +234 -234
- quarchpy/config_files/Drive_Modules/QTL2805-xx - Gen5 MCIO to U.2 Breaker +Triggering v5.001.qfg +234 -234
- quarchpy/config_files/Drive_Modules/QTL2805-xx - Gen5 MCIO to U.2 Breaker +Triggering v5.002.qfg +253 -253
- quarchpy/config_files/Drive_Modules/QTL2805-xx - Gen5 MCIO to U.2 Breaker +Triggering v5.003.qfg +253 -253
- quarchpy/config_files/Drive_Modules/QTL2813-xx - Gen5 AIC to U.2 Breaker v5.001 c1.2.qfg +230 -230
- quarchpy/config_files/Drive_Modules/QTL2813-xx - Gen5 AIC to U.2 Breaker with Triggering v5.002 c1.3.qfg +253 -253
- quarchpy/config_files/Drive_Modules/QTL2814-xx - Gen5 AIC to U.2 Breaker with Triggering v5.001 c1.2.qfg +230 -230
- quarchpy/config_files/Drive_Modules/QTL2814-xx - Gen5 AIC to U.2 Breaker with Triggering v5.002 c1.3.qfg +253 -253
- quarchpy/config_files/Drive_Modules/QTL2892-xx - Gen5 EDSFF E1 x4 Breaker v5.001.qfg +233 -233
- quarchpy/config_files/Drive_Modules/Standard Drive Module Config v3.5 c1.1.qfg +171 -171
- quarchpy/config_files/Power_Margining/HD/QTL1944-xx - HD Power Module v5.000.qfg +123 -123
- quarchpy/config_files/Power_Margining/HD/QTL1944-xx - HD Power Module v5.003.qfg +124 -124
- quarchpy/config_files/Power_Margining/HD/QTL1995-xx - x6 HD Power Module v5.002.qfg +122 -122
- quarchpy/config_files/Power_Margining/HD/QTL1995-xx - x6 HD Power Module v5.003.qfg +123 -123
- quarchpy/config_files/Power_Margining/HD/QTL1999-xx - Single HD Power Module v5.002.qfg +122 -122
- quarchpy/config_files/Power_Margining/HD/QTL1999-xx - Single HD Power Module v5.003.qfg +123 -123
- quarchpy/config_files/Power_Margining/HD/QTL1999-xx - Single HD Power Module v6.000.qfg +124 -124
- quarchpy/config_files/Power_Margining/PPM/QTL1455-02 - Power Margining Module v4.101.qfg +78 -78
- quarchpy/config_files/Power_Margining/PPM/QTL1455-02 - Power Margining Module v4.200.qfg +80 -80
- quarchpy/config_files/Power_Margining/PPM/QTL1455-02 - Power Margining Module v4.201.qfg +82 -82
- quarchpy/config_files/Power_Margining/PPM/QTL1455-02 - Test Power Margining Module v4.004.qfg +73 -73
- quarchpy/config_files/Power_Margining/PPM/QTL1658-01 - Power Margining Module w. Triggering v4.101.qfg +78 -78
- quarchpy/config_files/Power_Margining/PPM/QTL1658-01 - Power Margining Module w. Triggering v4.200.qfg +80 -80
- quarchpy/config_files/Power_Margining/PPM/QTL1658-01 - Power Margining Module w. Triggering v4.201.qfg +82 -82
- quarchpy/config_files/Power_Margining/PPM/QTL1727-01 - 3v3 Power Margining Module w. Triggering v4.105.qfg +78 -78
- quarchpy/config_files/Power_Margining/PPM/QTL1727-01 - 3v3 Power Margining Module w. Triggering v4.200.qfg +80 -80
- quarchpy/config_files/Power_Margining/PPM/QTL1727-01 - 3v3 Power Margining Module w. Triggering v4.201.qfg +82 -82
- quarchpy/config_files/Power_Margining/PPM/QTL1730-01 - 3v3 Power Margining Module v4.105.qfg +78 -78
- quarchpy/config_files/Power_Margining/PPM/QTL1730-01 - 3v3 Power Margining Module v4.200.qfg +80 -80
- quarchpy/config_files/Power_Margining/PPM/QTL1730-01 - 3v3 Power Margining Module v4.201.qfg +82 -82
- quarchpy/config_files/Power_Margining/XLC/QTL1824-01 - Power Margining Module V2 - Triggering v4.000.qfg +80 -80
- quarchpy/config_files/Power_Margining/XLC/QTL1824-01 - Power Margining Module V2 - Triggering v4.200.qfg +81 -81
- quarchpy/config_files/Power_Margining/XLC/QTL1824-01 - Power Margining Module V2 - Triggering v4.202.qfg +87 -87
- quarchpy/config_files/Power_Margining/XLC/QTL1824-01 - Power Margining Module V2 - Triggering v4.210.qfg +88 -88
- quarchpy/config_files/Power_Margining/XLC/QTL1824-01 - Power Margining Module V2 - Triggering v4.211.qfg +121 -121
- quarchpy/config_files/Power_Margining/XLC/QTL1824-03 - Power Margining Module V2 - Triggering v4.213.qfg +121 -121
- quarchpy/config_files/Power_Margining/XLC/QTL1847-01 - Power Margining Module V2 v4.213.qfg +121 -121
- quarchpy/config_files/Switch_Modules/QTL1390-xx - 4-8 SATA MUX Module Config v4.002.qfg +186 -186
- quarchpy/config_files/Switch_Modules/QTL1443-xx - 1-8 USB3 MUX Module Config v4.002.qfg +147 -147
- quarchpy/config_files/Switch_Modules/QTL1443-xx - 1-8 USB3 MUX Module Config v4.003.qfg +147 -147
- quarchpy/config_files/Switch_Modules/QTL1443-xx - 1-8 USB3 MUX Module Config v4.100.qfg +147 -147
- quarchpy/config_files/Switch_Modules/QTL1449-xx - 1-8 PCIe MUX Module Config v4.000.qfg +145 -145
- quarchpy/config_files/Switch_Modules/QTL1490-xx - SATA Keyed HS Module Config v4.003 c1.6.qfg +194 -194
- quarchpy/config_files/Switch_Modules/QTL1490-xx - SATA Keyed HS Module Config v4.006 c1.8.qfg +193 -193
- quarchpy/config_files/Switch_Modules/QTL1530-xx - 1-8 DP MUX Module Config v4.000.qfg +145 -145
- quarchpy/config_files/Switch_Modules/QTL1564-xx - 12 Port Mini SAS HD MUX Module Config v4.000.qfg +184 -184
- quarchpy/config_files/Switch_Modules/QTL1584-xx - 1-4 ExpressCard MUX Module Config v4.000.qfg +81 -81
- quarchpy/config_files/__pycache__/__init__.cpython-310.pyc +0 -0
- quarchpy/config_files/__pycache__/quarch_config_parser.cpython-310.pyc +0 -0
- quarchpy/connection_specific/QPS/win-amd64/app.jar +0 -0
- quarchpy/connection_specific/QPS/win-amd64/qis/help.txt +17 -50
- quarchpy/connection_specific/QPS/win-amd64/qis/qis.jar +0 -0
- quarchpy/connection_specific/QPS/win-amd64/qis/qis_lib/CInterface-2.3.jar +0 -0
- quarchpy/connection_specific/QPS/win-amd64/qis/qis_lib/QuarchCommon-2.0.jar +0 -0
- quarchpy/connection_specific/QPS/win-amd64/qis/qis_lib/usb4java-1.3.1.jar +0 -0
- quarchpy/connection_specific/QPS/win-amd64/qps-command-reference.html +104 -104
- quarchpy/connection_specific/QPS/win-amd64/qps.jar +0 -0
- quarchpy/connection_specific/QPS/win-amd64/qps_lib/JFXUtilities-1.0.jar +0 -0
- quarchpy/connection_specific/QPS/win-amd64/qps_lib/QuarchCommon-2.0.jar +0 -0
- quarchpy/connection_specific/QPS/win-amd64/qps_lib/lin-x64/{javafx-base-21.0.6-linux.jar → javafx-base-21.0.5-linux.jar} +0 -0
- quarchpy/connection_specific/QPS/win-amd64/qps_lib/lin-x64/{javafx-controls-21.0.6-linux.jar → javafx-controls-21.0.5-linux.jar} +0 -0
- quarchpy/connection_specific/QPS/win-amd64/qps_lib/lin-x64/{javafx-fxml-21.0.6-linux.jar → javafx-fxml-21.0.5-linux.jar} +0 -0
- quarchpy/connection_specific/QPS/win-amd64/qps_lib/lin-x64/{javafx-graphics-21.0.6-linux.jar → javafx-graphics-21.0.5-linux.jar} +0 -0
- quarchpy/connection_specific/QPS/win-amd64/qps_lib/lin-x64/{javafx-swing-21.0.6-linux.jar → javafx-swing-21.0.5-linux.jar} +0 -0
- quarchpy/connection_specific/QPS/win-amd64/qps_lib/{mac-x64/javafx-base-21.0.6-mac.jar → mac-arm64/javafx-base-21.0.5-mac-aarch64.jar} +0 -0
- quarchpy/connection_specific/QPS/win-amd64/qps_lib/mac-arm64/{javafx-controls-21.0.6-mac-aarch64.jar → javafx-controls-21.0.5-mac-aarch64.jar} +0 -0
- quarchpy/connection_specific/QPS/win-amd64/qps_lib/{mac-x64/javafx-fxml-21.0.6-mac.jar → mac-arm64/javafx-fxml-21.0.5-mac-aarch64.jar} +0 -0
- quarchpy/connection_specific/QPS/win-amd64/qps_lib/mac-arm64/{javafx-graphics-21.0.6-mac-aarch64.jar → javafx-graphics-21.0.5-mac-aarch64.jar} +0 -0
- quarchpy/connection_specific/QPS/win-amd64/qps_lib/{mac-x64/javafx-swing-21.0.6-mac.jar → mac-arm64/javafx-swing-21.0.5-mac-aarch64.jar} +0 -0
- quarchpy/connection_specific/QPS/win-amd64/qps_lib/{mac-arm64/javafx-base-21.0.6-mac-aarch64.jar → mac-x64/javafx-base-21.0.5-mac.jar} +0 -0
- quarchpy/connection_specific/QPS/win-amd64/qps_lib/mac-x64/{javafx-controls-21.0.6-mac.jar → javafx-controls-21.0.5-mac.jar} +0 -0
- quarchpy/connection_specific/QPS/win-amd64/qps_lib/{mac-arm64/javafx-fxml-21.0.6-mac-aarch64.jar → mac-x64/javafx-fxml-21.0.5-mac.jar} +0 -0
- quarchpy/connection_specific/QPS/win-amd64/qps_lib/mac-x64/{javafx-graphics-21.0.6-mac.jar → javafx-graphics-21.0.5-mac.jar} +0 -0
- quarchpy/connection_specific/QPS/win-amd64/qps_lib/{mac-arm64/javafx-swing-21.0.6-mac-aarch64.jar → mac-x64/javafx-swing-21.0.5-mac.jar} +0 -0
- quarchpy/connection_specific/QPS/win-amd64/qps_lib/win-x64/{javafx-base-21.0.6-win.jar → javafx-base-21.0.5-win.jar} +0 -0
- quarchpy/connection_specific/QPS/win-amd64/qps_lib/win-x64/{javafx-controls-21.0.6-win.jar → javafx-controls-21.0.5-win.jar} +0 -0
- quarchpy/connection_specific/QPS/win-amd64/qps_lib/win-x64/{javafx-fxml-21.0.6-win.jar → javafx-fxml-21.0.5-win.jar} +0 -0
- quarchpy/connection_specific/QPS/win-amd64/qps_lib/win-x64/{javafx-graphics-21.0.6-win.jar → javafx-graphics-21.0.5-win.jar} +0 -0
- quarchpy/connection_specific/QPS/win-amd64/qps_lib/win-x64/{javafx-swing-21.0.6-win.jar → javafx-swing-21.0.5-win.jar} +0 -0
- quarchpy/connection_specific/QPS/win-amd64/scriptCommands.txt +4 -4
- quarchpy/connection_specific/QPS/win-amd64/whats-new.txt +12 -20
- quarchpy/connection_specific/__pycache__/StreamChannels.cpython-310.pyc +0 -0
- quarchpy/connection_specific/__pycache__/__init__.cpython-310.pyc +0 -0
- quarchpy/connection_specific/__pycache__/connection_QIS.cpython-310.pyc +0 -0
- quarchpy/connection_specific/__pycache__/connection_QPS.cpython-310.pyc +0 -0
- quarchpy/connection_specific/__pycache__/connection_ReST.cpython-310.pyc +0 -0
- quarchpy/connection_specific/__pycache__/connection_Serial.cpython-310.pyc +0 -0
- quarchpy/connection_specific/__pycache__/connection_TCP.cpython-310.pyc +0 -0
- quarchpy/connection_specific/__pycache__/connection_USB.cpython-310.pyc +0 -0
- quarchpy/connection_specific/__pycache__/mDNS.cpython-310.pyc +0 -0
- quarchpy/connection_specific/connection_QIS.py +228 -176
- quarchpy/connection_specific/connection_QPS.py +0 -2
- quarchpy/connection_specific/jdk_j21_jres/__pycache__/__init__.cpython-310.pyc +0 -0
- quarchpy/connection_specific/jdk_j21_jres/__pycache__/fix_permissions.cpython-310.pyc +0 -0
- quarchpy/connection_specific/jdk_j21_jres/lin_amd64_jdk_21_jre/conf/jaxp.properties +180 -180
- quarchpy/connection_specific/jdk_j21_jres/lin_amd64_jdk_21_jre/conf/logging.properties +63 -63
- quarchpy/connection_specific/jdk_j21_jres/lin_amd64_jdk_21_jre/conf/management/management.properties +327 -327
- quarchpy/connection_specific/jdk_j21_jres/lin_amd64_jdk_21_jre/conf/net.properties +164 -164
- quarchpy/connection_specific/jdk_j21_jres/lin_amd64_jdk_21_jre/conf/security/java.policy +46 -46
- quarchpy/connection_specific/jdk_j21_jres/lin_amd64_jdk_21_jre/conf/security/java.security +1509 -1509
- quarchpy/connection_specific/jdk_j21_jres/lin_amd64_jdk_21_jre/legal/java.base/asm.md +36 -36
- quarchpy/connection_specific/jdk_j21_jres/lin_amd64_jdk_21_jre/legal/java.base/cldr.md +109 -109
- quarchpy/connection_specific/jdk_j21_jres/lin_amd64_jdk_21_jre/legal/java.base/icu.md +518 -518
- quarchpy/connection_specific/jdk_j21_jres/lin_amd64_jdk_21_jre/legal/java.base/public_suffix.md +399 -399
- quarchpy/connection_specific/jdk_j21_jres/lin_amd64_jdk_21_jre/legal/java.base/unicode.md +103 -103
- quarchpy/connection_specific/jdk_j21_jres/lin_amd64_jdk_21_jre/legal/java.desktop/freetype.md +649 -649
- quarchpy/connection_specific/jdk_j21_jres/lin_amd64_jdk_21_jre/legal/java.desktop/giflib.md +50 -50
- quarchpy/connection_specific/jdk_j21_jres/lin_amd64_jdk_21_jre/legal/java.smartcardio/pcsclite.md +57 -57
- quarchpy/connection_specific/jdk_j21_jres/lin_amd64_jdk_21_jre/legal/java.xml/xalan.md +255 -255
- quarchpy/connection_specific/jdk_j21_jres/lin_amd64_jdk_21_jre/legal/jdk.crypto.cryptoki/pkcs11cryptotoken.md +72 -72
- quarchpy/connection_specific/jdk_j21_jres/lin_amd64_jdk_21_jre/legal/jdk.internal.vm.compiler/ADDITIONAL_LICENSE_INFO +37 -37
- quarchpy/connection_specific/jdk_j21_jres/lin_amd64_jdk_21_jre/legal/jdk.internal.vm.compiler/ASSEMBLY_EXCEPTION +27 -27
- quarchpy/connection_specific/jdk_j21_jres/lin_amd64_jdk_21_jre/legal/jdk.internal.vm.compiler/LICENSE +347 -347
- quarchpy/connection_specific/jdk_j21_jres/lin_amd64_jdk_21_jre/legal/jdk.internal.vm.compiler.management/ADDITIONAL_LICENSE_INFO +37 -37
- quarchpy/connection_specific/jdk_j21_jres/lin_amd64_jdk_21_jre/legal/jdk.internal.vm.compiler.management/ASSEMBLY_EXCEPTION +27 -27
- quarchpy/connection_specific/jdk_j21_jres/lin_amd64_jdk_21_jre/legal/jdk.internal.vm.compiler.management/LICENSE +347 -347
- quarchpy/connection_specific/jdk_j21_jres/lin_amd64_jdk_21_jre/legal/jdk.localedata/cldr.md +109 -109
- quarchpy/connection_specific/jdk_j21_jres/lin_amd64_jdk_21_jre/lib/classlist +1502 -1502
- quarchpy/connection_specific/jdk_j21_jres/lin_amd64_jdk_21_jre/lib/jfr/default.jfc +1126 -1126
- quarchpy/connection_specific/jdk_j21_jres/lin_amd64_jdk_21_jre/lib/jfr/profile.jfc +1126 -1126
- quarchpy/connection_specific/jdk_j21_jres/lin_amd64_jdk_21_jre/lib/psfontj2d.properties +323 -323
- quarchpy/connection_specific/jdk_j21_jres/lin_amd64_jdk_21_jre/lib/security/default.policy +235 -235
- quarchpy/connection_specific/jdk_j21_jres/lin_amd64_jdk_21_jre/release +2 -2
- quarchpy/connection_specific/jdk_j21_jres/mac_amd64_jdk_21_jre/conf/jaxp.properties +180 -180
- quarchpy/connection_specific/jdk_j21_jres/mac_amd64_jdk_21_jre/conf/logging.properties +63 -63
- quarchpy/connection_specific/jdk_j21_jres/mac_amd64_jdk_21_jre/conf/management/management.properties +327 -327
- quarchpy/connection_specific/jdk_j21_jres/mac_amd64_jdk_21_jre/conf/net.properties +164 -164
- quarchpy/connection_specific/jdk_j21_jres/mac_amd64_jdk_21_jre/conf/security/java.policy +46 -46
- quarchpy/connection_specific/jdk_j21_jres/mac_amd64_jdk_21_jre/conf/security/java.security +1510 -1510
- quarchpy/connection_specific/jdk_j21_jres/mac_amd64_jdk_21_jre/legal/java.base/asm.md +36 -36
- quarchpy/connection_specific/jdk_j21_jres/mac_amd64_jdk_21_jre/legal/java.base/cldr.md +109 -109
- quarchpy/connection_specific/jdk_j21_jres/mac_amd64_jdk_21_jre/legal/java.base/icu.md +518 -518
- quarchpy/connection_specific/jdk_j21_jres/mac_amd64_jdk_21_jre/legal/java.base/public_suffix.md +399 -399
- quarchpy/connection_specific/jdk_j21_jres/mac_amd64_jdk_21_jre/legal/java.base/unicode.md +103 -103
- quarchpy/connection_specific/jdk_j21_jres/mac_amd64_jdk_21_jre/legal/java.desktop/freetype.md +649 -649
- quarchpy/connection_specific/jdk_j21_jres/mac_amd64_jdk_21_jre/legal/java.desktop/giflib.md +50 -50
- quarchpy/connection_specific/jdk_j21_jres/mac_amd64_jdk_21_jre/legal/java.smartcardio/pcsclite.md +57 -57
- quarchpy/connection_specific/jdk_j21_jres/mac_amd64_jdk_21_jre/legal/java.xml/xalan.md +255 -255
- quarchpy/connection_specific/jdk_j21_jres/mac_amd64_jdk_21_jre/legal/jdk.crypto.cryptoki/pkcs11cryptotoken.md +72 -72
- quarchpy/connection_specific/jdk_j21_jres/mac_amd64_jdk_21_jre/legal/jdk.internal.vm.compiler/ADDITIONAL_LICENSE_INFO +37 -37
- quarchpy/connection_specific/jdk_j21_jres/mac_amd64_jdk_21_jre/legal/jdk.internal.vm.compiler/ASSEMBLY_EXCEPTION +27 -27
- quarchpy/connection_specific/jdk_j21_jres/mac_amd64_jdk_21_jre/legal/jdk.internal.vm.compiler/LICENSE +347 -347
- quarchpy/connection_specific/jdk_j21_jres/mac_amd64_jdk_21_jre/legal/jdk.internal.vm.compiler.management/ADDITIONAL_LICENSE_INFO +37 -37
- quarchpy/connection_specific/jdk_j21_jres/mac_amd64_jdk_21_jre/legal/jdk.internal.vm.compiler.management/ASSEMBLY_EXCEPTION +27 -27
- quarchpy/connection_specific/jdk_j21_jres/mac_amd64_jdk_21_jre/legal/jdk.internal.vm.compiler.management/LICENSE +347 -347
- quarchpy/connection_specific/jdk_j21_jres/mac_amd64_jdk_21_jre/legal/jdk.localedata/cldr.md +109 -109
- quarchpy/connection_specific/jdk_j21_jres/mac_amd64_jdk_21_jre/lib/classlist +1497 -1497
- quarchpy/connection_specific/jdk_j21_jres/mac_amd64_jdk_21_jre/lib/jfr/default.jfc +1126 -1126
- quarchpy/connection_specific/jdk_j21_jres/mac_amd64_jdk_21_jre/lib/jfr/profile.jfc +1126 -1126
- quarchpy/connection_specific/jdk_j21_jres/mac_amd64_jdk_21_jre/lib/psfontj2d.properties +323 -323
- quarchpy/connection_specific/jdk_j21_jres/mac_amd64_jdk_21_jre/lib/security/default.policy +235 -235
- quarchpy/connection_specific/jdk_j21_jres/mac_amd64_jdk_21_jre/release +2 -2
- quarchpy/connection_specific/jdk_j21_jres/win_amd64_jdk_21_jre/conf/jaxp.properties +180 -180
- quarchpy/connection_specific/jdk_j21_jres/win_amd64_jdk_21_jre/conf/logging.properties +63 -63
- quarchpy/connection_specific/jdk_j21_jres/win_amd64_jdk_21_jre/conf/management/management.properties +327 -327
- quarchpy/connection_specific/jdk_j21_jres/win_amd64_jdk_21_jre/conf/net.properties +168 -168
- quarchpy/connection_specific/jdk_j21_jres/win_amd64_jdk_21_jre/conf/security/java.policy +46 -46
- quarchpy/connection_specific/jdk_j21_jres/win_amd64_jdk_21_jre/legal/java.base/asm.md +36 -36
- quarchpy/connection_specific/jdk_j21_jres/win_amd64_jdk_21_jre/legal/java.base/cldr.md +109 -109
- quarchpy/connection_specific/jdk_j21_jres/win_amd64_jdk_21_jre/legal/java.base/icu.md +518 -518
- quarchpy/connection_specific/jdk_j21_jres/win_amd64_jdk_21_jre/legal/java.base/public_suffix.md +399 -399
- quarchpy/connection_specific/jdk_j21_jres/win_amd64_jdk_21_jre/legal/java.base/unicode.md +103 -103
- quarchpy/connection_specific/jdk_j21_jres/win_amd64_jdk_21_jre/legal/java.desktop/freetype.md +649 -649
- quarchpy/connection_specific/jdk_j21_jres/win_amd64_jdk_21_jre/legal/java.desktop/giflib.md +50 -50
- quarchpy/connection_specific/jdk_j21_jres/win_amd64_jdk_21_jre/legal/java.xml/xalan.md +255 -255
- quarchpy/connection_specific/jdk_j21_jres/win_amd64_jdk_21_jre/legal/jdk.crypto.cryptoki/pkcs11cryptotoken.md +72 -72
- quarchpy/connection_specific/jdk_j21_jres/win_amd64_jdk_21_jre/lib/jfr/default.jfc +1126 -1126
- quarchpy/connection_specific/jdk_j21_jres/win_amd64_jdk_21_jre/lib/jfr/profile.jfc +1126 -1126
- quarchpy/connection_specific/jdk_j21_jres/win_amd64_jdk_21_jre/lib/psfontj2d.properties +323 -323
- quarchpy/connection_specific/jdk_j21_jres/win_amd64_jdk_21_jre/lib/security/default.policy +251 -251
- quarchpy/connection_specific/mDNS.py +1 -3
- quarchpy/connection_specific/serial/__pycache__/__init__.cpython-310.pyc +0 -0
- quarchpy/connection_specific/serial/__pycache__/serialposix.cpython-310.pyc +0 -0
- quarchpy/connection_specific/serial/__pycache__/serialutil.cpython-310.pyc +0 -0
- quarchpy/connection_specific/serial/tools/__pycache__/__init__.cpython-310.pyc +0 -0
- quarchpy/connection_specific/serial/tools/__pycache__/list_ports.cpython-310.pyc +0 -0
- quarchpy/connection_specific/serial/tools/__pycache__/list_ports_common.cpython-310.pyc +0 -0
- quarchpy/connection_specific/serial/tools/__pycache__/list_ports_linux.cpython-310.pyc +0 -0
- quarchpy/connection_specific/serial/tools/__pycache__/list_ports_posix.cpython-310.pyc +0 -0
- quarchpy/connection_specific/usb_libs/usb1.py +4 -4
- quarchpy/debug/SystemTest.py +64 -16
- quarchpy/debug/__pycache__/SystemTest.cpython-310.pyc +0 -0
- quarchpy/debug/__pycache__/__init__.cpython-310.pyc +0 -0
- quarchpy/debug/__pycache__/versionCompare.cpython-310.pyc +0 -0
- quarchpy/debug/module_debug.py +25 -26
- quarchpy/debug/simple_terminal.py +23 -18
- quarchpy/device/__init__.py +4 -4
- quarchpy/device/__pycache__/__init__.cpython-310.pyc +0 -0
- quarchpy/device/__pycache__/device.cpython-310.pyc +0 -0
- quarchpy/device/__pycache__/quarchArray.cpython-310.pyc +0 -0
- quarchpy/device/__pycache__/quarchPPM.cpython-310.pyc +0 -0
- quarchpy/device/__pycache__/quarchQPS.cpython-310.pyc +0 -0
- quarchpy/device/__pycache__/scanDevices.cpython-310.pyc +0 -0
- quarchpy/device/device.py +1237 -440
- quarchpy/device/quarchArray.py +2 -2
- quarchpy/device/quarchPPM.py +13 -14
- quarchpy/device/quarchQPS.py +95 -67
- quarchpy/device/scanDevices.py +4 -4
- quarchpy/disk_test/__pycache__/AbsDiskFinder.cpython-310.pyc +0 -0
- quarchpy/disk_test/__pycache__/DiskTargetSelection.cpython-310.pyc +0 -0
- quarchpy/disk_test/__pycache__/__init__.cpython-310.pyc +0 -0
- quarchpy/disk_test/__pycache__/iometerDiskFinder.cpython-310.pyc +0 -0
- quarchpy/docs/CHANGES.rst +443 -443
- quarchpy/docs/Makefile +20 -20
- quarchpy/docs/_build/html/.buildinfo +4 -4
- quarchpy/docs/_build/html/CHANGES.html +660 -660
- quarchpy/docs/_build/html/_sources/CHANGES.rst.txt +439 -439
- quarchpy/docs/_build/html/_sources/index.rst.txt +23 -23
- quarchpy/docs/_build/html/_sources/readme.rst.txt +41 -41
- quarchpy/docs/_build/html/_sources/source/modules.rst.txt +7 -7
- quarchpy/docs/_build/html/_sources/source/quarchpy.calibration.rst.txt +78 -78
- quarchpy/docs/_build/html/_sources/source/quarchpy.config_files.rst.txt +22 -22
- quarchpy/docs/_build/html/_sources/source/quarchpy.connection_specific.rst.txt +76 -76
- quarchpy/docs/_build/html/_sources/source/quarchpy.debug.rst.txt +38 -38
- quarchpy/docs/_build/html/_sources/source/quarchpy.device.rst.txt +54 -54
- quarchpy/docs/_build/html/_sources/source/quarchpy.disk_test.rst.txt +126 -126
- quarchpy/docs/_build/html/_sources/source/quarchpy.fio.rst.txt +30 -30
- quarchpy/docs/_build/html/_sources/source/quarchpy.iometer.rst.txt +22 -22
- quarchpy/docs/_build/html/_sources/source/quarchpy.qis.rst.txt +22 -22
- quarchpy/docs/_build/html/_sources/source/quarchpy.qps.rst.txt +22 -22
- quarchpy/docs/_build/html/_sources/source/quarchpy.rst.txt +50 -50
- quarchpy/docs/_build/html/_sources/source/quarchpy.user_interface.rst.txt +22 -22
- quarchpy/docs/_build/html/_sources/source/quarchpy.utilities.rst.txt +22 -22
- quarchpy/docs/_build/html/_static/alabaster.css +662 -662
- quarchpy/docs/_build/html/_static/basic.css +913 -913
- quarchpy/docs/_build/html/_static/custom.css +1 -1
- quarchpy/docs/_build/html/_static/doctools.js +149 -149
- quarchpy/docs/_build/html/_static/documentation_options.js +12 -12
- quarchpy/docs/_build/html/_static/jquery-3.4.1.js +10598 -10598
- quarchpy/docs/_build/html/_static/jquery.js +2 -2
- quarchpy/docs/_build/html/_static/language_data.js +192 -192
- quarchpy/docs/_build/html/_static/pygments.css +83 -83
- quarchpy/docs/_build/html/_static/searchtools.js +632 -632
- quarchpy/docs/_build/html/_static/sphinx_highlight.js +154 -154
- quarchpy/docs/_build/html/_static/underscore-1.3.1.js +999 -999
- quarchpy/docs/_build/html/_static/underscore.js +5 -5
- quarchpy/docs/_build/html/genindex.html +1626 -1626
- quarchpy/docs/_build/html/index.html +214 -214
- quarchpy/docs/_build/html/py-modindex.html +300 -300
- quarchpy/docs/_build/html/readme.html +137 -137
- quarchpy/docs/_build/html/search.html +123 -123
- quarchpy/docs/_build/html/source/changelog.html +739 -739
- quarchpy/docs/_build/html/source/licenses.html +181 -181
- quarchpy/docs/_build/html/source/modules.html +222 -222
- quarchpy/docs/_build/html/source/quarchpy.calibration.html +147 -147
- quarchpy/docs/_build/html/source/quarchpy.config_files.html +136 -136
- quarchpy/docs/_build/html/source/quarchpy.connection_specific.html +729 -729
- quarchpy/docs/_build/html/source/quarchpy.debug.html +251 -251
- quarchpy/docs/_build/html/source/quarchpy.device.html +1165 -1165
- quarchpy/docs/_build/html/source/quarchpy.disk_test.html +220 -220
- quarchpy/docs/_build/html/source/quarchpy.fio.html +218 -218
- quarchpy/docs/_build/html/source/quarchpy.html +715 -715
- quarchpy/docs/_build/html/source/quarchpy.iometer.html +271 -271
- quarchpy/docs/_build/html/source/quarchpy.qis.html +640 -640
- quarchpy/docs/_build/html/source/quarchpy.qps.html +186 -186
- quarchpy/docs/_build/html/source/quarchpy.user_interface.html +278 -278
- quarchpy/docs/_build/html/source/quarchpy.utilities.html +211 -211
- quarchpy/docs/_build/html/source/readme.html +147 -147
- quarchpy/docs/conf.py +56 -56
- quarchpy/docs/index.rst +23 -23
- quarchpy/docs/make.bat +35 -35
- quarchpy/docs/readme.rst +41 -41
- quarchpy/docs/source/modules.rst +7 -7
- quarchpy/docs/source/quarchpy.calibration.rst +78 -78
- quarchpy/docs/source/quarchpy.config_files.rst +22 -22
- quarchpy/docs/source/quarchpy.connection_specific.rst +76 -76
- quarchpy/docs/source/quarchpy.debug.rst +38 -38
- quarchpy/docs/source/quarchpy.device.rst +54 -54
- quarchpy/docs/source/quarchpy.disk_test.rst +126 -126
- quarchpy/docs/source/quarchpy.fio.rst +30 -30
- quarchpy/docs/source/quarchpy.iometer.rst +22 -22
- quarchpy/docs/source/quarchpy.qis.rst +22 -22
- quarchpy/docs/source/quarchpy.qps.rst +22 -22
- quarchpy/docs/source/quarchpy.rst +50 -50
- quarchpy/docs/source/quarchpy.user_interface.rst +22 -22
- quarchpy/docs/source/quarchpy.utilities.rst +22 -22
- quarchpy/fio/FIO_interface.py +0 -1
- quarchpy/fio/HIDEtest_performance_class.py +533 -533
- quarchpy/fio/__pycache__/FIO_interface.cpython-310.pyc +0 -0
- quarchpy/fio/__pycache__/__init__.cpython-310.pyc +0 -0
- quarchpy/iometer/__pycache__/__init__.cpython-310.pyc +0 -0
- quarchpy/iometer/__pycache__/{gen_iometer_template.cpython-312.pyc → gen_iometer_template.cpython-310.pyc} +0 -0
- quarchpy/iometer/__pycache__/iometerFuncs.cpython-310.pyc +0 -0
- quarchpy/qis/__pycache__/StreamHeaderInfo.cpython-310.pyc +0 -0
- quarchpy/qis/__pycache__/__init__.cpython-310.pyc +0 -0
- quarchpy/qis/__pycache__/qisFuncs.cpython-310.pyc +0 -0
- quarchpy/qis/qisFuncs.py +46 -51
- quarchpy/qps/__pycache__/__init__.cpython-310.pyc +0 -0
- quarchpy/qps/__pycache__/qpsFuncs.cpython-310.pyc +0 -0
- quarchpy/qps/qpsFuncs.py +10 -17
- quarchpy/run.py +3 -3
- quarchpy/user_interface/__pycache__/__init__.cpython-310.pyc +0 -0
- quarchpy/user_interface/__pycache__/user_interface.cpython-310.pyc +0 -0
- quarchpy/utilities/TestCenter.py +2 -2
- quarchpy/utilities/__pycache__/TestCenter.cpython-310.pyc +0 -0
- quarchpy/utilities/__pycache__/TimeValue.cpython-310.pyc +0 -0
- quarchpy/utilities/__pycache__/Version.cpython-310.pyc +0 -0
- quarchpy/utilities/__pycache__/__init__.cpython-310.pyc +0 -0
- {quarchpy-2.2.9.dev4.dist-info → quarchpy-2.2.9.dev5.dist-info}/METADATA +466 -466
- {quarchpy-2.2.9.dev4.dist-info → quarchpy-2.2.9.dev5.dist-info}/RECORD +473 -639
- {quarchpy-2.2.9.dev4.dist-info → quarchpy-2.2.9.dev5.dist-info}/WHEEL +1 -1
- quarchpy/.idea/.name +0 -1
- quarchpy/.idea/inspectionProfiles/Project_Default.xml +0 -50
- quarchpy/.idea/inspectionProfiles/profiles_settings.xml +0 -6
- quarchpy/.idea/misc.xml +0 -7
- quarchpy/.idea/modules.xml +0 -8
- quarchpy/.idea/quarchpy.iml +0 -12
- quarchpy/.idea/vcs.xml +0 -7
- quarchpy/.idea/workspace.xml +0 -273
- quarchpy/__pycache__/__init__.cpython-311.pyc +0 -0
- quarchpy/__pycache__/__init__.cpython-312.pyc +0 -0
- quarchpy/__pycache__/__init__.cpython-313.pyc +0 -0
- quarchpy/__pycache__/_version.cpython-311.pyc +0 -0
- quarchpy/__pycache__/_version.cpython-312.pyc +0 -0
- quarchpy/__pycache__/_version.cpython-313.pyc +0 -0
- quarchpy/__pycache__/connection.cpython-311.pyc +0 -0
- quarchpy/__pycache__/connection.cpython-312.pyc +0 -0
- quarchpy/__pycache__/connection.cpython-313.pyc +0 -0
- quarchpy/__pycache__/run.cpython-311.pyc +0 -0
- quarchpy/__pycache__/run.cpython-312.pyc +0 -0
- quarchpy/config_files/__pycache__/__init__.cpython-311.pyc +0 -0
- quarchpy/config_files/__pycache__/__init__.cpython-312.pyc +0 -0
- quarchpy/config_files/__pycache__/__init__.cpython-313.pyc +0 -0
- quarchpy/config_files/__pycache__/quarch_config_parser.cpython-311.pyc +0 -0
- quarchpy/config_files/__pycache__/quarch_config_parser.cpython-312.pyc +0 -0
- quarchpy/config_files/__pycache__/quarch_config_parser.cpython-313.pyc +0 -0
- quarchpy/connection_specific/QPS/win-amd64/3rdPartyLicenses/Material-Icons-license.txt +0 -51
- quarchpy/connection_specific/QPS/win-amd64/3rdPartyLicenses/argparse4j-LICENSE.txt +0 -23
- quarchpy/connection_specific/QPS/win-amd64/3rdPartyLicenses/com.sun.istack-license.html +0 -59
- quarchpy/connection_specific/QPS/win-amd64/3rdPartyLicenses/commons-io-LICENSE-2.0.txt +0 -202
- quarchpy/connection_specific/QPS/win-amd64/3rdPartyLicenses/controlsfx-license.txt +0 -29
- quarchpy/connection_specific/QPS/win-amd64/3rdPartyLicenses/jakarta.activation-license.html +0 -59
- quarchpy/connection_specific/QPS/win-amd64/3rdPartyLicenses/jakarta.xml.bind-api-license.html +0 -59
- quarchpy/connection_specific/QPS/win-amd64/3rdPartyLicenses/netty-LICENSE.txt +0 -202
- quarchpy/connection_specific/QPS/win-amd64/3rdPartyLicenses/netty-NOTICE.txt +0 -239
- quarchpy/connection_specific/QPS/win-amd64/InstallType.dat +0 -1
- quarchpy/connection_specific/QPS/win-amd64/app.properties +0 -6
- quarchpy/connection_specific/QPS/win-amd64/license.txt +0 -1
- quarchpy/connection_specific/QPS/win-amd64/qis/3rdPartyLicenses/com.sun.istack-license.html +0 -59
- quarchpy/connection_specific/QPS/win-amd64/qis/3rdPartyLicenses/dorkbox-LICENSE.Apachev2 +0 -218
- quarchpy/connection_specific/QPS/win-amd64/qis/3rdPartyLicenses/jSerialComm-LICENSE-APACHE-2.0 +0 -202
- quarchpy/connection_specific/QPS/win-amd64/qis/3rdPartyLicenses/jSerialComm-LICENSE-LGPL-3.0 +0 -165
- quarchpy/connection_specific/QPS/win-amd64/qis/3rdPartyLicenses/jakarta.activation-license.html +0 -59
- quarchpy/connection_specific/QPS/win-amd64/qis/3rdPartyLicenses/jakarta.xml.bind-api-license.html +0 -59
- quarchpy/connection_specific/QPS/win-amd64/qis/3rdPartyLicenses/javassist-License.html +0 -381
- quarchpy/connection_specific/QPS/win-amd64/qis/3rdPartyLicenses/jmdns-LICENSE.txt +0 -202
- quarchpy/connection_specific/QPS/win-amd64/qis/3rdPartyLicenses/jna-AL2.0 +0 -177
- quarchpy/connection_specific/QPS/win-amd64/qis/3rdPartyLicenses/kotlin-stdlib-LICENSE-2.0.txt +0 -202
- quarchpy/connection_specific/QPS/win-amd64/qis/3rdPartyLicenses/netty-LICENSE.txt +0 -202
- quarchpy/connection_specific/QPS/win-amd64/qis/3rdPartyLicenses/netty-NOTICE.txt +0 -239
- quarchpy/connection_specific/QPS/win-amd64/qis/3rdPartyLicenses/slf4j-LICENSE.txt +0 -24
- quarchpy/connection_specific/QPS/win-amd64/qis/3rdPartyLicenses/usb4java-LICENSE.md +0 -20
- quarchpy/connection_specific/QPS/win-amd64/qis/license.txt +0 -1
- quarchpy/connection_specific/QPS/win-amd64/qis/qis_lib/TorridonCommon-1.1.jar +0 -0
- quarchpy/connection_specific/QPS/win-amd64/qis/qis_lib/jmdns-3.5.9.jar +0 -0
- quarchpy/connection_specific/QPS/win-amd64/qps_lib/commons-io-2.18.0.jar +0 -0
- quarchpy/connection_specific/QPS/win-amd64/qps_lib/lin-arm64/javafx-base-21.0.6-linux-aarch64.jar +0 -0
- quarchpy/connection_specific/QPS/win-amd64/qps_lib/lin-arm64/javafx-controls-21.0.6-linux-aarch64.jar +0 -0
- quarchpy/connection_specific/QPS/win-amd64/qps_lib/lin-arm64/javafx-fxml-21.0.6-linux-aarch64.jar +0 -0
- quarchpy/connection_specific/QPS/win-amd64/qps_lib/lin-arm64/javafx-graphics-21.0.6-linux-aarch64.jar +0 -0
- quarchpy/connection_specific/QPS/win-amd64/qps_lib/lin-arm64/javafx-swing-21.0.6-linux-aarch64.jar +0 -0
- quarchpy/connection_specific/QPS/win-amd64/qps_lib/qutils-1.0.jar +0 -0
- quarchpy/connection_specific/__pycache__/StreamChannels.cpython-311.pyc +0 -0
- quarchpy/connection_specific/__pycache__/StreamChannels.cpython-312.pyc +0 -0
- quarchpy/connection_specific/__pycache__/StreamChannels.cpython-313.pyc +0 -0
- quarchpy/connection_specific/__pycache__/__init__.cpython-311.pyc +0 -0
- quarchpy/connection_specific/__pycache__/__init__.cpython-312.pyc +0 -0
- quarchpy/connection_specific/__pycache__/__init__.cpython-313.pyc +0 -0
- quarchpy/connection_specific/__pycache__/connection_QIS.cpython-311.pyc +0 -0
- quarchpy/connection_specific/__pycache__/connection_QIS.cpython-312.pyc +0 -0
- quarchpy/connection_specific/__pycache__/connection_QIS.cpython-313.pyc +0 -0
- quarchpy/connection_specific/__pycache__/connection_QPS.cpython-311.pyc +0 -0
- quarchpy/connection_specific/__pycache__/connection_QPS.cpython-312.pyc +0 -0
- quarchpy/connection_specific/__pycache__/connection_QPS.cpython-313.pyc +0 -0
- quarchpy/connection_specific/__pycache__/connection_ReST.cpython-311.pyc +0 -0
- quarchpy/connection_specific/__pycache__/connection_ReST.cpython-312.pyc +0 -0
- quarchpy/connection_specific/__pycache__/connection_ReST.cpython-313.pyc +0 -0
- quarchpy/connection_specific/__pycache__/connection_Serial.cpython-311.pyc +0 -0
- quarchpy/connection_specific/__pycache__/connection_Serial.cpython-312.pyc +0 -0
- quarchpy/connection_specific/__pycache__/connection_Serial.cpython-313.pyc +0 -0
- quarchpy/connection_specific/__pycache__/connection_TCP.cpython-311.pyc +0 -0
- quarchpy/connection_specific/__pycache__/connection_TCP.cpython-312.pyc +0 -0
- quarchpy/connection_specific/__pycache__/connection_TCP.cpython-313.pyc +0 -0
- quarchpy/connection_specific/__pycache__/connection_USB.cpython-311.pyc +0 -0
- quarchpy/connection_specific/__pycache__/connection_USB.cpython-312.pyc +0 -0
- quarchpy/connection_specific/__pycache__/connection_USB.cpython-313.pyc +0 -0
- quarchpy/connection_specific/__pycache__/mDNS.cpython-311.pyc +0 -0
- quarchpy/connection_specific/__pycache__/mDNS.cpython-312.pyc +0 -0
- quarchpy/connection_specific/__pycache__/mDNS.cpython-313.pyc +0 -0
- quarchpy/connection_specific/jdk_j21_jres/__pycache__/__init__.cpython-311.pyc +0 -0
- quarchpy/connection_specific/jdk_j21_jres/__pycache__/__init__.cpython-312.pyc +0 -0
- quarchpy/connection_specific/jdk_j21_jres/__pycache__/__init__.cpython-313.pyc +0 -0
- quarchpy/connection_specific/jdk_j21_jres/__pycache__/fix_permissions.cpython-311.pyc +0 -0
- quarchpy/connection_specific/jdk_j21_jres/__pycache__/fix_permissions.cpython-312.pyc +0 -0
- quarchpy/connection_specific/jdk_j21_jres/__pycache__/fix_permissions.cpython-313.pyc +0 -0
- quarchpy/connection_specific/serial/__pycache__/__init__.cpython-311.pyc +0 -0
- quarchpy/connection_specific/serial/__pycache__/__init__.cpython-312.pyc +0 -0
- quarchpy/connection_specific/serial/__pycache__/__init__.cpython-313.pyc +0 -0
- quarchpy/connection_specific/serial/__pycache__/serialutil.cpython-311.pyc +0 -0
- quarchpy/connection_specific/serial/__pycache__/serialutil.cpython-312.pyc +0 -0
- quarchpy/connection_specific/serial/__pycache__/serialutil.cpython-313.pyc +0 -0
- quarchpy/connection_specific/serial/__pycache__/serialwin32.cpython-311.pyc +0 -0
- quarchpy/connection_specific/serial/__pycache__/serialwin32.cpython-312.pyc +0 -0
- quarchpy/connection_specific/serial/__pycache__/serialwin32.cpython-313.pyc +0 -0
- quarchpy/connection_specific/serial/__pycache__/win32.cpython-311.pyc +0 -0
- quarchpy/connection_specific/serial/__pycache__/win32.cpython-312.pyc +0 -0
- quarchpy/connection_specific/serial/__pycache__/win32.cpython-313.pyc +0 -0
- quarchpy/connection_specific/serial/tools/__pycache__/__init__.cpython-311.pyc +0 -0
- quarchpy/connection_specific/serial/tools/__pycache__/__init__.cpython-312.pyc +0 -0
- quarchpy/connection_specific/serial/tools/__pycache__/__init__.cpython-313.pyc +0 -0
- quarchpy/connection_specific/serial/tools/__pycache__/list_ports.cpython-311.pyc +0 -0
- quarchpy/connection_specific/serial/tools/__pycache__/list_ports.cpython-312.pyc +0 -0
- quarchpy/connection_specific/serial/tools/__pycache__/list_ports.cpython-313.pyc +0 -0
- quarchpy/connection_specific/serial/tools/__pycache__/list_ports_common.cpython-311.pyc +0 -0
- quarchpy/connection_specific/serial/tools/__pycache__/list_ports_common.cpython-312.pyc +0 -0
- quarchpy/connection_specific/serial/tools/__pycache__/list_ports_common.cpython-313.pyc +0 -0
- quarchpy/connection_specific/serial/tools/__pycache__/list_ports_windows.cpython-311.pyc +0 -0
- quarchpy/connection_specific/serial/tools/__pycache__/list_ports_windows.cpython-312.pyc +0 -0
- quarchpy/connection_specific/serial/tools/__pycache__/list_ports_windows.cpython-313.pyc +0 -0
- quarchpy/connection_specific/usb_libs/__pycache__/libusb1.cpython-311.pyc +0 -0
- quarchpy/connection_specific/usb_libs/__pycache__/libusb1.cpython-312.pyc +0 -0
- quarchpy/connection_specific/usb_libs/__pycache__/usb1.cpython-311.pyc +0 -0
- quarchpy/connection_specific/usb_libs/__pycache__/usb1.cpython-312.pyc +0 -0
- quarchpy/debug/__pycache__/SystemTest.cpython-311.pyc +0 -0
- quarchpy/debug/__pycache__/SystemTest.cpython-312.pyc +0 -0
- quarchpy/debug/__pycache__/SystemTest.cpython-313.pyc +0 -0
- quarchpy/debug/__pycache__/__init__.cpython-311.pyc +0 -0
- quarchpy/debug/__pycache__/__init__.cpython-312.pyc +0 -0
- quarchpy/debug/__pycache__/__init__.cpython-313.pyc +0 -0
- quarchpy/debug/__pycache__/module_debug.cpython-311.pyc +0 -0
- quarchpy/debug/__pycache__/module_debug.cpython-312.pyc +0 -0
- quarchpy/debug/__pycache__/module_debug.cpython-313.pyc +0 -0
- quarchpy/debug/__pycache__/simple_terminal.cpython-311.pyc +0 -0
- quarchpy/debug/__pycache__/simple_terminal.cpython-312.pyc +0 -0
- quarchpy/debug/__pycache__/simple_terminal.cpython-313.pyc +0 -0
- quarchpy/debug/__pycache__/upgrade_quarchpy.cpython-311.pyc +0 -0
- quarchpy/debug/__pycache__/upgrade_quarchpy.cpython-312.pyc +0 -0
- quarchpy/debug/__pycache__/upgrade_quarchpy.cpython-313.pyc +0 -0
- quarchpy/debug/__pycache__/versionCompare.cpython-311.pyc +0 -0
- quarchpy/debug/__pycache__/versionCompare.cpython-312.pyc +0 -0
- quarchpy/debug/__pycache__/versionCompare.cpython-313.pyc +0 -0
- quarchpy/device/__pycache__/__init__.cpython-311.pyc +0 -0
- quarchpy/device/__pycache__/__init__.cpython-312.pyc +0 -0
- quarchpy/device/__pycache__/__init__.cpython-313.pyc +0 -0
- quarchpy/device/__pycache__/device.cpython-311.pyc +0 -0
- quarchpy/device/__pycache__/device.cpython-312.pyc +0 -0
- quarchpy/device/__pycache__/device.cpython-313.pyc +0 -0
- quarchpy/device/__pycache__/quarchArray.cpython-311.pyc +0 -0
- quarchpy/device/__pycache__/quarchArray.cpython-312.pyc +0 -0
- quarchpy/device/__pycache__/quarchArray.cpython-313.pyc +0 -0
- quarchpy/device/__pycache__/quarchPPM.cpython-311.pyc +0 -0
- quarchpy/device/__pycache__/quarchPPM.cpython-312.pyc +0 -0
- quarchpy/device/__pycache__/quarchPPM.cpython-313.pyc +0 -0
- quarchpy/device/__pycache__/quarchQPS.cpython-311.pyc +0 -0
- quarchpy/device/__pycache__/quarchQPS.cpython-312.pyc +0 -0
- quarchpy/device/__pycache__/quarchQPS.cpython-313.pyc +0 -0
- quarchpy/device/__pycache__/scanDevices.cpython-311.pyc +0 -0
- quarchpy/device/__pycache__/scanDevices.cpython-312.pyc +0 -0
- quarchpy/device/__pycache__/scanDevices.cpython-313.pyc +0 -0
- quarchpy/disk_test/__pycache__/AbsDiskFinder.cpython-311.pyc +0 -0
- quarchpy/disk_test/__pycache__/AbsDiskFinder.cpython-312.pyc +0 -0
- quarchpy/disk_test/__pycache__/AbsDiskFinder.cpython-313.pyc +0 -0
- quarchpy/disk_test/__pycache__/DiskTargetSelection.cpython-311.pyc +0 -0
- quarchpy/disk_test/__pycache__/DiskTargetSelection.cpython-312.pyc +0 -0
- quarchpy/disk_test/__pycache__/DiskTargetSelection.cpython-313.pyc +0 -0
- quarchpy/disk_test/__pycache__/__init__.cpython-311.pyc +0 -0
- quarchpy/disk_test/__pycache__/__init__.cpython-312.pyc +0 -0
- quarchpy/disk_test/__pycache__/__init__.cpython-313.pyc +0 -0
- quarchpy/disk_test/__pycache__/iometerDiskFinder.cpython-311.pyc +0 -0
- quarchpy/disk_test/__pycache__/iometerDiskFinder.cpython-312.pyc +0 -0
- quarchpy/disk_test/__pycache__/iometerDiskFinder.cpython-313.pyc +0 -0
- quarchpy/fio/__pycache__/FIO_interface.cpython-311.pyc +0 -0
- quarchpy/fio/__pycache__/FIO_interface.cpython-312.pyc +0 -0
- quarchpy/fio/__pycache__/FIO_interface.cpython-313.pyc +0 -0
- quarchpy/fio/__pycache__/__init__.cpython-311.pyc +0 -0
- quarchpy/fio/__pycache__/__init__.cpython-312.pyc +0 -0
- quarchpy/fio/__pycache__/__init__.cpython-313.pyc +0 -0
- quarchpy/fio/test_performance_class.py +0 -533
- quarchpy/iometer/__pycache__/__init__.cpython-311.pyc +0 -0
- quarchpy/iometer/__pycache__/__init__.cpython-312.pyc +0 -0
- quarchpy/iometer/__pycache__/__init__.cpython-313.pyc +0 -0
- quarchpy/iometer/__pycache__/gen_iometer_template.cpython-311.pyc +0 -0
- quarchpy/iometer/__pycache__/gen_iometer_template.cpython-313.pyc +0 -0
- quarchpy/iometer/__pycache__/iometerFuncs.cpython-311.pyc +0 -0
- quarchpy/iometer/__pycache__/iometerFuncs.cpython-312.pyc +0 -0
- quarchpy/iometer/__pycache__/iometerFuncs.cpython-313.pyc +0 -0
- quarchpy/qis/__pycache__/StreamHeaderInfo.cpython-311.pyc +0 -0
- quarchpy/qis/__pycache__/StreamHeaderInfo.cpython-312.pyc +0 -0
- quarchpy/qis/__pycache__/StreamHeaderInfo.cpython-313.pyc +0 -0
- quarchpy/qis/__pycache__/__init__.cpython-311.pyc +0 -0
- quarchpy/qis/__pycache__/__init__.cpython-312.pyc +0 -0
- quarchpy/qis/__pycache__/__init__.cpython-313.pyc +0 -0
- quarchpy/qis/__pycache__/qisFuncs.cpython-311.pyc +0 -0
- quarchpy/qis/__pycache__/qisFuncs.cpython-312.pyc +0 -0
- quarchpy/qis/__pycache__/qisFuncs.cpython-313.pyc +0 -0
- quarchpy/qps/__pycache__/__init__.cpython-311.pyc +0 -0
- quarchpy/qps/__pycache__/__init__.cpython-312.pyc +0 -0
- quarchpy/qps/__pycache__/__init__.cpython-313.pyc +0 -0
- quarchpy/qps/__pycache__/qpsFuncs.cpython-311.pyc +0 -0
- quarchpy/qps/__pycache__/qpsFuncs.cpython-312.pyc +0 -0
- quarchpy/qps/__pycache__/qpsFuncs.cpython-313.pyc +0 -0
- quarchpy/user_interface/__pycache__/__init__.cpython-311.pyc +0 -0
- quarchpy/user_interface/__pycache__/__init__.cpython-312.pyc +0 -0
- quarchpy/user_interface/__pycache__/__init__.cpython-313.pyc +0 -0
- quarchpy/user_interface/__pycache__/user_interface.cpython-311.pyc +0 -0
- quarchpy/user_interface/__pycache__/user_interface.cpython-312.pyc +0 -0
- quarchpy/user_interface/__pycache__/user_interface.cpython-313.pyc +0 -0
- quarchpy/utilities/__pycache__/TestCenter.cpython-311.pyc +0 -0
- quarchpy/utilities/__pycache__/TestCenter.cpython-312.pyc +0 -0
- quarchpy/utilities/__pycache__/TestCenter.cpython-313.pyc +0 -0
- quarchpy/utilities/__pycache__/TimeValue.cpython-311.pyc +0 -0
- quarchpy/utilities/__pycache__/TimeValue.cpython-312.pyc +0 -0
- quarchpy/utilities/__pycache__/TimeValue.cpython-313.pyc +0 -0
- quarchpy/utilities/__pycache__/Version.cpython-311.pyc +0 -0
- quarchpy/utilities/__pycache__/Version.cpython-312.pyc +0 -0
- quarchpy/utilities/__pycache__/Version.cpython-313.pyc +0 -0
- quarchpy/utilities/__pycache__/__init__.cpython-311.pyc +0 -0
- quarchpy/utilities/__pycache__/__init__.cpython-312.pyc +0 -0
- quarchpy/utilities/__pycache__/__init__.cpython-313.pyc +0 -0
- /quarchpy/connection_specific/QPS/win-amd64/DeviceConfig/{QTL1995-02.xml → QTL1995-02.XML} +0 -0
- /quarchpy/connection_specific/QPS/win-amd64/DeviceConfig/{QTL1999-02.xml → QTL1999-02.XML} +0 -0
- /quarchpy/connection_specific/QPS/win-amd64/DeviceConfig/{QTL2312-01.xml → QTL2312-01.XML} +0 -0
- {quarchpy-2.2.9.dev4.dist-info → quarchpy-2.2.9.dev5.dist-info}/top_level.txt +0 -0
@@ -1,19 +1,13 @@
|
|
1
|
-
# -*- coding: future_fstrings -*-
|
2
|
-
import csv
|
3
1
|
import socket
|
4
2
|
import re
|
5
|
-
import
|
6
|
-
import sys
|
7
|
-
import os
|
3
|
+
import gzip
|
8
4
|
import datetime
|
9
5
|
import select
|
10
6
|
import threading
|
11
|
-
import math
|
12
|
-
import logging
|
13
7
|
import struct
|
14
|
-
import xml.etree.ElementTree as ET
|
15
8
|
from io import StringIO
|
16
9
|
from quarchpy.user_interface import *
|
10
|
+
import xml.etree.ElementTree as ET
|
17
11
|
from connection_specific.StreamChannels import StreamGroups
|
18
12
|
|
19
13
|
|
@@ -88,7 +82,7 @@ class QisInterface:
|
|
88
82
|
logging.error('Is backend running and host accessible?')
|
89
83
|
self.deviceDict['QIS'][0:3] = [True, 'Disconnected', 'Unable to connect to QIS']
|
90
84
|
raise e
|
91
|
-
|
85
|
+
|
92
86
|
# Tries to close the socket to specified host and port.
|
93
87
|
def disconnect(self):
|
94
88
|
res = 'Disconnecting from backend'
|
@@ -105,17 +99,20 @@ class QisInterface:
|
|
105
99
|
return res
|
106
100
|
|
107
101
|
def closeConnection(self, sock=None, conString=None):
|
108
|
-
if sock
|
102
|
+
if sock is None:
|
109
103
|
sock = self.sock
|
110
104
|
if conString is None:
|
111
|
-
|
105
|
+
cmd = "close"
|
112
106
|
else:
|
113
|
-
cmd =conString+" close"
|
114
|
-
|
115
|
-
|
116
|
-
|
107
|
+
cmd = conString + " close"
|
108
|
+
try:
|
109
|
+
response = self.sendAndReceiveText(sock, cmd)
|
110
|
+
return response
|
111
|
+
except ConnectionResetError:
|
112
|
+
logging.warning('Unable to close connection to QIS, QIS may be already closed')
|
113
|
+
return None
|
117
114
|
|
118
|
-
def startStream(self, module, fileName, fileMaxMB, streamName, streamAverage, releaseOnData, separator, streamDuration
|
115
|
+
def startStream(self, module, fileName, fileMaxMB, streamName, streamAverage, releaseOnData, separator, streamDuration=None, inMemoryData=None, outputFileHandle=None, useGzip=None):
|
119
116
|
self.StreamRunSentSemaphore.acquire()
|
120
117
|
self.deviceDictSetup('QIS')
|
121
118
|
i = self.deviceMulti(module)
|
@@ -125,7 +122,7 @@ class QisInterface:
|
|
125
122
|
|
126
123
|
# Create the thread
|
127
124
|
t1 = threading.Thread(target=self.startStreamThread, name=module,
|
128
|
-
args=(module, fileName, fileMaxMB, streamName, streamAverage, releaseOnData, separator, streamDuration, inMemoryData))
|
125
|
+
args=(module, fileName, fileMaxMB, streamName, streamAverage, releaseOnData, separator, streamDuration, inMemoryData, outputFileHandle, useGzip))
|
129
126
|
# Start the thread
|
130
127
|
t1.start()
|
131
128
|
|
@@ -179,7 +176,8 @@ class QisInterface:
|
|
179
176
|
running = False
|
180
177
|
time.sleep(0.1)
|
181
178
|
|
182
|
-
def startStreamThread(self, module, fileName, fileMaxMB, streamName, streamAverage, releaseOnData, separator,
|
179
|
+
def startStreamThread(self, module, fileName, fileMaxMB, streamName, streamAverage, releaseOnData, separator,
|
180
|
+
streamDuration=None, inMemoryData=None, output_file_handle=None, use_gzip=False):
|
183
181
|
# This is the function that is run when t1 is created. It is run in a seperate thread from
|
184
182
|
# the main application so streaming can happen without blocking the main application from
|
185
183
|
# doing other things. Within this function/thread you have to be very careful not to try
|
@@ -188,20 +186,40 @@ class QisInterface:
|
|
188
186
|
# (which some of the comms with module functions will use by default).
|
189
187
|
|
190
188
|
f = None
|
191
|
-
#
|
192
|
-
if inMemoryData
|
189
|
+
file_opened_by_function = False # True if this function opens the file
|
190
|
+
is_in_memory_stream = False # True if using inMemoryData (StringIO)
|
191
|
+
|
192
|
+
# Priority: 1. output_file_handle, 2. inMemoryData, 3. open new file
|
193
|
+
if output_file_handle is not None:
|
194
|
+
f = output_file_handle
|
195
|
+
# Caller is responsible for the handle's mode (e.g., text/binary) and type.
|
196
|
+
elif inMemoryData is not None:
|
193
197
|
if not isinstance(inMemoryData, StringIO):
|
194
|
-
raise
|
198
|
+
raise TypeError("Error! The parameter 'inMemoryData' must be of type StringIO.")
|
195
199
|
f = inMemoryData
|
200
|
+
is_in_memory_stream = True
|
196
201
|
else:
|
197
|
-
|
202
|
+
# No external handle or in-memory buffer, so open a file.
|
203
|
+
if not fileName: # fileName is mandatory if we are to open a file.
|
204
|
+
raise ValueError("fileName must be provided if output_file_handle and inMemoryData are None.")
|
205
|
+
file_opened_by_function = True
|
206
|
+
if use_gzip:
|
207
|
+
# Open in text mode ('wt'). Encoding 'utf-8' is a good default.
|
208
|
+
# gzip.open in text mode handles newline conversions.
|
209
|
+
f = gzip.open(fileName, 'wt', encoding='utf-8')
|
210
|
+
else:
|
211
|
+
# Open in text mode ('w').
|
212
|
+
# newline='' ensures that '\n' is written as '\n' on all platforms.
|
213
|
+
f = open(fileName, 'w', encoding='utf-8', newline='')
|
198
214
|
|
215
|
+
# This variable was declared but seemed unused before its first assignment.
|
199
216
|
stripes = ['Empty Header']
|
200
|
-
|
201
|
-
|
202
|
-
|
203
|
-
|
204
|
-
|
217
|
+
|
218
|
+
# Send stream command so module starts streaming data into the backends buffer
|
219
|
+
streamRes = self.sendAndReceiveCmd(self.streamSock, 'rec stream', device=module, betweenCommandDelay=0)
|
220
|
+
# printText(streamRes) # Assuming printText is a custom logging/debug function
|
221
|
+
if 'rec stream : OK' in streamRes:
|
222
|
+
if releaseOnData is False:
|
205
223
|
self.StreamRunSentSemaphore.release()
|
206
224
|
self.stripesEvent.clear()
|
207
225
|
self.deviceDict[module][0:3] = [False, 'Running', 'Stream Running']
|
@@ -209,36 +227,43 @@ class QisInterface:
|
|
209
227
|
self.StreamRunSentSemaphore.release()
|
210
228
|
self.stripesEvent.clear()
|
211
229
|
self.deviceDict[module][0:3] = [True, 'Stopped', module + " couldn't start because " + streamRes]
|
230
|
+
if file_opened_by_function and f:
|
231
|
+
try:
|
232
|
+
f.close()
|
233
|
+
except Exception as e_close:
|
234
|
+
logging.error(f"Error closing file {fileName} on stream start failure: {e_close}")
|
212
235
|
return
|
213
236
|
|
214
237
|
baseSamplePeriod = self.streamHeaderAverage(device=module, sock=self.streamSock)
|
215
|
-
count=0
|
216
|
-
maxTries=10
|
238
|
+
count = 0
|
239
|
+
maxTries = 10
|
217
240
|
while 'Header Not Available' in baseSamplePeriod:
|
218
241
|
baseSamplePeriod = self.streamHeaderAverage(device=module, sock=self.streamSock)
|
219
242
|
time.sleep(0.1)
|
220
243
|
count += 1
|
221
244
|
if count > maxTries:
|
222
245
|
self.deviceDict[module][0:3] = [True, 'Stopped', 'Header not available']
|
223
|
-
|
224
|
-
|
225
|
-
|
246
|
+
if file_opened_by_function and f:
|
247
|
+
try:
|
248
|
+
f.close()
|
249
|
+
except Exception as e_close:
|
250
|
+
logging.error(f"Error closing file {fileName} on header failure: {e_close}")
|
251
|
+
return # Changed from exit() for cleaner thread termination
|
252
|
+
|
253
|
+
version = self.streamHeaderVersion(device=module, sock=self.streamSock) # version seems unused
|
254
|
+
timeStampHeader = datetime.datetime.now().strftime("%H:%M:%S:%f %d/%m/%y") # timeStampHeader seems unused
|
226
255
|
formatHeader = self.streamHeaderFormat(device=module, sock=self.streamSock)
|
227
256
|
formatHeader = formatHeader.replace(", ", separator)
|
228
257
|
f.write(formatHeader + '\n')
|
229
258
|
|
230
259
|
numStripesPerRead = 4096
|
231
260
|
maxFileExceeded = False
|
232
|
-
openAttempts = 0
|
261
|
+
openAttempts = 0 # Used in except IOError block
|
233
262
|
leftover = 0
|
234
263
|
remainingStripes = []
|
235
264
|
streamOverrun = False
|
236
265
|
streamComplete = False
|
237
266
|
|
238
|
-
# baseSamplePeriod is a string in the form [int][unit]
|
239
|
-
# where the unit can be S,mS,uS,nS
|
240
|
-
# we need to convert it to a float number of seconds
|
241
|
-
# and we also derive the baseSampleUnits in string and numeric form
|
242
267
|
if 'ns' in baseSamplePeriod.lower():
|
243
268
|
baseSampleUnitText = 'ns'
|
244
269
|
baseSampleUnitExponent = -9
|
@@ -248,181 +273,207 @@ class QisInterface:
|
|
248
273
|
elif 'ms' in baseSamplePeriod.lower():
|
249
274
|
baseSampleUnitText = 'ms'
|
250
275
|
baseSampleUnitExponent = -3
|
251
|
-
elif 'S' in baseSamplePeriod.lower():
|
276
|
+
elif 'S' in baseSamplePeriod.lower(): # Original was 'S', assuming it means 's'
|
252
277
|
baseSampleUnitText = 's'
|
253
278
|
baseSampleUnitExponent = 0
|
254
279
|
else:
|
255
|
-
raise
|
280
|
+
# Clean up and raise error if baseSamplePeriod is undecodable
|
281
|
+
if file_opened_by_function and f:
|
282
|
+
try:
|
283
|
+
f.close()
|
284
|
+
except Exception as e_close:
|
285
|
+
logging.error(f"Error closing file {fileName} due to ValueError: {e_close}")
|
286
|
+
raise ValueError(f"couldn't decode samplePeriod: {baseSamplePeriod}")
|
256
287
|
|
257
|
-
baseSamplePeriodS = int(re.search(r'^\d*\.?\d*', baseSamplePeriod).group())*(10**baseSampleUnitExponent)
|
288
|
+
baseSamplePeriodS = int(re.search(r'^\d*\.?\d*', baseSamplePeriod).group()) * (10 ** baseSampleUnitExponent)
|
289
|
+
|
290
|
+
# The following re-opening of the file is removed as f is already open in 'w' or 'wt' mode
|
291
|
+
# and subsequent writes will append.
|
292
|
+
# if inMemoryData is None:
|
293
|
+
# f = open(fileName, 'a', newline='')
|
258
294
|
|
259
|
-
# # TODO: MD Thinks this implements software averaging, is unused and now performed in QIS
|
260
|
-
# if streamAverage != None:
|
261
|
-
# #Matt converting streamAveraging into number
|
262
|
-
# streamAverage = self.convertStreamAverage(streamAverage)
|
263
|
-
# stripesPerAverage = float(streamAverage) / (float(baseSamplePeriodS) * 4e-6)
|
264
|
-
if inMemoryData is None:
|
265
|
-
if sys.version_info[0] >= 3:
|
266
|
-
f = open(fileName, 'a', newline='') # Python 3
|
267
|
-
else:
|
268
|
-
f = open(fileName, 'ab') # Python 2: Use 'b' mode to avoid newline issues
|
269
295
|
isRun = True
|
270
296
|
while isRun:
|
271
297
|
try:
|
272
|
-
# Until the event threadRunEvent is set externally to this thread,
|
273
|
-
# loop and read from the stream
|
274
298
|
i = self.deviceMulti(module)
|
275
299
|
while self.stopFlagList[i] and (not streamOverrun) and (not streamComplete):
|
276
|
-
#now = time.time()
|
277
300
|
streamOverrun, removeChar, newStripes = self.streamGetStripesText(self.streamSock, module, numStripesPerRead)
|
278
|
-
newStripes = newStripes.replace(' ', separator)
|
301
|
+
newStripes = newStripes.replace(' ', separator) # Replace spaces globally first
|
279
302
|
if streamOverrun:
|
280
303
|
self.deviceDict[module][0:3] = [True, 'Stopped', 'Device buffer overrun']
|
281
|
-
|
282
|
-
|
283
|
-
|
284
|
-
|
285
|
-
|
286
|
-
|
287
|
-
|
288
|
-
|
289
|
-
|
290
|
-
|
304
|
+
|
305
|
+
isEmpty = (removeChar == -6 and len(newStripes) == 6)
|
306
|
+
|
307
|
+
if not isEmpty:
|
308
|
+
current_file_mb = 0.0
|
309
|
+
if is_in_memory_stream:
|
310
|
+
current_file_mb = f.tell() / 1048576.0
|
311
|
+
elif fileName: # For file-based output (opened here or external handle with known fileName)
|
312
|
+
try:
|
313
|
+
# os.stat reflects the size on disk. For buffered writes (incl. gzip),
|
314
|
+
# this might not be the exact current unwritten buffer size + disk size
|
315
|
+
# without a flush, but it's what the original code relied on.
|
316
|
+
statInfo = os.stat(fileName)
|
317
|
+
current_file_mb = statInfo.st_size / 1048576.0
|
318
|
+
except FileNotFoundError:
|
319
|
+
current_file_mb = 0.0 # File might not exist yet or fileName is not locatable
|
320
|
+
except Exception as e_stat:
|
321
|
+
logging.warning(f"Could not get file size for {fileName}: {e_stat}")
|
322
|
+
current_file_mb = 0.0 # Default to small size on error
|
291
323
|
else:
|
292
|
-
|
324
|
+
# output_file_handle was given, but fileName was None. Cannot check disk size.
|
325
|
+
# Assume it's okay or managed by caller. fileMaxMB check effectively bypassed.
|
326
|
+
current_file_mb = 0.0
|
327
|
+
|
293
328
|
try:
|
294
|
-
int
|
295
|
-
|
296
|
-
|
297
|
-
|
298
|
-
|
329
|
+
# Ensure fileMaxMB can be converted to int. If not, skip file size check for this iteration.
|
330
|
+
max_mb_val = int(fileMaxMB)
|
331
|
+
except (ValueError, TypeError):
|
332
|
+
logging.warning(f"Invalid fileMaxMB value: {fileMaxMB}. Skipping size check for this iteration.")
|
333
|
+
max_mb_val = float('inf') # Effectively disable check if invalid
|
334
|
+
|
335
|
+
if current_file_mb < max_mb_val:
|
336
|
+
if releaseOnData: # Note: Original was `releaseOnData == True`
|
299
337
|
self.StreamRunSentSemaphore.release()
|
300
338
|
self.stripesEvent.clear()
|
301
|
-
releaseOnData = False
|
302
|
-
|
303
|
-
|
304
|
-
leftover, remainingStripes = self.averageStripes(leftover, stripesPerAverage,
|
339
|
+
releaseOnData = False # Prevent re-releasing
|
340
|
+
if streamAverage is not None:
|
341
|
+
# Assuming self.averageStripes handles writing to f
|
342
|
+
leftover, remainingStripes = self.averageStripes(leftover, stripesPerAverage,
|
343
|
+
newStripes[:removeChar], f,
|
344
|
+
remainingStripes)
|
305
345
|
else:
|
306
|
-
|
307
|
-
|
308
|
-
|
309
|
-
lastLine = newStripes.splitlines()[-3] # the last data line is followed by 'eof' and '>'
|
310
|
-
lastTime = lastLine.split(separator)[0] # get the first (time) entry
|
311
|
-
|
312
|
-
# if the last entry is still within the required stream length, write the whole lot
|
313
|
-
if int(lastTime) < int(streamDuration/(10**baseSampleUnitExponent)): # < rather than <= because we start at 0
|
314
|
-
newStripes = newStripes.replace(' ', separator)
|
315
|
-
f.write(newStripes[:removeChar])
|
346
|
+
if streamDuration is not None:
|
347
|
+
lastLine = newStripes.splitlines()[-3] # the last data line is followed by 'eof' and '>'
|
348
|
+
lastTime = lastLine.split(separator)[0]
|
316
349
|
|
317
|
-
|
350
|
+
if int(lastTime) < int(streamDuration / (10 ** baseSampleUnitExponent)):
|
351
|
+
# newStripes was already globally space-replaced.
|
352
|
+
f.write(newStripes[:removeChar])
|
318
353
|
else:
|
319
|
-
for thisLine in newStripes.splitlines()[:-2]:
|
320
|
-
|
321
|
-
if int(
|
354
|
+
for thisLine in newStripes.splitlines()[:-2]: # Process lines before 'eof' and '>'
|
355
|
+
thisTimeStr = thisLine.split(separator)[0]
|
356
|
+
if int(thisTimeStr) < int(streamDuration / (10 ** baseSampleUnitExponent)):
|
322
357
|
f.write(thisLine + '\r\n') # Put the CR back on the end
|
323
358
|
else:
|
324
359
|
streamComplete = True
|
325
360
|
break
|
326
361
|
else:
|
327
|
-
newStripes
|
362
|
+
# newStripes was already globally space-replaced.
|
328
363
|
f.write(newStripes[:removeChar])
|
329
|
-
|
330
364
|
else:
|
331
365
|
maxFileExceeded = True
|
332
|
-
#printText('QisInterface file size exceeded in loop 1- breaking')
|
333
366
|
maxFileStatus = self.streamBufferStatus(device=module, sock=self.streamSock)
|
334
367
|
f.write('Warning: Max file size exceeded before end of stream.\n')
|
335
|
-
f.write(
|
368
|
+
f.write(
|
369
|
+
'Unrecorded stripes in buffer when file full: ' + maxFileStatus + '.\n') # Added newline for clarity
|
336
370
|
self.deviceDict[module][0:3] = [True, 'Stopped', 'User defined max filesize reached']
|
337
|
-
break
|
338
|
-
else:
|
339
|
-
# there's no stripes in the buffer - it's not filling up fast -
|
340
|
-
# sleeps so we don't spam qis with requests (seems to make QIS crash)
|
341
|
-
# it might be clever to change the sleep time accoring to the situation
|
342
|
-
# e.g. wait longer with higher averaging or lots of no stripes in a row
|
371
|
+
break # Exit inner while loop
|
372
|
+
else: # isEmpty == True
|
343
373
|
time.sleep(0.1)
|
344
374
|
streamStatus = self.streamRunningStatus(device=module, sock=self.streamSock)
|
345
375
|
if streamOverrun:
|
346
|
-
#
|
347
|
-
break
|
376
|
+
break # Exit inner while loop
|
348
377
|
elif "Stopped" in streamStatus:
|
349
378
|
self.deviceDict[module][0:3] = [True, 'Stopped', 'User halted stream']
|
350
|
-
break
|
351
|
-
#
|
352
|
-
|
353
|
-
|
379
|
+
break # Exit inner while loop
|
380
|
+
# End of inner while self.stopFlagList... loop
|
381
|
+
|
382
|
+
self.sendAndReceiveCmd(self.streamSock, 'rec stop', device=module, betweenCommandDelay=0)
|
383
|
+
streamState = self.sendAndReceiveCmd(self.streamSock, 'stream?', device=module, betweenCommandDelay=0)
|
354
384
|
while "stopped" not in streamState.lower():
|
355
385
|
logging.debug("waiting for stream? to return stopped")
|
356
386
|
time.sleep(0.1)
|
357
|
-
streamState = self.sendAndReceiveCmd(self.streamSock, 'stream?', device=module, betweenCommandDelay=0)
|
387
|
+
streamState = self.sendAndReceiveCmd(self.streamSock, 'stream?', device=module, betweenCommandDelay=0)
|
358
388
|
|
359
389
|
if (not streamOverrun) and (not maxFileExceeded):
|
360
390
|
self.deviceDict[module][0:3] = [False, 'Stopped', 'Stream stopped - emptying buffer']
|
361
|
-
|
362
|
-
if
|
363
|
-
|
364
|
-
|
365
|
-
|
366
|
-
|
367
|
-
|
368
|
-
|
369
|
-
|
370
|
-
|
371
|
-
|
372
|
-
|
373
|
-
|
374
|
-
|
391
|
+
|
392
|
+
if not maxFileExceeded:
|
393
|
+
streamOverrun_final, removeChar_final, newStripes_final = self.streamGetStripesText(self.streamSock, module, numStripesPerRead)
|
394
|
+
isEmpty_final = (removeChar_final == -6 and len(newStripes_final) == 6)
|
395
|
+
|
396
|
+
while not isEmpty_final:
|
397
|
+
current_file_mb_final = 0.0
|
398
|
+
if is_in_memory_stream:
|
399
|
+
current_file_mb_final = f.tell() / 1048576.0
|
400
|
+
elif fileName:
|
401
|
+
try:
|
402
|
+
statInfo = os.stat(fileName)
|
403
|
+
current_file_mb_final = statInfo.st_size / 1048576.0
|
404
|
+
except Exception:
|
405
|
+
current_file_mb_final = 0.0
|
375
406
|
else:
|
376
|
-
|
407
|
+
current_file_mb_final = 0.0
|
408
|
+
|
377
409
|
try:
|
378
|
-
int(fileMaxMB)
|
379
|
-
except:
|
380
|
-
|
381
|
-
|
382
|
-
|
383
|
-
|
384
|
-
|
410
|
+
max_mb_val_final = int(fileMaxMB)
|
411
|
+
except (ValueError, TypeError):
|
412
|
+
max_mb_val_final = float('inf') # Effectively disable
|
413
|
+
|
414
|
+
if current_file_mb_final < max_mb_val_final:
|
415
|
+
if not streamComplete: # Check if stream was already completed due to duration
|
416
|
+
if (streamAverage != None):
|
417
|
+
leftover, remainingStripes = self.averageStripes(leftover, stripesPerAverage,
|
418
|
+
newStripes_final[
|
419
|
+
:removeChar_final], f,
|
420
|
+
remainingStripes)
|
385
421
|
else:
|
386
|
-
|
387
|
-
f.write(
|
422
|
+
newStripes_final = newStripes_final.replace(' ', separator) # Ensure replacement
|
423
|
+
f.write(newStripes_final[:removeChar_final])
|
388
424
|
else:
|
389
|
-
if not maxFileExceeded:
|
390
|
-
|
391
|
-
|
425
|
+
if not maxFileExceeded: # Only write warning if not already written
|
426
|
+
maxFileStatus_final = self.streamBufferStatus(device=module, sock=self.streamSock)
|
427
|
+
f.write('Warning: Max file size exceeded before end of stream.\n') # Changed from b''
|
428
|
+
f.write('Unrecorded stripes in buffer when file full: ' + maxFileStatus_final + '.\n') # Changed from b'', added newline
|
429
|
+
logging.warning('Max file size exceeded. Some data has not been saved to file: ' + maxFileStatus_final + '.')
|
430
|
+
maxFileExceeded = True # Set flag
|
392
431
|
self.deviceDict[module][0:3] = [True, 'Stopped', 'User defined max filesize reached']
|
393
|
-
break
|
394
|
-
|
395
|
-
|
396
|
-
|
397
|
-
|
398
|
-
|
399
|
-
|
400
|
-
|
401
|
-
f.write(b'Unrecorded stripes in buffer when file full: ' + maxFileStatus + '.')
|
402
|
-
logging.warning('Max file size exceeded. Some data has not been saved to file: ' + maxFileStatus + '.')
|
403
|
-
|
404
|
-
#printText('Stripes in buffer now: ' + self.streamBufferStatus(device=module, sock=self.streamSock))
|
405
|
-
|
406
|
-
if streamOverrun:
|
432
|
+
break # Exit emptying loop
|
433
|
+
|
434
|
+
streamOverrun_final, removeChar_final, newStripes_final = self.streamGetStripesText(
|
435
|
+
self.streamSock, module, numStripesPerRead, skipStatusCheck=True)
|
436
|
+
isEmpty_final = (removeChar_final == -6 and len(newStripes_final) == (
|
437
|
+
6 if newStripes_final else 0)) # handle newStripes_final potentially being None
|
438
|
+
|
439
|
+
if streamOverrun: # This check is after emptying buffer; might need re-evaluation if overrun can happen during emptying
|
407
440
|
self.deviceDict[module][0:3] = [True, 'Stopped', 'Device buffer overrun - QIS buffer empty']
|
408
|
-
elif not maxFileExceeded:
|
441
|
+
elif not maxFileExceeded: # If not overrun and not exceeded file size
|
409
442
|
self.deviceDict[module][0:3] = [False, 'Stopped', 'Stream stopped']
|
443
|
+
# If maxFileExceeded is true, the status is already set.
|
444
|
+
|
410
445
|
time.sleep(0.2)
|
411
|
-
isRun = False
|
446
|
+
isRun = False # Exit main while isRun loop
|
412
447
|
except IOError as err:
|
413
|
-
|
414
|
-
if
|
415
|
-
|
448
|
+
logging.error(f"IOError in startStreamThread for module {module}: {err}")
|
449
|
+
# f might have been closed by the system if it's a pipe and the other end closed,
|
450
|
+
# or other severe IO errors.
|
451
|
+
# Attempt to close only if this function opened it and it seems like it might be openable/closable.
|
452
|
+
if file_opened_by_function and f is not None:
|
453
|
+
try:
|
454
|
+
if not f.closed:
|
455
|
+
f.close()
|
456
|
+
except Exception as e_close:
|
457
|
+
logging.error(f"Error closing file {fileName} during IOError handling: {e_close}")
|
458
|
+
f = None # Avoid trying to close again in finally if error persists
|
459
|
+
|
416
460
|
time.sleep(0.5)
|
417
461
|
openAttempts += 1
|
418
462
|
if openAttempts > 4:
|
419
|
-
logging.error(
|
420
|
-
|
463
|
+
logging.error(f"Too many IOErrors in QisInterface for module {module}. Raising error.")
|
464
|
+
# Set device status before raising, if possible
|
465
|
+
self.deviceDict[module][0:3] = [True, 'Stopped', f'IOError limit exceeded: {err}']
|
466
|
+
raise # Re-raise the last IOError
|
421
467
|
finally:
|
422
|
-
if
|
423
|
-
|
424
|
-
|
425
|
-
|
468
|
+
if file_opened_by_function and f is not None:
|
469
|
+
try:
|
470
|
+
if not f.closed: # Check if not already closed (e.g. in IOError block)
|
471
|
+
f.close()
|
472
|
+
except Exception as e_close:
|
473
|
+
logging.error(f"Error closing file {fileName} in finally block: {e_close}")
|
474
|
+
# If output_file_handle was passed, caller is responsible for closing.
|
475
|
+
# If inMemoryData was passed, it's managed by caller.
|
476
|
+
# The original `else: inMemoryData = f` is removed as inMemoryData (StringIO) is mutated in-place.
|
426
477
|
|
427
478
|
# This is the function that is ran when t1 is created. It is ran in a seperate thread from
|
428
479
|
# the main application so streaming can happen without blocking the main application from
|
@@ -618,7 +669,7 @@ class QisInterface:
|
|
618
669
|
x = struct.pack(">d", int(stripe[counter]))
|
619
670
|
# logging.debug(item, x)
|
620
671
|
file1.write(x)
|
621
|
-
|
672
|
+
|
622
673
|
# Query the backend for a list of connected modules. A $scan command is sent to refresh the list of devices,
|
623
674
|
# Then a wait occurs while the backend discovers devices (network ones can take a while) and then a list of device name strings is returned
|
624
675
|
# The objects connection needs to be opened (connect()) before this is used
|
@@ -627,7 +678,7 @@ class QisInterface:
|
|
627
678
|
if sock == None:
|
628
679
|
sock = self.sock
|
629
680
|
devString = self.sendAndReceiveText(sock, '$list')
|
630
|
-
devString = devString.replace('>', '')
|
681
|
+
devString = devString.replace('>', '')
|
631
682
|
devString = devString.replace(r'\d+\) ', '')
|
632
683
|
devString = devString.split('\r\n')
|
633
684
|
devString = filter(None, devString) #remove empty elements
|
@@ -797,7 +848,7 @@ class QisInterface:
|
|
797
848
|
streamStatus = streamStatus.split('\r\n')
|
798
849
|
streamStatus[index] = re.sub(r'^Stripes Buffered: ', '', streamStatus[index])
|
799
850
|
return streamStatus[index]
|
800
|
-
|
851
|
+
|
801
852
|
# TODO: MD - This function should be replaced with a more generic method of accessing the header
|
802
853
|
# The return of a string with concatenated value and units should be replaced with something easier to parse
|
803
854
|
#
|
@@ -841,7 +892,7 @@ class QisInterface:
|
|
841
892
|
except Exception as e:
|
842
893
|
logging.error(device + ' Unable to get stream average.' + self.host + ':' + str(self.port))
|
843
894
|
raise e
|
844
|
-
|
895
|
+
|
845
896
|
# Get the version of the stream and convert to string for the specified device
|
846
897
|
# The objects connection needs to be opened (connect()) before this is used
|
847
898
|
def streamHeaderVersion(self, device, sock=None):
|
@@ -868,7 +919,7 @@ class QisInterface:
|
|
868
919
|
except Exception as e:
|
869
920
|
logging.error(device + ' Unable to get stream version.' + self.host + ':' + str(self.port))
|
870
921
|
raise e
|
871
|
-
|
922
|
+
|
872
923
|
# Get a header string giving which measurements are returned in the string for the specified device
|
873
924
|
# The objects connection needs to be opened (connect()) before this is used
|
874
925
|
def streamHeaderFormat(self, device, sock=None):
|
@@ -881,7 +932,7 @@ class QisInterface:
|
|
881
932
|
if (self.isXmlHeader (streamStatus)):
|
882
933
|
# Get the basic averaging rate (V3 header)
|
883
934
|
xml_root = self.getStreamXmlHeader (device=device, sock=sock)
|
884
|
-
# Return the time based averaging string
|
935
|
+
# Return the time based averaging string
|
885
936
|
device_period = xml_root.find('.//devicePeriod')
|
886
937
|
time_unit = 'uS'
|
887
938
|
if device_period == None:
|
@@ -891,7 +942,7 @@ class QisInterface:
|
|
891
942
|
if ('ns' in device_period.text):
|
892
943
|
time_unit = 'nS'
|
893
944
|
averageStr = device_period.text
|
894
|
-
|
945
|
+
|
895
946
|
# Time column always first
|
896
947
|
formatHeader = 'Time ' + time_unit + ','
|
897
948
|
# Find the channels section of each group and iterate through it to add the channel columns
|
@@ -929,7 +980,7 @@ class QisInterface:
|
|
929
980
|
formatHeader = formatHeader + ' 3V3_I,'
|
930
981
|
else:
|
931
982
|
formatHeader = formatHeader + ' 5V_I,'
|
932
|
-
|
983
|
+
|
933
984
|
if format & b1:
|
934
985
|
formatHeader = formatHeader + ' 12V_V,'
|
935
986
|
if format & b0:
|
@@ -994,7 +1045,7 @@ class QisInterface:
|
|
994
1045
|
return '32k'
|
995
1046
|
else:
|
996
1047
|
return 'Invalid Average Value'
|
997
|
-
|
1048
|
+
|
998
1049
|
# TODO: MD Thinks this implements software averaging, is unused and now performed in QIS
|
999
1050
|
# Works out average values of timescales longer than max device averaging
|
1000
1051
|
def averageStripes(self, leftover, streamAverage, newStripes, f, remainingStripes = []):
|
@@ -1041,7 +1092,7 @@ class QisInterface:
|
|
1041
1092
|
self.stopFlagList.append(True)
|
1042
1093
|
self.listSemaphore.release()
|
1043
1094
|
return self.deviceList.index(device)
|
1044
|
-
|
1095
|
+
|
1045
1096
|
def deviceDictSetup(self, module):
|
1046
1097
|
if module in self.deviceDict.keys():
|
1047
1098
|
return
|
@@ -1053,23 +1104,23 @@ class QisInterface:
|
|
1053
1104
|
self.dictSemaphore.acquire()
|
1054
1105
|
self.deviceDict[module] = [False, 'Stopped', "User hasn't started stream"]
|
1055
1106
|
self.dictSemaphore.release()
|
1056
|
-
|
1107
|
+
|
1057
1108
|
def streamInterrupt(self):
|
1058
1109
|
for key in self.deviceDict.keys():
|
1059
1110
|
if self.deviceDict[key][0]:
|
1060
1111
|
return True
|
1061
1112
|
return False
|
1062
|
-
|
1113
|
+
|
1063
1114
|
def interruptList(self):
|
1064
1115
|
streamIssueList = []
|
1065
1116
|
for key in self.deviceDict.keys():
|
1066
1117
|
if self.deviceDict[key][0]:
|
1067
|
-
streamIssue = [key]
|
1118
|
+
streamIssue = [key]
|
1068
1119
|
streamIssue.append(self.deviceDict[key][1])
|
1069
1120
|
streamIssue.append(self.deviceDict[key][2])
|
1070
1121
|
streamIssueList.append(streamIssue)
|
1071
1122
|
return streamIssueList
|
1072
|
-
|
1123
|
+
|
1073
1124
|
def waitStop(self):
|
1074
1125
|
running = 1
|
1075
1126
|
while running != 0:
|
@@ -1091,7 +1142,7 @@ class QisInterface:
|
|
1091
1142
|
returnValue = streamAveraging
|
1092
1143
|
|
1093
1144
|
return returnValue
|
1094
|
-
|
1145
|
+
|
1095
1146
|
# Pass in a stream header and we check if it is XML or legacy format
|
1096
1147
|
def isXmlHeader (self, headerText):
|
1097
1148
|
if('?xml version=' not in headerText):
|
@@ -1124,17 +1175,17 @@ class QisInterface:
|
|
1124
1175
|
|
1125
1176
|
break
|
1126
1177
|
# Parse XML into structured format
|
1127
|
-
xml_root = ET.fromstring(headerData)
|
1128
|
-
|
1178
|
+
xml_root = ET.fromstring(headerData)
|
1179
|
+
|
1129
1180
|
# Check header format is supported by quarchpy
|
1130
1181
|
versionStr = xml_root.find('.//version').text
|
1131
1182
|
if ('V3' not in versionStr):
|
1132
1183
|
logging.error(device + ' Stream header version not compatible: ' + xml_root['version'].text + '.' + self.host + ':' + str(self.port))
|
1133
1184
|
raise Exception ("Stream header version not supported");
|
1134
|
-
|
1185
|
+
|
1135
1186
|
# Return the XML structure for the code to use
|
1136
1187
|
return xml_root
|
1137
|
-
|
1188
|
+
|
1138
1189
|
except Exception as e:
|
1139
1190
|
logging.error(device + ' Exception while parsing stream header XML.' + self.host + ':' + str(self.port))
|
1140
1191
|
raise e
|
@@ -1686,6 +1737,7 @@ class QisInterface:
|
|
1686
1737
|
|
1687
1738
|
except Exception as e:
|
1688
1739
|
#something went wrong during send qis cmd
|
1740
|
+
logging.error("Error! Unable to retrieve response from QIS. Command: " + sentText)
|
1689
1741
|
logging.error(e)
|
1690
1742
|
raise e
|
1691
1743
|
finally:
|