diff --git a/gui/src/aaregui/main.py b/gui/src/aaregui/main.py index e6dc2c9b..3de9cdd3 100644 --- a/gui/src/aaregui/main.py +++ b/gui/src/aaregui/main.py @@ -1,18 +1,72 @@ import sys +from PySide6.QtCore import QCommandLineParser, QCommandLineOption from PySide6.QtWidgets import QApplication, QDialog from aaregui.main_window import MainWindow from aaregui.widgets.login import LoginDialog +from aaredaqlib.beamline import MXBeamline, mx_beamline if __name__ == "__main__": app = QApplication(sys.argv) - base_url = "http://0.0.0.0:5210" + app.setApplicationName("AareGUI") + app.setApplicationVersion("0.1.0") + app.setOrganizationName("PSI") + app.setOrganizationDomain("psi.ch") + + # Create the parser + parser = QCommandLineParser() + parser.setApplicationDescription("PSI AareGUI") + parser.addHelpOption() # Adds --help option + parser.addVersionOption() # Adds --version option + + match mx_beamline(): + case MXBeamline.X06DA: + default_url = "http://x06da-queue-01.psi.ch:5210" + zmq_addr = "tcp://129.129.110.12:9089" + case MXBeamline.X10SA: + default_url = "http://x10aa-queue-01.psi.ch:5210" + zmq_addr = None + case MXBeamline.X06SA: + default_url = "http://x06sa-queue-01.psi.ch:5210" + zmq_addr = None + case _: + default_url = "http://localhost:5210" + zmq_addr = None + + # Add custom options as needed + urlOption = QCommandLineOption(["u", "aaredaq-url"], + "Base AareDAQ URL", + "url", default_url) + parser.addOption(urlOption) + + defaultImage = QCommandLineOption(["i", "image"], + "Default image to display in absence of the ZMQ stream", + "image") + parser.addOption(defaultImage) + + cameraZeroMQ = QCommandLineOption(["s", "sample-camera-zmq"], + "Sample camera ZeroMQ URL", + "sample-camera-zmq") + parser.addOption(cameraZeroMQ) + + parser.process(app) + + base_url = parser.value(urlOption) + + if parser.isSet(defaultImage): + default_image = parser.value(defaultImage) + else: + default_image = None + dialog = LoginDialog(base_url=base_url) if dialog.exec() == QDialog.DialogCode.Accepted and dialog.token: - win = MainWindow(base_url=base_url, token=dialog.token) + win = MainWindow(base_url=base_url, + token=dialog.token, + default_image=default_image, + zmq_addr=zmq_addr) win.show() sys.exit(app.exec()) else: diff --git a/gui/src/aaregui/main_window.py b/gui/src/aaregui/main_window.py index e5822574..09d3c521 100644 --- a/gui/src/aaregui/main_window.py +++ b/gui/src/aaregui/main_window.py @@ -29,7 +29,9 @@ from aaregui.widgets.status_bar import StatusBar class MainWindow(QMainWindow): sample_geometry = Signal(SampleGeometryModel) - def __init__(self, base_url: str, token: str): + def __init__(self, base_url: str, token: str, + default_image: str | None, + zmq_addr: str | None): super().__init__() self.__base_url = base_url self.__token = token @@ -58,7 +60,7 @@ class MainWindow(QMainWindow): top_widget_layout.addWidget(self.data_collection) self.camera_image = SampleCameraImageLabel( - geom=geom, rasters=rasters, parent=top_widget + geom=geom, rasters=rasters, parent=top_widget, default_image=default_image ) top_widget_layout.addWidget(self.camera_image) @@ -94,7 +96,7 @@ class MainWindow(QMainWindow): self.setCentralWidget(splitter) - self.setWindowTitle("Aare macromolecular crystallography GUI") + self.setWindowTitle("AareGUI") self.create_menu_bar() self.status_bar = StatusBar(self.__decoded_token, parent=self) @@ -129,9 +131,13 @@ class MainWindow(QMainWindow): self.beamline.beam_center.beam_center_clear.connect(self.daq.beam_center_clear) self.camera_image.update_beam_center.connect(self.daq.beam_center_mark) - self.camera_thread = SampleCameraThread(zmq_url="tcp://129.129.110.12:9089") - self.camera_thread.camera_image.connect(self.camera_image.update_pixmap) - self.camera_thread.start() + if zmq_addr is not None: + self.camera_thread = SampleCameraThread(zmq_url=zmq_addr) + self.camera_thread.camera_image.connect(self.camera_image.update_pixmap) + self.camera_thread.start() + else: + self.camera_thread = None + QApplication.instance().aboutToQuit.connect(self.cleanup) # @@ -198,4 +204,5 @@ class MainWindow(QMainWindow): self.status_bar.showMessage(f' {msg} ', 10000) def cleanup(self): - self.camera_thread.stop() + if self.camera_thread is not None: + self.camera_thread.stop() diff --git a/gui/src/aaregui/widgets/camera_image.py b/gui/src/aaregui/widgets/camera_image.py index 8f2f7c85..14c88e11 100644 --- a/gui/src/aaregui/widgets/camera_image.py +++ b/gui/src/aaregui/widgets/camera_image.py @@ -38,10 +38,11 @@ class SampleCameraImageLabel(QGraphicsView): update_beam_center = Signal(float, float) def __init__( - self, - geom: SampleGeometryModel, - rasters: List[RasterGridRequest], - parent=None, + self, + geom: SampleGeometryModel, + rasters: List[RasterGridRequest], + default_image: str | None, + parent=None, ): super().__init__(parent) @@ -50,7 +51,6 @@ class SampleCameraImageLabel(QGraphicsView): else: self.__raster = rasters - self.__pixmap = QPixmap("/home/leonarski_f/loop200.jpg") self.__geom = geom self.__bookmarks: SmargonBookmarkList = SmargonBookmarkList() self.__autoscale = True @@ -73,9 +73,10 @@ class SampleCameraImageLabel(QGraphicsView): self.setMouseTracking(True) - pixmap = QPixmap("/home/leonarski_f/loop200.jpg") - self.pixmap_item = QGraphicsPixmapItem(pixmap) - self.scene.addItem(self.pixmap_item) + if default_image is not None: + pixmap = QPixmap("/home/leonarski_f/loop200.jpg") + self.pixmap_item = QGraphicsPixmapItem(pixmap) + self.scene.addItem(self.pixmap_item) self.setFrameShape(QFrame.Shape.NoFrame) self.setRenderHints(QPainter.RenderHint.Antialiasing)