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 EQ_POLLED,
00085 LAM_SOURCE(0, 0xFFFFFF),
00086 "MIDAS",
00087 TRUE,
00088 RO_RUNNING |
00089 RO_ODB,
00090 500,
00091 0,
00092 0,
00093 0,
00094 "", "", "",},
00095 read_trigger_event,
00096 },
00097
00098 {"Scaler",
00099 {2, 0,
00100 "SYSTEM",
00101 EQ_PERIODIC | EQ_MANUAL_TRIG,
00102 0,
00103 "MIDAS",
00104 TRUE,
00105 RO_RUNNING | RO_TRANSITIONS |
00106 RO_ODB,
00107 10000,
00108 0,
00109 0,
00110 0,
00111 "", "", "",},
00112 read_scaler_event,
00113 },
00114
00115 {""}
00116 };
00117
00118 #ifdef __cplusplus
00119 }
00120 #endif
00121
00122
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 INT frontend_init()
00150 {
00151
00152
00153 cam_init();
00154 cam_crate_clear(CRATE);
00155 cam_crate_zinit(CRATE);
00156
00157
00158 camc(CRATE, SLOT_IO, 0, 26);
00159
00160
00161 cam_lam_enable(CRATE, SLOT_IO);
00162
00163
00164 camo(CRATE, SLOT_IO, 1, 16, 0xFF);
00165 camo(CRATE, SLOT_IO, 1, 16, 0);
00166
00167
00168 register_cnaf_callback(1);
00169
00170
00171
00172 return SUCCESS;
00173 }
00174
00175
00176
00177 INT frontend_exit()
00178 {
00179 return SUCCESS;
00180 }
00181
00182
00183
00184 INT begin_of_run(INT run_number, char *error)
00185 {
00186
00187
00188 return SUCCESS;
00189 }
00190
00191
00192
00193 INT end_of_run(INT run_number, char *error)
00194 {
00195 return SUCCESS;
00196 }
00197
00198
00199
00200 INT pause_run(INT run_number, char *error)
00201 {
00202 return SUCCESS;
00203 }
00204
00205
00206
00207 INT resume_run(INT run_number, char *error)
00208 {
00209 return SUCCESS;
00210 }
00211
00212
00213
00214 INT frontend_loop()
00215 {
00216
00217
00218 return SUCCESS;
00219 }
00220
00221
00222
00223
00224
00225
00226
00227
00228
00229
00230
00231 INT poll_event(INT source, INT count, BOOL test)
00232
00233
00234
00235 {
00236 int i;
00237 DWORD lam;
00238
00239 for (i = 0; i < count; i++) {
00240 cam_lam_read(LAM_SOURCE_CRATE(source), &lam);
00241
00242 if (lam & LAM_SOURCE_STATION(source))
00243 if (!test)
00244 return lam;
00245 }
00246
00247 return 0;
00248 }
00249
00250
00251
00252 INT interrupt_configure(INT cmd, INT source, POINTER_T adr)
00253 {
00254 switch (cmd) {
00255 case CMD_INTERRUPT_ENABLE:
00256 break;
00257 case CMD_INTERRUPT_DISABLE:
00258 break;
00259 case CMD_INTERRUPT_ATTACH:
00260 break;
00261 case CMD_INTERRUPT_DETACH:
00262 break;
00263 }
00264 return SUCCESS;
00265 }
00266
00267
00268
00269 INT read_trigger_event(char *pevent, INT off)
00270 {
00271 WORD *pdata, a;
00272 INT q, timeout;
00273
00274
00275 bk_init(pevent);
00276
00277
00278 bk_create(pevent, "ADC0", TID_WORD, &pdata);
00279
00280
00281 for (timeout = 100; timeout > 0; timeout--) {
00282 camc_q(CRATE, SLOT_ADC, 0, 8, &q);
00283 if (q)
00284 break;
00285 }
00286 if (timeout == 0)
00287 ss_printf(0, 10, "No ADC gate!");
00288
00289
00290
00291
00292
00293
00294
00295
00296 for (a = 0; a < N_ADC; a++)
00297 *pdata++ = rand() % 1024;
00298
00299
00300 camc(CRATE, SLOT_ADC, 0, 9);
00301
00302 bk_close(pevent, pdata);
00303
00304
00305 bk_create(pevent, "TDC0", TID_WORD, &pdata);
00306
00307
00308
00309
00310
00311
00312
00313
00314 for (a = 0; a < N_TDC; a++)
00315 *pdata++ = rand() % 1024;
00316
00317
00318 camc(CRATE, SLOT_TDC, 0, 9);
00319
00320 bk_close(pevent, pdata);
00321
00322
00323 camc(CRATE, SLOT_IO, 0, 10);
00324
00325
00326 cam_lam_clear(CRATE, SLOT_IO);
00327
00328
00329 camo(CRATE, SLOT_IO, 1, 16, 0xFF);
00330 camo(CRATE, SLOT_IO, 1, 16, 0);
00331
00332 ss_sleep(10);
00333
00334 return bk_size(pevent);
00335 }
00336
00337
00338
00339 INT read_scaler_event(char *pevent, INT off)
00340 {
00341 DWORD *pdata, a;
00342
00343
00344 bk_init(pevent);
00345
00346
00347 bk_create(pevent, "SCLR", TID_DWORD, &pdata);
00348
00349
00350 for (a = 0; a < N_SCLR; a++)
00351 cam24i(CRATE, SLOT_SCLR, a, 0, pdata++);
00352
00353 bk_close(pevent, pdata);
00354
00355 return bk_size(pevent);
00356 }