WPILibC++  2018.4.1-20180821013237-1172-g8d8f120
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Modules Pages
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 <string>
12 
13 #include <wpi/SmallPtrSet.h>
14 #include <wpi/Twine.h>
15 
16 #include "frc/ErrorBase.h"
17 #include "frc/commands/Subsystem.h"
18 #include "frc/smartdashboard/SendableBase.h"
19 
20 namespace frc {
21 
22 class CommandGroup;
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 
80  explicit Command(Subsystem& requirement);
81 
89  Command(const wpi::Twine& name, double timeout);
90 
97  Command(const wpi::Twine& name, Subsystem& requirement);
98 
106  Command(double timeout, Subsystem& requirement);
107 
116  Command(const wpi::Twine& name, double timeout, Subsystem& requirement);
117 
118  ~Command() override = default;
119 
127  double TimeSinceInitialized() const;
128 
139  void Requires(Subsystem* s);
140 
148  void Start();
149 
155  bool Run();
156 
168  void Cancel();
169 
178  bool IsRunning() const;
179 
185  bool IsInitialized() const;
186 
192  bool IsCompleted() const;
193 
199  bool IsCanceled() const;
200 
206  bool IsInterruptible() const;
207 
213  void SetInterruptible(bool interruptible);
214 
221  bool DoesRequire(Subsystem* subsystem) const;
222 
224 
232  const SubsystemSet& GetRequirements() const;
233 
242  CommandGroup* GetGroup() const;
243 
252  void SetRunWhenDisabled(bool run);
253 
261  bool WillRunWhenDisabled() const;
262 
270  int GetID() const;
271 
272  protected:
279  void SetTimeout(double timeout);
280 
289  bool IsTimedOut() const;
290 
298  bool AssertUnlocked(const std::string& message);
299 
305  void SetParent(CommandGroup* parent);
306 
312  bool IsParented() const;
313 
320  void ClearRequirements();
321 
326  virtual void Initialize();
327 
332  virtual void Execute();
333 
350  virtual bool IsFinished() = 0;
351 
358  virtual void End();
359 
370  virtual void Interrupted();
371 
372  virtual void _Initialize();
373  virtual void _Interrupted();
374  virtual void _Execute();
375  virtual void _End();
376 
383  virtual void _Cancel();
384 
385  friend class ConditionalCommand;
386 
387  private:
391  void LockChanges();
392 
398  void Removed();
399 
411  void StartRunning();
412 
418  void StartTiming();
419 
420  // The time since this command was initialized
421  double m_startTime = -1;
422 
423  // The time (in seconds) before this command "times out" (-1 if no timeout)
424  double m_timeout;
425 
426  // Whether or not this command has been initialized
427  bool m_initialized = false;
428 
429  // The requirements (or null if no requirements)
430  wpi::SmallPtrSet<Subsystem*, 4> m_requirements;
431 
432  // Whether or not it is running
433  bool m_running = false;
434 
435  // Whether or not it is interruptible
436  bool m_interruptible = true;
437 
438  // Whether or not it has been canceled
439  bool m_canceled = false;
440 
441  // Whether or not it has been locked
442  bool m_locked = false;
443 
444  // Whether this command should run when the robot is disabled
445  bool m_runWhenDisabled = false;
446 
447  // The CommandGroup this is in
448  CommandGroup* m_parent = nullptr;
449 
450  // Whether or not this command has completed running
451  bool m_completed = false;
452 
453  int m_commandID = m_commandCounter++;
454  static int m_commandCounter;
455 
456  public:
457  void InitSendable(SendableBuilder& builder) override;
458 };
459 
460 } // namespace frc
WPILib FRC namespace.
Definition: SPIAccelerometerSim.h:18
bool WillRunWhenDisabled() const
Returns whether or not this Command will run when the robot is disabled, or if it will cancel itself...
const SubsystemSet & GetRequirements() const
Returns the requirements (as an std::set of Subsystem pointers) of this command.
bool IsTimedOut() const
Returns whether or not the TimeSinceInitialized() method returns a number which is greater than or eq...
int GetID() const
Get the ID (sequence number) for this command.
void Requires(Subsystem *s)
This method specifies that the given Subsystem is used by this command.
void Cancel()
This will cancel the current command.
void ClearRequirements()
Clears list of subsystem requirements.
Definition: Subsystem.h:23
void Start()
Starts up the command.
virtual bool IsFinished()=0
Returns whether this command is finished.
A templated base class for SmallPtrSet which provides the typesafe interface that is common across al...
Definition: SmallPtrSet.h:324
Command()
Creates a new command.
bool IsCanceled() const
Returns whether or not this has been canceled.
void SetParent(CommandGroup *parent)
Sets the parent of this command.
bool IsInitialized() const
Returns whether or not the command has been initialized.
virtual void End()
Called when the command ended peacefully.
virtual void Initialize()
The initialize method is called the first time this Command is run after being started.
bool IsInterruptible() const
Returns whether or not this command can be interrupted.
virtual void Execute()
The execute method is called repeatedly until this Command either finishes or is canceled.
double TimeSinceInitialized() const
Returns the time since this command was initialized (in seconds).
bool IsRunning() const
Returns whether or not the command is running.
bool DoesRequire(Subsystem *subsystem) const
Checks if the command requires the given Subsystem.
A CommandGroup is a list of commands which are executed in sequence.
Definition: CommandGroup.h:36
bool IsParented() const
Returns whether the command has a parent.
void SetInterruptible(bool interruptible)
Sets whether or not this command can be interrupted.
Base class for most objects.
Definition: ErrorBase.h:74
bool AssertUnlocked(const std::string &message)
If changes are locked, then this will generate a CommandIllegalUse error.
Definition: SendableBase.h:19
bool IsCompleted() const
Returns whether or not the command has completed running.
Definition: SendableBuilder.h:23
CommandGroup * GetGroup() const
Returns the CommandGroup that this command is a part of.
bool Run()
The run method is used internally to actually run the commands.
The Command class is at the very core of the entire command framework.
Definition: Command.h:48
SmallPtrSet - This class implements a set which is optimized for holding SmallSize or less elements...
Definition: SmallPtrSet.h:395
void InitSendable(SendableBuilder &builder) override
Initializes this Sendable object.
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
void SetRunWhenDisabled(bool run)
Sets whether or not this Command should run when the robot is disabled.
virtual void _Cancel()
This works like Cancel(), except that it doesn't throw an exception if it is a part of a command grou...
Definition: Scheduler.h:21
void SetTimeout(double timeout)
Sets the timeout of this command.
virtual void Interrupted()
Called when the command ends because somebody called Cancel() or another command shared the same requ...