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>