287 #define USE_EVENT_CHANNEL 1
288 #define SERVER_CACHE_SIZE 0
290 #undef USE_EVENT_CHANNEL
291 #define SERVER_CACHE_SIZE 100000
295 #define ODB_UPDATE_TIME 1000
297 #define DEFAULT_FE_TIMEOUT 60000
325 A1_BKTYPE, TID_CHAR, 1}, {
326 I1_BKTYPE, TID_BYTE, 1}, {
327 I2_BKTYPE, TID_WORD, 2}, {
328 I4_BKTYPE, TID_DWORD, 4}, {
329 F4_BKTYPE, TID_FLOAT, 4}, {
330 D8_BKTYPE, TID_DOUBLE, 8}, {
349 #define EQUIPMENT_COMMON_STR "\
350 Event ID = WORD : 0\n\
351 Trigger mask = WORD : 0\n\
352 Buffer = STRING : [32] SYSTEM\n\
355 Format = STRING : [8] FIXED\n\
356 Enabled = BOOL : 0\n\
359 Event limit = DOUBLE : 0\n\
360 Num subevents = DWORD : 0\n\
361 Log history = INT : 0\n\
362 Frontend host = STRING : [32] \n\
363 Frontend name = STRING : [32] \n\
364 Frontend file name = STRING : [256] \n\
367 #define EQUIPMENT_STATISTICS_STR "\
368 Events sent = DOUBLE : 0\n\
369 Events per sec. = DOUBLE : 0\n\
370 kBytes per sec. = DOUBLE : 0\n\
402 if (status == CM_SUCCESS) {
409 ss_printf(14, 2,
"Running ");
410 ss_printf(36, 2,
"%d", rn);
432 if (status == CM_SUCCESS) {
441 ss_printf(14, 2,
"Stopped ");
449 INT err = bm_flush_cache(
equipment[i].buffer_handle, SYNC);
450 if (err != BM_SUCCESS) {
451 cm_msg(MERROR,
"tr_prestop",
"bm_flush_cache(SYNC) error %d", err);
459 eq->stats.events_sent += eq->events_sent;
464 db_send_changed_records();
480 if (status == CM_SUCCESS) {
487 ss_printf(14, 2,
"Paused ");
502 if (status == CM_SUCCESS) {
509 ss_printf(14, 2,
"Running ");
532 EQUIPMENT_INFO *eq_info;
533 EQUIPMENT_STATS *eq_stats;
536 BOOL manual_trig_flag =
FALSE;
537 BANK_LIST *bank_list;
551 for (index = 0;
equipment[index].name[0]; index++) {
555 if (eq_info->event_id == 0) {
557 cm_disconnect_experiment();
566 if (eq_info->eq_type & EQ_EB) {
569 printf(
"\nEquipment \"%s\" has EQ_EB set, but no",
equipment[index].name);
570 printf(
" index specified via \"-i\" flag.\nExiting.");
571 cm_disconnect_experiment();
586 if (eq_info->eq_type != EQ_SLOW) {
587 db_find_key(
hDB, 0, str, &hKey);
588 size =
sizeof(double);
590 db_get_value(
hDB, hKey,
"Event limit", &eq_info->event_limit, &size,
596 if (status != DB_SUCCESS) {
597 printf(
"Cannot check equipment record, status = %d\n", status);
600 db_find_key(
hDB, 0, str, &hKey);
602 if (equal_ustring(eq_info->format,
"YBOS"))
604 else if (equal_ustring(eq_info->format,
"FIXED"))
609 gethostname(eq_info->frontend_host,
sizeof(eq_info->frontend_host));
614 db_set_record(
hDB, hKey, eq_info,
sizeof(EQUIPMENT_INFO), 0);
617 db_open_record(
hDB, hKey, eq_info,
sizeof(EQUIPMENT_INFO), MODE_READ, NULL, NULL);
622 if (
equipment[index].format == FORMAT_FIXED)
623 db_check_record(
hDB, 0, str, (
char *)
equipment[index].event_descrip,
TRUE);
626 bank_list = (BANK_LIST *)
equipment[index].event_descrip;
628 for (; bank_list->name[0]; bank_list++) {
634 if (bank_list->type == TID_STRUCT) {
638 db_check_record(
hDB, 0, str, strcomb(bank_list->init_str),
TRUE);
639 if (status != DB_SUCCESS) {
640 printf(
"Cannot check/create record \"%s\", status = %d\n", str,
648 db_set_value(
hDB, 0, str, &dummy, rpc_tid_size(bank_list->type), 1,
654 db_create_key(
hDB, 0, str, TID_KEY);
657 db_find_key(
hDB, 0, str, &hKey);
665 if (status != DB_SUCCESS) {
666 printf(
"Cannot create/check statistics record, error %d\n", status);
670 status = db_find_key(
hDB, 0, str, &hKey);
671 if (status != DB_SUCCESS) {
672 printf(
"Cannot find statistics record, error %d\n", status);
676 eq_stats->events_sent = 0;
677 eq_stats->events_per_sec = 0;
678 eq_stats->kbytes_per_sec = 0;
682 db_open_record(
hDB, hKey, eq_stats,
sizeof(EQUIPMENT_STATS), MODE_WRITE, NULL,
684 if (status != DB_SUCCESS) {
685 cm_msg(MERROR,
"register_equipment",
686 "Cannot open statistics record, error %d. Probably other FE is using it",
693 if (eq_info->buffer[0]) {
695 bm_open_buffer(eq_info->buffer, EVENT_BUFFER_SIZE,
697 if (status != BM_SUCCESS && status != BM_CREATED) {
698 cm_msg(MERROR,
"register_equipment",
699 "Cannot open event buffer. Try to reduce EVENT_BUFFER_SIZE in midas.h \
700 and rebuild the system.");
710 if (eq_info->eq_type & EQ_POLLED) {
719 start_time = ss_millitime();
726 count = (INT) ((
double) count * 100 / delta_time);
729 }
while (delta_time > 120 || delta_time < 80);
731 equipment[index].poll_count = (INT) ((
double) eq_info->period / 100 *
count);
738 if (eq_info->eq_type & EQ_INTERRUPT) {
742 if (
equipment[i].info.eq_type & EQ_POLLED) {
743 equipment[index].status = FE_ERR_DISABLED;
744 cm_msg(MINFO,
"register_equipment",
745 "Interrupt readout cannot be combined with polled readout");
748 if (
equipment[index].status != FE_ERR_DISABLED) {
749 if (eq_info->enabled) {
751 equipment[index].status = FE_ERR_DISABLED;
752 cm_msg(MINFO,
"register_equipment",
753 "Defined more than one equipment with interrupt readout");
761 equipment[index].status = FE_ERR_DISABLED;
762 cm_msg(MINFO,
"register_equipment",
763 "Equipment %s disabled in file \"frontend.c\"",
770 if (eq_info->eq_type & EQ_SLOW) {
772 for (i = 0;
equipment[index].driver[
i].name[0]; i++)
773 for (j = i + 1;
equipment[index].driver[j].name[0]; j++)
774 if (equal_ustring(
equipment[index].driver[i].name,
776 strcpy(str,
equipment[index].driver[i].name);
777 for (k = 0, n = 0;
equipment[index].driver[k].name[0]; k++)
778 if (equal_ustring(str,
equipment[index].driver[k].name))
785 if (eq_info->enabled)
788 equipment[index].status = FE_ERR_DISABLED;
789 cm_msg(MINFO,
"register_equipment",
790 "Equipment %s disabled in file \"frontend.c\"",
equipment[index].name);
794 if (
equipment[index].status != FE_SUCCESS)
799 if (eq_info->eq_type & EQ_MANUAL_TRIG) {
800 if (!manual_trig_flag)
803 manual_trig_flag =
TRUE;
822 DWORD *pyevt, bkname;
824 HNDLE hKeyRoot, hKeyl;
830 if (format == FORMAT_FIXED) {
831 if (db_set_record(
hDB, hKey, (
char *) (pevent + 1),
832 pevent->data_size, 0) != DB_SUCCESS)
833 cm_msg(MERROR,
"update_odb",
"event #%d size mismatch", pevent->event_id);
834 }
else if (format == FORMAT_MIDAS) {
835 pbh = (BANK_HEADER *) (pevent + 1);
841 size = bk_iterate32(pbh, &pbk32, &pdata);
844 bkname = *((
DWORD *) pbk32->name);
845 bktype = (
WORD) pbk32->type;
847 size = bk_iterate(pbh, &pbk, &pdata);
850 bkname = *((
DWORD *) pbk->name);
851 bktype = (
WORD) pbk->type;
855 if (rpc_tid_size(bktype & 0xFF))
856 n_data /= rpc_tid_size(bktype & 0xFF);
859 *((
DWORD *) name) = bkname;
862 if (bktype == TID_STRUCT) {
863 status = db_find_key(
hDB, hKey, name, &hKeyRoot);
864 if (status != DB_SUCCESS) {
865 cm_msg(MERROR,
"update_odb",
866 "please define bank %s in BANK_LIST in frontend.c", name);
872 status = db_enum_key(
hDB, hKeyRoot, i, &hKeyl);
873 if (status == DB_NO_MORE_SUBKEYS)
876 db_get_key(
hDB, hKeyl, &key);
879 if (key.type != TID_STRING && key.type != TID_LINK)
881 (
void *) VALIGN(pdata,
MIN(ss_get_struct_align(), key.item_size));
883 status = db_set_data(
hDB, hKeyl, pdata, key.item_size * key.num_values,
884 key.num_values, key.type);
885 if (status != DB_SUCCESS) {
886 cm_msg(MERROR,
"update_odb",
"cannot write %s to ODB", name);
891 pdata = (
char *) pdata + key.item_size * key.num_values;
896 db_set_value(
hDB, hKey, name, pdata, size, n_data, bktype & 0xFF);
900 }
else if (format == FORMAT_YBOS) {
902 YBOS_BANK_HEADER *pybkh;
905 pyevt = (
DWORD *) (pevent + 1);
909 ni4 = ybk_iterate(pyevt, &pybkh, &pydata);
910 if (pybkh == NULL || ni4 == 0)
914 tsize = odb_type = 0;
915 for (i = 0; id_map[0].ybos_type > 0; i++) {
916 if (pybkh->type == id_map[i].ybos_type) {
917 odb_type = id_map[
i].odb_type;
918 tsize = id_map[
i].tsize;
924 *((
DWORD *) name) = pybkh->name;
928 if (strncmp(name,
"EVID", 4) == 0)
932 if (pybkh->type == D8_BKTYPE)
934 if (pybkh->type == I2_BKTYPE)
936 if (pybkh->type == I1_BKTYPE || pybkh->type == A1_BKTYPE)
942 db_set_value(
hDB, hKey, name, pydata, size, ni4,
943 odb_type & 0xFF)) != DB_SUCCESS) {
944 printf(
"status:%i odb_type:%li name:%s ni4:%i size:%i tsize:%i\n", status,
945 odb_type, name, ni4, size, tsize);
946 for (i = 0; i < 6; i++) {
947 float * fpydata = (
float *) pydata;
948 printf(
"data: %f\n", *(fpydata)++);
955 rpc_set_option(-1, RPC_OTRANSPORT, RPC_TCP);
962 EQUIPMENT_INFO *eq_info;
963 EVENT_HEADER *pevent, *pfragment;
968 static void *frag_buffer = NULL;
973 if (eq_info->eq_type & EQ_FRAGMENTED) {
974 if (frag_buffer == NULL)
977 if (frag_buffer == NULL) {
978 cm_msg(MERROR,
"send_event",
979 "Not enough memory to allocate buffer for fragmented events");
983 pevent = frag_buffer;
986 pevent = dm_pointer_get();
987 if (pevent == NULL) {
988 cm_msg(MERROR,
"send_event",
"dm_pointer_get not returning valid pointer");
994 pevent->event_id = eq_info->event_id;
995 pevent->trigger_mask = eq_info->trigger_mask;
996 pevent->data_size = 0;
997 pevent->time_stamp = ss_time();
998 pevent->serial_number =
equipment[index].serial_number++;
1000 equipment[index].last_called = ss_millitime();
1003 *((EQUIPMENT **) (pevent + 1)) = &
equipment[index];
1004 pevent->data_size =
equipment[index].readout((
char *) (pevent + 1), 0);
1007 if (pevent->data_size) {
1008 if (eq_info->eq_type & EQ_FRAGMENTED) {
1011 cm_msg(MERROR,
"send_event",
1012 "Event size %ld larger than maximum size %d for frag. ev.",
1013 (
long) (pevent->data_size +
sizeof(EVENT_HEADER)),
1014 max_event_size_frag);
1015 return SS_NO_MEMORY;
1019 pfragment = dm_pointer_get();
1020 if (pfragment == NULL) {
1021 cm_msg(MERROR,
"send_event",
"dm_pointer_get not returning valid pointer");
1022 return SS_NO_MEMORY;
1026 memcpy(pfragment, pevent,
sizeof(EVENT_HEADER));
1027 pfragment->event_id |= EVENTID_FRAG1;
1030 pd = (
char *) (pfragment + 1);
1031 size = pevent->data_size;
1032 for (i = 0; i < 4; i++) {
1033 pd[
i] = (
unsigned char) (size & 0xFF);
1037 pfragment->data_size =
sizeof(
DWORD);
1039 pdata = (
char *) (pevent + 1);
1041 for (i = 0, sent = 0; sent < pevent->data_size; i++) {
1043 pfragment = dm_pointer_get();
1046 memcpy(pfragment, pevent,
sizeof(EVENT_HEADER));
1047 pfragment->event_id |= EVENTID_FRAG;
1050 size = pevent->data_size - sent;
1054 memcpy(pfragment + 1, pdata, size);
1055 pfragment->data_size =
size;
1062 #ifdef USE_EVENT_CHANNEL
1063 dm_pointer_increment(
equipment[index].buffer_handle,
1064 pfragment->data_size +
sizeof(EVENT_HEADER));
1067 status = bm_send_event(
equipment[index].buffer_handle, pfragment,
1068 pfragment->data_size +
sizeof(EVENT_HEADER), SYNC);
1069 if (status != BM_SUCCESS) {
1070 cm_msg(MERROR,
"send_event",
"bm_send_event(SYNC) error %d", status);
1078 #ifndef USE_EVENT_CHANNEL
1079 status = bm_flush_cache(
equipment[index].buffer_handle, SYNC);
1080 if (status != BM_SUCCESS) {
1081 cm_msg(MERROR,
"send_event",
"bm_flush_cache(SYNC) error %d", status);
1090 cm_msg(MERROR,
"send_event",
"Event size %ld larger than maximum size %d",
1091 (
long) (pevent->data_size +
sizeof(EVENT_HEADER)), max_event_size);
1092 return SS_NO_MEMORY;
1097 #ifdef USE_EVENT_CHANNEL
1098 dm_pointer_increment(
equipment[index].buffer_handle,
1099 pevent->data_size +
sizeof(EVENT_HEADER));
1102 status = bm_send_event(
equipment[index].buffer_handle, pevent,
1103 pevent->data_size +
sizeof(EVENT_HEADER), SYNC);
1104 if (status != BM_SUCCESS) {
1105 cm_msg(MERROR,
"send_event",
"bm_send_event(SYNC) error %d", status);
1108 status = bm_flush_cache(
equipment[index].buffer_handle, SYNC);
1109 if (status != BM_SUCCESS) {
1110 cm_msg(MERROR,
"send_event",
"bm_flush_cache(SYNC) error %d", status);
1118 if ((eq_info->read_on & RO_ODB) ||
1119 (eq_info->history > 0 && (eq_info->eq_type & ~EQ_SLOW))) {
1125 equipment[index].bytes_sent += pevent->data_size +
sizeof(EVENT_HEADER);
1134 #ifdef USE_EVENT_CHANNEL
1135 if ((status = dm_area_flush()) != CM_SUCCESS)
1136 cm_msg(MERROR,
"send_event",
"dm_area_flush: %i", status);
1141 status = bm_flush_cache(
equipment[i].buffer_handle, SYNC);
1142 if (status != BM_SUCCESS) {
1143 cm_msg(MERROR,
"send_event",
"bm_flush_cache(SYNC) error %d", status);
1155 EQUIPMENT_INFO *eq_info;
1161 if (!eq_info->enabled ||
equipment[i].status != FE_SUCCESS)
1164 if (transition == TR_START && (eq_info->read_on & RO_BOR) == 0)
1166 if (transition == TR_STOP && (eq_info->read_on & RO_EOR) == 0)
1168 if (transition == TR_PAUSE && (eq_info->read_on & RO_PAUSE) == 0)
1170 if (transition == TR_RESUME && (eq_info->read_on & RO_RESUME) == 0)
1183 interrupt_enabled = flag;
1186 if (interrupt_enabled)
1197 EVENT_HEADER *pevent;
1201 if ((pevent = dm_pointer_get()) == NULL)
1202 cm_msg(MERROR,
"interrupt_routine",
"interrupt, dm_pointer_get returned NULL");
1206 pevent->trigger_mask =
interrupt_eq->info.trigger_mask;
1207 pevent->data_size = 0;
1212 pevent->data_size =
interrupt_eq->readout((
char *) (pevent + 1), 0);
1215 if (pevent->data_size) {
1216 interrupt_eq->bytes_sent += pevent->data_size +
sizeof(EVENT_HEADER);
1220 #ifdef USE_EVENT_CHANNEL
1222 pevent->data_size +
sizeof(EVENT_HEADER));
1225 pevent->data_size +
sizeof(EVENT_HEADER), SYNC);
1234 pevent->data_size +
sizeof(EVENT_HEADER));
1250 memset(str,
' ', 159);
1254 msg = strchr(msg,
']') + 2;
1256 memcpy(str, msg, strlen(msg));
1257 ss_printf(0, 20, str);
1276 strcpy(str,
"<local>");
1280 "================================================================================");
1281 ss_printf(0, 2,
"Run status: %s",
1283 STATE_RUNNING ?
"Running" :
"Paused");
1284 ss_printf(25, 2,
"Run number %d ",
run_number);
1286 "================================================================================");
1288 "Equipment Status Events Events/sec Rate[kB/s] ODB->FE FE->ODB");
1290 "--------------------------------------------------------------------------------");
1292 ss_printf(0, i + 6,
"%s",
equipment[i].name);
1297 strcpy(str, ctime(&full_time) + 11);
1299 ss_printf(72, 0,
"%s", str);
1304 if ((status == 0 || status == FE_SUCCESS) &&
equipment[i].info.enabled)
1305 ss_printf(14, i + 6,
"OK ");
1307 ss_printf(14, i + 6,
"Disabled ");
1308 else if (status == FE_ERR_ODB)
1309 ss_printf(14, i + 6,
"ODB Error");
1310 else if (status == FE_ERR_HW)
1311 ss_printf(14, i + 6,
"HW Error ");
1312 else if (status == FE_ERR_DISABLED)
1313 ss_printf(14, i + 6,
"Disabled ");
1315 ss_printf(14, i + 6,
"Unknown ");
1317 if (
equipment[i].stats.events_sent > 1E9)
1318 ss_printf(25, i + 6,
"%1.3lfG ",
equipment[i].stats.events_sent / 1E9);
1319 else if (
equipment[i].stats.events_sent > 1E6)
1320 ss_printf(25, i + 6,
"%1.3lfM ",
equipment[i].stats.events_sent / 1E6);
1322 ss_printf(25, i + 6,
"%1.0lf ",
equipment[i].stats.events_sent);
1323 ss_printf(36, i + 6,
"%1.1lf ",
equipment[i].stats.events_per_sec);
1324 ss_printf(47, i + 6,
"%1.1lf ",
equipment[i].stats.kbytes_per_sec);
1325 ss_printf(58, i + 6,
"%ld ",
equipment[i].odb_in);
1326 ss_printf(69, i + 6,
"%ld ",
equipment[i].odb_out);
1330 ss_printf(0, i + 6,
"");
1340 HNDLE hKeyRoot,
hKey;
1342 if (db_find_key(
hDB, 0,
"/Logger/Channels", &hKeyRoot) == DB_SUCCESS) {
1344 status = db_enum_key(
hDB, hKeyRoot, i, &hKey);
1345 if (status == DB_NO_MORE_SUBKEYS)
1348 strcpy(str,
"MIDAS");
1350 db_get_value(
hDB, hKey,
"Settings/Format", str, &size, TID_STRING,
TRUE);
1352 if (equal_ustring(str,
"ROOT"))
1364 EQUIPMENT_INFO *eq_info;
1366 EVENT_HEADER *pevent;
1367 DWORD last_time_network = 0, last_time_display = 0, last_time_flush = 0, readout_start;
1370 BOOL buffer_done, flag, force_update =
FALSE;
1372 INT opt_max = 0, opt_index = 0, opt_tcp_size = 128, opt_cnt = 0;
1376 rpc_set_opt_tcp_size(1024);
1378 rpc_set_opt_tcp_size(NET_TCP_SIZE);
1389 for (index = 0;; index++) {
1391 eq_info = &eq->info;
1397 if (!eq_info->enabled)
1400 if (eq->status != FE_SUCCESS)
1404 if ((eq_info->eq_type & EQ_SLOW) && eq->status == FE_SUCCESS) {
1405 if (eq_info->event_limit > 0 &&
run_state == STATE_RUNNING) {
1407 eq->cd(CMD_IDLE, eq);
1411 eq->cd(CMD_IDLE, eq);
1414 if (
run_state == STATE_STOPPED && (eq_info->read_on & RO_STOPPED) == 0)
1416 if (
run_state == STATE_PAUSED && (eq_info->read_on & RO_PAUSED) == 0)
1418 if (
run_state == STATE_RUNNING && (eq_info->read_on & RO_RUNNING) == 0)
1422 if ((eq_info->eq_type & EQ_PERIODIC) || (eq_info->eq_type & EQ_SLOW)) {
1423 if (eq_info->period == 0)
1434 if (status != CM_SUCCESS) {
1435 cm_msg(MERROR,
"scheduler",
"send_event error %d", status);
1446 if (eq_info->eq_type & EQ_POLLED) {
1450 while ((source =
poll_event(eq_info->source, eq->poll_count,
FALSE)) > 0) {
1451 pevent = dm_pointer_get();
1452 if (pevent == NULL) {
1453 cm_msg(MERROR,
"scheduler",
1454 "polled, dm_pointer_get not returning valid pointer");
1455 status = SS_NO_MEMORY;
1460 pevent->event_id = eq_info->event_id;
1461 pevent->trigger_mask = eq_info->trigger_mask;
1462 pevent->data_size = 0;
1464 pevent->serial_number = eq->serial_number;
1469 *(INT *) (pevent + 1) = source;
1471 if (eq->info.num_subevents) {
1472 eq->subevent_number = 0;
1474 *(INT *) ((
char *) (pevent + 1) + pevent->data_size) = source;
1477 size = eq->readout((
char *) (pevent + 1), pevent->data_size);
1478 pevent->data_size +=
size;
1480 if (pevent->data_size +
sizeof(EVENT_HEADER) >
1481 (
DWORD) max_event_size) {
1482 cm_msg(MERROR,
"scheduler",
1483 "Event size %ld larger than maximum size %d",
1484 (
long) (pevent->data_size +
sizeof(EVENT_HEADER)),
1488 eq->subevent_number++;
1489 eq->serial_number++;
1496 if (source ==
FALSE) {
1503 }
while (source ==
FALSE);
1505 }
while (eq->subevent_number < eq->info.num_subevents && source);
1508 pevent->data_size = eq->readout((
char *) (pevent + 1), -1);
1511 pevent->data_size = eq->readout((
char *) (pevent + 1), 0);
1514 if (pevent->data_size +
sizeof(EVENT_HEADER) > (
DWORD) max_event_size) {
1515 cm_msg(MERROR,
"scheduler",
1516 "Event size %ld larger than maximum size %d",
1517 (
long) (pevent->data_size +
sizeof(EVENT_HEADER)),
1522 if (pevent->data_size)
1523 eq->serial_number++;
1527 if (pevent->data_size) {
1528 if (eq->buffer_handle) {
1530 if (pevent->serial_number == 1)
1532 update_odb(pevent, eq->hkey_variables, eq->format);
1534 #ifdef USE_EVENT_CHANNEL
1535 dm_pointer_increment(eq->buffer_handle,
1536 pevent->data_size +
sizeof(EVENT_HEADER));
1538 status = rpc_send_event(eq->buffer_handle, pevent,
1539 pevent->data_size +
sizeof(EVENT_HEADER),
1543 cm_msg(MERROR,
"scheduler",
"rpc_send_event error %d", status);
1548 eq->bytes_sent += pevent->data_size +
sizeof(EVENT_HEADER);
1550 if (eq->info.num_subevents)
1551 eq->events_sent += eq->subevent_number;
1564 if (eq_info->event_limit > 0 &&
1565 eq->stats.events_sent + eq->events_sent >= eq_info->event_limit)
1570 if (pevent && (eq_info->read_on & RO_ODB || eq_info->history)) {
1573 update_odb(pevent, eq->hkey_variables, eq->format);
1580 if (eq_info->eq_type & EQ_INTERRUPT) {
1593 if (eq_info->eq_type != EQ_SLOW &&
1594 eq_info->event_limit > 0 &&
1595 eq->stats.events_sent + eq->events_sent >= eq_info->event_limit &&
1598 if (cm_transition(TR_STOP, 0, str,
sizeof(str), SYNC,
FALSE) != CM_SUCCESS)
1599 cm_msg(MERROR,
"scheduler",
"cannot stop run: %s", str);
1602 size =
sizeof(BOOL);
1604 db_get_value(
hDB, 0,
"/Logger/Auto restart", &flag, &size, TID_BOOL,
TRUE);
1610 force_update =
TRUE;
1617 if (status != CM_SUCCESS)
1618 status = RPC_SHUTDOWN;
1622 cm_check_deferred_transition();
1629 status = BM_INVALID_PARAM;
1638 if (status != CM_SUCCESS) {
1639 cm_msg(MERROR,
"scheduler",
"send_event error %d", status);
1652 force_update =
FALSE;
1659 eq->stats.events_sent += eq->events_sent;
1660 eq->stats.events_per_sec =
1662 eq->stats.kbytes_per_sec =
1670 eq->events_sent = 0;
1680 ss_printf(0, opt_index,
"%6d : %5.1lf %5.1lf", opt_tcp_size,
1681 opt_max / 1024.0, max_bytes_per_sec / 1024.0);
1682 if (++opt_cnt == 10) {
1686 opt_tcp_size = 1 << (opt_index + 7);
1687 rpc_set_opt_tcp_size(opt_tcp_size);
1688 if (1 << (opt_index + 7) > 0x8000) {
1690 opt_tcp_size = 1 << 7;
1691 rpc_set_opt_tcp_size(opt_tcp_size);
1699 rpc_set_option(-1, RPC_OTRANSPORT, RPC_FTCP);
1700 db_send_changed_records();
1701 rpc_set_option(-1, RPC_OTRANSPORT, RPC_TCP);
1703 if (display_period) {
1709 while (ss_kbhit()) {
1715 status = RPC_SHUTDOWN;
1720 if (status == RPC_SHUTDOWN)
1737 #ifdef USE_EVENT_CHANNEL
1738 if ((status = dm_area_flush()) != CM_SUCCESS)
1739 cm_msg(MERROR,
"scheduler",
"dm_area_flush: %i", status);
1745 buffer_done =
FALSE;
1746 for (j = 0; j <
i; j++)
1753 rpc_set_option(-1, RPC_OTRANSPORT, RPC_FTCP);
1755 err = bm_flush_cache(
equipment[i].buffer_handle, ASYNC);
1756 if (err != BM_SUCCESS) {
1757 cm_msg(MERROR,
"scheduler",
"bm_flush_cache(ASYNC) error %d",
1761 rpc_set_option(-1, RPC_OTRANSPORT, RPC_TCP);
1772 size =
sizeof(state);
1773 status = db_get_value(
hDB, 0,
"Runinfo/State", &state, &size, TID_INT,
TRUE);
1774 if (status != DB_SUCCESS)
1775 cm_msg(MERROR,
"scheduler",
"cannot get Runinfo/State in database");
1777 if (state == STATE_STOPPED) {
1781 db_get_value(
hDB, 0,
"/Runinfo/Run number", &
run_number, &size, TID_INT,
1786 cm_msg(MERROR,
"main",
"aborting on attempt to use invalid run number %d",
1791 cm_msg(MTALK,
"main",
"starting new run");
1792 status = cm_transition(TR_START,
run_number + 1, NULL, 0, SYNC,
FALSE);
1793 if (status != CM_SUCCESS)
1794 cm_msg(MERROR,
"main",
"cannot restart run");
1802 status = cm_yield(0);
1805 status = RPC_SUCCESS;
1809 status = cm_yield(100);
1813 status = RPC_SHUTDOWN;
1815 }
while (status != RPC_SHUTDOWN && status != SS_ABORT);
1828 DWORD cmd, b,
c, n, a, f, *pdword, *
size, *x, *q, dtemp;
1829 WORD *pword, *pdata, temp;
1839 pdword = CPDWORD(6);
1847 if (index == RPC_CNAF16)
1848 count = *size /
sizeof(
WORD);
1850 count = *size /
sizeof(
DWORD);
1855 case CNAF_INHIBIT_SET:
1858 case CNAF_INHIBIT_CLEAR:
1861 case CNAF_CRATE_CLEAR:
1864 case CNAF_CRATE_ZINIT:
1872 if (index == RPC_CNAF16) {
1873 for (i = 0; i <
count; i++)
1875 cam16i_q(c, n, a, f, pword++, (
int *) x, (
int *) q);
1877 cam16o_q(c, n, a, f, pword[i], (
int *) x, (
int *) q);
1879 cam16i_q(c, n, a, f, &temp, (
int *) x, (
int *) q);
1881 for (i = 0; i <
count; i++)
1883 cam24i_q(c, n, a, f, pdword++, (
int *) x, (
int *) q);
1885 cam24o_q(c, n, a, f, pdword[i], (
int *) x, (
int *) q);
1887 cam24i_q(c, n, a, f, &dtemp, (
int *) x, (
int *) q);
1893 if (index == RPC_CNAF16) {
1902 *size = (int) pdword - (
int) pdata;
1906 printf(
"cnaf: Unknown command 0x%X\n", (
unsigned int) cmd);
1910 if (index == RPC_CNAF16)
1911 printf(
"cmd=%d r=%d c=%d n=%d a=%d f=%d d=%X x=%d q=%d\n",
1912 (
int) cmd, (
int) count, (
int) c, (
int) n, (
int) a, (
int) f,
1913 (
int) pword[0], (
int) *x, (
int) *q);
1914 else if (index == RPC_CNAF24)
1915 printf(
"cmd=%d r=%d c=%d n=%d a=%d f=%d d=%X x=%d q=%d\n",
1916 (
int) cmd, (
int) count, (
int) c, (
int) n, (
int) a, (
int) f,
1917 (
int) pdword[0], (
int) *x, (
int) *q);
1936 int mfe(
char *ahost_name,
char *aexp_name, BOOL adebug)
1953 signal(SIGPIPE, SIG_IGN);
1968 for (i = 1; i < argc; i++) {
1969 if (argv[i][0] ==
'-' && argv[i][1] ==
'd')
1971 else if (argv[i][0] ==
'-' && argv[i][1] ==
'D')
1973 else if (argv[i][0] ==
'-' && argv[i][1] ==
'O')
1975 else if (argv[i][0] ==
'-') {
1976 if (i + 1 >= argc || argv[i + 1][0] ==
'-')
1978 if (argv[i][1] ==
'e')
1980 else if (argv[i][1] ==
'h')
1982 else if (argv[i][1] ==
'i')
1986 printf(
"usage: frontend [-h Hostname] [-e Experiment] [-d] [-D] [-O] [-i n]\n");
1987 printf(
" [-d] Used to debug the frontend\n");
1988 printf(
" [-D] Become a daemon\n");
1989 printf(
" [-O] Become a daemon but keep stdout\n");
1990 printf(
" [-i n] Set frontend index (used for event building)\n");
1997 #ifdef PART_OF_MUCAP
2003 printf(
"event_buffer_size too small for max. event size\n");
2008 if (max_event_size > MAX_EVENT_SIZE) {
2009 printf(
"Requested max_event_size (%d) exceeds max. system event size (%d)",
2010 max_event_size, MAX_EVENT_SIZE);
2020 dm_size = 2 * 10 * (max_event_size +
sizeof(EVENT_HEADER) +
sizeof(INT));
2021 if (dm_size > memFindMax()) {
2022 cm_msg(MERROR,
"mainFE",
"Not enough mem space for event size");
2026 dm_size = 0.2 * memFindMax();
2034 if (dm_size > 0x4000)
2046 printf(
"Buffer allocation : 2 x %d\n", dm_size);
2047 printf(
"System max event size : %d\n", MAX_EVENT_SIZE);
2048 printf(
"User max event size : %d\n", max_event_size);
2049 if (max_event_size_frag > 0)
2050 printf(
"User max frag. size : %d\n", max_event_size_frag);
2051 printf(
"# of events per buffer : %d\n\n", dm_size / max_event_size);
2054 printf(
"\nBecoming a daemon...\n");
2055 ss_daemon_init(daemon == 2);
2068 if (status != CM_SUCCESS) {
2078 status = dm_buffer_create(dm_size, max_event_size);
2079 if (status != CM_SUCCESS) {
2080 printf(
"dm_buffer_create: Not enough memory or event too big\n");
2090 printf(
"Previous frontend stopped\n");
2102 printf(
"Failed to start local RPC server");
2103 cm_disconnect_experiment();
2104 dm_buffer_release();
2118 cm_get_experiment_database(&
hDB, &status);
2122 cm_synchronize(NULL);
2127 cm_set_watchdog_params(
TRUE, 0);
2130 rpc_set_option(-1, RPC_OTIMEOUT, 120000);
2138 printf(
"Init hardware...");
2142 cm_disconnect_experiment();
2143 dm_buffer_release();
2154 cm_disconnect_experiment();
2155 dm_buffer_release();
2205 cm_disconnect_experiment();
2208 if (status == RPC_SHUTDOWN) {
2210 ss_printf(0, 0,
"Frontend shut down.");
2211 ss_printf(0, 1,
"");
2215 if (status != RPC_SHUTDOWN)
2216 printf(
"Network connection aborted.\n");
2218 dm_buffer_release();