From 7544d5ca0897c18e30320f1daae98f5bcdc931cb Mon Sep 17 00:00:00 2001 From: CPD Date: Tue, 4 Feb 2025 16:56:46 +0100 Subject: [PATCH] use threads --- cpdctrl/cpdctrl-interactive.py | 73 +++++----------------------------- 1 file changed, 9 insertions(+), 64 deletions(-) diff --git a/cpdctrl/cpdctrl-interactive.py b/cpdctrl/cpdctrl-interactive.py index 1f9a772..5b387da 100644 --- a/cpdctrl/cpdctrl-interactive.py +++ b/cpdctrl/cpdctrl-interactive.py @@ -19,8 +19,9 @@ from os import path, makedirs import pickle as pkl import json import atexit +import threading as mt import multiprocessing as mp -from multiprocessing.managers import BaseManager +# from multiprocessing.managers import BaseManager import argparse @@ -52,8 +53,6 @@ from .led_script import LedScript from .measurement import measure as _measure from .utility.data import DataCollector - - from .utility import data as _data from .utility.data import load_dataframe, plot_cpd_data from .utility import file_io @@ -74,14 +73,13 @@ settings = { test = False -BaseManager.register('LedControlDevice', LedControlDevice) # global variable for the instrument/client returned by pyvisa/bleak dev: VoltageMeasurementDevice|None = None led: LedControlDevice|None = None data = DataCollector(data_path=settings["datadir"], data_name="interactive", dirname="interactive_test", dir_exists_is_ok=True) t0 = 0 -def monitor(script: str|int=0, interval=None, flush_after=None, max_measurements=None, max_points_shown=400): +def monitor(script: str|int=0, interval=None, flush_after=None, max_measurements=None, max_points_shown=None): """ Monitor the voltage with matplotlib. @@ -99,77 +97,24 @@ def monitor(script: str|int=0, interval=None, flush_after=None, max_measurements if not interval: interval = settings["interval"] print(f"Starting measurement with:\n\tinterval = {interval}s\nUse to stop. Save the data using 'data.save_csv()' afterwards.") plt_monitor = _Monitor(use_print=True, max_points_shown=max_points_shown) - led_script = LedScript(script=script) + led_script = LedScript(script=script, auto_update=True, verbose=True) data.clear() queue = mp.Queue() pipe_send, pipe_recv = mp.Pipe() # TODO: pass instruments - proc_measure = mp.Process(target=_measure, args=(None, None, led_script, data, interval, flush_after, max_measurements, False, pipe_recv, queue)) + proc_measure = mt.Thread(target=_measure, args=(dev, led, led_script, data, interval, flush_after, max_measurements, False, pipe_recv, queue)) proc_measure.start() try: while True: - data = queue.get(block=True, timeout=30) - i, tval, vval, led_val = data + current_data = queue.get(block=True, timeout=30) + i, tval, vval, led_val = current_data plt_monitor.update(i, tval, vval, led_val) except KeyboardInterrupt: pass pipe_send.send("stop") proc_measure.join() - -def measure(interval=None, max_measurements=None): - """ - Measure voltages - - @details: - - Resets the buffers - - Measure voltages - - Waits for the user to press a key - Uses python's time.sleep() for waiting the interval, which is not very precise. Use measure_count for better precision. - You can take the data from the buffer afterwards, using save_csv. - @param max_measurements : maximum number of measurements. None means infinite - """ - global _runtime_vars - if not interval: interval = settings["interval"] - _runtime_vars["last_measurement"] = dtime.now().isoformat() - print(f"Starting measurement with:\n\tinterval = {interval}s\nUse to stop. Save the data using 'save_csv()' afterwards.") - update_func = _update_print - dev.measure(interval=interval, max_measurements=max_measurements, update_func=update_func) - - -def save_csv(): - """ - Saves the contents of nvbuffer1 as .csv - The settings 'datadir' and 'name' are used for determining the filepath: - 'datadir/nameXXX.csv', where XXX is the number of files that exist in datadir with the same name. - """ - df = get_dataframe() - filename = settings["datadir"] + "/" + df.basename + ".csv" - df.to_csv(filename, index=False, header=True) - print(f"Saved as '{filename}'") - - -def save_pickle(): - """ - Saves the contents of nvbuffer1 as .pkl - The settings 'datadir' and 'name' are used for determining the filepath: - 'datadir/nameXXX.pkl', where XXX is the number of files that exist in datadir with the same name. - """ - df = get_dataframe() - filename = settings["datadir"] + "/" + df.basename + ".pkl" - df.to_pickle(filename) - print(f"Saved as '{filename}'") - - -def run_script(script_path): - """ - Run a lua script on the Keithley device - @param script_path : relative or absolute path to the .lua script - """ - global k, settings - if test: - print("run_script: Test mode enabled, ignoring call to run_script") - else: - _backend.run_lua(dev, script_path=script_path) + print(data.metadata) + data.save_csv(verbose=True) def set(setting, value):