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/RobotBase.h b/wpilibc/Athena/include/RobotBase.h
new file mode 100644
index 0000000..2fcd146
--- /dev/null
+++ b/wpilibc/Athena/include/RobotBase.h
@@ -0,0 +1,70 @@
+/*----------------------------------------------------------------------------*/
+/* 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 "Base.h"
+#include "Task.h"
+
+class DriverStation;
+
+#define START_ROBOT_CLASS(_ClassName_)                                       \
+  int main() {                                                               \
+    if (!HALInitialize()) {                                                  \
+      std::cerr << "FATAL ERROR: HAL could not be initialized" << std::endl; \
+      return -1;                                                             \
+    }                                                                        \
+    HALReport(HALUsageReporting::kResourceType_Language,                     \
+              HALUsageReporting::kLanguage_CPlusPlus);                       \
+    _ClassName_ *robot = new _ClassName_();                                  \
+    RobotBase::robotSetup(robot);                                            \
+    return 0;                                                                \
+  }
+
+/**
+ * Implement a Robot Program framework.
+ * The RobotBase class is intended to be subclassed by a user creating a robot
+ * program.
+ * Overridden Autonomous() and OperatorControl() methods are called at the
+ * appropriate time
+ * as the match proceeds. In the current implementation, the Autonomous code
+ * will run to
+ * completion before the OperatorControl code could start. In the future the
+ * Autonomous code
+ * might be spawned as a task, then killed at the end of the Autonomous period.
+ */
+class RobotBase {
+  friend class RobotDeleter;
+
+ public:
+  static RobotBase &getInstance();
+  static void setInstance(RobotBase *robot);
+
+  bool IsEnabled() const;
+  bool IsDisabled() const;
+  bool IsAutonomous() const;
+  bool IsOperatorControl() const;
+  bool IsTest() const;
+  bool IsNewDataAvailable() const;
+  static void startRobotTask(FUNCPTR factory);
+  static void robotTask(FUNCPTR factory, Task *task);
+  virtual void StartCompetition() = 0;
+
+  static void robotSetup(RobotBase *robot);
+
+ protected:
+  RobotBase();
+  virtual ~RobotBase();
+
+  RobotBase(const RobotBase&) = delete;
+  RobotBase& operator=(const RobotBase&) = delete;
+
+  Task *m_task = nullptr;
+  DriverStation &m_ds;
+
+ private:
+  static RobotBase *m_instance;
+};