All pastes #549406 Raw Edit

Miscellany

public text v1 · immutable
·published 2007-06-08 03:26 UTC
rendered paste body
component blinker "free-running pulse generator";

pin in bit ena "enable";
pin out bit out "output";
param rw float on_time=0.01 "on time in seconds";
param rw float off_time=0.01 "off time in seconds";
param rw timer float time_left "Time left in current output pulse";

license "GPL";
;;

FUNCTION(_){ 
    int new, old, trigger;

    if ena {
new = in;
    old = data.old_in;
    trigger = 0;
    /* detect edges */
    if ( new && (!old) && rising ) trigger = 1;
    if ( old && (!new) && falling ) trigger = 1;
    data.old_in = new;
    /* is a pulse already running? */
    if ( data.timer > 0.0 ) {
	if ( ! retriggerable ) {
	    /* ignore edges during pulse */
	    trigger = 0;
	}
	/* decrement timer */
	data.timer -= period * 0.000000001;
	if ( data.timer < 0.0 ) data.timer = 0.0;
    }
    if ( trigger ) {
	/* (re)start pulse */
	data.timer = width;
    }
    /* drive outputs */
    time_left = data.timer;
    if ( data.timer > 0.0 ) {
	out = 1;
	out_not = 0;
    } else {
	out = 0;
	out_not = 1;
    }
}