closedLoop() is side-effect free with respect to the trigger transport. It
registers one governed detector operation in the supplied pipeline and owns
that graph and trigger for a terminal session lifecycle. Detector events are
decoded only after pipelineStep() commits; callbacks never stimulate.
Usage
closedLoop(
pipeline,
trigger,
detector,
intensity,
stim_channel,
duration_ms,
delay_ms = 0,
event_refractory_ms = 0,
pending_capacity = 128L,
log_capacity = 4096L,
clock = NULL
)Arguments
- pipeline
An empty-queue
StreamPipeline.- trigger
A closed, disarmed
TriggerBackend.- detector
An
emgOnsetOp(),erdIntentOp(), orphaseTargetOp()descriptor.- intensity, stim_channel, duration_ms
Explicit stimulation dose fields.
- delay_ms
Detection-commit to attempt delay. Positive delays require a later step or
closedLoopFlush(); no sleep or background task is used.- event_refractory_ms
Controller-level detection refractory period.
- pending_capacity
Maximum delayed actions.
- log_capacity
Maximum retained audit records and detector identities.
- clock
Optional deterministic monotonic clock, for loopback tests.
Examples
pipeline <- streamPipeline(chunk_size = 2048L)
trigger <- loopbackTrigger(allowed_channels = "left", max_intensity = 20,
intensity_unit = "mA", max_duration_ms = 500,
refractory_ms = 0, deadman_ms = 1000)
detector <- emgOnsetOp("emg", sampling_rate = 1000,
baseline_samples = 30, rms_window_samples = 5)
controller <- closedLoop(pipeline, trigger, detector, intensity = 2,
stim_channel = "left", duration_ms = 10)
closedLoopState(controller)$lifecycle$status
#> [1] "constructed"