WPILibC++  2018.4.1-20180728210220-1136-g75a6720
 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 
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 
190 
198  const 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  wpi::SmallPtrSet<Subsystem*, 4> 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
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...