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 __COUT__ <<
"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 __COUT_ERR__ << error.str() << std::endl;
133 XCEPT_RAISE (toolbox::fsm::exception::Exception, error.str());
141 toolbox::Event::Reference e(
new toolbox::Event(transition,
this));
142 theMessage_ = message;
145 catch (toolbox::fsm::exception::Exception& e)
147 inTransition_ =
false;
148 transitionSuccessful =
false;
149 std::ostringstream error;
150 error <<
"Transition " << transition <<
" cannot be executed from current state " << getStateName (getCurrentState());
151 __COUT_ERR__ << error.str() << std::endl;
153 XCEPT_RAISE (toolbox::fsm::exception::Exception, error.str());
156 inTransition_ =
false;
159 stateEntranceTime_ = time(0);
160 return transitionSuccessful;
164 bool FiniteStateMachine::isInTransition(
void)
166 return inTransition_;
170 void FiniteStateMachine::setErrorMessage(
const std::string &errMessage)
172 theErrorMessage_ = errMessage;
176 const std::string& FiniteStateMachine::getErrorMessage()
const
178 return theErrorMessage_;
182 void FiniteStateMachine::setInitialState(toolbox::fsm::State state)
184 toolbox::fsm::FiniteStateMachine::setInitialState(state);
185 provenanceState_ = state;
186 stateEntranceTime_ = time(0);
190 const xoap::MessageReference& FiniteStateMachine::getCurrentMessage(
void)