47 printf(
"TMFE::ctor!\n");
53 printf(
"TMFE::dtor!\n");
54 assert(!
"TMFE::~TMFE(): destruction of the TMFE singleton is not permitted!");
78 std::string env_hostname;
79 std::string env_exptname;
88 if (hostname && hostname[0]) {
94 if (exptname && exptname[0]) {
157 printf(
"TMFE::Disconnect: Disconnecting from experiment \"%s\" on host \"%s\"\n",
fExptname.c_str(),
fMserverHostname.c_str());
161 printf(
"TMFE::Disconnect: Disconnected from experiment \"%s\" on host \"%s\"\n",
fExptname.c_str(),
fMserverHostname.c_str());
203 uint32_t buf_size = 0;
207 fMfe->
fOdbRoot->RU32((std::string(
"Experiment/Buffer Sizes/") + bufname).c_str(), &buf_size);
211 uint32_t xmax_event_size = buf_size / 2;
213 if (xmax_event_size > 1024)
214 xmax_event_size -= 1024;
263 return TMFeMidasError(
msprintf(
"Cannot set event buffer \"%s\" cache sizes: read %d, write %d",
fBufName.c_str(), (
int)read_cache_size, (
int)write_cache_size),
"bm_set_cache_size",
status);
278 int sampling_type = 0;
280 if (strcmp(sampling_type_string,
"GET_ALL")==0) {
282 }
else if (strcmp(sampling_type_string,
"GET_NONBLOCKING")==0) {
284 }
else if (strcmp(sampling_type_string,
"GET_RECENT")==0) {
349 const char* sg_ptr[sg_n];
351 for (
int i=0;
i<sg_n;
i++) {
352 sg_ptr[
i] =
e[
i].data();
353 sg_len[
i] =
e[
i].size();
363 fMfe->
Msg(
MERROR,
"TMEventBuffer::SendEvent",
"Cannot send event to buffer \"%s\": bm_send_event() returned %d, event buffer is corrupted, shutting down the frontend",
fBufName.c_str(),
status);
365 return TMFeMidasError(
"Cannot send event, event buffer is corrupted, shutting down the frontend",
"bm_send_event",
status);
367 fMfe->
Msg(
MERROR,
"TMEventBuffer::SendEvent",
"Cannot send event to buffer \"%s\": bm_send_event() returned %d",
fBufName.c_str(),
status);
415 assert(pbuf != NULL);
416 assert(bufname != NULL);
424 if (b->fBufName == bufname) {
426 if (bufsize != 0 && bufsize > b->fBufSize) {
427 Msg(
MERROR,
"TMFE::EventBufferOpen",
"Event buffer \"%s\" size %d is smaller than requested size %d", b->fBufName.c_str(), (
int)b->fBufSize, (
int)bufsize);
511 double next_periodic = now + 60;
514 for (
int i=0;
i<
n;
i++) {
518 if (!
eq->fEqConfEnabled)
520 if (!
eq->fEqConfEnablePeriodic)
525 if (
eq->fEqPeriodicNextCallTime == 0)
526 eq->fEqPeriodicNextCallTime = now + 0.5;
528 if (now >=
eq->fEqPeriodicNextCallTime) {
529 eq->fEqPeriodicNextCallTime += period;
531 if (
eq->fEqPeriodicNextCallTime < now) {
533 printf(
"TMFE::EquipmentPeriodicTasks: periodic equipment \"%s\" skipped some beats!\n",
eq->fEqName.c_str());
534 fMfe->
Msg(
MERROR,
"TMFE::EquipmentPeriodicTasks",
"Equipment \"%s\" skipped some beats!",
eq->fEqName.c_str());
535 while (
eq->fEqPeriodicNextCallTime < now) {
536 eq->fEqPeriodicNextCallTime += period;
541 eq->fEqPeriodicLastCallTime = now;
543 eq->HandlePeriodic();
549 if (
eq->fEqPeriodicNextCallTime < next_periodic)
550 next_periodic =
eq->fEqPeriodicNextCallTime;
559 if (!
eq->fEqConfEnabled)
561 double next =
eq->fEqStatNextWrite;
563 eq->EqWriteStatistics();
564 next =
eq->fEqStatNextWrite;
566 if (next < next_periodic)
567 next_periodic = next;
580 return next_periodic;
587 double poll_sleep_sec = 9999.0;
589 bool poll_again =
false;
594 if (!
eq->fEqConfEnabled)
596 if (
eq->fEqConfEnablePoll && !
eq->fEqPollThreadRunning && !
eq->fEqPollThreadStarting) {
598 if (
eq->fEqConfPollSleepSec < poll_sleep_sec)
599 poll_sleep_sec =
eq->fEqConfPollSleepSec;
600 bool poll =
eq->HandlePoll();
603 eq->HandlePollRead();
611 if (next_periodic_time) {
613 double now = TMFE::TMFE::GetTime();
614 if (now >= next_periodic_time)
618 return poll_sleep_sec;
624 printf(
"TMFeEquipment::EqPollThread: equipment \"%s\" poll thread started\n",
fEqName.c_str());
643 printf(
"TMFeEquipment::EqPollThread: equipment \"%s\" poll thread stopped\n",
fEqName.c_str());
652 std::lock_guard<std::mutex> guard(
fEqMutex);
655 fMfe->
Msg(
MERROR,
"TMFeEquipment::EqStartPollThread",
"Equipment \"%s\": poll thread is already running",
fEqName.c_str());
670 for (
int i=0;
i<100;
i++) {
672 std::lock_guard<std::mutex> guard(
fEqMutex);
683 fMfe->
Msg(
MERROR,
"TMFeEquipment::EqStopPollThread",
"Equipment \"%s\": timeout waiting for shutdown of poll thread",
fEqName.c_str());
693 Msg(
MERROR,
"TMFE::StopRun",
"Cannot stop run, error: %s",
str);
700 bool logger_auto_restart =
false;
701 fOdbRoot->RB(
"Logger/Auto restart", &logger_auto_restart);
703 int logger_auto_restart_delay = 0;
704 fOdbRoot->RI(
"Logger/Auto restart delay", &logger_auto_restart_delay);
706 if (logger_auto_restart) {
707 Msg(
MINFO,
"TMFE::StopRun",
"Run will restart after %d seconds", logger_auto_restart_delay);
723 Msg(
MERROR,
"TMFE::StartRun",
"Run start requested, but run is already in progress");
727 bool logger_auto_restart =
false;
728 fOdbRoot->RB(
"Logger/Auto restart", &logger_auto_restart);
730 if (!logger_auto_restart) {
731 Msg(
MERROR,
"TMFE::StartRun",
"Run start requested, but logger/auto restart is off");
735 Msg(
MTALK,
"TMFE::StartRun",
"Starting new run");
741 Msg(
MERROR,
"TMFE::StartRun",
"Cannot restart run, error: %s",
str);
747 assert(sleep_sec >= 0);
750 double sleep_start = now;
751 double sleep_end = now + sleep_sec;
752 int count_yield_loops = 0;
755 double next_periodic_time = 0;
756 double poll_sleep = 1.0;
777 double sleep_time = sleep_end - now;
779 if (next_periodic_time > 0 && next_periodic_time < sleep_end) {
780 sleep_time = next_periodic_time - now;
785 s = 1 + sleep_time*1000.0;
787 if (poll_sleep*1000.0 < s) {
792 printf(
"now %.6f, sleep_end %.6f, next_periodic %.6f, sleep_time %.6f, cm_yield(%d), poll period %.6f\n", now, sleep_end, next_periodic_time, sleep_time, s, poll_sleep);
800 fprintf(stderr,
"TMFE::PollMidas: cm_yield(%d) status %d, shutdown requested...\n", s,
status);
805 double sleep_more = sleep_end - now;
811 if (poll_sleep < sleep_more) {
817 printf(
"TMFE::PollMidas: sleep %.1f msec, actual %.1f msec, %d loops\n", sleep_sec * 1000.0, (now - sleep_start) * 1000.0, count_yield_loops);
825 double sleep_end = now + sleep_sec;
830 double sleep_time = sleep_end - now;
833 s = 1 + sleep_time*1000.0;
841 fprintf(stderr,
"TMFE::Yield: cm_yield(%d) status %d, shutdown requested...\n", s,
status);
845 if (now >= sleep_end)
860 printf(
"TMFE::RpcThread: RPC thread started\n");
874 printf(
"TMFE::RpcThread: cm_yield(%d) status %d, shutdown requested...\n", msec,
status);
879 printf(
"TMFE::RpcThread: RPC thread stopped\n");
886 printf(
"TMFE::PeriodicThread: periodic thread started\n");
892 double sleep = next_periodic_time - now;
899 printf(
"TMFE::PeriodicThread: periodic thread stopped\n");
907 std::lock_guard<std::mutex> guard(
fMutex);
911 printf(
"TMFE::StartRpcThread: RPC thread already running\n");
923 std::lock_guard<std::mutex> guard(
fFeMutex);
927 printf(
"TMFE::StartPeriodicThread: periodic thread already running\n");
942 for (
int i=0;
i<60;
i++) {
944 std::lock_guard<std::mutex> guard(
fMutex);
950 printf(
"TMFE::StopRpcThread: RPC thread stopped\n");
955 fprintf(stderr,
"TMFE::StopRpcThread: waiting for RPC thread to stop\n");
960 fprintf(stderr,
"TMFE::StopRpcThread: timeout waiting for RPC thread to stop\n");
970 for (
int i=0;
i<60;
i++) {
972 std::lock_guard<std::mutex> guard(
fFeMutex);
978 printf(
"TMFE::StopPeriodicThread: periodic thread stopped\n");
983 fprintf(stderr,
"TMFE::StopPeriodicThread: waiting for periodic thread to stop\n");
988 fprintf(stderr,
"TMFE::StopPeriodicThread: timeout waiting for periodic thread to stop\n");
991void TMFE::Msg(
int message_type,
const char *filename,
int line,
const char *routine,
const char *format, ...)
996 va_start(ap, format);
1000 cm_msg(message_type, filename, line, routine,
"%s",
message);
1004void TMFE::Msg(
int message_type,
const char *filename,
int line,
const char *routine,
const std::string&
message)
1007 cm_msg(message_type, filename, line, routine,
"%s",
message.c_str());
1015 return tv.tv_sec*1.0 +
tv.tv_usec/1000000.0;
1026 if (time_sec == 0) {
1031 if (time_sec > 1.01) {
1035 double tend = t0 + time_sec;
1044 double tsleep = tend - now;
1058 struct timeval timeout;
1060 timeout.tv_sec = time_sec;
1061 timeout.tv_usec = (time_sec-timeout.tv_sec)*1000000.0;
1064 status = select(0, NULL, NULL, NULL, &timeout);
1066 if (
status < 0 && errno == EINVAL) {
1068 TMFE::Instance()->
Msg(
MERROR,
"TMFE::Sleep",
"TMFE::Sleep() called with invalid sleep time: %f, tv_sec: %lld, tv_usec: %lld", time_sec, (
long long int)timeout.tv_sec, (
long long int)timeout.tv_usec);
1073 if (
status < 0 && errno == EINTR) {
1096 struct timespec rqtp;
1097 struct timespec rmtp;
1100 rqtp.tv_nsec = (time-rqtp.tv_sec)*1000000000.0;
1102 int status = nanosleep(&rqtp, &rmtp);
1119 struct timespec rqtp;
1120 struct timespec rmtp;
1123 rqtp.tv_nsec = (time-rqtp.tv_sec)*1000000000.0;
1126 int status = clock_nanosleep(CLOCK_MONOTONIC, 0, &rqtp, &rmtp);
1148 const char* args =
CSTRING(1);
1149 char* return_buf =
CSTRING(2);
1150 int return_max_length =
CINT(3);
1153 printf(
"TMFE::rpc_callback: index %d, max_length %d, cmd [%s], args [%s]\n",
index, return_max_length, cmd, args);
1162 std::string result =
"";
1164 if (result.length() > 0) {
1166 mstrlcpy(return_buf, result.c_str(), return_max_length);
1178 const char* args =
CSTRING(1);
1184 printf(
"TMFE::rpc_cxx_callback: index %d, cmd [%s], args [%s]\n",
index, cmd, args);
1194 if (pstr->length() > 0) {
1206 const char* args =
CSTRING(1);
1207 char* return_buf =
CSTRING(2);
1208 size_t return_max_length =
CINT(3);
1211 printf(
"TMFE::binary_rpc_callback: index %d, max_length %zu, cmd [%s], args [%s]\n",
index, return_max_length, cmd, args);
1220 std::vector<char> result;
1222 if (result.size() > 0) {
1223 if (result.size() > return_max_length) {
1224 TMFE::Instance()->
Msg(
MERROR,
"TMFE::binary_rpc_callback",
"RPC handler returned too much data, %zu bytes truncated to %zu bytes", result.size(), return_max_length);
1225 result.resize(return_max_length);
1228 assert(result.size() <= return_max_length);
1229 memcpy(return_buf, result.data(), result.size());
1230 CINT(3) = result.size();
1243 const char* args =
CSTRING(1);
1247 printf(
"TMFE::binary_rpc_callback: index %d, cmd [%s], args [%s]\n",
index, cmd, args);
1259 if (pbuf->size() > 0) {
1276 printf(
"TMFrontendRpcHelper::ctor!\n");
1284 printf(
"TMFrontendRpcHelper::dtor!\n");
1293 printf(
"TMFrontendRpcHelper::HandleBeginRun!\n");
1299 if (!
eq->fEqConfEnabled)
1301 eq->EqZeroStatistics();
1302 eq->EqWriteStatistics();
1310 printf(
"TMFrontendRpcHelper::HandleEndRun!\n");
1316 if (!
eq->fEqConfEnabled)
1318 eq->EqWriteStatistics();
1333 printf(
"TMFE::tr_start!\n");
1372 printf(
"TMFE::tr_stop!\n");
1441 printf(
"TMFE::tr_resume!\n");
1474 printf(
"TMFE::tr_startabort!\n");
1570 printf(
"TMFE::RegisterRPCs!\n");
1666 fprintf(stderr,
"TMFE::AddEquipment: Fatal error: Equipment \"%s\" is already registered, bye...\n",
fFeEquipments[
i]->fEqName.c_str());
1672 fprintf(stderr,
"TMFE::AddEquipment: Fatal error: Duplicate equipment name \"%s\", bye...\n",
eq->fEqName.c_str());
1706 assert(program_name != NULL);
1712 assert(eqname != NULL);
1713 assert(eqfilename != NULL);
1716 printf(
"TMFeEquipment::ctor: equipment name [%s] file [%s]\n", eqname, eqfilename);
1727 printf(
"TMFeEquipment::dtor: equipment name [%s]\n",
fEqName.c_str());
1779 printf(
"TMFeEquipment::EqReadCommon: for [%s]\n",
fEqName.c_str());
1822 printf(
"TMFeEquipment::EqWriteCommon: for [%s]\n",
fEqName.c_str());
1863 printf(
"TMFeEquipment::PreInit: for [%s]\n",
fEqName.c_str());
1869 if (
fEqName.find(
"%") != std::string::npos) {
1885 printf(
"TMFeEquipment::PreInit: creating ODB common\n");
1913 printf(
"TMFeEquipment::EqPostInit: for [%s]\n",
fEqName.c_str());
1922 fMfe->
fOdbRoot->RU32(
"Experiment/MAX_EVENT_SIZE", &odb_max_event_size,
true);
1927 fMfe->
Msg(
MERROR,
"TMFeEquipment::EqPostInit",
"Equipment \"%s\" requested event size %d is bigger than ODB MAX_EVENT_SIZE %d",
fEqName.c_str(), (
int)
fEqConfMaxEventSize, odb_max_event_size);
1987 printf(
"TMFeEquipment::EqZeroStatistics: zero statistics for [%s]\n",
fEqName.c_str());
2012 printf(
"TMFeEquipment::EqWriteStatistics: write statistics for [%s]\n",
fEqName.c_str());
2065 std::lock_guard<std::mutex> guard(
fEqMutex);
2104 std::lock_guard<std::mutex> guard(
fEqMutex);
2142 std::lock_guard<std::mutex> guard(
fEqMutex);
2156 for (
auto v: event) {
2182 std::lock_guard<std::mutex> guard(
fEqMutex);
2196 for (
int i=0;
i<sg_n;
i++) {
2222 std::lock_guard<std::mutex> guard(
fEqMutex);
2228 std::string path =
"";
2229 path +=
"/Equipment/";
2231 path +=
"/Variables";
2309 fprintf(stderr,
"\n");
2310 fprintf(stderr,
"Usage: %s args... [-- equipment args...]\n", argv0);
2311 fprintf(stderr,
"\n");
2312 fprintf(stderr,
" --help -- print this help message\n");
2313 fprintf(stderr,
" -h -- print this help message\n");
2314 fprintf(stderr,
" -v -- report all activities\n");
2315 fprintf(stderr,
"\n");
2316 fprintf(stderr,
" -h hostname[:tcpport] -- connect to MIDAS mserver on given host and tcp port number\n");
2317 fprintf(stderr,
" -e exptname -- connect to given MIDAS experiment\n");
2318 fprintf(stderr,
"\n");
2319 fprintf(stderr,
" -D -- Become a daemon\n");
2320 fprintf(stderr,
" -O -- Become a daemon but keep stdout for saving in a log file: frontend -O >file.log 2>&1\n");
2321 fprintf(stderr,
"\n");
2322 fprintf(stderr,
" -i NNN -- Set frontend index number\n");
2323 fprintf(stderr,
"\n");
2329 fprintf(stderr,
"Usage of equipment \"%s\":\n",
fFeEquipments[
i]->fEqName.c_str());
2330 fprintf(stderr,
"\n");
2332 fprintf(stderr,
"\n");
2338 std::vector<std::string> args;
2339 for (
int i=0;
i<argc;
i++) {
2340 args.push_back(argv[
i]);
2348 setbuf(stdout, NULL);
2349 setbuf(stderr, NULL);
2351 signal(SIGPIPE, SIG_IGN);
2353 std::vector<std::string> eq_args;
2356 std::string exptname;
2357 std::string hostname;
2358 bool daemon0 =
false;
2359 bool daemon1 =
false;
2361 for (
unsigned int i=1;
i<args.size();
i++) {
2363 if (args[
i] ==
"--") {
2365 for (
unsigned j=
i+1;
j<args.size();
j++)
2366 eq_args.push_back(args[
j]);
2368 }
else if (args[
i] ==
"-v") {
2370 }
else if (args[
i] ==
"-D") {
2372 }
else if (args[
i] ==
"-O") {
2374 }
else if (args[
i] ==
"-h") {
2376 if (
i >= args.size()) {
help =
true;
break; }
2378 }
else if (args[
i] ==
"-e") {
2380 if (
i >= args.size()) {
help =
true;
break; }
2382 }
else if (args[
i] ==
"-i") {
2384 if (
i >= args.size()) {
help =
true;
break; }
2386 }
else if (args[
i] ==
"--help") {
2389 }
else if (args[
i][0] ==
'-') {
2403 printf(
"Becoming a daemon...\n");
2405 }
else if (daemon1) {
2406 printf(
"Becoming a daemon...\n");
2426 fprintf(stderr,
"Fatal error: arguments handler error: %s, bye.\n", r.
error_message.c_str());
2438 r =
fMfe->
Connect(NULL, hostname.c_str(), exptname.c_str());
2441 fprintf(stderr,
"Fatal error: cannot connect to MIDAS, error: %s, bye.\n", r.
error_message.c_str());
2449 fprintf(stderr,
"Fatal error: frontend init error: %s, bye.\n", r.
error_message.c_str());
2467 fprintf(stderr,
"Cannot initialize equipments, error message: %s, bye.\n", r.
error_message.c_str());
2475 fprintf(stderr,
"Fatal error: frontend post-init error: %s, bye.\n", r.
error_message.c_str());
2482 fprintf(stderr,
"Fatal error: Cannot start frontend, run is in progress!\n");
2516 fprintf(stderr,
"Fatal error: frontend init error: %s, bye.\n", r.
error_message.c_str());
std::vector< int > fBufRequests
TMFeResult SetCacheSize(size_t read_cache_size, size_t write_cache_size)
TMFeResult OpenBuffer(const char *bufname, size_t bufsize=0)
TMFeResult AddRequest(int event_id, int trigger_mask, const char *sampling_type_string)
TMFeResult ReceiveEvent(std::vector< char > *e, int timeout_msec=0)
TMFeResult FlushCache(bool wait=true)
size_t fBufWriteCacheSize
TMFeResult SendEvent(const char *e)
TMFeResult TriggerAlarm(const char *name, const char *message, const char *aclass)
TMFeResult EventBufferCloseAll()
bool fRunStopRequested
run stop was requested by equipment
void DeregisterTransitionStartAbort()
std::vector< TMEventBuffer * > fEventBuffers
std::atomic_bool fRpcThreadStarting
static std::string GetThreadId()
return identification of this thread
bool fStateRunning
run state is running or paused
void DeregisterTransitionResume()
std::mutex fEventBuffersMutex
TMFE()
default constructor is private for singleton classes
static double GetTime()
return current time in seconds, with micro-second precision
void MidasPeriodicTasks()
void AddRpcHandler(TMFeRpcHandlerInterface *)
int fDB
ODB database handle.
virtual ~TMFE()
destructor is private for singleton classes
void DeregisterTransitionPause()
void SetTransitionSequenceResume(int seqno)
double fRunStartTime
start a new run at this time
std::string fMserverHostname
hostname where the mserver is running, blank if using shared memory
void SetTransitionSequenceStop(int seqno)
void Yield(double sleep_sec)
void Msg(int message_type, const char *filename, int line, const char *routine, const char *format,...) MATTRPRINTF(6
void DeregisterTransitionStop()
TMFeResult Connect(const char *progname=NULL, const char *hostname=NULL, const char *exptname=NULL)
std::atomic_bool fRpcThreadShutdownRequested
void SetTransitionSequenceStartAbort(int seqno)
static void Sleep(double sleep_time_sec)
sleep, with micro-second precision
void SetTransitionSequencePause(int seqno)
std::atomic_bool fShutdownRequested
shutdown was requested by Ctrl-C or by RPC command
std::atomic_bool fRpcThreadRunning
TMFeResult SetWatchdogSec(int sec)
void RegisterTransitionStartAbort()
TMFeResult ResetAlarm(const char *name)
TMFeResult EventBufferFlushCacheAll(bool wait=true)
std::string fHostname
hostname we are running on
MVOdb * fOdbRoot
ODB root.
std::vector< TMFeRpcHandlerInterface * > fRpcHandlers
std::string fProgramName
frontend program name
void DeregisterTransitionStart()
void RemoveRpcHandler(TMFeRpcHandlerInterface *)
void DeregisterTransitions()
int fRunNumber
current run number
void SetTransitionSequenceStart(int seqno)
TMFeResult EventBufferOpen(TMEventBuffer **pbuf, const char *bufname, size_t bufsize=0)
std::string fExptname
experiment name, blank if only one experiment defined in exptab
void * BkOpen(char *pevent, const char *bank_name, int bank_type) const
TMFeResult EqWriteEventToOdb_locked(const char *pevent)
TMFeResult BkInit(char *pevent, size_t size) const
uint16_t fEqConfTriggerMask
virtual void HandlePollRead()
MVOdb * fOdbEqSettings
ODB Equipment/EQNAME/Settings.
std::atomic_bool fEqPollThreadShutdownRequested
int fEqConfWriteCacheSize
TMFeResult EqSetStatus(const char *status, const char *color)
bool fEqConfWriteEventsToOdb
virtual bool HandlePoll()
TMFeResult EqWriteCommon(bool create=false)
Write TMFeEqInfo to ODB /Equipment/NAME/Common.
TMFeResult EqReadCommon()
Read TMFeEqInfo from ODB /Equipment/NAME/Common.
double fEqConfPollSleepSec
TMFeResult EqWriteStatistics()
MVOdb * fOdbEqVariables
ODB Equipment/EQNAME/Variables.
int fEqConfPeriodMilliSec
TMFeResult EqInit(const std::vector< std::string > &args)
Initialize equipment.
double fEqConfPeriodStatisticsSec
TMEventBuffer * fEqEventBuffer
virtual TMFeResult HandleInit(const std::vector< std::string > &args)
TMFeResult EqZeroStatistics()
std::thread * fEqPollThread
std::atomic_bool fEqPollThreadRunning
TMFeResult EqPreInit()
Initialize equipment, before EquipmentBase::Init()
uint32_t fEqConfNumSubEvents
TMFeResult BkClose(char *pevent, void *ptr) const
std::string fEqConfFormat
TMFeResult ComposeEvent(char *pevent, size_t size) const
MVOdb * fOdbEqCommon
ODB Equipment/EQNAME/Common.
MVOdb * fOdbEq
ODB Equipment/EQNAME.
std::atomic_bool fEqPollThreadStarting
TMFeResult EqSendEvent(const char *pevent, bool write_to_odb=true)
bool fEqConfReadConfigFromOdb
TMFeResult EqWriteEventToOdb(const char *pevent)
int BkSize(const char *pevent) const
std::string fEqConfBuffer
size_t fEqConfMaxEventSize
MVOdb * fOdbEqStatistics
ODB Equipment/EQNAME/Statistics.
TMFeResult EqPostInit()
Initialize equipment, after EquipmentBase::Init()
bool fEqConfReadOnlyWhenRunning
std::string error_message
virtual TMFeResult HandleEndRun(int run_number)
virtual TMFeResult HandleResumeRun(int run_number)
virtual TMFeResult HandlePauseRun(int run_number)
virtual TMFeResult HandleRpc(const char *cmd, const char *args, std::string &result)
virtual TMFeResult HandleBeginRun(int run_number)
virtual TMFeResult HandleStartAbortRun(int run_number)
virtual TMFeResult HandleBinaryRpc(const char *cmd, const char *args, std::vector< char > &result)
double fFeFlushWriteCacheNextCallTime
bool fFeIfRunningCallBeginRun
std::thread * fFePeriodicThread
std::atomic_bool fFePeriodicThreadRunning
double fFeFlushWriteCachePeriodSec
void FeDeleteEquipments()
void FePollMidas(double sleep_sec)
TMFeResult FeInitEquipments(const std::vector< std::string > &args)
virtual void HandleFrontendExit()
void FeSetName(const char *program_name)
void FeStopEquipmentPollThreads()
std::vector< TMFeEquipment * > fFeEquipments
void FeUsage(const char *argv0)
TMFeResult FeInit(const std::vector< std::string > &args)
TMFeResult FeAddEquipment(TMFeEquipment *eq)
virtual TMFeResult HandleArguments(const std::vector< std::string > &args)
std::atomic_bool fFePeriodicThreadShutdownRequested
void FeStartPeriodicThread()
virtual TMFeResult HandleFrontendInit(const std::vector< std::string > &args)
bool fFeIfRunningCallExit
virtual TMFeResult HandleFrontendReady(const std::vector< std::string > &args)
double FePollTasks(double next_periodic_time)
TMFeResult FeRemoveEquipment(TMFeEquipment *eq)
void FeStopPeriodicThread()
int FeMain(int argc, char *argv[])
TMFrontendRpcHelper * fFeRpcHelper
std::atomic_bool fFePeriodicThreadStarting
virtual void HandleUsage()
TMFeResult HandleBeginRun(int run_number)
TMFrontendRpcHelper(TMFrontend *fe)
virtual ~TMFrontendRpcHelper()
TMFeResult HandleEndRun(int run_number)
INT al_reset_alarm(const char *alarm_name)
INT al_trigger_alarm(const char *alarm_name, const char *alarm_message, const char *default_class, const char *cond_str, INT type)
void bk_init32a(void *event)
INT bk_close(void *event, void *pdata)
void bk_create(void *event, const char *name, WORD type, void **pdata)
INT bk_size(const void *event)
INT bm_open_buffer(const char *buffer_name, INT buffer_size, INT *buffer_handle)
INT bm_receive_event_vec(INT buffer_handle, std::vector< char > *pvec, int timeout_msec)
INT bm_request_event(HNDLE buffer_handle, short int event_id, short int trigger_mask, INT sampling_type, HNDLE *request_id, EVENT_HANDLER *func)
INT bm_set_cache_size(INT buffer_handle, size_t read_size, size_t write_size)
INT bm_close_buffer(INT buffer_handle)
int bm_send_event_sg(int buffer_handle, int sg_n, const char *const sg_ptr[], const size_t sg_len[], int timeout_msec)
INT bm_flush_cache(int buffer_handle, int timeout_msec)
INT cm_register_transition(INT transition, INT(*func)(INT, char *), INT sequence_number)
INT cm_yield(INT millisec)
INT cm_get_experiment_database(HNDLE *hDB, HNDLE *hKeyClient)
INT cm_transition(INT transition, INT run_number, char *errstr, INT errstr_size, INT async_flag, INT debug_flag)
INT cm_register_function(INT id, INT(*func)(INT, void **))
INT cm_connect_experiment1(const char *host_name, const char *default_exp_name, const char *client_name, void(*func)(char *), INT odb_size, DWORD watchdog_timeout)
INT cm_disconnect_experiment(void)
INT cm_get_environment(char *host_name, int host_name_size, char *exp_name, int exp_name_size)
INT cm_deregister_transition(INT transition)
INT cm_set_transition_sequence(INT transition, INT sequence_number)
INT cm_set_watchdog_params(BOOL call_watchdog, DWORD timeout)
std::string ss_gethostname()
INT ss_suspend_set_rpc_thread(midas_thread_t thread_id)
std::string ss_tid_to_string(midas_thread_t thread_id)
INT ss_daemon_init(BOOL keep_stdout)
midas_thread_t ss_gettid(void)
INT cm_msg_flush_buffer()
INT cm_msg(INT message_type, const char *filename, INT line, const char *routine, const char *format,...)
INT db_find_key(HNDLE hDB, HNDLE hKey, const char *key_name, HNDLE *subhKey)
INT tr_stop(INT rn, char *error)
INT tr_start(INT rn, char *error)
INT tr_pause(INT rn, char *error)
BOOL debug
debug printouts
INT tr_resume(INT rn, char *error)
std::string msprintf(const char *format,...)
int cm_write_event_to_odb(HNDLE hDB, HNDLE hKey, const EVENT_HEADER *pevent, INT format)
#define DEFAULT_WATCHDOG_TIMEOUT
#define DEFAULT_MAX_EVENT_SIZE
#define DEFAULT_BUFFER_SIZE
#define TRANSITION_ERROR_STRING_LENGTH
#define message(type, str)
int gettimeofday(struct timeval *tp, void *tzp)
static INT rpc_cxx_callback(INT index, void *prpc_param[])
static INT tr_resume(INT run_number, char *errstr)
static INT tr_startabort(INT run_number, char *errstr)
static INT binary_rpc_callback(INT index, void *prpc_param[])
TMFeResult TMFeErrorMessage(const std::string &message)
static INT tr_start(INT run_number, char *errstr)
static INT rpc_callback(INT index, void *prpc_param[])
static INT binary_rpc_cxx_callback(INT index, void *prpc_param[])
static INT tr_stop(INT run_number, char *errstr)
static INT tr_pause(INT run_number, char *errstr)
TMFeResult TMFeMidasError(const std::string &message, const char *midas_function_name, int midas_status)
TMFeResult TMFeErrorMessage(const std::string &message)
TMFeResult TMFeMidasError(const std::string &message, const char *midas_function_name, int midas_status)