Water Tap

From BP Wiki
Jump to: navigation, search

Alternating Taps Example

Below is the full source code of the alternating water taps example. It is part of the BPJ package.

Events

  • addHot
  • addCold

b-Threads

  • addHotThreeTimes: requests addHot 3 times
  • addColdThreeTimes: requests addCold 3 times
  • Interleave: Causes alternation between addHot and addCold events by blocking one while waiting for the other and vice versa.

An additional b-thread DisplayEvents (commented out) indicate how one could use these events to drive external outputs, such as real water tap actuators.

Source Code

public class AlternatingTaps implements BApplication {
  @SuppressWarnings("serial")
  static class TapEvent extends Event {
     public TapEvent(String name) {
        this.setName(name);
     }
  }
  static TapEvent addHot = new TapEvent("AddHot");
  static TapEvent addCold = new TapEvent("AddCold");
  @SuppressWarnings("serial")
  public class AddHotThreeTimes extends BThread {
     public void runBThread() throws BPJException {
        for (int i = 1; i <= 3; i++) {
           bp.bSync(addHot, none, none);
        }
     }
  }
  @SuppressWarnings("serial")
  public class AddColdThreeTimes extends BThread {
     public void runBThread() throws BPJException {
        for (int i = 1; i <= 3; i++) {
           bp.bSync(addCold, none, none);
        }
     }
  }
  @SuppressWarnings("serial")
  public class Interleave extends BThread {
     public void runBThread() throws BPJException {
        while (true) {
           bp.bSync(none, addHot, addCold);
           bp.bSync(none, addCold, addHot);
        }
     }
  }
  @SuppressWarnings("serial")
  public class DisplayEvents extends BThread {
     public void runBThread() throws BPJException {
        while (true) {
           bp.bSync(none, all, none);
           System.out.println("Physically turned water tap per event: " + bp.lastEvent);
        }
     }
  }
  public void runBApplication() {
     System.out.println("runBApplication () at " + this);
     bp.add(new AddHotThreeTimes(), 1.0);
  //   bp.add(new DisplayEvents(), 2.0);
     bp.add(new AddColdThreeTimes(), 3.0);
     bp.add(new Interleave(), 4.0);
     bp.startAll();
  }
  static public void main(String arg[]) {
     try {
        BProgram.startBApplication(AlternatingTaps.class, "bp.unittest");
     } catch (Exception e) {
        e.printStackTrace();
     }
  }

}