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 Input and Output messages in config/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 is 1024.
  • 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:

  1. Read the pin — raw ADC counts.
  2. 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.
  3. Fault windowFault 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.
  4. Low-pass filter, if enabled.
  5. 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 Range512 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:

  1. The source must read high (> 512) continuously for Delay cycles.
  2. The filtered input then reads 1024 for exactly one cycle.
  3. It reads 0 again for as long as the source stays high.
  4. 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.