1 #include "otsdaq-core/FiniteStateMachine/FiniteStateMachine.h"
2 #include "otsdaq-core/MessageFacility/MessageFacility.h"
3 #include "otsdaq-core/Macros/CoutHeaderMacros.h"
11 FiniteStateMachine::FiniteStateMachine(
void)
12 : stateEntranceTime_(0)
13 , inTransition_ (false)
14 , provenanceState_ (
'X')
15 , theErrorMessage_ (
"")
17 __MOUT__ <<
"Transition? "<< inTransition_ << std::endl;
21 FiniteStateMachine::~FiniteStateMachine(
void)
25 toolbox::fsm::State FiniteStateMachine::getProvenanceState(
void)
27 return provenanceState_;
31 toolbox::fsm::State FiniteStateMachine::getTransitionFinalState(
const std::string& transition)
throw (toolbox::fsm::exception::Exception)
33 if(stateTransitionTable_[currentState_].find(transition) != stateTransitionTable_[currentState_].end())
34 return stateTransitionTable_[currentState_][transition];
37 std::ostringstream error;
38 error <<
"Cannot find transition name with transition: " << transition <<
", unknown!";
39 XCEPT_RAISE (toolbox::fsm::exception::Exception, error.str());
44 std::string FiniteStateMachine::getProvenanceStateName(
void)
46 return getStateName(getProvenanceState());
50 std::string FiniteStateMachine::getCurrentStateName(
void)
52 return getStateName(getCurrentState());
59 time_t FiniteStateMachine::getTimeInState (
void)
61 return stateEntranceTime_?(time(0) - stateEntranceTime_):0;
65 std::string FiniteStateMachine::getCurrentTransitionName(
const std::string& transition)
throw (toolbox::fsm::exception::Exception)
67 if(stateTransitionNameTable_[currentState_].find(transition) != stateTransitionNameTable_[currentState_].end())
69 return stateTransitionNameTable_[currentState_][transition];
73 std::ostringstream error;
74 error <<
"Cannot find transition name with transition: " << transition <<
", unknown!";
75 XCEPT_RAISE (toolbox::fsm::exception::Exception, error.str());
80 std::string FiniteStateMachine::getTransitionName(
const toolbox::fsm::State from,
const std::string& transition)
throw (toolbox::fsm::exception::Exception)
82 if(stateTransitionNameTable_[from].find(transition) != stateTransitionNameTable_[from].end())
84 return stateTransitionNameTable_[from][transition];
88 std::ostringstream error;
89 error <<
"Cannot find transition name from " << from <<
" with transition: " << transition <<
", unknown!";
90 XCEPT_RAISE (toolbox::fsm::exception::Exception, error.str());
95 std::string FiniteStateMachine::getTransitionParameter(
const toolbox::fsm::State from,
const std::string& transition)
throw (toolbox::fsm::exception::Exception)
97 if(stateTransitionParameterTable_[from].find(transition) != stateTransitionParameterTable_[from].end())
99 return stateTransitionParameterTable_[from][transition];
105 std::string FiniteStateMachine::getTransitionFinalStateName(
const std::string& transition)
throw (toolbox::fsm::exception::Exception)
107 return getStateName(getTransitionFinalState(transition));
111 bool FiniteStateMachine::execTransition(
const std::string& transition)
throw (toolbox::fsm::exception::Exception)
113 const xoap::MessageReference message;
114 return execTransition(transition,message);
118 bool FiniteStateMachine::execTransition(
const std::string& transition,
const xoap::MessageReference& message)
throw (toolbox::fsm::exception::Exception)
121 if(inTransition_)
return false;
122 inTransition_ =
true;
123 bool transitionSuccessful =
true;
124 provenanceState_ = getCurrentState();
126 std::map<std::string, toolbox::fsm::State> transitions = getTransitions(getCurrentState());
127 if(transitions.find(transition) == transitions.end())
129 inTransition_ =
false;
130 std::ostringstream error;
131 error << transition <<
" is not in the list of the transitions from current state " << getStateName (getCurrentState());
132 XCEPT_RAISE (toolbox::fsm::exception::Exception, error.str());
140 toolbox::Event::Reference e(
new toolbox::Event(transition,
this));
141 theMessage_ = message;
144 catch (toolbox::fsm::exception::Exception& e)
146 inTransition_ =
false;
147 transitionSuccessful =
false;
148 std::ostringstream error;
149 error <<
"Transition " << transition <<
" cannot be executed from current state " << getStateName (getCurrentState());
150 __MOUT__ << error.str() << std::endl;
152 XCEPT_RAISE (toolbox::fsm::exception::Exception, error.str());
155 inTransition_ =
false;
158 stateEntranceTime_ = time(0);
159 return transitionSuccessful;
163 bool FiniteStateMachine::isInTransition(
void)
165 return inTransition_;
169 void FiniteStateMachine::setErrorMessage(
const std::string &errMessage)
171 theErrorMessage_ = errMessage;
175 const std::string& FiniteStateMachine::getErrorMessage()
const
177 return theErrorMessage_;
181 void FiniteStateMachine::setInitialState(toolbox::fsm::State state)
183 toolbox::fsm::FiniteStateMachine::setInitialState(state);
184 provenanceState_ = state;
185 stateEntranceTime_ = time(0);
189 const xoap::MessageReference& FiniteStateMachine::getCurrentMessage(
void)