24#define SERVER_CACHE_SIZE 100000
26#define ODB_UPDATE_TIME 1000
28#define DEFAULT_FE_TIMEOUT 60000
32#define TIMEOUT_ABORT 300
86#define EQUIPMENT_STATISTICS_STR "\
87Events sent = DOUBLE : 0\n\
88Events per sec. = DOUBLE : 0\n\
89kBytes per sec. = DOUBLE : 0\n\
131 size =
sizeof(double);
139 printf(
"Cannot check equipment record, status = %d\n",
status);
171 printf(
"Cannot create/check statistics record, error %d\n",
status);
177 printf(
"Cannot find statistics record, error %d\n",
status);
191 cm_msg(
MERROR,
"register_equipment",
"Cannot change access mode for record \'%s\', error %d",
str,
status);
193 cm_msg(
MINFO,
"register_equipment",
"Recovered access mode for record \'%s\'",
str);
197 cm_msg(
MERROR,
"register_equipment",
"Cannot open statistics record, error %d. Probably other FE is using it",
status);
206 "Cannot open event buffer. Try to reduce EVENT_BUFFER_SIZE in midas.h \
207 and rebuild the system.");
215 printf(
"Buffer %s, level %d, info: \n", eq_info->
buffer, level);
221 cm_msg(
MERROR,
"register_equipment",
"Destination buffer must be present");
244 cm_msg(
MINFO,
"load_fragment",
"Equipment listing not found");
257 printf(
"Equipment name:%s\n",
key.
name);
261 size =
sizeof(buffer);
263 size =
sizeof(format);
271 && (strncmp(format, eq_info->
format, strlen(format)) == 0)) {
288 printf(
"Found %d fragments for event building\n",
nfragment);
290 printf(
"Found one fragment for event building\n");
297 cm_msg(
MERROR,
"load_fragment",
"Unknown data format \"%s\"", format);
332 printf(
"...%c Snoring\r",
bars[
i_bar++ % 4]);
344 time_t now = time(NULL);
349 for (fragn = 0; fragn <
nfragment; fragn++)
355 for (fragn = 0; fragn <
nfragment; fragn++) {
358 if (
ebch[fragn].time &&
ebch[fragn].timeout)
368 cm_msg(
MERROR,
"scan_fragment",
"timeout waiting for fragment %d, restarting run", badfrag);
369 cm_msg(
MINFO,
"scan_fragment",
"spawning mtransition");
370 ss_system(
"mtransition STOP IF \"/Logger/Auto restart\" DELAY \"/Logger/Auto restart delay\" START &");
377 for (fragn = 0; fragn <
nfragment; fragn++) {
381 printf(
"Timeout waiting for fragment %d while stopping the run\n", fragn);
389 printf(
"...%c Timing on %1.0lf\r",
bars[
i_bar++ % 4],
eq->stats.events_sent);
402 cm_msg(
MTALK,
"scan_fragment",
"%s: Error signaled by user code - stopping run...",
408 printf(
"Stop requested on Error %d\n",
status);
413 cm_msg(
MINFO,
"scan_fragment",
"spawning mtransition");
419 for (ch=0; ch<5; ch++) {
464 if ((
char) ch ==
'!')
476 char *psdata, *pddata;
494 psdata = (
char *) (psbh + 1);
500 memcpy(pddata, psdata, bksize);
520 memcpy(pddata, psbh, *size);
535 char *psdata, *pddata;
536 DWORD *pslrl, *pdlrl;
537 INT i4frgsize, i1frgsize;
556 psdata = (
char *) (pslrl + 1);
559 i4frgsize = (*pslrl);
560 i1frgsize = 4 * i4frgsize;
563 memcpy(pddata, psdata, i1frgsize);
591 memcpy(pddata, (
char *) pslrl, *size);
611 printf(
"tr_start: run %d\n",
rn);
687 cm_msg(
MERROR,
"tr_start",
"Run start aborted because no fragment required");
704 cm_msg(
MINFO,
"tr_start",
"Event Builder disabled");
717 time_t now = time(NULL);
720 for (fragn = 0; fragn <
nfragment; fragn++) {
734 time_t now = time(NULL);
739 for (fragn = 0; fragn <
nfragment; fragn++) {
763 printf(
"tr_stop: run %d\n",
rn);
777 for (
i = 0;
i < nfrag;
i++) {
778 if (
ebch[
i].pfragment) {
779 free(
ebch[
i].pfragment);
793 printf(
"Hand flushing system buffer... \n");
802 "booking:Hand flush bm_receive_event[%d] hndle:%d stat:%d Last Ser:%d",
804 printf(
"%s\n", strout);
825 printf(
"Entering booking\n");
827 status1 = status2 = 0;
837 printf(
"bm_open_buffer frag:%d buf:%s handle:%d stat:%d\n",
844 printf(
"Buffer %s, level %d, info: \n",
ebch[
i].buffer, level);
853 printf(
"bm_request_event frag:%d id:%d msk:%d req_id:%d stat:%d\n",
858 "Open buffer/event request failure [%d %d %d]",
i, status1, status2);
863 if (
ebch[
i].pfragment)
864 free(
ebch[
i].pfragment);
867 printf(
"malloc pevent frag:%d pevent:%p\n",
i,
ebch[
i].pfragment);
868 if (
ebch[
i].pfragment == NULL) {
870 cm_msg(
MERROR,
"source_booking",
"Can't allocate space for buffer");
884 printf(
"bm_empty_buffers stat:%d\n",
status);
886 printf(
" buff:%s",
ebch[
j].buffer);
889 printf(
" rqid:%2d",
ebch[
j].req_id);
890 printf(
" opst:%d", status1);
891 printf(
" rqst:%d", status2);
909 if (
ebch[
i].pfragment != NULL) {
915 printf(
"unbook: bm_delete_req[%d] req_id:%d stat:%d\n",
i,
ebch[
i].req_id,
status);
920 printf(
"unbook: bm_close_buffer[%d] hndle:%d stat:%d\n",
i,
ebch[
i].
hBuf,
status);
954 sprintf(error,
"Run %d Stop after %1.0lf + %d events sent DT:%d[ms]",
989 BOOL found, event_mismatch;
1046 found = event_mismatch =
FALSE;
1056 event_mismatch =
TRUE;
1062 if (event_mismatch &&
debug) {
1065 strcpy(
str,
"event mismatch: ");
1068 strcat(
str, strsub);
1070 printf(
"event serial mismatch %s\n",
str);
1104 "compose fragment:%d current size:%d (%d)",
i, act_size,
status);
1118 printf(
"rpc_send_event returned error %d, event_size %d\n",
status, act_size);
1149 int restart_count = 0;
1161 for (
i = 1;
i < argc;
i++) {
1162 if (argv[
i][0] ==
'-' && argv[
i][1] ==
'd')
1164 else if (argv[
i][0] ==
'-' && argv[
i][1] ==
'D')
1166 else if (argv[
i][0] ==
'-' && argv[
i][1] ==
'w')
1168 else if (argv[
i][0] ==
'-') {
1169 if (
i + 1 >= argc || argv[
i + 1][0] ==
'-')
1171 if (strncmp(argv[
i],
"-e", 2) == 0)
1173 else if (strncmp(argv[
i],
"-h", 2) == 0)
1175 else if (strncmp(argv[
i],
"-b", 2) == 0)
1179 printf(
"usage: mevb [-h <Hostname>] [-e <Experiment>] [-b <buffername>] [-d] [-w] [-D]\n");
1180 printf(
" [-h <Hostname>] Host where midas experiment is running on\n");
1181 printf(
" [-e <Experiment>] Midas experiment if more than one exists\n");
1182 printf(
" [-b <buffername>] Specify evnet buffer name, use \"SYSTEM\" by default\n");
1183 printf(
" [-d] Print debugging output\n");
1184 printf(
" [-w] Show wheel\n");
1185 printf(
" [-D] Start as a daemon\n");
1190 printf(
"MIDAS example event builder. Press \"!\" to exit.\n");
1193 printf(
"Becoming a daemon...\n");
1223 size =
sizeof(rstate);
1226 cm_msg(
MERROR,
"main",
"Run in Progress, EBuilder aborted!.");
INT bk_swap(void *event, BOOL force)
INT bm_open_buffer(const char *buffer_name, INT buffer_size, INT *buffer_handle)
INT bm_delete_request(INT request_id)
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_receive_event(INT buffer_handle, void *destination, INT *buf_size, int timeout_msec)
INT bm_close_buffer(INT buffer_handle)
INT bm_compose_event(EVENT_HEADER *event_header, short int event_id, short int trigger_mask, DWORD data_size, DWORD serial)
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_connect_experiment(const char *host_name, const char *exp_name, const char *client_name, void(*func)(char *))
INT cm_transition(INT transition, INT run_number, char *errstr, INT errstr_size, INT async_flag, INT debug_flag)
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_set_watchdog_params(BOOL call_watchdog, DWORD timeout)
INT cm_exist(const char *name, BOOL bUnique)
INT md_event_swap(INT fmt, void *pevt)
INT ss_getchar(BOOL reset)
INT ss_daemon_init(BOOL keep_stdout)
INT ss_sleep(INT millisec)
INT ss_system(const char *command)
INT cm_msg(INT message_type, const char *filename, INT line, const char *routine, const char *format,...)
BOOL equal_ustring(const char *str1, const char *str2)
INT db_send_changed_records()
INT db_get_value(HNDLE hDB, HNDLE hKeyRoot, const char *key_name, void *data, INT *buf_size, DWORD type, BOOL create)
INT db_open_record(HNDLE hDB, HNDLE hKey, void *ptr, INT rec_size, WORD access_mode, void(*dispatcher)(INT, INT, void *), void *info)
std::string strcomb1(const char **list)
INT db_get_data(HNDLE hDB, HNDLE hKey, void *data, INT *buf_size, DWORD type)
INT db_create_key(HNDLE hDB, HNDLE hKey, const char *key_name, DWORD type)
INT db_check_record(HNDLE hDB, HNDLE hKey, const char *keyname, const char *rec_str, BOOL correct)
INT db_get_record(HNDLE hDB, HNDLE hKey, void *data, INT *buf_size, INT align)
INT db_set_mode(HNDLE hDB, HNDLE hKey, WORD mode, BOOL recurse)
INT db_get_key(HNDLE hDB, HNDLE hKey, KEY *key)
INT db_set_value(HNDLE hDB, HNDLE hKeyRoot, const char *key_name, const void *data, INT data_size, INT num_values, DWORD type)
INT db_find_key(HNDLE hDB, HNDLE hKey, const char *key_name, HNDLE *subhKey)
INT db_set_record(HNDLE hDB, HNDLE hKey, void *data, INT buf_size, INT align)
INT db_enum_key(HNDLE hDB, HNDLE hKey, INT idx, HNDLE *subkey_handle)
INT db_create_record(HNDLE hDB, HNDLE hKey, const char *orig_key_name, const char *init_str)
INT rpc_send_event(INT buffer_handle, const EVENT_HEADER *pevent, int unused, INT async_flag, INT mode)
#define SERVER_CACHE_SIZE
INT max_event_size
maximum event size produced by this frontend
EBUILDER_CHANNEL ebch[MAX_CHANNELS]
void free_event_buffer(INT nfrag)
INT(* meb_fragment_add)(char *, char *, INT *)
INT event_buffer_size
buffer size to hold events
INT max_event_size_frag
maximum event size for fragmented events (EQ_FRAGMENTED)
INT tr_stop(INT rn, char *error)
INT eb_yfragment_add(char *pdest, char *psrce, INT *size)
INT tr_start(INT rn, char *error)
#define EQUIPMENT_STATISTICS_STR
char expt_name[NAME_LENGTH]
INT source_unbooking(void)
INT tr_pause(INT rn, char *error)
BOOL debug
debug printouts
char buffer_name[NAME_LENGTH]
INT eb_end_of_run(INT, char *)
INT eb_user(INT, BOOL mismatch, EBUILDER_CHANNEL *, EVENT_HEADER *, void *, INT *)
INT eb_mfragment_add(char *pdest, char *psrce, INT *size)
static int waiting_for_stop
EQUIPMENT equipment[]
Main structure for midas equipment.
INT eb_begin_of_run(INT, char *, char *)
INT register_equipment(void)
INT display_period
a frontend status page is displayed with this frequency in ms
INT tr_resume(INT rn, char *error)
INT source_scan(INT fmt, EQUIPMENT_INFO *eq_info)
char host_name[HOST_NAME_LENGTH]
const char * frontend_file_name
The frontend file name, don't change it.
const char * frontend_name
The frontend name (client name) as seen by other MIDAS clients.
INT bm_get_buffer_level(INT buffer_handle, INT *n_bytes)
#define DEFAULT_BUFFER_SIZE
#define EQUIPMENT_COMMON_STR
char frontend_file_name[256]
char frontend_host[NAME_LENGTH]
char frontend_name[NAME_LENGTH]