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}