Open-Loop Guide
How to reason about open-loop timing in operator language.
Open-loop behavior is easiest to understand if you separate three questions:
- When does the run become allowed to start?
- How long is the total run window?
- Within that run window, what does each stimulation ON/OFF cycle look like?
Those map roughly to:
stimulus.start.*stimulus.run_for_minutesstimulus.train.*stimulus.pulse.*
Critical Rule
- the open-loop start schedule begins after launch confirmation

Train Timing
If train.off_seconds = 0:
- stimulation starts once
- stimulation stays on for the run window
If train.off_seconds > 0, the runtime repeats:
- start stimulation
- stay ON for
train.on_seconds - stop stimulation
- stay OFF for
train.off_seconds - repeat until the run window ends
Worked Example
Suppose the config is:
run_for_minutes = 1train.on_seconds = 5train.off_seconds = 10pulse.period_ms = 1000pulse.time_on_ms = 10
Operator interpretation:
- the total run window is 60 seconds
- each ON epoch lasts 5 seconds
- each OFF gap lasts 10 seconds
- inside each ON epoch, the fast pulse waveform is 1 Hz with 10 ms ON per pulse
Expected train timeline:
t=0stot=5s: ONt=5stot=15s: OFFt=15stot=20s: ONt=20stot=30s: OFFt=30stot=35s: ONt=35stot=45s: OFFt=45stot=50s: ONt=50stot=60s: OFF
That produces four ON epochs during the 60 second run window.
Runtime Examples
Waiting for the scheduled start:

Active stimulation:
