import sys import pysmu from PyQt5.QtWidgets import QApplication from PyQt5.QtCore import pyqtSignal, QObject from GUI import MainWindow from DeviceController import DeviceController class ControllerSignals(QObject): started = pyqtSignal(str) # serial stopped = pyqtSignal(str) error = pyqtSignal(str, str) # serial, msg signals = ControllerSignals() def make_on_start(ctrl, widget): def _start(_widget=widget, _ctrl=ctrl): # NICHT blockieren: nur anstoßen try: _ctrl.start() # -> startet seine eigenen Threads _widget.set_running(True) except Exception as e: signals.error.emit(_ctrl.dev.serial, str(e)) return _start def make_on_stop(ctrl, widget): def _stop(_widget=widget, _ctrl=ctrl): try: _ctrl.stop() _widget.set_running(False) except Exception as e: signals.error.emit(_ctrl.dev.serial, str(e)) return _stop def main(): # 1) Geräte einsammeln (pysmu nur hier benutzen) sess = pysmu.Session() sess.add_all() controllers = {dev.serial: DeviceController(sess, dev) for dev in sess.devices} serials = list(controllers.keys()) print("Gefundene Geräte:", serials) # Optional: Modi setzen for serial in serials: c = controllers[serial] c.set_mode("A", pysmu.Mode.SIMV) # CH A z. B. c.set_mode("B", pysmu.Mode.HI_Z) # CH B z. B. # 2) GUI erstellen app = QApplication(sys.argv) win = MainWindow() # Kleine Helfer, damit die ListItem-Buttons nur Controller.start/stop aufrufen def make_on_start(ctrl): return lambda _idx: ctrl.start() def make_on_stop(ctrl): return lambda _idx: ctrl.stop() # 3) Liste befüllen (auf der INSTANZ, nicht auf der Klasse!) for i, serial in enumerate(serials): ctrl = controllers[serial] widget = win.add_list_item( text=serial, index=i, on_start=lambda w, c=ctrl: make_on_start(c, w)(), on_stop =lambda w, c=ctrl: make_on_stop(c, w)() ) # 4) Start win.show() sys.exit(app.exec_()) if __name__ == "__main__": main() # # 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()