1 // ; -*- mode: C++; -*-
 
   10  * DAQ state machine interface.
 
   19    * The member method enter() makes a call to the virtual method JDAQCHSM::enterState(...), 
 
   21    *  - first  argument is the state entered;
 
   22    *  - second argument is the event that caused the transition;
 
   24    * This method should be overwritten by the run control client to reply to the run control.
 
   31      * Default CHSM constructor.
 
   33     JDAQState(CHSM_STATE_ARGS) :
 
   34       CHSM::state(CHSM_STATE_INIT)
 
   41      * \param  event     event that triggered transition
 
   42      * \param  from      pointer to state from where transition started
 
   43      * \return           true if all OK; else false
 
   45     bool enter(const CHSM::event& event, CHSM::state* from)
 
   49         dynamic_cast<JDAQCHSM&>(this->chsm()).enterState(*this, event);
 
   51         return CHSM::state::enter(event, from);
 
   53       catch(const std::exception& error) {      
 
   63    * \param  __name               name of state machine
 
   65   JDAQCHSM(CHSM_MACHINE_ARGS, const std::string& __name) :
 
   66     CHSM::machine(CHSM_MACHINE_INIT),
 
   74    * Get name of state machine.
 
   78   const std::string& getName() const
 
   85    * Get detector identifier.
 
   87    * \return             detector identifier.
 
   89   int getDetectorID() const 
 
  100   int getRunNumber() const 
 
  107    * Interface methods for actions corresponding to state transitions.
 
  109   virtual void actionEnter() {}
 
  110   virtual void actionExit()  {}
 
  112   virtual void actionInit      (int, const char*) {}
 
  113   virtual void actionConfigure (int, const char*) {}
 
  114   virtual void actionStart     (int, const char*) {}
 
  115   virtual void actionPause     (int, const char*) {}
 
  116   virtual void actionContinue  (int, const char*) {}
 
  117   virtual void actionStop      (int, const char*) {}
 
  118   virtual void actionReset     (int, const char*) {}
 
  119   virtual void actionQuit      (int, const char*) {}
 
  121   virtual void actionCheck(int, const char*) {}
 
  122   virtual void actionInput(int, const char*) {}
 
  124   virtual void actionError() {}
 
  125   virtual void actionRecover(int, const char*) {}
 
  130    * Action when entering state.
 
  132    * \param  state       entered state
 
  133    * \param  event       event that triggered transition
 
  135   virtual void enterState(const CHSM::state& state, const CHSM::event& event) = 0;
 
  139    * Type definition of action method.
 
  141   typedef void (JDAQCHSM::*action)(int, const char*);
 
  145    * The method to execute the action.
 
  147    * This method shall be implemented in the derived class.
 
  149    * \param  __action    pointer to action method
 
  150    * \param  __event     event that triggered the action
 
  152   virtual void execute(action __action, const CHSM::event& __event) = 0;
 
  162 chsm<JDAQCHSM> JDAQStateMachine(const std::string __name) {
 
  164   upon enter %{ actionEnter(); %}
 
  165   upon exit  %{ actionExit();  %}
 
  170    * Type definition of an event with additional data
 
  172   event ev_daq(int length, const char* buffer);
 
  174   event<ev_daq> ev_init;
 
  175   event<ev_daq> ev_configure;
 
  176   event<ev_daq> ev_start;
 
  177   event<ev_daq> ev_pause;
 
  178   event<ev_daq> ev_continue;
 
  179   event<ev_daq> ev_stop;
 
  180   event<ev_daq> ev_reset;
 
  181   event<ev_daq> ev_quit;
 
  182   event<ev_daq> ev_off;
 
  183   event<ev_daq> ev_check;
 
  184   event<ev_daq> ev_input;
 
  185   event<ev_daq> ev_recover;
 
  188   set Main(RunControl, Responder) is {
 
  191      * The run control cluster.
 
  193     cluster RunControl(Operational, Error) is {
 
  195       cluster Operational(Idle, Standby, Ready, Paused, Running) {
 
  197         ev_error->Error         %{ actionError(); %};
 
  201         state<JDAQState> Idle {
 
  203           ev_init->Standby      %{ execute(&JDAQCHSM::actionInit,      event); %};
 
  204           ev_off                %{ JDAQCHSM::exit(); %};
 
  207         state<JDAQState> Standby {
 
  209           ev_configure->Ready   %{ execute(&JDAQCHSM::actionConfigure, event); %};
 
  210           ev_reset->Idle        %{ execute(&JDAQCHSM::actionReset,     event); %};
 
  213         state<JDAQState> Ready {
 
  217             std::istringstream is(std::string(ev_start->buffer, ev_start->length));
 
  219             is >> run_number >> detector_id; 
 
  221             execute(&JDAQCHSM::actionStart, event);
 
  225           ev_quit->Standby      %{ execute(&JDAQCHSM::actionQuit,      event); %};
 
  228         state<JDAQState> Paused {
 
  230           ev_continue->Running  %{ execute(&JDAQCHSM::actionContinue,  event); %};
 
  231           ev_stop->Standby      %{ execute(&JDAQCHSM::actionStop,      event); %};
 
  234         state<JDAQState> Running {
 
  236           ev_pause->Paused      %{ execute(&JDAQCHSM::actionPause,     event); %};
 
  241       state<JDAQState> Error {
 
  243         ev_recover->Operational %{ execute(&JDAQCHSM::actionRecover,   event); %};
 
  244         ev_off                  %{ JDAQCHSM::exit(); %};
 
  249      * This state is used to repond to user commands that are not part of the run control state machine. 
 
  253       ev_check                  %{ execute(&JDAQCHSM::actionCheck,     event); %};
 
  254       ev_input                  %{ execute(&JDAQCHSM::actionInput,     event); %};