/* This code insert formats and puts the current event into the output buffer This version is for GANIL (Exogam) */ #include #include #include #include extern int Verbose; extern void xfer_block(int); extern void insert_block_header(int); extern unsigned short OutputBuffer[]; extern int Output_Buffer_Length; extern int OutputBufferLen; /* units of short */ extern unsigned short EventBuffer[]; extern int EventBufferLen; extern int Block_Event_Count; extern int Block_Sequence_Number; extern unsigned int EvNumberH; extern unsigned int EvNumberL; #define EXOGAM_EVENT_HEADER_STATUS_WORDS 1 #define EXOGAM_EVENT_HEADER_EVNUM_WORDS 2 #define EXOGAM_SUBEVENT_HEADER_STATUS_WORDS 0 #define EXOGAM_SUBEVENT_HEADER_EVNUM_WORDS 0 #define EXOGAM_SUBEVENT_HEADER_CLOCK_WORDS 0 #define EXOGAM_START_EVENT_TOKEN 0xff60 #define EXOGAM_START_SUBEVENT_TOKEN 0x0001 /* --------------------------------------------------------------------- */ void xfer_EXOGAM_event() { int j; unsigned short *ptr1, *ptr2; int len, eventheaderwords, subeventheaderwords ; if ((Verbose & 0x2000) == 0x2000) printf("xfer_EXOGAM_event: %d %d %d %d\n", OutputBufferLen, EventBufferLen, ((OutputBufferLen + EventBufferLen) << 1), Output_Buffer_Length); // for this to format correctly when using INT buffers (eventheaderwords + subeventheaderwords) should be even // check that the formatted event will fit into the output buffer eventheaderwords = 2 + EXOGAM_EVENT_HEADER_STATUS_WORDS + EXOGAM_EVENT_HEADER_EVNUM_WORDS; subeventheaderwords = 2 + EXOGAM_SUBEVENT_HEADER_STATUS_WORDS + EXOGAM_SUBEVENT_HEADER_EVNUM_WORDS + EXOGAM_SUBEVENT_HEADER_CLOCK_WORDS; if ((((OutputBufferLen + EventBufferLen) + eventheaderwords + subeventheaderwords + 2) << 1) >= Output_Buffer_Length) { /* output buffer full */ if ((Verbose & 0x4000) == 0x4000) printf("output block length %d\n",OutputBufferLen); xfer_block(0); } if (OutputBufferLen == 0) insert_block_header(0); /* build the event header */ ptr1 = &OutputBuffer[OutputBufferLen]; *ptr1++ = EXOGAM_START_EVENT_TOKEN; /* 0xff60 */ *ptr1++ = EventBufferLen + eventheaderwords + subeventheaderwords; switch(EXOGAM_EVENT_HEADER_STATUS_WORDS) /* = 1 */ { case 0: break; case 1: *ptr1++ = 0; break; case 2: *ptr1++ = 0; *ptr1++ = 0; break; case 3: *ptr1++ = 0; *ptr1++ = 0; *ptr1++ = 0; break; } switch(EXOGAM_EVENT_HEADER_EVNUM_WORDS) /* = 2 */ { case 0: break; case 1: *ptr1++ = EvNumberL; /* from V1495 data */ break; case 2: *ptr1++ = EvNumberH; *ptr1++ = EvNumberL; break; case 3: *ptr1++ = 0; *ptr1++ = EvNumberH; *ptr1++ = EvNumberL; break; } /* build the sub-event header */ *ptr1++ = EXOGAM_START_SUBEVENT_TOKEN; /* 0x0001 */ *ptr1++ = EventBufferLen + subeventheaderwords; switch(EXOGAM_SUBEVENT_HEADER_CLOCK_WORDS) /* = 0 */ { case 0: break; case 1: *ptr1++ = 0; break; case 2: *ptr1++ = 0; *ptr1++ = 0; break; case 3: *ptr1++ = 0; *ptr1++ = 0; *ptr1++ = 0; break; } switch(EXOGAM_SUBEVENT_HEADER_STATUS_WORDS) /* = 0 */ { case 0: break; case 1: *ptr1++ = 0; break; case 2: *ptr1++ = 0; *ptr1++ = 0; break; case 3: *ptr1++ = 0; *ptr1++ = 0; *ptr1++ = 0; break; } switch(EXOGAM_SUBEVENT_HEADER_EVNUM_WORDS) /* = 0 */ { case 0: break; case 1: *ptr1++ = EvNumberL; break; case 2: *ptr1++ = EvNumberH; *ptr1++ = EvNumberL; break; case 3: *ptr1++ = 0; *ptr1++ = EvNumberH; *ptr1++ = EvNumberL; break; } /* copy current event into the output buffer */ ptr2 = (unsigned short *) &EventBuffer[0]; len = EventBufferLen; if (len > 0) { while (len--) {*ptr1++ = *ptr2++;} } OutputBufferLen += (EventBufferLen + eventheaderwords + subeventheaderwords); if ((Verbose & 0x4000) == 0x4000) { printf("\n\nEvent >>>\n"); ptr1 = (unsigned short *)&EventBuffer[0]; for (j = 0; j <64;) { printf(" 0x%04x", ptr1[j]); j++; if ((j/16)*16 == j) printf("\n"); } printf("\n"); } EventBufferLen = 0; /* finished with this event */ } /* --------------------------------------------------------------------- */ void xfer_event(int flag) { /* Move the current event into the output buffer */ if (EventBufferLen == 0) { /* ignore event with no data */ return; } if (((EventBufferLen + 4) << 1) >= Output_Buffer_Length) { printf ("xfer_event: event is too big for output buffer; ignored\n"); return; } xfer_EXOGAM_event(); Block_Event_Count++; } /* --------------------------------------------------------------------- */