1 #ifndef __JRUNCONTROL__JDAQCLIENT__
2 #define __JRUNCONTROL__JDAQCLIENT__
34 #include "JRuncontrol/JDAQCHSM.hh"
43 using namespace JLOGGER;
89 public JDAQStateMachine
98 JDAQStateMachine(name),
115 const std::string& server,
118 JDAQStateMachine(name),
154 parser[
'H'] =
make_field(server) =
"localhost";
155 parser[
'M'] =
make_field(logger) =
"localhost";
159 if (parser.read(args) != 0) {
163 catch(
const exception &error) {
164 cerr << error.what() << endl;
184 cerr << error << endl;
199 if (server.is_valid() && logger.is_valid()) {
204 server->SendMeAlways();
207 return CHSM::machine::enter();
214 cerr <<
"Message server or logger not properly initialised." << endl;
228 if (server.is_valid()) server.reset(NULL);
234 if (logger.is_valid()) logger.reset(NULL);
239 return CHSM::machine::exit();
283 return Main.RunControl.Operational.Running.active();
298 eventTable.replace(oldTag, newTag, event);
311 JEventTable::const_iterator i = eventTable.find(tag, event_name);
313 if (i != eventTable.end())
343 parser[option] =
make_field(parameter) = value;
354 return clock.getDelay();
376 return clock.getInterval();
387 clock.setInterval(interval_us);
407 setSelect(select.getReaderMask());
409 select.setReaderMask(*server);
456 int level = this->logger.getLevel();
458 properties[
"debug"] = level;
460 properties.
read(
string(buffer, length));
462 this->logger.setLevel(level);
477 virtual bool filter(
const std::string& tag,
int length,
const char* buffer)
503 if (select(
JTimeval(TIMEOUT_S,0)) > 0) {
505 if (select.hasReaderMask(*server)) {
509 actionSelect(select.getReaderMask());
517 if (isRunning() && clock.getInterval() != 0LL) {
519 long long int numberOfCalls = 0;
529 if (clock.wait(select.getReaderMask())) {
531 if (select.hasReaderMask(*server)) {
535 actionSelect(select.getReaderMask());
542 catch(
const exception& error) {
543 logger.error(error.what());
547 }
while (isRunning());
549 if (numberOfCalls != 0) {
550 JNoticeStream(logger) <<
"Delay per call " << clock.getDelay() / numberOfCalls / 1000 <<
" ms";
554 catch(
const exception& error) {
555 JErrorStream(logger) <<
"method run(): " << error.what();
587 const int length = prefix.
getSize();
589 char* buffer =
new char[length];
596 enter(
JArgs(std::string(buffer, length)));
618 void run(std::istream& in)
625 while (in >> tag &&
getline(in, buffer,
';')) {
626 update(tag, buffer.length(), buffer.data());
631 static const int TIMEOUT_S = 1;
647 server->WaitHead(prefix);
649 const int length = prefix.
getSize();
651 char* buffer =
new char[length];
653 server->GetFullData(buffer, length);
655 if (!filter(prefix.
toString(), length, buffer)) {
656 update(prefix.
toString(), length, buffer);
673 using namespace JLANG;
675 string::size_type pos = 0;
677 while (pos != (string::size_type) length &&
TOKEN_DELIMETER.find(*(buffer + pos)) == string::npos) {
685 event_number =
event.getNumber();
686 event_name = event_name.
trim();
688 while (pos != (string::size_type) length &&
TOKEN_DELIMETER.find(*(buffer + pos)) != string::npos) {
693 JEventTable::const_iterator i = eventTable.find(tag, event_name);
695 if (i != eventTable.end()) {
709 (*(i->second))(length - pos, buffer + pos);
726 using namespace JNET;
735 eventTable.insert(*tag, ev_init);
736 eventTable.insert(*tag, ev_configure);
737 eventTable.insert(*tag, ev_start);
738 eventTable.insert(*tag, ev_pause);
739 eventTable.insert(*tag, ev_continue);
740 eventTable.insert(*tag, ev_stop);
741 eventTable.insert(*tag, ev_reset);
742 eventTable.insert(*tag, ev_quit);
743 eventTable.insert(*tag, ev_off);
745 eventTable.insert(*tag, ev_check);
746 eventTable.insert(*tag, ev_input);
748 eventTable.insert(*tag, ev_recover);
753 setClockInterval(TIMEOUT_S * 1000000LL);
765 const CHSM::event&
event)
767 std::ostringstream os;
771 <<
JEvent_t(event.name(), event_number)
775 server->PutFullString(
RC_REPLY, os.str());
787 if (Main.RunControl.Error.active()) {
789 enterState(Main.RunControl.Error, ev_check);
793 for (CHSM::parent::iterator state = Main.RunControl.Operational.begin(); state != Main.RunControl.Operational.end(); ++state) {
795 if (state->active()) {
799 enterState(*state, ev_check);
812 void execute(action __action,
const CHSM::event& __event)
816 const JDAQStateMachine::ev_daq_event&
event =
dynamic_cast<const JDAQStateMachine::ev_daq_event&
>(__event);
818 (this->*__action)(
event->length,
event->buffer);
820 catch(
const std::exception& error) {
821 logger.
error(error.what());
822 logger.
error(
"Trigger ev_error.");
JParser parser
parser method enter()
Utility class to parse command line options.
JNET::JSubscriptionList getSubscription(const JEventTable &event_table)
Convert event table to ControlHost subscription.
bool read(const JEquation &equation)
Read equation.
Wrapper class around STL string class.
Message logging based on std::ostream.
virtual void setSelect(JFileDescriptorMask &mask) const
Set the file descriptor mask for the select call.
int Connected()
Send version.
JTag getUniqueTag(const std::string &hostname, const std::string &name)
Get unique tag of run control client.
JSelectReader select
select call
Message reporting compatible with STL output stream operations.
Interface for logging messages.
Message logging based on ControlHost.
Utility class to parse parameter values.
void setClockInterval(const long long int interval_us)
Set interval time.
JDAQClient(const std::string &name)
Constructor.
Structure to store the ToT mean and standard deviation of the hits produced by a nanobeacon in a sour...
Simple data structure to support I/O of equations (see class JLANG::JEquation).
void configure()
Configure client.
JSharedPointer< JControlHost > server
message server
static const std::string TOKEN_DELIMETER
void execute(action __action, const CHSM::event &__event)
The method to execute the action.
JTimekeeper clock
central clock
void run()
Run as run control client following command messages via JNET::JControlHost.
int getSize() const
Get size.
Utility class to parse parameter values.
static std::string getKey(const JNET::JTag &tag, const CHSM::event &event)
Get key for a given tag and event.
static JEvent_t toValue(const std::string &buffer)
Convert string to event.
Auxiliary class for time values.
void run(const int port)
Run for ever.
long long int getClockDelay() const
Get total delay time.
virtual bool filter(const std::string &tag, int length, const char *buffer)
Filter message.
std::string getStateName(const std::string &name)
Get name of state.
int event_number
number of last event
Scheduling of actions via fixed latency intervals.
The template JSharedPointer class can be used to share a pointer to an object.
This class can be used to temporarily redirect one output (input) stream to another output (input) st...
static const JNET::JTag RC_REPLY
const JNET::JTag & getUniqueTag() const
Get unique tag of this run control client.
#define make_field(A,...)
macro to convert parameter to JParserTemplateElement object
JString & trim()
Trim string.
void enterState(const CHSM::state &state, const CHSM::event &event)
Action when entering state.
virtual bool enter()
Enter the state machine.
virtual void actionRunning()
This method is repeatedly called when this client machine is in state Running and the clock interval ...
Auxiliary class for method select.
Wrapper class for select call.
The JAbstractFile class encapsulates the c-style file descriptor.
std::istream & getline(std::istream &in, JString &object)
Read string from input stream until end of line.
static const JTag DISPTAG_UNDEFINED(0)
Auxiliary class for handling event name and optional number.
Exception for ControlHost.
virtual bool exit()
Exit the state machine.
Data structure to store command line arguments.
char getTokenDelimeter()
Get the token delimeter for command messages.
bool isRunning() const
Check if this client is in runnig state.
JControlHost * AcceptClient(JTimeval timeout=JTimeval::max())
Accept new client.
std::string getHostname()
Get host name.
void update()
Update state machine.
int WaitHead(JPrefix &prefix)
Wait for header.
void addParameter(const char option, T ¶meter, const T &value)
Add parameter to parser used in method enter().
void addParameter(const char option, T ¶meter)
Add parameter to parser used in method enter().
virtual void actionInput(int length, const char *buffer)
This method is called at ev_input.
std::string toString() const
Convert tag to string.
General purpose message reporting.
Run control client base class.
Utility class to parse command line options.
int getEventNumber() const
Get last event number.
JEventTable eventTable
event table
void run(std::istream &in)
Run client with commands from input stream (e.g for debugging).
virtual bool enter(const JArgs &args)
Enter the state machine.
JDAQClient(const std::string &name, const std::string &server, JLogger *logger, const int level)
Constructor.
const char * getName()
Get ROOT name of given data type.
void resetClock()
Reset clock.
JMessageLogger logger
message logger
void replaceEvent(const JNET::JTag &oldTag, const JNET::JTag &newTag, JDAQEvent_t &event)
Replace tag of given event in event table.
static const JNET::JTag RC_CMD
void update(const JNET::JTag &tag, int length, const char *buffer)
Update state machine.
JDAQStateMachine::ev_daq_event JDAQEvent_t
Type definition of a DAQ event.
const std::string & getFullName() const
Get full name of this run control client.
std::string getFullName(const std::string &hostname, const std::string &name)
Get full name of run control client.
void error(const JMessage_t &message)
static JNullStream null
Null I/O stream.
void setSelect()
Set the file descriptor mask for the select call.
long long int getClockInterval() const
Get interval time.
Hostname and IP address functions.
virtual void actionSelect(const JFileDescriptorMask &mask)
Action method following last select call.
JDAQEvent_t * findEvent(const JNET::JTag &tag, const std::string &event_name)
Find event in event table.
virtual void actionCheck(int length, const char *buffer)
This method is called at ev_check and reports a system check by mimicing an enter state action...
static void Throw(const bool option)
Enable/disable throw option.
int GetFullData(void *buffer, int length)
Receive data.
const std::string & getHostname() const
Get hostname.
Light-weight wrapper class around server socket.
int PutFullData(const JTag &tag, const void *buffer, const int length)
Send data.