otsdaq  3.10.00
RunControlStateMachine.h
1 #ifndef _ots_RunControlStateMachine_h_
2 #define _ots_RunControlStateMachine_h_
3 
4 #include "otsdaq/FiniteStateMachine/FiniteStateMachine.h"
5 #include "otsdaq/ProgressBar/ProgressBar.h"
6 
7 #include <atomic>
8 #include <string>
9 #include "toolbox/lang/Class.h"
10 
11 namespace ots
12 {
15 class RunControlStateMachine : public virtual toolbox::lang::Class
16 {
17  public:
18  RunControlStateMachine(const std::string& name = "Undefined Name");
19  virtual ~RunControlStateMachine(void);
20 
21  void reset(void);
22  void setStateMachineName(const std::string& name)
23  {
24  theStateMachine_.setStateMachineName(name);
25  }
26  const std::string& getErrorMessage(void) const
27  {
28  return theStateMachine_.getErrorMessage();
29  }
30  void setAsyncPauseExceptionMessage(const std::string& error)
31  {
32  asyncPauseExceptionReceived_ = true;
33  theStateMachine_.setErrorMessage(error);
34  }
35  void setAsyncStopExceptionMessage(const std::string& error)
36  {
37  asyncStopExceptionReceived_ = true;
38  theStateMachine_.setErrorMessage(error);
39  }
40 
41  template<class OBJECT>
42  void addStateTransition(toolbox::fsm::State from,
43  toolbox::fsm::State to,
44  const std::string& input,
45  const std::string& transitionName,
46  OBJECT* obj,
47  void (OBJECT::*func)(toolbox::Event::Reference))
48 
49  {
50  stateTransitionFunctionTable_[from][input] = func;
51  theStateMachine_.addStateTransition(from, to, input, transitionName, obj, func);
52  }
53 
54  template<class OBJECT>
55  void addStateTransition(toolbox::fsm::State from,
56  toolbox::fsm::State to,
57  const std::string& input,
58  const std::string& transitionName,
59  const std::string& transitionParameter,
60  OBJECT* obj,
61  void (OBJECT::*func)(toolbox::Event::Reference))
62 
63  {
64  stateTransitionFunctionTable_[from][input] = func;
65  theStateMachine_.addStateTransition(
66  from, to, input, transitionName, transitionParameter, obj, func);
67  }
68 
75  virtual void stateInitial(toolbox::fsm::FiniteStateMachine& /*fsm*/) { ; }
76 
82  virtual void statePaused(toolbox::fsm::FiniteStateMachine& /*fsm*/) { ; }
83 
89  virtual void stateRunning(toolbox::fsm::FiniteStateMachine& /*fsm*/) { ; }
90 
95  virtual void stateHalted(toolbox::fsm::FiniteStateMachine& /*fsm*/) { ; }
96 
98  virtual void stateShutdown(toolbox::fsm::FiniteStateMachine& /*fsm*/) { ; }
99 
105  virtual void stateConfigured(toolbox::fsm::FiniteStateMachine& /*fsm*/) { ; }
106 
107  virtual void inError(toolbox::fsm::FiniteStateMachine& /*fsm*/) { ; }
108 
109  virtual void transitionConfiguring(toolbox::Event::Reference /*e*/) { ; }
110  virtual void transitionHalting(toolbox::Event::Reference /*e*/) { ; }
111  virtual void transitionShuttingDown(toolbox::Event::Reference /*e*/) { ; }
112  virtual void transitionStartingUp(toolbox::Event::Reference /*e*/) { ; }
113  virtual void transitionInitializing(toolbox::Event::Reference /*e*/) { ; }
114  virtual void transitionPausing(toolbox::Event::Reference /*e*/) { ; }
115  virtual void transitionResuming(toolbox::Event::Reference /*e*/) { ; }
116  virtual void transitionStarting(toolbox::Event::Reference /*e*/) { ; }
117  virtual void transitionStopping(toolbox::Event::Reference /*e*/) { ; }
118  virtual void enteringError(toolbox::Event::Reference /*e*/) { ; }
119 
121  xoap::MessageReference runControlMessageHandler(xoap::MessageReference message);
122 
123  static const std::string FAILED_STATE_NAME;
124  static const std::string INITIAL_STATE_NAME;
125  static const std::string HALTED_STATE_NAME;
126  static const std::string PAUSED_STATE_NAME;
127  static const std::string RUNNING_STATE_NAME;
128  static const std::string SHUTDOWN_STATE_NAME;
129  static const std::string CONFIGURED_STATE_NAME;
130 
131  static const std::string SHUTDOWN_TRANSITION_NAME;
132  static const std::string STARTUP_TRANSITION_NAME;
133  static const std::string INIT_TRANSITION_NAME;
134  static const std::string ERROR_TRANSITION_NAME;
135  static const std::string FAIL_TRANSITION_NAME;
136  static const std::string CONFIGURE_TRANSITION_NAME;
137  static const std::string HALT_TRANSITION_NAME;
138  static const std::string ABORT_TRANSITION_NAME;
139  static const std::string PAUSE_TRANSITION_NAME;
140  static const std::string RESUME_TRANSITION_NAME;
141  static const std::string START_TRANSITION_NAME;
142  static const std::string STOP_TRANSITION_NAME;
143 
144  unsigned int getIterationIndex(void) { return iterationIndex_; }
145  unsigned int getSubIterationIndex(void) { return subIterationIndex_; }
146  unsigned int getMinReadyForEventGenerationStartIteration(void) { return minReadyForEventGenerationStartIteration_; }
147  void indicateIterationWork(void) { iterationWorkFlag_ = true; }
148  void clearIterationWork(void) { iterationWorkFlag_ = false; }
149  bool getIterationWork(void) { return iterationWorkFlag_; }
150  void indicateSubIterationWork(void) { subIterationWorkFlag_ = true; }
151  void clearSubIterationWork(void) { subIterationWorkFlag_ = false; }
152  bool getSubIterationWork(void) { return subIterationWorkFlag_; }
153  const std::string& getLastCommand(void) { return lastIterationCommand_; }
154  const std::string& getLastAttemptedConfigureGroup(void)
155  {
156  return lastAttemptedConfigureGroup_;
157  }
158 
159  protected:
160  FiniteStateMachine theStateMachine_;
161  ProgressBar theProgressBar_;
162 
163  std::atomic<bool> asyncFailureReceived_{false};
164  std::atomic<bool> asyncPauseExceptionReceived_{false};
165  std::atomic<bool> asyncStopExceptionReceived_{false};
166 
167  unsigned int iterationIndex_ = 0, subIterationIndex_ = 0;
168  bool iterationWorkFlag_, subIterationWorkFlag_;
169  unsigned int minReadyForEventGenerationStartIteration_ = 0;
170 
171  toolbox::fsm::State lastIterationState_;
172  std::string lastIterationCommand_;
173  std::string lastAttemptedConfigureGroup_;
174  std::string lastIterationResult_;
175  unsigned int lastIterationIndex_, lastSubIterationIndex_;
176 
177  std::map<toolbox::fsm::State,
178  std::map<std::string,
179  void (RunControlStateMachine::*)(toolbox::Event::Reference),
180  std::less<std::string> > >
181  stateTransitionFunctionTable_;
182 };
183 
184 } // namespace ots
185 
186 #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 &)
xoap::MessageReference runControlMessageHandler(xoap::MessageReference message)
Run Control Messages.
virtual void stateInitial(toolbox::fsm::FiniteStateMachine &)
virtual void stateHalted(toolbox::fsm::FiniteStateMachine &)
defines used also by OtsConfigurationWizardSupervisor