Waveform Input » History » Revision 1
Revision 1/2
| Next »
Adam Klama, 06/21/2026 02:37 PM
Waveform Input¶
Overview¶
A Waveform Input generates a timed value — a waveform — in response to the
edges of another input. When the observed input switches on or off, it plays back a
sequence of (time, value) points you define. Typical uses are clutch-by-wire
engage on button press and release on button release, blinker / hazard
lights, and simple test signals. It watches an input you already configured and
produces a value from it.
Prerequisites & hardware¶
- A source input to observe — usually a button or switch (for example a
Digital Input). Create it first and note its identifier. - The observed input is treated as digital: a value < 512 is LOW, a value
≥ 512 is HIGH.- A LOW → HIGH transition fires the RISE trigger.
- A HIGH → LOW transition fires the FALL trigger.
- At startup no transition is detected, so the first trigger can occur no earlier
than the second cycle.
Add it in the app¶
- Add a new input and choose Waveform Input as the type.
- Set the Observed input to the source you want to watch.
- Give it a clear alias (e.g.
Clutch Command). - Define the Rise waveform and Fall waveform as lists of (time, value)
points. - Set the idle values and the repeat / minimum repeats behaviour.
Settings reference¶
Schema:
config/WaveformInputConfigData.proto.
| Setting | Meaning | Unit | Range / values | Notes |
|---|---|---|---|---|
| Observed input | The input whose edges trigger the waveforms | — | int32 (input id) | Read as digital: < 512 LOW, ≥ 512 HIGH. |
| Rise waveform | Points played on a LOW → HIGH edge | (ms, value) pairs | list of sint32 times + sint32 values | Time stamps in ms; output value at each point. An empty list outputs the idle value. |
| Fall waveform | Points played on a HIGH → LOW edge | (ms, value) pairs | list of sint32 times + sint32 values | As above, for the falling edge. |
| Rise repeat | Loop the rise waveform | — | on / off | Off: play once, then hold the idle value (or stop early if a new trigger arrives and minimum repeats > 0). On: when the timer passes the last point, reset and replay from the start. |
| Fall repeat | Loop the fall waveform | — | on / off | As above, for the fall waveform. |
| Rise minimum repeats | Full plays before a new trigger can interrupt the rise waveform | plays | int (0, 1, n) |
0 = interruptible as soon as the next trigger is seen; 1 = play at least once fully; n = at least n times. Ignored when Rise repeat is off.
|
| Fall minimum repeats | Full plays before a new trigger can interrupt the fall waveform | plays | int (0, 1, n) |
As above, for the fall waveform. |
| Idle value (LOW) | Output when no waveform is playing and the observed input is LOW | value | sint32 | Held between waveforms. |
| Idle value (HIGH) | Output when no waveform is playing and the observed input is HIGH | value | sint32 | The input picks LOW or HIGH idle from the observed input's current state. |
How a waveform is described¶
Each waveform is a list of (time, value) points. After a trigger, a timer starts
at 0 ms and the input outputs the value scheduled for the elapsed time, linearly
interpolating between points to give a smooth ramp:
value
1000 | ______
| /
0 |________/
+--------+----+----> time (ms)
0 200 300
points: (0,0) (200,1000) (300,1000) -> interpolated between points
When the timer passes the last point, the input either holds the idle value
(repeat off) or resets to 0 ms and plays again (repeat on).
Common settings¶
Waveform Input also uses the shared setting — alias. See
Common IO Settings.
Example — clutch engage on press, ramped release on release¶
Watch a clutch button (a Digital Input) and drive a clutch
command from 0 (open) to 1000 (closed).
- Type Waveform Input, alias
Clutch Command, Observed input = the
clutch button. -
Rise waveform (button pressed → engage quickly):
(0 ms, 0) → (200 ms, 1000)— ramps up over 200 ms. -
Fall waveform (button released → ramp out gently):
(0 ms, 1000) → (600 ms, 0)— ramps down over 600 ms. - Rise repeat off, Fall repeat off — each plays once, then holds idle.
-
Idle value (LOW)
0, Idle value (HIGH)1000— so once engaged it
stays closed and once released it stays open.
For a hazard light instead: put a square pulse in the Rise waveform and turn
Rise repeat on so it blinks continuously until the next trigger.
Troubleshooting¶
-
Nothing happens on the first press: at startup no edge exists; the first
trigger comes no earlier than the second cycle. Toggle the input once. -
Waveform never stops / keeps looping: repeat is on. Turn it off for a
one-shot, or set minimum repeats so the next trigger can interrupt it. -
A new press is ignored mid-play: minimum repeats is too high — lower it
(or use0) so the next trigger can interrupt. - Output sits at the wrong level between presses: check Idle value (LOW/HIGH).
-
Ramp too fast or too slow: adjust the point timestamps — the output
interpolates linearly between consecutive points. -
Triggers fire on the wrong edge: LOW/HIGH is split at 512 — make sure the
observed input crosses that threshold.
Related¶
- Digital Input — a typical button/switch source to observe.
- Constant Value Input — a fixed value with no timing.
- Counter Input — count edges rather than play a waveform.
Updated by Adam Klama 1 day ago · 2 revisions