Repository navigation
Releases: physwkim/bsrs
Release list
v0.5.7
Added
ServerBuilder::environment_hook— anEnvironmentHookthe server runs on
the engineenvironment_openhas just created, before that engine becomes
the environment. The engine is new on every open, so anything a client
installed on the last one (the beamline's suspenders, say) is gone, and the
client is not told the open happened; the hook puts the daemon that owns the
beamline in charge of preparing each engine. AnErrfrom the hook fails
the open and leaves the environment closed.
v0.5.6
Fixed
- A queued item keeps the arguments it was submitted with.
QueuedItem::plan
put the whole submitted body intoargs, so a client reading the queue back
found the plan's metadata nested one level down and rendered the columns it
fills -- sample, edge energy, point count -- as blank.argsandkwargs
are now separate fields andplan_args()recombines them forPlanFactory. - The running item is reported as the item that was queued.
current_item
replacescurrent_plan_namein the server state, soqueue_gethands back
the running item beside the pending ones instead of a name; a name is not an
item, and a client rendering the queue as one table had every column but the
plan empty on the one row that was actually running.
v0.5.5
v0.5.4
Fixed
- The queue continues past an item that opened no run. A queued plan whose
whole job is a side effect (a baremv, asleep) archives exit_status
no-run, whichexecute_queue_loopread as failure and halted on, so a
batch could not put its sample moves in the queue.item_completed()now
treatsno-runas finished in both the queue loop and
execute_single_item;plans_failedalready excluded it.
v0.5.3
Fixed
- The queue-server archives why a plan item failed.
run_plan_itemmapped
the run result to an exit status and droppedRunResult.reason(and the
error on theErrarm), sohistory_gettold a clientfailand nothing
else while the cause existed only in the daemon's log. The archived result
now carriesreasonon every arm, empty for a clean run.
v0.5.2
A dependency-refresh release. No bsrs code, API, or behaviour changes.
Changed
- Based the EPICS CA/PVA backends on
epics-rs0.29.3 (from 0.29.2). The
release makes a record's monitor state advance on every value-class post
whether or not the field has a subscriber, so a move that finished with no
.DMOVmonitor no longer swallows the next subscriber's 1→0 transition,
which is the done-PV wait everyca_motorput relies on. No bsrs source
change was needed. Cargo.lockmoveschacha20,derandspinoff their yanked versions
(0.10.1, 0.8.0, 0.9.8) to the compatible successors; none is a direct
dependency and no advisory names the old versions.
v0.5.1
A dependency-refresh release. No bsrs code, API, or behaviour changes.
Changed
- Based the EPICS CA/PVA backends on
epics-rs0.29.2 (from 0.29.1). The
release moves the SNL program start gate intoepics-base-rs
(spawn_programawaitswait_for_piniat the one spawn site), which is
what makes the mini-beamlinekohzuCtlboot with the right d-spacing; no
bsrs source change was needed. - MSRV is now 1.94 (from a declared 1.80). The old floor had been
unachievable since 0.24.3:epics-base-rsis edition 2024, so no toolchain
below 1.85 can build the CA/PVA backends at all. 1.94.0 is the channel
epics-rspins for itself, and the workspace is verified to build and test
on exactly that toolchain.
Fixed
- The 0.4.2 section's date: the tag and publish landed on 2026-09-04 (KST),
a day after the date the changelog carried.
v0.5.0 — monitorable devices, object-based declare_stream, epics-rs 0.29.1
Monitorable devices: Msg::Monitor now works end to end over the built-in
devices, from the Rust API and from Lua. Interrupts unwind through the plan
so finalize_wrapper cleanup runs on abort, suspenders are engine-owned and
persist across runs, every descriptor is shaped from its objects, and
declare_stream / collect resolve streams the way bluesky's bundler does.
Public signatures change, hence the minor version.
Changed
- Based the EPICS CA/PVA backends on
epics-rs0.29.1 (from 0.28.1). No
bsrs source change was needed for 0.28.2, 0.29.0 or 0.29.1. - Breaking:
Msg::DeclareStreamcarries the stream's objects
(StreamObjs::ReadableorStreamObjs::Collectable) instead of raw data
keys, so its descriptor gets their hints and configuration as bluesky's
declare_stream(*objs, name=, collect=)does;plans::declare_stream(name, objs)and the Luamsg.declare_stream(name, {devices}, [collect])follow.
A collectable must collect into exactly the declared stream.
StreamObject::from_data_keysis replaced byStreamObject::objectless,
used only for the interruptions stream. collectresolves its stream through whatdeclare_streamdeclared for
the object, as bluesky's_declared_stream_names: a namedcollect
requires that name to have been declared for the object, an unnamed one
takes the single declared stream and skipsdescribe_collect, and an
undeclared object still describes and declares its nested streams.- Breaking:
Subscription::newtakes a third argument, the data key of
the readings it streams, exposed asSubscription::key. The engine keys
every monitor Event by it and fails the run whendescribe_dyndoes not
declare that key. - Breaking:
Registry::register_positioneradditionally requires
MonitorableObjandStoppableObjand registers the object under both
facets. SoftDetector::tickreturns the reading it published.- Breaking:
ContingencySinkholds anOption<Thrown>(Thrown::Error
orThrown::Interrupt(kind, reason)) instead of an error string, and
contingency_wrapper'sexcept_planis anExceptPlanbuilt from the
Thrown, as bluesky'sexcept_plan(e)receives the exception.
run_wrappercloses an interrupted run with the interrupt's exit status
(abort,fail) rather than dropping it open. - Breaking:
Suspender::tripis required and the trait gainswatch,
tripped,justification,pre_planandpost_plan; the reference
suspenders loseinstall(self, re). Install through
RunEngine::install_suspender(Arc<dyn Suspender>) -> u64and remove with
remove_suspender(id)/clear_suspenders(); installed suspenders persist
across runs as bluesky'sRE._suspendersdo.SuspendCallbackmoved to
bsrs::core;suspend_until*take&self. - Breaking:
RunBundler::add_readings/add_configurationare replaced
byadd_read(StreamObject, readings), anddeclare_streamtakes
Vec<StreamObject>and returns theEventDescriptorit emitted. CaMotor::set_dyn,CaPositioner::set_dynandCaDetectorreturn a
pendingStatusat once and complete it from a task, so a multi-axismv
moves its axes together.
Added
MonitorableObjforSignal,SoftDetector,SoftMotor,CaDetector,
CaMotor,CaPositioner,PvaMotorandPvaDetector; motors and
positioners stream the readback.Registry::register_monitorableandRegistry::monitorable. Thebsrs
binary, the qs Lua manager andmini_beamline_qsregister soft detectors
under the facet, and every Lua device factory reports themonitorable
role.Registrytracks the stoppable, preparable, configurable and pausable
facets (register_stoppable/register_preparable/
register_configurable/register_pausableand the matching lookups),
and the daemon Lua state publishes them, sostop(),msg.prepare,
msg.configureandRE:register_pausablework on registry devices; a
--ca-motorinbsrs qs-managerhad nostop().CollectableObj::hint_fields(defaultNone);StandardDetectorforwards
its readable hint fields, so collect descriptors carry hints as bluesky's
maybe_update_hintsgives them.examples/mini_beamline/09_monitor_during.lua:bpp.monitor_duringover
aca_motor, aca_detectorand apva_detectoragainst the mini-beamline
IOC.
Fixed
- Engine: monitor Events are keyed by the device's described data key
rather than its name, so a detector's<name>_countsEvent matches its
Descriptor; a monitor emits the device's current reading as its first Event
(a newSignalCachelistener starts with the cached reading pending, as
ophyd'ssubscribe(run=True)does);Msg::Unmonitordelivers an update
still pending in the subscription before stopping the pump, where the
abort could drop every Event of a shortmonitor_duringscan under CPU
load. - Soft backend:
SoftDetectorcounts on everyread, socountand
scan(which read without triggering) no longer report 0 at every point.
SoftDetector,SignalCacheandSoftDetectorControlstore into their
watch channels withsend_replace, sincewatch::Sender::senddrops the
value while no receiver is alive (a reading published before the first
subscriber, a staged cache with no listener, an arm before
subscribe_index). - Lua: subscribers receive worker-thread documents (monitor Events) in
emission order. The REPL thread replays a subscriber's buffer before each
of its own deliveries instead of only afterRE:runreturns. - Engine:
stopandabortare thrown into the plan at the message
they interrupt, sofinalize_wrapper,run_wrapperandstage_wrapper
tails run before the run closes, as bluesky'sRequestStop/
RequestAbortunwind a generator;haltstill drops the plan. A pause
cancels an in-flightMsg::Waitinstead of applying after the move
finished, sostop_on_pausereaches a motor that is still moving. - Suspenders: a tripped suspender gates the next run's start, records its
justification (not "pause") on the suspension, runs its pre/post plans, and
holds the engine until every tripped suspender has released; a manual
pauseduring a suspension is not lifted by the suspender's release. - Descriptors:
object_keyslists every object's read keys (an unhinted
object had no entry) anddeclare_streamdescriptors fromcollectand
monitorcarry their objects, hints and configuration. - CA devices:
describe_dynreports the PV's units, precision and limits
from DBR_CTRL and sources the key asca://<pv>. - Lua:
LuaDevice__tostringlists the preparable, configurable,
collectable and pausable roles, andinspect()resolves through the
preparable and configurable facets instead of answeringtype = "Unknown".
See CHANGELOG.md for the full list.
v0.4.2 — epics-rs 0.28.1 dependency refresh
A dependency-refresh release. No bsrs code, API, or behaviour changes.
Changed
- Based the EPICS CA/PVA backends on
epics-rs0.28.1 (from 0.24.3). The
0.26.0 and 0.27.0 API breaks (AcfCell, thePvStringrecord description,
ClientCreds, thecheck_write_requestrename, 18 removed items) do not
reach anything bsrs calls.epics-libcom-rsandepics-rtems-bootenter
Cargo.lockas new transitive dependencies ofepics-base-rs.
Fixed
- Two
pva_monround-trip tests decode throughas_chunksrather than
chunks_exact, which Rust 1.98'sclippy::chunks_exact_to_as_chunksfails
under the-D warningsgate.
See CHANGELOG.md for the full list.
v0.4.1 — epics-rs 0.24.3 backend refresh
Dependency-refresh release on top of 0.4.0. Rebases the EPICS CA/PVA backends
on epics-rs 0.24.3 (from 0.24.2). No bsrs code, API, or behaviour changes.
Changed
- Based the EPICS CA/PVA backends on
epics-rs0.24.3 (from 0.24.2).
Verified against 0.24.3 (default ca+pva): cargo fmt --all --check clean;
cargo clippy --workspace --tests --examples -- -D warnings clean;
cargo test --workspace --no-fail-fast 513 passed / 0 failed / 5 ignored;
cargo build -p bsrs --features frame-source and cargo build --workspace --release clean.