WPILibC++  2019.1.1-beta-2-47-gd528a77
 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/DriverStationTypes.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 
273  std::string GetGameSpecificMessage() const;
274 
280  std::string GetEventName() const;
281 
288  MatchType GetMatchType() const;
289 
295  int GetMatchNumber() const;
296 
303  int GetReplayNumber() const;
304 
312  Alliance GetAlliance() const;
313 
321  int GetLocation() const;
322 
331  void WaitForData();
332 
350  bool WaitForData(double timeout);
351 
367  double GetMatchTime() const;
368 
374  double GetBatteryVoltage() const;
375 
383  void InDisabled(bool entering) { m_userInDisabled = entering; }
384 
392  void InAutonomous(bool entering) { m_userInAutonomous = entering; }
393 
401  void InOperatorControl(bool entering) { m_userInTeleop = entering; }
402 
409  void InTest(bool entering) { m_userInTest = entering; }
410 
411  protected:
418  void GetData();
419 
420  private:
426  DriverStation();
427 
433  void ReportJoystickUnpluggedError(const wpi::Twine& message);
434 
440  void ReportJoystickUnpluggedWarning(const wpi::Twine& message);
441 
442  void Run();
443 
444  void SendMatchData();
445 
446  std::unique_ptr<MatchDataSender> m_matchDataSender;
447 
448  // Joystick button rising/falling edge flags
449  wpi::mutex m_buttonEdgeMutex;
450  std::array<HAL_JoystickButtons, kJoystickPorts> m_previousButtonStates;
451  std::array<uint32_t, kJoystickPorts> m_joystickButtonsPressed;
452  std::array<uint32_t, kJoystickPorts> m_joystickButtonsReleased;
453 
454  // Internal Driver Station thread
455  std::thread m_dsThread;
456  std::atomic<bool> m_isRunning{false};
457 
458  wpi::mutex m_waitForDataMutex;
459  wpi::condition_variable m_waitForDataCond;
460  int m_waitForDataCounter;
461 
462  // Robot state status variables
463  bool m_userInDisabled = false;
464  bool m_userInAutonomous = false;
465  bool m_userInTeleop = false;
466  bool m_userInTest = false;
467 
468  double m_nextMessageTime = 0;
469 };
470 
471 } // namespace frc
double GetBatteryVoltage() const
Read the battery voltage.
int GetReplayNumber() const
Returns the number of times the current match has been replayed from the FMS.
WPILib FRC namespace.
Definition: SPIAccelerometerSim.h:18
int GetStickAxisCount(int stick) const
Returns the number of axes on a given joystick port.
int GetMatchNumber() const
Returns the match number provided by the FMS.
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:401
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.
MatchType GetMatchType() const
Returns the type of match being played provided by the FMS.
std::string GetGameSpecificMessage() const
Returns the game specific message provided by the FMS.
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:383
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:409
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.
std::string GetEventName() const
Returns the name of the competition event provided by the FMS.
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:392
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.