Squashed 'third_party/allwpilib_2016/' content from commit 7f61816

Change-Id: If9d9245880859cdf580f5d7f77045135d0521ce7
git-subtree-dir: third_party/allwpilib_2016
git-subtree-split: 7f618166ed253a24629934fcf89c3decb0528a3b
diff --git a/wpilibc/Athena/src/AnalogOutput.cpp b/wpilibc/Athena/src/AnalogOutput.cpp
new file mode 100644
index 0000000..74a1f9c
--- /dev/null
+++ b/wpilibc/Athena/src/AnalogOutput.cpp
@@ -0,0 +1,110 @@
+/*----------------------------------------------------------------------------*/
+/* Copyright (c) FIRST 2014. 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 "AnalogOutput.h"
+#include "Resource.h"
+#include "WPIErrors.h"
+#include "LiveWindow/LiveWindow.h"
+#include "HAL/Port.h"
+
+#include <limits>
+#include <sstream>
+
+static std::unique_ptr<Resource> outputs;
+
+/**
+ * Construct an analog output on the given channel.
+ * All analog outputs are located on the MXP port.
+ * @param The channel number on the roboRIO to represent.
+ */
+AnalogOutput::AnalogOutput(uint32_t channel) {
+  Resource::CreateResourceObject(outputs, kAnalogOutputs);
+
+  std::stringstream buf;
+  buf << "analog input " << channel;
+
+  if (!checkAnalogOutputChannel(channel)) {
+    wpi_setWPIErrorWithContext(ChannelIndexOutOfRange, buf.str());
+    m_channel = std::numeric_limits<uint32_t>::max();
+    m_port = nullptr;
+    return;
+  }
+
+  if (outputs->Allocate(channel, buf.str()) ==
+      std::numeric_limits<uint32_t>::max()) {
+    CloneError(*outputs);
+    m_channel = std::numeric_limits<uint32_t>::max();
+    m_port = nullptr;
+    return;
+  }
+
+  m_channel = channel;
+
+  void* port = getPort(m_channel);
+  int32_t status = 0;
+  m_port = initializeAnalogOutputPort(port, &status);
+  wpi_setErrorWithContext(status, getHALErrorMessage(status));
+  freePort(port);
+
+  LiveWindow::GetInstance()->AddActuator("AnalogOutput", m_channel, this);
+  HALReport(HALUsageReporting::kResourceType_AnalogOutput, m_channel);
+}
+
+/**
+ * Destructor. Frees analog output resource
+ */
+AnalogOutput::~AnalogOutput() {
+  freeAnalogOutputPort(m_port);
+  outputs->Free(m_channel);
+}
+
+/**
+ * Set the value of the analog output
+ *
+ * @param voltage The output value in Volts, from 0.0 to +5.0
+ */
+void AnalogOutput::SetVoltage(float voltage) {
+  int32_t status = 0;
+  setAnalogOutput(m_port, voltage, &status);
+
+  wpi_setErrorWithContext(status, getHALErrorMessage(status));
+}
+
+/**
+ * Get the voltage of the analog output
+ *
+ * @return The value in Volts, from 0.0 to +5.0
+ */
+float AnalogOutput::GetVoltage() const {
+  int32_t status = 0;
+  float voltage = getAnalogOutput(m_port, &status);
+
+  wpi_setErrorWithContext(status, getHALErrorMessage(status));
+
+  return voltage;
+}
+
+void AnalogOutput::UpdateTable() {
+  if (m_table != nullptr) {
+    m_table->PutNumber("Value", GetVoltage());
+  }
+}
+
+void AnalogOutput::StartLiveWindowMode() {}
+
+void AnalogOutput::StopLiveWindowMode() {}
+
+std::string AnalogOutput::GetSmartDashboardType() const {
+  return "Analog Output";
+}
+
+void AnalogOutput::InitTable(std::shared_ptr<ITable> subTable) {
+  m_table = subTable;
+  UpdateTable();
+}
+
+std::shared_ptr<ITable> AnalogOutput::GetTable() const { return m_table; }