package farm; /* A work farm example */ import java.applet.*; import java.awt.*; import java.awt.event.*; import eduni.simanim.*; import eduni.simjava.*; // // The simulation entities // // The worker 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; add_param(new Anim_param("State", Anim_param.STATE, "idle")); 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(Applet4.show_msg) sim_trace(1, "S out R"); // Send on result sim_schedule(in, 0.0, 0); if(Applet4.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"); } } // The Work router class Wrouter extends Sim_entity { private Sim_port worker, next, in; private int state; private static final int FORWARD = 0; private static final int COLLECT = 1; public Wrouter(String name, int x, int y) { super(name, "wrouter", x, y); worker = new Sim_port("worker", "port", Anim_port.BOTTOM, 10); add_port(worker); next = new Sim_port("next", "port", Anim_port.RIGHT, 10); add_port(next); in = new Sim_port("in", "port", Anim_port.LEFT, 10); add_port(in); state = COLLECT; add_param(new Anim_param("State", Anim_param.STATE, "collect")); } public void body() { Sim_event ev = new Sim_event(); while(true) { sim_get_next(ev); sim_hold(0.01); if(ev.get_tag() == 1) { if(state == COLLECT) { sim_schedule(worker, 0.0, 1); if(Applet4.show_msg) sim_trace(1, "S worker W"); state = FORWARD; dump_state(); } else { sim_schedule(next, 0.0, 1); if(Applet4.show_msg) sim_trace(1, "S next W"); } } else { state = COLLECT; dump_state(); } } } public void dump_state() { if(state == FORWARD) sim_trace(1, "P forward"); if(state == COLLECT) sim_trace(1, "P collect"); } } // The results router class Rrouter extends Sim_entity { private Sim_port out, in1, in2; public Rrouter(String name, int x, int y) { super(name, "rrouter", x, y); out = new Sim_port("out", "port", Anim_port.LEFT, 10); add_port(out); in1 = new Sim_port("in1", "port", Anim_port.TOP, 10); add_port(in1); in2 = new Sim_port("in2", "port", Anim_port.RIGHT, 10); add_port(in2); } public void body() { Sim_event ev = new Sim_event(); while(true) { sim_get_next(ev); sim_hold(0.01); sim_schedule(out, 0.0, 1); if(Applet4.show_msg) sim_trace(1, "S out R"); } } } //the farmer class Farmer extends Sim_entity { private Sim_port first; private Sim_negexp_obj delay; private int max; public Farmer(String name, int max, double hold, int x, int y) { super(name, "farmer", x, y); first = new Sim_port("first", "port", Anim_port.RIGHT,10); add_port(first); delay = new Sim_negexp_obj("", hold, (int)System.currentTimeMillis()); this.max = max; } public void body() { int i; double h; for(i=0; i0?h:0.01); // wait a bit } } } // A bucket, simply keeps a count of how many messages it recieves class Bucket extends Sim_entity { int count = 0; Sim_port in; public Bucket(String name, int x, int y, int side) { super(name, "bucket", x, y); count = 0; in = new Sim_port("in", "port", side, 10); add_port(in); add_param(new Anim_param("Count", Anim_param.NAME_VALUE, "0", -10, -5)); } public void body() { Sim_event ev=null; while(true) { sim_wait(ev); sim_hold(0.01); count++; sim_trace(1, "P "+count); } } } // The main applet public class Applet4 extends Anim_applet implements ItemListener { Panel inputs; Label msgLabel, sinkLabel, srcLabel, numWorkLabel, showMsgLabel; TextField msgField, sinkField, srcField; Choice numWorkChoice; Checkbox showMsgBox; static public boolean show_msg = true; // initialise the gui inputs public void anim_init() { int i; inputs = new Panel(); inputs.setLayout(new GridLayout(0,2)); msgLabel = new Label("Number of jobs:", Label.RIGHT); inputs.add(msgLabel); msgField = new TextField("5",3); inputs.add(msgField); numWorkLabel = new Label("Number of workers:", Label.RIGHT); inputs.add(numWorkLabel); numWorkChoice = new Choice(); for(i=1; i<=5; i++) numWorkChoice.addItem(" "+i+" "); numWorkChoice.select(2); numWorkChoice.addItemListener(this);; inputs.add(numWorkChoice); showMsgLabel = new Label("Show messages:", Label.RIGHT); inputs.add(showMsgLabel); showMsgBox = new Checkbox(""); showMsgBox.setState(true); inputs.add(showMsgBox); srcLabel = new Label("Farmer delay between jobs (mean):", Label.RIGHT); inputs.add(srcLabel); srcField = new TextField("0.4",5); inputs.add(srcField); sinkLabel = new Label("Worker processing delay (mean):", Label.RIGHT); inputs.add(sinkLabel); sinkField = new TextField("1.0",5); inputs.add(sinkField); this.add("North", inputs); } // Setup the animation public void anim_layout() { int num_msg, i, num_workers; double src_hold, sink_hold; System.out.println("Laying out simulation"); num_msg = Integer.parseInt(msgField.getText()); num_workers = numWorkChoice.getSelectedIndex()+1; src_hold = Double.valueOf(srcField.getText()).doubleValue(); sink_hold = Double.valueOf(sinkField.getText()).doubleValue(); show_msg = showMsgBox.getState(); // Add entities Sim_system.add(new Farmer("Farmer", num_msg, src_hold, 20, 20)); Sim_system.add(new Bucket("Bucket_1", 90+70*num_workers, 20, Anim_port.LEFT)); Sim_system.add(new Bucket("Bucket_2", 20, 160, Anim_port.RIGHT)); for(i=1; i<=num_workers; i++) { Sim_system.add(new Wrouter("Wrouter_"+i, 20+70*i, 20)); Sim_system.add(new Worker("Worker_"+i, sink_hold, 20+70*i, 90)); Sim_system.add(new Rrouter("Rrouter_"+i, 20+70*i, 160)); } // Link entities Sim_system.link_ports("Farmer", "first", "Wrouter_1", "in"); Sim_system.link_ports("Wrouter_"+num_workers, "next", "Bucket_1", "in"); Sim_system.link_ports("Rrouter_1", "out", "Bucket_2", "in"); for(i=1; i<=num_workers; i++) { if(i!=num_workers) Sim_system.link_ports("Wrouter_"+i, "next", "Wrouter_"+(i+1), "in"); Sim_system.link_ports("Wrouter_"+i, "worker", "Worker_"+i, "in"); Sim_system.link_ports("Worker_"+i, "out", "Rrouter_"+i, "in1"); if(i!=1) Sim_system.link_ports("Rrouter_"+i, "out", "Rrouter_"+(i-1), "in2"); } } // do a layout if they change the number of workers public void itemStateChanged(ItemEvent e) { Object source = e.getSource(); if (source == numWorkChoice) anim_relayout(); } // do a layout if they change the number of workers // jdk 1.0.2 method //public boolean handleEvent(Event e) { // if (e.id == Event.ACTION_EVENT) // if (e.target == numWorkChoice) // anim_relayout(); // return super.handleEvent(e); // VERY IMPORTANT!!!! //} }