001/*----------------------------------------------------------------------------*/
002/* Copyright (c) 2014-2018 FIRST. All Rights Reserved.                        */
003/* Open Source Software - may be modified and shared by FRC teams. The code   */
004/* must be accompanied by the FIRST BSD license file in the root directory of */
005/* the project.                                                               */
006/*----------------------------------------------------------------------------*/
007
008package edu.wpi.first.wpilibj;
009
010import edu.wpi.first.wpilibj.hal.AccelerometerJNI;
011import edu.wpi.first.wpilibj.hal.FRCNetComm.tResourceType;
012import edu.wpi.first.wpilibj.hal.HAL;
013import edu.wpi.first.wpilibj.interfaces.Accelerometer;
014import edu.wpi.first.wpilibj.smartdashboard.SendableBuilder;
015
016/**
017 * Built-in accelerometer.
018 *
019 * <p>This class allows access to the roboRIO's internal accelerometer.
020 */
021public class BuiltInAccelerometer extends SensorBase implements Accelerometer, Sendable {
022  /**
023   * Constructor.
024   *
025   * @param range The range the accelerometer will measure
026   */
027  public BuiltInAccelerometer(Range range) {
028    setRange(range);
029    HAL.report(tResourceType.kResourceType_Accelerometer, 0, 0, "Built-in accelerometer");
030    setName("BuiltInAccel", 0);
031  }
032
033  /**
034   * Constructor. The accelerometer will measure +/-8 g-forces
035   */
036  public BuiltInAccelerometer() {
037    this(Range.k8G);
038  }
039
040  @Override
041  public void setRange(Range range) {
042    AccelerometerJNI.setAccelerometerActive(false);
043
044    switch (range) {
045      case k2G:
046        AccelerometerJNI.setAccelerometerRange(0);
047        break;
048      case k4G:
049        AccelerometerJNI.setAccelerometerRange(1);
050        break;
051      case k8G:
052        AccelerometerJNI.setAccelerometerRange(2);
053        break;
054      case k16G:
055      default:
056        throw new IllegalArgumentException(range + " range not supported (use k2G, k4G, or k8G)");
057
058    }
059
060    AccelerometerJNI.setAccelerometerActive(true);
061  }
062
063  /**
064   * The acceleration in the X axis.
065   *
066   * @return The acceleration of the roboRIO along the X axis in g-forces
067   */
068  @Override
069  public double getX() {
070    return AccelerometerJNI.getAccelerometerX();
071  }
072
073  /**
074   * The acceleration in the Y axis.
075   *
076   * @return The acceleration of the roboRIO along the Y axis in g-forces
077   */
078  @Override
079  public double getY() {
080    return AccelerometerJNI.getAccelerometerY();
081  }
082
083  /**
084   * The acceleration in the Z axis.
085   *
086   * @return The acceleration of the roboRIO along the Z axis in g-forces
087   */
088  @Override
089  public double getZ() {
090    return AccelerometerJNI.getAccelerometerZ();
091  }
092
093  @Override
094  public void initSendable(SendableBuilder builder) {
095    builder.setSmartDashboardType("3AxisAccelerometer");
096    builder.addDoubleProperty("X", this::getX, null);
097    builder.addDoubleProperty("Y", this::getY, null);
098    builder.addDoubleProperty("Z", this::getZ, null);
099  }
100}