pre merge cleanup commit
This commit is contained in:
@@ -14,9 +14,11 @@ from hardware.coherent_hops_laser import CoherentHOPSLaser, DummyLaser
|
||||
from hardware.helios_laser import HeliosLaser, PulseMode
|
||||
from hardware.uc480_camera import UC480Camera, CameraStreamThread
|
||||
from hardware.pybbd202 import ThorlabsServoDriver, AXIS_X, AXIS_Y, TriggerBitsServo
|
||||
from hardware.t3r_driver import T3RDriver
|
||||
from motion_worker import MotionWorker
|
||||
from scanning.stage_scan_plan_generator import StageScanPlanGenerator
|
||||
from genesis_worker import GenesisWorker, GenesisCommand
|
||||
from t3r_control_panel import T3RControlPanel
|
||||
from ui_mainwindow import Ui_MainWindow
|
||||
|
||||
# Page indices in stackedWidget
|
||||
@@ -95,10 +97,11 @@ class ScanWorker(QtCore.QObject):
|
||||
overall_progress = QtCore.pyqtSignal(int)
|
||||
status_message = QtCore.pyqtSignal(str)
|
||||
|
||||
def __init__(self, scan_params, motion_worker):
|
||||
def __init__(self, scan_params, motion_worker, t3r_driver=None):
|
||||
super().__init__()
|
||||
self.scan_params = scan_params
|
||||
self.motion_worker = motion_worker
|
||||
self.t3r_driver = t3r_driver
|
||||
self.should_stop = False
|
||||
|
||||
@QtCore.pyqtSlot()
|
||||
@@ -108,7 +111,30 @@ class ScanWorker(QtCore.QObject):
|
||||
self.motion_worker.scanning_active = True
|
||||
try:
|
||||
self.scan_started.emit()
|
||||
# TODO: implement scan execution logic
|
||||
num_angles = self.scan_params.get("num_angles", 1)
|
||||
angle_step = 360.0 / num_angles if num_angles > 1 else 0.0
|
||||
gr_microsteps = self.scan_params.get("gr_axis_microsteps", 16)
|
||||
|
||||
for angle_idx in range(num_angles):
|
||||
if self.should_stop:
|
||||
break
|
||||
self.angle_started.emit(angle_idx, num_angles)
|
||||
self.status_message.emit(
|
||||
f"Scanning angle {angle_idx + 1}/{num_angles}")
|
||||
# TODO: execute scan lines for this angle via motion_worker
|
||||
|
||||
if angle_idx < num_angles - 1 and angle_step and self.t3r_driver:
|
||||
if self.t3r_driver.is_open:
|
||||
self.status_message.emit(
|
||||
f"Rotating stage {angle_step:.3f}° for next angle…")
|
||||
self.t3r_driver.rotate_stage(
|
||||
angle_step,
|
||||
gr_microsteps,
|
||||
self.scan_params.get("rotation_velocity", 8000),
|
||||
self.scan_params.get("rotation_accel", 4000),
|
||||
)
|
||||
# TODO: wait for MOTION_DONE event before proceeding
|
||||
|
||||
self.scan_completed.emit()
|
||||
except Exception as e:
|
||||
self.scan_failed.emit(str(e))
|
||||
@@ -140,8 +166,13 @@ class MainWindow(QtWidgets.QMainWindow):
|
||||
self.scan_worker: Optional[ScanWorker] = None
|
||||
self.scan_thread: Optional[QtCore.QThread] = None
|
||||
|
||||
# T3R focusing / rotation driver (lives in main thread; reader runs internally)
|
||||
self.t3r_driver = T3RDriver(self)
|
||||
self.t3r_panel: Optional[T3RControlPanel] = None
|
||||
|
||||
self._connect_signals()
|
||||
self._init_genesis_worker()
|
||||
self._init_t3r_menu()
|
||||
self.ui.stackedWidget.setCurrentIndex(PAGE_START)
|
||||
|
||||
# ------------------------------------------------------------------
|
||||
@@ -358,7 +389,13 @@ class MainWindow(QtWidgets.QMainWindow):
|
||||
pass # TODO
|
||||
|
||||
def _on_t3r_connect(self):
|
||||
pass # TODO
|
||||
port = self.ui.t3r_serial_port_edit.currentText().split(" ")[0]
|
||||
self._show_t3r_panel()
|
||||
if port and not self.t3r_driver.is_open:
|
||||
try:
|
||||
self.t3r_driver.connect(port)
|
||||
except Exception as exc:
|
||||
QtWidgets.QMessageBox.warning(self, "T3R Connect", str(exc))
|
||||
|
||||
# ------------------------------------------------------------------
|
||||
# New scan page
|
||||
@@ -419,6 +456,10 @@ class MainWindow(QtWidgets.QMainWindow):
|
||||
"save_directory": self.ui.newscan_save_directory_edit.text(),
|
||||
"scan_velocity_mm_s": self.config["stage"]["scan_velocity_mm_s"],
|
||||
"scan_acceleration_mm_s2": self.config["stage"]["scan_acceleration_mm_s2"],
|
||||
# T3R rotation between angles (GR-axis, ch1)
|
||||
"gr_axis_microsteps": 16,
|
||||
"rotation_velocity": 8000,
|
||||
"rotation_accel": 4000,
|
||||
}
|
||||
|
||||
# ------------------------------------------------------------------
|
||||
@@ -456,7 +497,7 @@ class MainWindow(QtWidgets.QMainWindow):
|
||||
|
||||
def _start_scan(self, scan_params: dict):
|
||||
self.scan_thread = QtCore.QThread()
|
||||
self.scan_worker = ScanWorker(scan_params, self.motion_worker)
|
||||
self.scan_worker = ScanWorker(scan_params, self.motion_worker, self.t3r_driver)
|
||||
self.scan_worker.moveToThread(self.scan_thread)
|
||||
|
||||
self.scan_thread.started.connect(self.scan_worker.run_scan)
|
||||
@@ -497,6 +538,33 @@ class MainWindow(QtWidgets.QMainWindow):
|
||||
self.scan_thread = None
|
||||
self.scan_worker = None
|
||||
|
||||
# ------------------------------------------------------------------
|
||||
# T3R focusing / rotation panel
|
||||
# ------------------------------------------------------------------
|
||||
|
||||
def _init_t3r_menu(self):
|
||||
"""Add a Hardware menu with a T3R panel toggle action."""
|
||||
hw_menu = self.menuBar().addMenu("Hardware")
|
||||
self._t3r_action = hw_menu.addAction("T3R Focusing && Rotation…")
|
||||
self._t3r_action.setCheckable(True)
|
||||
self._t3r_action.setShortcut("Ctrl+T")
|
||||
self._t3r_action.triggered.connect(self._on_t3r_action_toggled)
|
||||
|
||||
def _show_t3r_panel(self):
|
||||
if self.t3r_panel is None:
|
||||
self.t3r_panel = T3RControlPanel(self.t3r_driver, self)
|
||||
self.t3r_panel.finished.connect(
|
||||
lambda: self._t3r_action.setChecked(False))
|
||||
self.t3r_panel.show()
|
||||
self.t3r_panel.raise_()
|
||||
self._t3r_action.setChecked(True)
|
||||
|
||||
def _on_t3r_action_toggled(self, checked: bool):
|
||||
if checked:
|
||||
self._show_t3r_panel()
|
||||
elif self.t3r_panel is not None:
|
||||
self.t3r_panel.hide()
|
||||
|
||||
# ------------------------------------------------------------------
|
||||
# Genesis laser worker
|
||||
# ------------------------------------------------------------------
|
||||
@@ -523,6 +591,8 @@ class MainWindow(QtWidgets.QMainWindow):
|
||||
# ------------------------------------------------------------------
|
||||
|
||||
def closeEvent(self, event):
|
||||
if self.t3r_driver.is_open:
|
||||
self.t3r_driver.disconnect()
|
||||
self._cleanup_genesis_worker()
|
||||
self._cleanup_scan_thread()
|
||||
if self.motion_thread:
|
||||
|
||||
Reference in New Issue
Block a user