MIDAS
Loading...
Searching...
No Matches
tmfe_rev0.cxx
Go to the documentation of this file.
1/********************************************************************\
2
3 Name: tmfe_rev0.cxx
4 Created by: Konstantin Olchanski - TRIUMF
5
6 Contents: C++ MIDAS frontend
7
8\********************************************************************/
9
10#include <stdio.h>
11#include <stdarg.h>
12#include <assert.h>
13#include <sys/time.h> // gettimeofday()
14
15#include "tmfe_rev0.h"
16
17#include "midas.h"
18#include "msystem.h"
19#include "mrpc.h"
20#include "mstrlcpy.h"
21
22TMFE::TMFE() // ctor
23{
24 fDB = 0;
25 fOdbRoot = NULL;
26 fShutdownRequested = false;
27 fNextPeriodic = 0;
28
29 fRpcThreadStarting = false;
30 fRpcThreadRunning = false;
32
36}
37
38TMFE::~TMFE() // dtor
39{
40 assert(!"TMFE::~TMFE(): destruction of the TMFE singleton is not permitted!");
41}
42
44{
45 if (!gfMFE)
46 gfMFE = new TMFE();
47
48 return gfMFE;
49}
50
51TMFeError TMFE::Connect(const char* progname, const char* filename, const char* hostname, const char* exptname)
52{
53 if (progname)
55 if (filename)
56 fFrontendFilename = filename;
57
59
60 int status;
61
64
65 /* get default from environment */
67 assert(status == CM_SUCCESS);
68
69 if (hostname)
70 mstrlcpy(xhostname, hostname, sizeof(xhostname));
71
72 if (exptname)
74
77
78 fprintf(stderr, "TMFE::Connect: Program \"%s\" connecting to experiment \"%s\" on host \"%s\"\n", progname, fExptname.c_str(), fHostname.c_str());
79
81 //int watchdog = 60*1000;
82
84
85 if (status == CM_UNDEF_EXP) {
86 fprintf(stderr, "TMidasOnline::connect: Error: experiment \"%s\" not defined.\n", fExptname.c_str());
87 return TMFeError(status, "experiment is not defined");
88 } else if (status != CM_SUCCESS) {
89 fprintf(stderr, "TMidasOnline::connect: Cannot connect to MIDAS, status %d.\n", status);
90 return TMFeError(status, "cannot connect");
91 }
92
94 if (status != CM_SUCCESS) {
95 return TMFeError(status, "cm_get_experiment_database");
96 }
97
99
100 return TMFeError();
101}
102
104{
105 if (sec == 0) {
106 cm_set_watchdog_params(false, 0);
107 } else {
108 cm_set_watchdog_params(true, sec*1000);
109 }
110 return TMFeError();
111}
112
114{
115 fprintf(stderr, "TMFE::Disconnect: Disconnecting from experiment \"%s\" on host \"%s\"\n", fExptname.c_str(), fHostname.c_str());
119 return TMFeError();
120}
121
123{
124 fEquipments.push_back(eq);
125 return TMFeError();
126}
127
129{
130 double now = GetTime();
131
132 if (fNextPeriodic == 0 || now >= fNextPeriodic) {
133 int n = fPeriodicHandlers.size();
134 fNextPeriodic = 0;
135 for (int i=0; i<n; i++) {
137 double period = h->fEq->fCommon->Period/1000.0;
138 //printf("periodic[%d] period %f, last call %f, next call %f (+%f)\n", i, period, h->fLastCallTime, h->fNextCallTime, now - h->fNextCallTime);
139 if (period <= 0)
140 continue;
141 if (h->fNextCallTime == 0 || now >= h->fNextCallTime) {
142 h->fLastCallTime = now;
143 h->fNextCallTime = h->fLastCallTime + period;
144
145 if (h->fNextCallTime < now) {
146 fprintf(stderr, "TMFE::EquipmentPeriodicTasks: periodic equipment does not keep up!\n"); // FIXME
147 while (h->fNextCallTime < now) {
148 h->fNextCallTime += period;
149 }
150 }
151
152 if (fNextPeriodic == 0)
154 else if (h->fNextCallTime < fNextPeriodic)
156
158
159 now = GetTime();
160 }
161 }
162
163 //printf("next periodic %f (+%f)\n", fNextPeriodic, fNextPeriodic - now);
164 } else {
165 //printf("next periodic %f (+%f), waiting\n", fNextPeriodic, fNextPeriodic - now);
166 }
167}
168
170{
171 double now = GetTime();
172 //double sleep_start = now;
173 double sleep_end = now + msec/1000.0;
174
175 while (!fShutdownRequested) {
178 }
179
180 now = GetTime();
181
182 double sleep_time = sleep_end - now;
183 int s = 0;
184 if (sleep_time > 0)
185 s = 1 + sleep_time*1000.0;
186
187 //printf("now %f, sleep_end %f, s %d\n", now, sleep_end, s);
188
189 int status = cm_yield(s);
190
191 if (status == RPC_SHUTDOWN || status == SS_ABORT) {
192 fShutdownRequested = true;
193 fprintf(stderr, "TMFE::PollMidas: cm_yield(%d) status %d, shutdown requested...\n", msec, status);
194 }
195
196 now = GetTime();
197 if (now >= sleep_end)
198 break;
199 }
200
201 //printf("TMFE::PollMidas: msec %d, actual %f msec\n", msec, (now - sleep_start) * 1000.0);
202}
203
205{
207}
208
209static int tmfe_rpc_thread(void* param)
210{
211 fprintf(stderr, "tmfe_rpc_thread: RPC thread started\n");
212
213 int msec = 1000;
215 mfe->fRpcThreadRunning = true;
217 while (!mfe->fShutdownRequested && !mfe->fRpcThreadShutdownRequested) {
218
219 int status = cm_yield(msec);
220
221 if (status == RPC_SHUTDOWN || status == SS_ABORT) {
222 mfe->fShutdownRequested = true;
223 fprintf(stderr, "tmfe_rpc_thread: cm_yield(%d) status %d, shutdown requested...\n", msec, status);
224 }
225 }
227 fprintf(stderr, "tmfe_rpc_thread: RPC thread stopped\n");
228 mfe->fRpcThreadRunning = false;
229 return SUCCESS;
230}
231
233{
234 fprintf(stderr, "tmfe_periodic_thread: periodic thread started\n");
236 mfe->fPeriodicThreadRunning = true;
237 while (!mfe->fShutdownRequested && !mfe->fPeriodicThreadShutdownRequested) {
238 mfe->EquipmentPeriodicTasks();
239 int status = ss_suspend(1000, 0);
240 if (status == RPC_SHUTDOWN || status == SS_ABORT || status == SS_EXIT) {
241 mfe->fShutdownRequested = true;
242 fprintf(stderr, "tmfe_periodic_thread: ss_susend() status %d, shutdown requested...\n", status);
243 }
244 }
246 fprintf(stderr, "tmfe_periodic_thread: periodic thread stopped\n");
247 mfe->fPeriodicThreadRunning = false;
248 return SUCCESS;
249}
250
252{
254 fprintf(stderr, "TMFE::StartRpcThread: RPC thread already running\n");
255 return;
256 }
257
258 fRpcThreadStarting = true;
260}
261
263{
265 fprintf(stderr, "TMFE::StartPeriodicThread: periodic thread already running\n");
266 return;
267 }
268
271}
272
274{
276 return;
277
278 fRpcThreadStarting = false;
280 for (int i=0; i<60; i++) {
282 break;
283 if (i>5) {
284 fprintf(stderr, "TMFE::StopRpcThread: waiting for RPC thread to stop\n");
285 }
286 ::sleep(1);
287 }
288
289 if (fRpcThreadRunning) {
290 fprintf(stderr, "TMFE::StopRpcThread: timeout waiting for RPC thread to stop\n");
291 }
292}
293
295{
297 return;
298
301 for (int i=0; i<60; i++) {
303 break;
304 if (i>5) {
305 fprintf(stderr, "TMFE::StopPeriodicThread: waiting for periodic thread to stop\n");
306 }
307 ::sleep(1);
308 }
309
311 fprintf(stderr, "TMFE::StopPeriodicThread: timeout waiting for periodic thread to stop\n");
312 }
313}
314
315void TMFE::Msg(int message_type, const char *filename, int line, const char *routine, const char *format, ...)
316{
317 char message[1024];
318 //printf("format [%s]\n", format);
319 va_list ap;
320 va_start(ap, format);
321 vsnprintf(message, sizeof(message)-1, format, ap);
322 va_end(ap);
323 //printf("message [%s]\n", message);
324 cm_msg(message_type, filename, line, routine, "%s", message);
326}
327
328double TMFE::GetTime()
329{
330 struct timeval tv;
332 return tv.tv_sec*1.0 + tv.tv_usec/1000000.0;
333}
334
335void TMFE::Sleep(double time)
336{
337 int status;
339 struct timeval timeout;
340
341 FD_ZERO(&fdset);
342
343 timeout.tv_sec = time;
344 timeout.tv_usec = (time-timeout.tv_sec)*1000000.0;
345
346 status = select(1, &fdset, NULL, NULL, &timeout);
347
348 //#ifdef EINTR
349 //if (status < 0 && errno == EINTR) {
350 // return 0; // watchdog interrupt, try again
351 //}
352 //#endif
353
354 if (status < 0) {
355 TMFE::Instance()->Msg(MERROR, "TMFE::Sleep", "select() returned %d, errno %d (%s)", status, errno, strerror(errno));
356 }
357}
358
359std::string TMFE::GetThreadId()
360{
361 return ss_tid_to_string(ss_gettid());
362}
363
364std::string TMFeRpcHandlerInterface::HandleRpc(const char* cmd, const char* args)
365{
366 return "";
367}
368
372
376
380
384
388
390{
391 const char* cmd = CSTRING(0);
392 const char* args = CSTRING(1);
393 char* return_buf = CSTRING(2);
394 int return_max_length = CINT(3);
395
396 cm_msg(MINFO, "rpc_callback", "--------> rpc_callback: index %d, max_length %d, cmd [%s], args [%s]", index, return_max_length, cmd, args);
397
399
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) {
403 //printf("Handler reply [%s]\n", C(r));
405 return RPC_SUCCESS;
406 }
407 }
408
409 return_buf[0] = 0;
410 return RPC_SUCCESS;
411}
412
413static INT tr_start(INT runno, char *errstr)
414{
415 cm_msg(MINFO, "tr_start", "tr_start");
416
418
419 for (unsigned i=0; i<mfe->fEquipments.size(); i++) {
420 mfe->fEquipments[i]->ZeroStatistics();
421 mfe->fEquipments[i]->WriteStatistics();
422 }
423
424 for (unsigned i=0; i<mfe->fRpcHandlers.size(); i++) {
425 mfe->fRpcHandlers[i]->HandleBeginRun();
426 }
427
428 return SUCCESS;
429}
430
431static INT tr_stop(INT runno, char *errstr)
432{
433 cm_msg(MINFO, "tr_stop", "tr_stop");
434
436 for (unsigned i=0; i<mfe->fRpcHandlers.size(); i++) {
437 mfe->fRpcHandlers[i]->HandleEndRun();
438 }
439
440 for (unsigned i=0; i<mfe->fEquipments.size(); i++) {
441 mfe->fEquipments[i]->WriteStatistics();
442 }
443
444
445 return SUCCESS;
446}
447
448static INT tr_pause(INT runno, char *errstr)
449{
450 cm_msg(MINFO, "tr_pause", "tr_pause");
451
453 for (unsigned i=0; i<mfe->fRpcHandlers.size(); i++) {
454 mfe->fRpcHandlers[i]->HandlePauseRun();
455 }
456
457 return SUCCESS;
458}
459
460static INT tr_resume(INT runno, char *errstr)
461{
462 cm_msg(MINFO, "tr_resume", "tr_resume");
463
465 for (unsigned i=0; i<mfe->fRpcHandlers.size(); i++) {
466 mfe->fRpcHandlers[i]->HandleResumeRun();
467 }
468
469 return SUCCESS;
470}
471
472static INT tr_startabort(INT runno, char *errstr)
473{
474 cm_msg(MINFO, "tr_startabort", "tr_startabort");
475
477 for (unsigned i=0; i<mfe->fRpcHandlers.size(); i++) {
478 mfe->fRpcHandlers[i]->HandleStartAbortRun();
479 }
480
481 return SUCCESS;
482}
483
485{
486 if (fRpcHandlers.size() == 0) {
487 // for the first handler, register with MIDAS
493 //cm_register_transition(TR_STARTABORT, tr_startabort, 500);
494 }
495
496 fRpcHandlers.push_back(h);
497}
498
500{
502}
503
505{
507}
508
510{
512}
513
515{
517}
518
520{
522}
523
525{
531}
532
534{
536}
537
539{
541}
542
544{
546}
547
549{
551}
552
554{
556}
557
559{
561}
562
570
572{
573 fEq = NULL; // no delete, we do not own this object
574 fHandler = NULL; // no delete, we do not own this object
575 fLastCallTime = 0;
576 fNextCallTime = 0;
577}
578
587
589{
590 EventID = 1;
591 TriggerMask = 0;
592 Buffer = "SYSTEM";
593 Type = 0;
594 Source = 0;
595 Format = "MIDAS";
596 Enabled = true;
597 ReadOn = 0;
598 Period = 1000;
599 EventLimit = 0;
600 NumSubEvents = 0;
601 LogHistory = 1;
602 //FrontendHost;
603 //FrontendName;
604 //FrontendFileName;
605 //Status;
606 //StatusColor;
607 Hidden = false;
608 WriteCacheSize = 100000;
609};
610
612{
613 fMfe = mfe;
614 fName = name;
615 fCommon = common;
616 fBufferHandle = 0;
617 fSerial = 0;
618 fStatEvents = 0;
619 fStatBytes = 0;
620 fStatEpS = 0;
621 fStatKBpS = 0;
622 fStatLastTime = 0;
623 fStatLastEvents = 0;
624 fStatLastBytes = 0;
625 fOdbEq = NULL;
629}
630
632{
633 //
634 // create ODB /eq/name/common
635 //
636
637 fOdbEq = fMfe->fOdbRoot->Chdir((std::string("Equipment/") + fName).c_str(), true);
638 fOdbEqCommon = fOdbEq->Chdir("Common", true);
639 fOdbEqSettings = fOdbEq->Chdir("Settings", true);
640 fOdbEqVariables = fOdbEq->Chdir("Variables", true);
641 fOdbEqStatistics = fOdbEq->Chdir("Statistics", true);
642
643 fOdbEqCommon->RU16("Event ID", &fCommon->EventID, true);
644 fOdbEqCommon->RU16("Trigger mask", &fCommon->TriggerMask, true);
645 fOdbEqCommon->RS("Buffer", &fCommon->Buffer, true, NAME_LENGTH);
646 fOdbEqCommon->RI("Type", &fCommon->Type, true);
647 fOdbEqCommon->RI("Source", &fCommon->Source, true);
648 fOdbEqCommon->RS("Format", &fCommon->Format, true, 8);
649 fOdbEqCommon->RB("Enabled", &fCommon->Enabled, true);
650 fOdbEqCommon->RI("Read on", &fCommon->ReadOn, true);
651 fOdbEqCommon->RI("Period", &fCommon->Period, true);
652 fOdbEqCommon->RD("Event limit", &fCommon->EventLimit, true);
653 fOdbEqCommon->RU32("Num subevents", &fCommon->NumSubEvents, true);
654 fOdbEqCommon->RI("Log history", &fCommon->LogHistory, true);
655 fOdbEqCommon->RS("Frontend host", &fCommon->FrontendHost, true, NAME_LENGTH);
656 fOdbEqCommon->RS("Frontend name", &fCommon->FrontendName, true, NAME_LENGTH);
657 fOdbEqCommon->RS("Frontend file name", &fCommon->FrontendFileName, true, 256);
658 fOdbEqCommon->RS("Status", &fCommon->Status, true, 256);
659 fOdbEqCommon->RS("Status color", &fCommon->StatusColor, true, NAME_LENGTH);
660 fOdbEqCommon->RB("Hidden", &fCommon->Hidden, true);
661 fOdbEqCommon->RI("Write cache size", &fCommon->WriteCacheSize, true);
662
666
667 fCommon->Status = "";
669 fCommon->Status += "@";
671 fCommon->StatusColor = "greenLight";
672
673 if (fCommon->Buffer.length() > 0) {
675 if (status != BM_SUCCESS) {
676 return TMFeError(status, "bm_open_buffer");
677 }
678 }
679
680 fOdbEqCommon->WS("Frontend host", fCommon->FrontendHost.c_str(), NAME_LENGTH);
681 fOdbEqCommon->WS("Frontend name", fCommon->FrontendName.c_str(), NAME_LENGTH);
682 fOdbEqCommon->WS("Frontend file name", fCommon->FrontendFileName.c_str(), 256);
683 fOdbEqCommon->WS("Status", fCommon->Status.c_str(), 256);
684 fOdbEqCommon->WS("Status color", fCommon->StatusColor.c_str(), NAME_LENGTH);
685
688
689 return TMFeError();
690};
691
693{
694 fStatEvents = 0;
695 fStatBytes = 0;
696 fStatEpS = 0;
697 fStatKBpS = 0;
698
699 fStatLastTime = 0;
700 fStatLastEvents = 0;
701 fStatLastBytes = 0;
702
703 return TMFeError();
704}
705
707{
708 double now = TMFE::GetTime();
709 double elapsed = now - fStatLastTime;
710
711 if (elapsed > 0.9 || fStatLastTime == 0) {
714
718 }
719
720 fOdbEqStatistics->WD("Events sent", fStatEvents);
721 fOdbEqStatistics->WD("Events per sec.", fStatEpS);
722 fOdbEqStatistics->WD("kBytes per sec.", fStatKBpS);
723
724 return TMFeError();
725}
726
728{
729 EVENT_HEADER* pevent = (EVENT_HEADER*)event;
730 pevent->event_id = fCommon->EventID;
732 pevent->serial_number = fSerial;
733 pevent->time_stamp = TMFE::GetTime();
734 pevent->data_size = 0;
735 return TMFeError();
736}
737
738TMFeError TMFeEquipment::SendData(const char* buf, int size)
739{
740 if (fBufferHandle == 0) {
741 return TMFeError();
742 }
743 int status = bm_send_event(fBufferHandle, (const EVENT_HEADER*)buf, size, BM_WAIT);
744 if (status == BM_CORRUPTED) {
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");
748 } else if (status != BM_SUCCESS) {
749 return TMFeError(status, "bm_send_event");
750 }
751 fStatEvents += 1;
752 fStatBytes += size;
753 return TMFeError();
754}
755
757{
758 fSerial++;
759 return SendData(event, sizeof(EVENT_HEADER) + BkSize(event));
760}
761
762int TMFeEquipment::BkSize(const char* event)
763{
764 return bk_size((void*)(event + sizeof(EVENT_HEADER))); // FIXME: need const in prototype!
765}
766
767TMFeError TMFeEquipment::BkInit(char* event, int size)
768{
769 bk_init32(event + sizeof(EVENT_HEADER));
770 return TMFeError();
771}
772
773void* TMFeEquipment::BkOpen(char* event, const char* name, int tid)
774{
775 void* ptr;
776 bk_create(event + sizeof(EVENT_HEADER), name, tid, &ptr);
777 return ptr;
778}
779
780TMFeError TMFeEquipment::BkClose(char* event, void* ptr)
781{
782 bk_close(event + sizeof(EVENT_HEADER), ptr);
783 ((EVENT_HEADER*)event)->data_size = BkSize(event);
784 return TMFeError();
785}
786
788{
789 HNDLE hDB;
790 int status;
791
793 if (status != CM_SUCCESS) {
794 return TMFeError(status, "cm_get_experiment_database");
795 }
796
797 if (eq_status) {
798 fOdbEqCommon->WS("Status", eq_status, 256);
799 }
800
801 if (eq_color) {
802 fOdbEqCommon->WS("Status color", eq_color, NAME_LENGTH);
803 }
804
805 return TMFeError();
806}
807
808TMFeError TMFE::TriggerAlarm(const char* name, const char* message, const char* aclass)
809{
811
812 if (status) {
813 return TMFeError(status, "al_trigger_alarm");
814 }
815
816 return TMFeError();
817}
818
820{
822
823 if (status) {
824 return TMFeError(status, "al_reset_alarm");
825 }
826
827 return TMFeError();
828}
829
830// singleton instance
832
833/* emacs
834 * Local Variables:
835 * tab-width: 8
836 * c-basic-offset: 3
837 * indent-tabs-mode: nil
838 * End:
839 */
Definition tmfe.h:381
TMFeResult TriggerAlarm(const char *name, const char *message, const char *aclass)
Definition tmfe.cxx:2228
void RegisterRpcHandler(TMFeRpcHandlerInterface *handler)
RPC handlers are executed from the RPC thread, if started.
void DeregisterTransitionStartAbort()
Definition tmfe.cxx:1502
std::atomic_bool fRpcThreadStarting
Definition tmfe.h:406
static std::string GetThreadId()
return identification of this thread
Definition tmfe.cxx:1140
bool fPeriodicThreadShutdownRequested
Definition tmfe_rev0.h:236
void DeregisterTransitionResume()
Definition tmfe.cxx:1497
std::string fFrontendFilename
frontend program file name
Definition tmfe_rev0.h:214
TMFE()
default constructor is private for singleton classes
Definition tmfe.cxx:44
static double GetTime()
return current time in seconds, with micro-second precision
Definition tmfe.cxx:1011
void MidasPeriodicTasks()
Definition tmfe.cxx:852
std::vector< TMFePeriodicHandler * > fPeriodicHandlers
Definition tmfe_rev0.h:226
int fDB
ODB database handle.
Definition tmfe.h:394
virtual ~TMFE()
destructor is private for singleton classes
Definition tmfe.cxx:50
void DeregisterTransitionPause()
Definition tmfe.cxx:1492
void EquipmentPeriodicTasks()
double fNextPeriodic
Definition tmfe_rev0.h:227
void SetTransitionSequenceResume(int seqno)
Definition tmfe.cxx:1463
void SetTransitionSequenceStop(int seqno)
Definition tmfe.cxx:1453
std::string fFrontendHostname
frontend hostname
Definition tmfe_rev0.h:213
void StartPeriodicThread()
void Msg(int message_type, const char *filename, int line, const char *routine, const char *format,...) MATTRPRINTF(6
Definition tmfe.cxx:991
void StartRpcThread()
Definition tmfe.cxx:903
void DeregisterTransitionStop()
Definition tmfe.cxx:1487
TMFeResult Connect(const char *progname=NULL, const char *hostname=NULL, const char *exptname=NULL)
Definition tmfe.cxx:65
std::atomic_bool fRpcThreadShutdownRequested
Definition tmfe.h:408
bool fPeriodicThreadStarting
Definition tmfe_rev0.h:234
void SetTransitionSequenceStartAbort(int seqno)
Definition tmfe.cxx:1468
static TMFE * Instance()
Definition tmfe.cxx:57
static void Sleep(double sleep_time_sec)
sleep, with micro-second precision
Definition tmfe.cxx:1019
bool fPeriodicThreadRunning
Definition tmfe_rev0.h:235
std::string fFrontendName
frontend program name
Definition tmfe_rev0.h:212
static TMFE * gfMFE
Definition tmfe.h:413
void SetTransitionSequencePause(int seqno)
Definition tmfe.cxx:1458
std::atomic_bool fShutdownRequested
shutdown was requested by Ctrl-C or by RPC command
Definition tmfe.h:398
std::atomic_bool fRpcThreadRunning
Definition tmfe.h:407
TMFeResult SetWatchdogSec(int sec)
Definition tmfe.cxx:144
void StopPeriodicThread()
void StopRpcThread()
Definition tmfe.cxx:935
void RegisterTransitionStartAbort()
Definition tmfe.cxx:1507
TMFeResult ResetAlarm(const char *name)
Definition tmfe.cxx:2239
std::string fHostname
hostname we are running on
Definition tmfe.h:388
void RegisterPeriodicHandler(TMFeEquipment *eq, TMFePeriodicHandlerInterface *handler)
periodic handlers are executed from the periodic thread, if started
MVOdb * fOdbRoot
ODB root.
Definition tmfe.h:395
TMFeResult Disconnect()
Definition tmfe.cxx:154
std::vector< TMFeRpcHandlerInterface * > fRpcHandlers
Definition tmfe.h:464
void DeregisterTransitionStart()
Definition tmfe.cxx:1482
std::vector< TMFeEquipment * > fEquipments
Definition tmfe_rev0.h:224
TMFeError RegisterEquipment(TMFeEquipment *eq)
void DeregisterTransitions()
Definition tmfe.cxx:1473
void PollMidas(int millisec)
void SetTransitionSequenceStart(int seqno)
Definition tmfe.cxx:1448
std::string fExptname
experiment name, blank if only one experiment defined in exptab
Definition tmfe.h:384
uint16_t EventID
Definition tmfe_rev0.h:105
std::string Status
Definition tmfe_rev0.h:120
int WriteCacheSize
Definition tmfe_rev0.h:123
double EventLimit
Definition tmfe_rev0.h:114
bool Enabled
Definition tmfe_rev0.h:111
int LogHistory
Definition tmfe_rev0.h:116
uint32_t NumSubEvents
Definition tmfe_rev0.h:115
std::string FrontendHost
Definition tmfe_rev0.h:117
std::string FrontendFileName
Definition tmfe_rev0.h:119
bool Hidden
Definition tmfe_rev0.h:122
uint16_t TriggerMask
Definition tmfe_rev0.h:106
std::string FrontendName
Definition tmfe_rev0.h:118
std::string Format
Definition tmfe_rev0.h:110
std::string StatusColor
Definition tmfe_rev0.h:121
std::string Buffer
Definition tmfe_rev0.h:107
TMFeError SendData(const char *data, int size)
...
double fStatEvents
Definition tmfe_rev0.h:151
void * BkOpen(char *pevent, const char *bank_name, int bank_type) const
Definition tmfe.cxx:2201
TMFeResult BkInit(char *pevent, size_t size) const
Definition tmfe.cxx:2195
MVOdb * fOdbEqSettings
ODB Equipment/EQNAME/Settings.
Definition tmfe.h:213
TMFE * fMfe
Definition tmfe.h:207
MVOdb * fOdbEqVariables
ODB Equipment/EQNAME/Variables.
Definition tmfe.h:214
TMFeError ZeroStatistics()
TMFeError WriteStatistics()
TMFeCommon * fCommon
Definition tmfe_rev0.h:136
double fStatLastEvents
Definition tmfe_rev0.h:157
TMFeResult BkClose(char *pevent, void *ptr) const
Definition tmfe.cxx:2208
TMFeEquipment()
Definition tmfe.h:255
double fStatBytes
Definition tmfe_rev0.h:152
double fStatLastTime
Definition tmfe_rev0.h:156
TMFeResult ComposeEvent(char *pevent, size_t size) const
Definition tmfe.cxx:1995
TMFeError SendEvent(const char *pevent)
MVOdb * fOdbEqCommon
ODB Equipment/EQNAME/Common.
Definition tmfe.h:212
MVOdb * fOdbEq
ODB Equipment/EQNAME.
Definition tmfe.h:211
double fStatKBpS
Definition tmfe_rev0.h:154
std::string fName
Definition tmfe_rev0.h:135
int BkSize(const char *pevent) const
Definition tmfe.cxx:2190
double fStatLastBytes
Definition tmfe_rev0.h:158
TMFeError Init()
Initialize equipment.
TMFeError SetStatus(const char *status, const char *color)
MVOdb * fOdbEqStatistics
ODB Equipment/EQNAME/Statistics.
Definition tmfe.h:215
double fStatEpS
Definition tmfe_rev0.h:153
TMFePeriodicHandlerInterface * fHandler
Definition tmfe_rev0.h:196
TMFeEquipment * fEq
Definition tmfe_rev0.h:195
virtual void HandlePeriodic()=0
virtual void HandleStartAbortRun()
virtual void HandlePauseRun()
virtual TMFeResult HandleRpc(const char *cmd, const char *args, std::string &result)
Definition tmfe.h:152
virtual void HandleEndRun()
virtual void HandleResumeRun()
virtual void HandleBeginRun()
INT al_reset_alarm(const char *alarm_name)
Definition alarm.cxx:525
INT al_trigger_alarm(const char *alarm_name, const char *alarm_message, const char *default_class, const char *cond_str, INT type)
Definition alarm.cxx:283
INT bk_close(void *event, void *pdata)
Definition midas.cxx:16780
void bk_init32(void *event)
Definition midas.cxx:16469
void bk_create(void *event, const char *name, WORD type, void **pdata)
Definition midas.cxx:16561
INT bk_size(const void *event)
Definition midas.cxx:16495
INT bm_open_buffer(const char *buffer_name, INT buffer_size, INT *buffer_handle)
Definition midas.cxx:6717
INT bm_send_event(INT buffer_handle, const EVENT_HEADER *pevent, int unused, int timeout_msec)
Definition midas.cxx:9678
INT cm_register_transition(INT transition, INT(*func)(INT, char *), INT sequence_number)
Definition midas.cxx:3593
INT cm_yield(INT millisec)
Definition midas.cxx:5642
INT cm_get_experiment_database(HNDLE *hDB, HNDLE *hKeyClient)
Definition midas.cxx:3011
INT cm_register_function(INT id, INT(*func)(INT, void **))
Definition midas.cxx:5790
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)
Definition midas.cxx:2297
INT cm_periodic_tasks()
Definition midas.cxx:5579
INT cm_disconnect_experiment(void)
Definition midas.cxx:2846
INT cm_get_environment(char *host_name, int host_name_size, char *exp_name, int exp_name_size)
Definition midas.cxx:2134
INT cm_deregister_transition(INT transition)
Definition midas.cxx:3669
INT cm_set_transition_sequence(INT transition, INT sequence_number)
Definition midas.cxx:3723
INT cm_set_watchdog_params(BOOL call_watchdog, DWORD timeout)
Definition midas.cxx:3283
#define CM_SUCCESS
Definition midas.h:582
#define CM_UNDEF_EXP
Definition midas.h:586
#define BM_SUCCESS
Definition midas.h:605
#define BM_CORRUPTED
Definition midas.h:623
#define SS_ABORT
Definition midas.h:677
#define SS_EXIT
Definition midas.h:678
#define RPC_SHUTDOWN
Definition midas.h:707
#define RPC_SUCCESS
Definition midas.h:698
#define SUCCESS
Definition mcstd.h:54
#define TR_RESUME
Definition midas.h:408
#define TR_PAUSE
Definition midas.h:407
#define TR_START
Definition midas.h:405
#define TR_STARTABORT
Definition midas.h:409
#define MINFO
Definition midas.h:560
#define TR_STOP
Definition midas.h:406
#define BM_WAIT
Definition midas.h:365
std::string ss_gethostname()
Definition system.cxx:5706
INT ss_suspend(INT millisec, INT msg)
Definition system.cxx:4543
INT ss_suspend_set_rpc_thread(midas_thread_t thread_id)
Definition system.cxx:4002
midas_thread_t ss_thread_create(INT(*thread_func)(void *), void *param)
Definition system.cxx:2310
std::string ss_tid_to_string(midas_thread_t thread_id)
Definition system.cxx:1571
INT ss_suspend_exit()
Definition system.cxx:4226
midas_thread_t ss_gettid(void)
Definition system.cxx:1519
INT cm_msg_flush_buffer()
Definition midas.cxx:865
INT cm_msg(INT message_type, const char *filename, INT line, const char *routine, const char *format,...)
Definition midas.cxx:915
#define RPC_JRPC
Definition mrpc.h:130
DWORD n[4]
Definition mana.cxx:247
INT index
Definition mana.cxx:271
INT tr_stop(INT rn, char *error)
Definition mana.cxx:2036
INT tr_start(INT rn, char *error)
Definition mana.cxx:2014
char param[10][256]
Definition mana.cxx:250
INT tr_pause(INT rn, char *error)
Definition mana.cxx:2065
HNDLE hDB
main ODB handle
Definition mana.cxx:207
INT tr_resume(INT rn, char *error)
Definition mana.cxx:2078
INT i
Definition mdump.cxx:32
std::vector< FMT_ID > eq
Definition mdump.cxx:55
#define AT_INTERNAL
Definition midas.h:1442
INT HNDLE
Definition midas.h:132
#define CINT(_i)
Definition midas.h:1622
#define HOST_NAME_LENGTH
Definition midas.h:273
#define DEFAULT_WATCHDOG_TIMEOUT
Definition midas.h:290
int INT
Definition midas.h:129
#define CSTRING(_i)
Definition midas.h:1646
#define DEFAULT_BUFFER_SIZE
Definition midas.h:255
#define DEFAULT_ODB_SIZE
Definition midas.h:270
#define NAME_LENGTH
Definition midas.h:272
#define message(type, str)
#define sleep(ms)
#define name(x)
Definition midas_macro.h:24
int gettimeofday(struct timeval *tp, void *tzp)
timeval tv
Definition msysmon.cxx:1095
DWORD status
Definition odbhist.cxx:39
TH1X EXPRT * h1_book(const char *name, const char *title, int bins, double min, double max)
Definition rmidas.h:24
short int event_id
Definition midas.h:852
DWORD data_size
Definition midas.h:856
DWORD serial_number
Definition midas.h:854
DWORD time_stamp
Definition midas.h:855
short int trigger_mask
Definition midas.h:853
static INT tr_startabort(INT run_number, char *errstr)
Definition tmfe.cxx:1416
static INT rpc_callback(INT index, void *prpc_param[])
Definition tmfe.cxx:1145
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[])
#define MERROR
Definition tmfe_rev0.h:70