otsdaq  3.09.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  void indicateIterationWork(void) { iterationWorkFlag_ = true; }
147  void clearIterationWork(void) { iterationWorkFlag_ = false; }
148  bool getIterationWork(void) { return iterationWorkFlag_; }
149  void indicateSubIterationWork(void) { subIterationWorkFlag_ = true; }
150  void clearSubIterationWork(void) { subIterationWorkFlag_ = false; }
151  bool getSubIterationWork(void) { return subIterationWorkFlag_; }
152  const std::string& getLastCommand(void) { return lastIterationCommand_; }
153  const std::string& getLastAttemptedConfigureGroup(void)
154  {
155  return lastAttemptedConfigureGroup_;
156  }
157 
158  protected:
159  FiniteStateMachine theStateMachine_;
160  ProgressBar theProgressBar_;
161 
162  std::atomic<bool> asyncFailureReceived_{false};
163  std::atomic<bool> asyncPauseExceptionReceived_{false};
164  std::atomic<bool> asyncStopExceptionReceived_{false};
165 
166  unsigned int iterationIndex_ = 0, subIterationIndex_ = 0;
167  bool iterationWorkFlag_, subIterationWorkFlag_;
168 
169  toolbox::fsm::State lastIterationState_;
170  std::string lastIterationCommand_;
171  std::string lastAttemptedConfigureGroup_;
172  std::string lastIterationResult_;
173  unsigned int lastIterationIndex_, lastSubIterationIndex_;
174 
175  std::map<toolbox::fsm::State,
176  std::map<std::string,
177  void (RunControlStateMachine::*)(toolbox::Event::Reference),
178  std::less<std::string> > >
179  stateTransitionFunctionTable_;
180 };
181 
182 } // namespace ots
183 
184 #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