otsdaq  3.11.00
RunControlStateMachine.h
1 #ifndef _ots_RunControlStateMachine_h_
2 #define _ots_RunControlStateMachine_h_
3 
4 #include "otsdaq/FiniteStateMachine/FiniteStateMachine.h"
5 #include "otsdaq/FiniteStateMachine/VStateMachine.h"
6 #include "otsdaq/ProgressBar/ProgressBar.h"
7 
8 #include <atomic>
9 #include <string>
10 #include "toolbox/lang/Class.h"
11 
12 namespace ots
13 {
16 class RunControlStateMachine : public virtual toolbox::lang::Class
17 {
18  public:
19  RunControlStateMachine(const std::string& name = "Undefined Name");
20  virtual ~RunControlStateMachine(void);
21 
22  void reset(void);
23  void setStateMachineName(const std::string& name)
24  {
25  theStateMachine_.setStateMachineName(name);
26  }
27  const std::string& getErrorMessage(void) const
28  {
29  return theStateMachine_.getErrorMessage();
30  }
31  void setAsyncPauseExceptionMessage(const std::string& error)
32  {
33  asyncPauseExceptionReceived_ = true;
34  theStateMachine_.setErrorMessage(error);
35  }
36  void setAsyncStopExceptionMessage(const std::string& error)
37  {
38  asyncStopExceptionReceived_ = true;
39  theStateMachine_.setErrorMessage(error);
40  }
41 
42  template<class OBJECT>
43  void addStateTransition(toolbox::fsm::State from,
44  toolbox::fsm::State to,
45  const std::string& input,
46  const std::string& transitionName,
47  OBJECT* obj,
48  void (OBJECT::*func)(toolbox::Event::Reference))
49 
50  {
51  stateTransitionFunctionTable_[from][input] = func;
52  theStateMachine_.addStateTransition(from, to, input, transitionName, obj, func);
53  }
54 
55  template<class OBJECT>
56  void addStateTransition(toolbox::fsm::State from,
57  toolbox::fsm::State to,
58  const std::string& input,
59  const std::string& transitionName,
60  const std::string& transitionParameter,
61  OBJECT* obj,
62  void (OBJECT::*func)(toolbox::Event::Reference))
63 
64  {
65  stateTransitionFunctionTable_[from][input] = func;
66  theStateMachine_.addStateTransition(
67  from, to, input, transitionName, transitionParameter, obj, func);
68  }
69 
76  virtual void stateInitial(toolbox::fsm::FiniteStateMachine& /*fsm*/) { ; }
77 
83  virtual void statePaused(toolbox::fsm::FiniteStateMachine& /*fsm*/) { ; }
84 
90  virtual void stateRunning(toolbox::fsm::FiniteStateMachine& /*fsm*/) { ; }
91 
96  virtual void stateHalted(toolbox::fsm::FiniteStateMachine& /*fsm*/) { ; }
97 
99  virtual void stateShutdown(toolbox::fsm::FiniteStateMachine& /*fsm*/) { ; }
100 
106  virtual void stateConfigured(toolbox::fsm::FiniteStateMachine& /*fsm*/) { ; }
107 
108  virtual void inError(toolbox::fsm::FiniteStateMachine& /*fsm*/) { ; }
109 
110  virtual void transitionConfiguring(toolbox::Event::Reference /*e*/) { ; }
111  virtual void transitionHalting(toolbox::Event::Reference /*e*/) { ; }
112  virtual void transitionShuttingDown(toolbox::Event::Reference /*e*/) { ; }
113  virtual void transitionStartingUp(toolbox::Event::Reference /*e*/) { ; }
114  virtual void transitionInitializing(toolbox::Event::Reference /*e*/) { ; }
115  virtual void transitionPausing(toolbox::Event::Reference /*e*/) { ; }
116  virtual void transitionResuming(toolbox::Event::Reference /*e*/) { ; }
117  virtual void transitionStarting(toolbox::Event::Reference /*e*/) { ; }
118  virtual void transitionStopping(toolbox::Event::Reference /*e*/) { ; }
119  virtual void enteringError(toolbox::Event::Reference /*e*/) { ; }
120 
122  xoap::MessageReference runControlMessageHandler(xoap::MessageReference message);
123 
124  static const std::string FAILED_STATE_NAME;
125  static const std::string INITIAL_STATE_NAME;
126  static const std::string HALTED_STATE_NAME;
127  static const std::string PAUSED_STATE_NAME;
128  static const std::string RUNNING_STATE_NAME;
129  static const std::string SHUTDOWN_STATE_NAME;
130  static const std::string CONFIGURED_STATE_NAME;
131 
132  static const std::string SHUTDOWN_TRANSITION_NAME;
133  static const std::string STARTUP_TRANSITION_NAME;
134  static const std::string INIT_TRANSITION_NAME;
135  static const std::string ERROR_TRANSITION_NAME;
136  static const std::string FAIL_TRANSITION_NAME;
137  static const std::string CONFIGURE_TRANSITION_NAME;
138  static const std::string HALT_TRANSITION_NAME;
139  static const std::string ABORT_TRANSITION_NAME;
140  static const std::string PAUSE_TRANSITION_NAME;
141  static const std::string RESUME_TRANSITION_NAME;
142  static const std::string START_TRANSITION_NAME;
143  static const std::string STOP_TRANSITION_NAME;
144 
145  // Subsystem-iteration accessors (outermost tier — synchronized across subsystems)
146  unsigned int getSubsystemIterationIndex(void) const { return subsystemIterationIndex_; }
147  bool isStandaloneSubsystem(void) const { return subsystemIterationIndex_ == VStateMachine::SUBSYSTEM_ITERATION_STANDALONE; }
149  bool isFirstIteration(void) const
150  {
151  return (subsystemIterationIndex_ == 0 || isStandaloneSubsystem()) &&
152  iterationIndex_ == 0 && subIterationIndex_ == 0;
153  }
156  unsigned int getSubsystemSyncStepIndex(void) const
157  {
158  return isStandaloneSubsystem() ? iterationIndex_ : subsystemIterationIndex_;
159  }
160  void indicateSubsystemSyncStepWork(void)
161  {
162  if(isStandaloneSubsystem())
163  iterationWorkFlag_ = true;
164  else
165  subsystemIterationWorkFlag_ = true;
166  }
167  void indicateSubsystemIterationWork(void) { subsystemIterationWorkFlag_ = true; }
168  void clearSubsystemIterationWork(void) { subsystemIterationWorkFlag_ = false; }
169  bool getSubsystemIterationWork(void) { return subsystemIterationWorkFlag_; }
170 
171  // Iteration accessors (middle tier — synchronized within one subsystem)
172  unsigned int getIterationIndex(void) { return iterationIndex_; }
173  unsigned int getSubIterationIndex(void) { return subIterationIndex_; }
174  unsigned int getMinReadyForEventGenerationStartIteration(void) { return minReadyForEventGenerationStartIteration_; }
175  void indicateIterationWork(void) { iterationWorkFlag_ = true; }
176  void clearIterationWork(void) { iterationWorkFlag_ = false; }
177  bool getIterationWork(void) { return iterationWorkFlag_; }
178 
179  // Sub-iteration accessors (innermost tier — internal to one application)
180  void indicateSubIterationWork(void) { subIterationWorkFlag_ = true; }
181  void clearSubIterationWork(void) { subIterationWorkFlag_ = false; }
182  bool getSubIterationWork(void) { return subIterationWorkFlag_; }
183 
184  const std::string& getLastCommand(void) { return lastIterationCommand_; }
185  const std::string& getLastAttemptedConfigureGroup(void)
186  {
187  return lastAttemptedConfigureGroup_;
188  }
189 
190  protected:
191  FiniteStateMachine theStateMachine_;
192  ProgressBar theProgressBar_;
193 
194  std::atomic<bool> asyncFailureReceived_{false};
195  std::atomic<bool> asyncPauseExceptionReceived_{false};
196  std::atomic<bool> asyncStopExceptionReceived_{false};
197 
198  unsigned int subsystemIterationIndex_ = 0;
199  unsigned int iterationIndex_ = 0, subIterationIndex_ = 0;
200  bool subsystemIterationWorkFlag_, iterationWorkFlag_, subIterationWorkFlag_;
201  unsigned int minReadyForEventGenerationStartIteration_ = 0;
202 
203  toolbox::fsm::State lastIterationState_;
204  std::string lastIterationCommand_;
205  std::string lastAttemptedConfigureGroup_;
206  std::string lastIterationResult_;
207  unsigned int lastSubsystemIterationIndex_, lastIterationIndex_, lastSubIterationIndex_;
208 
209  std::map<toolbox::fsm::State,
210  std::map<std::string,
211  void (RunControlStateMachine::*)(toolbox::Event::Reference),
212  std::less<std::string> > >
213  stateTransitionFunctionTable_;
214 };
215 
216 } // namespace ots
217 
218 #endif
virtual void statePaused(toolbox::fsm::FiniteStateMachine &)
virtual void stateConfigured(toolbox::fsm::FiniteStateMachine &)
virtual void stateRunning(toolbox::fsm::FiniteStateMachine &)
virtual void stateShutdown(toolbox::fsm::FiniteStateMachine &)
bool isFirstIteration(void) const
true on the very first call of a transition (all indices at their starting value)
xoap::MessageReference runControlMessageHandler(xoap::MessageReference message)
Run Control Messages.
virtual void stateInitial(toolbox::fsm::FiniteStateMachine &)
unsigned int getSubsystemSyncStepIndex(void) const
virtual void stateHalted(toolbox::fsm::FiniteStateMachine &)
static const unsigned int SUBSYSTEM_ITERATION_STANDALONE
Definition: VStateMachine.h:16
defines used also by OtsConfigurationWizardSupervisor