This demo uses two instances of a process that act as an astable.
<script> function dsF( name ){ var r = new Object() r.name = name r.state = "" r.colour = "#fff " r.count = 0 r.countIp = 0 r.input = 0 r.q = 0 return r } var ds1= dsF( "ds1" ) var ds2= dsF( "ds2" ) function processLable( ds ){ document.getElementById( ds.name+"" ).innerHTML = ds.state + " Q:"+ds.q + " count:" +ds.count+ "" document.getElementById( ds.name+"" ).style.background = ds.colour } function process( ds ){ console.log( ds, ds.name ) processLable( ds ) // count until if ( ds.count > 0 ){ ds.count += -1 // -Math.random(2) ds.q = 1 ds.state = "BUSY" ds.colour = "#F77 "; ds.countIp = 0 // 4 + -Math.random(2) return } else { ds.q = 0 ds.state = "IDLE" ds.colour = "#3F3 "; if ( ds.countIp > 0 ){ ds.state = "HOLD" ds.colour = "#FA3 "; ds.countIp += -1 -Math.random(2) return } //if input is high wait for it to go low. if ( ds.input > 0 ){ ds.state = "WAIT" ds.colour = "#FB3 "; return } else { ds.count = 9 } } } function ts(){ process( ds1 ) process( ds2 ) ds1.input = ds2.q ds2.input = ds1.q } document.getElementById( "ds1" ).innerHTML = "doug" ; document.getElementById( "ds2" ).innerHTML = "rice" ; ds1.count=6 ds2.count=3 window.setInterval( ts, 500 ); </script>