# Changelog ## 0.3.1 (2026-04-29) - **DAQ/Server**: - Improved baton exchange logic with automatic timeout and Redis-backed state. - **GUI**: - Updated about dialog with correct version and copyright. - Improved layout persistence and state management. ## 0.3.0 (2026-04-24) - Merge three repos into one, remove Ultralytics as dependency - **Testing & CI/CD**: - Implemented comprehensive `pytest` infrastructure for unit and integration tests. - Integrated `pytest-cov` and `pytest-mock` into the testing workflow with 100% coverage on core modules like `coordinate` and `exception_handler`. - Added automated testing stage to Gitea workflow (`.gitea/workflows/action.yaml`) ensuring tests pass before build and documentation updates. - Added `pytest-qt` support for GUI testing. - Added tests for `aerotech`, `models`, `autofocus`, `automation`, `beamline`, `diffraction_geometry`, `enum_pv`, `face_detection`, `jfjoch_client`, `mlbox`, `my_motor`, `spreadsheet_updater`, and `workflows`. - **DAQ/Server**: - Added lifespan function for one-time initialization of core objects (devices, daq, config) on startup, reducing conflicting Redis and device connections. - Big Aerotech upgrade: transitioned to Aerotech API with ported coordinate functions. - Re-enabled and updated automation workflow 2.0 with new backend endpoints. - Added `park_and_dry` functionality for repeated mount failures. - Workflow assertions to ensure scintillator is down when possible. - Improved aerotech movement and position calculations. - Implementation of camera auto-exposure and zoom-dependent settings. - Added SAS-TT school demo temporary raster function. - Enhanced status polling with robust error handling for `Tell`, `Smargon`, and `Aerotech` communication. - `ml_box` updated with beamline-specific URLs, model class types, and new YOLO26 engine. - Added separate authentication pathway for staff-only beamline recovery operations. - Improved database message limits for omega (to 2 decimal places). - Added screenshot to database from GUI; face detection sequence and beamline recovery updates. - Throttled `UserRightsException` logging to reduce log noise. - Implemented persistent automation progress tracking using Redis across multiple workers. - Added automation progress panel to the GUI for real-time monitoring. - Improved raster and rotation scan error handling and centralized database message handling. - Updated `server_exception_handler.py` and `error_codes.py` to cover all custom exceptions. - Added `auto_exposure` endpoint and improved `autofocus` logic. - Fixed multiple bugs in raster scan positioning and state transitions. - Refactored `MLBOX` and `LOOP_CENTERING` types; loop centering now avoids moving if only non-crystal classes (pin, ice, needle) are found. - Split `LOOP_CENTERING` from main DAQ script for better maintainability. - **Baton & Sessions**: - Major rework of the baton exchange procedure and session management. - Added `NOT_BATON_HOLDER` error code and specialized handling for baton requests. - Integrated baton status messages into the camera image display and status bar. - Improved session state transitions with new `Pending` states and P-group selection logic. - **GUI**: - Added `ui_state_manager` to handle `QSettings` for persistent UI state. - Major rework of `predict_subscriber` and prediction stream updates; corrected default ZMQ stream for ML box. - Added FPS counter and sharpness monitoring for sample camera. - Improved camera thread performance and authentication failure handling. - Added X10SA specific camera and prediction configurations. - New `display_status` for user-facing connection/error messages. - Integrated `dev_help` panel with logs and error code search. - Added framework for building GUI tutorials with first draft of X10SA tutorial. - Added alert banner for critical disconnection issues (server/Tell/Aerotech). - New screenshot button and controls in sample camera GUI. - Added SSE support for face detection panel updates during automation. - Integrated sample position resync in recovery panel to reduce Tell polling. - Fixed matplotlib warnings in face detection panel and improved layout persistence. - Added `beamline_state_panel` with station widgets for improved state management and visibility. - Performance optimizations: throttled raster grid drawing to 25Hz and improved dense heat map rendering. - Added automation progress panel and wired it to the persistent Redis backend. - Improved prediction subscriber performance and target stability visualization. - Added shortcuts and improved user feedback in the status bar using `BeamlineStateEnum` display names. - Improved prediction subscriber and metrics panel performance. - **TELL & Infrastructure**: - Added mTLS certificate authentication for `aaredb`, `tellupdater`, and `spreadsheetupdater`. - Improved SSE client resilience in `tellupdater` with retry mechanisms and enhanced error logging. - Major refactor: removed redundant code and added simulated client. - Converted wait functions to use inbuilt pshell functionality. - Added error handling and proxy support for connection failures. - Fixed event names for mounting, and added missing events for gripper detection and motion sync. - Refactored SSE connection handling for simplicity and robustness. - Added control for pin blower and annealing (in/out) to `TellClient`. - Improved TELL HTTP communication handling to prevent swallowed errors. - Added magnet position sensor state checks and exception handling. - Improved Gitea workflows with better dependency management and testing steps. - **Common & Devices**: - Added BEC worker and Aerotech controller initialization in `devices.py`. - Added magnet position sensor functions and centralized transmission settings. - Added centralized `error_codes` and refactored exception handling to use FastAPI handlers. - Expanded device support with new PVs (beamstop, scintillator, collimator, cryojet, etc.). - Cleaned up `mx_lib` wait functions and `my_motor` class; added `clean_filename` helper. - Improved Smargon connection exception handling. - Updated ABR_POS_HOME configuration and added comments for cryo positions. - Added image upload comments and improved authentication error messaging. - Centralized custom exceptions in `aare.common.exception_handler`. - Added `display_name` to `BeamlineStateEnum` for consistent UI strings. - Refactored `SampleShortInfo` handling across DAQ and database modules. - Multiple bug fixes in ML box prediction logic and coordinate transformations. - `JFJOCH` wrapper: Added retries for image retrieval and new `wait_till_running` method. ### 0.2.69 - check beamline state before running raster, rotation and automation - lowered polling rate of daq status to improve GUI performance - robot drys then parks after repeated mount failures ### 0.2.68: - added check box to numberlineedits to switch between user input and spreadsheet - re-enabled MLprediction - fixed bug in gui where manual sample couldnt be created when run nubmer was negative. - Combined beamline view now split vertically not horizontally - New error handling in DAQ for robot mounting errors - Error box pop ups in GUI when sample gripper detection error occurs - Automation queue pauses if sample gripper detection error occurs multiple times to allow robot dry, if continues stops and wiats for user interverntion - added ingest_scan to send rotation and screening result to db ### 0.2.67: - added run number to sampleshortinfo - ingest raster result, including beam center to database - aerotech goes to mount postion for manual mount - logger config correctly expands file path for logger location. - smart_rotiation_panel fix - but will be mvoed to DAQ in future update - Fluoresence scan can be saved to CSV with right click - Wait for ready before sending Tell to dry ### 0.2.66: - moved rastergridingestmodel and centreofmassmodel from models to raster_grid.py - after raster load closest image to new centre