next up previous
Next: この文書について... Up: 7 josx パッケージ Previous: 7.7 ListenerCallerインタフェース

7.8 Sensorクラス

ListenerCallerインタフェースをもつ Sensorクラスを定義する.
public static native
    int readSensorValue
            (int aSensorId, int aRequestType);
  
private static native
    void setSensorValue
             (int aSensorId,
             int aVal, int aRequestType);
native メソッドとして,readSensorValueと setSensorValueがある.
package josx.platform.rcx;

/**
 * Abstraction for a sensor
 * (<i>considerably changed since alpha5</i>).
 * There are three Sensor instances
 * available: Sensor.S1, Sensor.S2 and
 * Sensor.S3. They correspond to sensor
 * inputs labeled 1, 2 and 3 in the
 * RCX, respectively. Before using a 
 * sensor, you should set its mode
 * and type with <code>setTypeAndMode</code>
 * using constants defined in
 * <code>SensorConstants</code>. 
 * You should also activate the sensor.
 * <p>
 * You can poll for sensor values in a
 * loop using the readValue method
 * or one of the other read methods.
 * There is also a low level method which
 * can be used when maximum performance
 * is required. Another way to
 * monitor sensor values is to add a
 * <code>SensorListener</code>.
 * All sensor events
 * are dispatched to listeners by a 
 * single thread created by this class. The
 * thread is a daemon thread and so 
 * will not prevent termination of an
 * application if all other threads
 * have exited.
 * <p>
 * Example:<p>
 * <code><pre>
 *   Sensor.S1.setTypeAndMode (3, 0x80);
 *   Sensor.S1.activate();
 *   Sensor.S1.addSensorListener
 *     (new SensorListener() {
 *     public void stateChanged
 *      (Sensor src, int oldValue,
 *       int newValue) {
 *       // Will be called whenever
 *       // sensor value changes
 *       LCD.showNumber (newValue);
 *       try {
 *         Thread.sleep (100);
 *       } catch (InterruptedException e) {
 *         // ignore
 *       }
 *     }
 *   });
 *     
 * </pre></code>
 *
 * @see josx.platform.rcx.SensorConstants
 * @see josx.platform.rcx.SensorListener
 */
public class Sensor implements ListenerCaller
{
  private int iSensorId;
  private short iNumListeners = 0;
  private SensorListener[] iListeners;
  private int iPreviousValue;
  
  /**
   * Sensor labeled 1,2,3 on RCX.
   */
  public static final
  Sensor S1 = new Sensor (0);
  public static final
  Sensor S2 = new Sensor (1);
  public static final
  Sensor S3 = new Sensor (2);

  /**
   * Array containing all
   * three sensors [0..2].
   */
  public static final
  Sensor[] SENSORS =
  { Sensor.S1, Sensor.S2, Sensor.S3 };

  /**
   * Reads the canonical value of the sensor.
   */
  public final int readValue() {
    return readSensorValue (iSensorId, 1);
  }

  /**
   * Reads the raw value of the sensor.
   */
  public final int readRawValue() {
    return readSensorValue (iSensorId, 0);
  }

  /**
   * Reads the boolean value of the sensor.
   */
  public final boolean readBooleanValue()
  {
    return readSensorValue (iSensorId, 2) != 0;
  }

  private Sensor (int aId) {
    iSensorId = aId;
    setTypeAndMode (3, 0x80);
  }

  /**
   * Return the ID of the sensor.
   * One of 0, 1 or 2.
   */
  public final int getId() {
    return iSensorId;
  }
    
  /**
   * Adds a sensor listener.
   * <p>
   * <b>
   * NOTE 1: You can add at
   * most 8 listeners.<br>
   * NOTE 2: Synchronizing
   * inside listener methods could result
   * in a deadlock.
   * </b>
   * @see josx.platform.rcx.SensorListener
   */

  public synchronized
  void addSensorListener
             (SensorListener aListener)
  {
    if (iListeners == null) {
        iListeners = new SensorListener[8];
    }
    iListeners[iNumListeners++] =
        aListener;
    ListenerThread.get().
        addSensorToMask(iSensorId, this);
  }

  /**
   * Activates the sensor.
   * This method should be called
   * if you want to get accurate
   * values from the
   * sensor. In the case of
   * light sensors, you should see
   * the led go on when you
   * call this method.
   */
  public final void activate() {
    ROM.call ((short) 0x1946,
              (short) (0x1000 + iSensorId));
  }

  /**
   * Passivates the sensor. 
   */
  public final void passivate() {
    ROM.call ((short) 0x19C4,
              (short) (0x1000 + iSensorId));
  }

  /**
   * Sets the sensor's mode and type.
   * If this method isn't called,
   * the default type is 3 (LIGHT)
   * and the default mode is 0x80 (PERCENT).
   * @param
   aType 0 = RAW, 1 = TOUCH, 2 = TEMP,
   3 = LIGHT, 4 = ROT.
   * @param
   aMode 0x00 = RAW, 0x20 = BOOL,
   0x40 = EDGE, 0x60 = PULSE, 0x80 = PERCENT,
   0xA0 = DEGC,
   0xC0 = DEGF,
   0xE0 = ANGLE. Also,
   mode can be OR'd with slope (0..31).
   * @see josx.platform.rcx.SensorConstants
   */
    public final
    void setTypeAndMode (int aType, int aMode) {
        setSensorValue (iSensorId, aType, 1);
        setSensorValue (iSensorId, aMode, 0);     
    }
    /**
     * Resets the canonical sensor value.
     This may be useful for rotation sensors. 
    */
    public final
    void setPreviousValue (int aValue) {
        setSensorValue (iSensorId, aValue, 2);    
    }
  /**
   * <i>Low-level API</i> for reading sensor values.
   * @param
   aSensorId Sensor ID (0..2).
   * @param
   aRequestType 0 = raw value,
   1 = canonical value,
   2 = boolean value.
   */
    public static native
    int readSensorValue
            (int aSensorId, int aRequestType);
  
    private static native
    void setSensorValue
             (int aSensorId,
             int aVal, int aRequestType);
  
    public synchronized void callListeners() {
      int newValue =
          readSensorValue( iSensorId, 1);
      for (int i = 0; i < iNumListeners; i++) {
          iListeners[i].
              stateChanged( this,
                        iPreviousValue,
                        newValue);
      }
      iPreviousValue = newValue;
    }
}


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