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