1#ifndef __JRUNCONTROL__JDAQDRIVER__
2#define __JRUNCONTROL__JDAQDRIVER__
58 const int timeout_s) :
126 if (i->isActive() && i->getBorn() <= i->getDied()) {
132 return CHSM::machine::enter();
135 cerr <<
"Timeout at subscription." << endl;
139 cerr << error << endl;
143 cerr <<
"Message server or logger not properly initialised." << endl;
159 using namespace JLANG;
187 virtual void enterState(
const CHSM::state& state,
const CHSM::event& event)
override
197 JWarningStream(
logger) <<
"Timeout at transition " <<
event.name() <<
" to state " << state.name();
216 using namespace JNET;
222 long long int length = 0;
224 if ( no_wait &&
server->CheckHead(tag, length) <= 0) {
return false; }
225 if (!no_wait &&
server->WaitHead (tag, length) < 0) {
return false; }
227 char* data=
new char[length];
229 server->GetFullData(data, length);
231 const string buffer(data, length);
241 }
else if (buffer.find(
getFullName()) != string::npos) {
250 JClientList::iterator i =
clientList.find(buffer);
254 i->update(tag, buffer);
268 istringstream is(buffer);
278 client.update(tag, buffer);
365 void run(std::istream& in)
369 for (
string key; in >> key; ) {
373 in.ignore(numeric_limits<streamsize>::max(),
'\n');
375 }
else if (key ==
"enter") {
380 cerr <<
"State machine not entered; abort." << endl;
384 }
else if (key ==
"exit") {
389 }
else if (key ==
"quit") {
393 }
else if (key ==
"sleep") {
401 }
else if (key ==
"process") {
407 istringstream is(buffer);
423 }
else if (key ==
"event" || key ==
"event*") {
428 const char eol =
'\n';
430 if (in >> event >> c && c ==
'{' &&
getline(in, buffer,
'}')) {
438 if (pev->active() || key ==
"event*") {
440 istringstream is(buffer);
442 for (
string tag; is >> tag; ) {
452 server->PutFullString(tag, os.str());
455 if (key !=
"event*") {
475 }
else if (key ==
"message") {
480 if (in >> tag &&
getline(in, buffer,
';'))
481 server->PutFullString(tag, buffer);
485 }
else if (key ==
"print") {
489 << i->getStartCommand() <<
' '
490 << i->getAlive() <<
' '
491 << i->getStatename();
494 }
else if (key ==
"filter") {
501 for (istringstream is(buffer); is >> client; ) {
505 }
else if (key ==
"sync") {
513 in.ignore(numeric_limits<streamsize>::max(),
'\n');
527 const CHSM::parent& parent =
static_cast<const CHSM::parent&
>(
Main.
RunControl);
529 for (CHSM::parent::const_iterator state = parent.begin(); state != parent.end(); ++state) {
531 if (state->active()) {
550 const CHSM::parent& parent =
static_cast<const CHSM::parent&
>(
Main.
RunControl);
552 for (CHSM::parent::const_iterator state = parent.begin(); state != parent.end(); ++state) {
554 if (state->active()) {
564 if (!i->getAlive()) {
574 if (buffer.find(i->getHostname()) == string::npos) {
575 JErrorStream(
logger) << i->getFullName() <<
" running on " << buffer <<
" but not alive.";
584 if (i->getAlive() && i->getStatename() != state->name()) {
615 const CHSM::parent& parent =
static_cast<const CHSM::parent&
>(
Main.
RunControl);
617 for (CHSM::parent::const_iterator state = parent.begin(); state != parent.end(); ++state) {
619 if (state->active()) {
623 if (
target ==
"" || i->getName().find(
target) != std::string::npos) {
625 if (!i->getAlive() || i->getStatename() != state->name()) {
653 static void copy(std::istream& in, std::ostream& out,
const char eol =
'\n')
662 if (
getline(in, buffer, eol)) {
664 for (string::size_type pos = 0; pos < buffer.length(); ) {
669 if (lpos != string::npos &&
670 rpos != string::npos) {
672 out << buffer.substr(pos, lpos);
677 ifstream file(buffer.substr(pos, rpos - lpos).c_str());
679 copy(file, out,
'\0');
686 out << buffer.substr(pos);
688 pos += buffer.substr(pos).length();
#define THROW(JException_t, A)
Marco for throwing exception with std::ostream compatible message.
JDAQStateMachine::state_Main::state_RunControl RunControl
JDAQStateMachine::ev_check_event ev_check
JDAQStateMachine::state_Main Main
Exception for ControlHost.
Simple data structure to support I/O of equations (see class JLANG::JEquation).
Auxiliary class to specify white space character(s) in currect locale.
Interface for logging messages.
bool is_valid() const
Check validity of logger object.
List of ControlHost client managers.
ControlHost client manager.
static int WhereIs(const std::string &host_name, const std::string &nick_name, std::string &answer)
Locate ControlHost client(s).
static std::string SERVER
host name of message server
Control unit client base class.
JSharedPointer< JControlHost > server
message server
virtual bool filter(const JTag &tag, int length, const char *buffer)
Filter message.
virtual bool exit() override
Exit the state machine.
JDAQEvent_t * findEvent(const JTag &tag, const std::string &event_name)
Find event in event table.
JMessageLogger logger
message logger
Simple driver for run control clients.
virtual bool enter() override
Enter the state machine.
virtual void actionStart(int, const char *) override
void run(std::istream &in)
Run driver.
JDAQDriver(const std::string &name, const std::string &server, JLogger *logger, const int level, const int timeout_s)
Constructor.
virtual void actionStop(int, const char *) override
virtual void enterState(const CHSM::state &state, const CHSM::event &event) override
Action when entering state.
int timeout_us
timeout of state transitions [us]
void run()
Run driver with user input.
void update()
Update client list with incoming ControlHost messages until the client list is synchronised with the ...
void filter(const std::string &target="")
Filter client list by putting failing clients to sleep.
void synchronise()
Synchronise clients.
virtual void actionExit() override
Exit the state machine.
static void copy(std::istream &in, std::ostream &out, const char eol='\n')
Copy data from input to output stream.
bool update(const bool no_wait)
Update client list with incoming ControlHost message.
static const int SLEEP_TIME_US
Auxiliary classes and methods for language specific functionality.
std::istream & getline(std::istream &in, JString &object)
Read string from input stream until end of line.
static const JTag DISPTAG_Born("Born")
static const JTag DISPTAG_Died("Died")
This name space includes all other name spaces (except KM3NETDAQ, KM3NET and ANTARES).
KM3NeT DAQ data structures and auxiliaries.
static const std::string FILENAME_PREFIX
static const JNET::JTag RC_REPLY
static const std::string RUN_CONTROL_CLIENT
static const std::string TOKEN_DELIMETER
JTag getUniqueTag(const std::string &hostname, const std::string &name)
Get unique tag of run control client.
static const JNET::JTag RC_CMD
static const JNET::JTag RC_LOG
char getTokenDelimeter()
Get the token delimeter for command messages.
static const std::string FILENAME_POSTFIX
Level specific message streamers.
Auxiliary class for all subscription.
const std::string & getFullName() const
Get full name of this run control client.
Auxiliary class for handling event name and optional static information.
const std::string & getName() const
Get event name.