Today we’re releasing our Microscope Server v2.9, and new Raspberry Pi SD images.
Server 2.9
To upgrade your microscope to the latest application, please run
sudo ofm update
sudo ofm upgrade
from your microscope shell.
New SD images
You can download our latest SD images from https://openflexure.org/projects/microscope/build
Changelog
New features
-
Log viewer now includes a level filter
-
Added a persistent option to invert keyboard movement directions
-
Added a persistent stage backlash and settle time settings
-
Added stream resolution and capture JPEG quality settings
-
Added advanced stream bitrate and framerate controls
-
Added functionality to download a lens-shading table as a PNG image
Developer notes
A large part of this release is a deep cleanup of the code. While the changes run deep into the code, there are 3 key elements worth developers noting:
Typing and static analysis
We now make extensive use of static type analysis within our Python code, to catch potential bugs early on and enforce best practices. Merge requests will fail if mypy
or pylint
fail.
The full suite of checks can be run locally with poetry run poe check
. This will also perform automatic code formatting.
Removed internal background threads
Previously, our live stream was handled by a background thread in charge of processing new frames, and synchronising with clients. In the last release, we removed the use of threading in our fast-autofocus method by using a custom file-like object to store frame data. This has now been extended to the rest of the server code. Live stream frames are written to a custom stream object which handles synchronisation, frame size measurements for autofocus, and discarding old data automatically.
Simplified extension loader
In previous releases, extensions were loaded by implicitly searching for instances of an extension class and attaching them to the server. This promoted bad practices as extension files needed to hold a global instance of the extension object.
In this release, we are promoting the development of extensions as subclasses of BaseExtension
. A new global LABTHINGS_EXTENSIONS
list in the root of the extension file contains the extension classes themselves, not instances. When the server loads an extension, it searches for extension classes in this list, and creates an instance at runtime.
Documentation has been updated to reflect this pattern, though this release remains fully backwards compatible (a warning will be logged for each extension loaded using the old system).
Changelog
Developer changes
Extension loader
- Updated default extensions to subclass structure (8d0759e)
Testing
- Added basic unit tests of non-integrated functions (5137d1b)
Static analysis
- Added extra type hints (7ba3f44)
- Added numpy types (63b633b)
- Added type hints to CSM extension (311366c)
- Fixed types in move_rel method (ac667c3)
- Static type analysis (7866ec0)
- Stricter runtime type checks (f2a2d88)
Documentation
CI/CD
- Added eslint and cache to CI (f5012cd)
- Added job explanation comments (c1e17de)
- Added poetry to script environment (3814e7d)
- Allow code quality jobs to retry (f15a5c7)
- Fixed JS artifact path (3a90a42)
API functionality
- Added API route to convert LST to PNG (4d40e81)
JS Client
New functionality
- Added log level filter (4d1d0a1)
- Added options to invert navigation steps (d49b34e)
- Added backlash and settle time settings (c0fcd22)
- Added capture quality settings (0f7cecb)
- Added MJPEG bitrate setting (42e0dfd)
- Added Advanced bitrate controls (d2488c5)
Fixes
- Fixed global state and scrolltotop (ef9f257)
- Fixed individual captures creating ‘undefined’ dataset (213dec3)
- Fixed onError propagation (08f6532)
- Fixed onScanError (1de6b2a)
- globalUpdateCaptures after scan (599c315)
- Handle missing this.$refs.textboxKey ref (9d04842)
- Fixed IHI tab icon duplication bug (e17366d)
Design/style
- Added custom h4 formatting (4ba4403)
- Rearranged element layout (455b868)
- Rearranged settings and added LST download (f0a3127)
Internal cleanup
- Common watch format (3e783c5)
- Removed unneeded plugin:vue/essential (358d441)
- Removed unused webcomponent support (f187a3a)
-
- Moved backlash settings (a2f8158)
Server
Features
- Added mjpeg bitrate to settings (3e2f876)
- Watch for broken frames using JPEG end bytes, and log error (6838038)
- Added API route to convert LST to PNG (4d40e81)
- Return LST as a file (aba3eb3)
Fixes
- Fixed “classic” autofocus ‘PiCameraStreamer’ object has no attribute ‘annotate_text’ error (58b2967)
- Fixed broken dataset rendering if key exists but is empty (fd42e2e)
- Fixed camera settings read (25d3b15)
- Fixed get_locations method reference (d288484)
- Fixed SangaDeltaStage type annotations (9659c45)
- Fixed tile method reference (18a0eed)
- Handle missing endpoints (bc39277)
Internal API changes
- Deprecated camera
start_worker
andget_frame
methods- Added
start_worker
andget_frame
aliases for compatibility (bc9b80d)
- Added
- Replace top-level actions View with builtin LabThings (421a2e3)
- Updated to LabThings 1.2.1 (249e301)
Internal cleanup
- Remove separate camera stream thread (021745d)
- Cleaned up code layout (da62126)
- Cleaned up main app setup (e464086)
- Cleaned up store and removed unused FoV setting (a1ae947)
- Code formatting (dd81640)
- Fixed unused imports (b2192b2)
- Integrated CSMExtension (9203545)
- Moved frames_iterator scope (3058c67)
- Moved gen() into streams.py (c9c29a7)
- Only use CompositeLock for microscope lock (e433a89)
- Reduced logging level of some mock camera notices (8eff136)
- Removed old console logs (2e34722)
- Removed old picamera_lst_path attribute (85f77fa)
- Removed pointless abstract method implementations (6d1f019)
- Removed unused pynpm package (6819ded)
- Tweaked deprecation warnings (a844efc)
- Updated dependencies (3c3ecd7)