AlcapDAQ  1
ebuser.cpp
Go to the documentation of this file.
1 /********************************************************************\
2 
3  Name: ebuser.c
4  Created by: Pierre-Andre Amaudruz
5 
6  Contents: User section for the Event builder
7 
8  ** muCap version **
9 
10  $Log: ebuser.cpp,v $
11  Revision 1.4 2006/01/25 02:03:27 mucap
12  (Fred)
13  Commented out redundant printf().
14 
15  Revision 1.3 2005/10/31 14:11:37 mucap
16  (Fred)
17  Update to new major version of MIDAS event builder.
18 
19  Revision 1.11 2004/10/07 20:08:34 pierre
20  1.9.5
21 
22  Revision 1.10 2004/10/04 23:55:57 pierre
23  move ebuilder into equipment list
24 
25  Revision 1.9 2004/09/29 16:25:04 pierre
26  change Ebuilder structure
27 
28  Revision 1.8 2004/01/08 06:46:43 pierre
29  Doxygen the file
30 
31  Revision 1.7 2003/12/03 00:57:20 pierre
32  ctlM fix
33 
34  Revision 1.6 2002/09/28 00:49:08 pierre
35  Add EB_USER_ERROR example
36 
37  Revision 1.5 2002/09/25 18:38:03 pierre
38  correct: header passing, user field, abort run
39 
40  Revision 1.4 2002/07/13 05:46:10 pierre
41  added ybos comments
42 
43  Revision 1.3 2002/06/14 04:59:46 pierre
44  revised for ybos
45 
46  Revision 1.2 2002/01/17 23:34:29 pierre
47  doc++ format
48 
49  Revision 1.1.1.1 2002/01/17 19:49:54 pierre
50  Initial Version
51 
52 \********************************************************************/
57 #include <stdio.h>
58 #include "midas.h"
59 #include "mevb.h"
60 #include "ybos.h"
61 
62 #include "mucap_compress.h"
63 #define NUMCRATES 5
64 
65 /*-- Globals -------------------------------------------------------*/
66 
67 /* The frontend name (client name) as seen by other MIDAS clients */
68 char *frontend_name = "Ebuilder";
69 
70 /* The frontend file name, don't change it */
71 char *frontend_file_name = __FILE__;
72 
73 /* frontend_loop is called periodically if this variable is TRUE */
75 
76 /* A frontend status page is displayed with this frequency in ms */
77 INT display_period = 3000;
78 
79 /* maximum event size produced by this frontend */
80 INT max_event_size = MAX_EVENT_SIZE;
81 
82 /* maximum event size for fragmented events (EQ_FRAGMENTED) */
83 INT max_event_size_frag = MAX_EVENT_SIZE;
84 
85 /* buffer size to hold events */
86 INT event_buffer_size = EVENT_BUFFER_SIZE;
87 
90 INT lModulo = 100;
91 
92 /*-- Function declarations -----------------------------------------*/
93 INT ebuilder_init();
94 INT ebuilder_exit();
95 INT eb_begin_of_run(INT, char *, char *);
96 INT eb_end_of_run(INT, char *);
97 INT ebuilder_loop();
98 INT ebuser(INT, BOOL mismatch, EBUILDER_CHANNEL *, EVENT_HEADER *, void *, INT *);
99 INT read_scaler_event(char *pevent, INT off);
100 
101 /*-- Equipment list ------------------------------------------------*/
102 EQUIPMENT equipment[] = {
103  {"EB", /* equipment name */
104  {1, 0, /* event ID, trigger mask */
105  "SYSTEM", /* event buffer */
106  0, /* equipment type */
107  0, /* event source */
108  "MIDAS", /* format */
109  TRUE, /* enabled */
110  },
111  },
112 
113  {""}
114 };
115 
116 /********************************************************************/
117 /********************************************************************/
118 
119 /********************************************************************/
121 {
122  return EB_SUCCESS;
123 }
124 
125 /********************************************************************/
127 {
128  return EB_SUCCESS;
129 }
130 
131 /********************************************************************/
133 {
134  return EB_SUCCESS;
135 }
136 
137 /********************************************************************/
145 INT eb_begin_of_run(INT rn, char *UserField, char *error)
146 {
147 #if 0
148  extern EBUILDER_SETTINGS ebset;
150  extern HNDLE hDB;
151 
152  int n;
153  int mask = 0;
154 
155  char keyName[256];
156  BOOL enabled;
157  int size;
158 
159  /*
160  * Determine which crates are enabled and set up the mask
161  * accordingly.
162  */
163  for(n = 1; n <= NUMCRATES; n++) {
164  sprintf(keyName, "/Equipment/Crate %d/Settings/Enabled", n);
165  size = sizeof(enabled);
166  db_get_value(hDB, 0, keyName, &enabled, &size, TID_BOOL, FALSE);
167  if(size == sizeof(enabled) && enabled) {
168  ebch[n-1].trigger_mask = (1 << (n-1));
169  mask |= ebch[n-1].trigger_mask;
170  } else {
171  ebch[n-1].trigger_mask = 0;
172  }
173  }
174 
175  cm_msg(MINFO, "eb_begin_of_run", "Setting event mask to 0x%x", mask);
176  ebset.trigger_mask = mask;
177 #endif
178 
179  // Initialize online compression
181 
182  return EB_SUCCESS;
183 }
184 
185 /********************************************************************/
193 INT eb_end_of_run(INT rn, char *error)
194 {
195  return EB_SUCCESS;
196 }
197 
198 /********************************************************************/
259 INT eb_user(INT nfrag, BOOL mismatch, EBUILDER_CHANNEL * ebch
260  , EVENT_HEADER * pheader, void *pevent, INT * dest_size)
261 {
262  if (mismatch){
263  printf("Serial number do not match across fragments\n");
264  for (int i = 0; i < nfrag; i++) {
265  int serial = ((EVENT_HEADER *) ebch[i].pfragment)->serial_number;
266  printf("Ser[%i]:%d ", i + 1, serial);
267  }
268  printf("\n");
269  return EB_USER_ERROR;
270  }
271 
272  // Initialize output event
273  bk_init32(pevent);
274 
275  // Loop over the event fragments, performing compression into the output event
276  for(int i = 0; i < nfrag; i++) {
277  void *fragment = ebch[i].pfragment;
278 
279  if(fragment != NULL) {
280  compress_event(((EVENT_HEADER *) fragment) + 1, pevent);
281  pheader->serial_number =
282  ((EVENT_HEADER *) ebch[i].pfragment)->serial_number;
283  }
284  }
285 
286  // Set the size of the output event properly
287  pheader->data_size = *dest_size = bk_size(pevent);
288 
289  // printf("Returning size %d\n", pheader->data_size);
290 
291  return EB_SUCCESS;
292 
293 }