/*----------------------------------------------------------------------------*/ /* Copyright (c) FIRST 2008-2016. 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 "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; };