text: /*----------------------------------------------------------------------------*/
  /* Copyright (c) 2008-2019 FIRST. All Rights Reserved.                        */
  /* Open Source Software - may be modified and shared by FRC teams. The code   */
  /* must be accompanied by the FIRST BSD license file in the root directory of */
  /* the project.                                                               */
  /*----------------------------------------------------------------------------*/
  
  #include "frc/AnalogAccelerometer.h"
  
  #include <hal/FRCUsageReporting.h>
  
  #include "frc/WPIErrors.h"
  #include "frc/smartdashboard/SendableBuilder.h"
  #include "frc/smartdashboard/SendableRegistry.h"
  
  using namespace frc;
  
  AnalogAccelerometer::AnalogAccelerometer(int channel)
      : AnalogAccelerometer(std::make_shared<AnalogInput>(channel)) {
    SendableRegistry::GetInstance().AddChild(this, m_analogInput.get());
  }
  
  AnalogAccelerometer::AnalogAccelerometer(AnalogInput* channel)
      : m_analogInput(channel, NullDeleter<AnalogInput>()) {
    if (channel == nullptr) {
      wpi_setWPIError(NullParameter);
    } else {
      InitAccelerometer();
    }
  }
  
  AnalogAccelerometer::AnalogAccelerometer(std::shared_ptr<AnalogInput> channel)
      : m_analogInput(channel) {
    if (channel == nullptr) {
      wpi_setWPIError(NullParameter);
    } else {
      InitAccelerometer();
    }
  }
  
  double AnalogAccelerometer::GetAcceleration() const {
    return (m_analogInput->GetAverageVoltage() - m_zeroGVoltage) / m_voltsPerG;
  }
  
  void AnalogAccelerometer::SetSensitivity(double sensitivity) {
    m_voltsPerG = sensitivity;
  }
  
  void AnalogAccelerometer::SetZero(double zero) { m_zeroGVoltage = zero; }
  
  double AnalogAccelerometer::PIDGet() { return GetAcceleration(); }
  
  void AnalogAccelerometer::InitSendable(SendableBuilder& builder) {
    builder.SetSmartDashboardType("Accelerometer");
    builder.AddDoubleProperty("Value", [=]() { return GetAcceleration(); },
                              nullptr);
  }
  
  void AnalogAccelerometer::InitAccelerometer() {
    HAL_Report(HALUsageReporting::kResourceType_Accelerometer,
               m_analogInput->GetChannel() + 1);
  
    SendableRegistry::GetInstance().AddLW(this, "Accelerometer",
                                          m_analogInput->GetChannel());
  }
  