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};