$treeview $search $mathjax $extrastylesheet
otsdaq
v2_03_00
$projectbrief
|
$projectbrief
|
$searchbox |
00001 #ifndef _ots_RunControlStateMachine_h_ 00002 #define _ots_RunControlStateMachine_h_ 00003 00004 #include "otsdaq-core/FiniteStateMachine/FiniteStateMachine.h" 00005 #include "otsdaq-core/ProgressBar/ProgressBar.h" 00006 00007 #include <string> 00008 #include "toolbox/lang/Class.h" 00009 00010 namespace ots 00011 { 00012 // CoreSupervisorBase 00013 // This class provides finite state machine functionality for otsdaq supervisors. 00014 class RunControlStateMachine : public virtual toolbox::lang::Class 00015 { 00016 public: 00017 RunControlStateMachine(const std::string& name = "Undefined Name"); 00018 virtual ~RunControlStateMachine(void); 00019 00020 void reset(void); 00021 void setStateMachineName(const std::string& name) 00022 { 00023 theStateMachine_.setStateMachineName(name); 00024 } 00025 const std::string& getErrorMessage(void) const 00026 { 00027 return theStateMachine_.getErrorMessage(); 00028 } 00029 00030 template<class OBJECT> 00031 void addStateTransition(toolbox::fsm::State from, 00032 toolbox::fsm::State to, 00033 const std::string& input, 00034 const std::string& transitionName, 00035 OBJECT* obj, 00036 void (OBJECT::*func)(toolbox::Event::Reference)) 00037 00038 { 00039 stateTransitionFunctionTable_[from][input] = func; 00040 theStateMachine_.addStateTransition(from, to, input, transitionName, obj, func); 00041 } 00042 00043 template<class OBJECT> 00044 void addStateTransition(toolbox::fsm::State from, 00045 toolbox::fsm::State to, 00046 const std::string& input, 00047 const std::string& transitionName, 00048 const std::string& transitionParameter, 00049 OBJECT* obj, 00050 void (OBJECT::*func)(toolbox::Event::Reference)) 00051 00052 { 00053 stateTransitionFunctionTable_[from][input] = func; 00054 theStateMachine_.addStateTransition( 00055 from, to, input, transitionName, transitionParameter, obj, func); 00056 } 00057 00058 // using stateMachineFunction_t = void (ots::RunControlStateMachine::* 00059 // )(toolbox::Event::Reference); stateMachineFunction_t getTransitionFunction (const 00060 // toolbox::fsm::State from, const std::string &transition); 00061 00062 // Finite State Machine States 00063 // 1. Control Configuration and Function Manager are loaded. 00064 virtual void stateInitial(toolbox::fsm::FiniteStateMachine& fsm) { ; } 00065 00066 // 1. XDAQ applications are running. 00067 // 2. Hardware is running. 00068 // 3. Triggers are accepted. 00069 // 4. Triggers are not sent. 00070 // 5. Data is sent / read out. 00071 virtual void statePaused(toolbox::fsm::FiniteStateMachine& fsm) { ; } 00072 00073 // 1. XDAQ applications are running. 00074 // 2. Hardware is running. 00075 // 3. Triggers are accepted. 00076 // 4. Triggers are sent. 00077 // 5. Data is sent / read out. 00078 virtual void stateRunning(toolbox::fsm::FiniteStateMachine& fsm) { ; } 00079 00080 // 1. Control hierarchy is instantiated. 00081 // 2. XDAQ executives are running and configured. 00082 // 3. XDAQ applications are loaded and instantiated. 00083 // 4. DCS nodes are allocated. 00084 virtual void stateHalted(toolbox::fsm::FiniteStateMachine& fsm) { ; } 00085 00086 // 1. Power supplies are turned off. 00087 virtual void stateShutdown(toolbox::fsm::FiniteStateMachine& fsm) { ; } 00088 00089 // 1. XDAQ applications are configured. 00090 // 2. Run parameters have been distributed. 00091 // 3. Hardware is configured. 00092 // 4. I2O connections are established, no data is sent or read out. 00093 // 5. Triggers are not sent. 00094 virtual void stateConfigured(toolbox::fsm::FiniteStateMachine& fsm) { ; } 00095 00096 virtual void inError(toolbox::fsm::FiniteStateMachine& fsm) { ; } 00097 00098 virtual void transitionConfiguring(toolbox::Event::Reference e) { ; } 00099 virtual void transitionHalting(toolbox::Event::Reference e) { ; } 00100 virtual void transitionShuttingDown(toolbox::Event::Reference e) { ; } 00101 virtual void transitionStartingUp(toolbox::Event::Reference e) { ; } 00102 virtual void transitionInitializing(toolbox::Event::Reference e) { ; } 00103 virtual void transitionPausing(toolbox::Event::Reference e) { ; } 00104 virtual void transitionResuming(toolbox::Event::Reference e) { ; } 00105 virtual void transitionStarting(toolbox::Event::Reference e) { ; } 00106 virtual void transitionStopping(toolbox::Event::Reference e) { ; } 00107 virtual void enteringError(toolbox::Event::Reference e) { ; } 00108 00109 // Run Control Messages 00110 xoap::MessageReference runControlMessageHandler(xoap::MessageReference message); 00111 00112 static const std::string FAILED_STATE_NAME; 00113 00114 unsigned int getIterationIndex(void) { return iterationIndex_; } 00115 unsigned int getSubIterationIndex(void) { return subIterationIndex_; } 00116 void indicateIterationWork(void) { iterationWorkFlag_ = true; } 00117 void clearIterationWork(void) { iterationWorkFlag_ = false; } 00118 bool getIterationWork(void) { return iterationWorkFlag_; } 00119 void indicateSubIterationWork(void) { subIterationWorkFlag_ = true; } 00120 void clearSubIterationWork(void) { subIterationWorkFlag_ = false; } 00121 bool getSubIterationWork(void) { return subIterationWorkFlag_; } 00122 00123 protected: 00124 FiniteStateMachine theStateMachine_; 00125 ProgressBar theProgressBar_; 00126 00127 volatile bool asyncFailureReceived_, asyncSoftFailureReceived_; 00128 00129 unsigned int iterationIndex_, subIterationIndex_; 00130 bool iterationWorkFlag_, subIterationWorkFlag_; 00131 00132 toolbox::fsm::State lastIterationState_; 00133 std::string lastIterationCommand_; 00134 std::string lastIterationResult_; 00135 unsigned int lastIterationIndex_, lastSubIterationIndex_; 00136 00137 std::map<toolbox::fsm::State, 00138 std::map<std::string, 00139 void (RunControlStateMachine::*)(toolbox::Event::Reference), 00140 std::less<std::string> > > 00141 stateTransitionFunctionTable_; 00142 }; 00143 00144 } // namespace ots 00145 00146 #endif