WPILibC++  2018.4.1-20180923204725-1195-g5c6b78e
 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& subsystem);
81 
89  Command(const wpi::Twine& name, double timeout);
90 
97  Command(const wpi::Twine& name, Subsystem& subsystem);
98 
105  Command(double timeout, Subsystem& subsystem);
106 
114  Command(const wpi::Twine& name, double timeout, Subsystem& subsystem);
115 
116  ~Command() override = default;
117 
125  double TimeSinceInitialized() const;
126 
137  void Requires(Subsystem* s);
138 
146  void Start();
147 
153  bool Run();
154 
166  void Cancel();
167 
176  bool IsRunning() const;
177 
183  bool IsInitialized() const;
184 
190  bool IsCompleted() const;
191 
197  bool IsCanceled() const;
198 
204  bool IsInterruptible() const;
205 
211  void SetInterruptible(bool interruptible);
212 
219  bool DoesRequire(Subsystem* subsystem) const;
220 
222 
230  const SubsystemSet& GetRequirements() const;
231 
240  CommandGroup* GetGroup() const;
241 
250  void SetRunWhenDisabled(bool run);
251 
259  bool WillRunWhenDisabled() const;
260 
268  int GetID() const;
269 
270  protected:
277  void SetTimeout(double timeout);
278 
287  bool IsTimedOut() const;
288 
296  bool AssertUnlocked(const std::string& message);
297 
303  void SetParent(CommandGroup* parent);
304 
310  bool IsParented() const;
311 
318  void ClearRequirements();
319 
324  virtual void Initialize();
325 
330  virtual void Execute();
331 
348  virtual bool IsFinished() = 0;
349 
356  virtual void End();
357 
368  virtual void Interrupted();
369 
370  virtual void _Initialize();
371  virtual void _Interrupted();
372  virtual void _Execute();
373  virtual void _End();
374 
381  virtual void _Cancel();
382 
383  friend class ConditionalCommand;
384 
385  private:
389  void LockChanges();
390 
396  void Removed();
397 
409  void StartRunning();
410 
416  void StartTiming();
417 
418  // The time since this command was initialized
419  double m_startTime = -1;
420 
421  // The time (in seconds) before this command "times out" (-1 if no timeout)
422  double m_timeout;
423 
424  // Whether or not this command has been initialized
425  bool m_initialized = false;
426 
427  // The requirements (or null if no requirements)
428  wpi::SmallPtrSet<Subsystem*, 4> m_requirements;
429 
430  // Whether or not it is running
431  bool m_running = false;
432 
433  // Whether or not it is interruptible
434  bool m_interruptible = true;
435 
436  // Whether or not it has been canceled
437  bool m_canceled = false;
438 
439  // Whether or not it has been locked
440  bool m_locked = false;
441 
442  // Whether this command should run when the robot is disabled
443  bool m_runWhenDisabled = false;
444 
445  // The CommandGroup this is in
446  CommandGroup* m_parent = nullptr;
447 
448  // Whether or not this command has completed running
449  bool m_completed = false;
450 
451  int m_commandID = m_commandCounter++;
452  static int m_commandCounter;
453 
454  public:
455  void InitSendable(SendableBuilder& builder) override;
456 };
457 
458 } // 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...