1 #include "otsdaq-core/FiniteStateMachine/FiniteStateMachine.h"
2 #include "otsdaq-core/MessageFacility/MessageFacility.h"
4 #include "otsdaq-core/Macros/CoutMacros.h"
12 #define __MF_SUBJECT__ std::string("FSM-") + getStateMachineName()
15 FiniteStateMachine::FiniteStateMachine(
const std::string& stateMachineName)
16 : stateEntranceTime_(0)
17 , inTransition_(false)
18 , provenanceState_(
'X')
19 , theErrorMessage_(
"")
20 , stateMachineName_(stateMachineName)
22 __COUT__ <<
"Constructing FiniteStateMachine" << std::endl;
26 FiniteStateMachine::~FiniteStateMachine(
void) {}
29 toolbox::fsm::State FiniteStateMachine::getProvenanceState(
void)
31 return provenanceState_;
35 toolbox::fsm::State FiniteStateMachine::getTransitionFinalState(
36 const std::string& transition)
38 if(stateTransitionTable_[currentState_].find(transition) !=
39 stateTransitionTable_[currentState_].end())
40 return stateTransitionTable_[currentState_][transition];
43 std::ostringstream error;
44 error <<
"Cannot find transition name with transition: " << transition
46 XCEPT_RAISE(toolbox::fsm::exception::Exception, error.str());
51 std::string FiniteStateMachine::getProvenanceStateName(
void)
53 return getStateName(getProvenanceState());
57 std::string FiniteStateMachine::getCurrentStateName(
void)
59 return getStateName(getCurrentState());
67 time_t FiniteStateMachine::getTimeInState(
void)
69 return stateEntranceTime_ ? (time(0) - stateEntranceTime_) : 0;
73 std::string FiniteStateMachine::getCurrentTransitionName(
const std::string& transition)
75 if(stateTransitionNameTable_[currentState_].find(transition) !=
76 stateTransitionNameTable_[currentState_].end())
78 return stateTransitionNameTable_[currentState_][transition];
82 std::ostringstream error;
83 error <<
"Cannot find transition name with transition: " << transition
85 XCEPT_RAISE(toolbox::fsm::exception::Exception, error.str());
90 std::string FiniteStateMachine::getTransitionName(
const toolbox::fsm::State from,
91 const std::string& transition)
93 if(stateTransitionNameTable_[from].find(transition) !=
94 stateTransitionNameTable_[from].end())
96 return stateTransitionNameTable_[from][transition];
100 std::ostringstream error;
101 error <<
"Cannot find transition name from " << from
102 <<
" with transition: " << transition <<
", unknown!";
103 XCEPT_RAISE(toolbox::fsm::exception::Exception, error.str());
108 std::string FiniteStateMachine::getTransitionParameter(
const toolbox::fsm::State from,
109 const std::string& transition)
111 if(stateTransitionParameterTable_[from].find(transition) !=
112 stateTransitionParameterTable_[from].end())
114 return stateTransitionParameterTable_[from][transition];
120 std::string FiniteStateMachine::getTransitionFinalStateName(
const std::string& transition)
122 return getStateName(getTransitionFinalState(transition));
126 bool FiniteStateMachine::execTransition(
const std::string& transition)
128 const xoap::MessageReference message;
129 return execTransition(transition, message);
140 bool FiniteStateMachine::execTransition(
const std::string& transition,
141 const xoap::MessageReference& message)
143 __COUTV__(transition);
145 if(transition ==
"fail")
147 __COUT_INFO__ <<
"Failing now!!" << __E__;
151 __COUT__ <<
"Currently in a transition executed from current state "
152 << getProvenanceStateName()
153 <<
". Attempting to wait for the transition to complete." << __E__;
162 std::map<std::string, toolbox::fsm::State> transitions =
163 getTransitions(getCurrentState());
164 for(
const auto& transitionPair : transitions)
166 __COUT__ <<
"Taking transition to indirect failure: " << transitionPair.first
168 toolbox::Event::Reference event(
169 new toolbox::Event(transitionPair.first,
this));
173 this->fireEvent(event);
175 catch(toolbox::fsm::exception::Exception& e)
177 std::ostringstream error;
178 error <<
"Transition " << transition
179 <<
" was not executed from current state "
180 << getStateName(getCurrentState())
181 <<
". There was an error: " << e.what();
182 __COUT_ERR__ << error.str() << std::endl;
184 inTransition_ =
false;
185 stateEntranceTime_ = time(0);
196 __COUT_WARN__ <<
"In transition, and received another transition: " << transition
197 <<
". Ignoring..." << __E__;
201 inTransition_ =
true;
202 bool transitionSuccessful =
true;
203 provenanceState_ = getCurrentState();
205 std::map<std::string, toolbox::fsm::State> transitions =
206 getTransitions(getCurrentState());
207 if(transitions.find(transition) == transitions.end())
209 inTransition_ =
false;
210 std::ostringstream error;
212 <<
" is not in the list of the transitions from current state "
213 << getStateName(getCurrentState());
214 __COUT_ERR__ << error.str() << std::endl;
215 XCEPT_RAISE(toolbox::fsm::exception::Exception, error.str());
226 toolbox::Event::Reference event(
new toolbox::Event(transition,
this));
231 this->fireEvent(event);
233 catch(toolbox::fsm::exception::Exception& e)
235 inTransition_ =
false;
236 transitionSuccessful =
false;
237 std::ostringstream error;
238 __SS__ <<
"Transition " << transition <<
" was not executed from current state "
239 << getStateName(getCurrentState()) <<
". There was an error: " << e.what();
240 __COUT_ERR__ << ss.str() << std::endl;
244 XCEPT_RAISE(toolbox::fsm::exception::Exception, ss.str());
248 inTransition_ =
false;
249 transitionSuccessful =
false;
250 __SS__ <<
"Transition " << transition <<
" was not executed from current state "
251 << getStateName(getCurrentState()) <<
". There was an unknown error.";
252 __COUT_ERR__ << ss.str() << std::endl;
256 XCEPT_RAISE(toolbox::fsm::exception::Exception, ss.str());
259 inTransition_ =
false;
260 stateEntranceTime_ = time(0);
261 return transitionSuccessful;
265 bool FiniteStateMachine::isInTransition(
void) {
return inTransition_; }
268 void FiniteStateMachine::setErrorMessage(
const std::string& errMessage,
bool append)
271 theErrorMessage_ += errMessage;
273 theErrorMessage_ = errMessage;
277 const std::string& FiniteStateMachine::getErrorMessage()
const
279 return theErrorMessage_;
283 void FiniteStateMachine::setInitialState(toolbox::fsm::State state)
285 toolbox::fsm::FiniteStateMachine::setInitialState(state);
286 provenanceState_ = state;
287 stateEntranceTime_ = time(0);
291 const xoap::MessageReference& FiniteStateMachine::getCurrentMessage(
void)