AlcapDAQ  1
Macros | Functions | Variables
crate.cpp File Reference
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <sys/time.h>
#include <sched.h>
#include "midas.h"
#include "msystem.h"
#include "odb_wrapper.h"
#include "crate.h"
#include "diag.h"

Go to the source code of this file.

Macros

#define MAX_DATA_SIZE
 

Functions

INT frontend_early_init ()
 
INT frontend_init ()
 
INT frontend_exit ()
 
INT pre_begin_of_run (INT run_number, char *error)
 
INT begin_of_run (INT run_number, char *error)
 
INT end_of_run (INT run_number, char *error)
 
INT pause_run (INT run_number, char *error)
 
INT resume_run (INT run_number, char *error)
 
INT frontend_loop ()
 
INT poll_event (INT source, INT count, BOOL test)
 
INT interrupt_configure (INT cmd, INT source, PTYPE adr)
 
INT read_trigger_event (char *pevent, INT off)
 
INT read_periodic_event (char *pevent, INT off)
 
void start_cycle ()
 
INT consider_start ()
 
void stop_cycle ()
 
void print_diag_output (char *pevent)
 

Variables

int run_state
 
int frontend_index
 
BOOL interrupts_enabled = FALSE
 
void(* interrupt_handler )() = NULL
 
char * frontend_name
 
char * frontend_file_name = __FILE__
 
BOOL frontend_call_loop = TRUE
 
INT display_period = 0
 
INT max_event_size = MAX_EVENT_SIZE
 
INT max_event_size_frag = 0
 
INT event_buffer_size = DEFAULT_EVENT_BUFFER_SIZE
 
EQUIPMENT equipment []
 
struct readout_module rpc_master_module
 
struct readout_module rpc_slave_module
 
struct readout_module dt5720_module
 
struct readout_moduletrigger_modules []
 
int num_trigger_modules = sizeof(trigger_modules)/sizeof(trigger_modules[0])
 
struct timeval readout_finished_time
 
struct readout_moduleperiodic_modules []
 
int num_periodic_modules = sizeof(periodic_modules)/sizeof(periodic_modules[0])
 
int cycle_active = 0
 
bool event_avail = false
 
bool between_runs = true
 
int crate_number = 5
 

Macro Definition Documentation

#define MAX_DATA_SIZE

Definition at line 48 of file crate.cpp.

Function Documentation

INT begin_of_run ( INT  run_number,
char *  error 
)

Definition at line 295 of file crate.cpp.

296 {
297  diag_print(1, "*** Begin of run %d ***\n", run_number);
298 
299  for(int i = 0; i < num_trigger_modules; i++) {
300  if((*trigger_modules[i]).bor != NULL) {
301  int status = (*trigger_modules[i]).bor();
302  if(status != SUCCESS) {
303  return status;
304  }
305  }
306  }
307 
308  for(int i = 0; i < num_periodic_modules; i++) {
309  if((*periodic_modules[i]).bor != NULL) {
310  int status = (*periodic_modules[i]).bor();
311  if(status != SUCCESS) {
312  return status;
313  }
314  }
315  }
316 
317  cycle_active = 0;
318  event_avail = false;
319 
320  between_runs = false;
321 
322  return SUCCESS;
323 }
INT consider_start ( )

Definition at line 346 of file crate.cpp.

References FE_NEED_START, i, num_trigger_modules, start_cycle(), status, and SUCCESS.

347 {
348  for(int i = 0; i < num_trigger_modules; i++) {
349  if((*trigger_modules[i]).poll_dead != NULL) {
350  int status = (*trigger_modules[i]).poll_dead();
351 
352  if(status == FE_NEED_START && !event_avail) {
353  start_cycle();
354  } else if(status != SUCCESS) {
355  return status;
356  }
357  }
358  }
359 
360 }
INT end_of_run ( INT  run_number,
char *  error 
)

Definition at line 330 of file crate.cpp.

331 {
332  diag_print(1, "*** End of run %d ***\n", run_number);
333 
334  between_runs = true;
335 
336  for(int i = 0; i < num_trigger_modules; i++) {
337  if((*trigger_modules[i]).eor != NULL) {
338  int status = (*trigger_modules[i]).eor();
339  if(status != SUCCESS) {
340  return status;
341  }
342  }
343  }
344 
345  for(int i = 0; i < num_periodic_modules; i++) {
346  if((*periodic_modules[i]).eor != NULL) {
347  int status = (*periodic_modules[i]).eor();
348  if(status != SUCCESS) {
349  return status;
350  }
351  }
352  }
353 
354 
355  return SUCCESS;
356 }
INT frontend_early_init ( void  )

Definition at line 145 of file crate.cpp.

146 {
147  // Determine our crate ID by comparing against a list of hostnames
148  printf("Entering frontend_early_init ... \n");
149  //char *hostnames[] = {"fe1", "fe2", "fe3", "turtle", "fe5", "fe6"};
150  //char *hostnames[] = {"fe1", "fe2", "daq2.MuSIC", "fe4", "fe5", "fe6", "fe7"};
151  //int crate_numbers[] = {1, 2, 3, 4, 5, 6, 9};
152  //char *hostnames[] = {"daq2.MuSIC"};
153  //int crate_numbers[] = {3};
154  //BOOL crate_has_periodic[] = {FALSE, FALSE, FALSE, TRUE, FALSE, FALSE, FALSE, FALSE};
155 
156  //int num_hostnames = sizeof(hostnames)/sizeof(char *);
157 
158  //char my_hostname[256];
159 
160  //gethostname(my_hostname, sizeof(my_hostname));
161 
162 #if 0
163  BOOL has_periodic = FALSE;
164  for(int i = 0; i < num_hostnames; i++) {
165  if(!strcmp(my_hostname, hostnames[i])) {
166  crate_number = crate_numbers[i];
167  has_periodic = crate_has_periodic[i];
168  }
169  }
170 #endif
171 
172  crate_number = 3;
173  BOOL has_periodic = FALSE;
174 
175  printf("Hostname and crate cumber defined, crate number = %d ... \n",crate_number);
176 
177  if(crate_number > 0) {
178  frontend_name = new char[32];
179  strcpy(frontend_name, "Crate ");
180 
181 
182 #if 0
183  sprintf(equipment[0].name, "Crate %d", crate_number);
184  sprintf(equipment[0].info.buffer, "BUF%d", crate_number);
185  equipment[0].info.event_id = 1000 + crate_number;
186 #endif
188 
189  printf("Crate number = %d\n",crate_number);
190 
191  if(has_periodic) {
192  sprintf(equipment[1].name, "Periodic %d", crate_number);
193  equipment[1].info.event_id = 2000 + crate_number;
194  } else {
195  sprintf(equipment[1].name, "");
196  }
197  }
198  printf("Frontend early init returns success \n");
199  return SUCCESS;
200 }
INT frontend_exit ( void  )

Definition at line 244 of file crate.cpp.

245 {
246  for(int i = 0; i < num_trigger_modules; i++) {
247  if((*trigger_modules[i]).exit != NULL) {
248  (*trigger_modules[i]).exit();
249  }
250  }
251 
252  for(int i = 0; i < num_periodic_modules; i++) {
253  if((*periodic_modules[i]).exit != NULL) {
254  (*periodic_modules[i]).exit();
255  }
256  }
257 
258  return SUCCESS;
259 }
INT frontend_init ( void  )

Definition at line 207 of file crate.cpp.

208 {
209  printf("Entering frontend_init() ... \n");
210  INT run_state = odb_get_int("/Runinfo/State");
211  if (run_state != STATE_STOPPED) {
212  cm_msg(MERROR, "Crate",
213  "Run must be stopped before starting crate program.");
214  return FE_ERR_HW;
215  }
216 
217  for(int i = 0; i < num_trigger_modules; i++) {
218  if((*trigger_modules[i]).init != NULL) {
219  int status = (*trigger_modules[i]).init();
220  if(status != SUCCESS) {
221  return status;
222  }
223  }
224  }
225 
226  for(int i = 0; i < num_periodic_modules; i++) {
227  if((*periodic_modules[i]).init != NULL) {
228  int status = (*periodic_modules[i]).init();
229  if(status != SUCCESS) {
230  return status;
231  }
232  }
233  }
234 
235  return SUCCESS;
236 }
INT frontend_loop ( void  )

Definition at line 435 of file crate.cpp.

436 {
437  // If we're going to be pre-empted, get it over with during livetime
438  // rather than deadtime.
439  if (cycle_active || run_state != STATE_RUNNING || between_runs == TRUE) {
440  dm_area_flush();
441  sched_yield();
442  }
443 
444  // Exit immediately if no run in progress
445  if (run_state != STATE_RUNNING || between_runs == TRUE) {
446  return SUCCESS;
447  }
448 
449  // Call appropriate poll functions, depending on whether we're live or dead
450  //printf("fe loop: cycle_active %i\n",cycle_active);
451  if (cycle_active) {
452 
453  for(int i = 0; i < num_trigger_modules; i++) {
454  if((*trigger_modules[i]).poll_live != NULL) {
455 
456  // There are conditions that can lead to changes in run state between
457  // modules...
458  if (run_state != STATE_RUNNING || between_runs == TRUE) {
459  return SUCCESS;
460  }
461  int status = (*trigger_modules[i]).poll_live();
462 
463  if(status == FE_END_BLOCK) {
464  cycle_active = 0;
465  event_avail = true;
466  } else if(status == FE_NEED_STOP) {
467  stop_cycle();
468  } else if(status != SUCCESS) {
469  return status;
470  }
471  }
472  }
473  } else {
474  consider_start();
475  }
476 
477  return SUCCESS;
478 }
INT interrupt_configure ( INT  cmd,
INT  source,
PTYPE  adr 
)

Definition at line 505 of file crate.cpp.

506 {
507  switch (cmd) {
508  case CMD_INTERRUPT_ENABLE:
510  break;
511  case CMD_INTERRUPT_DISABLE:
513  break;
514  case CMD_INTERRUPT_ATTACH:
515  interrupt_handler = (void (*)(void)) adr;
516  break;
517  case CMD_INTERRUPT_DETACH:
519  interrupt_handler = NULL;
520  break;
521  }
522  return SUCCESS;
523 }
INT pause_run ( INT  run_number,
char *  error 
)

Definition at line 362 of file crate.cpp.

363 {
364  return SUCCESS;
365 }
INT poll_event ( INT  source,
INT  count,
BOOL  test 
)

Definition at line 486 of file crate.cpp.

487 {
488  INT retval = false;
489 
490  if(!test) {
491  count = 1;
492  }
493 
494  for (int i = 0; i < count; i++) {
495  frontend_loop();
496  if(event_avail) {
497  retval = true;
498  }
499  }
500 
501  return retval;
502 }
INT pre_begin_of_run ( INT  run_number,
char *  error 
)

Definition at line 264 of file crate.cpp.

265 {
266  diag_print(1, "*** Before begin of run %d ***\n", run_number);
267 
268  for(int i = 0; i < num_trigger_modules; i++) {
269  if((*trigger_modules[i]).pre_bor != NULL) {
270  int status = (*trigger_modules[i]).pre_bor();
271  if(status != SUCCESS) {
272  return status;
273  }
274  }
275  }
276 
277  for(int i = 0; i < num_periodic_modules; i++) {
278  if((*periodic_modules[i]).pre_bor != NULL) {
279  int status = (*periodic_modules[i]).pre_bor();
280  if(status != SUCCESS) {
281  return status;
282  }
283  }
284  }
285 
286 
287  return SUCCESS;
288 }
void print_diag_output ( char *  pevent)

Definition at line 469 of file crate.cpp.

References MIN, printf(), and size.

470 {
471  printf("--------\n");
472 
473  printf("Event number: %d\n", (((EVENT_HEADER *)pevent)-1)->serial_number);
474 
475  BANK32 *pbk = NULL;
476  do {
477  DWORD *pdata;
478  int size = bk_iterate32(pevent, &pbk, &pdata);
479  if(pbk != NULL) {
480  printf("%c%c%c%c\t%d\t\t", pbk->name[0], pbk->name[1], pbk->name[2],
481  pbk->name[3], size);
482  for(int i = 0; i < MIN(4, size/4); i++) {
483  printf("0x%08x ", pdata[i]);
484  }
485  printf("\n");
486  }
487  } while(pbk != NULL);
488 
489  printf("--------\n");
490 }
INT read_periodic_event ( char *  pevent,
INT  off 
)
INT read_trigger_event ( char *  pevent,
INT  off 
)
INT resume_run ( INT  run_number,
char *  error 
)

Definition at line 371 of file crate.cpp.

372 {
373  return SUCCESS;
374 }
void start_cycle ( )

Definition at line 324 of file crate.cpp.

References diag_print(), i, num_trigger_modules, printf(), readout_finished_time, and start_cycle().

325 {
326  printf("starting new cycle in crate.cpp\n");
327  struct timeval restart_time;
328  gettimeofday(&restart_time, NULL);
329 
330  for(int i = 0; i < num_trigger_modules; i++) {
331  if((*trigger_modules[i]).start_cycle != NULL) {
333  }
334  }
335 
336  diag_print(2, "Waited %f microseconds for restart.\n",
337  (restart_time.tv_sec-readout_finished_time.tv_sec)*1e6 +
338  (restart_time.tv_usec-readout_finished_time.tv_usec));
339 
340  cycle_active = 1;
341 }
void stop_cycle ( )

Definition at line 365 of file crate.cpp.

References i, num_trigger_modules, and stop_cycle().

366 {
367  for(int i = 0; i < num_trigger_modules; i++) {
368  if((*trigger_modules[i]).stop_cycle != NULL) {
370  }
371  }
372 }

Variable Documentation

bool between_runs = true

Definition at line 123 of file crate.cpp.

int crate_number = 5

Definition at line 125 of file crate.cpp.

int cycle_active = 0

Definition at line 120 of file crate.cpp.

INT display_period = 0

Definition at line 45 of file crate.cpp.

struct readout_module dt5720_module

Definition at line 55 of file dt5720_module.c.

EQUIPMENT equipment[]
Initial value:
= {
{"Crate ",
{1000, TRIGGER_ALL,
"BUF",
EQ_POLLED | EQ_EB,
LAM_SOURCE(0, 0xFFFFFF),
"MIDAS",
TRUE,
RO_RUNNING,
500,
0,
0,
0,
"", "", ""},
},
{""}
}

Definition at line 75 of file crate.cpp.

bool event_avail = false

Definition at line 121 of file crate.cpp.

INT event_buffer_size = DEFAULT_EVENT_BUFFER_SIZE

Definition at line 55 of file crate.cpp.

BOOL frontend_call_loop = TRUE

Definition at line 41 of file crate.cpp.

char* frontend_file_name = __FILE__

Definition at line 38 of file crate.cpp.

int frontend_index

Definition at line 314 of file mfe_mucap.c.

char* frontend_name

Definition at line 35 of file crate.cpp.

void(* interrupt_handler)() = NULL

Definition at line 32 of file crate.cpp.

BOOL interrupts_enabled = FALSE

Definition at line 31 of file crate.cpp.

INT max_event_size = MAX_EVENT_SIZE

Definition at line 49 of file crate.cpp.

INT max_event_size_frag = 0

Definition at line 52 of file crate.cpp.

int num_periodic_modules = sizeof(periodic_modules)/sizeof(periodic_modules[0])

Definition at line 118 of file crate.cpp.

int num_trigger_modules = sizeof(trigger_modules)/sizeof(trigger_modules[0])

Definition at line 106 of file crate.cpp.

struct readout_module* periodic_modules[]
Initial value:
= {
}

Definition at line 115 of file crate.cpp.

struct timeval readout_finished_time

Definition at line 108 of file crate.cpp.

struct readout_module rpc_master_module

Definition at line 38 of file rpc_master.cpp.

struct readout_module rpc_slave_module

Definition at line 35 of file rpc_slave.cpp.

int run_state

PROGRAM: crate.cpp DESCRIPTION: Control and readout of CAEN V1724 digitizers. author: V.Tishchenko date: 12-Aug-2012

Modifications:

Definition at line 322 of file mfe_mucap.c.

struct readout_module* trigger_modules[]
Initial value:

Definition at line 101 of file crate.cpp.