00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017 #include <stdio.h>
00018 #include <stdlib.h>
00019 #include "midas.h"
00020 #include "mcstd.h"
00021 #include "experim.h"
00022
00023
00024 #ifdef __cplusplus
00025 extern "C" {
00026 #endif
00027
00028
00029
00030
00031 char *frontend_name = "Sample Frontend";
00032
00033 char *frontend_file_name = __FILE__;
00034
00035
00036 BOOL frontend_call_loop = FALSE;
00037
00038
00039 INT display_period = 3000;
00040
00041
00042 INT max_event_size = 10000;
00043
00044
00045 INT max_event_size_frag = 5 * 1024 * 1024;
00046
00047
00048 INT event_buffer_size = 100 * 10000;
00049
00050
00051 #define N_ADC 4
00052 #define N_TDC 4
00053 #define N_SCLR 4
00054
00055
00056 #define CRATE 0
00057 #define SLOT_IO 23
00058 #define SLOT_ADC 1
00059 #define SLOT_TDC 2
00060 #define SLOT_SCLR 3
00061
00062
00063
00064 INT frontend_init();
00065 INT frontend_exit();
00066 INT begin_of_run(INT run_number, char *error);
00067 INT end_of_run(INT run_number, char *error);
00068 INT pause_run(INT run_number, char *error);
00069 INT resume_run(INT run_number, char *error);
00070 INT frontend_loop();
00071
00072 INT read_trigger_event(char *pevent, INT off);
00073 INT read_scaler_event(char *pevent, INT off);
00074
00075 void register_cnaf_callback(int debug);
00076
00077
00078
00079 EQUIPMENT equipment[] = {
00080
00081 {"Trigger",
00082 {1, 0,
00083 "SYSTEM",
00084
00085 EQ_MULTITHREAD,
00086
00087 LAM_SOURCE(0, 0xFFFFFF),
00088 "MIDAS",
00089 TRUE,
00090 RO_RUNNING |
00091 RO_ODB,
00092 500,
00093 0,
00094 0,
00095 0,
00096 "", "", "",},
00097 read_trigger_event,
00098 },
00099
00100 {"Scaler",
00101 {2, 0,
00102 "SYSTEM",
00103 EQ_PERIODIC | EQ_MANUAL_TRIG,
00104 0,
00105 "MIDAS",
00106 TRUE,
00107 RO_RUNNING | RO_TRANSITIONS |
00108 RO_ODB,
00109 10000,
00110 0,
00111 0,
00112 0,
00113 "", "", "",},
00114 read_scaler_event,
00115 },
00116
00117 {""}
00118 };
00119
00120 #ifdef __cplusplus
00121 }
00122 #endif
00123
00124
00125
00126
00127
00128
00129
00130
00131
00132
00133
00134
00135
00136
00137
00138
00139
00140
00141
00142
00143
00144
00145
00146
00147
00148
00149
00150
00151 INT frontend_init()
00152 {
00153
00154
00155 cam_init();
00156 cam_crate_clear(CRATE);
00157 cam_crate_zinit(CRATE);
00158
00159
00160 camc(CRATE, SLOT_IO, 0, 26);
00161
00162
00163 cam_lam_enable(CRATE, SLOT_IO);
00164
00165
00166 camo(CRATE, SLOT_IO, 1, 16, 0xFF);
00167 camo(CRATE, SLOT_IO, 1, 16, 0);
00168
00169
00170 register_cnaf_callback(1);
00171
00172
00173
00174 return SUCCESS;
00175 }
00176
00177
00178
00179 INT frontend_exit()
00180 {
00181 return SUCCESS;
00182 }
00183
00184
00185
00186 INT begin_of_run(INT run_number, char *error)
00187 {
00188
00189
00190 return SUCCESS;
00191 }
00192
00193
00194
00195 INT end_of_run(INT run_number, char *error)
00196 {
00197 return SUCCESS;
00198 }
00199
00200
00201
00202 INT pause_run(INT run_number, char *error)
00203 {
00204 return SUCCESS;
00205 }
00206
00207
00208
00209 INT resume_run(INT run_number, char *error)
00210 {
00211 return SUCCESS;
00212 }
00213
00214
00215
00216 INT frontend_loop()
00217 {
00218
00219
00220 return SUCCESS;
00221 }
00222
00223
00224
00225
00226
00227
00228
00229
00230
00231
00232
00233 INT poll_event(INT source, INT count, BOOL test)
00234
00235
00236
00237 {
00238 int i;
00239 DWORD lam;
00240
00241 for (i = 0; i < count; i++) {
00242 cam_lam_read(LAM_SOURCE_CRATE(source), &lam);
00243
00244 if (lam & LAM_SOURCE_STATION(source))
00245 if (!test)
00246 return lam;
00247 }
00248
00249 return 0;
00250 }
00251
00252
00253
00254 INT interrupt_configure(INT cmd, INT source, POINTER_T adr)
00255 {
00256 switch (cmd) {
00257 case CMD_INTERRUPT_ENABLE:
00258 break;
00259 case CMD_INTERRUPT_DISABLE:
00260 break;
00261 case CMD_INTERRUPT_ATTACH:
00262 break;
00263 case CMD_INTERRUPT_DETACH:
00264 break;
00265 }
00266 return SUCCESS;
00267 }
00268
00269
00270
00271 INT read_trigger_event(char *pevent, INT off)
00272 {
00273 WORD *pdata, a;
00274 INT q, timeout;
00275
00276
00277 bk_init(pevent);
00278
00279
00280 bk_create(pevent, "ADC0", TID_WORD, &pdata);
00281
00282
00283 for (timeout = 100; timeout > 0; timeout--) {
00284 camc_q(CRATE, SLOT_ADC, 0, 8, &q);
00285 if (q)
00286 break;
00287 }
00288 if (timeout == 0)
00289 ss_printf(0, 10, "No ADC gate!");
00290
00291
00292
00293
00294
00295
00296
00297
00298 for (a = 0; a < N_ADC; a++)
00299 *pdata++ = rand() % 1024;
00300
00301
00302 camc(CRATE, SLOT_ADC, 0, 9);
00303
00304 bk_close(pevent, pdata);
00305
00306
00307 bk_create(pevent, "TDC0", TID_WORD, &pdata);
00308
00309
00310
00311
00312
00313
00314
00315
00316 for (a = 0; a < N_TDC; a++)
00317 *pdata++ = rand() % 1024;
00318
00319
00320 camc(CRATE, SLOT_TDC, 0, 9);
00321
00322 bk_close(pevent, pdata);
00323
00324
00325 camc(CRATE, SLOT_IO, 0, 10);
00326
00327
00328 cam_lam_clear(CRATE, SLOT_IO);
00329
00330
00331 camo(CRATE, SLOT_IO, 1, 16, 0xFF);
00332 camo(CRATE, SLOT_IO, 1, 16, 0);
00333
00334 ss_sleep(10);
00335
00336 return bk_size(pevent);
00337 }
00338
00339
00340
00341 INT read_scaler_event(char *pevent, INT off)
00342 {
00343 DWORD *pdata, a;
00344
00345
00346 bk_init(pevent);
00347
00348
00349 bk_create(pevent, "SCLR", TID_DWORD, &pdata);
00350
00351
00352 for (a = 0; a < N_SCLR; a++)
00353 cam24i(CRATE, SLOT_SCLR, a, 0, pdata++);
00354
00355 bk_close(pevent, pdata);
00356
00357 return bk_size(pevent);
00358 }