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

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -0,0 +1,3 @@
1
+ # Default ignored files
2
+ /shelf/
3
+ /workspace.xml
@@ -0,0 +1,12 @@
1
+ <component name="InspectionProjectProfileManager">
2
+ <profile version="1.0">
3
+ <option name="myName" value="Project Default" />
4
+ <inspection_tool class="PyUnresolvedReferencesInspection" enabled="true" level="WARNING" enabled_by_default="true">
5
+ <option name="ignoredIdentifiers">
6
+ <list>
7
+ <option value="user_interface.user_interface.raw_input" />
8
+ </list>
9
+ </option>
10
+ </inspection_tool>
11
+ </profile>
12
+ </component>
@@ -0,0 +1,6 @@
1
+ <component name="InspectionProjectProfileManager">
2
+ <settings>
3
+ <option name="USE_PROJECT_PROFILE" value="false" />
4
+ <version value="1.0" />
5
+ </settings>
6
+ </component>
@@ -0,0 +1,7 @@
1
+ <?xml version="1.0" encoding="UTF-8"?>
2
+ <project version="4">
3
+ <component name="Black">
4
+ <option name="sdkName" value="Python 2.7 (quarchpy)" />
5
+ </component>
6
+ <component name="ProjectRootManager" version="2" project-jdk-name="Python 3.13" project-jdk-type="Python SDK" />
7
+ </project>
@@ -0,0 +1,8 @@
1
+ <?xml version="1.0" encoding="UTF-8"?>
2
+ <project version="4">
3
+ <component name="ProjectModuleManager">
4
+ <modules>
5
+ <module fileurl="file://$PROJECT_DIR$/.idea/quarchpy.iml" filepath="$PROJECT_DIR$/.idea/quarchpy.iml" />
6
+ </modules>
7
+ </component>
8
+ </project>
@@ -0,0 +1,12 @@
1
+ <?xml version="1.0" encoding="UTF-8"?>
2
+ <module type="PYTHON_MODULE" version="4">
3
+ <component name="NewModuleRootManager">
4
+ <content url="file://$MODULE_DIR$" />
5
+ <orderEntry type="jdk" jdkName="Python 3.13" jdkType="Python SDK" />
6
+ <orderEntry type="sourceFolder" forTests="false" />
7
+ </component>
8
+ <component name="PyDocumentationSettings">
9
+ <option name="format" value="PLAIN" />
10
+ <option name="myDocStringFormat" value="Plain" />
11
+ </component>
12
+ </module>
@@ -0,0 +1,75 @@
1
+ <?xml version="1.0" encoding="UTF-8"?>
2
+ <project version="4">
3
+ <component name="AutoImportSettings">
4
+ <option name="autoReloadType" value="SELECTIVE" />
5
+ </component>
6
+ <component name="ChangeListManager">
7
+ <list default="true" id="5dcd7b04-9694-4e54-bb12-84d5f5e7a0cf" name="Changes" comment="" />
8
+ <option name="SHOW_DIALOG" value="false" />
9
+ <option name="HIGHLIGHT_CONFLICTS" value="true" />
10
+ <option name="HIGHLIGHT_NON_ACTIVE_CHANGELIST" value="false" />
11
+ <option name="LAST_RESOLUTION" value="IGNORE" />
12
+ </component>
13
+ <component name="ProjectColorInfo"><![CDATA[{
14
+ "customColor": "",
15
+ "associatedIndex": 5
16
+ }]]></component>
17
+ <component name="ProjectId" id="2sOq2y2hEq2l9HCfwXokB5wOoky" />
18
+ <component name="ProjectViewState">
19
+ <option name="hideEmptyMiddlePackages" value="true" />
20
+ <option name="showLibraryContents" value="true" />
21
+ </component>
22
+ <component name="PropertiesComponent"><![CDATA[{
23
+ "keyToString": {
24
+ "Python.keithleyTerminal.executor": "Debug",
25
+ "RunOnceActivity.ShowReadmeOnStart": "true"
26
+ }
27
+ }]]></component>
28
+ <component name="RunManager">
29
+ <configuration name="keithleyTerminal" type="PythonConfigurationType" factoryName="Python" temporary="true" nameIsGenerated="true">
30
+ <module name="quarchpy" />
31
+ <option name="ENV_FILES" value="" />
32
+ <option name="INTERPRETER_OPTIONS" value="" />
33
+ <option name="PARENT_ENVS" value="true" />
34
+ <envs>
35
+ <env name="PYTHONUNBUFFERED" value="1" />
36
+ </envs>
37
+ <option name="SDK_HOME" value="" />
38
+ <option name="WORKING_DIRECTORY" value="$USER_HOME$/Desktop/BoonCave/Quarch/Python Scripts/Terminal Programs" />
39
+ <option name="IS_MODULE_SDK" value="false" />
40
+ <option name="ADD_CONTENT_ROOTS" value="true" />
41
+ <option name="ADD_SOURCE_ROOTS" value="true" />
42
+ <option name="SCRIPT_NAME" value="$USER_HOME$/Desktop/BoonCave/Quarch/Python Scripts/Terminal Programs/keithleyTerminal.py" />
43
+ <option name="PARAMETERS" value="" />
44
+ <option name="SHOW_COMMAND_LINE" value="false" />
45
+ <option name="EMULATE_TERMINAL" value="false" />
46
+ <option name="MODULE_MODE" value="false" />
47
+ <option name="REDIRECT_INPUT" value="false" />
48
+ <option name="INPUT_FILE" value="" />
49
+ <method v="2" />
50
+ </configuration>
51
+ <recent_temporary>
52
+ <list>
53
+ <item itemvalue="Python.keithleyTerminal" />
54
+ </list>
55
+ </recent_temporary>
56
+ </component>
57
+ <component name="SharedIndexes">
58
+ <attachedChunks>
59
+ <set>
60
+ <option value="bundled-python-sdk-1b1018131e27-aa17d162503b-com.jetbrains.pycharm.community.sharedIndexes.bundled-PC-243.22562.180" />
61
+ </set>
62
+ </attachedChunks>
63
+ </component>
64
+ <component name="SpellCheckerSettings" RuntimeDictionaries="0" Folders="0" CustomDictionaries="0" DefaultDictionary="application-level" UseSingleDictionary="true" transferred="true" />
65
+ <component name="TaskManager">
66
+ <task active="true" id="Default" summary="Default task">
67
+ <changelist id="5dcd7b04-9694-4e54-bb12-84d5f5e7a0cf" name="Changes" comment="" />
68
+ <created>1738336765628</created>
69
+ <option name="number" value="Default" />
70
+ <option name="presentableId" value="Default" />
71
+ <updated>1738336765628</updated>
72
+ </task>
73
+ <servers />
74
+ </component>
75
+ </project>
quarchpy/_version.py CHANGED
@@ -1 +1 @@
1
- __version__ = "2.2.6"
1
+ __version__ = "2.2.7.dev1"
@@ -15,7 +15,7 @@ class quarchPPM(quarchDevice):
15
15
  numb_colons = self.ConString.count(":")
16
16
  if numb_colons == 1:
17
17
  self.ConString = self.ConString.replace(':', '::')
18
- if not skipDefaultSyntheticChannels and self.ConType[:3].upper() == "QIS":
18
+ if not skipDefaultSyntheticChannels and self.ConType[:3].upper() == "QIS" and "FAIL:" not in self.fixture_definition:
19
19
  self.create_default_synthetic_channels()
20
20
 
21
21
  def startStream(self, fileName='streamData.txt', fileMaxMB=200000, streamName ='Stream With No Name', streamDuration = None, streamAverage = None, releaseOnData = False, separator=",", inMemoryData = None):
@@ -3,6 +3,12 @@ import time
3
3
  import json
4
4
  from datetime import datetime
5
5
  import subprocess
6
+ import json
7
+ import csv
8
+ import logging
9
+ import time
10
+ import os
11
+ from bisect import bisect_left
6
12
 
7
13
  all_outputs={"terse_version_3":"0",
8
14
  "fio_version":"1",
@@ -313,4 +319,252 @@ def runFIO(myStream, mode, fioCallbacks, user_data, arguments="", file_name=""):
313
319
  os.remove("pipe")
314
320
 
315
321
  if isinstance(arguments, dict):
316
- break
322
+ break
323
+
324
+
325
+
326
+ ### FIO postprocessing for QIS ###
327
+
328
+
329
+ def merge_fio_qis_stream(qis_stream_file, fio_output_file, unix_stream_start_time, output_file=None, rounding_option="round"):
330
+ """
331
+ Merge FIO and QIS data into a single CSV file.
332
+
333
+ For each FIO entry:
334
+ - If timestamps match, append FIO data to the corresponding QIS row.
335
+ - If no match, handle based on `rounding_option`:
336
+ - "round": Find the nearest QIS time and add FIO data to that row.
337
+ - "insert": Add a new row with blank QIS data and only FIO data.
338
+
339
+ Parameters:
340
+ qis_stream_file (str): Path to the QIS CSV file (converted to Unix time).
341
+ fio_output_file (str): Path to the FIO output file (in JSON format).
342
+ unix_stream_start_time (str): Starting Unix timestamp for the QIS stream.
343
+ output_file (str, optional): Output file path for the merged CSV. If not provided, the file is saved
344
+ with "_merged" appended to the QIS file name.
345
+ rounding_option (str): Determines how to handle mismatched times ("round" or "insert").
346
+
347
+ Returns:
348
+ str: Path to the merged CSV file.
349
+ """
350
+ # Convert QIS timestamps to Unix time
351
+ qis_converted_file = convert_qis_stream_to_unix_time(qis_stream_file, unix_stream_start_time)
352
+
353
+ # Parse QIS data
354
+ qis_data = []
355
+ with open(qis_converted_file, 'r') as qis_file:
356
+ reader = csv.reader(qis_file)
357
+ qis_headers = next(reader) #read header row
358
+ if qis_headers[-1]=="": qis_headers=qis_headers[:-1]
359
+ for row in reader:
360
+ qis_data.append(row)
361
+
362
+ # Parse FIO data
363
+ fio_data = fio_json_to_csv (fio_output_file)
364
+
365
+ # Extend QIS headers with FIO headers
366
+ fio_headers = ["block_size", "job_name", "read_iops", "write_iops"]
367
+ merged_headers = qis_headers + fio_headers
368
+
369
+ # Extract QIS times into a separate list for binary search
370
+ qis_times = [int(row[0]) for row in qis_data] # Assuming the first column is the timestamp
371
+
372
+ # Prepare merged data
373
+ merged_data = qis_data.copy()
374
+ for row in merged_data:
375
+ row.extend([""] * len(fio_headers))
376
+
377
+ # Merge FIO and QIS data
378
+ for fio_entry in fio_data:
379
+ fio_time = fio_entry["timestamp_us"]
380
+
381
+ # Binary search to find the closest QIS time
382
+ idx = bisect_left(qis_times, fio_time)
383
+ exact_match = None
384
+ if idx < len(qis_times) and qis_times[idx] == fio_time:
385
+ # Exact match found
386
+ exact_match = idx
387
+ elif idx > 0 and (idx == len(qis_times) or abs(qis_times[idx - 1] - fio_time) < abs(qis_times[idx] - fio_time)):
388
+ exact_match = idx - 1
389
+
390
+ if exact_match is not None and qis_times[exact_match] == fio_time:
391
+ # Append FIO data to the matching QIS row
392
+ qis_data[exact_match].extend([fio_entry.get(header, "") for header in fio_headers])
393
+ else:
394
+ # Log the two QIS times between which the FIO timestamp falls
395
+ lower_bound = qis_times[idx - 1] if idx > 0 else None
396
+ upper_bound = qis_times[idx] if idx < len(qis_times) else None
397
+ logging.debug(f"FIO timestamp {fio_time} falls between QIS times {lower_bound} and {upper_bound} at array position {idx - 1} and {idx}")
398
+
399
+ if rounding_option == "round":
400
+ # Find the nearest QIS time to the FIO time
401
+ nearest_idx = idx - 1 if idx > 0 and (idx == len(qis_times) or abs(qis_times[idx - 1] - fio_time) < abs(
402
+ qis_times[idx] - fio_time)) else idx
403
+ merged_data[nearest_idx] = merged_data[nearest_idx][:-4]
404
+ merged_data[nearest_idx].extend([fio_entry.get(header, "") for header in fio_headers])
405
+ elif rounding_option == "insert":
406
+ # Add a new row with blank QIS data and only FIO data at the end
407
+ blank_qis_data = [""] * len(qis_headers)
408
+ blank_qis_data[0]=fio_time
409
+ new_row = blank_qis_data + [fio_entry.get(header, "") for header in fio_headers]
410
+ merged_data.insert(idx, new_row)
411
+
412
+ # Write the merged data to a new file
413
+ if output_file is None:
414
+ output_file = qis_stream_file.replace(".csv", f"_merged_{rounding_option}.csv")
415
+ with open(output_file, 'w', newline='') as output_file_out:
416
+ writer = csv.writer(output_file_out)
417
+ writer.writerow(merged_headers)
418
+ writer.writerows(merged_data)
419
+
420
+ logging.debug(f"Merged data written to {output_file}")
421
+ os.remove(qis_converted_file) # remove the intermidiary file
422
+ return output_file
423
+
424
+ def convert_qis_stream_to_unix_time(qis_stream_file, unix_stream_start_time):
425
+ """
426
+ Converts a QIS stream CSV file to Unix time by adding the unixStreamStartTime to the first column
427
+ in each row, taking into account the time units provided in both the CSV header and the start time.
428
+
429
+ Parameters:
430
+ qis_stream_file (str): The path to the QIS stream CSV file.
431
+ unix_stream_start_time (str): The starting Unix time with units (e.g., "1737374310S", "1737374310000mS").
432
+
433
+ Returns:
434
+ str: Path to the converted CSV file.
435
+ """
436
+ # Extract the numeric value and unit from unixStreamStartTime
437
+ import re
438
+ match = re.match(r"(\d+)([a-zA-Z]+)", unix_stream_start_time)
439
+ if not match:
440
+ logging.warning("Invalid unix_stream_start_time format. Use format like '1737374310S' or '1737374310000mS'.")
441
+ return
442
+
443
+ unix_start_value = int(match.group(1))
444
+ unix_start_unit = match.group(2).lower() # Normalize to lowercase
445
+
446
+ # Unit multipliers
447
+ unit_multipliers = {'s': 1, 'ms': 1e-3, 'us': 1e-6, 'ns': 1e-9}
448
+ if unix_start_unit not in unit_multipliers:
449
+ raise ValueError(f"Unsupported time unit: {unix_start_unit}")
450
+
451
+ unix_start_in_seconds = unix_start_value * unit_multipliers[unix_start_unit]
452
+
453
+ # Determine the output file name
454
+ output_file = qis_stream_file.replace('.csv', '_converted.csv')
455
+
456
+ try:
457
+ with open(qis_stream_file, 'r') as infile, open(output_file, 'w', newline='') as outfile:
458
+ reader = csv.reader(infile)
459
+ writer = csv.writer(outfile)
460
+
461
+ # Read the header to determine the time column unit
462
+ header = next(reader)
463
+ writer.writerow(header) # Write the header to the output file
464
+
465
+ # Identify the time unit in the header (e.g., "Time uS")
466
+ time_unit = None
467
+ for col in header:
468
+ if "time" in col.lower():
469
+ time_unit_match = re.search(r"time\s+([a-zA-Z]+)", col, re.IGNORECASE)
470
+ if time_unit_match:
471
+ time_unit = time_unit_match.group(1).lower()
472
+ break
473
+
474
+ if not time_unit or time_unit not in unit_multipliers:
475
+ logging.warning(f"Unsupported or missing time unit in the header: {time_unit}")
476
+ return
477
+
478
+ # Convert time units in the CSV to seconds
479
+ time_unit_multiplier = unit_multipliers[time_unit]
480
+
481
+ # Process each row and update the first column
482
+ for row in reader:
483
+ if row and row[0].isdigit(): # Ensure the first cell is numeric
484
+ elapsed_time_in_seconds = int(row[0]) * time_unit_multiplier
485
+ new_time_in_seconds = elapsed_time_in_seconds + unix_start_in_seconds
486
+ # Convert back to the original unit for consistency
487
+ row[0] = str(int(new_time_in_seconds / time_unit_multiplier))
488
+ writer.writerow(row)
489
+
490
+ logging.debug(f"File successfully converted and saved as: {output_file}")
491
+ return output_file
492
+
493
+ except FileNotFoundError:
494
+ logging.error(f"Error: File '{qis_stream_file}' not found.")
495
+ except Exception as e:
496
+ logging.error(f"An error occurred: {e}")
497
+ #1737376756
498
+ #convertQISStreamToUnixTime("Stream1.csv", "1737376756S")
499
+
500
+
501
+
502
+ def fio_json_to_csv(output_file):
503
+ retVal=[]
504
+ isThreaded = True
505
+ #checking to see if the first line of file needs to be skipped = Windows only
506
+ if os.name == "nt":
507
+ isThreaded = False
508
+ logfile = open(output_file,"r")
509
+ #variables for parsing json
510
+ iterator = 0
511
+ jobCount = 0
512
+ jsonLines = ""
513
+ openBracketCount = 0
514
+ closeBracketCount = 0
515
+ # Init the job end time to the current start time
516
+ jobEndTime = int(round(time.time() * 1000))
517
+ for line in logfile:
518
+ if (isThreaded == False):
519
+ # skip the very first line -- (title line) --
520
+ if iterator == 0:
521
+ iterator = iterator + 1
522
+ # marking threaded as true for remainder of read > Efficiency
523
+ isThreaded = True
524
+ continue
525
+ # add to iterator - not needed, may be useful later
526
+ iterator = iterator + 1
527
+ # concat strings
528
+ jsonLines += line
529
+ # finding brackets withing json
530
+ if '{' in line:
531
+ openBracketCount = openBracketCount + 1
532
+ if '}' in line:
533
+ closeBracketCount = closeBracketCount + 1
534
+ # an equal amount of brackets denotes the end of a json object
535
+ if openBracketCount == closeBracketCount and openBracketCount != 0:
536
+ try:
537
+ # format into a json parsable string
538
+ TempJsonObject = jsonLines[0: jsonLines.rindex('}') + 1]
539
+ # parse json
540
+ jsonobject = json.loads(TempJsonObject)
541
+ # checking for first job
542
+ if (jobCount == 0):
543
+ # getting start time of job
544
+ startTime = (jsonobject['timestamp_ms'] - jsonobject['jobs'][0]['read']['runtime'])
545
+ #comment = str(arguments).replace(",", "\n").replace("}", "").replace("{", "")
546
+ jobName = str(jsonobject['jobs'][0]['jobname'])
547
+ # adding start annotation
548
+ #fioCallbacks["TEST_START"](myStream, str(startTime), jobName, comment)
549
+ logging.debug(f"first job name: {jobName} start time {startTime} ")
550
+ # pass specific data
551
+ readDataValue = jsonobject['jobs'][0]['read']['iops']
552
+ writeDataValue = jsonobject['jobs'][0]['write']['iops']
553
+ blockSize = jsonobject['global options']['bs']
554
+ # converted to ditionary - easy script use
555
+ dataValues = {"read_iops": readDataValue, "write_iops": writeDataValue, "block_size": blockSize}
556
+ jobEndTime = str(jsonobject['timestamp_ms'])
557
+ dataValues['timestamp_us']=int(jobEndTime)*1000
558
+ dataValues['job_name'] = jobName
559
+ logging.debug(str(dataValues))
560
+
561
+ retVal.append(dataValues)
562
+ # jsonLines variable is now all characters after last job + any new that come in
563
+ jsonLines = jsonLines[jsonLines.rindex('}') + 1:]
564
+ # add 1 to the job count
565
+ jobCount += 1
566
+ except Exception as e:
567
+ # exception caused by not being able to find substring -- Last json object --
568
+ logging.warning("Exception Caught\n"+ str(e))
569
+ pass
570
+ return retVal
quarchpy/qps/qpsFuncs.py CHANGED
@@ -77,7 +77,7 @@ def startLocalQps(keepQisRunning=False, args=[], timeout=30, startQPSMinimised=T
77
77
  temp =" "
78
78
  args = temp.join(args)
79
79
  if startQPSMinimised == True: #TODO add to release for QPS 1.38
80
- if "-ccs=" not in args.lower():
80
+ if "-ccs" not in args.lower():
81
81
  args +=" -ccs=MIN"
82
82
 
83
83
  # Record current working directory
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.2
2
2
  Name: quarchpy
3
- Version: 2.2.6
3
+ Version: 2.2.7.dev1
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,10 +2,17 @@ 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=3S7z8QFWgGo1YD9gGIMJx_4QwfJIjtcD310ChOIwklQ,3019
5
- quarchpy/_version.py,sha256=CsrswO-ECCDHSY48Nv5lOOdRgL8EGAixBOHDf7PkRZA,21
5
+ quarchpy/_version.py,sha256=M2nQGMNhFk1gPwIk9Xqwnuwt4HhV7Udk51NF2idw7oI,26
6
6
  quarchpy/_version.py.bak,sha256=LNx1G4tDk0nZjrTLRLPujRY2NKVFwG7OTwukVjYIh0U,26
7
7
  quarchpy/connection.py,sha256=9lPIUP4LCWkFAedc8CWorDY-3ujdAA-cyeNkSBdIv9E,2226
8
8
  quarchpy/run.py,sha256=N9Z1qwagWzbLKhqoXB7w_9hpcVNmHa4OxuZG0CaBjmQ,10084
9
+ quarchpy/.idea/.gitignore,sha256=4uN-1gxQ2OQcQqqfNQVkKl8WieZ_trx_6KBtqwmg-pY,50
10
+ quarchpy/.idea/misc.xml,sha256=XrwvQPnbzYaSrn_bNlZEM-83f1dMApMrSBwPDmhMBXo,294
11
+ quarchpy/.idea/modules.xml,sha256=TTXzr8QnINr-lZDmXF3gQlG0oenMb17VnIIQzD30w_M,275
12
+ quarchpy/.idea/quarchpy.iml,sha256=06E7vq5PDtXJiNniCqMae19xq7MIdjaftfbidLLJTSU,486
13
+ quarchpy/.idea/workspace.xml,sha256=Tjsc1V9TkNpLm35S3VDrw3mhv3i-eiHJ5WDHA3RcY4I,3370
14
+ quarchpy/.idea/inspectionProfiles/Project_Default.xml,sha256=BSA0eRoacPIWYbbH-R7Qzlmvka_4beGL4WZRbW3WTG8,455
15
+ quarchpy/.idea/inspectionProfiles/profiles_settings.xml,sha256=YXLFmX7rPNGcnKK1uX1uKYPN0fpgskYNe7t0BV7cqkY,174
9
16
  quarchpy/config_files/__init__.py,sha256=bP9FM5hjP0r7s8qmWqcsVjAfHM0B4XY7cz5sTpe2HDA,290
10
17
  quarchpy/config_files/quarch_config_parser.py,sha256=mjP-uO58hVlHm25ZAFjX9Zwhn8z0np4vveLNHtx8Bt4,28891
11
18
  quarchpy/config_files/Cable_Modules/QTL1253-01 - Mini SAS Module Config v3.5 c1.3.qfg,sha256=hJnFfjsqiNZXYWHx2kn43Gnr2xqmJth4GGVd8VKU5_k,4923
@@ -476,7 +483,7 @@ quarchpy/connection_specific/QPS/win-amd64/qis/qis_lib/kotlin-stdlib-1.9.21.jar,
476
483
  quarchpy/connection_specific/QPS/win-amd64/qis/qis_lib/netty-all-4.1.43.Final.jar,sha256=teU2opErKkjWrDqO_vizT3vS33wMBrFzEaViaQW6hus,4087848
477
484
  quarchpy/connection_specific/QPS/win-amd64/qis/qis_lib/slf4j-api-2.0.9.jar,sha256=CBiTDcjX3rtAMgRhFpHaWOSdQsULb_z9zgLa23w8K2w,64579
478
485
  quarchpy/connection_specific/QPS/win-amd64/qis/qis_lib/slf4j-simple-2.0.9.jar,sha256=cfnG3m267C0QyqMD-vCMXnSb5TskKJbGTJa3xrttYtw,16073
479
- quarchpy/connection_specific/QPS/win-amd64/qis/qis_lib/usb4java-1.3.1.jar,sha256=QUW8Syfln16eQiYFO0UuSRForNTgMRdA8eLWWwd78aE,422166
486
+ quarchpy/connection_specific/QPS/win-amd64/qis/qis_lib/usb4java-1.3.1.jar,sha256=COhOoAhWogkBg8Fgn90HZ5z8eCkiHRsQbCWnnO_mXlU,1070575
480
487
  quarchpy/connection_specific/QPS/win-amd64/qis/resources/QuarchIcon_128x128.png,sha256=KvyOdn9Zq2qnyiG5i0T1Y9eywCEVcZLmApcRZGpITGw,6568
481
488
  quarchpy/connection_specific/QPS/win-amd64/qis/resources/QuarchIcon_16x16.png,sha256=wQkMTYg9Wo4J0TDaFgN8D6Dqk66IWGWigLiztvwsuS0,846
482
489
  quarchpy/connection_specific/QPS/win-amd64/qis/resources/QuarchIcon_256x256.png,sha256=-pNkCdwBX7lJc_s6cZ2dL9_Wm7fxcx3eKsGTmtkG73Y,7302
@@ -1432,7 +1439,7 @@ quarchpy/debug/__pycache__/versionCompare.cpython-313.pyc,sha256=0t7SWa2-Dt_uBOT
1432
1439
  quarchpy/device/__init__.py,sha256=quGTPdm5o0RsLBCwPLWA_LWMQjCgdkbh1MCcX89-rGU,559
1433
1440
  quarchpy/device/device.py,sha256=HEMhdfoDqyg3SUYKK2uuZeFB6VKjerld4J7f1SGk3CU,25461
1434
1441
  quarchpy/device/quarchArray.py,sha256=_8z6P1wCtIs2kkkAzNRc1YrT-NmGRvzd3btqa-Yl3Hc,2816
1435
- quarchpy/device/quarchPPM.py,sha256=DFhv8vA57dEJjO_Zp97flvIunaeCGGgmHZh8QC-IVD4,9234
1442
+ quarchpy/device/quarchPPM.py,sha256=YdHXJ0c8ZtqV3ltXvlNbn136VowNpyVaS5an0_1u0hw,9277
1436
1443
  quarchpy/device/quarchQPS.py,sha256=pfv2aJz1cfE6wyC5HutMOuEcQj_rLfd-pIAQO_gM34E,18490
1437
1444
  quarchpy/device/quarchQPS.py.bak,sha256=VOtuZHHzRPGQN7Bx2MHNwadxbEbeHAHBlssBGDDrRZo,18782
1438
1445
  quarchpy/device/scanDevices.py,sha256=JZRTUm_1-TaPiY35lK2NUw-4YTKQ6ZZw-vPPwNmwfMk,29907
@@ -1570,7 +1577,7 @@ quarchpy/docs/source/quarchpy.rst,sha256=JjPJPFbMeuDI78l0Wbr10jtmOotav_6mVU14Qk2
1570
1577
  quarchpy/docs/source/quarchpy.user_interface.rst,sha256=M-1w2ZpFw4ETUVSv7qiVA6POWctdg-bXbrDh-Cfattg,447
1571
1578
  quarchpy/docs/source/quarchpy.utilities.rst,sha256=RDAzV7z424k8vtTRmJSmncaMh_2y0ieXZM4dikk80NE,399
1572
1579
  quarchpy/docs/source/readme.rst,sha256=zLMDuWm1w4zLuemejpdMkAv7ME7opzIYOdNKjegYdgM,26
1573
- quarchpy/fio/FIO_interface.py,sha256=qtOzIDJ0pKRZrripYs6u_H3GI-VXxtG1mHog2bs94gc,10879
1580
+ quarchpy/fio/FIO_interface.py,sha256=PCLuoVoOl98Beqh8g9vQLI9iYeXGZxa2D1CaGUpWrk8,22399
1574
1581
  quarchpy/fio/FIO_interface.py.bak,sha256=mY3HzGfnA_m82Tru8U2_NadS3ymcgjWaxLb6MRl04pg,10899
1575
1582
  quarchpy/fio/__init__.py,sha256=keB7UPgsLZ8PNdnM5UKdAVPW3PBMTz6vT0AfQaigGZ0,61
1576
1583
  quarchpy/fio/fioDiskFinder.py,sha256=BfQMvIVDJzhuvmu8hmjO0xOecZ1KkCAiL98FQTcQXqQ,2965
@@ -1602,7 +1609,7 @@ quarchpy/qis/__pycache__/__init__.cpython-313.pyc,sha256=JSm9fD2m7iIaXgD9L_tHpzU
1602
1609
  quarchpy/qis/__pycache__/qisFuncs.cpython-311.pyc,sha256=cx3Lkcd69akWea7kCVc7mtGslvk_Vdlz63heaD2YG4Q,16456
1603
1610
  quarchpy/qis/__pycache__/qisFuncs.cpython-313.pyc,sha256=W5lQ3o_2HbIpuPPhtIQhB0iniliRdOjXz6vGr2JarGE,14675
1604
1611
  quarchpy/qps/__init__.py,sha256=Kq5Ae1hy6c0nw26OwY1X31e72-wZ4C8RraTku6pvEfw,270
1605
- quarchpy/qps/qpsFuncs.py,sha256=1pJPbgZVv7v4Oymf5MM4-CXcSyTV3IkrPm0OIJ9OA28,13383
1612
+ quarchpy/qps/qpsFuncs.py,sha256=XKABtZJ9frOfeNHFmA76WOhIjuvoZ_nFMjwOamYDX-Q,13382
1606
1613
  quarchpy/qps/__pycache__/__init__.cpython-311.pyc,sha256=tPzR1aFh1sqvYb7pQt-CYvC8Gxc9-UAlRgJCPAZzC0E,498
1607
1614
  quarchpy/qps/__pycache__/__init__.cpython-313.pyc,sha256=ooo2SYsrnG1yUnW6Exonz5JngklBk-uBIRzpZPxW2Sk,439
1608
1615
  quarchpy/qps/__pycache__/qpsFuncs.cpython-311.pyc,sha256=pAOLXqJFv-yN-sKcQeWq36gXlO0fkMWdOcIMQGEEufU,16416
@@ -1626,7 +1633,7 @@ quarchpy/utilities/__pycache__/Version.cpython-311.pyc,sha256=BGX4D9dOYQcp-Qb0ap
1626
1633
  quarchpy/utilities/__pycache__/Version.cpython-313.pyc,sha256=mWeB9FHXwrgBVDCm-FdYXH-fNG0Du6vuAuHkwuF1Q5A,2362
1627
1634
  quarchpy/utilities/__pycache__/__init__.cpython-311.pyc,sha256=DCBrDu0JR0U55lrn61Nho4Jqz7aMmJFrIsgloDlXWss,182
1628
1635
  quarchpy/utilities/__pycache__/__init__.cpython-313.pyc,sha256=pRDgI4M74_DNAFg_cNrQA6uNwnIP-HHXmHlhNV39rjk,161
1629
- quarchpy-2.2.6.dist-info/METADATA,sha256=KB1rh70hrlHsyFScb7S_AEFX-BHFW8TZUPQjWf8imUM,10683
1630
- quarchpy-2.2.6.dist-info/WHEEL,sha256=9Hm2OB-j1QcCUq9Jguht7ayGIIZBRTdOXD1qg9cCgPM,109
1631
- quarchpy-2.2.6.dist-info/top_level.txt,sha256=Vc7qsvkVax7oeBaBy_e7kvJvqb_VAAJcW_MuDMmi5W8,9
1632
- quarchpy-2.2.6.dist-info/RECORD,,
1636
+ quarchpy-2.2.7.dev1.dist-info/METADATA,sha256=LFIvbGnY_5HdwOqoAETTvwmUSbOd5K1rbJ71Jj9dgms,10688
1637
+ quarchpy-2.2.7.dev1.dist-info/WHEEL,sha256=9Hm2OB-j1QcCUq9Jguht7ayGIIZBRTdOXD1qg9cCgPM,109
1638
+ quarchpy-2.2.7.dev1.dist-info/top_level.txt,sha256=Vc7qsvkVax7oeBaBy_e7kvJvqb_VAAJcW_MuDMmi5W8,9
1639
+ quarchpy-2.2.7.dev1.dist-info/RECORD,,