001/*----------------------------------------------------------------------------*/
002/* Copyright (c) FIRST 2014-2017. 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.livewindow.LiveWindow;
015import edu.wpi.first.wpilibj.livewindow.LiveWindowSendable;
016import edu.wpi.first.wpilibj.tables.ITable;
017
018/**
019 * Built-in accelerometer.
020 *
021 * <p>This class allows access to the roboRIO's internal accelerometer.
022 */
023public class BuiltInAccelerometer implements Accelerometer, LiveWindowSendable {
024  /**
025   * Constructor.
026   *
027   * @param range The range the accelerometer will measure
028   */
029  public BuiltInAccelerometer(Range range) {
030    setRange(range);
031    HAL.report(tResourceType.kResourceType_Accelerometer, 0, 0, "Built-in accelerometer");
032    LiveWindow.addSensor("BuiltInAccel", 0, this);
033  }
034
035  /**
036   * Constructor. The accelerometer will measure +/-8 g-forces
037   */
038  public BuiltInAccelerometer() {
039    this(Range.k8G);
040  }
041
042  @Override
043  public void setRange(Range range) {
044    AccelerometerJNI.setAccelerometerActive(false);
045
046    switch (range) {
047      case k2G:
048        AccelerometerJNI.setAccelerometerRange(0);
049        break;
050      case k4G:
051        AccelerometerJNI.setAccelerometerRange(1);
052        break;
053      case k8G:
054        AccelerometerJNI.setAccelerometerRange(2);
055        break;
056      case k16G:
057      default:
058        throw new IllegalArgumentException(range + " range not supported (use k2G, k4G, or k8G)");
059
060    }
061
062    AccelerometerJNI.setAccelerometerActive(true);
063  }
064
065  /**
066   * The acceleration in the X axis.
067   *
068   * @return The acceleration of the roboRIO along the X axis in g-forces
069   */
070  @Override
071  public double getX() {
072    return AccelerometerJNI.getAccelerometerX();
073  }
074
075  /**
076   * The acceleration in the Y axis.
077   *
078   * @return The acceleration of the roboRIO along the Y axis in g-forces
079   */
080  @Override
081  public double getY() {
082    return AccelerometerJNI.getAccelerometerY();
083  }
084
085  /**
086   * The acceleration in the Z axis.
087   *
088   * @return The acceleration of the roboRIO along the Z axis in g-forces
089   */
090  @Override
091  public double getZ() {
092    return AccelerometerJNI.getAccelerometerZ();
093  }
094
095  @Override
096  public String getSmartDashboardType() {
097    return "3AxisAccelerometer";
098  }
099
100  private ITable m_table;
101
102  @Override
103  public void initTable(ITable subtable) {
104    m_table = subtable;
105    updateTable();
106  }
107
108  @Override
109  public void updateTable() {
110    if (m_table != null) {
111      m_table.putNumber("X", getX());
112      m_table.putNumber("Y", getY());
113      m_table.putNumber("Z", getZ());
114    }
115  }
116
117  @Override
118  public ITable getTable() {
119    return m_table;
120  }
121
122  @Override
123  public void startLiveWindowMode() {
124  }
125
126  @Override
127  public void stopLiveWindowMode() {
128  }
129}