next up previous
Next: 6.1.3 インタフェースSensorListerner.java Up: 6.1 クラスThread.java Previous: 6.1.1 クラスButton.java

6.1.2 ListenerThread.java


package josx.platform.rcx;

/**
 * Utility class for dispatching events
 * to button, sensor and serial listeners.
 *
 * @author Paul Andrews
 */
class ListenerThread extends Thread
{
  static ListenerThread singleton
        = new ListenerThread();
  
  int mask;
  Poll poller = new Poll();   

  static ListenerThread get()
  {
      synchronized (singleton)
      {
          if (!singleton.isAlive())
          {
            singleton.setDaemon(true);
            singleton.setPriority
                (Thread.MAX_PRIORITY);
            singleton.start();
          }
      }
      
      return singleton;
  }

  void addToMask(int mask)
  {
     this.mask |= mask;
      
      // Interrupt the polling
      // thread, not the current one!
     interrupt();
  }

  void addButtonToMask(int id) {
      addToMask(id << Poll.BUTTON_MASK_SHIFT);
  }
  
  void addSensorToMask(int id) {
      addToMask(1 << id);
  }

  void addSerialToMask() {
      addToMask(1 << Poll.SERIAL_SHIFT);
  }
  
  public void run()
  {
    for (;;) {
        try  {
          int changed = 
              poller.poll(mask, 0);

          if ((changed & Poll.SENSOR1_MASK) != 0)
                  Sensor.S1.callListeners();
          if ((changed & Poll.SENSOR2_MASK) != 0)
                  Sensor.S2.callListeners();
          if ((changed & Poll.SENSOR3_MASK) != 0)
                  Sensor.S3.callListeners();
          if ((changed & Poll.RUN_MASK) != 0)
                  Button.RUN.callListeners();
          if ((changed & Poll.VIEW_MASK) != 0)
                  Button.VIEW.callListeners();
          if ((changed & Poll.PRGM_MASK) != 0)
                  Button.PRGM.callListeners();
          if ((changed & Poll.SERIAL_MASK) != 0)
                  Serial.callListeners();
        } catch (InterruptedException ie) {
      }
    }
  }
}


generated through LaTeX2HTML. M.Inaba 平成18年5月6日