midas_macro.h

Go to the documentation of this file.
00001 /********************************************************************\
00002 
00003   Name:         midas_macro.h
00004   Created by:   Stefan Ritt
00005 
00006   Contents:     C macros for writing a MIDAS frontend
00007 
00008   $Id: midas_macro.h 3323 2006-09-20 09:32:09Z ritt $
00009 
00010 \********************************************************************/
00011 
00012 #include <stdio.h>
00013 #include <midas.h>
00014 #include <cd_hv.h>
00015 #include "mcstd.h"
00016 #include "experim.h"
00017 
00018 /*-- Globals -------------------------------------------------------*/
00019 
00020 BOOL frontend_call_loop = FALSE;
00021 HNDLE hdb;
00022 INT _crate = 0;
00023 
00024 #define name(x) char *frontend_name = #x; char *frontend_file_name = __FILE__;
00025 #define display(s) INT display_period = s*1000;
00026 
00027 #ifdef TRIGGER_SETTINGS_DEFINED
00028 TRIGGER_SETTINGS trigger_settings;
00029 #endif
00030 
00031 #ifdef SCALER_SETTINGS_DEFINED
00032 SCALER_SETTINGS scaler_settings;
00033 #endif
00034 
00035 #ifdef EXP_PARAM_DEFINED
00036 EXP_PARAM exp_param;
00037 #endif
00038 
00039 /*-- Function declarations -----------------------------------------*/
00040 
00041 INT frontend_init();
00042 INT frontend_exit();
00043 INT begin_of_run(INT run_number, char *error);
00044 INT end_of_run(INT run_number, char *error);
00045 INT pause_run(INT run_number, char *error);
00046 INT resume_run(INT run_number, char *error);
00047 INT frontend_loop();
00048 
00049 INT read_trigger(char *pevent);
00050 INT read_scaler(char *pevent);
00051 
00052 /*-- Equipment list ------------------------------------------------*/
00053 
00054 #define mask(slot) (1<<(slot-1))
00055 
00056 #define equipment_begin EQUIPMENT equipment[] = {
00057 
00058 #define equipment_end   { "" }};
00059 
00060 #define equipment(name, id, type, source, readon, period, readout, cd, driver) \
00061   { #name, id, 0, "SYSTEM", type, source, "MIDAS", TRUE, readon, period, 0, 0, "","","", \
00062     readout, cd, driver },
00063 
00064 #define equipment_trigger(id, type, s) \
00065   equipment(Trigger, id, EQ_##type, s, RO_RUNNING|RO_ODB, 500, \
00066   read_trigger, NULL, NULL)
00067 
00068 #define equipment_periodic(name, id, period)  \
00069   equipment(name, id, EQ_PERIODIC, 0,\
00070   RO_RUNNING|RO_TRANSITIONS|RO_ODB, period*1000,\
00071   read_##name, NULL, NULL)
00072 
00073 #define equipment_hv(id, period) \
00074   equipment(HV, id, EQ_SLOW, 0,\
00075   RO_RUNNING|RO_TRANSITIONS, period*1000,\
00076   cd_hv_read, cd_hv, hv_driver)
00077 
00078 #define hv_driver_begin DEVICE_DRIVER hv_driver[] = {
00079 
00080 #define driver(name, count) { #name, name, count },
00081 
00082 #define hv_driver_end { "" }};
00083 
00084 /*-- Polling routine -----------------------------------------------*/
00085 
00086 INT poll_event(INT source, INT count, BOOL test)
00087 /* Polling routine for events. Returns "source" if event
00088    is available. If test equals TRUE, don't return. The test
00089    flag is used to time the polling */
00090 {
00091    INT i, lam;
00092 
00093    for (i = 0; i < count; i++) {
00094       cam_lam_read(source >> 24, &lam);
00095       if (lam)
00096          if (!test)
00097             return TRUE;
00098    }
00099 
00100    return FALSE;
00101 }
00102 
00103 /*-- Interrupt configuration for trigger event ---------------------*/
00104 
00105 INT interrupt_configure(INT cmd, INT source, PTYPE adr)
00106 {
00107    switch (cmd) {
00108    case CMD_INTERRUPT_ENABLE:
00109       cam_interrupt_enable();
00110       break;
00111    case CMD_INTERRUPT_DISABLE:
00112       cam_interrupt_disable();
00113       break;
00114    case CMD_INTERRUPT_ATTACH:
00115       cam_interrupt_attach((void (*)()) adr);
00116       break;
00117    case CMD_INTERRUPT_DETACH:
00118       cam_interrupt_detach();
00119       break;
00120    }
00121    return SUCCESS;
00122 }
00123 
00124 /*-- trigger settings callback -------------------------------------*/
00125 
00126 #ifdef TRIGGER_SETTINGS_DEFINED
00127 void trigger_update(void);
00128 
00129 void trigger_upd(INT hDB, INT hKey)
00130 {
00131    trigger_update();
00132 }
00133 #endif
00134 
00135 #define trigger_update_begin  void trigger_update(void) {
00136 #define trigger_update_end }
00137 
00138 /*-- Frontend init function ----------------------------------------*/
00139 
00140 void user_init(void);
00141 void user_exit(void);
00142 
00143 INT frontend_init()
00144 {
00145    HNDLE hkey;
00146 #ifdef EXP_PARAM_DEFINED
00147    EXP_PARAM_STR(exp_param_str);
00148 #endif
00149 #ifdef TRIGGER_SETTINGS_DEFINED
00150    TRIGGER_SETTINGS_STR(trigger_settings_str);
00151 #endif
00152 #ifdef SCALER_SETTINGS_STR
00153    SCALER_SETTINGS_STR(scaler_settings_str);
00154 #endif
00155 
00156    cm_get_experiment_database(&hdb, &hkey);
00157 
00158 #ifdef EXP_PARAM_DEFINED
00159    db_create_record(hdb, 0, "/Experiment/Run Parameters", strcomb(exp_param_str));
00160    db_find_key(hdb, 0, "/Experiment/Run Parameters", &hkey);
00161    if (db_open_record(hdb, hkey, &exp_param,
00162                       sizeof(exp_param), MODE_READ, NULL, NULL) != DB_SUCCESS) {
00163       cm_msg(MERROR, "frontend_init", "Cannot open Run Parameters in ODB");
00164       return -1;
00165    }
00166 #endif
00167 #ifdef TRIGGER_SETTINGS_DEFINED
00168    db_create_record(hdb, 0, "/Equipment/Trigger/Settings", strcomb(trigger_settings_str));
00169    db_find_key(hdb, 0, "/Equipment/Trigger/Settings", &hkey);
00170    if (db_open_record(hdb, hkey, &trigger_settings,
00171                       sizeof(trigger_settings), MODE_READ,
00172                       trigger_upd, NULL) != DB_SUCCESS) {
00173       cm_msg(MERROR, "frontend_init", "Cannot open Trigger Settings in ODB");
00174       return -1;
00175    }
00176 #endif
00177 #ifdef SCALER_SETTINGS_DEFINED
00178    db_create_record(hdb, 0, "/Equipment/Scaler/Settings", strcomb(scaler_settings_str));
00179    db_find_key(hdb, 0, "/Equipment/Scaler/Settings", &hkey);
00180    if (db_open_record(hdb, hkey, &scaler_settings,
00181                       sizeof(scaler_settings), MODE_READ, NULL, NULL) != DB_SUCCESS) {
00182       cm_msg(MERROR, "frontend_init", "Cannot open Scaler Settings in ODB");
00183       return -1;
00184    }
00185 #endif
00186 
00187    user_init();
00188    return SUCCESS;
00189 }
00190 
00191 INT frontend_exit()
00192 {
00193    user_exit();
00194    return SUCCESS;
00195 }
00196 
00197 #define init_begin   void user_init() {
00198 #define init_end     }
00199 #define exit_begin   void user_exit() {
00200 #define exit_end     }
00201 
00202 /*-- Callback functions --------------------------------------------*/
00203 
00204 #define begin_run        INT begin_of_run(INT run_number, char *error) {
00205 #define begin_run_end    return SUCCESS; }
00206 #define end_run          INT end_of_run(INT run_number, char *error) {
00207 #define end_run_end      return SUCCESS; }
00208 #define pause_run        INT pause_run(INT run_number, char *error) {
00209 #define pause_run_end    return SUCCESS; }
00210 #define resume_run       INT resume_run(INT run_number, char *error) {
00211 #define resume_run_end   return SUCCESS; }
00212 
00213 /*-- Frontend Loop -------------------------------------------------*/
00214 
00215 INT frontend_loop()
00216 {
00217    return SUCCESS;
00218 }
00219 
00220 /*-- Event readout -------------------------------------------------*/
00221 
00222 #define readout_begin(name) INT read_##name(char *pevent) \
00223 {                                                         \
00224 WORD *pdata; INT source;                                  \
00225                                                           \
00226   source = *((INT *)pevent);                              \
00227   bk_init(pevent); {
00228 
00229 #define readout_end } return bk_size(pevent); }
00230 
00231 #define readout_abort return 0;
00232 
00233 #define trigger_mask     TRIGGER_MASK(pevent)
00234 #define event_id         EVENT_ID(pevent)
00235 #define serial_number    SERIAL_NUMBER(pevent)
00236 #define time_stamp       TIME_STAMP(pevent)
00237 
00238 #define bank(name) bk_create(pevent, #name, TID_WORD, &pdata);
00239 #define bank32(name) bk_create(pevent, #name, TID_DWORD, &pdata);
00240 #define bank_end  bk_close(pevent, pdata);
00241 
00242 #define read(n,a,f)         cam16i(_crate,n,a,f,pdata++);
00243 #define read_into(n,a,f,d)  cam16i(_crate,n,a,f,&d);
00244 #define read32(n,a,f)     { cam24i(_crate,n,a,f,(DWORD*)pdata); ((DWORD*)pdata)++; }
00245 #define write(n,a,f,d)      cam24o(_crate,n,a,f,d);
00246 #define control(n,a,f)      camc(_crate,n,a,f);
00247 #define test_q(n,a,f,q)     camc_q(_crate,n,a,f,&q);
00248 #define wait_q(n,a,f)     { int _q; do { camc_q(_crate,n,a,f,&_q); } while(!_q); }
00249 #define last_read           *(pdata-1)
00250 #define last_read32         *(((DWORD *)pdata)-1)
00251 
00252 #define camac_init cam_init();
00253 #define camac_set_crate(c) _crate = c;
00254 #define camac_crate_clear cam_crate_clear(_crate);
00255 #define camac_crate_zinit cam_crate_zinit(_crate);
00256 #define camac_inhibit_clear cam_inhibit_clear(_crate);
00257 #define camac_inhibit_set cam_inhibit_set(_crate);
00258 #define camac_lam_enable(n) cam_lam_enable(_crate,n);
00259 
00260 #define camac_lam_clear(n) cam_lam_clear(_crate,n);
00261 
00262 #define message(type, str)  cm_msg(M##type, "user code", str);
00263 
00264 /*-- Library functions ---------------------------------------------*/
00265 
00266 #define odb_set(path, value, type) \
00267   db_set_value(hdb, 0, #path, &value, sizeof(value), 1, TID_##type);
00268 
00269 #define sleep(ms) ss_sleep(ms);
00270 
00271 /*-- Language elements ---------------------------------------------*/
00272 
00273 #define variable(name) int name;
00274 #define constant(name, value) int name=value;
00275 
00276 #define increment(var) var++;
00277 #define decrement(var) var--;
00278 #define set(var, value) var = value;
00279 
00280 #define loop(var,c1,c2) for (var=c1 ; var<=c2 ; var++)
00281 #define call(sub) sub();
00282 #define begin {
00283 #define end }
00284 
00285 #define equal ==
00286 #define or    ||
00287 #define and   &&

Midas DOC Version 3.0.0 ---- PSI Stefan Ritt ----
Contributions: Pierre-Andre Amaudruz - Sergio Ballestrero - Suzannah Daviel - Doxygen - Peter Green - Qing Gu - Greg Hackman - Gertjan Hofman - Paul Knowles - Exaos Lee - Rudi Meier - Glenn Moloney - Dave Morris - John M O'Donnell - Konstantin Olchanski - Renee Poutissou - Tamsen Schurman - Andreas Suter - Jan M.Wouters - Piotr Adam Zolnierczuk