Common IO settings
Applies to: IOcan · Standalone controller. What this means
Every input and output shares a small set of settings and conventions. Type-specific options are on each IO's own page — but three things here are assumed by most of those pages, and the third one surprises people.
Schema: the
InputandOutputmessages inconfig/Config.proto. Several fields on those messages are managed internally and are not shown to the user (datalogger channel, type, min/max, unit, preset).
Shared settings
| Setting | Applies to | Meaning |
|---|---|---|
| Name | All IO | Human-readable name shown throughout the app (e.g. Oil Temp, Line Pressure Solenoid). Everything else — maps, drivers, other IO — references this IO by its name. |
| Pin | Hardware IO only | The physical pin the IO is bound to. Logical IO (maths, compare, map…) reference other IO instead and have no pin; CAN IO uses the CAN bus. Two IO on the same pin raise fault 0x0014. |
Two input types use the pin field for something other than a physical pin: System Input uses it to select which internal value to read, and Virtual Input uses it to select which datalogger slider drives it.
The 1024 convention
Values follow a common full-scale convention of 1024:
- Booleans — true =
1024, false =0. - Percentages and proportions — full scale =
1024, so 100 % throttle is1024. - Thresholds — anything that reads another input as a boolean treats > 512 as true. That covers counter triggers, waveform triggers, RBC bits and the event filter below.
How an analog reading becomes a value
You enter voltages in volts. The configuration app converts them for you — internally the device normalises every analog reading against the selected Range, but that representation is the app's business, not yours. In min, In max, Fault min and Fault max are all volts.
The order the stages run in does matter, because two of them are easy to misread:
- Read the pin — raw ADC counts.
- Normalise against the Range — the reading becomes a proportion of the selected Range. This stage does not clamp: a signal above the Range stays above full scale, and a negative reading stays negative.
- Fault window — Fault min and Fault max are checked here, before any filtering, so a fault is raised on the real signal rather than a smoothed one. Leaving both at zero disables the check entirely.
- Low-pass filter, if enabled.
- Interpolation, if enabled — In min/In max mapped to Out min/Out max.
Where the internal representation does surface: with interpolation turned
off. Nothing converts the reading into your units at that point, so the
channel logs as a 0–1024 proportion of the Range — 512 on the 5 V range
is 2.5 V. That is the normal way to feed an Analog Input
into a Map Input for a non-linear sensor, so it is worth
recognising rather than mistaking for a broken channel.
Watch the decoded value in the datalogger before trusting a threshold you have not seen trip. That advice is not about units — it is about the fact that nothing else will tell you.
The event filter — Delay, Hold, Interspace
Digital, Analog Switch and Compare inputs all offer the same optional filter. It is documented once here, because what it does is not what the field names suggest.
⚠️ It is not a debouncer. Turning it on converts the input from a level into a one-shot event.
With the filter on:
- The source must read high (
> 512) continuously for Delay cycles. - The filtered input then reads
1024for exactly one cycle. - It reads
0again for as long as the source stays high. - No new event can start until Interspace cycles have elapsed.
That is exactly right for a button or paddle — one press, one event, no repeat while it is held. It is exactly wrong for a state signal such as a neutral switch, a brake switch or a mode position, where the input has to stay on while the condition holds. Leave the filter off for those and handle contact bounce at the consumer instead.
Hold does nothing. The field is accepted and passed to the filter, which overrides it with a fixed event length of one cycle. It is listed on each page for completeness, marked as inert.
Counts are processing cycles. The input loop runs at 1 kHz, so one count is effectively one millisecond.
Good practice
- Give every IO a clear, unique name — everything else references it by that name.
- For hardware IO, match the pin to how the device is physically wired, and check that no other IO already claims it.
- Confirm a new input in the datalogger before anything depends on it. Most of the wrong-value failures described in these pages are silent.
Related
- Configuring inputs · Configuring outputs
- Scaling and maps
- Fault codes — the configuration and watchdog faults these pages refer to