use threads
This commit is contained in:
parent
c0bc217d21
commit
7544d5ca08
@ -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 <C-c> 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 <C-c> 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):
|
||||
|
Loading…
x
Reference in New Issue
Block a user