Squashed 'third_party/Phoenix-frc-lib/' content from commit 666d176

Change-Id: Ibaca2fc8ffb1177e786576cc1e4cc9f7a8c98f13
git-subtree-dir: third_party/Phoenix-frc-lib
git-subtree-split: 666d176a08151793044ab74e0005f13d3732ed96
diff --git a/cpp/include/ctre/phoenix/CANifier.h b/cpp/include/ctre/phoenix/CANifier.h
new file mode 100644
index 0000000..5e83b22
--- /dev/null
+++ b/cpp/include/ctre/phoenix/CANifier.h
@@ -0,0 +1,140 @@
+#pragma once
+
+#ifndef CTR_EXCLUDE_WPILIB_CLASSES
+
+#include <cstdint>
+#include "ctre/phoenix/LowLevel/CANBusAddressable.h"
+#include "ctre/phoenix/ErrorCode.h"
+#include "ctre/phoenix/paramEnum.h"
+#include "ctre/phoenix/CANifierControlFrame.h"
+#include "ctre/phoenix/CANifierStatusFrame.h"
+#include "ctre/phoenix/CANifierStickyFaults.h"
+#include "ctre/phoenix/CANifierFaults.h"
+#include "ctre/phoenix/CANifierVelocityMeasPeriod.h"
+
+namespace ctre {namespace phoenix {
+	/**
+	 * CTRE CANifier
+	 *
+	 * Device for interfacing common devices to the CAN bus.
+	 */
+class CANifier: public CANBusAddressable {
+public:
+	/**
+	 * Enum for the LED Output Channels
+	 */
+	enum LEDChannel {
+		LEDChannelA = 0, LEDChannelB = 1, LEDChannelC = 2,
+	};
+
+	/**
+	 * Enum for the PWM Input Channels
+	 */
+	enum PWMChannel {
+		PWMChannel0 = 0, PWMChannel1 = 1, PWMChannel2 = 2, PWMChannel3 = 3,
+	};
+	const int PWMChannelCount = 4;
+
+	/**
+	 * General IO Pins on the CANifier
+	 */
+	enum GeneralPin {
+		QUAD_IDX = 0,	//----- Must match CANifier_CCI enums -----//
+		QUAD_B = 1,
+		QUAD_A = 2,
+		LIMR = 3,
+		LIMF = 4,
+		SDA = 5,
+		SCL = 6,
+		SPI_CS = 7,
+		SPI_MISO_PWM2P = 8,
+		SPI_MOSI_PWM1P = 9,
+		SPI_CLK_PWM0P = 10,
+	};
+
+	/**
+	 * Structure to hold the pin values.
+	 */
+	struct PinValues {
+		bool QUAD_IDX;
+		bool QUAD_B;
+		bool QUAD_A;
+		bool LIMR;
+		bool LIMF;
+		bool SDA;
+		bool SCL;
+		bool SPI_CS_PWM3;
+		bool SPI_MISO_PWM2;
+		bool SPI_MOSI_PWM1;
+		bool SPI_CLK_PWM0;
+	};
+
+	CANifier(int deviceNumber);
+	ErrorCode SetLEDOutput(double percentOutput, LEDChannel ledChannel);
+	ErrorCode SetGeneralOutput(GeneralPin outputPin, bool outputValue, bool outputEnable);
+	ErrorCode SetGeneralOutputs(int outputBits, int isOutputBits);
+	ErrorCode GetGeneralInputs(PinValues &allPins);
+	bool GetGeneralInput(GeneralPin inputPin);
+	int GetQuadraturePosition();
+	int GetQuadratureVelocity();
+	ErrorCode SetQuadraturePosition(int newPosition, int timeoutMs);
+	ErrorCode ConfigVelocityMeasurementPeriod(
+			CANifierVelocityMeasPeriod period, int timeoutMs);
+	ErrorCode ConfigVelocityMeasurementWindow(int windowSize, int timeoutMs);
+	/**
+	 * Gets the bus voltage seen by the motor controller.
+	 *
+	 * @return The bus voltage value (in volts).
+	 */
+	double GetBusVoltage();
+	ErrorCode GetLastError();
+	ErrorCode SetPWMOutput(int pwmChannel, double dutyCycle);
+	ErrorCode EnablePWMOutput(int pwmChannel, bool bEnable);
+	ErrorCode GetPWMInput(PWMChannel pwmChannel, double dutyCycleAndPeriod[]);
+
+	//------ Custom Persistent Params ----------//
+	ErrorCode ConfigSetCustomParam(int newValue, int paramIndex,
+			int timeoutMs);
+	int ConfigGetCustomParam(int paramIndex,
+			int timeoutMs);
+	//------ Generic Param API, typically not used ----------//
+	ErrorCode ConfigSetParameter(ParamEnum param, double value,
+			uint8_t subValue, int ordinal, int timeoutMs);
+	double ConfigGetParameter(ParamEnum param, int ordinal, int timeoutMs);
+
+
+	ErrorCode SetStatusFramePeriod(CANifierStatusFrame statusFrame,
+			int periodMs, int timeoutMs);
+	/**
+	 * Gets the period of the given status frame.
+	 *
+	 * @param frame
+	 *            Frame to get the period of.
+	 * @param timeoutMs
+	 *            Timeout value in ms. @see #ConfigOpenLoopRamp
+	 * @return Period of the given status frame.
+	 */
+	int GetStatusFramePeriod(CANifierStatusFrame frame, int timeoutMs);
+	ErrorCode SetControlFramePeriod(CANifierControlFrame frame, int periodMs);
+	/**
+	 * Gets the firmware version of the device.
+	 *
+	 * @return Firmware version of device.
+	 */
+	int GetFirmwareVersion();
+	/**
+	 * Returns true if the device has reset since last call.
+	 *
+	 * @return Has a Device Reset Occurred?
+	 */
+	bool HasResetOccurred();
+	ErrorCode GetFaults(CANifierFaults & toFill);
+	ErrorCode GetStickyFaults(CANifierStickyFaults & toFill);
+	ErrorCode ClearStickyFaults(int timeoutMs);
+
+private:
+	void* m_handle;
+	bool _tempPins[11];
+};
+}}
+#endif // CTR_EXCLUDE_WPILIB_CLASSES