1 #include "otsdaq/FiniteStateMachine/RunControlStateMachine.h"
2 #include "otsdaq/MessageFacility/MessageFacility.h"
4 #include "otsdaq/Macros/CoutMacros.h"
5 #include "otsdaq/Macros/StringMacros.h"
7 #include "otsdaq/SOAPUtilities/SOAPCommand.h"
8 #include "otsdaq/SOAPUtilities/SOAPUtilities.h"
10 #include <toolbox/fsm/FailedEvent.h>
11 #include <xdaq/NamespaceURI.h>
12 #include <xoap/Method.h>
18 #define __MF_SUBJECT__ "FSM"
19 #define mfSubject_ std::string("FSM-") + theStateMachine_.getStateMachineName()
25 const std::string RunControlStateMachine::FAILED_STATE_NAME = FiniteStateMachine::FAILED_STATE_NAME;
26 const std::string RunControlStateMachine::INITIAL_STATE_NAME = FiniteStateMachine::INITIAL_STATE_NAME ;
27 const std::string RunControlStateMachine::HALTED_STATE_NAME =
"Halted";
28 const std::string RunControlStateMachine::PAUSED_STATE_NAME =
"Paused";
29 const std::string RunControlStateMachine::RUNNING_STATE_NAME =
"Running";
30 const std::string RunControlStateMachine::SHUTDOWN_STATE_NAME =
"Shutdown";
31 const std::string RunControlStateMachine::CONFIGURED_STATE_NAME =
"Configured";
33 const std::string RunControlStateMachine::SHUTDOWN_TRANSITION_NAME =
"Shutdown";
34 const std::string RunControlStateMachine::STARTUP_TRANSITION_NAME =
"Startup";
35 const std::string RunControlStateMachine::INIT_TRANSITION_NAME =
"Initialize";
36 const std::string RunControlStateMachine::ERROR_TRANSITION_NAME = FiniteStateMachine::ERROR_TRANSITION_NAME;
37 const std::string RunControlStateMachine::FAIL_TRANSITION_NAME =
"Fail";
38 const std::string RunControlStateMachine::CONFIGURE_TRANSITION_NAME = FiniteStateMachine::CONFIGURE_TRANSITION_NAME;
39 const std::string RunControlStateMachine::HALT_TRANSITION_NAME =
"Halt";
40 const std::string RunControlStateMachine::ABORT_TRANSITION_NAME =
"Abort";
41 const std::string RunControlStateMachine::PAUSE_TRANSITION_NAME =
"Pause";
42 const std::string RunControlStateMachine::RESUME_TRANSITION_NAME =
"Resume";
43 const std::string RunControlStateMachine::START_TRANSITION_NAME =
"Start";
44 const std::string RunControlStateMachine::STOP_TRANSITION_NAME =
"Stop";
49 RunControlStateMachine::RunControlStateMachine(
const std::string& name)
50 : theStateMachine_(name)
54 theStateMachine_.addState(
'I',
55 RunControlStateMachine::INITIAL_STATE_NAME,
57 &RunControlStateMachine::stateInitial);
58 theStateMachine_.addState(
'H',
59 RunControlStateMachine::HALTED_STATE_NAME,
61 &RunControlStateMachine::stateHalted);
62 theStateMachine_.addState(
'C',
63 RunControlStateMachine::CONFIGURED_STATE_NAME,
65 &RunControlStateMachine::stateConfigured);
66 theStateMachine_.addState(
'R',
67 RunControlStateMachine::RUNNING_STATE_NAME,
69 &RunControlStateMachine::stateRunning);
70 theStateMachine_.addState(
'P',
71 RunControlStateMachine::PAUSED_STATE_NAME,
73 &RunControlStateMachine::statePaused);
74 theStateMachine_.addState(
'X',
75 RunControlStateMachine::SHUTDOWN_STATE_NAME,
77 &RunControlStateMachine::stateShutdown);
86 theStateMachine_.setStateName(FiniteStateMachine::FAILED_STATE,
87 RunControlStateMachine::FAILED_STATE_NAME);
88 theStateMachine_.setFailedStateTransitionAction(
89 this, &RunControlStateMachine::enteringError);
90 theStateMachine_.setFailedStateTransitionChanged(
this,
91 &RunControlStateMachine::inError);
95 RunControlStateMachine::addStateTransition(
96 FiniteStateMachine::FAILED_STATE,
98 RunControlStateMachine::HALT_TRANSITION_NAME,
101 &RunControlStateMachine::transitionHalting);
102 RunControlStateMachine::addStateTransition(
103 FiniteStateMachine::FAILED_STATE,
105 RunControlStateMachine::SHUTDOWN_TRANSITION_NAME,
108 &RunControlStateMachine::transitionShuttingDown);
109 RunControlStateMachine::addStateTransition(
110 FiniteStateMachine::FAILED_STATE,
111 FiniteStateMachine::FAILED_STATE,
112 RunControlStateMachine::ERROR_TRANSITION_NAME,
115 &RunControlStateMachine::enteringError);
116 RunControlStateMachine::addStateTransition(
117 FiniteStateMachine::FAILED_STATE,
118 FiniteStateMachine::FAILED_STATE,
119 RunControlStateMachine::FAIL_TRANSITION_NAME,
122 &RunControlStateMachine::transitionShuttingDown);
124 RunControlStateMachine::addStateTransition(
127 RunControlStateMachine::CONFIGURE_TRANSITION_NAME,
129 "ConfigurationAlias",
131 &RunControlStateMachine::transitionConfiguring);
132 RunControlStateMachine::addStateTransition(
135 RunControlStateMachine::SHUTDOWN_TRANSITION_NAME,
138 &RunControlStateMachine::transitionShuttingDown);
139 RunControlStateMachine::addStateTransition(
142 RunControlStateMachine::STARTUP_TRANSITION_NAME,
145 &RunControlStateMachine::transitionStartingUp);
148 RunControlStateMachine::addStateTransition(
151 RunControlStateMachine::INIT_TRANSITION_NAME,
154 &RunControlStateMachine::transitionInitializing);
155 RunControlStateMachine::addStateTransition(
158 RunControlStateMachine::HALT_TRANSITION_NAME,
161 &RunControlStateMachine::transitionHalting);
162 RunControlStateMachine::addStateTransition(
165 RunControlStateMachine::HALT_TRANSITION_NAME,
168 &RunControlStateMachine::transitionHalting);
169 RunControlStateMachine::addStateTransition(
172 RunControlStateMachine::ABORT_TRANSITION_NAME,
175 &RunControlStateMachine::transitionHalting);
176 RunControlStateMachine::addStateTransition(
179 RunControlStateMachine::ABORT_TRANSITION_NAME,
182 &RunControlStateMachine::transitionHalting);
184 RunControlStateMachine::addStateTransition(
187 RunControlStateMachine::PAUSE_TRANSITION_NAME,
190 &RunControlStateMachine::transitionPausing);
191 RunControlStateMachine::addStateTransition(
194 RunControlStateMachine::RESUME_TRANSITION_NAME,
197 &RunControlStateMachine::transitionResuming);
198 RunControlStateMachine::addStateTransition(
201 RunControlStateMachine::START_TRANSITION_NAME,
204 &RunControlStateMachine::transitionStarting);
205 RunControlStateMachine::addStateTransition(
208 RunControlStateMachine::STOP_TRANSITION_NAME,
211 &RunControlStateMachine::transitionStopping);
212 RunControlStateMachine::addStateTransition(
215 RunControlStateMachine::STOP_TRANSITION_NAME,
218 &RunControlStateMachine::transitionStopping);
224 &RunControlStateMachine::runControlMessageHandler,
225 RunControlStateMachine::INIT_TRANSITION_NAME,
228 &RunControlStateMachine::runControlMessageHandler,
229 RunControlStateMachine::CONFIGURE_TRANSITION_NAME,
232 &RunControlStateMachine::runControlMessageHandler,
233 RunControlStateMachine::START_TRANSITION_NAME,
236 &RunControlStateMachine::runControlMessageHandler,
237 RunControlStateMachine::STOP_TRANSITION_NAME,
240 &RunControlStateMachine::runControlMessageHandler,
241 RunControlStateMachine::PAUSE_TRANSITION_NAME,
244 &RunControlStateMachine::runControlMessageHandler,
245 RunControlStateMachine::RESUME_TRANSITION_NAME,
248 &RunControlStateMachine::runControlMessageHandler,
249 RunControlStateMachine::HALT_TRANSITION_NAME,
252 &RunControlStateMachine::runControlMessageHandler,
253 RunControlStateMachine::ABORT_TRANSITION_NAME,
256 &RunControlStateMachine::runControlMessageHandler,
257 RunControlStateMachine::SHUTDOWN_TRANSITION_NAME,
260 &RunControlStateMachine::runControlMessageHandler,
261 RunControlStateMachine::STARTUP_TRANSITION_NAME,
264 &RunControlStateMachine::runControlMessageHandler,
265 RunControlStateMachine::FAIL_TRANSITION_NAME,
268 &RunControlStateMachine::runControlMessageHandler,
269 RunControlStateMachine::ERROR_TRANSITION_NAME,
273 &RunControlStateMachine::runControlMessageHandler,
277 &RunControlStateMachine::runControlMessageHandler,
278 "AsyncPauseException",
285 RunControlStateMachine::~RunControlStateMachine(
void) {}
288 void RunControlStateMachine::reset(
void)
290 __GEN_COUT__ <<
"Resetting RunControlStateMachine with name '"
291 << theStateMachine_.getStateMachineName() <<
"'..." << __E__;
292 theStateMachine_.setInitialState(
'I');
293 theStateMachine_.reset();
295 theStateMachine_.setErrorMessage(
"",
false );
297 asyncFailureReceived_ =
false;
298 asyncPauseExceptionReceived_ =
false;
299 asyncStopExceptionReceived_ =
false;
332 xoap::MessageReference message)
334 __GEN_COUTS__(2) <<
"Received... \t" << SOAPUtilities::translate(message)
337 std::string command = SOAPUtilities::translate(message).getCommand();
343 SOAPUtilities::translate(message).getParameters().getValue(
344 "subsystemIterationIndex"),
345 subsystemIterationIndex_);
350 __GEN_COUTT__ <<
"Defaulting subsystemIterationIndex_ to 0." << __E__;
351 subsystemIterationIndex_ = 0;
357 SOAPUtilities::translate(message).getParameters().getValue(
"iterationIndex"),
362 __GEN_COUT__ <<
"Defaulting iteration index to 0." << __E__;
369 SOAPUtilities::translate(message).getParameters().getValue(
370 "subIterationIndex"),
375 __GEN_COUTT__ <<
"Defaulting subIterationIndex_ index to 0." << __E__;
376 subIterationIndex_ = 0;
383 SOAPUtilities::translate(message).getParameters().getValue(
384 "MinReadyForEventGenerationStartIteration"),
385 minReadyForEventGenerationStartIteration_);
389 minReadyForEventGenerationStartIteration_ = 0;
393 bool retransmittedCommand =
false;
396 retransmittedCommand =
397 (SOAPUtilities::translate(message).getParameters().getValue(
398 "retransmission") ==
"1");
406 if(retransmittedCommand)
409 __GEN_COUT__ <<
"retransmission identified..." << __E__;
412 if(lastIterationCommand_ == command &&
413 lastSubsystemIterationIndex_ == subsystemIterationIndex_ &&
414 lastIterationIndex_ == iterationIndex_ &&
415 lastSubIterationIndex_ == subIterationIndex_)
418 <<
"Assuming a timeout occurred at Gateway waiting for a response. "
419 <<
"Attempting to avoid error, by giving last result for command '"
420 << command <<
"': " << lastIterationResult_ << __E__;
423 return SOAPUtilities::makeSOAPMessageReference(lastIterationResult_);
425 catch(
const std::exception&
428 __GEN_COUT__ <<
"There was an illegal result propagation: "
429 << lastIterationResult_
430 <<
". Here was the error: " << e.what() << __E__;
435 __GEN_COUT__ <<
"Looks like Gateway command '" << command
436 <<
"' was lost - attempting to handle retransmission." << __E__;
439 lastSubsystemIterationIndex_ = subsystemIterationIndex_;
440 lastIterationIndex_ = iterationIndex_;
441 lastSubIterationIndex_ = subIterationIndex_;
443 std::string currentState;
447 theProgressBar_.
reset(command, theStateMachine_.getStateMachineName());
448 currentState = theStateMachine_.getCurrentStateName();
449 __GEN_COUT__ <<
"Starting state for " << theStateMachine_.getStateMachineName()
450 <<
" is " << currentState <<
" and attempting to " << command
455 currentState = theStateMachine_.getStateName(lastIterationState_);
457 __GEN_COUTS__(2) <<
"Iteration index "
458 << (isStandaloneSubsystem()
459 ? std::string(
"standalone")
460 : std::to_string(subsystemIterationIndex_))
461 <<
":" << iterationIndex_ <<
"." << subIterationIndex_ <<
" for "
462 << theStateMachine_.getStateMachineName() <<
" from "
463 << currentState <<
" attempting to " << command << std::endl;
466 RunControlStateMachine::theProgressBar_.step();
468 std::string result = command +
"Done";
469 lastIterationResult_ = result;
473 if(command ==
"Error" || command ==
"Fail")
475 __GEN_SS__ << command <<
" was received! Halting immediately." << std::endl;
476 __GEN_COUT_ERR__ <<
"\n" << ss.str();
480 if(currentState ==
"Configured")
481 theStateMachine_.execTransition(
482 RunControlStateMachine::HALT_TRANSITION_NAME, message);
483 else if(currentState ==
"Running" || currentState ==
"Paused")
484 theStateMachine_.execTransition(
485 RunControlStateMachine::ABORT_TRANSITION_NAME, message);
489 __GEN_COUT_ERR__ <<
"Halting failed in reaction to " << command
490 <<
"... ignoring." << __E__;
493 return SOAPUtilities::makeSOAPMessageReference(result);
495 else if(command ==
"AsyncError")
497 std::string errorMessage =
498 SOAPUtilities::translate(message).getParameters().getValue(
"ErrorMessage");
500 __GEN_SS__ << command <<
" was received! Error'ing immediately: " << errorMessage
502 __GEN_COUT_ERR__ <<
"\n" << ss.str();
503 theStateMachine_.setErrorMessage(ss.str());
505 if(!asyncFailureReceived_.exchange(
true))
511 std::thread([
this]() {
514 theStateMachine_.execTransition(
"fail");
518 __GEN_COUT_ERR__ <<
"AsyncError: execTransition(fail) threw" << __E__;
523 return SOAPUtilities::makeSOAPMessageReference(result);
525 else if(command ==
"AsyncPauseException")
527 std::string errorMessage =
528 SOAPUtilities::translate(message).getParameters().getValue(
"ErrorMessage");
530 __GEN_SS__ << command <<
" was received! Pause'ing immediately: " << errorMessage
532 __GEN_COUT_ERR__ <<
"\n" << ss.str();
533 theStateMachine_.setErrorMessage(ss.str());
535 if(!asyncPauseExceptionReceived_.exchange(
true))
539 std::thread([
this]() {
542 theStateMachine_.execTransition(
"Pause");
546 __GEN_COUT_ERR__ <<
"AsyncPauseException: execTransition(Pause) threw"
552 return SOAPUtilities::makeSOAPMessageReference(result);
554 else if(command ==
"AsyncStopException")
556 std::string errorMessage =
557 SOAPUtilities::translate(message).getParameters().getValue(
"ErrorMessage");
559 __GEN_SS__ << command <<
" was received! Stop'ing immediately: " << errorMessage
561 __GEN_COUT_ERR__ <<
"\n" << ss.str();
562 theStateMachine_.setErrorMessage(ss.str());
564 if(!asyncStopExceptionReceived_.exchange(
true))
568 std::thread([
this]() {
571 theStateMachine_.execTransition(
"Stop");
575 __GEN_COUT_ERR__ <<
"AsyncStopException: execTransition(Stop) threw"
581 return SOAPUtilities::makeSOAPMessageReference(result);
586 if(command == RunControlStateMachine::INIT_TRANSITION_NAME &&
587 currentState == RunControlStateMachine::HALTED_STATE_NAME)
589 __GEN_COUT__ <<
"Already Initialized.. ignoring Initialize command." << std::endl;
591 theStateMachine_.setErrorMessage(
"",
false );
592 return SOAPUtilities::makeSOAPMessageReference(result);
595 if(command == RunControlStateMachine::INIT_TRANSITION_NAME &&
596 currentState == RunControlStateMachine::FAILED_STATE_NAME)
598 __GEN_COUT__ <<
"Converting Initialize command to Halt, since currently in "
599 << currentState <<
" state." << std::endl;
600 command = RunControlStateMachine::HALT_TRANSITION_NAME;
601 message = SOAPUtilities::makeSOAPMessageReference(command);
604 if((command == RunControlStateMachine::HALT_TRANSITION_NAME ||
605 command == RunControlStateMachine::SHUTDOWN_TRANSITION_NAME) &&
606 currentState == RunControlStateMachine::FAILED_STATE_NAME)
608 __GEN_COUT__ <<
"Clearing Errors after failure..." << std::endl;
609 theStateMachine_.setErrorMessage(
"",
false );
610 asyncFailureReceived_ =
false;
611 asyncPauseExceptionReceived_ =
false;
612 asyncStopExceptionReceived_ =
false;
615 if(command == RunControlStateMachine::RESUME_TRANSITION_NAME)
616 asyncPauseExceptionReceived_ =
false;
617 if(command == RunControlStateMachine::START_TRANSITION_NAME)
618 asyncStopExceptionReceived_ =
false;
620 __GEN_COUTVS__(2, command);
621 __GEN_COUTVS__(2, currentState);
622 __GEN_COUTVS__(2, asyncFailureReceived_);
623 __GEN_COUTVS__(2, asyncPauseExceptionReceived_);
624 __GEN_COUTVS__(2, asyncStopExceptionReceived_);
625 __GEN_COUTVS__(2, getErrorMessage());
626 __GEN_COUTVS__(2, retransmittedCommand);
634 if(!((asyncPauseExceptionReceived_ &&
635 command == RunControlStateMachine::PAUSE_TRANSITION_NAME) ||
636 (asyncStopExceptionReceived_ &&
637 command == RunControlStateMachine::STOP_TRANSITION_NAME)))
638 theStateMachine_.setErrorMessage(
"",
641 if(command == RunControlStateMachine::HALT_TRANSITION_NAME &&
642 currentState == RunControlStateMachine::INITIAL_STATE_NAME)
644 command = RunControlStateMachine::INIT_TRANSITION_NAME;
645 __GEN_COUT__ <<
"Converting Halt command to " << command
646 <<
", since currently in " << currentState <<
" state."
648 message = SOAPUtilities::makeSOAPMessageReference(command);
650 if(command == RunControlStateMachine::HALT_TRANSITION_NAME &&
651 (currentState == RunControlStateMachine::PAUSED_STATE_NAME ||
652 currentState == RunControlStateMachine::RUNNING_STATE_NAME))
654 command = RunControlStateMachine::ABORT_TRANSITION_NAME;
655 __GEN_COUT__ <<
"Converting Halt command to " << command
656 <<
", since currently in " << currentState <<
" state."
658 message = SOAPUtilities::makeSOAPMessageReference(command);
660 if(command == RunControlStateMachine::CONFIGURE_TRANSITION_NAME &&
661 currentState == RunControlStateMachine::INITIAL_STATE_NAME)
664 <<
"Pre-empting Configure command with Initialize, since currently in "
665 << currentState <<
" state." << std::endl;
666 std::string precommand = RunControlStateMachine::INIT_TRANSITION_NAME;
667 xoap::MessageReference premessage =
668 SOAPUtilities::makeSOAPMessageReference(precommand);
669 theStateMachine_.execTransition(precommand, premessage);
670 __GEN_COUT__ <<
"Now proceeding with Configure command" << __E__;
673 subsystemIterationWorkFlag_ =
false;
674 iterationWorkFlag_ =
false;
675 subIterationWorkFlag_ =
false;
678 __GEN_COUTS__(2) << command <<
" subsystemIteration="
679 << (isStandaloneSubsystem()
680 ? std::string(
"standalone")
681 : std::to_string(subsystemIterationIndex_))
682 <<
" iteration=" << iterationIndex_ <<
"."
683 << subIterationIndex_ << __E__;
684 toolbox::Event::Reference event(
new toolbox::Event(command,
this));
690 <<
"Iterating on the transition function from " << currentState
691 <<
" through " << lastIterationCommand_ << __E__;
693 auto itFrom = stateTransitionFunctionTable_.find(lastIterationState_);
694 if(itFrom == stateTransitionFunctionTable_.end())
696 __GEN_SS__ <<
"Cannot find transition function from '" << currentState
697 <<
"' with transition '" << lastIterationCommand_ <<
"!'"
699 __GEN_COUT_ERR__ << ss.str();
700 XCEPT_RAISE(toolbox::fsm::exception::Exception, ss.str());
703 auto itTransition = itFrom->second.find(lastIterationCommand_);
704 if(itTransition == itFrom->second.end())
706 __GEN_SS__ <<
"Cannot find transition function from '" << currentState
707 <<
"' with transition '" << lastIterationCommand_ <<
"!'"
709 __GEN_COUT_ERR__ << ss.str();
710 XCEPT_RAISE(toolbox::fsm::exception::Exception, ss.str());
713 (this->*(itTransition->second))(event);
720 lastIterationState_ = theStateMachine_.getCurrentState();
721 lastIterationCommand_ = command;
722 if(command == RunControlStateMachine::CONFIGURE_TRANSITION_NAME)
724 lastAttemptedConfigureGroup_ =
725 SOAPUtilities::translate(message).getParameters().getValue(
726 "ConfigurationAlias");
731 lastAttemptedConfigureGroup_ +=
733 SOAPUtilities::translate(message).getParameters().getValue(
734 "ConfigurationTableGroupName") +
736 SOAPUtilities::translate(message).getParameters().getValue(
737 "ConfigurationTableGroupKey") +
745 theStateMachine_.execTransition(command, message);
748 if(subIterationWorkFlag_)
750 __GEN_COUTV__(subIterationWorkFlag_);
752 command +
"SubIterate";
754 else if(iterationWorkFlag_)
756 __GEN_COUTVS__(2, iterationWorkFlag_);
757 result = command +
"Iterate";
760 subsystemIterationWorkFlag_)
762 __GEN_COUTVS__(2, subsystemIterationWorkFlag_);
768 catch(
const std::runtime_error& e)
770 __GEN_SS__ <<
"Run Control Message Handling Failed with command '" << command
771 <<
"': " << e.what() <<
" " << theStateMachine_.getErrorMessage()
773 __GEN_COUT_ERR__ << ss.str();
774 theStateMachine_.setErrorMessage(ss.str());
776 result = command + RunControlStateMachine::FAILED_STATE_NAME;
778 catch(toolbox::fsm::exception::Exception& e)
780 __GEN_SS__ <<
"Run Control Message Handling Failed with command '" << command
781 <<
"': " << e.what() <<
" " << theStateMachine_.getErrorMessage()
783 __GEN_COUT_ERR__ << ss.str();
784 theStateMachine_.setErrorMessage(ss.str());
786 result = command + RunControlStateMachine::FAILED_STATE_NAME;
790 __GEN_SS__ <<
"Run Control Message Handling Failed with command '" << command
791 <<
"' and encountered an unknown error."
792 << theStateMachine_.getErrorMessage() << __E__;
797 catch(
const std::exception& e)
799 ss <<
"Exception message: " << e.what();
804 __GEN_COUT_ERR__ << ss.str();
805 theStateMachine_.setErrorMessage(ss.str());
807 result = command + RunControlStateMachine::FAILED_STATE_NAME;
810 RunControlStateMachine::theProgressBar_.step();
812 currentState = theStateMachine_.getCurrentStateName();
814 if(currentState == RunControlStateMachine::FAILED_STATE_NAME)
816 result = command + RunControlStateMachine::FAILED_STATE_NAME;
817 __GEN_COUT_ERR__ <<
"Unexpected Failure state for "
818 << theStateMachine_.getStateMachineName() <<
" is "
819 << currentState << std::endl;
820 __GEN_COUT_ERR__ <<
"Error message was as follows: "
821 << theStateMachine_.getErrorMessage() << std::endl;
824 RunControlStateMachine::theProgressBar_.step();
826 if(!subsystemIterationWorkFlag_ && !iterationWorkFlag_ && !subIterationWorkFlag_)
830 __GEN_COUTVS__(2, theProgressBar_.
read());
831 __GEN_COUTVS__(2, theProgressBar_.
isComplete());
834 __GEN_COUTS__(2) <<
"Ending state for " << theStateMachine_.getStateMachineName()
835 <<
" is " << currentState << std::endl;
836 __GEN_COUTS__(2) <<
"result = " << result << std::endl;
837 lastIterationResult_ = result;
838 return SOAPUtilities::makeSOAPMessageReference(result);
bool isComplete()
get functions
void reset(std::string file, std::string lineNumber, int id=0)
will call this reset:
int read()
if stepsToComplete==0, then define any progress as 50%, thread safe
void complete()
declare complete, thread safe
bool isFirstIteration(void) const
true on the very first call of a transition (all indices at their starting value)
xoap::MessageReference runControlMessageHandler(xoap::MessageReference message)
Run Control Messages.
defines used also by OtsConfigurationWizardSupervisor
void INIT_MF(const char *name)
static bool getNumber(const std::string &s, T &retValue)