From 3e8a25f0a5e25a565aff7b55110fd3630ba77682 Mon Sep 17 00:00:00 2001 From: Filip Leonarski Date: Thu, 30 Oct 2025 11:00:40 +0100 Subject: [PATCH] GUI: logging addded to daq_worker.py, change frequency of occurence of Host requires authentication error --- gui/src/aaregui/threads/daq_worker.py | 71 +++++++++++++++++---------- 1 file changed, 44 insertions(+), 27 deletions(-) diff --git a/gui/src/aaregui/threads/daq_worker.py b/gui/src/aaregui/threads/daq_worker.py index 1be13e37..bf66717b 100644 --- a/gui/src/aaregui/threads/daq_worker.py +++ b/gui/src/aaregui/threads/daq_worker.py @@ -1,5 +1,6 @@ import copy import random +import time from PySide6.QtCore import Signal, QUrl, Slot, QTimer, QObject, QByteArray from PySide6.QtNetwork import QNetworkAccessManager, QNetworkRequest, QNetworkReply @@ -11,6 +12,10 @@ from aaredaqlib.models import DAQStatusModel, SampleShortInfoList, SampleShortIn from aaredaqlib.raster_grid import RasterGridRequest, CompletedRasterGrid from aaredaqlib.rotation_scan import RotationScanRequest, CompletedRotationScan +from aaredaqlib.logger_config import setup_logger + +logger = setup_logger(__name__) + SPREADHSEET_FREQUENCY = 25 # Every 5 seconds @@ -38,6 +43,9 @@ class DAQWorker(QObject): self.__timer.start() self.__counter = 0 + self._last_auth_error_log_ts = 0.0 + self._auth_error_min_interval = 10.0 + @Slot() def regular_update(self): if self.__counter % SPREADHSEET_FREQUENCY == 0: @@ -72,7 +80,7 @@ class DAQWorker(QObject): parsed_response = DAQStatusModel.model_validate_json(response_data) self.update.emit(parsed_response) except Exception as e: - print(e) + logger.error(f"Exception from status response: {e}") self.http_error.emit(str(e)) @Slot(QNetworkReply) @@ -82,7 +90,7 @@ class DAQWorker(QObject): parsed_response = SampleShortInfoList.model_validate_json(response_data) self.spreadsheet.emit(parsed_response) except Exception as e: - print(e) + logger.error(f"Exception from spreadsheet response: {e}") self.http_error.emit(str(e)) @Slot(QNetworkReply) @@ -92,22 +100,27 @@ class DAQWorker(QObject): parsed_response = SampleShortInfoList.model_validate_json(response_data) self.reference_tools.emit(parsed_response) except Exception as e: - print(e) + logger.error(f"Exception from reference tools response: {e}") self.http_error.emit(str(e)) def handle_req_response(self, reply: QNetworkReply): if reply.error() != QNetworkReply.NetworkError.NoError: - if reply.attribute(QNetworkRequest.Attribute.HttpStatusCodeAttribute) == 401: - print(reply.errorString()) + status = reply.attribute(QNetworkRequest.Attribute.HttpStatusCodeAttribute) + err_str = reply.errorString() + if status== 401: + now = time.monotonic() + if now - self._last_auth_error_log_ts > self._auth_error_min_interval: + logger.error(f"{err_str}: baton taken by another user") + self._last_auth_error_log_ts = now self.auth_error.emit() else: - print(reply.errorString()) - self.http_error.emit(reply.errorString()) + logger.error(f"{err_str}") + self.http_error.emit(err_str) reply.deleteLater() def generic_post(self, url: str, body: str = ""): if self.__base_url is None: - print(f"POST /{url}: {body}") + logger.info(f"POST /{url}: {body}") return request = QNetworkRequest(QUrl(f"{self.__base_url}/{url}")) @@ -119,7 +132,7 @@ class DAQWorker(QObject): def generic_put(self, url: str, body: str = ""): if self.__base_url is None: - print(f"PUT /{url}: {body}") + logger.info(f"PUT /{url}: {body}") return request = QNetworkRequest(QUrl(f"{self.__base_url}/{url}")) request.setRawHeader(b"Authorization", f"Bearer {self.__token}".encode("utf-8")) @@ -130,7 +143,7 @@ class DAQWorker(QObject): def generic_delete(self, url: str): if self.__base_url is None: - print(f"DELETE /{url}") + logger.info(f"DELETE /{url}") return request = QNetworkRequest(QUrl(f"{self.__base_url}/{url}")) @@ -215,7 +228,7 @@ class DAQWorker(QObject): parsed_response = CompletedRotationScan.model_validate_json(response_data) self.standard_scan_completed.emit(parsed_response) except Exception as e: - print(e) + logger.error(f"Exception from rotation scan response: {e}") self.http_error.emit(str(e)) @Slot(RotationScanRequest) @@ -235,18 +248,19 @@ class DAQWorker(QObject): parsed_response = CompletedRasterGrid.model_validate_json(response_data) self.raster_scan_completed.emit(parsed_response) except Exception as e: - print(e) + logger.error(f"Exception from raster scan response: {e}") self.http_error.emit(str(e)) @Slot(RasterGridRequest) def raster_scan(self, r: RasterGridRequest): self.run_number_incremented.emit() if self.__base_url is None: - print(f"POST /scan/raster: {r.model_dump_json()}") + logger.info(f"POST /scan/raster: {r.model_dump_json()}") image_number = r.get_image_number() new_copy = copy.deepcopy(r) images = [] + for i in range(image_number): images.append(ScanResultImagesInner( number=i, @@ -257,9 +271,10 @@ class DAQWorker(QObject): mos = random.uniform(0, 0.1), b= random.uniform(15.0, 80.0) )) - + logger.debug("check that this works - raster scan - complete raster grid") reply = CompletedRasterGrid(request = new_copy, result = ScanResult(file_prefix=r.file_prefix, images=images)) + logger.debug(f"It appears to work {reply}") self.raster_scan_completed.emit(reply) return @@ -274,7 +289,7 @@ class DAQWorker(QObject): def raster_scan_auto(self, r: RasterGridRequest): self.run_number_incremented.emit() if self.__base_url is None: - print(f"POST /scan/raster: {r.model_dump_json()}") + logger.info(f"POST /scan/raster: {r.model_dump_json()}") image_number = r.get_image_number() new_copy = copy.deepcopy(r) @@ -289,9 +304,10 @@ class DAQWorker(QObject): mos=random.uniform(0, 0.1), b=random.uniform(15.0, 80.0) )) - + logger.debug("check that this works - raster scan auto - complete raster grid") reply = CompletedRasterGrid(request=new_copy, result=ScanResult(file_prefix=r.file_prefix, images=images)) + logger.debug(f"It appears to work {reply}") self.raster_scan_completed.emit(reply) return @@ -306,7 +322,7 @@ class DAQWorker(QObject): @Slot() def load_spreadsheet(self): if self.__base_url is None: - print(f"GET /sample/spreadsheet") + logger.info(f"GET /sample/spreadsheet") return request = QNetworkRequest(QUrl(f"{self.__base_url}/sample/spreadsheet")) @@ -317,7 +333,7 @@ class DAQWorker(QObject): @Slot() def load_reference_tools(self): if self.__base_url is None: - print(f"GET /sample/reference_tools") + logger.info(f"GET /sample/reference_tools") return request = QNetworkRequest(QUrl(f"{self.__base_url}/sample/reference_tools")) request.setRawHeader(b"Authorization", f"Bearer {self.__token}".encode("utf-8")) @@ -327,14 +343,14 @@ class DAQWorker(QObject): def handle_auto_scan_response(self, reply, sample_id: int): if reply.error() == QNetworkReply.NetworkError.NoError: resp = reply.readAll().data().decode("utf-8") - print(f"Sample time {resp} s") + logger.info(f"Sample time {resp} s") self.automated_scan_done.emit(sample_id, True) else: if reply.attribute(QNetworkRequest.Attribute.HttpStatusCodeAttribute) == 401: - print(reply.errorString()) + logger.Error(f"Error in auto scan: {reply.errorString()}") self.auth_error.emit() else: - print(reply.errorString()) + logger.Error(f"Error in auto scan: {reply.errorString()}") self.http_error.emit(reply.errorString()) self.automated_scan_done.emit(sample_id, False) reply.deleteLater() @@ -342,7 +358,7 @@ class DAQWorker(QObject): @Slot(SampleShortInfo) def automated_scan(self, s: SampleShortInfo): if self.__base_url is None: - print(f"POST /scan/auto: {s.model_dump_json()}") + logger.info(f"POST /scan/auto: {s.model_dump_json()}") return request = QNetworkRequest(QUrl(f"{self.__base_url}/scan/auto")) @@ -355,7 +371,7 @@ class DAQWorker(QObject): @Slot(SimpleScanParameters) def smart_params(self, p: SimpleScanParameters): if self.__base_url is None: - print(f"POST /scan/smart_params: {p.model_dump_json()}") + logger.info(f"POST /scan/smart_params: {p.model_dump_json()}") return self.generic_post("scan/smart_params", p.model_dump_json()) @@ -410,13 +426,13 @@ class DAQWorker(QObject): parsed_response = RasterGridRequest.model_validate_json(response_data) self.raster_generated_by_ml.emit(parsed_response) except Exception as e: - print(e) + logger.Error(f"Error in ml box: {e}") self.http_error.emit(str(e)) @Slot() def ml_bounding_box(self): if self.__base_url is None: - print(f"POST /alc/ml_bounding_box") + logger.info(f"POST /alc/ml_bounding_box") return request = QNetworkRequest(QUrl(f"{self.__base_url}/alc/ml_bounding_box")) @@ -427,12 +443,14 @@ class DAQWorker(QObject): def _handle_face_detection_response(self, reply: QNetworkReply): try: if reply.error() != QNetworkReply.NetworkError.NoError: + logger.Error(f"Error in face detection: {reply.errorString()}") raise RuntimeError(reply.errorString()) payload = reply.readAll().data().decode("utf-8") or "{}" import json data = json.loads(payload) self.face_detection_result.emit(data) except Exception as e: + logger.Error(f"Error in face detection: {e}") self.http_error.emit(str(e)) finally: reply.deleteLater() @@ -440,12 +458,11 @@ class DAQWorker(QObject): @Slot() def face_detection(self, steps:int, step_size:int): if self.__base_url is None: - print(f"POST /face_detection/run?steps={steps}&step_size={step_size}") + logger.info(f"POST /face_detection/run?steps={steps}&step_size={step_size}") return request = QNetworkRequest(QUrl(f"{self.__base_url}/face_detection/run?steps={steps}&step_size={step_size}")) request.setRawHeader(b"Authorization", f"Bearer {self.__token}".encode("utf-8")) request.setRawHeader(b"Content-Type", b"application/json") - # fire-and-forget; handle reply asynchronously and emit result reply = self.__net_manager.post(request, QByteArray(b"")) reply.finished.connect(lambda: self._handle_face_detection_response(reply))