/*****************************************************************\ Name: frontend.c Created by: Zhe Wang Date: 03/16/2015 Modified by: Mohan Li Date: 07/04/2016 Contents: Experiment specific readout code (user part) of Midas frontend. Supported VME modules: CAEN V2718 VME-CONET Bridge CAEN V1751 10-Bits 1-GHz Flash ADC Experiment: Dark noise Currently: Use CAEN_Digitizer lib. Use Ramdom number to avoid disconnection. $Id: $ \********************************************************************/ #include #include #include #include #include #include "midas.h" #include "mcstd.h" #include "mvmestd.h" #include "experim.h" #include "v1751.h" #include "CAENDigitizer.h" /* make frontend functions callable from the C framework */ #ifdef __cplusplus extern "C" { #endif /*-- Globals -------------------------------------------------------*/ /* The frontend name (client name) as seen by other MIDAS clients */ char *frontend_name = "Frontend"; /* The frontend file name, don't change it */ char *frontend_file_name = __FILE__; /* frontend_loop is called periodically if this variable is TRUE */ BOOL frontend_call_loop = FALSE; /* a frontend status page is displayed with this frequency in ms */ INT display_period = 500; /* maximum event size produced by this frontend */ //INT max_event_size = 10000; INT max_event_size = 100000; //modified according to feov1721.cxx /* maximum event size for fragmented events (EQ_FRAGMENTED) */ INT max_event_size_frag = 5 * 1024 * 1024; /* buffer size to hold events */ INT event_buffer_size = 200 * 100000; #define NFADC 1 #define NMax 4 int hFADC[NFADC]; /* VMEBaseAddress */ uint32_t FADCBA[NMax] = {0x000C0000,0,0,0}; // FADC base address 0x80000000 uint32_t EvtCounterFadc[NMax]; /* Time in second*/ uint32_t TimeInSec; /* initiate variables */ FILE* logfile; //CAENComm_ErrorCode sCAENc; int l=0, d=0, h=0, Nh; uint32_t i, lcount, temp, lam, reg, data[50000]; int Nmodulo=10; //print transmission information every Nmodulo events int tcount=0, eloop=0; DWORD eStored, eSize; DWORD eventReady; DWORD BLTNB; DWORD recordlength; uint32_t recordsize = 0x1000; int loop, Nloop=10; int bshowData=0; // 1 to enable data print int debug = 0; uint32_t pct=0, ct; struct timeval t1; int dt1, savelcount=0; float trg_rate =0; int data_test = 0; // 1 for stored data check int simulation = 0;// 1 for simulation mode /*-------------CAEN Digitier vairables----------*/ int card=0; CAEN_DGTZ_ErrorCode sCAEN; CAEN_DGTZ_BoardInfo_t BoardInfo; char *buffer = NULL; //pointer to the read out buffer int c = 0; uint32_t size; //buffer allocated for reading data uint32_t bsize; #define INTERRUPT_TIMEOUT 20000 //20000ms = 20s #define VME_INTERRUPT_LEVEL 1 #define VME_INTERRUPT_STATUS_ID 0xAAAA #define IRQ_EVENT_NUMBER 1 /*-- Function declarations -----------------------------------------*/ INT frontend_init(); INT frontend_exit(); 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 read_trigger_event(char *pevent, INT off); INT frontend_config(); /*-- Equipment list ------------------------------------------------*/ #undef USE_INT //#define USE_INT EQUIPMENT equipment[] = { {"Trigger", /* equipment name */ {1, 0, /* event ID, trigger mask */ "SYSTEM", /* event buffer */ #ifdef USE_INT EQ_INTERRUPT, /* equipment type */ #else EQ_POLLED, /* equipment type */ #endif // LAM_SOURCE(CRATE, LAM_STATION(SLOT_ADC)), /* event source */ LAM_SOURCE(0, 0xFFFFFF), /* event source crate 0, all stations, by Li*/ "MIDAS", /* format */ TRUE, /* enabled */ RO_RUNNING | /* read only when running */ RO_ODB, /* and update ODB */ 500, /* poll for 500ms */ 0, /* stop run after this event limit */ 0, /* number of sub events */ 0, /* don't log history */ "", "", "",}, read_trigger_event, /* readout routine */ }, {""} }; #ifdef __cplusplus } #endif /********************************************************************\ Callback routines for system transitions These routines are called whenever a system transition like start/ stop of a run occurs. The routines are called on the following occations: frontend_init: When the frontend program is started. This routine should initialize the hardware. frontend_exit: When the frontend program is shut down. Can be used to releas any locked resources like memory, commu- nications ports etc. begin_of_run: When a new run is started. Clear scalers, open rungates, etc. end_of_run: Called on a request to stop a run. Can send end-of-run event and close run gates. pause_run: When a run is paused. Should disable trigger events. resume_run: When a run is resumed. Should enable trigger events. \********************************************************************/ /*-- Frontend Init -------------------------------------------------*/ INT frontend_init() { // Open FADC digitizer for( card=0; card>>>>Event size is 0 \n"); } gettimeofday(&tp, NULL); t2 = tp.tv_usec; printf("t2-t0 = %lu.\n", t2-t0); ss_sleep(1); gettimeofday(&tp, NULL); t3 = tp.tv_usec; printf("t3-t0 = %lu.\n", t3-t0); return bk_size(pevent); }