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/NetworkCommunication/AICalibration.h b/wpilibc/Athena/include/NetworkCommunication/AICalibration.h
new file mode 100644
index 0000000..c4a8f75
--- /dev/null
+++ b/wpilibc/Athena/include/NetworkCommunication/AICalibration.h
@@ -0,0 +1,20 @@
+
+#ifndef __AICalibration_h__
+#define __AICalibration_h__
+
+#include <stdint.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+uint32_t FRC_NetworkCommunication_nAICalibration_getLSBWeight(
+    const uint32_t aiSystemIndex, const uint32_t channel, int32_t *status);
+int32_t FRC_NetworkCommunication_nAICalibration_getOffset(
+    const uint32_t aiSystemIndex, const uint32_t channel, int32_t *status);
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif  // __AICalibration_h__
diff --git a/wpilibc/Athena/include/NetworkCommunication/CANInterfacePlugin.h b/wpilibc/Athena/include/NetworkCommunication/CANInterfacePlugin.h
new file mode 100644
index 0000000..1875980
--- /dev/null
+++ b/wpilibc/Athena/include/NetworkCommunication/CANInterfacePlugin.h
@@ -0,0 +1,109 @@
+// CANInterfacePlugin.h
+//
+//  Defines the API for building a CAN Interface Plugin to support
+//    PWM-cable-free CAN motor control on FRC robots.  This allows you
+//    to connect any CAN interface to the secure Jaguar CAN driver.
+//
+
+#ifndef __CANInterfacePlugin_h__
+#define __CANInterfacePlugin_h__
+
+#include <stdint.h>
+
+#define CAN_IS_FRAME_REMOTE 0x80000000
+#define CAN_IS_FRAME_11BIT 0x40000000
+#define CAN_29BIT_MESSAGE_ID_MASK 0x1FFFFFFF
+#define CAN_11BIT_MESSAGE_ID_MASK 0x000007FF
+
+class CANInterfacePlugin {
+ public:
+  CANInterfacePlugin() {}
+  virtual ~CANInterfacePlugin() {}
+
+  /**
+   * This entry-point of the CANInterfacePlugin is passed a message that the
+   * driver needs to send to
+   * a device on the CAN bus.
+   *
+   * This function may be called from multiple contexts and must therefore be
+   * reentrant.
+   *
+   * @param messageID The 29-bit CAN message ID in the lsbs.  The msb can
+   * indicate a remote frame.
+   * @param data A pointer to a buffer containing between 0 and 8 bytes to send
+   * with the message.  May be nullptr if dataSize is 0.
+   * @param dataSize The number of bytes to send with the message.
+   * @return Return any error code.  On success return 0.
+   */
+  virtual int32_t sendMessage(uint32_t messageID, const uint8_t *data,
+                              uint8_t dataSize) = 0;
+
+  /**
+   * This entry-point of the CANInterfacePlugin is passed buffers which should
+   * be populated with
+   * any received messages from devices on the CAN bus.
+   *
+   * This function is always called by a single task in the Jaguar driver, so it
+   * need not be reentrant.
+   *
+   * This function is expected to block for some period of time waiting for a
+   * message from the CAN bus.
+   * It may timeout periodically (returning non-zero to indicate no message was
+   * populated) to allow for
+   * shutdown and unloading of the plugin.
+   *
+   * @param messageID A reference to be populated with a received 29-bit CAN
+   * message ID in the lsbs.
+   * @param data A pointer to a buffer of 8 bytes to be populated with data
+   * received with the message.
+   * @param dataSize A reference to be populated with the size of the data
+   * received (0 - 8 bytes).
+   * @return This should return 0 if a message was populated, non-0 if no
+   * message was not populated.
+   */
+  virtual int32_t receiveMessage(uint32_t &messageID, uint8_t *data,
+                                 uint8_t &dataSize) = 0;
+
+#if defined(__linux)
+  /**
+   * This entry-point of the CANInterfacePlugin returns status of the CAN bus.
+   *
+   * This function may be called from multiple contexts and must therefore be
+   * reentrant.
+   *
+   * This function will return detailed hardware status if available for
+   * diagnostics of the CAN interface.
+   *
+   * @param busOffCount The number of times that sendMessage failed with a
+   * busOff error indicating that messages
+   *  are not successfully transmitted on the bus.
+   * @param txFullCount The number of times that sendMessage failed with a
+   * txFifoFull error indicating that messages
+   *  are not successfully received by any CAN device.
+   * @param receiveErrorCount The count of receive errors as reported by the CAN
+   * driver.
+   * @param transmitErrorCount The count of transmit errors as reported by the
+   * CAN driver.
+   * @return This should return 0 if all status was retrieved successfully or an
+   * error code if not.
+   */
+  virtual int32_t getStatus(uint32_t &busOffCount, uint32_t &txFullCount,
+                            uint32_t &receiveErrorCount,
+                            uint32_t &transmitErrorCount) {
+    return 0;
+  }
+#endif
+};
+
+/**
+ * This function allows you to register a CANInterfacePlugin to provide access a
+ * CAN bus.
+ *
+ * @param interface A pointer to an object that inherits from CANInterfacePlugin
+ * and implements
+ * the pure virtual interface.  If nullptr, unregister the current plugin.
+ */
+void FRC_NetworkCommunication_CANSessionMux_registerInterface(
+    CANInterfacePlugin *interface);
+
+#endif  // __CANInterfacePlugin_h__
diff --git a/wpilibc/Athena/include/NetworkCommunication/CANSessionMux.h b/wpilibc/Athena/include/NetworkCommunication/CANSessionMux.h
new file mode 100644
index 0000000..9cd9a3f
--- /dev/null
+++ b/wpilibc/Athena/include/NetworkCommunication/CANSessionMux.h
@@ -0,0 +1,81 @@
+// CANSessionMux.h
+//
+//  Defines the API for building a CAN Interface Plugin to support
+//    PWM-cable-free CAN motor control on FRC robots.  This allows you
+//    to connect any CAN interface to the secure Jaguar CAN driver.
+//
+
+#ifndef __CANSessionMux_h__
+#define __CANSessionMux_h__
+
+#include <stdint.h>
+
+#define CAN_SEND_PERIOD_NO_REPEAT 0
+#define CAN_SEND_PERIOD_STOP_REPEATING -1
+
+/* Flags in the upper bits of the messageID */
+#define CAN_IS_FRAME_REMOTE 0x80000000
+#define CAN_IS_FRAME_11BIT 0x40000000
+
+#define ERR_CANSessionMux_InvalidBuffer -44086
+#define ERR_CANSessionMux_MessageNotFound -44087
+#define WARN_CANSessionMux_NoToken 44087
+#define ERR_CANSessionMux_NotAllowed -44088
+#define ERR_CANSessionMux_NotInitialized -44089
+#define ERR_CANSessionMux_SessionOverrun 44050
+
+struct tCANStreamMessage {
+  uint32_t messageID;
+  uint32_t timeStamp;
+  uint8_t data[8];
+  uint8_t dataSize;
+};
+
+namespace nCANSessionMux {
+void sendMessage_wrapper(uint32_t messageID, const uint8_t *data,
+                         uint8_t dataSize, int32_t periodMs, int32_t *status);
+void receiveMessage_wrapper(uint32_t *messageID, uint32_t messageIDMask,
+                            uint8_t *data, uint8_t *dataSize,
+                            uint32_t *timeStamp, int32_t *status);
+void openStreamSession(uint32_t *sessionHandle, uint32_t messageID,
+                       uint32_t messageIDMask, uint32_t maxMessages,
+                       int32_t *status);
+void closeStreamSession(uint32_t sessionHandle);
+void readStreamSession(uint32_t sessionHandle,
+                       struct tCANStreamMessage *messages,
+                       uint32_t messagesToRead, uint32_t *messagesRead,
+                       int32_t *status);
+void getCANStatus(float *percentBusUtilization, uint32_t *busOffCount,
+                  uint32_t *txFullCount, uint32_t *receiveErrorCount,
+                  uint32_t *transmitErrorCount, int32_t *status);
+}
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+void FRC_NetworkCommunication_CANSessionMux_sendMessage(uint32_t messageID,
+                                                        const uint8_t *data,
+                                                        uint8_t dataSize,
+                                                        int32_t periodMs,
+                                                        int32_t *status);
+void FRC_NetworkCommunication_CANSessionMux_receiveMessage(
+    uint32_t *messageID, uint32_t messageIDMask, uint8_t *data,
+    uint8_t *dataSize, uint32_t *timeStamp, int32_t *status);
+void FRC_NetworkCommunication_CANSessionMux_openStreamSession(
+    uint32_t *sessionHandle, uint32_t messageID, uint32_t messageIDMask,
+    uint32_t maxMessages, int32_t *status);
+void FRC_NetworkCommunication_CANSessionMux_closeStreamSession(
+    uint32_t sessionHandle);
+void FRC_NetworkCommunication_CANSessionMux_readStreamSession(
+    uint32_t sessionHandle, struct tCANStreamMessage *messages,
+    uint32_t messagesToRead, uint32_t *messagesRead, int32_t *status);
+void FRC_NetworkCommunication_CANSessionMux_getCANStatus(
+    float *percentBusUtilization, uint32_t *busOffCount, uint32_t *txFullCount,
+    uint32_t *receiveErrorCount, uint32_t *transmitErrorCount, int32_t *status);
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif  // __CANSessionMux_h__
diff --git a/wpilibc/Athena/include/NetworkCommunication/FRCComm.h b/wpilibc/Athena/include/NetworkCommunication/FRCComm.h
new file mode 100644
index 0000000..588c8ca
--- /dev/null
+++ b/wpilibc/Athena/include/NetworkCommunication/FRCComm.h
@@ -0,0 +1,130 @@
+/*************************************************************
+ * 					NOTICE
+ *
+ * 	These are the only externally exposed functions to the
+ *   NetworkCommunication library
+ *
+ * This is an implementation of FRC Spec for Comm Protocol
+ * Revision 4.5, June 30, 2008
+ *
+ * Copyright (c) National Instruments 2008.  All Rights Reserved.
+ *
+ *************************************************************/
+
+#ifndef __FRC_COMM_H__
+#define __FRC_COMM_H__
+
+#ifdef SIMULATION
+#include <vxWorks_compat.h>
+#ifdef USE_THRIFT
+#define EXPORT_FUNC
+#else
+#define EXPORT_FUNC __declspec(dllexport) __cdecl
+#endif
+#else
+#include <stdint.h>
+#include <pthread.h>
+#define EXPORT_FUNC
+#endif
+
+#define ERR_FRCSystem_NetCommNotResponding -44049
+#define ERR_FRCSystem_NoDSConnection -44018
+
+enum AllianceStationID_t {
+  kAllianceStationID_red1,
+  kAllianceStationID_red2,
+  kAllianceStationID_red3,
+  kAllianceStationID_blue1,
+  kAllianceStationID_blue2,
+  kAllianceStationID_blue3,
+};
+
+enum MatchType_t {
+  kMatchType_none,
+  kMatchType_practice,
+  kMatchType_qualification,
+  kMatchType_elimination,
+};
+
+struct ControlWord_t {
+  uint32_t enabled : 1;
+  uint32_t autonomous : 1;
+  uint32_t test : 1;
+  uint32_t eStop : 1;
+  uint32_t fmsAttached : 1;
+  uint32_t dsAttached : 1;
+  uint32_t control_reserved : 26;
+};
+
+struct JoystickAxes_t {
+  uint16_t count;
+  int16_t axes[1];
+};
+
+struct JoystickPOV_t {
+  uint16_t count;
+  int16_t povs[1];
+};
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+int EXPORT_FUNC FRC_NetworkCommunication_Reserve(void *instance);
+#ifndef SIMULATION
+void EXPORT_FUNC
+getFPGAHardwareVersion(uint16_t *fpgaVersion, uint32_t *fpgaRevision);
+#endif
+int EXPORT_FUNC setStatusData(float battery, uint8_t dsDigitalOut,
+                              uint8_t updateNumber, const char *userDataHigh,
+                              int userDataHighLength, const char *userDataLow,
+                              int userDataLowLength, int wait_ms);
+int EXPORT_FUNC setErrorData(const char *errors, int errorsLength, int wait_ms);
+
+#ifdef SIMULATION
+void EXPORT_FUNC setNewDataSem(HANDLE);
+#else
+void EXPORT_FUNC setNewDataSem(pthread_cond_t *);
+#endif
+
+// this uint32_t is really a LVRefNum
+int EXPORT_FUNC setNewDataOccurRef(uint32_t refnum);
+
+int EXPORT_FUNC
+FRC_NetworkCommunication_getControlWord(struct ControlWord_t *controlWord);
+int EXPORT_FUNC FRC_NetworkCommunication_getAllianceStation(
+    enum AllianceStationID_t *allianceStation);
+int EXPORT_FUNC FRC_NetworkCommunication_getMatchTime(float *matchTime);
+int EXPORT_FUNC
+FRC_NetworkCommunication_getJoystickAxes(uint8_t joystickNum,
+                                         struct JoystickAxes_t *axes,
+                                         uint8_t maxAxes);
+int EXPORT_FUNC FRC_NetworkCommunication_getJoystickButtons(uint8_t joystickNum,
+                                                            uint32_t *buttons,
+                                                            uint8_t *count);
+int EXPORT_FUNC
+FRC_NetworkCommunication_getJoystickPOVs(uint8_t joystickNum,
+                                         struct JoystickPOV_t *povs,
+                                         uint8_t maxPOVs);
+int EXPORT_FUNC
+FRC_NetworkCommunication_setJoystickOutputs(uint8_t joystickNum,
+                                            uint32_t hidOutputs,
+                                            uint16_t leftRumble,
+                                            uint16_t rightRumble);
+int EXPORT_FUNC
+FRC_NetworkCommunication_getJoystickDesc(uint8_t joystickNum, uint8_t *isXBox,
+                                         uint8_t *type, char *name,
+                                         uint8_t *axisCount, uint8_t *axisTypes,
+                                         uint8_t *buttonCount,
+                                         uint8_t *povCount);
+
+void EXPORT_FUNC FRC_NetworkCommunication_getVersionString(char *version);
+int EXPORT_FUNC FRC_NetworkCommunication_observeUserProgramStarting(void);
+void EXPORT_FUNC FRC_NetworkCommunication_observeUserProgramDisabled(void);
+void EXPORT_FUNC FRC_NetworkCommunication_observeUserProgramAutonomous(void);
+void EXPORT_FUNC FRC_NetworkCommunication_observeUserProgramTeleop(void);
+void EXPORT_FUNC FRC_NetworkCommunication_observeUserProgramTest(void);
+#ifdef __cplusplus
+}
+#endif
+
+#endif
diff --git a/wpilibc/Athena/include/NetworkCommunication/LoadOut.h b/wpilibc/Athena/include/NetworkCommunication/LoadOut.h
new file mode 100644
index 0000000..5a11749
--- /dev/null
+++ b/wpilibc/Athena/include/NetworkCommunication/LoadOut.h
@@ -0,0 +1,57 @@
+
+#ifndef __LoadOut_h__
+#define __LoadOut_h__
+
+#ifdef SIMULATION
+#include <vxWorks_compat.h>
+#define EXPORT_FUNC __declspec(dllexport) __cdecl
+#else
+#include <stdint.h>
+#define EXPORT_FUNC
+#endif
+
+#define kMaxModuleNumber 2
+namespace nLoadOut {
+#if defined(SIMULATION)
+typedef enum {
+  kModuleType_Unknown = 0x00,
+  kModuleType_Analog = 0x01,
+  kModuleType_Digital = 0x02,
+  kModuleType_Solenoid = 0x03,
+} tModuleType;
+bool EXPORT_FUNC
+getModulePresence(tModuleType moduleType, uint8_t moduleNumber);
+#endif
+typedef enum {
+  kTargetClass_Unknown = 0x00,
+  kTargetClass_FRC1 = 0x10,
+  kTargetClass_FRC2 = 0x20,
+  kTargetClass_FRC3 = 0x30,
+  kTargetClass_RoboRIO = 0x40,
+#if defined(SIMULATION)
+  kTargetClass_FRC2_Analog = kTargetClass_FRC2 | kModuleType_Analog,
+  kTargetClass_FRC2_Digital = kTargetClass_FRC2 | kModuleType_Digital,
+  kTargetClass_FRC2_Solenoid = kTargetClass_FRC2 | kModuleType_Solenoid,
+#endif
+  kTargetClass_FamilyMask = 0xF0,
+  kTargetClass_ModuleMask = 0x0F,
+} tTargetClass;
+tTargetClass EXPORT_FUNC getTargetClass();
+}
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+#if defined(SIMULATION)
+uint32_t EXPORT_FUNC
+FRC_NetworkCommunication_nLoadOut_getModulePresence(uint32_t moduleType,
+                                                    uint8_t moduleNumber);
+#endif
+uint32_t EXPORT_FUNC FRC_NetworkCommunication_nLoadOut_getTargetClass();
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif  // __LoadOut_h__
diff --git a/wpilibc/Athena/include/NetworkCommunication/symModuleLink.h b/wpilibc/Athena/include/NetworkCommunication/symModuleLink.h
new file mode 100644
index 0000000..621cbb6
--- /dev/null
+++ b/wpilibc/Athena/include/NetworkCommunication/symModuleLink.h
@@ -0,0 +1,19 @@
+#ifndef __SYM_MODULE_LINK_H__
+#define __SYM_MODULE_LINK_H__
+
+#include "HAL/HAL.hpp"
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+extern STATUS moduleNameFindBySymbolName(
+    const char* symbol, /* symbol name to look for */
+    char* module        /* where to return module name */
+    );
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif