next up previous
Next: 7.5 SensorConstantsインタフェース Up: 7 josx パッケージ Previous: 7.3 SensorListnerインタフェース

7.4 Motorクラス

モータの操作に関連するクラスとしてMotorクラスを 定義している.
package josx.platform.rcx;

/**
 * Abstraction for a motor.
 * Three instances of <code>Motor</code>
 * are available: <code>Motor.A</code>,
 * <code>Motor.B</code>
 * and <code>Motor.C</code>.
 * To control each motor use
 * methods <code>forward, backward,
 * reverseDirection, stop</code>
 * and <code>flt</code>.
 * To set each motor's power, use
 * <code>setPower</code>.  
 * <p>
 * Example:<p>
 * <code><pre>
 *   Motor.A.setPower(1);
 *   Motor.C.setPower(7);
 *   Motor.A.forward();
 *   Motor.C.forward();
 *   Thread.sleep (1000);
 *   Motor.A.stop();
 *   Motor.C.stop();
 * </pre></code>
 */
public class Motor
{
  private char  iId;
  private short iMode = 4;
  private short iPower = 3;

  /**
   * Motor A, B, C
   */
  public static final
  Motor A = new Motor ('A');
  public static final
  Motor B = new Motor ('B');
  public static final
  Motor C = new Motor ('C');

  private Motor (char aId) {
    iId = aId;
  }

  /**
   * Get the ID of the motor.
   * One of 'A', 'B' or 'C'.
   */
  public final char getId() {
    return iId;
  }

  /**
   * Sets motor power to
   * a <i>value between 0 and 7</i>.
   * @param A value in the range [0-7].
   */
  public final void setPower (int aPower) {
    iPower = (short) aPower;
    controlMotor (iId, iMode, aPower);
  }

  /**
   * Causes motor to rotate forward.
   */
  public final void forward() {
    iMode = 1;
    controlMotor (iId, 1, iPower);
  }
  
  /**
   * Return true if motor is forward.
   */
  public final boolean isForward() {
    return (iMode == 1);
  }

  /**
   * Causes motor to rotate backwards.
   */
  public final void backward() {
    iMode = 2;
    controlMotor (iId, 2, iPower);
  }

  /**
   * Return true if motor is backward. */
  public final boolean isBackward() {
    return (iMode == 2);
  }

  /**
   * Reverses direction of the motor. It only has
   * effect if the motor is moving.
   */
  public final void reverseDirection() {
    if (iMode == 1 || iMode == 2) {
      iMode = (short) (3 - iMode);
      controlMotor (iId, iMode, iPower);
    }
  }

  /**
   * Returns the current motor power.
   */
  public final int getPower() {
    return iPower;          
  }

  /**
   * @return true iff the motor is
   * currently in motion.
   */
  public final boolean isMoving() {
    return (iMode == 1 || iMode == 2);          
  }
  
  /**
   * @return true iff the motor is
   * currently in float mode.
   */
  public final boolean isFloating() {
    return iMode == 4;          
  }
  
  /**
   * Causes motor to stop, pretty much
   * instantaneously. In other words, the
   * motor doesn't just stop; it will resist
   * any further motion.
   */
  public final void stop() {
    iMode = 3;
    controlMotor (iId, 3, 7);
  }
  
  /**
   * Return true if motor is stopped.
   */
  public final boolean isStopped() {
    return (iMode == 3);
  }

  /**
   * Causes motor to float.
   * The motor will lose all power,
   * but this is not the same as stopping.
   * Use this
   * method if you don't want your robot to trip in
   * abrupt turns.
   */
  public final void flt() {
    iMode = 4;
    controlMotor (iId, 4, iPower);
  }

  /**
   * <i>Low-level API</i> for
   * controlling a motor.
   * This method is not meant to
   * be called directly.
   * If called, other methods
   * such as isRunning() will
   * be unreliable.
   * @deprecated I've decided to
   * remove this method.
   If you really need it,
   check its implementation
   in classes/josx/platform/rcx/Motor.java. 
   * @param
   aMotor The motor id:
   'A', 'B' or 'C'.
   * @param
   aMode 1=forward,
   2=backward,
   3=stop,
   4=float
   * @param
   aPower A value in the range [0-7].
   */
  public static
  void controlMotor (char aMotor,
                     int aMode,
                     int aPower) {
    ROM.call ((short) 0x1a4e,
              (short) (0x2000 + aMotor - 'A'), 
              (short) aMode, (short) aPower);
  }
}


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