MIDAS
Loading...
Searching...
No Matches
deferredfe.c
Go to the documentation of this file.
1/********************************************************************\
2
3 Name: deferredfe.c
4 Created by: Stefan Ritt
5
6 Contents: Experiment specific readout code (user part) of
7 Midas frontend. This example demonstrates the
8 implementation of the deferred transition request.
9
10
11 $Id:$
12
13\********************************************************************/
14
15#include <stdio.h>
16#include <stdlib.h>
17#include "midas.h"
18#include "mcstd.h"
19#include "experim.h"
20
21/* make frontend functions callable from the C framework */
22#ifdef __cplusplus
23extern "C" {
24#endif
25
26/*-- Globals -------------------------------------------------------*/
27
28/* The frontend name (client name) as seen by other MIDAS clients */
29 char *frontend_name = "deferredfe";
30/* The frontend file name, don't change it */
31 char *frontend_file_name = __FILE__;
32
33/* frontend_loop is called periodically if this variable is TRUE */
35
36/* a frontend status page is displayed with this frequency in ms */
38
39/* maximum event size produced by this frontend */
41
42/* maximum event size for fragmented events (EQ_FRAGMENTED) */
43 INT max_event_size_frag = 5 * 1024 * 1024;
44
45/* buffer size to hold events */
46 INT event_buffer_size = 10 * 10000;
47
48/* number of channels */
49#define N_ADC 4
50#define N_TDC 8
51#define N_SCLR 4
52
53/* CAMAC crate and slots */
54#define CRATE 0
55#define SLOT_IO 23
56#define SLOT_ADC 1
57#define SLOT_TDC 2
58#define SLOT_SCLR 3
59
60/*-- Function declarations -----------------------------------------*/
61
64 INT begin_of_run(INT run_number, char *error);
65 INT end_of_run(INT run_number, char *error);
66 INT pause_run(INT run_number, char *error);
67 INT resume_run(INT run_number, char *error);
69
70 INT read_deferred_event(char *pevent, INT off);
71
72/*-- Bank definitions ----------------------------------------------*/
73
74 ADC0_BANK_STR(adc0_bank_str);
75
77 {"ADC0", TID_STRUCT, sizeof(ADC0_BANK), adc0_bank_str}
78 ,
79 {"TDC0", TID_WORD, N_TDC, NULL}
80 ,
81
82 {""}
83 ,
84 };
85
87 {"SCLR", TID_DWORD, N_ADC, NULL}
88 ,
89 {""}
90 ,
91 };
92
93/*-- Equipment list ------------------------------------------------*/
94
95#undef USE_INT
96
98
99 {"Deferred", /* equipment name */
100 2, 0, /* event ID, trigger mask */
101 "SYSTEM", /* event buffer */
102 EQ_PERIODIC, /* equipment type */
103 0, /* event source */
104 "MIDAS", /* format */
105 TRUE, /* enabled */
106 RO_RUNNING | /* read when running */
107 RO_ODB, /* and update ODB */
108 2000, /* read every 2 sec */
109 0, /* stop run after this event limit */
110 0, /* number of sub events */
111 0, /* log history */
112 "", "", "",
113 read_deferred_event, /* readout routine */
114 NULL, NULL,
115 NULL, /* bank list */
116 }
117 ,
118
119 {"Junk", /* equipment name */
120 2, 0, /* event ID, trigger mask */
121 "SYSTEM", /* event buffer */
122 EQ_PERIODIC, /* equipment type */
123 0, /* event source */
124 "MIDAS", /* format */
125 TRUE, /* enabled */
126 RO_RUNNING | /* read when running */
127 RO_ODB, /* and update ODB */
128 2000, /* read every 2 sec */
129 }
130 ,
131
132 {""}
133 };
134
135#ifdef __cplusplus
136}
137#endif
138/********************************************************************\
139 Callback routines for system transitions
140
141 These routines are called whenever a system transition like start/
142 stop of a run occurs. The routines are called on the following
143 occations:
144
145 frontend_init: When the frontend program is started. This routine
146 should initialize the hardware.
147
148 frontend_exit: When the frontend program is shut down. Can be used
149 to releas any locked resources like memory, commu-
150 nications ports etc.
151
152 begin_of_run: When a new run is started. Clear scalers, open
153 rungates, etc.
154
155 end_of_run: Called on a request to stop a run. Can send
156 end-of-run event and close run gates.
157
158 pause_run: When a run is paused. Should disable trigger events.
159
160 resume_run: When a run is resumed. Should enable trigger events.
161
162\********************************************************************/
166
167//-- Deferred transition callback
169{
170 // Get there after every
171 if (first) {
172 // Get there as soon as transition is requested
174 printf("Transition requested...\n");
175 // Defer the transition now
176 return FALSE;
177 }
178 // Check user flag
179 if (end_of_mcs_cycle) {
180 // User flag set, ready to perform deferred transition now
183 return TRUE;
184 } else {
185 // User not ready for transition, defers it...
186 return FALSE;
187 }
188}
189
190/*-- Frontend Init -------------------------------------------------*/
192{
193 // register for deferred transition
196
197
198 /* hardware initialization */
199
200 cam_init();
203
204 /* enable LAM in IO unit */
205 camc(CRATE, SLOT_IO, 0, 26);
206
207 /* enable LAM in crate controller */
209
210 /* reset external LAM Flip-Flop */
211 camo(CRATE, SLOT_IO, 1, 16, 0xFF);
212 camo(CRATE, SLOT_IO, 1, 16, 0);
213
214 /* print message and return FE_ERR_HW if frontend should not be started */
215
216
217 return SUCCESS;
218}
219
220/*-- Frontend Exit -------------------------------------------------*/
221
223{
224 return SUCCESS;
225}
226
227/*-- Begin of Run --------------------------------------------------*/
228
230{
231 /* put here clear scalers etc. */
232 pseudo_delay = 0;
233 return SUCCESS;
234}
235
236/*-- End of Run ----------------------------------------------------*/
237
239{
240 return SUCCESS;
241}
242
243/*-- Pause Run -----------------------------------------------------*/
244
246{
247 return SUCCESS;
248}
249
250/*-- Resuem Run ----------------------------------------------------*/
251
253{
254 return SUCCESS;
255}
256
257/*-- Frontend Loop -------------------------------------------------*/
258
260{
261 /* if frontend_call_loop is true, this routine gets called when
262 the frontend is idle or once between every event */
263 return SUCCESS;
264}
265
266/*------------------------------------------------------------------*/
267
268/********************************************************************\
269
270 Readout routines for different events
271
272\********************************************************************/
273
274/*-- Trigger event routines ----------------------------------------*/
275
277/* Polling routine for events. Returns TRUE if event
278 is available. If test equals TRUE, don't return. The test
279 flag is used to time the polling */
280{
281 int i;
282 DWORD lam;
283
284 for (i = 0; i < count; i++) {
285 cam_lam_read(LAM_SOURCE_CRATE(source), &lam);
286
287 if (lam & LAM_SOURCE_STATION(source))
288 if (!test)
289 return lam;
290 }
291
292 return 0;
293}
294
295/*-- Interrupt configuration ---------------------------------------*/
296
298{
299 switch (cmd) {
301 break;
303 break;
305 break;
307 break;
308 }
309 return SUCCESS;
310}
311
312/*-- Deferred event --------------------------------------------------*/
313INT read_deferred_event(char *pevent, INT off)
314{
315 DWORD *pdata, a;
316
317 /* init bank structure */
318 bk_init(pevent);
319
320
321 /* create SCLR bank */
322 bk_create(pevent, "SCLR", TID_DWORD, &pdata);
323
324 /* read scaler bank */
325 for (a = 0; a < N_SCLR; a++)
326 cam24i(CRATE, SLOT_SCLR, a, 0, pdata++);
327
328 bk_close(pevent, pdata);
329
331 // transition acknowledged, but...
332 // carry on until hardware condition satisfied
333 // ...
334 if (pseudo_delay++ < 3) {
335 // Ignore transition
336 printf("Transition ignored, ");
337 } else {
338 // Time to do transition
339 printf("End of cycle... perform transition\n");
341 }
342 }
343 printf("Event ID:%d - Event#: %d\n", EVENT_ID(pevent), SERIAL_NUMBER(pevent));
344 return bk_size(pevent);
345}
#define FALSE
Definition cfortran.h:309
INT transition(INT run_number, char *error)
Definition consume.cxx:35
BOOL frontend_call_loop
Definition deferredfe.c:34
#define SLOT_SCLR
Definition deferredfe.c:58
INT max_event_size
Definition deferredfe.c:40
INT frontend_exit()
Frontend exit.
Definition deferredfe.c:222
INT frontend_init()
Frontend initialization.
Definition deferredfe.c:191
INT event_buffer_size
Definition deferredfe.c:46
BOOL transition_PS_requested
Definition deferredfe.c:164
INT max_event_size_frag
Definition deferredfe.c:43
INT interrupt_configure(INT cmd, INT source, PTYPE adr)
Definition deferredfe.c:297
BANK_LIST trigger_bank_list[]
Definition deferredfe.c:76
BOOL wait_end_cycle(int transition, BOOL first)
Definition deferredfe.c:168
BOOL end_of_mcs_cycle
Definition deferredfe.c:165
#define N_TDC
Definition deferredfe.c:50
INT read_deferred_event(char *pevent, INT off)
Definition deferredfe.c:313
ADC0_BANK_STR(adc0_bank_str)
#define SLOT_IO
Definition deferredfe.c:55
INT poll_event(INT source, INT count, BOOL test)
Definition deferredfe.c:276
EQUIPMENT equipment[]
Definition deferredfe.c:97
INT display_period
Definition deferredfe.c:37
char * frontend_name
Definition deferredfe.c:29
char * frontend_file_name
Definition deferredfe.c:31
#define N_SCLR
Definition deferredfe.c:51
int pseudo_delay
Definition deferredfe.c:163
INT begin_of_run(INT run_number, char *error)
Begin of Run.
Definition deferredfe.c:229
#define CRATE
Definition deferredfe.c:54
INT frontend_loop()
Frontend loop.
Definition deferredfe.c:259
INT end_of_run(INT run_number, char *error)
End of Run.
Definition deferredfe.c:238
#define N_ADC
Definition deferredfe.c:49
BANK_LIST scaler_bank_list[]
Definition deferredfe.c:86
INT bk_close(void *event, void *pdata)
Definition midas.cxx:16780
void bk_init(void *event)
Definition midas.cxx:16406
void bk_create(void *event, const char *name, WORD type, void **pdata)
Definition midas.cxx:16561
INT bk_size(const void *event)
Definition midas.cxx:16495
INT cm_register_deferred_transition(INT transition, BOOL(*func)(INT, BOOL))
Definition midas.cxx:3837
#define CMD_INTERRUPT_ATTACH
Definition midas.h:822
#define CMD_INTERRUPT_DISABLE
Definition midas.h:821
#define CMD_INTERRUPT_ENABLE
Definition midas.h:820
#define CMD_INTERRUPT_DETACH
Definition midas.h:823
EXTERNAL void EXPRT cam_lam_enable(const int c, const int n)
EXTERNAL int EXPRT cam_init(void)
EXTERNAL void EXPRT cam24i(const int c, const int n, const int a, const int f, DWORD *d)
EXTERNAL void cam_lam_read(const int c, DWORD *lam)
EXTERNAL void EXPRT camo(const int c, const int n, const int a, const int f, WORD d)
EXTERNAL void EXPRT cam_crate_clear(const int c)
EXTERNAL void EXPRT camc(const int c, const int n, const int a, const int f)
EXTERNAL void EXPRT cam_crate_zinit(const int c)
unsigned int DWORD
Definition mcstd.h:51
#define SUCCESS
Definition mcstd.h:54
#define TR_PAUSE
Definition midas.h:407
#define RO_ODB
Definition midas.h:438
#define EQ_PERIODIC
Definition midas.h:414
#define TID_WORD
Definition midas.h:332
#define TID_STRUCT
Definition midas.h:348
#define TR_STOP
Definition midas.h:406
#define RO_RUNNING
Definition midas.h:426
#define TID_DWORD
Definition midas.h:336
INT run_number[2]
Definition mana.cxx:246
double count
Definition mdump.cxx:33
INT i
Definition mdump.cxx:32
DWORD BOOL
Definition midas.h:105
int INT
Definition midas.h:129
#define PTYPE
Definition midas.h:170
#define TRUE
Definition midas.h:182
#define SERIAL_NUMBER(e)
Definition midas.h:880
#define LAM_SOURCE_STATION(s)
Definition midas.h:487
#define EVENT_ID(e)
Definition midas.h:873
#define LAM_SOURCE_CRATE(c)
Definition midas.h:481
#define resume_run
#define pause_run
program test
Definition miniana.f:6