WPILibC++  unspecified
Command.h
1 /*----------------------------------------------------------------------------*/
2 /* Copyright (c) 2011-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 <memory>
11 #include <set>
12 #include <string>
13 
14 #include <llvm/Twine.h>
15 
16 #include "ErrorBase.h"
17 #include "SmartDashboard/SendableBase.h"
18 
19 namespace frc {
20 
21 class CommandGroup;
22 class Subsystem;
23 
48 class Command : public ErrorBase, public SendableBase {
49  friend class CommandGroup;
50  friend class Scheduler;
51 
52  public:
53  Command();
54  explicit Command(const llvm::Twine& name);
55  explicit Command(double timeout);
56  Command(const llvm::Twine& name, double timeout);
57  ~Command() override = default;
58  double TimeSinceInitialized() const;
59  void Requires(Subsystem* s);
60  bool IsCanceled() const;
61  void Start();
62  bool Run();
63  void Cancel();
64  bool IsRunning() const;
65  bool IsInterruptible() const;
66  void SetInterruptible(bool interruptible);
67  bool DoesRequire(Subsystem* subsystem) const;
68  typedef std::set<Subsystem*> SubsystemSet;
69  SubsystemSet GetRequirements() const;
70  CommandGroup* GetGroup() const;
71  void SetRunWhenDisabled(bool run);
72  bool WillRunWhenDisabled() const;
73  int GetID() const;
74 
75  protected:
76  void SetTimeout(double timeout);
77  bool IsTimedOut() const;
78  bool AssertUnlocked(const std::string& message);
79  void SetParent(CommandGroup* parent);
80  bool IsParented() const;
81  void ClearRequirements();
82 
83  virtual void Initialize();
84  virtual void Execute();
85 
102  virtual bool IsFinished() = 0;
103 
104  virtual void End();
105  virtual void Interrupted();
106 
107  virtual void _Initialize();
108  virtual void _Interrupted();
109  virtual void _Execute();
110  virtual void _End();
111  virtual void _Cancel();
112 
113  friend class ConditionalCommand;
114 
115  private:
116  void LockChanges();
117  void Removed();
118  void StartRunning();
119  void StartTiming();
120 
121  // The time since this command was initialized
122  double m_startTime = -1;
123 
124  // The time (in seconds) before this command "times out" (-1 if no timeout)
125  double m_timeout;
126 
127  // Whether or not this command has been initialized
128  bool m_initialized = false;
129 
130  // The requirements (or null if no requirements)
131  SubsystemSet m_requirements;
132 
133  // Whether or not it is running
134  bool m_running = false;
135 
136  // Whether or not it is interruptible
137  bool m_interruptible = true;
138 
139  // Whether or not it has been canceled
140  bool m_canceled = false;
141 
142  // Whether or not it has been locked
143  bool m_locked = false;
144 
145  // Whether this command should run when the robot is disabled
146  bool m_runWhenDisabled = false;
147 
148  // The CommandGroup this is in
149  CommandGroup* m_parent = nullptr;
150 
151  int m_commandID = m_commandCounter++;
152  static int m_commandCounter;
153 
154  public:
155  void InitSendable(SendableBuilder& builder) override;
156 };
157 
158 } // namespace frc
bool IsCanceled() const
Returns whether or not this has been canceled.
Definition: Command.cpp:368
Command()
Creates a new command.
Definition: Command.cpp:29
Definition: RobotController.cpp:14
double TimeSinceInitialized() const
Returns the time since this command was initialized (in seconds).
Definition: Command.cpp:99
int GetID() const
Get the ID (sequence number) for this command.
Definition: Command.cpp:77
bool WillRunWhenDisabled() const
Returns whether or not this Command will run when the robot is disabled, or if it will cancel itself...
Definition: Command.cpp:423
void ClearRequirements()
Clears list of subsystem requirements.
Definition: Command.cpp:305
Twine - A lightweight data structure for efficiently representing the concatenation of temporary valu...
Definition: Twine.h:79
Definition: Subsystem.h:23
void Start()
Starts up the command.
Definition: Command.cpp:152
virtual bool IsFinished()=0
Returns whether this command is finished.
bool DoesRequire(Subsystem *subsystem) const
Checks if the command requires the given Subsystem.
Definition: Command.cpp:392
bool Run()
The run method is used internally to actually run the commands.
Definition: Command.cpp:167
void SetTimeout(double timeout)
Sets the timeout of this command.
Definition: Command.cpp:85
CommandGroup * GetGroup() const
Returns the CommandGroup that this command is a part of.
Definition: Command.cpp:404
void SetRunWhenDisabled(bool run)
Sets whether or not this Command should run when the robot is disabled.
Definition: Command.cpp:414
bool IsRunning() const
Returns whether or not the command is running.
Definition: Command.cpp:331
bool IsInterruptible() const
Returns whether or not this command can be interrupted.
Definition: Command.cpp:375
A CommandGroup is a list of commands which are executed in sequence.
Definition: CommandGroup.h:37
bool AssertUnlocked(const std::string &message)
If changes are locked, then this will generate a CommandIllegalUse error.
Definition: Command.cpp:264
Base class for most objects.
Definition: ErrorBase.h:74
void SetInterruptible(bool interruptible)
Sets whether or not this command can be interrupted.
Definition: Command.cpp:382
Definition: SendableBase.h:19
virtual void _Cancel()
This works like Cancel(), except that it doesn&#39;t throw an exception if it is a part of a command grou...
Definition: Command.cpp:359
virtual void Initialize()
The initialize method is called the first time this Command is run after being started.
Definition: Command.cpp:188
Definition: SendableBuilder.h:23
virtual void Execute()
The execute method is called repeatedly until this Command either finishes or is canceled.
Definition: Command.cpp:194
void SetParent(CommandGroup *parent)
Sets the parent of this command.
Definition: Command.cpp:279
The Command class is at the very core of the entire command framework.
Definition: Command.h:48
void Cancel()
This will cancel the current command.
Definition: Command.cpp:344
A ConditionalCommand is a Command that starts one of two commands.
Definition: ConditionalCommand.h:33
bool IsParented() const
Returns whether the command has a parent.
Definition: Command.cpp:297
virtual void End()
Called when the command ended peacefully.
Definition: Command.cpp:200
void InitSendable(SendableBuilder &builder) override
Initializes this Sendable object.
Definition: Command.cpp:425
void Requires(Subsystem *s)
This method specifies that the given Subsystem is used by this command.
Definition: Command.cpp:116
SubsystemSet GetRequirements() const
Returns the requirements (as an std::set of Subsystem pointers) of this command.
Definition: Command.cpp:248
virtual void Interrupted()
Called when the command ends because somebody called Cancel() or another command shared the same requ...
Definition: Command.cpp:212
bool IsTimedOut() const
Returns whether or not the TimeSinceInitialized() method returns a number which is greater than or eq...
Definition: Command.cpp:237
Definition: Scheduler.h:27