1 #ifndef __JRUNCONTROL__JDAQDRIVER__
2 #define __JRUNCONTROL__JDAQDRIVER__
70 using namespace JLANG;
111 if (i->isActive() && i->getBorn() <= i->getDied()) {
117 return CHSM::machine::enter();
120 cerr <<
"Timeout at subscription." << endl;
124 cerr << error << endl;
128 cerr <<
"Message server or logger not properly initialised." << endl;
144 using namespace JLANG;
172 virtual void enterState(
const CHSM::state& state,
const CHSM::event& event)
182 JWarningStream(
logger) <<
"Timeout at transition " <<
event.name() <<
" to state " << state.name();
201 using namespace JNET;
207 long long int length = 0;
209 if ( no_wait &&
server->CheckHead(tag, length) <= 0) {
return false; }
210 if (!no_wait &&
server->WaitHead (tag, length) < 0) {
return false; }
212 char* data=
new char[length];
214 server->GetFullData(data, length);
216 const string buffer(data, length);
226 }
else if (buffer.find(
getFullName()) != string::npos) {
235 JClientList::iterator i =
clientList.find(buffer);
239 i->update(tag, buffer);
253 istringstream is(buffer);
263 client.update(tag, buffer);
264 client.setMode(JClient::ILLEGAL);
350 void run(std::istream& in)
354 for (
string key; in >> key; ) {
358 in.ignore(numeric_limits<streamsize>::max(),
'\n');
360 }
else if (key ==
"enter") {
365 cerr <<
"State machine not entered; abort." << endl;
369 }
else if (key ==
"exit") {
374 }
else if (key ==
"quit") {
378 }
else if (key ==
"sleep") {
386 }
else if (key ==
"process") {
392 istringstream is(buffer);
398 client.setMode(JClient::ACTIVE);
408 }
else if (key ==
"event" || key ==
"event*") {
413 const char eol =
'\n';
415 if (in >> event >> c && c ==
'{' &&
getline(in, buffer,
'}')) {
423 if (pev->active() || key ==
"event*") {
425 istringstream is(buffer);
427 for (
string tag; is >> tag; ) {
435 server->PutFullString(tag, os.str());
438 if (key !=
"event*") {
458 }
else if (key ==
"message") {
463 if (in >> tag &&
getline(in, buffer,
';'))
464 server->PutFullString(tag, buffer);
468 }
else if (key ==
"print") {
472 << i->getStartCommand() <<
' '
473 << i->getAlive() <<
' '
474 << i->getStatename();
477 }
else if (key ==
"filter") {
484 for (istringstream is(buffer); is >> client; ) {
488 }
else if (key ==
"sync") {
496 in.ignore(numeric_limits<streamsize>::max(),
'\n');
510 const CHSM::parent& parent = static_cast<const CHSM::parent&>(
Main.
RunControl);
512 for (CHSM::parent::const_iterator state = parent.begin(); state != parent.end(); ++state) {
514 if (state->active()) {
533 const CHSM::parent& parent = static_cast<const CHSM::parent&>(
Main.
RunControl);
535 for (CHSM::parent::const_iterator state = parent.begin(); state != parent.end(); ++state) {
537 if (state->active()) {
545 if (i->getMode() == JClient::ACTIVE) {
547 if (!i->getAlive()) {
557 if (buffer.find(i->getHostname()) == string::npos) {
558 JErrorStream(
logger) << i->getFullName() <<
" running on " << buffer <<
" but not alive.";
567 if (i->getAlive() && i->getStatename() != state->name()) {
598 const CHSM::parent& parent = static_cast<const CHSM::parent&>(
Main.
RunControl);
600 for (CHSM::parent::const_iterator state = parent.begin(); state != parent.end(); ++state) {
602 if (state->active()) {
606 if (
target ==
"" || i->getName().find(
target) != std::string::npos) {
608 if (!i->getAlive() || i->getStatename() != state->name()) {
612 i->setMode(JClient::SLEEP);
636 static void copy(std::istream& in, std::ostream& out,
const char eol =
'\n')
642 if (
getline(in, buffer, eol)) {
644 for (string::size_type pos = 0; pos < buffer.length(); ) {
649 if (lpos != string::npos &&
650 rpos != string::npos) {
652 out << buffer.substr(pos, lpos);
657 ifstream file(buffer.substr(pos, rpos - lpos).c_str());
659 copy(file, out,
'\0');
666 out << buffer.substr(pos);
668 pos += buffer.substr(pos).length();