40 assert(!
"TMFE::~TMFE(): destruction of the TMFE singleton is not permitted!");
135 for (
int i=0;
i<
n;
i++) {
146 fprintf(
stderr,
"TMFE::EquipmentPeriodicTasks: periodic equipment does not keep up!\n");
215 mfe->fRpcThreadRunning =
true;
217 while (!
mfe->fShutdownRequested && !
mfe->fRpcThreadShutdownRequested) {
222 mfe->fShutdownRequested =
true;
228 mfe->fRpcThreadRunning =
false;
234 fprintf(
stderr,
"tmfe_periodic_thread: periodic thread started\n");
236 mfe->fPeriodicThreadRunning =
true;
237 while (!
mfe->fShutdownRequested && !
mfe->fPeriodicThreadShutdownRequested) {
238 mfe->EquipmentPeriodicTasks();
241 mfe->fShutdownRequested =
true;
242 fprintf(
stderr,
"tmfe_periodic_thread: ss_susend() status %d, shutdown requested...\n",
status);
246 fprintf(
stderr,
"tmfe_periodic_thread: periodic thread stopped\n");
247 mfe->fPeriodicThreadRunning =
false;
254 fprintf(
stderr,
"TMFE::StartRpcThread: RPC thread already running\n");
265 fprintf(
stderr,
"TMFE::StartPeriodicThread: periodic thread already running\n");
280 for (
int i=0;
i<60;
i++) {
284 fprintf(
stderr,
"TMFE::StopRpcThread: waiting for RPC thread to stop\n");
290 fprintf(
stderr,
"TMFE::StopRpcThread: timeout waiting for RPC thread to stop\n");
301 for (
int i=0;
i<60;
i++) {
305 fprintf(
stderr,
"TMFE::StopPeriodicThread: waiting for periodic thread to stop\n");
311 fprintf(
stderr,
"TMFE::StopPeriodicThread: timeout waiting for periodic thread to stop\n");
315void TMFE::Msg(
int message_type,
const char *filename,
int line,
const char *routine,
const char *format, ...)
320 va_start(
ap, format);
324 cm_msg(message_type, filename, line, routine,
"%s",
message);
332 return tv.tv_sec*1.0 +
tv.tv_usec/1000000.0;
343 timeout.tv_sec = time;
344 timeout.tv_usec = (time-timeout.tv_sec)*1000000.0;
400 for (
unsigned i=0;
i<
mfe->fRpcHandlers.size();
i++) {
401 std::string r =
mfe->fRpcHandlers[
i]->HandleRpc(cmd,
args);
402 if (r.length() > 0) {
419 for (
unsigned i=0;
i<
mfe->fEquipments.size();
i++) {
420 mfe->fEquipments[
i]->ZeroStatistics();
421 mfe->fEquipments[
i]->WriteStatistics();
424 for (
unsigned i=0;
i<
mfe->fRpcHandlers.size();
i++) {
425 mfe->fRpcHandlers[
i]->HandleBeginRun();
436 for (
unsigned i=0;
i<
mfe->fRpcHandlers.size();
i++) {
437 mfe->fRpcHandlers[
i]->HandleEndRun();
440 for (
unsigned i=0;
i<
mfe->fEquipments.size();
i++) {
441 mfe->fEquipments[
i]->WriteStatistics();
453 for (
unsigned i=0;
i<
mfe->fRpcHandlers.size();
i++) {
454 mfe->fRpcHandlers[
i]->HandlePauseRun();
465 for (
unsigned i=0;
i<
mfe->fRpcHandlers.size();
i++) {
466 mfe->fRpcHandlers[
i]->HandleResumeRun();
477 for (
unsigned i=0;
i<
mfe->fRpcHandlers.size();
i++) {
478 mfe->fRpcHandlers[
i]->HandleStartAbortRun();
745 TMFE::Instance()->
Msg(
MERROR,
"TMFeEquipment::SendData",
"bm_send_event() returned %d, event buffer is corrupted, shutting down the frontend",
status);
747 return TMFeError(
status,
"bm_send_event: event buffer is corrupted, shutting down the frontend");
TMFeResult TriggerAlarm(const char *name, const char *message, const char *aclass)
void RegisterRpcHandler(TMFeRpcHandlerInterface *handler)
RPC handlers are executed from the RPC thread, if started.
void DeregisterTransitionStartAbort()
std::atomic_bool fRpcThreadStarting
static std::string GetThreadId()
return identification of this thread
bool fPeriodicThreadShutdownRequested
void DeregisterTransitionResume()
std::string fFrontendFilename
frontend program file name
TMFE()
default constructor is private for singleton classes
static double GetTime()
return current time in seconds, with micro-second precision
void MidasPeriodicTasks()
std::vector< TMFePeriodicHandler * > fPeriodicHandlers
int fDB
ODB database handle.
virtual ~TMFE()
destructor is private for singleton classes
void DeregisterTransitionPause()
void EquipmentPeriodicTasks()
void SetTransitionSequenceResume(int seqno)
void SetTransitionSequenceStop(int seqno)
std::string fFrontendHostname
frontend hostname
void StartPeriodicThread()
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
bool fPeriodicThreadStarting
void SetTransitionSequenceStartAbort(int seqno)
static void Sleep(double sleep_time_sec)
sleep, with micro-second precision
bool fPeriodicThreadRunning
std::string fFrontendName
frontend program name
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 StopPeriodicThread()
void RegisterTransitionStartAbort()
TMFeResult ResetAlarm(const char *name)
std::string fHostname
hostname we are running on
void RegisterPeriodicHandler(TMFeEquipment *eq, TMFePeriodicHandlerInterface *handler)
periodic handlers are executed from the periodic thread, if started
MVOdb * fOdbRoot
ODB root.
std::vector< TMFeRpcHandlerInterface * > fRpcHandlers
void DeregisterTransitionStart()
std::vector< TMFeEquipment * > fEquipments
TMFeError RegisterEquipment(TMFeEquipment *eq)
void DeregisterTransitions()
void PollMidas(int millisec)
void SetTransitionSequenceStart(int seqno)
std::string fExptname
experiment name, blank if only one experiment defined in exptab
std::string FrontendFileName
TMFeError SendData(const char *data, int size)
...
void * BkOpen(char *pevent, const char *bank_name, int bank_type) const
TMFeResult BkInit(char *pevent, size_t size) const
MVOdb * fOdbEqSettings
ODB Equipment/EQNAME/Settings.
MVOdb * fOdbEqVariables
ODB Equipment/EQNAME/Variables.
TMFeError ZeroStatistics()
TMFeError WriteStatistics()
TMFeResult BkClose(char *pevent, void *ptr) const
TMFeResult ComposeEvent(char *pevent, size_t size) const
TMFeError SendEvent(const char *pevent)
MVOdb * fOdbEqCommon
ODB Equipment/EQNAME/Common.
MVOdb * fOdbEq
ODB Equipment/EQNAME.
int BkSize(const char *pevent) const
TMFeError Init()
Initialize equipment.
TMFeError SetStatus(const char *status, const char *color)
MVOdb * fOdbEqStatistics
ODB Equipment/EQNAME/Statistics.
TMFePeriodicHandlerInterface * fHandler
virtual void HandlePeriodic()=0
virtual void HandleStartAbortRun()
virtual void HandlePauseRun()
virtual TMFeResult HandleRpc(const char *cmd, const char *args, std::string &result)
virtual void HandleEndRun()
virtual void HandleResumeRun()
virtual void HandleBeginRun()
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)
INT bk_close(void *event, void *pdata)
void bk_init32(void *event)
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_send_event(INT buffer_handle, const EVENT_HEADER *pevent, int unused, 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_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(INT millisec, INT msg)
INT ss_suspend_set_rpc_thread(midas_thread_t thread_id)
midas_thread_t ss_thread_create(INT(*thread_func)(void *), void *param)
std::string ss_tid_to_string(midas_thread_t thread_id)
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 tr_stop(INT rn, char *error)
INT tr_start(INT rn, char *error)
INT tr_pause(INT rn, char *error)
INT tr_resume(INT rn, char *error)
#define DEFAULT_WATCHDOG_TIMEOUT
#define DEFAULT_BUFFER_SIZE
#define message(type, str)
int gettimeofday(struct timeval *tp, void *tzp)
TH1X EXPRT * h1_book(const char *name, const char *title, int bins, double min, double max)
static INT tr_startabort(INT run_number, char *errstr)
static INT rpc_callback(INT index, void *prpc_param[])
static int tmfe_rpc_thread(void *param)
static INT tr_resume(INT runno, char *errstr)
static INT tr_stop(INT runno, char *errstr)
static INT tr_pause(INT runno, char *errstr)
static int tmfe_periodic_thread(void *param)
static INT tr_startabort(INT runno, char *errstr)
static INT tr_start(INT runno, char *errstr)
static INT rpc_callback(INT index, void *prpc_param[])