This commit is contained in:
Vincent Hanewinkel 2025-08-14 21:26:13 +02:00
parent 84763ec07a
commit 8ebabc9546

View File

@ -5,7 +5,8 @@ OUTDIR = "logs"
os.makedirs(OUTDIR, exist_ok=True) os.makedirs(OUTDIR, exist_ok=True)
class DeviceController: class DeviceController:
def __init__(self, dev): def __init__(self, sess, dev):
self.sess = sess # <— Session referenzieren
self.dev = dev self.dev = dev
self.cmdq = queue.Queue() self.cmdq = queue.Queue()
self.stop_evt = threading.Event() self.stop_evt = threading.Event()
@ -23,45 +24,36 @@ class DeviceController:
self.cmdq.put(("stop", None)) self.cmdq.put(("stop", None))
def set_mode(self, ch, mode): def set_mode(self, ch, mode):
self.cmdq.put(("mode", (ch, mode))) # BUGFIX: nicht rekursiv sich selbst aufrufen!
self.dev.channels[ch].mode = mode
def shutdown(self):
self.stop()
self.stop_evt.set()
self.reader_t.join()
self.writer_t.join()
def reader_loop(self): def reader_loop(self):
while not self.stop_evt.is_set(): while not self.stop_evt.is_set():
# Befehle abarbeiten (non-blocking)
try: try:
cmd, arg = self.cmdq.get_nowait() cmd, arg = self.cmdq.get_nowait()
if cmd == "start" and not self.running: if cmd == "start" and not self.running:
# kontinuierlich laufen lassen (0 == unendlich) # Continuous Session-Stream starten (für alle Devices)
self.dev.run(0) # ← per-Gerät-Start self.sess.start(0) # <— statt dev.run(0)
self.running = True self.running = True
elif cmd == "stop" and self.running: elif cmd == "stop" and self.running:
self.dev.cancel() # ← per-Gerät-Stop (sofort) self.sess.end() # <— Session sauber beenden
# optional sauber aus: self.dev.off() # optional: Puffer leeren
self.dev.flush(-1, True) # Read-Queue leeren # self.sess.flush(-1, True) # falls verfügbar in deiner Version
self.running = False self.running = False
elif cmd == "mode": elif cmd == "mode":
ch, mode = arg # ch: 0 (A) / 1 (B) ch, mode = arg
self.set_mode(ch, mode) self.dev.channels[ch].mode = mode
except queue.Empty: except queue.Empty:
pass pass
if self.running: if self.running:
# blockierend n Samples holen
try: try:
data = self.dev.read([], CHUNK, -1, False) # pysmu mappt auf [ [VA,IA,VB,IB], ... ] # Lies jeweils CHUNK Samples (blockierend bis voll)
# In einfachem CSV-Beispiel loggen wir nur Spannungen A/B: data = self.dev.read(CHUNK, -1) # -> [[VA, IA, VB, IB], ...]
# data ist Liste von 4-Float-Arrays
vsA = [row[0] for row in data] vsA = [row[0] for row in data]
vsB = [row[2] for row in data] vsB = [row[2] for row in data]
self.writer_q.put((time.time(), vsA, vsB)) self.writer_q.put((time.time(), vsA, vsB))
except Exception: except Exception:
# bei Überlauf o.ä. kurz atmen und weiter
time.sleep(0.001) time.sleep(0.001)
else: else:
time.sleep(0.01) time.sleep(0.01)