00001
00002
00003
00004
00005
00006
00007
00008
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
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
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
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
00085
00086 INT poll_event(INT source, INT count, BOOL test)
00087
00088
00089
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
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
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
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
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
00214
00215 INT frontend_loop()
00216 {
00217 return SUCCESS;
00218 }
00219
00220
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
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
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 &&