From 7d9be883a52bd03fb6bac8e131bff9d3ec492d23 Mon Sep 17 00:00:00 2001 From: Vincent Hanewinkel Date: Thu, 14 Aug 2025 22:15:32 +0200 Subject: [PATCH] fix --- DeviceController.py | 61 ++++++++++++++++++++++++++++++++------------- 1 file changed, 43 insertions(+), 18 deletions(-) diff --git a/DeviceController.py b/DeviceController.py index 7429a29..99262b2 100644 --- a/DeviceController.py +++ b/DeviceController.py @@ -1,7 +1,10 @@ import threading, queue, time, csv, os CHUNK = 2000 +SAMPLE_RATE = 100_000.0 # 100 kS/s +DT = 1.0 / SAMPLE_RATE OUTDIR = "logs" +FLUSH_EVERY = 50 os.makedirs(OUTDIR, exist_ok=True) class DeviceController: @@ -59,23 +62,45 @@ class DeviceController: time.sleep(0.01) def writer_loop(self): + os.makedirs(OUTDIR, exist_ok=True) ts0 = None fn = os.path.join(OUTDIR, f"{time.strftime('%Y%m%d_%H%M%S')}_{self.dev.serial}.csv") - with open(fn, "w", newline="") as f: - w = csv.writer(f) - w.writerow(["t_rel_s", "ch", "value"]) - sample_idx = 0 - while not (self.stop_evt.is_set() and self.writer_q.empty()): - try: - ts, va, vb = self.writer_q.get(timeout=0.2) - except Exception: - continue - if ts0 is None: ts0 = ts - for i, v in enumerate(va): - t_rel = (sample_idx + i) * 1e-5 # 100 kS/s → 10 µs - w.writerow([t_rel, "A", v]) - for i, v in enumerate(vb): - t_rel = (sample_idx + i) * 1e-5 - w.writerow([t_rel, "B", v]) - sample_idx += len(va) - print(f"[{self.dev.serial}] Datei geschlossen.") \ No newline at end of file + chunks_written = 0 + sample_idx = 0 + + try: + with open(fn, "w", newline="") as f: + w = csv.writer(f) + # Long-Format: eine Zeile pro Kanalwert + w.writerow(["t_rel_s", "ch", "value"]) + + while not (self.stop_evt.is_set() and self.writer_q.empty()): + try: + ts, va, vb = self.writer_q.get(timeout=0.2) + except Exception: + continue + + if ts0 is None: + ts0 = ts + + # Sicherstellen, dass A und B gleich lang sind + if len(va) != len(vb): + n = min(len(va), len(vb)) + va, vb = va[:n], vb[:n] + + # Zeitindex aus Sample-Index ableiten (konstante Rate) + for i, (a, b) in enumerate(zip(va, vb)): + t_rel = (sample_idx + i) * DT + w.writerow([t_rel, "A", a]) + w.writerow([t_rel, "B", b]) + + sample_idx += len(va) + chunks_written += 1 + + if chunks_written % FLUSH_EVERY == 0: + f.flush() # optional: os.fsync(f.fileno()) + + except Exception as e: + print(f"[{self.dev.serial}] Writer-Fehler: {e}") + finally: + print(f"[{self.dev.serial}] Datei geschlossen: {fn}") \ No newline at end of file