303 extern EVENT_HEADER *pvic_pointer_get();
304 extern INT pvic_send_event(INT buffer_handle,
void *source, INT buf_size,
312 #define USE_EVENT_CHANNEL 1
316 #define SERVER_CACHE_SIZE 0
318 #define ODB_UPDATE_TIME 1000
320 #define DEFAULT_FE_TIMEOUT 60000
344 {A1_BKTYPE, TID_CHAR, 1},
345 {I1_BKTYPE, TID_BYTE, 1},
346 {I2_BKTYPE, TID_WORD, 2},
347 {I4_BKTYPE, TID_DWORD, 4},
348 {F4_BKTYPE, TID_FLOAT, 4},
349 {D8_BKTYPE, TID_DOUBLE, 8},
368 #define EQUIPMENT_COMMON_STR "\
369 Event ID = WORD : 0\n\
370 Trigger mask = WORD : 0\n\
371 Buffer = STRING : [32] SYSTEM\n\
374 Format = STRING : [8] FIXED\n\
375 Enabled = BOOL : 0\n\
378 Event limit = DOUBLE : 0\n\
379 Num subevents = DWORD : 0\n\
380 Log history = INT : 0\n\
381 Frontend host = STRING : [32] \n\
382 Frontend name = STRING : [32] \n\
383 Frontend file name = STRING : [256] \n\
386 #define EQUIPMENT_STATISTICS_STR "\
387 Events sent = DOUBLE : 0\n\
388 Events per sec. = DOUBLE : 0\n\
389 kBytes per sec. = DOUBLE : 0\n\
420 if (status == CM_SUCCESS)
429 ss_printf(14, 2,
"Running ");
430 ss_printf(36, 2,
"%d", rn);
451 if (status == CM_SUCCESS)
461 ss_printf(14, 2,
"Stopped ");
471 INT err = bm_flush_cache(
equipment[i].buffer_handle, SYNC);
472 if (err != BM_SUCCESS)
474 cm_msg(MERROR,
"tr_prestop",
"bm_flush_cache(SYNC) error %d",err);
493 if (status == CM_SUCCESS)
501 ss_printf(14, 2,
"Paused ");
517 if (status == CM_SUCCESS)
525 ss_printf(14, 2,
"Running ");
543 if (
equipment[i].info.event_id == event_id)
558 EQUIPMENT_INFO *eq_info;
559 EQUIPMENT_STATS *eq_stats;
562 BOOL manual_trig_flag =
FALSE;
563 BANK_LIST *bank_list;
575 for (index=0 ;
equipment[index].name[0] ; index++)
580 if (eq_info->event_id == 0)
592 if (eq_info->eq_type != EQ_SLOW)
594 db_find_key(
hDB, 0, str, &hKey);
595 size =
sizeof(double);
597 db_get_value(
hDB, hKey,
"Event limit", &eq_info->event_limit, &size, TID_DOUBLE,
TRUE);
602 if (status != DB_SUCCESS)
604 printf(
"Cannot init equipment record, probably other FE is using it\n");
607 db_find_key(
hDB, 0, str, &hKey);
609 if (equal_ustring(eq_info->format,
"YBOS"))
611 else if (equal_ustring(eq_info->format,
"FIXED"))
616 gethostname(eq_info->frontend_host,
sizeof(eq_info->frontend_host));
621 db_set_record(
hDB, hKey, eq_info,
sizeof(EQUIPMENT_INFO), 0);
624 db_open_record(
hDB, hKey, eq_info,
sizeof(EQUIPMENT_INFO), MODE_READ, NULL, NULL);
630 if (
equipment[index].format == FORMAT_FIXED)
631 db_create_record(
hDB, 0, str, (
char *)
equipment[index].event_descrip);
635 bank_list = (BANK_LIST *)
equipment[index].event_descrip;
637 for (; bank_list->name[0] ; bank_list++)
644 if (bank_list->type == TID_STRUCT)
646 sprintf(str,
"/Equipment/%s/Variables/%s",
equipment[index].name, bank_list->name);
647 db_create_record(
hDB, 0, str, strcomb(bank_list->init_str));
651 sprintf(str,
"/Equipment/%s/Variables/%s",
equipment[index].name, bank_list->name);
653 db_set_value(
hDB, 0, str, &dummy, rpc_tid_size(bank_list->type), 1, bank_list->type);
659 db_create_key(
hDB, 0, str, TID_KEY);
662 db_find_key(
hDB, 0, str, &hKey);
671 status = db_find_key(
hDB, 0, str, &hKey);
672 if (status == DB_SUCCESS)
674 status = db_delete_key(
hDB, hKey,
FALSE);
675 if (status != DB_SUCCESS)
677 printf(
"Cannot delete statistics record, error %d\n",status);
683 if (status != DB_SUCCESS)
685 printf(
"Cannot create statistics record, error %d\n",status);
689 status = db_find_key(
hDB, 0, str, &hKey);
690 if (status != DB_SUCCESS)
692 printf(
"Cannot find statistics record, error %d\n",status);
696 eq_stats->events_sent = 0;
697 eq_stats->events_per_sec = 0;
698 eq_stats->kbytes_per_sec = 0;
701 status = db_open_record(
hDB, hKey, eq_stats,
sizeof(EQUIPMENT_STATS), MODE_WRITE, NULL, NULL);
702 if (status != DB_SUCCESS)
704 printf(
"Cannot open statistics record, error %d. Probably other FE is using it\n",status);
709 if (eq_info->buffer[0])
711 status = bm_open_buffer(eq_info->buffer, EVENT_BUFFER_SIZE, &
equipment[index].buffer_handle);
712 if (status != BM_SUCCESS && status != BM_CREATED)
714 cm_msg(MERROR,
"register_equipment",
715 "Cannot open event buffer. Try to reduce EVENT_BUFFER_SIZE in midas.h \
716 and rebuild the system.");
727 if (eq_info->eq_type & EQ_POLLED)
738 start_time = ss_millitime();
745 count = (INT) ((
double) count * 100 / delta_time);
748 }
while (delta_time > 120 || delta_time < 80);
750 equipment[index].poll_count = (INT) ((
double) eq_info->period / 100 *
count);
757 if (eq_info->eq_type & EQ_INTERRUPT)
762 if (
equipment[i].info.eq_type & EQ_POLLED)
764 equipment[index].status = FE_ERR_DISABLED;
765 cm_msg(MINFO,
"register_equipment",
766 "Interrupt readout cannot be combined with polled readout");
769 if (
equipment[index].status != FE_ERR_DISABLED)
771 if (eq_info->enabled)
775 equipment[index].status = FE_ERR_DISABLED;
776 cm_msg(MINFO,
"register_equipment",
777 "Defined more than one equipment with interrupt readout");
788 equipment[index].status = FE_ERR_DISABLED;
789 cm_msg(MINFO,
"register_equipment",
"Equipment %s disabled in file \"frontend.c\"",
796 if (eq_info->eq_type & EQ_SLOW)
799 for (i=0 ;
equipment[index].driver[
i].name[0] ; i++)
800 for (j=i+1 ;
equipment[index].driver[j].name[0] ; j++)
801 if (equal_ustring(
equipment[index].driver[i].name,
804 strcpy(str,
equipment[index].driver[i].name);
805 for (k=0,n=0 ;
equipment[index].driver[k].name[0] ; k++)
806 if (equal_ustring(str,
equipment[index].driver[k].name))
813 if (eq_info->enabled)
817 equipment[index].status = FE_ERR_DISABLED;
818 cm_msg(MINFO,
"register_equipment",
"Equipment %s disabled in file \"frontend.c\"",
823 if (
equipment[index].status != FE_SUCCESS)
828 if (eq_info->eq_type & EQ_MANUAL_TRIG)
830 if (!manual_trig_flag)
833 manual_trig_flag =
TRUE;
852 DWORD *pyevt, bkname;
854 HNDLE hKeyRoot, hKeyl;
860 if (format == FORMAT_FIXED)
862 if (db_set_record(
hDB, hKey, (
char *) (pevent+1),
863 pevent->data_size, 0) != DB_SUCCESS)
864 cm_msg(MERROR,
"update_odb",
"event #%d size mismatch", pevent->event_id);
866 else if (format == FORMAT_MIDAS)
868 pbh = (BANK_HEADER *) (pevent+1);
876 size = bk_iterate32(pbh, &pbk32, &pdata);
879 bkname = *((
DWORD *) pbk32->name);
880 bktype = (
WORD) pbk32->type;
884 size = bk_iterate(pbh, &pbk, &pdata);
887 bkname = *((
DWORD *) pbk->name);
888 bktype = (
WORD) pbk->type;
892 if (rpc_tid_size(bktype & 0xFF))
893 n_data /= rpc_tid_size(bktype & 0xFF);
896 *((
DWORD *) name) = bkname;
899 if (bktype == TID_STRUCT)
901 status = db_find_key(
hDB, hKey, name, &hKeyRoot);
902 if (status != DB_SUCCESS)
904 cm_msg(MERROR,
"update_odb",
"please define bank %s in BANK_LIST in frontend.c", name);
911 status = db_enum_key(
hDB, hKeyRoot, i, &hKeyl);
912 if (status == DB_NO_MORE_SUBKEYS)
915 db_get_key(
hDB, hKeyl, &key);
918 if (key.type != TID_STRING && key.type != TID_LINK)
919 pdata = (
void *) VALIGN(pdata,
MIN(ss_get_struct_align(), key.item_size));
921 status = db_set_data(
hDB, hKeyl, pdata, key.item_size*key.num_values,
922 key.num_values, key.type);
923 if (status != DB_SUCCESS)
925 cm_msg(MERROR,
"update_odb",
"cannot write %s to ODB", name);
930 (
char *) pdata += key.item_size*key.num_values;
937 db_set_value(
hDB, hKey, name, pdata, size, n_data, bktype & 0xFF);
942 else if (format == FORMAT_YBOS)
945 YBOS_BANK_HEADER *pybkh;
948 pyevt = (
DWORD *) (pevent+1);
953 ni4 = ybk_iterate(pyevt, &pybkh, &pydata);
954 if (pybkh == NULL || ni4 == 0)
958 tsize = odb_type = 0;
959 for (i=0;id_map[0].ybos_type > 0; i++)
961 if (pybkh->type == id_map[i].ybos_type)
963 odb_type = id_map[
i].odb_type;
964 tsize = id_map[
i].tsize;
970 *((
DWORD *)name) = pybkh->name;
974 if (strncmp(name,
"EVID", 4) == 0)
978 if (pybkh->type == D8_BKTYPE)
980 if (pybkh->type == I2_BKTYPE)
982 if (pybkh->type == I1_BKTYPE || pybkh->type == A1_BKTYPE)
987 if ((status = db_set_value(
hDB, hKey, name, pydata, size, ni4, odb_type & 0xFF)) != DB_SUCCESS)
989 printf(
"status:%i odb_type:%li name:%s ni4:%i size:%i tsize:%i\n",
990 status, odb_type, name, ni4, size, tsize);
992 printf(
"data: %f\n",*((
float *)(pydata))++);
998 rpc_set_option(-1, RPC_OTRANSPORT, RPC_TCP);
1005 EQUIPMENT_INFO *eq_info;
1006 EVENT_HEADER *pevent, *pfragment;
1011 static void *frag_buffer = NULL;
1016 if (eq_info->eq_type & EQ_FRAGMENTED)
1018 if (frag_buffer == NULL)
1021 if (frag_buffer == NULL)
1023 cm_msg(MERROR,
"send_event",
"Not enough memory to allocate buffer for fragmented events");
1024 return SS_NO_MEMORY;
1027 pevent = frag_buffer;
1032 pevent = dm_pointer_get();
1035 cm_msg(MERROR,
"send_event",
"dm_pointer_get not returning valid pointer");
1036 return SS_NO_MEMORY;
1041 pevent->event_id = eq_info->event_id;
1042 pevent->trigger_mask = eq_info->trigger_mask;
1043 pevent->data_size = 0;
1044 pevent->time_stamp = ss_time();
1045 pevent->serial_number =
equipment[index].serial_number++;
1047 equipment[index].last_called = ss_millitime();
1050 *((EQUIPMENT **)(pevent+1)) = &
equipment[index];
1051 pevent->data_size =
equipment[index].readout((
char *) (pevent+1), 0);
1054 if (pevent->data_size)
1056 if (eq_info->eq_type & EQ_FRAGMENTED)
1062 cm_msg(MERROR,
"send_event",
"Event size %ld larger than maximum size %d for frag. ev.",
1063 (
long)(pevent->data_size+
sizeof(EVENT_HEADER)), max_event_size_frag);
1064 return SS_NO_MEMORY;
1068 pfragment = dm_pointer_get();
1069 if (pfragment == NULL)
1071 cm_msg(MERROR,
"send_event",
"dm_pointer_get not returning valid pointer");
1072 return SS_NO_MEMORY;
1076 memcpy(pfragment, pevent,
sizeof(EVENT_HEADER));
1077 pfragment->event_id |= EVENTID_FRAG1;
1080 pd = (
char *)(pfragment+1);
1081 size = pevent->data_size;
1082 for (i=0 ; i<4 ; i++)
1084 pd[
i] = (
unsigned char)(size & 0xFF);
1088 pfragment->data_size =
sizeof(
DWORD);
1090 pdata=(
char *)(pevent+1);
1092 for (i=0,sent=0 ; sent<pevent->data_size ; i++)
1096 pfragment = dm_pointer_get();
1099 memcpy(pfragment, pevent,
sizeof(EVENT_HEADER));
1100 pfragment->event_id |= EVENTID_FRAG;
1103 size = pevent->data_size - sent;
1107 memcpy(pfragment+1, pdata, size);
1108 pfragment->data_size =
size;
1116 #ifdef USE_EVENT_CHANNEL
1117 dm_pointer_increment(
equipment[index].buffer_handle,
1118 pfragment->data_size +
sizeof(EVENT_HEADER));
1121 status = bm_send_event(
equipment[index].buffer_handle, pfragment,
1122 pfragment->data_size +
sizeof(EVENT_HEADER), SYNC);
1123 if (status != BM_SUCCESS)
1125 cm_msg(MERROR,
"send_event",
"bm_send_event(SYNC) error %d", status);
1133 #ifndef USE_EVENT_CHANNEL
1134 status = bm_flush_cache(
equipment[index].buffer_handle, SYNC);
1135 if (status != BM_SUCCESS)
1137 cm_msg(MERROR,
"send_event",
"bm_flush_cache(SYNC) error %d", status);
1149 cm_msg(MERROR,
"send_event",
"Event size %ld larger than maximum size %d",
1150 (
long)(pevent->data_size+
sizeof(EVENT_HEADER)), max_event_size);
1151 return SS_NO_MEMORY;
1157 #ifdef USE_EVENT_CHANNEL
1158 dm_pointer_increment(
equipment[index].buffer_handle,
1159 pevent->data_size +
sizeof(EVENT_HEADER));
1162 status = bm_send_event(
equipment[index].buffer_handle, pevent,
1163 pevent->data_size +
sizeof(EVENT_HEADER), SYNC);
1164 if (status != BM_SUCCESS)
1166 cm_msg(MERROR,
"send_event",
"bm_send_event(SYNC) error %d",status);
1169 status = bm_flush_cache(
equipment[index].buffer_handle, SYNC);
1170 if (status != BM_SUCCESS)
1172 cm_msg(MERROR,
"send_event",
"bm_flush_cache(SYNC) error %d",status);
1180 if ((eq_info->read_on & RO_ODB) ||
1181 (eq_info->history > 0 && (eq_info->eq_type & ~EQ_SLOW)))
1188 equipment[index].bytes_sent += pevent->data_size +
sizeof(EVENT_HEADER);
1198 #ifdef USE_EVENT_CHANNEL
1199 if ((status = dm_area_flush()) != CM_SUCCESS)
1200 cm_msg(MERROR,
"send_event",
"dm_area_flush: %i", status);
1206 status = bm_flush_cache(
equipment[i].buffer_handle, SYNC);
1207 if (status != BM_SUCCESS)
1209 cm_msg(MERROR,
"send_event",
"bm_flush_cache(SYNC) error %d", status);
1221 EQUIPMENT_INFO *eq_info;
1228 if (!eq_info->enabled ||
equipment[i].status != FE_SUCCESS)
1231 if (transition == TR_START && (eq_info->read_on & RO_BOR) == 0)
1233 if (transition == TR_STOP && (eq_info->read_on & RO_EOR) == 0)
1235 if (transition == TR_PAUSE && (eq_info->read_on & RO_PAUSE) == 0)
1237 if (transition == TR_RESUME && (eq_info->read_on & RO_RESUME) == 0)
1265 EVENT_HEADER *pevent;
1270 if ((pevent = dm_pointer_get()) == NULL)
1271 cm_msg(MERROR,
"interrupt_routine",
"interrupt, dm_pointer_get returned NULL");
1273 if ((pevent = pvic_pointer_get()) == NULL)
1274 cm_msg(MERROR,
"interrupt_routine",
"interrupt, pvic_pointer_get returned NULL");
1279 pevent->trigger_mask =
interrupt_eq->info.trigger_mask;
1280 pevent->data_size = 0;
1285 pevent->data_size =
interrupt_eq->readout((
char *) (pevent+1), 0);
1288 if (pevent->data_size)
1290 interrupt_eq->bytes_sent += pevent->data_size +
sizeof(EVENT_HEADER);
1295 #ifdef USE_EVENT_CHANNEL
1297 pevent->data_size +
sizeof(EVENT_HEADER));
1301 pevent->data_size +
sizeof(EVENT_HEADER), SYNC);
1304 pevent->data_size +
sizeof(EVENT_HEADER), SYNC);
1333 memset(str,
' ', 159);
1337 msg = strchr(msg,
']')+2;
1339 memcpy(str, msg, strlen(msg));
1340 ss_printf(0, 20, str);
1360 strcpy(str,
"<local>");
1362 ss_printf(0, 0,
"%s connected to %s. Press \"!\" to exit",
frontend_name, str);
1363 ss_printf(0, 1,
"================================================================================");
1364 ss_printf(0, 2,
"Run status: %s",
run_state == STATE_STOPPED ?
"Stopped" :
1365 run_state == STATE_RUNNING ?
"Running" :
1367 ss_printf(25,2,
"Run number %d ",
run_number);
1368 ss_printf(0, 3,
"================================================================================");
1369 ss_printf(0, 4,
"Equipment Status Events Events/sec Rate[kB/s] ODB->FE FE->ODB");
1370 ss_printf(0, 5,
"--------------------------------------------------------------------------------");
1372 ss_printf(0, i+6,
"%s",
equipment[i].name);
1377 strcpy(str, ctime(&full_time)+11);
1379 ss_printf(72, 0,
"%s", str);
1385 if ((status == 0 || status == FE_SUCCESS) &&
1387 ss_printf(14, i+6,
"OK ");
1389 ss_printf(14, i+6,
"Disabled ");
1390 else if (status == FE_ERR_ODB)
1391 ss_printf(14, i+6,
"ODB Error");
1392 else if (status == FE_ERR_HW)
1393 ss_printf(14, i+6,
"HW Error ");
1394 else if (status == FE_ERR_DISABLED)
1395 ss_printf(14, i+6,
"Disabled ");
1397 ss_printf(14, i+6,
"Unknown ");
1399 if (
equipment[i].stats.events_sent > 1E9)
1400 ss_printf(25, i+6,
"%1.3lfG ",
equipment[i].stats.events_sent/1E9);
1401 else if (
equipment[i].stats.events_sent > 1E6)
1402 ss_printf(25, i+6,
"%1.3lfM ",
equipment[i].stats.events_sent/1E6);
1404 ss_printf(25, i+6,
"%1.0lf ",
equipment[i].stats.events_sent);
1405 ss_printf(36, i+6,
"%1.1lf ",
equipment[i].stats.events_per_sec);
1406 ss_printf(47, i+6,
"%1.1lf ",
equipment[i].stats.kbytes_per_sec);
1407 ss_printf(58, i+6,
"%ld ",
equipment[i].odb_in);
1408 ss_printf(69, i+6,
"%ld ",
equipment[i].odb_out);
1412 ss_printf(0, i+6,
"");
1422 HNDLE hKeyRoot,
hKey;
1424 if (db_find_key(
hDB, 0,
"/Logger/Channels", &hKeyRoot) == DB_SUCCESS)
1428 status = db_enum_key(
hDB, hKeyRoot, i, &hKey);
1429 if (status == DB_NO_MORE_SUBKEYS)
1432 strcpy(str,
"MIDAS");
1434 db_get_value(
hDB, hKey,
"Settings/Format", str, &size, TID_STRING,
TRUE);
1436 if (equal_ustring(str,
"ROOT"))
1448 EQUIPMENT_INFO *eq_info;
1450 EVENT_HEADER *pevent;
1451 DWORD last_time_network=0, last_time_display=0,
1452 last_time_flush=0, readout_start;
1455 BOOL buffer_done, flag, force_update =
FALSE;
1457 INT opt_max=0, opt_index=0, opt_tcp_size=128, opt_cnt=0;
1461 rpc_set_opt_tcp_size(1024);
1463 rpc_set_opt_tcp_size(NET_TCP_SIZE);
1475 for (index=0 ; ; index++)
1478 eq_info = &eq->info;
1484 if (!eq_info->enabled)
1487 if (eq->status != FE_SUCCESS)
1491 if ((eq_info->eq_type & EQ_SLOW) &&
1492 eq->status == FE_SUCCESS)
1494 if (eq_info->event_limit>0 &&
run_state == STATE_RUNNING)
1498 eq->cd(CMD_IDLE, eq);
1503 eq->cd(CMD_IDLE, eq);
1506 if (
run_state == STATE_STOPPED && (eq_info->read_on & RO_STOPPED) == 0)
1508 if (
run_state == STATE_PAUSED && (eq_info->read_on & RO_PAUSED) == 0)
1510 if (
run_state == STATE_RUNNING && (eq_info->read_on & RO_RUNNING) == 0)
1514 if ((eq_info->eq_type & EQ_PERIODIC) || (eq_info->eq_type & EQ_SLOW))
1516 if (eq_info->period == 0)
1528 if (status != CM_SUCCESS)
1530 cm_msg(MERROR,
"scheduler",
"send_event error %d",status);
1540 if (eq_info->eq_type & EQ_POLLED)
1545 while ((source =
poll_event(eq_info->source, eq->poll_count,
FALSE)) > 0)
1548 pevent = dm_pointer_get();
1550 pevent = pvic_pointer_get();
1554 cm_msg(MERROR,
"scheduler",
"polled, dm_pointer_get not returning valid pointer");
1555 status = SS_NO_MEMORY;
1560 pevent->event_id = eq_info->event_id;
1561 pevent->trigger_mask = eq_info->trigger_mask;
1562 pevent->data_size = 0;
1564 pevent->serial_number = eq->serial_number;
1569 *(INT *) (pevent+1) = source;
1571 if (eq->info.num_subevents)
1573 eq->subevent_number = 0;
1576 *(INT *) ((
char *)(pevent+1)+pevent->data_size) = source;
1579 size = eq->readout((
char *) (pevent+1), pevent->data_size);
1580 pevent->data_size +=
size;
1585 cm_msg(MERROR,
"scheduler",
"Event size %ld larger than maximum size %d",
1586 (
long)(pevent->data_size+
sizeof(EVENT_HEADER)), max_event_size);
1589 eq->subevent_number++;
1590 eq->serial_number++;
1598 if (source ==
FALSE)
1606 }
while (source ==
FALSE);
1608 }
while (eq->subevent_number < eq->info.num_subevents && source);
1611 pevent->data_size = eq->readout((
char *) (pevent+1), -1);
1616 pevent->data_size = eq->readout((
char *) (pevent+1), 0);
1621 cm_msg(MERROR,
"scheduler",
"Event size %ld larger than maximum size %d",
1622 (
long)(pevent->data_size+
sizeof(EVENT_HEADER)), max_event_size);
1626 if (pevent->data_size)
1627 eq->serial_number++;
1631 if (pevent->data_size)
1633 if (eq->buffer_handle)
1636 if (pevent->serial_number == 1)
1638 update_odb(pevent, eq->hkey_variables, eq->format);
1640 #ifdef USE_EVENT_CHANNEL
1641 dm_pointer_increment(eq->buffer_handle,
1642 pevent->data_size +
sizeof(EVENT_HEADER));
1645 status = pvic_send_event(eq->buffer_handle, pevent,
1646 pevent->data_size +
sizeof(EVENT_HEADER), SYNC);
1648 status = rpc_send_event(eq->buffer_handle, pevent,
1649 pevent->data_size +
sizeof(EVENT_HEADER), SYNC);
1654 cm_msg(MERROR,
"scheduler",
"rpc_send_event error %d", status);
1659 eq->bytes_sent += pevent->data_size +
sizeof(EVENT_HEADER);
1661 if (eq->info.num_subevents)
1662 eq->events_sent += eq->subevent_number;
1675 if (eq_info->event_limit > 0 &&
1676 eq->stats.events_sent + eq->events_sent >= eq_info->event_limit)
1681 if (pevent && (eq_info->read_on & RO_ODB || eq_info->history))
1686 update_odb(pevent, eq->hkey_variables, eq->format);
1693 if (eq_info->eq_type & EQ_INTERRUPT)
1708 if (eq_info->eq_type != EQ_SLOW &&
1709 eq_info->event_limit > 0 &&
1710 eq->stats.events_sent + eq->events_sent >= eq_info->event_limit &&
1714 if (cm_transition(TR_STOP, 0, str,
sizeof(str), SYNC,
FALSE) != CM_SUCCESS)
1715 cm_msg(MERROR,
"scheduler",
"cannot stop run: %s", str);
1718 size =
sizeof(BOOL);
1720 db_get_value(
hDB, 0,
"/Logger/Auto restart", &flag, &size, TID_BOOL,
TRUE);
1726 force_update =
TRUE;
1734 if (status != CM_SUCCESS)
1735 status = RPC_SHUTDOWN;
1739 cm_check_deferred_transition();
1746 force_update =
FALSE;
1755 eq->stats.events_sent += eq->events_sent;
1756 eq->stats.events_per_sec =
1758 eq->stats.kbytes_per_sec =
1765 eq->events_sent = 0;
1775 ss_printf(0, opt_index,
"%6d : %5.1lf %5.1lf", opt_tcp_size, opt_max/1024.0,
1776 max_bytes_per_sec/1024.0);
1777 if (++opt_cnt == 10)
1782 opt_tcp_size = 1<<(opt_index+7);
1783 rpc_set_opt_tcp_size(opt_tcp_size);
1784 if (1<<(opt_index+7) > 0x8000)
1787 opt_tcp_size = 1<<7;
1788 rpc_set_opt_tcp_size(opt_tcp_size);
1794 rpc_set_option(-1, RPC_OTRANSPORT, RPC_FTCP);
1795 db_send_changed_records();
1796 rpc_set_option(-1, RPC_OTRANSPORT, RPC_TCP);
1815 status = RPC_SHUTDOWN;
1820 if (status == RPC_SHUTDOWN)
1839 #ifdef USE_EVENT_CHANNEL
1840 if ((status = dm_area_flush()) != CM_SUCCESS)
1841 cm_msg(MERROR,
"scheduler",
"dm_area_flush: %i", status);
1849 buffer_done =
FALSE;
1850 for (j=0 ; j<
i ; j++)
1859 rpc_set_option(-1, RPC_OTRANSPORT, RPC_FTCP);
1861 err = bm_flush_cache(
equipment[i].buffer_handle, ASYNC);
1862 if (err != BM_SUCCESS)
1864 cm_msg(MERROR,
"scheduler",
"bm_flush_cache(ASYNC) error %d",err);
1867 rpc_set_option(-1, RPC_OTRANSPORT, RPC_TCP);
1879 size =
sizeof(state);
1880 status = db_get_value(
hDB, 0,
"Runinfo/State", &state, &size, TID_INT,
TRUE);
1881 if (status != DB_SUCCESS)
1882 cm_msg(MERROR,
"scheduler",
"cannot get Runinfo/State in database");
1884 if (state == STATE_STOPPED)
1890 cm_msg(MTALK,
"main",
"starting new run");
1892 if (status != CM_SUCCESS)
1893 cm_msg(MERROR,
"main",
"cannot restart run");
1909 status = cm_yield(0);
1913 status = RPC_SUCCESS;
1918 status = cm_yield(100);
1922 status = RPC_SHUTDOWN;
1924 }
while (status != RPC_SHUTDOWN && status != SS_ABORT);
1933 #ifndef PART_OF_MUCAP
1936 DWORD cmd, b,
c, n, a, f, *pdword, *
size, *x, *q, dtemp;
1937 WORD *pword, *pdata, temp;
1947 pdword = CPDWORD(6);
1955 if (index == RPC_CNAF16)
1956 count = *size /
sizeof(
WORD);
1958 count = *size /
sizeof(
DWORD);
1964 case CNAF_INHIBIT_SET:
1967 case CNAF_INHIBIT_CLEAR:
1970 case CNAF_CRATE_CLEAR:
1973 case CNAF_CRATE_ZINIT:
1981 if (index == RPC_CNAF16)
1983 for (i=0 ; i<
count ; i++)
1985 cam16i_q(c, n, a, f, pword++, (
int *) x, (
int *) q);
1987 cam16o_q(c, n, a, f, pword[i], (
int *) x, (
int *) q);
1989 cam16i_q(c, n, a, f, &temp, (
int *) x, (
int *) q);
1993 for (i=0 ; i<
count ; i++)
1995 cam24i_q(c, n, a, f, pdword++, (
int *) x, (
int *) q);
1997 cam24o_q(c, n, a, f, pdword[i], (
int *) x, (
int *) q);
1999 cam24i_q(c, n, a, f, &dtemp, (
int *) x, (
int *) q);
2005 if (index == RPC_CNAF16)
2017 *size = (int) pdword - (
int) pdata;
2021 printf(
"cnaf: Unknown command 0x%X\n",(
unsigned int)cmd);
2026 if (index == RPC_CNAF16)
2027 printf(
"cmd=%d r=%d c=%d n=%d a=%d f=%d d=%X x=%d q=%d\n",
2028 (
int)cmd, (
int)count, (
int)c, (
int)n, (
int)a, (
int)f, (
int)pword[0], (
int)*x, (
int)*q);
2029 else if (index == RPC_CNAF24)
2030 printf(
"cmd=%d r=%d c=%d n=%d a=%d f=%d d=%X x=%d q=%d\n",
2031 (
int)cmd, (
int)count, (
int)c, (
int)n, (
int)a, (
int)f, (
int)pdword[0], (
int)*x, (
int)*q);
2040 int mfe(
char *ahost_name,
char *aexp_name, BOOL adebug)
2057 signal(SIGPIPE,SIG_IGN);
2072 for (i=1 ; i<argc ; i++)
2074 if (argv[i][0] ==
'-' && argv[i][1] ==
'd')
2076 else if (argv[i][0] ==
'-' && argv[i][1] ==
'D')
2078 else if (argv[i][0] ==
'-' && argv[i][1] ==
'O')
2080 else if (argv[i][0] ==
'-')
2082 if (i+1 >= argc || argv[i+1][0] ==
'-')
2084 if (argv[i][1] ==
'e')
2086 else if (argv[i][1] ==
'h')
2091 printf(
"usage: frontend [-h Hostname] [-e Experiment] [-d] [-D] [-O]\n");
2092 printf(
" [-d] Used to debug the frontend\n");
2093 printf(
" [-D] Become a daemon\n");
2094 printf(
" [-O] Become a daemon but keep stdout\n");
2101 #ifdef PART_OF_MUCAP
2108 printf(
"event_buffer_size too small for max. event size\n");
2115 printf(
"Requested max_event_size (%d) exceeds max. system event size (%d)",
2126 dm_size = 2*10*(
max_event_size +
sizeof(EVENT_HEADER) +
sizeof(INT));
2127 if (dm_size > memFindMax())
2129 cm_msg(MERROR,
"mainFE",
"Not enough mem space for event size");
2133 dm_size = 0.2 * memFindMax();
2141 if (dm_size > 0x4000)
2147 printf(
"Buffer allocation : 2 x %d\n", dm_size);
2148 printf(
"System max event size : %d\n", MAX_EVENT_SIZE);
2156 printf(
"\nBecoming a daemon...\n");
2157 ss_daemon_init(daemon == 2);
2171 if (status != CM_SUCCESS)
2183 if (status != CM_SUCCESS)
2185 printf(
"dm_buffer_create: Not enough memory or event too big\n");
2196 printf(
"Previous frontend stopped\n");
2201 if (cm_register_transition(TR_START,
tr_start) != CM_SUCCESS ||
2202 cm_register_transition(TR_PRESTART,
tr_prestart) != CM_SUCCESS ||
2203 cm_register_transition(TR_PRESTOP,
tr_prestop) != CM_SUCCESS ||
2204 cm_register_transition(TR_PREPAUSE,
tr_prepause) != CM_SUCCESS ||
2205 cm_register_transition(TR_RESUME,
tr_resume) != CM_SUCCESS)
2207 printf(
"Failed to start local RPC server");
2208 cm_disconnect_experiment();
2209 dm_buffer_release();
2217 #ifndef PART_OF_MUCAP
2221 cm_get_experiment_database(&
hDB, &status);
2225 cm_synchronize(NULL);
2230 cm_set_watchdog_params(
TRUE, 0);
2233 rpc_set_option(-1, RPC_OTIMEOUT, 120000);
2241 printf(
"Init hardware...");
2246 cm_disconnect_experiment();
2247 dm_buffer_release();
2259 cm_disconnect_experiment();
2260 dm_buffer_release();
2308 if ((
equipment[i].info.eq_type & EQ_SLOW) &&
2313 cm_disconnect_experiment();
2317 if (status == RPC_SHUTDOWN)
2320 ss_printf(0, 0,
"Frontend shut down.");
2321 ss_printf(0, 1,
"");
2325 if (status != RPC_SHUTDOWN)
2326 printf(
"Network connection aborted.\n");
2328 dm_buffer_release();