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/hal/lib/Athena/Solenoid.cpp b/hal/lib/Athena/Solenoid.cpp
new file mode 100644
index 0000000..a95d836
--- /dev/null
+++ b/hal/lib/Athena/Solenoid.cpp
@@ -0,0 +1,97 @@
+
+#include "HAL/Solenoid.hpp"
+
+#include "HAL/Port.h"
+#include "HAL/Errors.hpp"
+#include "ChipObject.h"
+#include "FRC_NetworkCommunication/LoadOut.h"
+#include "ctre/PCM.h"
+
+static const int NUM_MODULE_NUMBERS = 63;
+
+PCM *modules[NUM_MODULE_NUMBERS] = { NULL };
+
+struct solenoid_port_t {
+	PCM *module;
+	uint32_t pin;
+};
+
+void initializePCM(int module) {
+	if(!modules[module]) {
+		modules[module] = new PCM(module);
+	}
+}
+
+void* initializeSolenoidPort(void *port_pointer, int32_t *status) {
+	Port* port = (Port*) port_pointer;
+	initializePCM(port->module);
+	
+	solenoid_port_t *solenoid_port = new solenoid_port_t;
+	solenoid_port->module = modules[port->module];
+	solenoid_port->pin = port->pin;
+
+	return solenoid_port;
+}
+
+void freeSolenoidPort(void* solenoid_port_pointer) {
+	solenoid_port_t* port = (solenoid_port_t*) solenoid_port_pointer;
+	delete port;
+}
+
+bool checkSolenoidModule(uint8_t module) {
+	return module < NUM_MODULE_NUMBERS;
+}
+
+bool getSolenoid(void* solenoid_port_pointer, int32_t *status) {
+	solenoid_port_t* port = (solenoid_port_t*) solenoid_port_pointer;
+	bool value;
+
+	*status = port->module->GetSolenoid(port->pin, value);
+
+	return value;
+}
+
+uint8_t getAllSolenoids(void* solenoid_port_pointer, int32_t *status) {
+	solenoid_port_t* port = (solenoid_port_t*) solenoid_port_pointer;
+	uint8_t value;
+
+	*status = port->module->GetAllSolenoids(value);
+
+	return value;
+}
+
+void setSolenoid(void* solenoid_port_pointer, bool value, int32_t *status) {
+	solenoid_port_t* port = (solenoid_port_t*) solenoid_port_pointer;
+
+	*status = port->module->SetSolenoid(port->pin, value);
+}
+
+int getPCMSolenoidBlackList(void* solenoid_port_pointer, int32_t *status){
+	solenoid_port_t* port = (solenoid_port_t*) solenoid_port_pointer;
+	UINT8 value;
+	
+	*status = port->module->GetSolenoidBlackList(value);
+
+	return value;
+}
+bool getPCMSolenoidVoltageStickyFault(void* solenoid_port_pointer, int32_t *status){
+	solenoid_port_t* port = (solenoid_port_t*) solenoid_port_pointer;
+	bool value;
+
+	*status = port->module->GetSolenoidStickyFault(value);
+
+	return value;
+}
+bool getPCMSolenoidVoltageFault(void* solenoid_port_pointer, int32_t *status){
+	solenoid_port_t* port = (solenoid_port_t*) solenoid_port_pointer;
+	bool value;
+
+	*status = port->module->GetSolenoidFault(value);
+
+	return value;
+}
+void clearAllPCMStickyFaults_sol(void *solenoid_port_pointer, int32_t *status){
+	solenoid_port_t* port = (solenoid_port_t*) solenoid_port_pointer;
+	
+	*status = port->module->ClearStickyFaults();
+}