MIDAS
Loading...
Searching...
No Matches
midas_macro.h
Go to the documentation of this file.
1/********************************************************************\
2
3 Name: midas_macro.h
4 Created by: Stefan Ritt
5
6 Contents: C macros for writing a MIDAS frontend
7
8 $Id$
9
10\********************************************************************/
11
12#include <stdio.h>
13#include <midas.h>
14#include <cd_hv.h>
15#include "mcstd.h"
16#include "experim.h"
17
18/*-- Globals -------------------------------------------------------*/
19
23
24#define name(x) char *frontend_name = #x; char *frontend_file_name = __FILE__;
25#define display(s) INT display_period = s*1000;
26
27#ifdef TRIGGER_SETTINGS_DEFINED
29#endif
30
31#ifdef SCALER_SETTINGS_DEFINED
33#endif
34
35#ifdef EXP_PARAM_DEFINED
37#endif
38
39/*-- Function declarations -----------------------------------------*/
40
43INT begin_of_run(INT run_number, char *error);
44INT end_of_run(INT run_number, char *error);
45INT pause_run(INT run_number, char *error);
46INT resume_run(INT run_number, char *error);
48
49INT read_trigger(char *pevent);
50INT read_scaler(char *pevent);
51
52/*-- Equipment list ------------------------------------------------*/
53
54#define mask(slot) (1<<(slot-1))
55
56#define equipment_begin EQUIPMENT equipment[] = {
57
58#define equipment_end { "" }};
59
60#define equipment(name, id, type, source, readon, period, readout, cd, driver) \
61 { #name, id, 0, "SYSTEM", type, source, "MIDAS", TRUE, readon, period, 0, 0, "","","", \
62 readout, cd, driver },
63
64#define equipment_trigger(id, type, s) \
65 equipment(Trigger, id, EQ_##type, s, RO_RUNNING|RO_ODB, 500, \
66 read_trigger, NULL, NULL)
67
68#define equipment_periodic(name, id, period) \
69 equipment(name, id, EQ_PERIODIC, 0,\
70 RO_RUNNING|RO_TRANSITIONS|RO_ODB, period*1000,\
71 read_##name, NULL, NULL)
72
73#define equipment_hv(id, period) \
74 equipment(HV, id, EQ_SLOW, 0,\
75 RO_RUNNING|RO_TRANSITIONS, period*1000,\
76 cd_hv_read, cd_hv, hv_driver)
77
78#define hv_driver_begin DEVICE_DRIVER hv_driver[] = {
79
80#define driver(name, count) { #name, name, count },
81
82#define hv_driver_end { "" }};
83
84/*-- Polling routine -----------------------------------------------*/
85
87/* Polling routine for events. Returns "source" if event
88 is available. If test equals TRUE, don't return. The test
89 flag is used to time the polling */
90{
91 INT i, lam;
92
93 for (i = 0; i < count; i++) {
94 cam_lam_read(source >> 24, &lam);
95 if (lam)
96 if (!test)
97 return TRUE;
98 }
99
100 return FALSE;
101}
102
103/*-- Interrupt configuration for trigger event ---------------------*/
104
106{
107 switch (cmd) {
110 break;
113 break;
115 cam_interrupt_attach((void (*)()) adr);
116 break;
119 break;
120 }
121 return SUCCESS;
122}
123
124/*-- trigger settings callback -------------------------------------*/
125
126#ifdef TRIGGER_SETTINGS_DEFINED
127void trigger_update(void);
128
130{
132}
133#endif
134
135#define trigger_update_begin void trigger_update(void) {
136#define trigger_update_end }
137
138/*-- Frontend init function ----------------------------------------*/
139
140void user_init(void);
141void user_exit(void);
142
144{
145 HNDLE hkey;
146#ifdef EXP_PARAM_DEFINED
148#endif
149#ifdef TRIGGER_SETTINGS_DEFINED
151#endif
152#ifdef SCALER_SETTINGS_STR
154#endif
155
157
158#ifdef EXP_PARAM_DEFINED
159 db_create_record(hdb, 0, "/Experiment/Run Parameters", strcomb1(exp_param_str).c_str());
160 db_find_key(hdb, 0, "/Experiment/Run Parameters", &hkey);
162 sizeof(exp_param), MODE_READ, NULL, NULL) != DB_SUCCESS) {
163 cm_msg(MERROR, "frontend_init", "Cannot open Run Parameters in ODB");
164 return -1;
165 }
166#endif
167#ifdef TRIGGER_SETTINGS_DEFINED
168 db_create_record(hdb, 0, "/Equipment/Trigger/Settings", strcomb1(trigger_settings_str).c_str());
169 db_find_key(hdb, 0, "/Equipment/Trigger/Settings", &hkey);
173 cm_msg(MERROR, "frontend_init", "Cannot open Trigger Settings in ODB");
174 return -1;
175 }
176#endif
177#ifdef SCALER_SETTINGS_DEFINED
178 db_create_record(hdb, 0, "/Equipment/Scaler/Settings", strcomb1(scaler_settings_str).c_str());
179 db_find_key(hdb, 0, "/Equipment/Scaler/Settings", &hkey);
182 cm_msg(MERROR, "frontend_init", "Cannot open Scaler Settings in ODB");
183 return -1;
184 }
185#endif
186
187 user_init();
188 return SUCCESS;
189}
190
192{
193 user_exit();
194 return SUCCESS;
195}
196
197#define init_begin void user_init() {
198#define init_end }
199#define exit_begin void user_exit() {
200#define exit_end }
201
202/*-- Callback functions --------------------------------------------*/
203
204#define begin_run INT begin_of_run(INT run_number, char *error) {
205#define begin_run_end return SUCCESS; }
206#define end_run INT end_of_run(INT run_number, char *error) {
207#define end_run_end return SUCCESS; }
208#define pause_run INT pause_run(INT run_number, char *error) {
209#define pause_run_end return SUCCESS; }
210#define resume_run INT resume_run(INT run_number, char *error) {
211#define resume_run_end return SUCCESS; }
212
213/*-- Frontend Loop -------------------------------------------------*/
214
216{
217 return SUCCESS;
218}
219
220/*-- Event readout -------------------------------------------------*/
221
222#define readout_begin(name) INT read_##name(char *pevent) \
223{ \
224WORD *pdata; INT source; \
225 \
226 source = *((INT *)pevent); \
227 bk_init(pevent); {
228
229#define readout_end } return bk_size(pevent); }
230
231#define readout_abort return 0;
232
233#define trigger_mask TRIGGER_MASK(pevent)
234#define event_id EVENT_ID(pevent)
235#define serial_number SERIAL_NUMBER(pevent)
236#define time_stamp TIME_STAMP(pevent)
237
238#define bank(name) bk_create(pevent, #name, TID_WORD, &pdata);
239#define bank32(name) bk_create(pevent, #name, TID_DWORD, &pdata);
240#define bank_end bk_close(pevent, pdata);
241
242#define read(n,a,f) cam16i(_crate,n,a,f,pdata++);
243#define read_into(n,a,f,d) cam16i(_crate,n,a,f,&d);
244#define read32(n,a,f) { cam24i(_crate,n,a,f,(DWORD*)pdata); ((DWORD*)pdata)++; }
245#define write(n,a,f,d) cam24o(_crate,n,a,f,d);
246#define control(n,a,f) camc(_crate,n,a,f);
247#define test_q(n,a,f,q) camc_q(_crate,n,a,f,&q);
248#define wait_q(n,a,f) { int _q; do { camc_q(_crate,n,a,f,&_q); } while(!_q); }
249#define last_read *(pdata-1)
250#define last_read32 *(((DWORD *)pdata)-1)
251
252#define camac_init cam_init();
253#define camac_set_crate(c) _crate = c;
254#define camac_crate_clear cam_crate_clear(_crate);
255#define camac_crate_zinit cam_crate_zinit(_crate);
256#define camac_inhibit_clear cam_inhibit_clear(_crate);
257#define camac_inhibit_set cam_inhibit_set(_crate);
258#define camac_lam_enable(n) cam_lam_enable(_crate,n);
259
260#define camac_lam_clear(n) cam_lam_clear(_crate,n);
261
262#define message(type, str) cm_msg(M##type, "user code", str);
263
264/*-- Library functions ---------------------------------------------*/
265
266#define odb_set(path, value, type) \
267 db_set_value(hdb, 0, #path, &value, sizeof(value), 1, TID_##type);
268
269#define sleep(ms) ss_sleep(ms);
270
271/*-- Language elements ---------------------------------------------*/
272
273#define variable(name) int name;
274#define constant(name, value) int name=value;
275
276#define increment(var) var++;
277#define decrement(var) var--;
278#define set(var, value) var = value;
279
280#define loop(var,c1,c2) for (var=c1 ; var<=c2 ; var++)
281#define call(sub) sub();
282#define begin {
283#define end }
284
285#define equal ==
286#define or ||
287#define and &&
EXP_PARAM exp_param
Definition analyzer.cxx:51
TRIGGER_SETTINGS trigger_settings
Definition analyzer.cxx:52
#define FALSE
Definition cfortran.h:309
#define EXP_PARAM_STR(_name)
Definition experim.h:30
#define TRIGGER_SETTINGS_STR(_name)
Definition experim.h:166
INT cm_get_experiment_database(HNDLE *hDB, HNDLE *hKeyClient)
Definition midas.cxx:3011
#define DB_SUCCESS
Definition midas.h:631
#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 cam_lam_read(const int c, DWORD *lam)
EXTERNAL void EXPRT cam_interrupt_disable(const int c)
EXTERNAL void EXPRT cam_interrupt_enable(const int c)
EXTERNAL void EXPRT cam_interrupt_attach(const int c, const int n, void(*isr)(void))
EXTERNAL void EXPRT cam_interrupt_detach(const int c, const int n)
#define SUCCESS
Definition mcstd.h:54
#define MERROR
Definition midas.h:559
#define MODE_READ
Definition midas.h:370
INT cm_msg(INT message_type, const char *filename, INT line, const char *routine, const char *format,...)
Definition midas.cxx:915
INT db_open_record(HNDLE hDB, HNDLE hKey, void *ptr, INT rec_size, WORD access_mode, void(*dispatcher)(INT, INT, void *), void *info)
Definition odb.cxx:13291
std::string strcomb1(const char **list)
Definition odb.cxx:598
INT db_find_key(HNDLE hDB, HNDLE hKey, const char *key_name, HNDLE *subhKey)
Definition odb.cxx:4079
INT db_create_record(HNDLE hDB, HNDLE hKey, const char *orig_key_name, const char *init_str)
Definition odb.cxx:12800
HNDLE hKey
INT run_number[2]
Definition mana.cxx:246
HNDLE hDB
main ODB handle
Definition mana.cxx:207
double count
Definition mdump.cxx:33
INT i
Definition mdump.cxx:32
INT HNDLE
Definition midas.h:132
DWORD BOOL
Definition midas.h:105
int INT
Definition midas.h:129
#define PTYPE
Definition midas.h:170
#define TRUE
Definition midas.h:182
BOOL frontend_call_loop
Definition midas_macro.h:20
INT frontend_exit()
Frontend exit.
INT frontend_init()
Frontend initialization.
#define resume_run
void user_exit(void)
INT read_trigger(char *pevent)
INT interrupt_configure(INT cmd, INT source, PTYPE adr)
HNDLE hdb
Definition midas_macro.h:21
INT poll_event(INT source, INT count, BOOL test)
Definition midas_macro.h:86
INT _crate
Definition midas_macro.h:22
void user_init(void)
#define pause_run
INT begin_of_run(INT run_number, char *error)
Begin of Run.
Definition feudp.cxx:361
INT frontend_loop()
Frontend loop.
INT end_of_run(INT run_number, char *error)
End of Run.
Definition feudp.cxx:368
INT read_scaler(char *pevent)
program test
Definition miniana.f:6
TH1X EXPRT * h1_book(const char *name, const char *title, int bins, double min, double max)
Definition rmidas.h:24