Squashed 'third_party/allwpilib_2017/' content from commit 35ac87d
Change-Id: I7bb6f5556c30d3f5a092e68de0be9c710c60c9f4
git-subtree-dir: third_party/allwpilib_2017
git-subtree-split: 35ac87d6ff8b7f061c4f18c9ea316e5dccd4888a
diff --git a/wpilibc/sim/include/DriverStation.h b/wpilibc/sim/include/DriverStation.h
new file mode 100644
index 0000000..c9218dd
--- /dev/null
+++ b/wpilibc/sim/include/DriverStation.h
@@ -0,0 +1,147 @@
+/*----------------------------------------------------------------------------*/
+/* Copyright (c) FIRST 2008-2017. 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 the root directory of */
+/* the project. */
+/*----------------------------------------------------------------------------*/
+
+#pragma once
+
+#include <condition_variable>
+#include <mutex>
+#include <string>
+
+#include <gazebo/transport/transport.hh>
+
+#include "RobotState.h"
+#include "SensorBase.h"
+#include "llvm/StringRef.h"
+#include "simulation/gz_msgs/msgs.h"
+
+#ifdef _WIN32
+// Ensure that Winsock2.h is included before Windows.h, which can get
+// pulled in by anybody (e.g., Boost).
+#include <Winsock2.h>
+#endif
+
+namespace frc {
+
+struct HALCommonControlData;
+class AnalogInput;
+
+/**
+ * Provide access to the network communication data to / from the Driver
+ * Station.
+ */
+class DriverStation : public SensorBase, public RobotStateInterface {
+ public:
+ enum Alliance { kRed, kBlue, kInvalid };
+
+ virtual ~DriverStation() = default;
+ static DriverStation& GetInstance();
+ static void ReportError(llvm::StringRef error);
+ static void ReportWarning(llvm::StringRef error);
+ static void ReportError(bool is_error, int code, llvm::StringRef error,
+ llvm::StringRef location, llvm::StringRef stack);
+
+ static const int kBatteryChannel = 7;
+ static const int kJoystickPorts = 4;
+ static const int kJoystickAxes = 6;
+
+ double GetStickAxis(int stick, int axis);
+ bool GetStickButton(int stick, int button);
+ int16_t GetStickButtons(int stick);
+
+ double GetAnalogIn(int channel);
+ bool GetDigitalIn(int channel);
+ void SetDigitalOut(int channel, bool value);
+ bool GetDigitalOut(int channel);
+
+ bool IsEnabled() const;
+ bool IsDisabled() const;
+ bool IsAutonomous() const;
+ bool IsOperatorControl() const;
+ bool IsTest() const;
+ bool IsFMSAttached() const;
+
+ int GetPacketNumber() const;
+ Alliance GetAlliance() const;
+ int GetLocation() const;
+ void WaitForData();
+ bool WaitForData(double timeout);
+ double GetMatchTime() const;
+ double GetBatteryVoltage() const;
+ uint16_t GetTeamNumber() const;
+
+ void IncrementUpdateNumber() { m_updateNumber++; }
+
+ /**
+ * Only to be used to tell the Driver Station what code you claim to be
+ * executing for diagnostic purposes only.
+ *
+ * @param entering If true, starting disabled code; if false, leaving
+ * disabled code
+ */
+ void InDisabled(bool entering) { m_userInDisabled = entering; }
+ /**
+ * Only to be used to tell the Driver Station what code you claim to be
+ * executing for diagnostic purposes only.
+ *
+ * @param entering If true, starting autonomous code; if false, leaving
+ * autonomous code
+ */
+ void InAutonomous(bool entering) { m_userInAutonomous = entering; }
+ /**
+ * Only to be used to tell the Driver Station what code you claim to be
+ * executing for diagnostic purposes only.
+ *
+ * @param entering If true, starting teleop code; if false, leaving teleop
+ * code
+ */
+ void InOperatorControl(bool entering) { m_userInTeleop = entering; }
+ /**
+ * Only to be used to tell the Driver Station what code you claim to be
+ * executing for diagnostic purposes only.
+ *
+ * @param entering If true, starting test code; if false, leaving test code
+ */
+ void InTest(bool entering) { m_userInTest = entering; }
+
+ protected:
+ DriverStation();
+
+ private:
+ static void InitTask(DriverStation* ds);
+ static DriverStation* m_instance;
+ static int m_updateNumber;
+ ///< TODO: Get rid of this and use the semaphore signaling
+ static const double kUpdatePeriod;
+
+ void stateCallback(const gazebo::msgs::ConstDriverStationPtr& msg);
+ void joystickCallback(const gazebo::msgs::ConstFRCJoystickPtr& msg, int i);
+ void joystickCallback0(const gazebo::msgs::ConstFRCJoystickPtr& msg);
+ void joystickCallback1(const gazebo::msgs::ConstFRCJoystickPtr& msg);
+ void joystickCallback2(const gazebo::msgs::ConstFRCJoystickPtr& msg);
+ void joystickCallback3(const gazebo::msgs::ConstFRCJoystickPtr& msg);
+ void joystickCallback4(const gazebo::msgs::ConstFRCJoystickPtr& msg);
+ void joystickCallback5(const gazebo::msgs::ConstFRCJoystickPtr& msg);
+
+ int m_digitalOut = 0;
+ std::condition_variable m_waitForDataCond;
+ std::mutex m_waitForDataMutex;
+ bool m_updatedControlLoopData = false;
+ mutable std::recursive_mutex m_stateMutex;
+ std::recursive_mutex m_joystickMutex;
+ double m_approxMatchTimeOffset = 0;
+ bool m_userInDisabled = false;
+ bool m_userInAutonomous = false;
+ bool m_userInTeleop = false;
+ bool m_userInTest = false;
+
+ gazebo::transport::SubscriberPtr stateSub;
+ gazebo::transport::SubscriberPtr joysticksSub[6];
+ gazebo::msgs::DriverStationPtr state;
+ gazebo::msgs::FRCJoystickPtr joysticks[6];
+};
+
+} // namespace frc