init commit
This commit is contained in:
parent
d38f48a5a5
commit
f09b7c481b
42
Controll.py
Normal file
42
Controll.py
Normal file
@ -0,0 +1,42 @@
|
||||
from pysmu import Session, MODE
|
||||
from Adalm1000_Logger.DeviceController import DeviceController
|
||||
from Adalm1000_Logger.GUI import MainWindow, startGUI
|
||||
import os
|
||||
|
||||
|
||||
# --- Setup ---
|
||||
sess = Session()
|
||||
sess.add_all()
|
||||
controllers = {dev.m_serial: DeviceController(dev) for dev in sess.m_devices}
|
||||
serials = list(controllers.keys())
|
||||
|
||||
for i in enumerate(serials):
|
||||
c = controllers[serials[i]]
|
||||
c.set_mode(0, MODE.HI_Z) # CH A Hi-Z
|
||||
c.set_mode(1, MODE.HI_Z) # CH B Hi-Z
|
||||
MainWindow.add_list_item(MainWindow, serials[i], i, c.start, c.stop)
|
||||
|
||||
startGUI()
|
||||
|
||||
# # Beispiel: Gerät 1 starten, Gerät 2 später starten/stoppen
|
||||
|
||||
# c1 = controllers[serials[0]]
|
||||
# c1.set_mode(0, MODE.HI_Z) # CH A Hi-Z
|
||||
# c1.set_mode(1, MODE.HI_Z) # CH B Hi-Z
|
||||
# c1.start()
|
||||
|
||||
# time.sleep(2.0)
|
||||
|
||||
# if len(serials) > 1:
|
||||
# c2 = controllers[serials[1]]
|
||||
# c2.set_mode(0, MODE.HI_Z)
|
||||
# c2.set_mode(1, MODE.HI_Z)
|
||||
# c2.start()
|
||||
# time.sleep(3.0)
|
||||
# c2.stop() # nur Gerät 2 stoppen
|
||||
|
||||
# # sauber beenden (Strg+C-Handling etc. weglassen der Kürze halber)
|
||||
# for c in controllers.values():
|
||||
# c.stop()
|
||||
# for c in controllers.values():
|
||||
# c.shutdown()
|
||||
89
DeviceController.py
Normal file
89
DeviceController.py
Normal file
@ -0,0 +1,89 @@
|
||||
import threading, queue, time, csv, os
|
||||
|
||||
CHUNK = 2000
|
||||
OUTDIR = "logs"
|
||||
os.makedirs(OUTDIR, exist_ok=True)
|
||||
|
||||
class DeviceController:
|
||||
def __init__(self, dev):
|
||||
self.dev = dev
|
||||
self.cmdq = queue.Queue()
|
||||
self.stop_evt = threading.Event()
|
||||
self.running = False
|
||||
self.writer_q = queue.Queue(maxsize=50)
|
||||
self.reader_t = threading.Thread(target=self.reader_loop, daemon=True)
|
||||
self.writer_t = threading.Thread(target=self.writer_loop, daemon=True)
|
||||
|
||||
def start(self):
|
||||
if not self.reader_t.is_alive(): self.reader_t.start()
|
||||
if not self.writer_t.is_alive(): self.writer_t.start()
|
||||
self.cmdq.put(("start", None))
|
||||
|
||||
def stop(self):
|
||||
self.cmdq.put(("stop", None))
|
||||
|
||||
def set_mode(self, ch, mode):
|
||||
self.cmdq.put(("mode", (ch, mode)))
|
||||
|
||||
def shutdown(self):
|
||||
self.stop()
|
||||
self.stop_evt.set()
|
||||
self.reader_t.join()
|
||||
self.writer_t.join()
|
||||
|
||||
def reader_loop(self):
|
||||
while not self.stop_evt.is_set():
|
||||
# Befehle abarbeiten (non-blocking)
|
||||
try:
|
||||
cmd, arg = self.cmdq.get_nowait()
|
||||
if cmd == "start" and not self.running:
|
||||
# kontinuierlich laufen lassen (0 == unendlich)
|
||||
self.dev.run(0) # ← per-Gerät-Start
|
||||
self.running = True
|
||||
elif cmd == "stop" and self.running:
|
||||
self.dev.cancel() # ← per-Gerät-Stop (sofort)
|
||||
# optional sauber aus: self.dev.off()
|
||||
self.dev.flush(-1, True) # Read-Queue leeren
|
||||
self.running = False
|
||||
elif cmd == "mode":
|
||||
ch, mode = arg # ch: 0 (A) / 1 (B)
|
||||
self.dev.set_mode(ch, mode)
|
||||
except queue.Empty:
|
||||
pass
|
||||
|
||||
if self.running:
|
||||
# blockierend n Samples holen
|
||||
try:
|
||||
data = self.dev.read([], CHUNK, -1, False) # pysmu mappt auf [ [VA,IA,VB,IB], ... ]
|
||||
# In einfachem CSV-Beispiel loggen wir nur Spannungen A/B:
|
||||
# data ist Liste von 4-Float-Arrays
|
||||
vsA = [row[0] for row in data]
|
||||
vsB = [row[2] for row in data]
|
||||
self.writer_q.put((time.time(), vsA, vsB))
|
||||
except Exception:
|
||||
# bei Überlauf o.ä. kurz atmen und weiter
|
||||
time.sleep(0.001)
|
||||
else:
|
||||
time.sleep(0.01)
|
||||
|
||||
def writer_loop(self):
|
||||
ts0 = None
|
||||
fn = os.path.join(OUTDIR, f"{time.strftime('%Y%m%d_%H%M%S')}_{self.dev.m_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.m_serial}] Datei geschlossen.")
|
||||
52
GUI.py
Normal file
52
GUI.py
Normal file
@ -0,0 +1,52 @@
|
||||
import sys
|
||||
from PyQt5.QtWidgets import QApplication, QWidget, QListWidget, QListWidgetItem, QPushButton, QLabel, QHBoxLayout, QVBoxLayout
|
||||
|
||||
class ListItemWidget(QWidget):
|
||||
def __init__(self, text, index, btn1f, btn2f):
|
||||
super().__init__()
|
||||
self.text = text
|
||||
self.index = index # damit wir wissen, zu welchem Eintrag der Button gehört
|
||||
|
||||
layout = QHBoxLayout(self)
|
||||
|
||||
# Label für den Text
|
||||
label = QLabel(text)
|
||||
layout.addWidget(label)
|
||||
|
||||
# Zwei Buttons rechts
|
||||
btn1 = QPushButton("Start")
|
||||
btn2 = QPushButton("Stop")
|
||||
|
||||
# Funktionen verbinden
|
||||
btn1.clicked.connect(btn1f)
|
||||
btn2.clicked.connect(btn2f)
|
||||
|
||||
layout.addWidget(btn1)
|
||||
layout.addWidget(btn2)
|
||||
layout.setContentsMargins(5, 2, 5, 2)
|
||||
layout.addStretch()
|
||||
|
||||
class MainWindow(QWidget):
|
||||
def __init__(self):
|
||||
super().__init__()
|
||||
self.setWindowTitle("Liste mit 2 Köpfen")
|
||||
self.resize(300, 200)
|
||||
|
||||
main_layout = QVBoxLayout(self)
|
||||
|
||||
# QListWidget
|
||||
self.list_widget = QListWidget()
|
||||
main_layout.addWidget(self.list_widget)
|
||||
|
||||
def add_list_item(self, text, index ,btn1f, btn2f):
|
||||
item = QListWidgetItem(self.list_widget)
|
||||
widget = ListItemWidget(text)
|
||||
item.setSizeHint(widget.sizeHint())
|
||||
self.list_widget.addItem(item)
|
||||
self.list_widget.setItemWidget(item, widget)
|
||||
|
||||
def startGUI():
|
||||
app = QApplication(sys.argv)
|
||||
window = MainWindow()
|
||||
window.show()
|
||||
sys.exit(app.exec_())
|
||||
2400
adalm1000_logger.py
Normal file
2400
adalm1000_logger.py
Normal file
File diff suppressed because it is too large
Load Diff
Loading…
x
Reference in New Issue
Block a user