Skip to content

Releases: Cephla-Lab/Squid

Firmware v1.1

06 Mar 05:54
d30b2fd

Choose a tag to compare

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

06 Mar 05:54
ef375f2

Choose a tag to compare

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

26 Jan 04:15
1221c7e

Choose a tag to compare

v0.6.2 Pre-release
Pre-release

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

18 Jan 08:29
fbd9eda

Choose a tag to compare

v0.6.1 Pre-release
Pre-release

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

15 Jan 08:16
b352f0a

Choose a tag to compare

v0.6b Pre-release
Pre-release

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

28 Dec 10:40
67dfbf5

Choose a tag to compare

v0.5.8 Pre-release
Pre-release

What's Changed

New Contributors

Full Changelog: v0.5.7...v0.5.8

v0.5.7

17 Nov 05:59
28d00b8

Choose a tag to compare

v0.5.7 Pre-release
Pre-release

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

21 Sep 04:23
c4b34d8

Choose a tag to compare

v0.5.6 Pre-release
Pre-release

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

03 Aug 20:09
ca8a158

Choose a tag to compare

v0.5.5 Pre-release
Pre-release

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

31 May 21:48
77f6227

Choose a tag to compare

v0.5.4 Pre-release
Pre-release

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