clock-out

samele1222/ship-data/clock-out

No description
clock-out
@/clock-out
ENboolean
Is the clock enabled, i.e. produces ticks? At the moment when set to true, starts counting from scratch.
IVALnumber
Tick interval in seconds
RSTpulse
Resets current count, restarts clock with new interval
clock-out
EN
IVAL
RST
TICK
OUT
OUTnumber
TICKpulse
Pulses on each time interval end
To use the node in your project you should have the samele1222/ship-data library installed. Use the “File → Add Library” menu item in XOD IDE if you don’t have it yet. See Using libraries for more info.

C++ implementation

struct State {
  TimeMs nextTrig;
  uint8_t sTrig;
};

{{ GENERATED_CODE }}

void evaluate(Context ctx) {
    State* state = getState(ctx);
    TimeMs tNow = transactionTime();
    auto ival = getValue<input_IVAL>(ctx);
    if (ival < 0) ival = 0;
    TimeMs dt = ival * 1000;
    TimeMs tNext = tNow + dt;

    auto isEnabled = getValue<input_EN>(ctx);
    auto isRstDirty = isInputDirty<input_RST>(ctx);

    if (isTimedOut(ctx) && isEnabled && !isRstDirty) {
        emitValue<output_TICK>(ctx, 1);
        state->nextTrig = tNext;
        setTimeout(ctx, dt);
    }
    if (isRstDirty || isInputDirty<input_EN>(ctx)) {
        // Handle enable/disable/reset
        if (!isEnabled) {
            // Disable timeout loop on explicit false on EN
            state->nextTrig = 0;
            clearTimeout(ctx);
        } else if (state->nextTrig < tNow || state->nextTrig > tNext) {
            // Start timeout from scratch
            state->nextTrig = tNext;
            setTimeout(ctx, dt);
        }
    }

    if (!state->sTrig) state->sTrig = 1;
    else state->sTrig = 0;
    emitValue<output_OUT>(ctx, state->sTrig);

}

Tabular tests

__time(ms)IVALENRSTTICK
00.1trueno-pulseno-pulse
1000.1truepulseno-pulse
1200.1trueno-pulseno-pulse
2010.1trueno-pulsepulse
2500.1trueno-pulseno-pulse
3020.1trueno-pulsepulse
3500.1falseno-pulseno-pulse
4030.1falseno-pulseno-pulse
01truepulseno-pulse
5001truepulseno-pulse
10011trueno-pulseno-pulse
15011trueno-pulsepulse
// edge case: when IVAL is 0, `clock` should constantly emit pulses
00trueno-pulsepulse
10trueno-pulsepulse
21trueno-pulsepulse
10031trueno-pulsepulse
// edge case: when IVAL is negative, behave like it's 0
0-1trueno-pulsepulse
1-1trueno-pulsepulse
21trueno-pulsepulse
10031trueno-pulsepulse