Releases: Cephla-Lab/Squid
Firmware v1.1
Adds serial watchdog for illumination safety auto-shutoff.
Features
- Serial watchdog (dead man's switch) — Firmware monitors serial communication from the control software. If no messages are received within the timeout period (default 5s, configurable up to 1 hour), firmware automatically turns off all illumination. Protects against software crashes and USB disconnects. New commands:
SET_WATCHDOG_TIMEOUT(40),HEARTBEAT(42)
Bug Fixes
- Level trigger re-trigger fix — Prevent trigger from never ending when retriggered too fast (#500)
Breaking Changes
None. Watchdog is disabled by default and only activates when software explicitly enables it. Fully backward compatible with older software.
Software Support
Software v1.1+ (control/microcontroller.py) automatically enables the watchdog at startup and sends periodic heartbeat commands. Older software works fine — the watchdog simply remains disabled.
Firmware v1.0
First versioned firmware release. Introduces version reporting and multi-port illumination control.
Features
- Multi-port illumination control — Independent on/off and intensity control for up to 16 illumination ports (D1-D16), with 5 currently implemented (D1-D5). New commands:
SET_PORT_INTENSITY(34),TURN_ON_PORT(35),TURN_OFF_PORT(36),SET_PORT_ILLUMINATION(37),SET_MULTI_PORT_MASK(38),TURN_OFF_ALL_PORTS(39) - Firmware version reporting — Version encoded in response byte 22 (nibble-packed major.minor), enabling software to detect firmware capabilities
- Second filter wheel (W2) support — Additional stepper axis for dual filter wheel configurations
- Level trigger for ToupCam cameras — Hardware trigger mode support
- Laser safety interlock — Hardware interlock pin forces all illumination off when triggered, with build flag to disable for systems without lasers
Infrastructure
- Reorganized firmware directory structure with PlatformIO support
- Added firmware CI tests and firmware-software integration tests
- Port naming refactored from wavelength-based to port-based (D1-D5)
v0.6.2
What's Changed
- fix: Initialize Optospin filter wheel positions on startup by @Alpaca233 in #459
- feat: Add detailed MCU command logging for debugging by @hongquanli in #460
- fix: Race condition in the NapariLiveWidget for the new alignment feature by @hongquanli in #461
- feat: Add settings option to enable/disable NDViewer tab by @hongquanli in #462
- fix: Use QMetaObject.invokeMethod for TCP acquisition GUI state update by @hongquanli in #463
- fix: Terminate GUI after --wait acquisition completes in run_acquisition.py by @hongquanli in #464
- feat: Integrate NDViewer push-based API for live acquisition by @hongquanli in #465
- fix: live illumination switching w/ hardware trigger by @hongquanli in #419
- FLIR camera driver update by @Alpaca233 in #365
- feat: Add status bar widget for displaying warnings and errors by @hongquanli in #467
- feat: Add Slack notifications for acquisition events by @Alpaca233 in #466
- fix: UI improvements - maximize window and rename menu item by @hongquanli in #469
- refactor: Reorganize Preferences dialog by @hongquanli in #470
- feat: Add per-component hardware simulation controls by @hongquanli in #468
- feat: Skip hardware initialization on restart after settings change by @hongquanli in #471
- fix: XLight filter slider serial communication and add getter method by @Alpaca233 in #472
- fix: Use threaded operations for XLight controls to prevent UI freeze by @Alpaca233 in #475
- feat: Display stage position on laser-based focus tab by @Alpaca233 in #476
- feat: Add zarr v3 saving with OME-NGFF compliant output by @hongquanli in #474
- feat: Add X-Light V2 protocol support with auto-detection by @Alpaca233 in #477
Full Changelog: v0.6.1...v0.6.2
v0.6.1
What's Changed
- fix: Preserve scan size consistency in Select Wells mode by @hongquanli in #393
- feat: Add downsampled well and plate view for Select Wells mode by @hongquanli in #387
- feat: Refactor channel configuration to eliminate duplication across … by @hongquanli in #392
- firmware refactoring by @hongquanli in #396
- refactor: Reorganize firmware and add PlatformIO support by @hongquanli in #397
- feat: Add firmware tests, CI workflow, and firmware-software integration tests by @hongquanli in #398
- feat: Add laser safety interlock functionality by @hongquanli in #399
- docs: Improve firmware upload instructions by @hongquanli in #400
- feat: Add build flag to disable laser interlock for systems without lasers by @hongquanli in #401
- feat: Add desktop shortcut creation to setup script by @hongquanli in #406
- feat: add Claude Code integration by @hongquanli in #405
- feat: Add ZMotorConfig enum and improve piezo-only mode support by @hongquanli in #408
- fix: Improve SurfacePlotWidget Z-stack handling and single FOV support by @hongquanli in #409
- fix: Prevent segfault on application exit by @hongquanli in #410
- fix: Fix JobRunner.has_pending() to track jobs in progress by @hongquanli in #411
- refactor: move AcquisitionInfo to JobRunner context for metadata consistency by @hongquanli in #367
- fix: Fix semaphore leak in JobRunner multiprocessing primitives by @hongquanli in #413
- refactor: Improve microscope.py code quality and API design by @hongquanli in #402
- fix: strip inline comments from INI config values by @hongquanli in #414
- feat: Add level trigger support for ToupCam cameras by @veerwang in #386
- tool: Add timing instrumentation (for downsampled plate view pipeline) by @hongquanli in #416
- feat: Add Views tab to Configuration dialog for downsampled view settings by @hongquanli in #395
- perf: Optimize downsampling with user-selectable interpolation methods by @hongquanli in #418
- perf: Optimize plate view boundary drawing for large plates by @hongquanli in #415
- feat: Save and load acquisition parameters via YAML by @hongquanli in #421
- feat: Save and restore camera settings on close/startup by @hongquanli in #423
- feat: Runtime control of view settings via MCP for RAM debugging by @hongquanli in #424
- chore: Update napari version in setup script and app name by @Alpaca233 in #426
- feat: Add MCP commands for view settings control (RAM debugging) by @hongquanli in #425
- feat: Add run acquisition from yaml via TCP and CLI by @hongquanli in #422
- fix: Regenerate SimulatedCamera frame when binning changes by @hongquanli in #429
- feat: Persist last used base saving path for multipoint widgets by @hongquanli in #430
- feat: Add simulated disk I/O mode for development by @hongquanli in #431
- docs: Move dynamic-widget-visibility.md to software/docs/pending by @hongquanli in #433
- docs: Add simulated disk I/O documentation by @hongquanli in #432
- feat: Add live RAM usage monitoring display in status bar by @hongquanli in #434
- feat: Add acquisition backpressure to prevent RAM exhaustion by @hongquanli in #436
- feat: Add backpressure status bar widget for acquisition monitoring by @hongquanli in #438
- refactor: New design for illumination channel configs and acquisition configs by @Alpaca233 in #417
- refactor: Simplify code from PRs 434/436, fix saving path bug, improve status bar by @hongquanli in #440
- fix: Backpressure byte tracking and multiprocessing resource cleanup by @hongquanli in #442
- refactor: Remove legacy config managers, centralize in ConfigRepository by @Alpaca233 in #441
- feat: NDViewer tab with live viewing and plate navigation by @hongquanli in #428
- fix: Fix NapariLiveWidget Qt signal connection and camera attribute by @Alpaca233 in #443
- feat: Add acquisition throttling settings in Preferences by @hongquanli in #444
- fix: Update stale channel_configuration_manager references after PR #441 by @hongquanli in #449
- fix: Resolve backpressure deadlock with z-stack acquisitions by @hongquanli in #446
- feat: Add alignment button for sample registration with previous acquisitions by @Alpaca233 in #448
- fix: Disable memory profiling in CI to fix test hangs by @hongquanli in #451
- docs: Add comprehensive documentation for configuration system by @hongquanli in #447
- fix: Laser AF spot detection mode and None safety checks by @hongquanli in #453
- fix: Sync contrast limits and add user feedback for alignment errors by @Alpaca233 in #454
- fix: User profile migration and spot detection mode fixes by @Alpaca233 in #455
- fix: Suppress stale read warnings in simulation mode by @Alpaca233 in #456
- fix: Preserve manual region drawing order during acquisition by @Alpaca233 in #457
- Tucsen Libra25 support by @Alpaca233 in #437
- fix: mcu cmd timeout and toupcam strobe delay fixes by @hongquanli in #458
Full Changelog: v0.5.8...v0.6.1
v0.6b
A lot of new features have been added, but we haven't tested them extensively on hardware yet. This release may be broken on confocal systems.
What's Changed
- fix: Preserve scan size consistency in Select Wells mode by @hongquanli in #393
- feat: Add downsampled well and plate view for Select Wells mode by @hongquanli in #387
- feat: Refactor channel configuration to eliminate duplication across … by @hongquanli in #392
- firmware refactoring by @hongquanli in #396
- refactor: Reorganize firmware and add PlatformIO support by @hongquanli in #397
- feat: Add firmware tests, CI workflow, and firmware-software integration tests by @hongquanli in #398
- feat: Add laser safety interlock functionality by @hongquanli in #399
- docs: Improve firmware upload instructions by @hongquanli in #400
- feat: Add build flag to disable laser interlock for systems without lasers by @hongquanli in #401
- feat: Add desktop shortcut creation to setup script by @hongquanli in #406
- feat: add Claude Code integration by @hongquanli in #405
- feat: Add ZMotorConfig enum and improve piezo-only mode support by @hongquanli in #408
- fix: Improve SurfacePlotWidget Z-stack handling and single FOV support by @hongquanli in #409
- fix: Prevent segfault on application exit by @hongquanli in #410
- fix: Fix JobRunner.has_pending() to track jobs in progress by @hongquanli in #411
- refactor: move AcquisitionInfo to JobRunner context for metadata consistency by @hongquanli in #367
- fix: Fix semaphore leak in JobRunner multiprocessing primitives by @hongquanli in #413
- refactor: Improve microscope.py code quality and API design by @hongquanli in #402
- fix: strip inline comments from INI config values by @hongquanli in #414
- feat: Add level trigger support for ToupCam cameras by @veerwang in #386
- tool: Add timing instrumentation (for downsampled plate view pipeline) by @hongquanli in #416
- feat: Add Views tab to Configuration dialog for downsampled view settings by @hongquanli in #395
- perf: Optimize downsampling with user-selectable interpolation methods by @hongquanli in #418
- perf: Optimize plate view boundary drawing for large plates by @hongquanli in #415
- feat: Save and load acquisition parameters via YAML by @hongquanli in #421
- feat: Save and restore camera settings on close/startup by @hongquanli in #423
- feat: Runtime control of view settings via MCP for RAM debugging by @hongquanli in #424
- chore: Update napari version in setup script and app name by @Alpaca233 in #426
- feat: Add MCP commands for view settings control (RAM debugging) by @hongquanli in #425
- feat: Add run acquisition from yaml via TCP and CLI by @hongquanli in #422
- fix: Regenerate SimulatedCamera frame when binning changes by @hongquanli in #429
- feat: Persist last used base saving path for multipoint widgets by @hongquanli in #430
- feat: Add simulated disk I/O mode for development by @hongquanli in #431
- docs: Move dynamic-widget-visibility.md to software/docs/pending by @hongquanli in #433
- docs: Add simulated disk I/O documentation by @hongquanli in #432
- feat: Add live RAM usage monitoring display in status bar by @hongquanli in #434
- feat: Add acquisition backpressure to prevent RAM exhaustion by @hongquanli in #436
- feat: Add backpressure status bar widget for acquisition monitoring by @hongquanli in #438
- refactor: New design for illumination channel configs and acquisition configs by @Alpaca233 in #417
- refactor: Simplify code from PRs 434/436, fix saving path bug, improve status bar by @hongquanli in #440
- fix: Backpressure byte tracking and multiprocessing resource cleanup by @hongquanli in #442
- refactor: Remove legacy config managers, centralize in ConfigRepository by @Alpaca233 in #441
- feat: NDViewer tab with live viewing and plate navigation by @hongquanli in #428
- fix: Fix NapariLiveWidget Qt signal connection and camera attribute by @Alpaca233 in #443
- feat: Add acquisition throttling settings in Preferences by @hongquanli in #444
- fix: Update stale channel_configuration_manager references after PR #441 by @hongquanli in #449
- fix: Resolve backpressure deadlock with z-stack acquisitions by @hongquanli in #446
- feat: Add alignment button for sample registration with previous acquisitions by @Alpaca233 in #448
- fix: Disable memory profiling in CI to fix test hangs by @hongquanli in #451
- docs: Add comprehensive documentation for configuration system by @hongquanli in #447
- fix: Laser AF spot detection mode and None safety checks by @hongquanli in #453
- fix: Sync contrast limits and add user feedback for alignment errors by @Alpaca233 in #454
- fix: User profile migration and spot detection mode fixes by @Alpaca233 in #455
- fix: Suppress stale read warnings in simulation mode by @Alpaca233 in #456
Full Changelog: v0.5.8...v0.6b
v0.5.8
What's Changed
- UI/new multipoint by @hongquanli in #333
- gui performance improvement: register fovs in batch by @Alpaca233 in #363
- Fix SimulatedCamera resolution calculation based on crop dimensions by @hongquanli in #368
- Filter wheel abstraction by @Alpaca233 in #359
- Fix the bug caused by repeated homing by @veerwang in #369
- Fix Laser AF exposure UI to use focus camera limits and laser AF calibration coefficient unit by @hongquanli in #371
- gui: add dialog for showing fovs to image in fluidics runs by @Alpaca233 in #373
- gui: 1536 well plate mouse selection by @Alpaca233 in #372
- bug fix: minor fix for #372 and #373 by @Alpaca233 in #375
- feat: save log in acquisition folder by @Alpaca233 in #374
- Install PyVCAM using pip by @GeekLogan in #377
- bug fix: switching to 1536 well plate by @Alpaca233 in #380
- Fix: Use camera exposure time in simulation mode by @hongquanli in #381
- feat: Add Skip Saving checkbox to multipoint acquisition widgets by @hongquanli in #383
- feat: Add RAM usage check for mosaic view before acquisition by @hongquanli in #382
- fix: Actually free RAM when clearing mosaic view layers by @hongquanli in #385
- fix: Replace napari icon and menu with Cephla's by @hongquanli in #388
- feat: Add Configuration dialog for editing settings via GUI by @hongquanli in #389
- fix: Resolve test segfaults / hang + Qt compatibility update + .pre-commit-config by @hongquanli in #391
New Contributors
- @GeekLogan made their first contribution in #377
Full Changelog: v0.5.7...v0.5.8
v0.5.7
What's Changed
- make control dock scrollable by @hongquanli in #332
- camera stress test: remove unused continuous, add binning, add bytes report by @ianohara in #334
- Revert "make control dock scrollable" by @hongquanli in #336
- fix: preserve channel metadata in multipage TIFFs via ImageDescri… by @hongquanli in #337
- Feature/add time and piezo to multipage tiff metadata by @hongquanli in #338
- feat: add OME-TIFF support by @hongquanli in #339
- remove SlidePositionController and SlidePositionWorker by @Alpaca233 in #324
- bug fix: buttons for coordinates are not disabled properly after acquisition is finished by @Alpaca233 in #342
- bug fix: Flexible Multipoint Widget by @Alpaca233 in #341
- feat: disable keyboard tracking on all spinbox widgets by @hongquanli in #344
- use same format for "Save Coordinates" and coordinates.csv in acquisition by @Alpaca233 in #343
- feat: set laser af reference when setting z min in z range by @Alpaca233 in #345
- bug fix: Flexible Multipoint importing/exporting list by @Alpaca233 in #346
- feat: Tucsen FL26 BW binning by @Alpaca233 in #348
- bug fix: toupcam resolution config by @Alpaca233 in #349
- remove some log info because it's taking too much disk space by @Alpaca233 in #351
- ux improvement: automatically stop live when doing laser af by @Alpaca233 in #354
- bug fix: laser power calibration by @Alpaca233 in #350
- workflow improvement: use z position from last timepoint to start autofocus during timelapse by @Alpaca233 in #353
- bug fix: z range initialization by @Alpaca233 in #352
- bug fix: Squid 6060 config by @Alpaca233 in #356
- feat: clear coordinates for navigation viewer by @Alpaca233 in #355
- bug fix: only the last manual region is shown on Navigation Viewer by @Alpaca233 in #357
- use variable sleep time to improve time lapse acquisition time resolution by @Alpaca233 in #358
- bug fix: missing live controller in well plate multipoint widget by @Alpaca233 in #361
- bug fix: move to piezo home position on start by @Alpaca233 in #360
- update default value for laser af settings by @Alpaca233 in #362
- bug fix: format of the coordinates file used for fluidics widget is different from the one in wellplate multipoint widget by @Alpaca233 in #364
Full Changelog: v0.5.6...v0.5.7
Known Issues
- Missing images in OME-TIFF on Windows
v0.5.6
What's Changed
- headless mpc: start pulling QT out of MultiPointController and Worker by @ianohara in #305
- MultiPoint*: Remove all QT usage, and cleanup unused/duplicate/broken abstractions by @ianohara in #304
- update Xeryon stage settings by @Alpaca233 in #311
- bug fix: Run Spot Detection by @Alpaca233 in #310
- feat: use software crop in AbstractCamera by @Alpaca233 in #309
- fixes: this fixes some issues with Microscope after all the qt-less refactoring by @ianohara in #313
- ScanCoordinates: Remove qt usage by @ianohara in #314
- ScanCoordinates: Consolidate SiLA2 scan coordinates functionality into a subclass by @ianohara in #315
- tools: get a basic microscope_stress_test working (with an acquisition) by @ianohara in #316
- fix naming typo: CELESTA config by @Alpaca233 in #312
- cameras: Tucsen Aries series support (genicam) by @Alpaca233 in #307
- move microcontroller initialization code out of gui by @Alpaca233 in #321
- bug fix: illumination always turns on when software starts by @Alpaca233 in #323
- update configuration file by @Alpaca233 in #325
- Andor camera, laser engine, and Dragonfly support by @Alpaca233 in #320
- update README by @Alpaca233 in #322
- update README by @hongquanli in #326
- update README images by @Alpaca233 in #327
- contrast autofocus: pull QT out of the base contrast and remove qt from related tests by @ianohara in #331
- microcontroller: force int as a bandaid, warn on non int arg to pid by @ianohara in #318
- bug fix: Calibration Live Viewer cannot be opened from Sample Format dropdown by @Alpaca233 in #328
- bug fix: laser af using other spots in averaging by @Alpaca233 in #329
Full Changelog: v0.5.5...v0.5.6
v0.5.5
What's Changed
- utils: TimingManager and Timer helper by @ianohara in #249
- microscope mode selection: do it directly, and only use signals for ui updates by @ianohara in #241
- MultiPointWorker: Use callbacks for image processing so we can trigger faster by @ianohara in #242
- mpw: remove blocking queue on qt signal by @ianohara in #248
- MultiPointWorker: Use trigger-time and move-time positions throughout. Do not recapture. by @ianohara in #250
- formatting: fix after merge train by @ianohara in #257
- close cameras explicitly on exit by @Alpaca233 in #255
- bug fix: Prior stage config update; Daheng camera model support by @Alpaca233 in #259
- z position plot error handling by @Alpaca233 in #260
- bug fix: gui connections for selecting microscope mode by @Alpaca233 in #263
- add Tenengrad focus measure option by @Alpaca233 in #258
- show a dialog for confirmation on close by @Alpaca233 in #264
- home x first to make sure stage is clear for homing by @Alpaca233 in #265
- fix test error caused by dialog window on close by @Alpaca233 in #266
- updated Tucsen FL26-BW camera support by @Alpaca233 in #267
- ui clean up: move some stage buttons to menu bar by @Alpaca233 in #268
- add a button to show/hide well selector by @hongquanli in #269
- line profiler - keep manual range if manual range is specified by @hongquanli in #270
- Octopi bug fix by @Alpaca233 in #271
- use characterization mode when laser af is not enabled by @Alpaca233 in #273
- startup xy and objective switcher sequence update by @hongquanli in #274
- gui: Make sure laser af attribs are set to none by @ianohara in #275
- cameras: default: fix strobe and exposure by @ianohara in #276
- Update Microscope class by @Alpaca233 in #277
- main_hcs: remove commented out code by @ianohara in #278
- apply gaussian filter before spot detection by @Alpaca233 in #280
- Gaussian filter fix by @Alpaca233 in #281
- gui: use the primary screen for initial window size by @ianohara in #279
- cameras: toupcam: fix timing to respect camera "trigger delay" and fix hardware triggering by @ianohara in #282
- MultiPointWorker: protect against in flight triggering by @ianohara in #283
- multi process jobs: Add in a job and job runner mechanism for processing images on separate processes by @ianohara in #285
- utils: Timer: print in insertion order, include total time, and right align by @ianohara in #284
- bug fix: update exposure time whenever trigger mode is changed by @Alpaca233 in #290
- bug fix: default trigger mode by @Alpaca233 in #286
- ux improvement: minor changes for multipoint acquisition widgets by @Alpaca233 in #291
- crop laser AF image before auto initialize by @Alpaca233 in #287
- bug fix: wellplate calibration widget by @Alpaca233 in #294
- bug: toupcam: do not double up on cam exposure time by @ianohara in #296
- acquisitions: wait for frames when using non-hw triggering by @ianohara in #288
- headless: reverse relationship between gui <-> microscope so we can have a truly headless api by @ianohara in #289
Full Changelog: v0.5.4...v0.5.5
v0.5.4
What's Changed
- snap image bug fix by @hongquanli in #238
- Binning and cropping in AbstractCamera class by @Alpaca233 in #217
- bug: fix crop_width and crop_height usage (they no longer exist) by @ianohara in #239
- logging: add thread id to our log lines by @ianohara in #240
- update camera model config and restore open camera by model by @Alpaca233 in #243
- camera bug fix: temperature reading; Hamamatsu model config; Squid configuration file by @Alpaca233 in #244
- use AbstractCamera class for Tucsen camera by @Alpaca233 in #246
- Hamamatsu camera: binning and resolution updates by @Alpaca233 in #247
- use AbstractCamera class for Kinetix camera by @Alpaca233 in #251
- cameras: Hamamatsu tested; add get_available_pixel_formats() by @Alpaca233 in #252
- add support for multi-page tiff by @hongquanli in #253
- fix Kinetix ROI by @Alpaca233 in #254
- camera fix: Kinetix camera set exposure time and Hamamatsu camera get exposure time range by @Alpaca233 in #256
Full Changelog: v0.5.3...v0.5.4