Runcontrol

From CLONWiki
Jump to navigation Jump to search

This page describes run control part of Coda DAQ system. It reside in $CODA/src/rc/ directory.

Communication between rcServer and runcontrol

Lets use 'tokenInterval' as example. It reside in database, and can be changed by runcontrol. Following steps were made to implement 'tokenInterval' functionality:

  • rcServer/Components.s/daqRun.h: object must have a type 'daqData' to use reloaded operations etc:
daqData* tokenInterval_; /* variable */
daqDataWriter* tokenIWriter_; /* database writer */
  • rcServer/Components.s/daqRun.cc: create object, connect it to manager, and enable writing:
tokenInterval_ = new rcsDaqData (exptname_, "tokenInterval", 0); /* create variable */
tokenInterval_->connect (dataManager_);                          /* register to data manager (class daqDataUpdater) */
tokenInterval_->enableWrite ();                                  /* enable writing to database */
tokenIWriter_ = new rcsTokenIntervalWriter (this);               /* create database writer */
tokenInterval_->writer (tokenIWriter_);                          /* register database writer */
*tokenInterval_ = 0;                                             /* reset when needed */


/* called from dbaseReader::parseOptions();
 in line '*tokenInterval_ = itval' operator '=' overloaded in daqData class, calling 'notifychannels' and 'write'
 methods; 'write' method calls rcsTokenIntervalWriter::write() registered above
*/
void
daqRun::tokenInterval (int itval, int writeUpdate)
{
  /* if not write to database, disable the write */
  if (!writeUpdate) tokenInterval_->disableWrite ();
  *tokenInterval_ = itval; /*overloaded '=' here ! */
  if (!writeUpdate) tokenInterval_->enableWrite ();  
}
/* writer for 'tokenInterval_', called from rcServer/Components.s/rcsTokenIntervalWriter.cc registered above */
void
daqRun::updateTokenInterval (int itval)
{
  dbreader_->putTokenInterval (itval); /* put new value into database */
}




adcecal5:runControl> grep \"tokenInterval\" */*/*.cc

rcClient/src.s/rcClient.cc: tokenInterval_ = new rccDaqData (exptname_, "tokenInterval", 0);


rcServer/Components.s/daqRun.cc:/*sergey: corresponds to "tokenInterval" !? see

rcClient/src.s/rcClient.cc: tokenInterval_ = new rccDaqData (exptname_, "tokenInterval", 0);


rcServer/Components.s/dbaseReader.cc: else if (::strcmp (row[0], DBASE_TOKEN_INTERVAL) == 0) /* DBASE_TOKEN_INTERVAL="tokenInterval" */

Xui/src.s/rcClientHandler.cc: if (handler_.monitorOnCallback (exptname, "tokenInterval",

Xui/src.s/rcTokenIButton.cc: daqData data (client.exptname (), "tokenInterval", newval);