/*----------------------------------------------------------------------------*/ /* 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 #include #include #include #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 #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