rendered paste bodycomponent 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;
}
}