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 <wpi/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:
58  Command();
59 
65  explicit Command(const wpi::Twine& name);
66 
73  explicit Command(double timeout);
74 
82  Command(const wpi::Twine& name, double timeout);
83 
84  ~Command() override = default;
85 
93  double TimeSinceInitialized() const;
94 
105  void Requires(Subsystem* s);
106 
114  void Start();
115 
121  bool Run();
122 
134  void Cancel();
135 
144  bool IsRunning() const;
145 
151  bool IsInitialized() const;
152 
158  bool IsCompleted() const;
159 
165  bool IsCanceled() const;
166 
172  bool IsInterruptible() const;
173 
179  void SetInterruptible(bool interruptible);
180 
187  bool DoesRequire(Subsystem* subsystem) const;
188 
189  typedef std::set<Subsystem*> SubsystemSet;
190 
198  SubsystemSet GetRequirements() const;
199 
208  CommandGroup* GetGroup() const;
209 
218  void SetRunWhenDisabled(bool run);
219 
227  bool WillRunWhenDisabled() const;
228 
236  int GetID() const;
237 
238  protected:
245  void SetTimeout(double timeout);
246 
255  bool IsTimedOut() const;
256 
264  bool AssertUnlocked(const std::string& message);
265 
271  void SetParent(CommandGroup* parent);
272 
278  bool IsParented() const;
279 
286  void ClearRequirements();
287 
292  virtual void Initialize();
293 
298  virtual void Execute();
299 
316  virtual bool IsFinished() = 0;
317 
324  virtual void End();
325 
336  virtual void Interrupted();
337 
338  virtual void _Initialize();
339  virtual void _Interrupted();
340  virtual void _Execute();
341  virtual void _End();
342 
349  virtual void _Cancel();
350 
351  friend class ConditionalCommand;
352 
353  private:
357  void LockChanges();
358 
364  void Removed();
365 
377  void StartRunning();
378 
384  void StartTiming();
385 
386  // The time since this command was initialized
387  double m_startTime = -1;
388 
389  // The time (in seconds) before this command "times out" (-1 if no timeout)
390  double m_timeout;
391 
392  // Whether or not this command has been initialized
393  bool m_initialized = false;
394 
395  // The requirements (or null if no requirements)
396  SubsystemSet m_requirements;
397 
398  // Whether or not it is running
399  bool m_running = false;
400 
401  // Whether or not it is interruptible
402  bool m_interruptible = true;
403 
404  // Whether or not it has been canceled
405  bool m_canceled = false;
406 
407  // Whether or not it has been locked
408  bool m_locked = false;
409 
410  // Whether this command should run when the robot is disabled
411  bool m_runWhenDisabled = false;
412 
413  // The CommandGroup this is in
414  CommandGroup* m_parent = nullptr;
415 
416  // Whether or not this command has completed running
417  bool m_completed = false;
418 
419  int m_commandID = m_commandCounter++;
420  static int m_commandCounter;
421 
422  public:
423  void InitSendable(SendableBuilder& builder) override;
424 };
425 
426 } // namespace frc
bool IsCanceled() const
Returns whether or not this has been canceled.
Definition: Command.cpp:105
Command()
Creates a new command.
Definition: Command.cpp:24
Definition: Utility.cpp:119
double TimeSinceInitialized() const
Returns the time since this command was initialized (in seconds).
Definition: Command.cpp:46
int GetID() const
Get the ID (sequence number) for this command.
Definition: Command.cpp:127
bool IsInitialized() const
Returns whether or not the command has been initialized.
Definition: Command.cpp:101
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:125
void ClearRequirements()
Clears list of subsystem requirements.
Definition: Command.cpp:165
Definition: Subsystem.h:23
void Start()
Starts up the command.
Definition: Command.cpp:62
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:113
bool Run()
The run method is used internally to actually run the commands.
Definition: Command.cpp:73
void SetTimeout(double timeout)
Sets the timeout of this command.
Definition: Command.cpp:129
CommandGroup * GetGroup() const
Returns the CommandGroup that this command is a part of.
Definition: Command.cpp:121
void SetRunWhenDisabled(bool run)
Sets whether or not this Command should run when the robot is disabled.
Definition: Command.cpp:123
bool IsRunning() const
Returns whether or not the command is running.
Definition: Command.cpp:99
bool IsInterruptible() const
Returns whether or not this command can be interrupted.
Definition: Command.cpp:107
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:140
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:109
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:183
virtual void Initialize()
The initialize method is called the first time this Command is run after being started.
Definition: Command.cpp:167
bool IsCompleted() const
Returns whether or not the command has completed running.
Definition: Command.cpp:103
Definition: SendableBuilder.h:23
virtual void Execute()
The execute method is called repeatedly until this Command either finishes or is canceled.
Definition: Command.cpp:169
void SetParent(CommandGroup *parent)
Sets the parent of this command.
Definition: Command.cpp:150
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:90
A ConditionalCommand is a Command that starts one of two commands.
Definition: ConditionalCommand.h:35
Twine - A lightweight data structure for efficiently representing the concatenation of temporary valu...
Definition: Twine.h:79
bool IsParented() const
Returns whether the command has a parent.
Definition: Command.cpp:163
virtual void End()
Called when the command ended peacefully.
Definition: Command.cpp:171
void InitSendable(SendableBuilder &builder) override
Initializes this Sendable object.
Definition: Command.cpp:213
void Requires(Subsystem *s)
This method specifies that the given Subsystem is used by this command.
Definition: Command.cpp:53
SubsystemSet GetRequirements() const
Returns the requirements (as an std::set of Subsystem pointers) of this command.
Definition: Command.cpp:117
virtual void Interrupted()
Called when the command ends because somebody called Cancel() or another command shared the same requ...
Definition: Command.cpp:173
bool IsTimedOut() const
Returns whether or not the TimeSinceInitialized() method returns a number which is greater than or eq...
Definition: Command.cpp:136
Definition: Scheduler.h:27