
package workfarm;

import java.applet.*;
import java.awt.*;
import java.awt.event.*;
import eduni.simanim.*;
import eduni.simjava.*;
import eduni.simdiag.*;

//
// The worker
public class Worker extends Sim_entity {
  private Sim_port in, out;
  private int state;
  private Sim_normal_obj delay;

  private static final int IDLE = 0;
  private static final int BUSY = 1;

  public Worker(String name, double hold, int x, int y) {
    super(name, "worker", x, y);
    in = new Sim_port("in", "port", Anim_port.TOP, 10); add_port(in);
    out = new Sim_port("out", "port", Anim_port.BOTTOM, 10); add_port(out);
    state = IDLE;
    String[] wstate = {"idle","busy"};
    add_param(new Anim_param( "State", 
			     Anim_param.STATE, 
			     new Param_type("wstate", wstate)
			     ));
    delay = new Sim_normal_obj("", hold,hold/10.0, (int)System.currentTimeMillis());
  }

  public void body() {
    Sim_event ev = new Sim_event();
    double h;

    dump_state();
    while(true) {
      sim_wait(ev);
      sim_hold(0.01);
      state = BUSY; dump_state();
      h = delay.sample();
      sim_hold(h>0?h:0.01); // Chuga Chuga Chuga
      state = IDLE; dump_state();
      sim_hold(0.01);
      sim_schedule(out, 0.0, 0);
      if(Applet5.show_msg) sim_trace(1, "S out R"); // Send on result
      sim_schedule(in, 0.0, 0);
      if(Applet5.show_msg) sim_trace(1, "S in F");  // Tell router we want more
    }
  }

  public void dump_state() {
    if(state == IDLE) sim_trace(1, "P idle");
    if(state == BUSY) sim_trace(1, "P busy");
  }
}
