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/include/AnalogTriggerOutput.h b/wpilibc/Athena/include/AnalogTriggerOutput.h
new file mode 100644
index 0000000..27ad3b8
--- /dev/null
+++ b/wpilibc/Athena/include/AnalogTriggerOutput.h
@@ -0,0 +1,77 @@
+/*----------------------------------------------------------------------------*/
+/* Copyright (c) FIRST 2008. 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 $(WIND_BASE)/WPILib.  */
+/*----------------------------------------------------------------------------*/
+#pragma once
+
+#include "DigitalSource.h"
+
+class AnalogTrigger;
+
+/**
+ * Class to represent a specific output from an analog trigger.
+ * This class is used to get the current output value and also as a
+ * DigitalSource
+ * to provide routing of an output to digital subsystems on the FPGA such as
+ * Counter, Encoder, and Interrupt.
+ *
+ * The TriggerState output indicates the primary output value of the trigger.
+ * If the analog
+ * signal is less than the lower limit, the output is false.  If the analog
+ * value is greater
+ * than the upper limit, then the output is true.  If the analog value is in
+ * between, then
+ * the trigger output state maintains its most recent value.
+ *
+ * The InWindow output indicates whether or not the analog signal is inside the
+ * range defined
+ * by the limits.
+ *
+ * The RisingPulse and FallingPulse outputs detect an instantaneous transition
+ * from above the
+ * upper limit to below the lower limit, and vise versa.  These pulses represent
+ * a rollover
+ * condition of a sensor and can be routed to an up / down couter or to
+ * interrupts.  Because
+ * the outputs generate a pulse, they cannot be read directly.  To help ensure
+ * that a rollover
+ * condition is not missed, there is an average rejection filter available that
+ * operates on the
+ * upper 8 bits of a 12 bit number and selects the nearest outlyer of 3 samples.
+ * This will reject
+ * a sample that is (due to averaging or sampling) errantly between the two
+ * limits.  This filter
+ * will fail if more than one sample in a row is errantly in between the two
+ * limits.  You may see
+ * this problem if attempting to use this feature with a mechanical rollover
+ * sensor, such as a
+ * 360 degree no-stop potentiometer without signal conditioning, because the
+ * rollover transition
+ * is not sharp / clean enough.  Using the averaging engine may help with this,
+ * but rotational speeds of
+ * the sensor will then be limited.
+ */
+class AnalogTriggerOutput : public DigitalSource {
+  friend class AnalogTrigger;
+
+ public:
+  virtual ~AnalogTriggerOutput();
+  bool Get() const;
+
+  // DigitalSource interface
+  virtual uint32_t GetChannelForRouting() const override;
+  virtual uint32_t GetModuleForRouting() const override;
+  virtual bool GetAnalogTriggerForRouting() const override;
+
+ protected:
+  AnalogTriggerOutput(const AnalogTrigger &trigger, AnalogTriggerType outputType);
+
+ private:
+  // Uses reference rather than smart pointer because a user can not construct
+  // an AnalogTriggerOutput themselves and because the AnalogTriggerOutput
+  // should always be in scope at the same time as an AnalogTrigger.
+  const AnalogTrigger &m_trigger;
+  AnalogTriggerType m_outputType;
+};