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