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; } }