CHANGELOG
This file contains the list of changes made to the Joulescope driver.
2.2.4
2026 Jun 1
Improved minibitty info command.
Bumped JS320 firmware to 0.6.4.
2.2.3
2026 May 30
Fixed WARNING log entries on Window’s device close.
Fixed WARNING log message on USB reconnect.
2.2.2
2026 May 30
Improved JS320 calibration logging.
2.2.1
2026 May 29
Modified offset calibration to save/restore state once, not every point.
2.2.0
2026 May 29
Added JS320 current and voltage offset calibration.
2.1.2
2026 May 28
Added fwup/js320/version topic to JS320 devices to support introspection.
Bumped node.js dependencies.
2.1.1
2026 May 26
Fixed small errors introduced by buffer_signal.c for JS320
Quantization error on standard deviation
Correctly weight summaries by number of samples rather than equal weight
2.1.0
2026 Apr 27
Added Windows 11 ARM build.
2.0.7
2026 Apr 27
Improved firmware update for the JS320.
Added pyjoulescope_driver program support for JS320.
Improved JS320 fwup progress reporting.
2.0.6
2026 Apr 25
Fixed firmware update.
Modified JS320 fwup to use image slot 1 in external SPI flash.
Switched to RAW open mode.
2.0.5
2026 Apr 24
Added latest stable JS320 firmware to image on release.
fwup/@/!add: response payload changed from int32 rc to an 8-byte struct
{int32_t rc, uint32_t worker_id}so callers can subscribe to the specificfwup/NNN/statustheir request spawned. zip_size of 0 in the add header now uses the JS320 firmware embedded in the driver instead of caller-supplied bytes; stub builds return JSDRV_ERROR_UNAVAILABLE.example/minibitty fwup: accept
-as the package path to program with the driver’s embedded firmware.Improved RAW open mode support.
Fixed example minibitty firmware and fpga_mem to open in RAW mode.
2.0.4
2026 Apr 21
Fixed SEGFAULT on macOS and crash on Linux detected by fuzz test.
2.0.3
2026 Apr 20
Breaking API changes
jsdrv_stream_signal_s: added 8-byte preamble (version + reserved) so sample_id stays 8-byte aligned. JSDRV_STREAM_HEADER_SIZE changed from 48 to 56. All consumers that depend on the struct layout must be rebuilt.
Switched tmap to copy-on-publish. Removed jsdrv_tmap_ref_incr, jsdrv_tmap_ref_decr, jsdrv_tmap_reader_enter, and jsdrv_tmap_reader_exit. Added jsdrv_tmap_free and jsdrv_tmap_copy. jsdrv_buffer_info_s.tmap is now a consumer-owned snapshot that the consumer must free with jsdrv_tmap_free().
jsdrv_calibration_hash now returns int32_t (was void). Returns JSDRV_ERROR_PARAMETER_INVALID when msg or hash is NULL, or when length is 0 or not a multiple of 32 bytes.
jsdrv_subscribe: flags == 0 is now treated as the common default (JSDRV_SFLAG_PUB | JSDRV_SFLAG_RETAIN) instead of subscribing silently to nothing. Callers who want no callbacks (rare) must pass a non-zero mask that excludes JSDRV_SFLAG_PUB.
jsdrv_log_publish: level parameter type changed uint8_t -> int8_t to match the rest of the log API and preserve the signed JSDRV_LOG_LEVEL_OFF = -1 value.
jsdrv_thread_create: priority parameter type changed int -> int32_t.
jsdrv_thread_is_current: parameter type changed jsdrv_thread_t const * -> const jsdrv_thread_t *.
error_code.h: jsdrv_error_code_name and jsdrv_error_code_description parameter type changed int -> int32_t.
cstr.h: every return type changed int -> int32_t; every char const * parameter changed to const char *.
jsdrv_statistics_s.rsv3_u8 field renamed to rsv3_u32 to match its uint32_t type.
Header guard macros JSDRV_OS_H_ renamed to JSDRV_OS_H to avoid ISO C §7.1.3 reserved identifiers.
os_thread.h macros THREAD_RETURN_TYPE / THREAD_ARG_TYPE / THREAD_RETURN() renamed to JSDRV_THREAD_RETURN_TYPE / JSDRV_THREAD_ARG_TYPE / JSDRV_THREAD_RETURN() to remove global-namespace pollution.
New APIs
jsdrv_union_copy() — copy a jsdrv_union_s into caller-owned storage; safe replacement for aliasing callback pointers.
jsdrv_tmap_free(), jsdrv_tmap_copy() — replace the ref-counted lifetime and reader/writer sections.
JSDRV_TIMEOUT_MS_ASYNC constant (value 0) for self-documenting asynchronous calls.
New features
Added MiniBitty support for 3rd generation Joulescope products.
Added externally available OS abstraction in include/jsdrv/os_*.h (sem, event, mutex, thread, atomic).
Implemented jsdrv_meta_syntax_check() (previously a stub).
File layout
Moved device-specific files into src/devices/{js110,js220,js320, mb_device}/ (similarly in include_private/jsdrv_prv/devices/ and test/devices/). No code logic changed.
Fixed
Latent segfaults on force disconnects.
jsdrvp_msg_free now also frees info.tmap for BUFFER_INFO payloads (previously only BUFFER_RSP, which leaked one tmap per info publish).
jsdrvp_msg_clone now deep-copies info.tmap for BUFFER_INFO / BUFFER_RSP payloads so clones and originals each own an independent instance.
Missing JSDRV_API qualifier on os_event.h and os_mutex.h public functions; on Windows DLL builds, those symbols were not exported.
Documentation rot: jsdrv_union_eq reference to non-existent eq_strict; jsdrv_union_widen copy-pasted description; stale “deprecated time_map” comment; “length in invalid” typo in error codes.
jsdrv.h now includes jsdrv/error_code.h.
Contract documentation (no code change)
jsdrv_subscribe_fn: callback payload and every pointer reachable through it (including jsdrv_buffer_info_s.tmap) are valid only for the duration of the callback. Copy before returning.
jsdrv_statistics_s / jsdrv_stream_signal_s / jsdrv_buffer_info_s / jsdrv_buffer_request_s / jsdrv_buffer_response_s: consumers MUST check the version field; future versions only repurpose reserved fields or append.
jsdrv_publish / subscribe / unsubscribe / open / close timeouts: JSDRV_TIMEOUT_MS_ASYNC (0) is asynchronous; timeout > 0 is synchronous and guaranteed complete on return. The return code reflects synchronous processing only.
jsdrv_finalize: the context is no longer usable after return, regardless of status. Nonzero status may indicate leaked resources.
jsdrv_unsubscribe: cbk_fn AND cbk_user_data must both match the values passed to jsdrv_subscribe; silent success on mismatch.
1.12.0
2026 Jan 5
Added JS220 sample publish rate h/fp.
Updated node package versions to address flagged security vulnerabilities.
1.11.0
2025 Dec 2
Added Python 3.14 support and dropped Python 3.10 support.
Update build dependencies.
Added time64.as_isostr()
1.10.0
2025 Jul 15
Added Typescript support. Thanks @biosbob !
1.9.4
2025 Jul 7
Fixed tmap NULL pointer reference (Joulescope UI 321).
1.9.3
2025 May 19
Implemented “–set” option to record entry point.
Changed “UTC add is not monotonically increasing” log errors to warnings and reduced frequency.
1.9.2
2025 May 6
Fixed self->tmap NULL pointer access in jsdrv_bufsig_info.
Added NULL pointer handling to tmap.
1.9.1
2025 Apr 9
Handle 500 ksps on-instrument downsampling by forcing to 250 ksps.
Fixed time sync inaccuracy by including FPGA 1.3.3
handle large update gaps
bound error on sampling rate
1.9.0
2025 Mar 29
Fixed TimeMap.get() in Python binding.
Deprecated jsdrv_buffer_info_s.time_map. Use tmap.
Renamed jsdrv_tmap_size to jsdrv_tmap_length.
Changed jsdrv_tmap_get() signature.
1.8.0
2025 Mar 27
Added improved time mapping to keep buffer time map consistent.
Added jsdrv/tmap.h, tmap.c and tmap_test.c.
Added jsdrv_buffer_info_s.tmap field.
Added jsdrv_buffer_info_s.decimate_factor field.
Maintained jsdrv_buffer_response_s.info.time_map functionality.
Added Linux ARM64 builds.
1.7.4
2025 Mar 4
Fixed memory leak on every JS220 command.
Increased JSDRV_STREAM_DATA_SIZE from 64 kB to 256 kB to support larger buffer requests.
1.7.3
2025 Jan 7
Fixed memory leak on JS220 repeated open without close.
Fixed setup.py links (fixes PyPi links).
1.7.2
2024 Dec 10
Fixed time sync inaccuracy by including FPGA 1.3.2
1.7.1
2024 Nov 25
Fixed memory leak on error condition for Windows backend.
Removed unused file device.h.
Fixed time sync inaccuracy by including FPGA 1.3.1
1.7.0
2024 Nov 8
Added support for JS220 on-instrument downsampling with fw 1.3.0 & fpga 1.3.0
Migrated to numpy 2
Added Python 3.13 support
Dropped Python 3.9 support
Added arbitrary scaler for current & voltage
1.6.0
2024 Oct 18
Added support for notes to Record class and record entry point.
Added user_data parameter to Record.open().
Added “–note” option to record entry point.
1.5.6
2024 Sep 20
Reduced log verbosity for some JS220 messages.
Added js220_i128_is_neg.
1.5.5
2024 Aug 22
Modified Python record entry point to use all connected Joulescopes by default. Use the “–serial_number” argument to record from a specific Joulescope when the host computer has more than one Joulescope connected.
Catch exceptions on pyjoulescope_driver callbacks to Python code.
1.5.4
2024 Jun 28
Pinned numpy version dependency to < 2.
1.5.3
2024 May 28
Improved libusb (macOS, linux) backend message processing.
Handle closed command queues to improve firmware update reliability.
Added device command queues to poll for improved performance.
Handle all pending device commands with each pass.
1.5.2
2024 May 8
Added “capture” subcommand to jsdrv example executable.
1.5.1
2024 Apr 27
Fixed JSDRV_DOWNSAMPLE_MODE_AVERAGE glitches due to C type conversion.
Fixed incorrect downsampling initialization.
1.5.0
2024 Apr 24
Added node.js binding.
Fixed downsampling to round to nearest integer for integer types.
Added downsampling mode JSDRV_DOWNSAMPLE_MODE_AVERAGE, but not yet connected.
1.4.10
2024 Mar 20
Fixed JS110 to only issue one CTRL IN status request at a time.
1.4.9
2024 Mar 18
Refactored record entry point.
Fixed JS110 performance degradation (blocking status in device thread) #8
1.4.8
2024 Feb 26
Fixed python statistics entry point to remove 1.0 second default duration.
1.4.7
2024 Feb 14
Initialized buffer_mgr_s instance_.context to NULL.
Improved python binding error reporting.
Added optional duration to statistics entry point.
Bumped minimum pyjls version from 0.8.2 to 0.9.2.
1.4.6
2023 Dec 9
Fixed timestamp on POSIX (macOS, linux) systems.
1.4.5
2023 Dec 8
Fixed stream buffer use-after-free and remove timeout.
Added fuzz tester.
1.4.4
2023 Dec 7
Improved J110 & JS220 state reset on open. Fixes JS110 fixes UTC time sync.
Fixed JS220 communication reliability with FPGA 1.2.1 and FW 1.2.1.
Improved JS110 time map for long-term stability.
1.4.1
2023 Nov 30
Fixed JS220 “h/fs” restore.
Improved JS220 UTC time sync with FW 1.2.0 & FPGA 1.2.0 support.
Improved JS220 skip / drop sample handling.
1.4.0
2023 Nov 11
Added jsdrv_calibration_hash and pyjoulescope_driver.calibration_hash.
1.3.21
2023 Nov 10
Updated to FW 1.1.1.
Added measure entry point to pyjoulescope_driver.
1.3.20
2023 Oct 26
Updated to FPGA 1.1.0 for beta release (was mistakenly left at 1.0.4).
1.3.19
2023 Oct 25
Fixed help text for “program” entry point.
Build for Python 3.12.
Upgraded to FW & FPGA 1.1.0 stable releases.
Upgraded record entry point to pyjls 0.8.2 to 1.0.0.
1.3.18
2023 Jul 24
Fixed buffer_signal summaryN incorrect when computing multiple values in a single call.
Added “noexcept” to python callbacks. Cython 3.0 deprecates implicit noexcept.
1.3.17
2023 Jul 11
Fixed “in frame_id mismatch” warning log message on first frame.
Fixed JS220 signal “s/X/ctrl” 0 not correctly closing signal.
Added Record “auto” parameter to optionally bypass automatic signal enable/disable.
1.3.16
2023 Jun 14
Parallelized GitHub Actions build. Removed cibuildwheel.
Fixed JS220 statistics for macOS. 1.3.15 was segfaulting on unaligned accesses.
Added args parameter to pyjoulescope_driver.main.run().
Added quit_ handling to jsdrv.exe examples.
Bumped pyjls version check from 0.7.0 to 0.7.2.
1.3.15
2023 Jun 8
Fixed JS220 firmware images omitted by 1.3.14 build process changes.
Changed firmware image download to script invoke, not import.
1.3.14
2023 Jun 8
Improved documentation.
Improved GitHub Actions build process.
Moved test/jsdrv_util to example/jsdrv.
Bumped minimum python version from 3.8 to 3.9.
1.3.12
2023 May 31
Reduced libusb backend log level. Was too active for JS110 statistics.
Bumped JLS version to 0.7.0.
1.3.11
2023 May 24
Added JS110 on-instrument (sensor) statistics option #3.
1.3.10
2023 May 19
Improved threading and priorities on Windows.
Improved Windows timer resolution (timeBeginPeriod).
1.3.9
2023 May 17
Fixed installation on Ubuntu #6.
1.3.8
2023 May 16
Updated info entry point.
Added automatic include path for jsdrv static CMake builds.
Added support for building a shared library. Initialize build subdir with “cmake -DBUILD_SHARED_LIBS=ON ..”
1.3.7
2023 Apr 28
Fixed “info” entry point to correctly display multiple Joulescopes.
Fixed “record” entry point to correctly add first UTC timestamp.
Cleaned up build & install process (needs more work).
1.3.6
2023 Apr 27
Fixed JS110 sample_id for downsampled 1-bit channels.
Updated to pyjls 0.6.1 for improved robustness.
1.3.5
2023 Apr 26
Added JS220 FW 1.0.7 and FPGA 1.0.4 as alpha & beta.
1.3.4
2023 Apr 26
Fixed record jls version check.
Send buffer signal clear on free.
Updated to pyjls 0.6.0.
Fixed pyjoulescope_driver.record to not remove sample_id offset.
1.3.3
2023 Apr 19
Cleared all message fields at allocation.
Added api_timeout entry point test.
Improved thread entry point test.
Reordered unsubscribe to ensure callback validity.
Added malloc/free mutex for guaranteed thread safety.
Added runtime pyjls version check.
Improved logging robustness and thread safety.
Fixed JS110 open causing IN+ to OUT+ disconnect.
Added JS110 open modes: defaults, resume.
1.3.2
2023 Apr 13
Improved record close error handling.
Added JS220 streaming data ignore when device not open.
Improved record entry point.
Open in “defaults” mode by default with optional “restore”.
Added parameter “–set” option.
1.3.1
2023 Apr 4
Decreased JS110 status polling interval to reduce USB message spamming.
Added JS110 streaming when only statistics requested (uses host-side stats).
Increased process priority and backend thread priority for Windows.
1.3.0
2023 Mar 30
Added pyjoulescope_driver.time64 module (from UI).
Fixed buffer_signal summary_get handling on zero size.
Added “record” module and entry point to record streaming samples.
Fixed buffer_signal range advertisement when empty.
Improved skipped / duplicate sample handling for JS220.
1.2.2
2023 Mar 19
Fixed intermittent timeout broken for API calls.
1.2.1
2023 Mar 16
Truncate memory buffer sample responses that are too long (segfault).
Fixed buffer signal shift correction overflowing buffer (segfault).
Fixed garbage data at end when shift required for u1 and u4 data types.
Fixed zero length message send for highly downsampled signals.
1.2.0
2023 Mar 9
Added memory buffer for f32, u4, u1 data types.
Bumped python support (3.8 - 3.11). Dropped 3.7.
Added API struct jsdrv_time_map_s and functions jsdrv_time_from_counter(), jsdrv_time_to_counter.
Added jsdrv_time_map_s to jsdrv_stream_signal_s and jsdrv_statistics_s.
Added host-side time map.
Fixed JS110 sample stream message size.
Fixed buffer_signal sample and utc response time entries.
1.1.4
2023 Jan 25
Added JS110 GPI read request: s/gpi/+/!req -> s/gpi/+/!value.
Fixed incorrect topic match on {device}/@/!finalize
1.1.3
2023 Jan 24
Fixed open to correctly handle error on lower-level device open.
Improved statistics output to include time/sample_freq and time/range.
Reduced DEVICES_MAX for libusb backend to prevent breaking select.
1.1.2
2022 Dec 20
Fixed i128 math functions js220_i128_neg() and js220_i128_lshift().
Fixed incorrect constant for platforms with i32 constants.
1.1.1
2022 Nov 30
Fixed build dependencies.
Specified python 3.10 for GitHub actions.
1.1.0
2022 Nov 11
Modified jsdrv_stream_signal_s (requires app recompile).
Fixes pyjoulescope and pyjoulescope_ui integration.
Added sample_rate.
Added decimate_factor.
Added JS220 host-side downsampling.
Rename JS110 topic s/fs to h/fs, matches new JS220 topic.
Fixed old JS220 data sent on stream enable after disable.
Added free for partial input stream messages on device close.
Fixed firmware image include and added pkgdata load check.
1.0.7
2022 Nov 8
Improved documentation.
1.0.6
2022 Nov 2
Fixed build from tar.gz package.
Updated README.
1.0.5
2022 Nov 1
Fixed JS110 current range processing for window N and M.
Fixed JS110 sample alignment.
Fixed JS110 statistics generation time and rate.
1.0.4
2022 Oct 30
Added JS220_CTRL_OP_DISCONNECT for cleaner disconnect/reconnect. Requires js220_ctrl firmware 1.0.4, no effect on earlier versions.
Fixed JS110 support.
Improve firmware update support.
1.0.3
2022 Oct 24
Fixed linux by disabling BULK IN timeout. Linux was losing data on timeout. Fixed cancel, which still allows graceful shutdown.
Added JS110 downsampling on host.
Switched from obsolete pypiwin32 to pywin32.
Fixed js110_sp_process when i_range was off or missing.
1.0.2
2022 Oct 15
Fixed jsdrv_util app_match to work with multiple Joulescopes.
1.0.1
2022 Oct 9
Added native and python threading demonstrations.
Improve python binding to support u64 and i64 types.
Added firmware/gateware updates.
Added build support for including most recent firmware images.
Added “program” entry point.
Fixed access violation on publish to close device.
Fixed python Driver.device_paths returning [“”] instead of [] when no devices found.
Reduced bulk in error on device removal to warning.
1.0.0
2022 Oct 6
Fixed JS220 power computation.
Fixed trigger GPI spec (7 not 255).
Fixed sample_id 32-bit rollover handling.
Added publish bytes support (needed for memory writes).
0.2.7
2022 Oct 4
Added host-side power computation to JS220.
Improved JS110 driver to provide current_range, gpi0, gpi1.
Fixed power, charge and energy computation. Power fixes require FPGA 0.2.6 upgrade.
Fixed JS110 stop/start streaming.
Added JS110 statistics.
0.2.6
2022 Sep 29
Reduced POSIX file descriptor limit request to 4096 max.
0.2.5
2022 Sep 26
Fixed process hang due to logging on macOS & Linux.
Fixed device disconnect for macOS & Linux.
Increased file handle limit on macOS & Linux.
0.2.4
2022 Sep 24
Added responder for removed devices.
Fixed JSDRV_MSG_DEVICE_ADD retained subscribe. Was sending each device then full comma-separated list.
Added check for API call from jsdrv frontend thread.
0.2.3
2022 Sep 21
Fixed support for multiple (not just first found) of same device type.
Improved JS110 support.
Added macOS and Linux support using libusb library.
0.2.2
2022 Sep 9
Completed JS220 memory read operation.
Completed JS220 memory erase operation.
Modifed jsdrvp_msg_alloc_value to support heap allocated values, not just jsdrv_publish(). Needed for read data messages.
Added jsdrv_topic_remove().
Completed controller-side signed & encrypted & signed firmware update.
Move UI to private repository. Need to avoid Qt dependencies here.
Removed “noise.py” entry point, which is not meaningful to end users.
Added python command-line –log_level and –jsdrv_log_level options.
Fixed python publish string values encoding.
Improved native metadata validating to accept integer values as strings.
Renamed python “set.py” to “set_parameter.py” to avoid reserved word “set”.
Added JS220 “opening” state to “h/state” metadata.
Simplified native jsdrv_util set to use native support for string values.
Fixed driver based upon beta build feedback.
Fixed JS220 handling of missing/duplicated sample ids.
Converted to element_size_bits from element_size_pow2.
Added GPIO streaming support (u1 data type).
Redefined JSDRV_DATA_TYPE_FLOAT to align with JLS v2.
Reduced logging verbosity.
0.2.1
2022 Aug 1
Initial public commit.