diff --git a/common/src/aaredaqlib/models.py b/common/src/aaredaqlib/models.py index 1eb4e2d6..44173d1b 100644 --- a/common/src/aaredaqlib/models.py +++ b/common/src/aaredaqlib/models.py @@ -714,6 +714,7 @@ class DAQStatusModel(BaseModel): sample: SampleShortInfo | None = None session: SessionStatus box: BoundingBoxModel | None = None + jfjoch_status: BrokerStatus | None = None last_best_res: float | None = None last_best_b_factor: float | None = None crystal_size: CrystalSize = CrystalSize(x=0,y=0,z=0) diff --git a/daq/src/aaredaq/daq.py b/daq/src/aaredaq/daq.py index bb1b5ace..9ba4eaef 100644 --- a/daq/src/aaredaq/daq.py +++ b/daq/src/aaredaq/daq.py @@ -1298,6 +1298,7 @@ class AareDAQ: spreadsheet_params, file_prefix = self.spreadsheet_params() logger.debug(f"spreadsheet_params: {spreadsheet_params}") smart_params = self.__cfg.auto_params + logger.debug(f"smart_params: {smart_params}") default_params = SimpleScanParameters(exp_time_s=0.04, dtz=110, incr_omega_deg=0.2) #if file_prefix is not None: # default_params.file_prefix = file_prefix @@ -1540,7 +1541,7 @@ class AareDAQ: @property def status(self) -> DAQStatusModel: - # session should be set by FastAPI server + # session is initialised here and set by FastAPI server return DAQStatusModel( state=self.state, busy=self.busy, @@ -1550,6 +1551,7 @@ class AareDAQ: session=SessionStatus(), diffraction=self.diffraction_geometry, box=self.__saved_box, + jfjoch_status = self.__jfjoch.status(), last_best_res = self.__cfg.last_best_res, last_best_b_factor = self.__cfg.last_best_b_factor, crystal_size = self.__cfg.crystal_size diff --git a/daq/src/mxlibs3/jfjoch.py b/daq/src/mxlibs3/jfjoch.py index 6d106d19..01989fcf 100644 --- a/daq/src/mxlibs3/jfjoch.py +++ b/daq/src/mxlibs3/jfjoch.py @@ -146,6 +146,10 @@ class JFJochWrapper: self.__api.wait_till_done_post_with_http_info(timeout=math.ceil(timeout)) return self.__api.result_scan_get() + def status(self) -> jfjoch_client.models.BrokerStatus: + l = self.__api.status_get() + return l + def detector(self) -> jfjoch_client.models.DetectorListElement: l = self.__api.config_select_detector_get() diff --git a/gui/src/aaregui/panels/data_collection_settings.py b/gui/src/aaregui/panels/data_collection_settings.py index b89d695c..19057f45 100644 --- a/gui/src/aaregui/panels/data_collection_settings.py +++ b/gui/src/aaregui/panels/data_collection_settings.py @@ -6,6 +6,7 @@ from PySide6.QtWidgets import ( QGridLayout, QPushButton, QWidget, + QProgressBar, QMessageBox, ) from aaredaqlib.diffraction_geometry import DiffractionGeometry @@ -21,6 +22,9 @@ from aaregui.panels.smart_rotation_panel import SimpleRotationSettingsPanel from aaregui.scan_logic.raster_grid_manager import RasterGridManager from aaregui.widgets.title_label import TitleLabel +from aaredaqlib.logger_config import setup_logger + +logger = setup_logger("aareGUI") class DataCollectionSettings(QFrame): cancel = Signal() @@ -57,6 +61,11 @@ class DataCollectionSettings(QFrame): v_layout.addWidget(self.__tab_widget) v_layout.addStretch() + self.progress_bar = QProgressBar(self) + self.progress_bar.setRange(0, 100) + self.progress_bar.setStyleSheet("background-color: rgb(255, 255, 255);") + v_layout.addWidget(self.progress_bar) + abort_button = QPushButton("Abort measurement", parent=self) abort_button.setStyleSheet("color: rgb(164, 0, 0);") abort_button.clicked.connect(self.cancel_button_clicked) @@ -74,8 +83,6 @@ class DataCollectionSettings(QFrame): self.__tab_widget.currentChanged.connect(self._on_tab_changed) - # ... existing code ... - @Slot() def switch_to_raster(self): self.__tab_widget.setCurrentIndex(0) @@ -93,6 +100,28 @@ class DataCollectionSettings(QFrame): self.__sample_id = s.sample.db_id self.__tab_widget.setCurrentIndex(0) + jfjoch_status = s.jfjoch_status + progress = getattr(jfjoch_status, "progress", None) + + if progress: + if not self.progress_bar.isVisible(): + self.progress_bar.setVisible(True) + try: + p = int(max(0, min(100, round(100*progress, 2)))) + self.progress_bar.setValue(p) + except Exception as e: + logger.error(f"Failed to update progress bar: {e}") + else: + self.progress_bar.setVisible(False) + + #states are Enum: "Idle" "Waiting" "Busy" "Error" "Not connected" + #message serverity is Enum: "success" "info" "warning" "error" + #messagge is string + #progress is float from 0 to 1 + if jfjoch_status.state == "Error": + QMessageBox.critical(self, "Error", jfjoch_status.message) + + @Slot(int) def _on_tab_changed(self, idx: int): # 0: Raster, 1: Rotation (incl. screening), 2: Simple (rotation wrapper), 3: XRF (ignore)