Skill.h
Go to the documentation of this file.
1 #pragma once
2 
3 // std/stl
4 #include <mutex>
5 #include <queue>
6 #include <thread>
7 #include <functional>
8 
9 // base class
11 
12 // ArmarX
15 
16 #include <RobotAPI/interface/skills/SkillManagerInterface.h>
18 
19 #include "../error/Exception.h"
20 
21 #include "SkillID.h"
22 #include "SkillStatusUpdate.h"
23 #include "SkillDescription.h"
24 
25 namespace armarx
26 {
27  namespace skills
28  {
29  class Skill : public armarx::Logging
30  {
31  public:
32  using CallbackT = std::function<void(const aron::data::DictPtr&)>;
33 
34  struct InitResult
35  {
37  };
38 
39  struct InitInput
40  {
41  std::string executorName;
43  };
44 
45  struct MainInput
46  {
47  std::string executorName;
50  };
51 
52  struct MainResult
53  {
56  };
57 
58  struct ExitResult
59  {
61  };
62 
63  struct ExitInput
64  {
65  std::string executorName;
67  };
68 
69  Skill() = delete;
70  Skill(const SkillDescription&);
71  virtual ~Skill() = default;
72 
75  {
77  }
78 
79  // Non virtual base methods. They internally call the virtual methods
80  // Lifecycle of a skill:
81  // 1. check if it is available
82  bool isSkillAvailable(const InitInput& in) const;
83 
84  // 2. reset skill
85  void resetSkill();
86 
87  // 3. Set skill scheduled. Wait for dependencies
89 
90  // 4. All dependencies resolved. Init skill
91  InitResult initSkill(const InitInput& in);
92 
93  // 5. Execute main function of skill
94  MainResult mainOfSkill(const MainInput& in);
95 
96  // 6. Exit skill. This method is called in any case once the skill is scheduled.
97  ExitResult exitSkill(const ExitInput& in);
98 
99  // Condition listeners
100  // used to notify the skill from extern to stop
101  void notifySkillToStopASAP();
102 
103  // returns whether the skill should terminate as soon as possible
104  bool checkWhetherSkillShouldStopASAP() const;
105 
107  MainResult executeFullSkill(const MainInput& in);
108 
109  protected:
110  static MainResult MakeAbortedResult(aron::data::DictPtr data = nullptr);
111 
112  // fires if the skill reaches timeout
113  void notifyTimeoutReached();
114 
115  // helper methods to do all the static initialization stuff
116  void _init();
117  void _main();
118  void _exit();
119 
120  private:
122  virtual bool isAvailable(const InitInput& in) const;
123 
125  virtual void reset();
126 
128  virtual void waitForDependencies();
129 
131  virtual InitResult init(const InitInput& in);
132 
134  virtual MainResult main(const MainInput& in);
135 
137  virtual ExitResult exit(const ExitInput& in);
138 
140  virtual void onTimeoutReached();
141  virtual void onStopRequested();
142 
143  protected:
145  void installConditionWithCallback(std::function<bool()>&& f, std::function<void()>&& cb);
146 
147  public:
150 
154 
156  manager::dti::SkillManagerInterfacePrx manager = nullptr;
157 
159  std::string providerName = "INVALID PROVIDER NAME";
160 
161  protected:
163  std::vector<std::pair<std::function<bool()>, std::function<void()>>> callbacks;
164  mutable std::mutex callbacksMutex;
165 
167  std::atomic_bool running = false;
168  std::atomic_bool stopped = false;
169  std::atomic_bool timeoutReached = false;
170 
171  private:
172  std::thread conditionCheckingThread; // A therad that checks the conditions frequently
173  armarx::Frequency conditionCheckingThreadFrequency = armarx::Frequency::Hertz(20);
174  };
175  }
176 }
armarx::skills::TerminatedSkillStatus
TerminatedSkillStatus
Definition: SkillStatusUpdate.h:34
armarx::skills::Skill::ExitResult::status
TerminatedSkillStatus status
Definition: Skill.h:60
armarx::skills::Skill::waitForDependenciesOfSkill
void waitForDependenciesOfSkill()
Definition: Skill.cpp:50
armarx::skills::Skill::manager
manager::dti::SkillManagerInterfacePrx manager
proxy that called the skills. Will be set from provider and is const afterwards
Definition: Skill.h:156
skills
This file is part of ArmarX.
armarx::skills::Skill::MainInput::executorName
std::string executorName
Definition: Skill.h:47
armarx::skills::Skill::resetSkill
void resetSkill()
Definition: Skill.cpp:32
armarx::skills::Skill::MainInput
Definition: Skill.h:45
SkillStatusUpdate.h
SkillID.h
armarx::skills::SkillDescription
Definition: SkillDescription.h:16
armarx::skills::Skill::Skill
Skill()=delete
armarx::skills::Skill::providerName
std::string providerName
the provider that owns this skill. Will be set from provider and is const afterwards
Definition: Skill.h:159
DateTime.h
armarx::skills::Skill::notifySkillToStopASAP
void notifySkillToStopASAP()
Definition: Skill.cpp:142
armarx::skills::Skill::running
std::atomic_bool running
Use conditions this way.
Definition: Skill.h:167
armarx::core::time::Frequency
Represents a frequency.
Definition: Frequency.h:17
armarx::skills::Skill::callbacksMutex
std::mutex callbacksMutex
Definition: Skill.h:164
armarx::skills::Skill::timeoutReached
std::atomic_bool timeoutReached
Definition: Skill.h:169
armarx::skills::Skill::checkWhetherSkillShouldStopASAP
bool checkWhetherSkillShouldStopASAP() const
Definition: Skill.cpp:148
armarx::skills::Skill::callbacks
std::vector< std::pair< std::function< bool()>, std::function< void()> > > callbacks
active conditions. First is condition (bool return func)
Definition: Skill.h:163
armarx::skills::Skill::stopped
std::atomic_bool stopped
Definition: Skill.h:168
armarx::skills::Skill::installConditionWithCallback
void installConditionWithCallback(std::function< bool()> &&f, std::function< void()> &&cb)
install a condition which is frequently checked from the conditionCheckingThread
Definition: Skill.cpp:15
armarx::skills::Skill::mainOfSkill
MainResult mainOfSkill(const MainInput &in)
Definition: Skill.cpp:104
armarx::skills::Skill::description
const SkillDescription description
The descripion of the skill, which will be available via the provider/manager.
Definition: Skill.h:149
armarx::skills::Skill::ExitInput::executorName
std::string executorName
Definition: Skill.h:65
armarx::skills::Skill::InitInput::params
aron::data::DictPtr params
Definition: Skill.h:42
armarx::skills::Skill::notifyTimeoutReached
void notifyTimeoutReached()
Definition: Skill.cpp:128
armarx::skills::Skill::ExitInput::params
aron::data::DictPtr params
Definition: Skill.h:66
armarx::skills::Skill::_init
void _init()
Definition: Skill.cpp:56
armarx::skills::Skill::exitSkill
ExitResult exitSkill(const ExitInput &in)
Definition: Skill.cpp:121
All.h
Metronome.h
armarx::skills::Skill::initSkill
InitResult initSkill(const InitInput &in)
Definition: Skill.cpp:94
armarx::skills::Skill::started
armarx::core::time::DateTime started
running params
Definition: Skill.h:152
armarx::skills::Skill::ExitInput
Definition: Skill.h:63
armarx::skills::Skill::MainResult
Definition: Skill.h:52
armarx::skills::Skill::InitInput::executorName
std::string executorName
Definition: Skill.h:41
armarx::skills::Skill::ExitResult
Definition: Skill.h:58
armarx::skills::Skill::MainInput::callback
CallbackT callback
Definition: Skill.h:49
armarx::core::time::DateTime
Represents a point in time.
Definition: DateTime.h:24
armarx::aron::data::DictPtr
std::shared_ptr< Dict > DictPtr
Definition: Dict.h:41
armarx::skills::Skill::CallbackT
std::function< void(const aron::data::DictPtr &)> CallbackT
Definition: Skill.h:32
armarx::skills::Skill::executeFullSkill
MainResult executeFullSkill(const MainInput &in)
Do init, main, exit together.
Definition: Skill.cpp:194
armarx::skills::Skill::MainResult::status
TerminatedSkillStatus status
Definition: Skill.h:54
armarx::Logging
Base Class for all Logging classes.
Definition: Logging.h:232
armarx::skills::Skill::InitResult::status
TerminatedSkillStatus status
Definition: Skill.h:36
armarx::skills::Skill::~Skill
virtual ~Skill()=default
armarx::skills::Skill::MainResult::data
aron::data::DictPtr data
Definition: Skill.h:55
armarx::skills::Skill::InitResult
Definition: Skill.h:34
armarx::skills::Skill::isSkillAvailable
bool isSkillAvailable(const InitInput &in) const
Definition: Skill.cpp:21
armarx::skills::Skill
Definition: Skill.h:29
armarx::core::time::Frequency::Hertz
static Frequency Hertz(std::int64_t hertz)
Definition: Frequency.cpp:23
Logging.h
armarx::skills::Skill::MainInput::params
aron::data::DictPtr params
Definition: Skill.h:48
armarx::skills::Skill::_exit
void _exit()
Definition: Skill.cpp:110
armarx::skills::Skill::InitInput
Definition: Skill.h:39
armarx::skills::SkillID
Definition: SkillID.h:17
armarx::skills::SkillDescription::skillName
std::string skillName
Definition: SkillDescription.h:18
armarx::core::time::DateTime::Invalid
static DateTime Invalid()
Definition: DateTime.cpp:60
armarx
This file offers overloads of toIce() and fromIce() functions for STL container types.
Definition: ArmarXTimeserver.cpp:28
armarx::skills::Skill::getSkillId
SkillID getSkillId() const
The id of the skill (combination of provider and name must be unique).
Definition: Skill.h:74
armarx::skills::Skill::MakeAbortedResult
static MainResult MakeAbortedResult(aron::data::DictPtr data=nullptr)
Definition: Skill.cpp:134
armarx::skills::Skill::exited
armarx::core::time::DateTime exited
Definition: Skill.h:153
armarx::skills::Skill::_main
void _main()
Definition: Skill.cpp:100
SkillDescription.h