otsdaq  3.11.00
VStateMachine.h
1 #ifndef _ots_VStateMachine_h_
2 #define _ots_VStateMachine_h_
3 
4 #include <string>
5 
6 namespace ots
7 {
8 class CoreSupervisorBase;
9 
11 {
12  public:
16  static const unsigned int SUBSYSTEM_ITERATION_STANDALONE = (unsigned int)-1;
17 
18  VStateMachine(const std::string& name)
19  : subsystemIterationIndex_(0)
20  , iterationIndex_(0)
21  , subIterationIndex_(0)
22  , subsystemIterationWorkFlag_(false)
23  , iterationWorkFlag_(false)
24  , subIterationWorkFlag_(false)
25  , name_(name)
26  {
27  ;
28  }
29  virtual ~VStateMachine(void) { ; }
30 
32  virtual void configure(void) = 0;
33  virtual void halt(void) = 0;
34  virtual void pause(void) = 0;
35  virtual void resume(void) = 0;
36  virtual void start(std::string runNumber) = 0;
37  virtual void stop(void) = 0;
38 
40  virtual bool running(void) { return false; }
41  virtual void paused(void) { ; }
42  virtual void halted(void) { ; }
43  virtual void configured(void) { ; }
44  virtual void initial(void) { ; }
45  virtual void inError(void) { ; }
46 
48  //==============================================================================
51  virtual std::string getStatusProgressDetail(void)
52  {
53  std::string progress = "";
54 
55  if(VStateMachine::getSubIterationWork())
56  {
57  // sub-steps going on — show subsystemIteration:iteration:subIteration
58  progress += name_ + ":";
59 
60  // check for subsystem-iteration alias
61  if(subsystemIterationAliasMap_.find(transitionName_) != subsystemIterationAliasMap_.end() &&
62  subsystemIterationAliasMap_.at(transitionName_)
63  .find(VStateMachine::getSubsystemIterationIndex()) !=
64  subsystemIterationAliasMap_.at(transitionName_).end())
65  progress += subsystemIterationAliasMap_.at(transitionName_)
66  .at(VStateMachine::getSubsystemIterationIndex());
67  else
68  progress += VStateMachine::getSubsystemIterationIndexString();
69 
70  progress += ":";
71 
72  // check for iteration alias
73  if(iterationAliasMap_.find(transitionName_) != iterationAliasMap_.end() &&
74  iterationAliasMap_.at(transitionName_)
75  .find(VStateMachine::getIterationIndex()) !=
76  iterationAliasMap_.at(transitionName_).end())
77  progress += iterationAliasMap_.at(transitionName_)
78  .at(VStateMachine::getIterationIndex());
79  else
80  progress +=
81  std::to_string(VStateMachine::getIterationIndex());
82 
83  progress += ":";
84 
85  // check for sub-iteration alias
86  if(subIterationAliasMap_.find(transitionName_) !=
87  subIterationAliasMap_.end() &&
88  subIterationAliasMap_.at(transitionName_)
89  .find(VStateMachine::getSubIterationIndex()) !=
90  subIterationAliasMap_.at(transitionName_).end())
91  progress += subIterationAliasMap_.at(transitionName_)
92  .at(VStateMachine::getSubIterationIndex());
93  else
94  progress += std::to_string(
95  VStateMachine::getSubIterationIndex());
96  }
97  else if(VStateMachine::getIterationWork())
98  {
99  // iteration steps going on — show subsystemIteration:iteration
100  progress += name_ + ":";
101 
102  // check for subsystem-iteration alias
103  if(subsystemIterationAliasMap_.find(transitionName_) != subsystemIterationAliasMap_.end() &&
104  subsystemIterationAliasMap_.at(transitionName_)
105  .find(VStateMachine::getSubsystemIterationIndex()) !=
106  subsystemIterationAliasMap_.at(transitionName_).end())
107  progress += subsystemIterationAliasMap_.at(transitionName_)
108  .at(VStateMachine::getSubsystemIterationIndex());
109  else
110  progress += VStateMachine::getSubsystemIterationIndexString();
111 
112  progress += ":";
113 
114  // check for iteration alias
115  if(iterationAliasMap_.find(transitionName_) != iterationAliasMap_.end() &&
116  iterationAliasMap_.at(transitionName_)
117  .find(VStateMachine::getIterationIndex()) !=
118  iterationAliasMap_.at(transitionName_).end())
119  progress += iterationAliasMap_.at(transitionName_)
120  .at(VStateMachine::getIterationIndex());
121  else
122  progress +=
123  std::to_string(VStateMachine::getIterationIndex());
124  }
125  else if(VStateMachine::getSubsystemIterationWork())
126  {
127  // subsystem-iteration steps going on — show subsystemIteration only
128  progress += name_ + ":";
129 
130  // check for subsystem-iteration alias
131  if(subsystemIterationAliasMap_.find(transitionName_) != subsystemIterationAliasMap_.end() &&
132  subsystemIterationAliasMap_.at(transitionName_)
133  .find(VStateMachine::getSubsystemIterationIndex()) !=
134  subsystemIterationAliasMap_.at(transitionName_).end())
135  progress += subsystemIterationAliasMap_.at(transitionName_)
136  .at(VStateMachine::getSubsystemIterationIndex());
137  else
138  progress += VStateMachine::getSubsystemIterationIndexString();
139  }
140  else if(transitionName_ != "")
141  progress += name_ + ":" + transitionName_;
142  // else Done
143 
144  // if(progress.size())
145  // __COUTV__(progress);
146 
147  return progress;
148  } // end getStatusProgressDetail()
149 
150  virtual unsigned int getMinReadyForEventGenerationStartIteration(void) const { return 0; }
151 
152  void setTransitionName(const std::string& transitionName)
153  {
154  transitionName_ = transitionName;
155  }
156  const std::string& getTransitionName(void) { return transitionName_; }
157 
158  // Subsystem-iteration accessors (outermost tier — synchronized across subsystems)
159  void setSubsystemIterationIndex(unsigned int i) { subsystemIterationIndex_ = i; }
160  unsigned int getSubsystemIterationIndex(void) const { return subsystemIterationIndex_; }
161  bool isStandaloneSubsystem(void) const { return subsystemIterationIndex_ == SUBSYSTEM_ITERATION_STANDALONE; }
163  bool isFirstIteration(void) const
164  {
165  return (subsystemIterationIndex_ == 0 || isStandaloneSubsystem()) &&
166  iterationIndex_ == 0 && subIterationIndex_ == 0;
167  }
168  std::string getSubsystemIterationIndexString(void) const
169  {
170  return isStandaloneSubsystem() ? std::string("standalone")
171  : std::to_string(subsystemIterationIndex_);
172  }
177  unsigned int getSubsystemSyncStepIndex(void) const
178  {
179  return isStandaloneSubsystem() ? iterationIndex_ : subsystemIterationIndex_;
180  }
181  void indicateSubsystemSyncStepWork(void)
182  {
183  if(isStandaloneSubsystem())
184  iterationWorkFlag_ = true;
185  else
186  subsystemIterationWorkFlag_ = true;
187  }
188  void indicateSubsystemIterationWork(void) { subsystemIterationWorkFlag_ = true; }
189  void clearSubsystemIterationWork(void) { subsystemIterationWorkFlag_ = false; }
190  bool getSubsystemIterationWork(void) { return subsystemIterationWorkFlag_; }
191 
192  // Iteration accessors (middle tier — synchronized within one subsystem)
193  void setIterationIndex(unsigned int i) { iterationIndex_ = i; }
194  void setSubIterationIndex(unsigned int i) { subIterationIndex_ = i; }
195  unsigned int getIterationIndex(void) { return iterationIndex_; }
196  unsigned int getSubIterationIndex(void) { return subIterationIndex_; }
197  void setSystemMinReadyForEventGenerationStartIteration(unsigned int i) { systemMinReadyForEventGenerationStartIteration_ = i; }
198  unsigned int getSystemMinReadyForEventGenerationStartIteration(void) const { return systemMinReadyForEventGenerationStartIteration_; }
199  void indicateIterationWork(void) { iterationWorkFlag_ = true; }
200  void clearIterationWork(void) { iterationWorkFlag_ = false; }
201  bool getIterationWork(void) { return iterationWorkFlag_; }
202 
203  // Sub-iteration accessors (innermost tier — internal to one application)
204  void indicateSubIterationWork(void) { subIterationWorkFlag_ = true; }
205  void clearSubIterationWork(void) { subIterationWorkFlag_ = false; }
206  bool getSubIterationWork(void) { return subIterationWorkFlag_; }
207 
210  protected:
211  std::map<std::string /*transition*/,
212  std::map<unsigned int /*step index*/, std::string /*step alias*/>>
213  subsystemIterationAliasMap_;
214  std::map<std::string /*transition*/,
215  std::map<unsigned int /*step index*/, std::string /*step alias*/>>
216  iterationAliasMap_;
217  std::map<std::string /*transition*/,
218  std::map<unsigned int /*step index*/, std::string /*step alias*/>>
219  subIterationAliasMap_;
220 
221  private:
222  unsigned int subsystemIterationIndex_, iterationIndex_, subIterationIndex_;
223  unsigned int systemMinReadyForEventGenerationStartIteration_ = 0;
224  bool subsystemIterationWorkFlag_, iterationWorkFlag_, subIterationWorkFlag_;
225  const std::string name_;
226  std::string transitionName_;
227 };
228 
229 } // namespace ots
230 
231 #endif
virtual std::string getStatusProgressDetail(void)
Status.
Definition: VStateMachine.h:51
virtual bool running(void)
States.
Definition: VStateMachine.h:40
bool isFirstIteration(void) const
true on the very first call of a transition (all indices at their starting value)
CoreSupervisorBase * parentSupervisor_
virtual void configure(void)=0
Transitions.
unsigned int getSubsystemSyncStepIndex(void) const
static const unsigned int SUBSYSTEM_ITERATION_STANDALONE
Definition: VStateMachine.h:16
defines used also by OtsConfigurationWizardSupervisor