Astable

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>