diff --git a/pykirdy/driver/kirdy_async.py b/pykirdy/driver/kirdy_async.py index ec02e41..b081bc1 100644 --- a/pykirdy/driver/kirdy_async.py +++ b/pykirdy/driver/kirdy_async.py @@ -637,21 +637,18 @@ class Kirdy: Decode newline delimited Json objects and return the latest json received inside the buffer. - buffer_size: Integer """ - - try: + try: raw_response = await asyncio.wait_for(self._reader.read(buffer_size), self.timeout) - except asyncio.exceptions.TimeoutError: - return { - "msg_type": "Internal Timeout" - } - response = raw_response.decode('utf-8', errors='ignore').split("\n") - for item in reversed(response): - try: - return json.loads(item) - except json.decoder.JSONDecodeError: - pass - return { "msg_type": "Internal No json object found in response" } + response = raw_response.decode('utf-8', errors='ignore').split("\n") + for item in reversed(response): + try: + return json.loads(item) + except json.decoder.JSONDecodeError as e: + pass + return { "msg_type": "Exception"} + except TimeoutError: + return { "msg_type": "Exception"} async def _send_raw_cmd_handler(self, cmd, lock=True, msg_type="Acknowledge"): if lock: @@ -719,12 +716,10 @@ class Kirdy: response = await self._read_response() if response["msg_type"] == msg_type: return response + retry += 1 + await asyncio.sleep(0.1) except asyncio.exceptions.CancelledError: return None - except Exception as e: - retry += 1 - logging.error(f"_send_cmd Exception: {e}") - await asyncio.sleep(0.1) raise NoAckRecv async def report_mode(self, report_interval = 0.0, buffer_size=16384): diff --git a/pykirdy/kirdy_qt.py b/pykirdy/kirdy_qt.py index f505645..13b9702 100644 --- a/pykirdy/kirdy_qt.py +++ b/pykirdy/kirdy_qt.py @@ -30,6 +30,8 @@ from dateutil import tz import math import socket +COMMON_ERROR_MSG = "Connection Timeout. Disconnecting." + def get_argparser(): parser = argparse.ArgumentParser(description="ARTIQ master") @@ -70,12 +72,13 @@ class KirdyDataWatcher(QObject): task = asyncio.create_task(self.signal_emitter()) while True: if task.done(): + _ = task.result() task = asyncio.create_task(self.signal_emitter()) await asyncio.sleep(self._update_s) except asyncio.CancelledError: - pass + task.cancel() except Exception as e: - logging.error(f"Encountered an error: {e}. disconnecting.", exc_info=True) + logging.error(COMMON_ERROR_MSG) self._kirdy.stop_report_mode() self.connection_error_sig.emit() @@ -102,10 +105,11 @@ class KirdyDataWatcher(QObject): async def report_mode(self): try: async for status_report in self._kirdy.report_mode(): + if status_report["msg_type"] == "Exception": + raise TimeoutError("Connection Timeout") self.report_update_sig.emit(status_report) except Exception as e: - logging.error(f"Encountered an error: {e}, disconnecting", exc_info=True) - self._kirdy.stop_report_mode() + logging.error(f"{COMMON_ERROR_MSG}") self.connection_error_sig.emit() @pyqtSlot(float) @@ -216,7 +220,7 @@ class Graphs: self.tec_i_measure_connector.cb_append_data_point(tec_i_measure, ts) self.tec_i_target_connector.cb_append_data_point(tec_i_set, ts) except Exception as e: - logging.error(f"Graph Value cannot be updated. Error:{e}. Data:{report}") + logging.error(f"Graph Value cannot be updated. Data:{report}", exc_info=True) def clear_data_pts(self): for connector in self.connectors: @@ -685,7 +689,7 @@ class MainWindow(QtWidgets.QMainWindow, Ui_MainWindow): self.params[1].child('Photodiode Monitor Config', 'Responsitivity').setValue(0) self.params[1].child('Photodiode Monitor Config', 'Dark Current').setValue(settings["pd_mon_params"]["i_dark"]) except Exception as e: - logging.error(f"Params tree cannot be updated. Error:{e}. Data:{settings}") + logging.error(f"Params tree cannot be updated. Data:{settings}", exc_info=True) @asyncSlot(dict) async def update_ld_ctrl_panel_readings(self, report): @@ -704,7 +708,7 @@ class MainWindow(QtWidgets.QMainWindow, Ui_MainWindow): self.params[1].child('Readings', 'PD Power').setValue(0) self.params[1].child('Readings', 'LF Mod Impedance').setValue(report["term_status"]) except Exception as e: - logging.error(f"Params tree cannot be updated. Error:{e}. Data:{report}") + logging.error(f"Params tree cannot be updated. Data:{report}", exc_info=True) @asyncSlot(dict) async def update_thermostat_ctrl_panel_settings(self, settings): @@ -732,7 +736,7 @@ class MainWindow(QtWidgets.QMainWindow, Ui_MainWindow): self.graphs.set_temp_setpoint_line(temp=round(settings["temperature_setpoint"], 6)) self.graphs.set_temp_setpoint_line(visible=settings['pid_engaged']) except Exception as e: - logging.error(f"Params tree cannot be updated. Error:{e}. Data:{settings}") + logging.error(f"Params tree cannot be updated. Data:{settings}", exc_info=True) @asyncSlot(dict) async def update_thermostat_ctrl_panel_readings(self, report): @@ -745,7 +749,7 @@ class MainWindow(QtWidgets.QMainWindow, Ui_MainWindow): self.params[3].child('Readings', 'Temperature').setValue(report["temperature"]) self.params[3].child('Readings', 'Current through TEC').setValue(report["tec_i"]) except Exception as e: - logging.error(f"Params tree cannot be updated. Error:{e}. Data:{report}") + logging.error(f"Params tree cannot be updated. Data:{report}", exc_info=True) @pyqtSlot(int) def set_max_samples(self, samples: int):