 //   * force if true then force full poll on every call (ie do not internally rate-limit)
 // Note that radio poll() can be for TX as well as RX activity.
 // Not thread-safe, eg not to be called from within an ISR.
-// FIXME trying to move into utils (for the time being.)
 bool pollIO(const bool force = false) {
     static volatile uint8_t _pO_lastPoll;
     // Poll RX at most about every ~8ms.

        OTV0P2BASE::ScratchSpace s((uint8_t*)globalWorkSpace.cli, sizeof(globalWorkSpace.cli));
        pollCLI(stopBy, 0 == TIME_LSD, s);
    }
#if defined(EST_CPU_DUTYCYCLE)
    const unsigned long usEnd = micros();
    // Nominal loop time should be 2s x 1MHz clock, ie 2,000,000 if CPU running all the time.
    // Should generally be <2000 (us) (<0.1%) for leaf, <20000 (<1%) for hub.
    // Example output.
    //us apparent: 4544
    //us apparent: 25280
    //us apparent: 9280
    const unsigned long usApparentTaken = usEnd - usStart;
#if 1 && defined(DEBUG)
    DEBUG_SERIAL_PRINT_FLASHSTRING("us apparent: ");
    DEBUG_SERIAL_PRINT(usApparentTaken);
    DEBUG_SERIAL_PRINTLN();
#endif
#endif
}


            // Show/set generic parameter values (eg "G N [M]").
            case 'G': { OTV0P2BASE::CLI::GenericParam().doCommand(buf, n); break; }
            // Reset or display ID.
            case 'I': { OTV0P2BASE::CLI::NodeIDWithSet().doCommand(buf, n); break; }
            // Status line stats print and TX.
            case 'S': {
                Serial.print(F("Resets: "));
