MIDAS
Loading...
Searching...
No Matches
deferredfe.cxx
Go to the documentation of this file.
1/********************************************************************\
2
3 Name: deferredfe.cxx
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
19#include "mfe.h"
20
21/*-- Globals -------------------------------------------------------*/
22
23/* The frontend name (client name) as seen by other MIDAS clients */
24 const char *frontend_name = "deferredfe";
25
26/* The frontend file name, don't change it */
27 const char *frontend_file_name = __FILE__;
28
29/* frontend_loop is called periodically if this variable is TRUE */
31
32/* a frontend status page is displayed with this frequency in ms */
34
35/* maximum event size produced by this frontend */
37
38/* maximum event size for fragmented events (EQ_FRAGMENTED) */
39 INT max_event_size_frag = 5 * 1024 * 1024;
40
41/* buffer size to hold events */
42 INT event_buffer_size = 10 * 10000;
43
44/* number of channels */
45#define N_ADC 4
46#define N_TDC 8
47#define N_SCLR 4
48
49/* CAMAC crate and slots */
50#define CRATE 0
51#define SLOT_IO 23
52#define SLOT_ADC 1
53#define SLOT_TDC 2
54#define SLOT_SCLR 3
55
56/*-- Function declarations -----------------------------------------*/
57
60 INT begin_of_run(INT run_number, char *error);
61 INT end_of_run(INT run_number, char *error);
62 INT pause_run(INT run_number, char *error);
63 INT resume_run(INT run_number, char *error);
65
66 INT read_deferred_event(char *pevent, INT off);
67
68/*-- Equipment list ------------------------------------------------*/
69
70#undef USE_INT
72
74
75 {"Deferred", /* equipment name */
76 {2, 0, /* event ID, trigger mask */
77 "SYSTEM", /* event buffer */
78 EQ_PERIODIC, /* equipment type */
79 0, /* event source */
80 "MIDAS", /* format */
81 TRUE, /* enabled */
82 RO_RUNNING | /* read when running */
83 RO_ODB, /* and update ODB */
84 2000, /* read every 2 sec */
85 0, /* stop run after this event limit */
86 0, /* number of sub events */
87 0, /* log history */
88 "", "", "",},
89 read_deferred_event, /* readout routine */
90 },
91 {""}
92 };
93
94
95/********************************************************************\
96 Callback routines for system transitions
97
98 These routines are called whenever a system transition like start/
99 stop of a run occurs. The routines are called on the following
100 occations:
101
102 frontend_init: When the frontend program is started. This routine
103 should initialize the hardware.
104
105 frontend_exit: When the frontend program is shut down. Can be used
106 to releas any locked resources like memory, commu-
107 nications ports etc.
108
109 begin_of_run: When a new run is started. Clear scalers, open
110 rungates, etc.
111
112 end_of_run: Called on a request to stop a run. Can send
113 end-of-run event and close run gates.
114
115 pause_run: When a run is paused. Should disable trigger events.
116
117 resume_run: When a run is resumed. Should enable trigger events.
118
119\********************************************************************/
123
124//-- Deferred transition callback
126{
127 // Get there after every
128 if (first) {
129 // Get there as soon as transition is requested
131 printf("Transition requested...\n");
132 // Defer the transition now
133 return FALSE;
134 }
135 // Check user flag
136 if (end_of_mcs_cycle) {
137 // User flag set, ready to perform deferred transition now
140 return TRUE;
141 } else {
142 // User not ready for transition, defers it...
143 return FALSE;
144 }
145}
146
147/*-- Frontend Init -------------------------------------------------*/
149{
150 // register for deferred transition
153
154
155 /* hardware initialization */
156
157 return SUCCESS;
158}
159
160/*-- Frontend Exit -------------------------------------------------*/
161
163{
164 return SUCCESS;
165}
166
167/*-- Begin of Run --------------------------------------------------*/
168
170{
171 /* put here clear scalers etc. */
172 pseudo_delay = 0;
173 return SUCCESS;
174}
175
176/*-- End of Run ----------------------------------------------------*/
177
179{
180 return SUCCESS;
181}
182
183/*-- Pause Run -----------------------------------------------------*/
184
186{
187 return SUCCESS;
188}
189
190/*-- Resuem Run ----------------------------------------------------*/
191
193{
194 return SUCCESS;
195}
196
197/*-- Frontend Loop -------------------------------------------------*/
198
200{
201 /* if frontend_call_loop is true, this routine gets called when
202 the frontend is idle or once between every event */
203 return SUCCESS;
204}
205
206/*------------------------------------------------------------------*/
207
208/********************************************************************\
209
210 Readout routines for different events
211
212\********************************************************************/
213
214/*-- Trigger event routines ----------------------------------------*/
215
217/* Polling routine for events. Returns TRUE if event
218 is available. If test equals TRUE, don't return. The test
219 flag is used to time the polling */
220{
221 int i;
222 DWORD flag;
223
224 for (i = 0; i < count; i++) {
225 /* poll hardware and set flag to TRUE if new event is available */
226 flag = TRUE;
227
228 if (flag)
229 if (!test)
230 return TRUE;
231 }
232
233 return 0;
234}
235
236/*-- Interrupt configuration ---------------------------------------*/
237
239{
240 switch (cmd) {
242 break;
244 break;
246 break;
248 break;
249 }
250 return SUCCESS;
251}
252
253/*-- Deferred event --------------------------------------------------*/
254INT read_deferred_event(char *pevent, INT off)
255{
256 DWORD *pdata, a;
257
258 /* init bank structure */
259 bk_init(pevent);
260
261
262 /* create SCLR bank */
263 bk_create(pevent, "SCLR", TID_DWORD, (void **) &pdata);
264
265 /* read scaler bank */
266 for (a = 0; a < N_SCLR; a++)
267 *pdata++ = rand()%1024 + rand()%1024 + rand()%1024 + rand()%1024;
268
269 bk_close(pevent, pdata);
270
272 // transition acknowledged, but...
273 // carry on until hardware condition satisfied
274 // ...
275 if (pseudo_delay++ < 5) {
276 // Ignore transition
277 printf("Transition ignored, ");
278 } else {
279 // Time to do transition
280 printf("End of cycle... perform transition\n");
282 }
283 }
284 printf("Event ID:%d - Event#: %d\n", EVENT_ID(pevent), SERIAL_NUMBER(pevent));
285 return bk_size(pevent);
286}
#define FALSE
Definition cfortran.h:309
INT transition(INT run_number, char *error)
Definition consume.cxx:35
BOOL frontend_call_loop
const char * frontend_file_name
INT max_event_size
INT frontend_exit()
Frontend exit.
INT frontend_init()
Frontend initialization.
INT event_buffer_size
BOOL transition_PS_requested
INT max_event_size_frag
INT interrupt_configure(INT cmd, INT source, PTYPE adr)
BOOL wait_end_cycle(int transition, BOOL first)
BOOL end_of_mcs_cycle
BOOL equipment_common_overwrite
INT read_deferred_event(char *pevent, INT off)
INT poll_event(INT source, INT count, BOOL test)
EQUIPMENT equipment[]
const char * frontend_name
INT display_period
#define N_SCLR
int pseudo_delay
INT begin_of_run(INT run_number, char *error)
Begin of Run.
INT frontend_loop()
Frontend loop.
INT end_of_run(INT run_number, char *error)
End of Run.
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
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 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 EVENT_ID(e)
Definition midas.h:873
#define resume_run
#define pause_run
program test
Definition miniana.f:6