Skip to contents

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(), or phaseTargetOp() 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.

Value

A closed ClosedLoopController.

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"