9 #include <daq/rawdata/modules/copper.h>
10 #include <daq/rawdata/modules/DeSerializerCOPPER.h>
11 #include <rawdata/dataobjects/PreRawCOPPERFormat_latest.h>
13 #include <sys/ioctl.h>
15 #define CHECKEVT 10000
30 int g_run_resuming = 0;
47 setDescription(
"Encode DataStore into RingBuffer");
50 addParam(
"FinesseBitFlag", m_finesse_bit_flag,
"finesse (A,B,C,D) -> bit (0,1,2,3)", 15);
53 B2INFO(
"DeSerializerCOPPER: Constructor done.");
54 m_prev_ftsweve32 = 0xFFFFFFFF;
60 DeSerializerCOPPERModule::~DeSerializerCOPPERModule()
64 void DeSerializerCOPPERModule::initialize()
66 B2INFO(
"DeSerializerCOPPER: initialize() started.");
68 for (
int i = 0 ; i < NUM_PREALLOC_BUF; i++) {
69 m_bufary[i] =
new int[ BUF_SIZE_WORD ];
71 m_buffer =
new int[ BUF_SIZE_WORD ];
76 for (
int i = 0 ; i < NUM_PREALLOC_BUF; i++) {
77 memset(m_bufary[i], 0, BUF_SIZE_WORD *
sizeof(
int));
81 m_eventMetaDataPtr.registerInDataStore();
85 raw_dblkarray.registerInDataStore();
87 if (m_dump_fname.size() > 0) {
90 memset(time_array0, 0,
sizeof(time_array0));
91 memset(time_array1, 0,
sizeof(time_array1));
92 memset(time_array2, 0,
sizeof(time_array2));
93 memset(time_array3, 0,
sizeof(time_array3));
94 memset(time_array4, 0,
sizeof(time_array4));
95 memset(time_array5, 0,
sizeof(time_array5));
104 if (m_nodename.size() == 0 || m_nodeid < 0) {
107 printf(
"nodename = %s\n", m_nodename.c_str());
108 g_status.open(m_nodename, m_nodeid);
109 g_status.reportReady();
117 B2INFO(
"DeSerializerCOPPER: initialize() done.");
123 void DeSerializerCOPPERModule::initializeCOPPER()
130 if ((m_finesse_bit_flag & 0x1) == 1) {
132 m_use_slot |= 1 << slot_shift;
135 if (((m_finesse_bit_flag >> 1) & 0x1) == 1) {
137 m_use_slot |= 1 << slot_shift;
140 if (((m_finesse_bit_flag >> 2) & 0x1) == 1) {
142 m_use_slot |= 1 << slot_shift;
145 if (((m_finesse_bit_flag >> 3) & 0x1) == 1) {
147 m_use_slot |= 1 << slot_shift;
153 char err_buf[100] =
"[FATAL] Slot is not specified. Exiting...";
154 print_err.PrintError(m_shmflag, &g_status, err_buf, __FILE__, __PRETTY_FUNCTION__, __LINE__);
159 for (slot = 0; slot < 4; slot++) {
160 if (m_use_slot & (1 << slot)) printf(
" %c",
'A' + slot);
169 B2INFO(
"Opening COPPER...");
181 int* DeSerializerCOPPERModule::readOneEventFromCOPPERFIFO(
const int entry,
int* delete_flag,
int* m_size_word)
186 int* temp_buf = m_bufary[ entry ];
187 temp_buf[0] = BUF_SIZE_WORD ;
194 int recvd_byte = (m_pre_rawcpr.tmp_header.RAWHEADER_NWORDS) *
sizeof(
int);
198 if ((read_size = read(m_cpr_fd, (
char*)m_bufary[entry] + recvd_byte,
sizeof(
int) * BUF_SIZE_WORD - recvd_byte)) < 0) {
199 if (errno == EINTR) {
201 }
else if (errno == EAGAIN || errno == EWOULDBLOCK) {
203 if (recvd_byte > (
int)((m_pre_rawcpr.tmp_header.RAWHEADER_NWORDS) *
sizeof(
int))) {
205 sprintf(err_buf,
"[FATAL] EAGAIN return in the middle of an event( COPPER driver should't do this.). Exting...");
206 print_err.PrintError(m_shmflag, &g_status, err_buf, __FILE__, __PRETTY_FUNCTION__, __LINE__);
213 callCheckRunPause(err_str);
219 sprintf(err_buf,
"[FATAL] Failed to read data from COPPER. Exiting...");
220 print_err.PrintError(m_shmflag, &g_status, err_buf, __FILE__, __PRETTY_FUNCTION__, __LINE__);
224 recvd_byte += read_size;
225 if (recvd_byte - (m_pre_rawcpr.tmp_header.RAWHEADER_NWORDS) *
sizeof(
int) > (
int)(
sizeof(
int) *
226 (m_pre_rawcpr.POS_DATA_LENGTH + 1)))
break;
233 *m_size_word = m_bufary[ entry ][ m_pre_rawcpr.POS_DATA_LENGTH + (m_pre_rawcpr.tmp_header.RAWHEADER_NWORDS) ]
234 + m_pre_rawcpr.SIZE_COPPER_DRIVER_HEADER + m_pre_rawcpr.SIZE_COPPER_DRIVER_TRAILER
235 + m_pre_rawcpr.tmp_header.RAWHEADER_NWORDS +
236 m_pre_rawcpr.tmp_trailer.RAWTRAILER_NWORDS;
241 if ((
int)((*m_size_word - m_pre_rawcpr.tmp_trailer.RAWTRAILER_NWORDS) *
sizeof(
int)) > recvd_byte) {
244 if (*m_size_word > BUF_SIZE_WORD) {
246 temp_buf =
new int[ *m_size_word ];
247 memcpy(temp_buf, m_bufary[ entry ], recvd_byte);
248 recvd_byte += readFD(m_cpr_fd, (
char*)temp_buf + recvd_byte,
249 (*m_size_word - m_pre_rawcpr.tmp_trailer.RAWTRAILER_NWORDS) *
sizeof(
int) - recvd_byte, *delete_flag);
252 recvd_byte += readFD(m_cpr_fd, (
char*)(m_bufary[ entry ]) + recvd_byte,
253 (*m_size_word - m_pre_rawcpr.tmp_trailer.RAWTRAILER_NWORDS) *
sizeof(
int) - recvd_byte, *delete_flag);
256 if ((
int)((*m_size_word - m_pre_rawcpr.tmp_trailer.RAWTRAILER_NWORDS) *
sizeof(
int)) != recvd_byte) {
259 sprintf(err_buf,
"[FATAL] CORRUPTED DATA: Read less bytes(%d) than expected(%d:%d). Exiting...\n",
261 *m_size_word *
sizeof(
int) - m_pre_rawcpr.tmp_trailer.RAWTRAILER_NWORDS *
sizeof(
int),
262 m_bufary[ entry ][ m_pre_rawcpr.POS_DATA_LENGTH ]);
263 print_err.PrintError(m_shmflag, &g_status, err_buf, __FILE__, __PRETTY_FUNCTION__, __LINE__);
266 }
else if ((
int)((*m_size_word - m_pre_rawcpr.tmp_trailer.RAWTRAILER_NWORDS) *
sizeof(
int)) < recvd_byte) {
268 sprintf(err_buf,
"[FATAL] CORRUPTED DATA: Read more than data size. Exiting...: %d %d %d %d %d\n",
269 recvd_byte, *m_size_word *
sizeof(
int) , m_pre_rawcpr.tmp_trailer.RAWTRAILER_NWORDS *
sizeof(
int),
270 m_bufary[ entry ][ m_pre_rawcpr.POS_DATA_LENGTH ], m_pre_rawcpr.POS_DATA_LENGTH);
271 print_err.PrintError(m_shmflag, &g_status, err_buf, __FILE__, __PRETTY_FUNCTION__, __LINE__);
278 *m_size_word = 256 + entry;
279 m_bufary[entry][0] = *m_size_word;
285 temp_buf[ 0 ] = *m_size_word;
289 if (n_basf2evt >= 50000 && n_basf2evt < 50500) {
290 cur_time = getTimeSec();
291 time_array2[ n_basf2evt - 50000 ] = cur_time - m_start_time;
296 unsigned int checksum = 0;
297 for (
int i = 0; i < m_bufary[entry][0]; i++) {
298 if (i != 2) checksum += m_bufary[entry][i];
300 m_bufary[entry][2] = checksum;
308 void DeSerializerCOPPERModule::openCOPPER()
311 if (m_cpr_fd != -1) {
318 if ((m_cpr_fd = open(
"/dev/copper/copper", O_RDONLY)) == -1) {
320 sprintf(err_buf,
"[FATAL] Failed to open /dev/copper/copper. Exiting... ");
321 print_err.PrintError(m_shmflag, &g_status, err_buf, __FILE__, __PRETTY_FUNCTION__, __LINE__);
327 ioctl(m_cpr_fd, CPRIOSET_LEF_WA_FF, &set_regval);
328 ioctl(m_cpr_fd, CPRIOSET_LEF_WB_FF, &set_regval);
329 ioctl(m_cpr_fd, CPRIOSET_LEF_WC_FF, &set_regval);
330 ioctl(m_cpr_fd, CPRIOSET_LEF_WD_FF, &set_regval);
331 ioctl(m_cpr_fd, CPRIOSET_FINESSE_STA, &m_use_slot,
sizeof(m_use_slot));
335 ioctl(m_cpr_fd, CPRIOSET_LEF_WA_AF, &v,
sizeof(v));
336 ioctl(m_cpr_fd, CPRIOSET_LEF_WB_AF, &v,
sizeof(v));
337 ioctl(m_cpr_fd, CPRIOSET_LEF_WC_AF, &v,
sizeof(v));
338 ioctl(m_cpr_fd, CPRIOSET_LEF_WD_AF, &v,
sizeof(v));
341 B2INFO(
"DeSerializerCOPPER: openCOPPER() done.");
347 int DeSerializerCOPPERModule::readFD(
int fd,
char* buf,
int data_size_byte,
int delete_flag)
353 if ((read_size = read(fd, (
char*)buf + n, data_size_byte - n)) < 0) {
354 if (errno == EINTR) {
356 }
else if (errno == EAGAIN || errno == EWOULDBLOCK) {
359 sprintf(err_buf,
"[FATAL] Return due to EAGAIN in the middle of an event( COPPER driver would't do this.). Exting...");
360 print_err.PrintError(m_shmflag, &g_status, err_buf, __FILE__, __PRETTY_FUNCTION__, __LINE__);
367 callCheckRunPause(err_str);
368 }
catch (
string err_str) {
371 B2WARNING(
"Delete buffer before going to Run-pause state");
381 printf(
"[ERROR] Failed to read data from COPPER. %s %s %d",
382 __FILE__, __PRETTY_FUNCTION__, __LINE__);
383 string err_str =
"RUN_ERROR";
387 sprintf(err_buf,
"[FATAL] Failed to read data from COPPER. %s %s %d",
388 __FILE__, __PRETTY_FUNCTION__, __LINE__);
389 print_err.PrintError(m_shmflag, &g_status, err_buf, __FILE__, __PRETTY_FUNCTION__, __LINE__);
394 if (n == data_size_byte)
break;
401 void DeSerializerCOPPERModule::resumeRun()
405 printf(
"###########(DesCpr) Resume from PAUSE ###############\n");
416 void DeSerializerCOPPERModule::waitResume()
419 if (g_run_pause == 0 && g_run_error == 1) {
423 printf(
"###########(DesCpr) Error stop. Waiting for RUNPAUSE ###############\n");
427 if (checkRunPause())
break;
433 if (m_cpr_fd != -1) close(m_cpr_fd);
436 if (checkRunRecovery()) {
444 printf(
"###########(DesCpr) Resume detected ###############\n");
452 printf(
"###########(DesCpr) Waiting for RESUME ###############\n");
463 void DeSerializerCOPPERModule::event()
468 if (g_run_pause > 0 || g_run_error > 0) {
470 m_eventMetaDataPtr.create();
475 if (m_start_flag == 0) {
478 if (g_status.isAvailable()) {
479 B2INFO(
"DeSerializerCOPPER: Waiting for Start...\n");
480 g_status.reportRunning();
483 m_start_time = getTimeSec();
486 B2INFO(
"Opening COPPER...");
496 for (
int j = 0; j < NUM_EVT_PER_BASF2LOOP_COPPER; j++) {
499 if (m_start_flag == 0) {
500 B2INFO(
"DeSerializerCOPPER: Reading the 1st event from COPPER FIFO...");
505 temp_buf = readOneEventFromCOPPERFIFO(j, &delete_flag, &m_size_word);
506 g_status.copyEventHeader(temp_buf);
507 }
catch (
string err_str) {
510 if (err_str ==
"RUN_PAUSE" || err_str ==
"RUN_ERROR") {
512 m_eventMetaDataPtr.create();
516 print_err.PrintError(m_shmflag, &g_status, err_str);
520 if (m_start_flag == 0) {
521 B2INFO(
"DeSerializerCOPPER: Done. the size of the 1st event is " << m_size_word <<
"words");
525 const int num_nodes = 1;
526 const int num_events = 1;
527 temp_rawdblk = raw_dblkarray.appendNew();
528 temp_rawdblk->
SetBuffer(temp_buf, m_size_word, delete_flag, num_events, num_nodes);
532 temp_rawcopper.
SetBuffer(temp_buf, m_size_word, 0, num_events, num_nodes);
536 m_prev_ftsweve32 = temp_rawcopper.
FillTopBlockRawHeader(m_nodeid, m_prev_ftsweve32, m_prev_exprunsubrun_no, &m_exprunsubrun_no);
537 m_prev_exprunsubrun_no = m_exprunsubrun_no;
539 }
catch (
string err_str) {
540 print_err.PrintError(m_shmflag, &g_status, err_str);
544 if (m_dump_fname.size() > 0) {
545 dumpData((
char*)temp_buf, m_size_word *
sizeof(
int));
547 m_totbytes += m_size_word *
sizeof(int);
554 m_eventMetaDataPtr.create();
555 m_eventMetaDataPtr->setExperiment(0);
556 m_eventMetaDataPtr->setRun(0);
557 m_eventMetaDataPtr->setEvent(n_basf2evt);
562 if (max_nevt >= 0 || max_seconds >= 0.) {
563 if ((n_basf2evt * NUM_EVT_PER_BASF2LOOP_PC >= max_nevt && max_nevt > 0)
564 || (getTimeSec() - m_start_time > max_seconds && max_seconds > 0.)) {
565 printf(
"[DEBUG] RunPause was detected. ( Setting: Max event # %d MaxTime %lf ) Processed Event %d Elapsed Time %lf[s]\n",
566 max_nevt , max_seconds, n_basf2evt * NUM_EVT_PER_BASF2LOOP_PC, getTimeSec() - m_start_time);
567 m_eventMetaDataPtr->setEndOfData();
575 if (n_basf2evt % 100 == 0) {
576 RateMonitor(m_prev_ftsweve32, m_prev_exprunsubrun_no & RawHeader_latest::SUBRUNNO_MASK ,
577 (m_prev_exprunsubrun_no & RawHeader_latest::RUNNO_MASK) >> RawHeader_latest::RUNNO_SHIFT);
580 if (g_status.isAvailable()) {
581 g_status.setInputNBytes(m_totbytes);
582 g_status.setInputCount(m_prev_ftsweve32 + 1);