WPILibC++  2018.4.1-20180928014753-1210-gac7dfa5
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Modules Pages
DriverStation.h
1 /*----------------------------------------------------------------------------*/
2 /* Copyright (c) 2008-2018 FIRST. All Rights Reserved. */
3 /* Open Source Software - may be modified and shared by FRC teams. The code */
4 /* must be accompanied by the FIRST BSD license file in the root directory of */
5 /* the project. */
6 /*----------------------------------------------------------------------------*/
7 
8 #pragma once
9 
10 #include <array>
11 #include <atomic>
12 #include <memory>
13 #include <string>
14 #include <thread>
15 
16 #include <hal/DriverStation.h>
17 #include <wpi/Twine.h>
18 #include <wpi/condition_variable.h>
19 #include <wpi/deprecated.h>
20 #include <wpi/mutex.h>
21 
22 #include "frc/ErrorBase.h"
23 #include "frc/RobotState.h"
24 
25 namespace frc {
26 
27 class MatchDataSender;
28 
33 class DriverStation : public ErrorBase {
34  public:
35  enum Alliance { kRed, kBlue, kInvalid };
36  enum MatchType { kNone, kPractice, kQualification, kElimination };
37 
38  ~DriverStation() override;
39 
40  DriverStation(const DriverStation&) = delete;
41  DriverStation& operator=(const DriverStation&) = delete;
42 
48  static DriverStation& GetInstance();
49 
55  static void ReportError(const wpi::Twine& error);
56 
62  static void ReportWarning(const wpi::Twine& error);
63 
69  static void ReportError(bool isError, int code, const wpi::Twine& error,
70  const wpi::Twine& location, const wpi::Twine& stack);
71 
72  static constexpr int kJoystickPorts = 6;
73 
81  bool GetStickButton(int stick, int button);
82 
91  bool GetStickButtonPressed(int stick, int button);
92 
101  bool GetStickButtonReleased(int stick, int button);
102 
113  double GetStickAxis(int stick, int axis);
114 
120  int GetStickPOV(int stick, int pov);
121 
128  int GetStickButtons(int stick) const;
129 
136  int GetStickAxisCount(int stick) const;
137 
144  int GetStickPOVCount(int stick) const;
145 
152  int GetStickButtonCount(int stick) const;
153 
160  bool GetJoystickIsXbox(int stick) const;
161 
168  int GetJoystickType(int stick) const;
169 
176  std::string GetJoystickName(int stick) const;
177 
184  int GetJoystickAxisType(int stick, int axis) const;
185 
191  bool IsEnabled() const;
192 
198  bool IsDisabled() const;
199 
205  bool IsAutonomous() const;
206 
212  bool IsOperatorControl() const;
213 
219  bool IsTest() const;
220 
226  bool IsDSAttached() const;
227 
237  bool IsNewControlData() const;
238 
245  bool IsFMSAttached() const;
246 
256  WPI_DEPRECATED("Use RobotController static class method")
257  bool IsSysActive() const;
258 
265  WPI_DEPRECATED("Use RobotController static class method")
266  bool IsBrownedOut() const;
267 
268  std::string GetGameSpecificMessage() const;
269  std::string GetEventName() const;
270  MatchType GetMatchType() const;
271  int GetMatchNumber() const;
272  int GetReplayNumber() const;
273 
281  Alliance GetAlliance() const;
282 
290  int GetLocation() const;
291 
300  void WaitForData();
301 
319  bool WaitForData(double timeout);
320 
336  double GetMatchTime() const;
337 
343  double GetBatteryVoltage() const;
344 
352  void InDisabled(bool entering) { m_userInDisabled = entering; }
353 
361  void InAutonomous(bool entering) { m_userInAutonomous = entering; }
362 
370  void InOperatorControl(bool entering) { m_userInTeleop = entering; }
371 
378  void InTest(bool entering) { m_userInTest = entering; }
379 
380  protected:
387  void GetData();
388 
389  private:
395  DriverStation();
396 
402  void ReportJoystickUnpluggedError(const wpi::Twine& message);
403 
409  void ReportJoystickUnpluggedWarning(const wpi::Twine& message);
410 
411  void Run();
412 
413  void SendMatchData();
414 
415  std::unique_ptr<MatchDataSender> m_matchDataSender;
416 
417  // Joystick button rising/falling edge flags
418  wpi::mutex m_buttonEdgeMutex;
419  std::array<HAL_JoystickButtons, kJoystickPorts> m_previousButtonStates;
420  std::array<uint32_t, kJoystickPorts> m_joystickButtonsPressed;
421  std::array<uint32_t, kJoystickPorts> m_joystickButtonsReleased;
422 
423  // Internal Driver Station thread
424  std::thread m_dsThread;
425  std::atomic<bool> m_isRunning{false};
426 
427  wpi::mutex m_waitForDataMutex;
428  wpi::condition_variable m_waitForDataCond;
429  int m_waitForDataCounter;
430 
431  // Robot state status variables
432  bool m_userInDisabled = false;
433  bool m_userInAutonomous = false;
434  bool m_userInTeleop = false;
435  bool m_userInTest = false;
436 
437  double m_nextMessageTime = 0;
438 };
439 
440 } // namespace frc
double GetBatteryVoltage() const
Read the battery voltage.
WPILib FRC namespace.
Definition: SPIAccelerometerSim.h:18
int GetStickAxisCount(int stick) const
Returns the number of axes on a given joystick port.
double GetStickAxis(int stick, int axis)
Get the value of the axis on a joystick.
void InOperatorControl(bool entering)
Only to be used to tell the Driver Station what code you claim to be executing for diagnostic purpose...
Definition: DriverStation.h:370
static DriverStation & GetInstance()
Return a reference to the singleton DriverStation.
bool GetStickButton(int stick, int button)
The state of one joystick button.
bool IsTest() const
Check if the DS is commanding test mode.
bool GetStickButtonReleased(int stick, int button)
Whether one joystick button was released since the last check.
int GetStickPOVCount(int stick) const
Returns the number of POVs on a given joystick port.
bool IsDisabled() const
Check if the robot is disabled.
Provide access to the network communication data to / from the Driver Station.
Definition: DriverStation.h:33
static void ReportWarning(const wpi::Twine &error)
Report a warning to the DriverStation messages window.
bool IsDSAttached() const
Check if the DS is attached.
double GetMatchTime() const
Return the approximate match time.
void InDisabled(bool entering)
Only to be used to tell the Driver Station what code you claim to be executing for diagnostic purpose...
Definition: DriverStation.h:352
int GetStickButtonCount(int stick) const
Returns the number of buttons on a given joystick port.
int GetStickPOV(int stick, int pov)
Get the state of a POV on the joystick.
int GetLocation() const
Return the driver station location on the field.
bool IsBrownedOut() const
Check if the system is browned out.
int GetJoystickType(int stick) const
Returns the type of joystick at a given port.
void GetData()
Copy data from the DS task for the user.
bool IsEnabled() const
Check if the DS has enabled the robot.
int GetStickButtons(int stick) const
The state of the buttons on the joystick.
Base class for most objects.
Definition: ErrorBase.h:74
Alliance GetAlliance() const
Return the alliance that the driver station says it is on.
bool GetStickButtonPressed(int stick, int button)
Whether one joystick button was pressed since the last check.
std::string GetJoystickName(int stick) const
Returns the name of the joystick at the given port.
bool IsNewControlData() const
Has a new control packet from the driver station arrived since the last time this function was called...
void InTest(bool entering)
Only to be used to tell the Driver Station what code you claim to be executing for diagnostic purpose...
Definition: DriverStation.h:378
void WaitForData()
Wait until a new packet comes from the driver station.
bool IsSysActive() const
Check if the FPGA outputs are enabled.
static void ReportError(const wpi::Twine &error)
Report an error to the DriverStation messages window.
bool IsAutonomous() const
Check if the DS is commanding autonomous mode.
Twine - A lightweight data structure for efficiently representing the concatenation of temporary valu...
Definition: Twine.h:79
bool IsFMSAttached() const
Is the driver station attached to a Field Management System?
int GetJoystickAxisType(int stick, int axis) const
Returns the types of Axes on a given joystick port.
void InAutonomous(bool entering)
Only to be used to tell the Driver Station what code you claim to be executing for diagnostic purpose...
Definition: DriverStation.h:361
bool IsOperatorControl() const
Check if the DS is commanding teleop mode.
bool GetJoystickIsXbox(int stick) const
Returns a boolean indicating if the controller is an xbox controller.