Changelog#
All notable changes to this project will be documented in this file.
The format is based on Keep a Changelog, and this project adheres to Semantic Versioning.
0.1.0a14 - 2026-07-24#
Added#
Bpodpublishes live trial events over the PUB/SUB channel as a tagged union of typed messages.RemoteBpodaccepts anevent_callbackthat receives each live trial-event message.ServiceHost.get_metadatafor accessing per-request connection metadata from within a request handler.ServiceHost.publishfor broadcasting events over the PUB/SUB channel;ServiceClientdecodes them per its newevent_typeparameter.ServiceHostremembers the TCP ports last bound for a caller-supplieduuid(stored in the user state directory) and reuses them on restart; explicitport_rep/port_pubarguments take precedence.ServiceHost.has_subscribers: the host tracks PUB/SUB subscriptions andpublishdrops messages before encoding while nobody is listening.ServiceClient.requestaccepts an optionaltimeout; the client recovers cleanly after a timed-out request.
Changed#
Add UTC timezone to trial DataFrame timestamps.
ServiceClientadopts the host’s serialization format during the handshake, replacing the per-request trial-and-error fallback.the WELCOME handshake carries the PUB channel’s TCP port instead of full TCP addresses.
errors raised by
bpod_core.ipcare now uniformlyServiceErrorsubclassesremote method calls (
BpodRequestCall/BpodRequestData) are validated against an explicit allowlist instead of dispatching to arbitrary attributes.
Fixed#
ServiceClientno longer blocks indefinitely when the host dies mid-request.exceptions with non-serializable attributes no longer break error replies from
ServiceHost.resolved several shutdown races between
close()and the event threads /publish().ServiceIterator.close()now terminates an iteration blocked in__next__(e.g., withtimeout=None) instead of leaving the consumer waiting forever.
0.1.0a13 - 2026-06-18#
Changed#
further work on bringing
RemoteBpodto parity withBpod.ExtendedSerial.read_structandwrite_structmethods accept precompiled structs.reduced public interface of
bpod_core.ipc.improved documentation.
0.1.0a12 - 2026-04-30#
Just some minor improvements …
Changed#
further refinements to documentation.
cleaned up rendering of Graphviz graphs.
Removed#
removed unused
misc.DocstringInheritanceMixin
0.1.0a11 - 2026-04-24#
Added#
ExtendedSerial.read_struct_iterandExtendedSerial.stream_structmethods.misc.SuggestionDictfor key lookup with typo suggestions.added optional
trial_numberparameter toBpod.runmethod.
Changed#
replaced
NamedTupleswithmisc.SuggestionDictforBpod.inputsandBpod.outputsrefactored Sphinx documentation and API reference.
0.1.0a10 - 2026-04-16#
Added#
Bpod.address property — exposes the ZeroMQ address of the running instance.
Bpod.peek_data- read trial data before trial end.misc.ByteEnum- an extendedIntEnumthat caches its values as bytes.Timer fields in StateMachine now accept timedelta values in addition to floats.
bpodCLI entry point for launching a Bpod instance that can be connected to via TCP Unix Sockets.state machinecolumn added to trial data output (hash of the FSM)
Changed#
renamed
Bpod.send_state_machinetoBpod.run.removed
Bpod.run_state_machine.switched to Polars
LazyFramefor storing trial data.replaced use of
QueuewithSimpleQueue.switched
Bpod.modulefield fromNamedTupletodict.replaced hashlib.blake2b with xxhash for state machine hashing.
cache validation and compilation of state machines.
StateMachine.hashnow returnsbytesinstead ofstr.
0.1.0a9 - 2026-04-02#
Added#
bpod.is_readyproperty indicating whether a compiled FSM is loaded and ready to runbpod.is_queuedproperty indicating whether an FSM is queued to run after the current onebpod.get_datafor returning trial data after a state machine run.
Changed#
renamed
BNCinput events and output actions toTTLInandTTLOut.replaced MD5 hashing of
fsm.StateMachinewith blake2b.improved readability of
ValidationErrormessages infsm.StateMachine.state machine runs are now handled by three separate threads:
ReadThreadfor serial communication with the Bpod,EventThreadfor handling and structuring the incoming data, andSoftcodeThreadfor executing soft-codes.
Fixed#
reorganization of finalizers for better garbage collection.
0.1.0a8 - 2026-03-04#
Just a quick bugfix release …
Changed#
ipc.ServiceHost: set Zeroconf to listen on all interfaces, reorderWelcomeDatafields, and improve type hints.event handler callback type hint to return
Noneinstead ofAny.refactor CI workflows.
0.1.0a7 - 2026-03-01#
Added#
com.find_portsfor finding serial ports that match given filter criteria.com.verify_serial_discoveryfor checking if a serial device sends an expected discovery message.convenience functions for reading and writing integers in
com.ExtendedSerial.misc.extend_packedfor extending a bytearray by multiple values of the same format.misc.DocstringInheritanceMixinfor inheriting docstrings from base classes.ipc.LocalServiceAdvertisement: local service advertisement and discoveryipc.iter_servicesandipc.ServiceIteratorfor discovering services.bpod.discover_remote_bpodfor discovering remote Bpod instances.more examples.
Changed#
more verbose debug logging during state machine runs.
replace unmaintained
appdirsdependency withplatformdirs.switch to zero-based indexing for global counters, timers, conditions and soft-codes.
added file locking to
misc.SettingsDict.switch to using ZMQ multipart messages for communication.
renamed
ipc.DualChannelHost/ipc.DualChannelClienttoipc.ServiceHost/ipc.ServiceClient.restructured
bpodmodule into several submodules.zero-copy behavior on send path of
ipc.ServiceClientand receive path ofipc.ServiceHost.
Fixed#
decoupled finalizers and event loops from instance references.
0.1.0a6 - 2025-10-29#
Added#
Initial work on cached state machine validation:
fsm.StateMachine.check
Changed#
com.ExtendedSerialno longer supports NumPy types, integers, strings and iterables.refactoring of
com.ChunkedSerialReader
Removed#
com.to_bytesdependency on Pandas
0.1.0a5 - 2025-09-03#
Added#
fsm.to_fileandfsm.from_filefor export/import of state machines.YAML import/export for state machines
Work on documentation: Finite-State Machines
Changed#
moved state machine structure from msgspec Struct back to Pydantic Model
merged
fsm_typesmodule back intofsmrenamed parameters for
add_statemethod:state_change_conditions->transitionsandoutput_actions->actions
0.1.0a4 - 2025-08-25#
Added#
ipc.DualChannelHostandipc.DualChannelClientJSON import/export for state machines
example state machines
Changed#
improved export of state machines to graphviz
improved settings management
moved state machine structure from Pydantic Model to msgspec Struct
0.1.0a3 - 2025-08-04#
Added#
state machine assembly
state machine thread
ZMQ communication module
basic settings management
Changed#
switched package management from PDM to uv.
0.1.0a2 - 2025-05-07#
Added#
pydantic model for state machine
Changed#
further refactoring of the code
renamed
serialmodule tocomto avoid confusion with PySerial.
0.1.0a1 - 2025-04-22#
Changed#
major reorganization of the existing codebase.
renamed
serial_extensionsmodule toserial.
Removed#
removed
SerialSingletonclass.
0.1.0a0 - 2025-04-17#
First alpha release. Nothing works.