MIDAS
Loading...
Searching...
No Matches
feccusb.cxx
Go to the documentation of this file.
1/********************************************************************\
2 Name: feccusb.cxx
3 Created by: Pierre-Andre Amaudruz
4
5 Modified by: Thomas Lindner, Jan 2018
6 Added deferred transition so that the last, unfilled
7 CAMAC buffer gets fully read out.
8
9 Contents: Experiment specific readout code (user part) of
10 Midas frontend. This example provide a template
11 for data acquisition using the CC-USB from Wiener
12 This frontend runs in PERIODIC mode. The fastest is 1ms period.
13 CCUSB doesn't provide a data valid condition to be evaluated in the POLLING
14 function. But as multiple trigger(lam) can be collected in the buffer.
15 Test shows that with a buffer of 4KD16 (mode:0) acquisition up to
16 350KB/s for 8.3Kevt/s -> about 6us per D16 camac transfer average.
17
18
19
20\********************************************************************/
21
22
23#include <stdio.h>
24#include <stdlib.h>
25#include <time.h>
26#include <math.h>
27
28#include <string.h>
29#include "midas.h"
30extern "C"{
31#include <libxxusb.h>
32}
33
34#include "ccusb.h"
35#include "OdbCCusb.h"
36
37/* make frontend functions callable from the C framework */
38#ifdef __cplusplus
39extern "C" {
40#endif
41
42/*-- Globals -------------------------------------------------------*/
43
44/* The frontend name (client name) as seen by other MIDAS clients */
45char const *frontend_name = "feccusb";
46/* The frontend file name, don't change it */
47char const *frontend_file_name = __FILE__;
48
49/* frontend_loop is called periodically if this variable is TRUE */
51
52/* a frontend status page is displayed with this frequency in ms */
54
55/* maximum event size produced by this frontend */
57
58/* maximum event size for fragmented events (EQ_FRAGMENTED) */
59INT max_event_size_frag = 5 * 1024 * 1024;
60
61/* buffer size to hold events */
62INT event_buffer_size = 100 * 10000;
63 //End of MIDAS specific globals , following lines are experiment specific global values
64
65/* number of channels */
66#define N_ADC8 12
67// #define N_ADCD 12
68// #define N_TDC 4
69// #define N_SCLR 4
70
71/* CAMAC crate and slots */
72//#define SLOT_IO 23
73//#define SLOT_ADC8 4
74#define SLOT_ADC8 10
75//#define SLOT_ADCD 13
76//#define SLOT_TDC 6
77//define SLOT_SCLR 3
78
79xxusb_device_type devices[10];
80struct usb_device *dev;
81usb_dev_handle *udev; // Device Handle
82
85
86/*-- Function declarations -----------------------------------------*/
87
90INT begin_of_run(INT run_number, char *error);
91INT end_of_run(INT run_number, char *error);
92INT pause_run(INT run_number, char *error);
93INT resume_run(INT run_number, char *error);
95
96INT read_trigger_event(char *pevent, INT off);
97INT read_scaler_event(char *pevent, INT off);
98
100INT interrupt_configure(INT cmd, INT source, POINTER_T adr);
101
102/*-- Equipment list ------------------------------------------------*/
104
105 {"CCUSB", /* equipment name */
106 {1, 0, /* event ID, trigger mask */
107 "BUF8", /* event buffer */
108 EQ_PERIODIC, /* equipment type */
109 LAM_SOURCE(0, 0xFFFFFF),/* event source crate 0, all stations */
110 "MIDAS", /* format */
111 TRUE, /* enabled */
112 RO_RUNNING, /* read only when running */
113 10, /* poll for 10ms */
114 0, /* stop run after this event limit */
115 0, /* number of sub events */
116 0, /* don't log history */
117 "", "", "",},
118 read_trigger_event, /* readout routine */
119 },
120
121 {""}
122};
123
124#ifdef __cplusplus
125}
126#endif
127
128/********************************************************************\
129 Callback routines for system transitions
130
131 These routines are called whenever a system transition like start/
132 stop of a run occurs. The routines are called on the following
133 occations:
134
135 frontend_init: When the frontend program is started. This routine
136 should initialize the hardware.
137
138 frontend_exit: When the frontend program is shut down. Can be used
139 to releas any locked resources like memory, commu-
140 nications ports etc.
141
142 begin_of_run: When a new run is started. Clear scalers, open
143 rungates, etc.
144
145 end_of_run: Called on a request to stop a run. Can send
146 end-of-run event and close run gates.
147
148 pause_run: When a run is paused. Should disable trigger events.
149
150 resume_run: When a run is resumed. Should enable trigger events.
151\********************************************************************/
152//
153//----------------------------------------------------------------
154// callback when the key in ODB is touched (see db_open_record below)
155void seq_callback(INT hDB, INT hseq, void *info)
156{
157 KEY key;
158 db_get_key(hDB, hseq, &key);
159 printf("odb ... %s touched (%d)\n", key.name, hseq);
160}
161
162//
163//----------------------------------------------------------------
164//
165int ccUsbFlush(void) {
166 short IntArray [10000]; //for FIFOREAD
167
168 int ret=1;
169 int k=0;
170 while(ret>0) {
171 ret = xxusb_bulk_read(udev, IntArray, 8192, 100);
172 if(ret>0) {
173 printf("drain loops: %i (result %i)\n ",k,ret);
174 k++;
175 if (k>100) ret=0;
176
177 // Last event dump
178 for(int i =0; i < ret/2; i++){
179 printf("%x ",IntArray[i] & 0xffff);
180 if(i%8==7) printf("\n");
181 }
182 }
183 }
184 printf("\n");
185 printf("First bin %x\n",IntArray[0]);
186 return (IntArray[0] & 0xfff);
187
188}
189
193
194// This function used to setup deferred transition, where we read the USB buffer
195// a couple extra times at the end of the run to clear out the events.
197
198 if(first){
199
200 // Stop DAQ mode
201 int ret = xxusb_register_write(udev, 1, 0x0);
202 printf("stopping CAMAC xxusb_register_write=%d\n", ret);
203
207 printf("Starting deferred to clear USB buffer\n");
208 }
209
211 printf("Finished deferred transition after %i extra reads.\n",number_extra_reads);
212 return TRUE;
213 }
214
215 if(number_extra_reads > 10){
216 cm_msg(MERROR, "clear_buffer_events", "Didn't manage to clear CCUSB buffer after 10 extra reads.\n");
217 return TRUE;
218 }
219
220 return FALSE;
221}
222
223
224/*-- Frontend Init -------------------------------------------------*/
225// Executed once at the start of the applicatoin
227
228 int size, status;
229 char set_str[80];
230 CCUSB_SETTINGS_STR(ccusb_settings_str);
231
233
234 // Map /equipment/<eq_name>/settings
235 sprintf(set_str, "/Equipment/CCUSB/Settings");
236
237 // create the ODB Settings if not existing under Equipment/<eqname>/
238 // If already existing, don't change anything
239 status = db_create_record(hDB, 0, set_str, strcomb1(ccusb_settings_str).c_str());
240 if (status != DB_SUCCESS) {
241 cm_msg(MERROR, "ccusb", "cannot create record (%s)", set_str);
242 return FE_ERR_ODB;
243 }
244
245 // Get the equipment/<eqname>/Settings key
246 status = db_find_key(hDB, 0, set_str, &hSetCC);
247
248 // Enable hot-link on /Settings of the equipment
249 // Anything changed under /Settings will be triggering the callback (above)
250 size = sizeof(CCUSB_SETTINGS);
252 , seq_callback, NULL)) != DB_SUCCESS) {
253 cm_msg(MERROR, "ccusb", "cannot open record (%s)", set_str);
254 return CM_DB_ERROR;
255 }
256
257 // Setup a deferred transition so that we can read out any events that remain in
258 // buffer at the end of the run.
260
261 // hardware initialization
262 //Find XX_USB devices and open the first one found
263 printf("Initializing USB device\n");
264 int ret = xxusb_devices_find(devices);
265 printf("Testing first USB device; ret=%i\n",ret);
266 dev = devices[0].usbdev;
267 udev = xxusb_device_open(dev);
268
269 // Make sure CC_USB opened OK
270 if(!udev) {
271 cm_msg(MERROR, "ccusb", "Failed to Open CC_USB");
272 return FE_ERR_HW;
273 }
274
275 // Stop DAQ mode in case it was left running (after crash)
276 ret = xxusb_register_write(udev, 1, 0x0);
277
278 if(ret < 0){
279 cm_msg(MERROR, "ccusb", "Error writing to CCUSB; error message = %i",ret);
280 return FE_ERR_HW;
281 }
282
283 // printf("stop DAQ return:%d\n", ret);
284
285 // Flush old data first
286 ccUsbFlush();
287 // printf("Flush return:%d\n", ret);
288
289 // CAMAC CLEAR
290 CAMAC_C(udev);
291 // printf("CAMAC_C return:%d\n", ret);
292 // CAMAC Z
293 CAMAC_Z(udev);
294 // printf("CAMAC_Z return:%d\n", ret);
295
296 /* print message and return FE_ERR_HW if frontend should not be started */
297 cm_msg(MINFO, "ccusb", "CC-USB ready");
298 return SUCCESS;
299}
300
301/*-- Frontend Exit -------------------------------------------------*/
303{
304 // Close device
305 xxusb_device_close(udev);
306 return SUCCESS;
307}
308
309// Keep track of number of events in the run
311
312/*-- Begin of Run --------------------------------------------------*/
313// Done on every begin of run
315
316 //
317 // Construct the CAMAC list to be loaded into the Stack
318 long int stack[100];
319 int i, ret;
320 int q, x;
321 long d24;
322 short d16;
323
324 // Create the CAMAC list to be performed on each LAM
325 StackCreate(stack);
326
327 // StackXxx(), MRAD16, WMARKER, etc and macros are defined in
328 // in ccusb.h
329 // n a f data
330 StackFill(MRAD16 , SLOT_ADC8, 0 , 0, 12, stack);// read 12 ADC8
331 // StackFill(MRAD16 , SLOT_ADCD, 0 , 0, 12, stack);// read 12 ADCD
332 // StackFill(MRAD16 , SLOT_TDC, 0 , 0, 7, stack); // read 8 TDC
333 // Use of F2 can prevent the F9 if last readout is last A
334 //StackFill(CD16 , SLOT_TDC, 0 , 9, 0, stack); // clear TDC, data is ignored (command)
335 StackFill(CD16 , SLOT_ADC8, 0 , 9, 0, stack); // clear ADC8
336 // StackFill(CD16 , SLOT_ADCD, 0 , 9, 0, stack); // clear ADCD
337 StackFill(WMARKER, 0, 0, 0, 0xFEED, stack); // Our marker 0xfeed
338 StackClose(stack);
339
340 #if 1
341 // Debugging Check stack before writing
342 printf("stack[0]:%ld\n", stack[0]);
343 for (i = 0; i < stack[0]+1; i++) {
344 printf("stack[%i]=0x%lx\n", i, stack[i]);
345 }
346
347 // Load stack into CC-USB
348 ret = xxusb_stack_write(udev, 2, stack);
349 ret -= 2;
350 if (ret<0) {
351 printf("err on stack_write:%d\n", ret);
352 } else {
353 printf("Nbytes(ret) from stack_write:%d\n", ret);
354 for (i = 0; i < (ret/2); i++) {
355 if(0) printf("Wstack[%i]=0x%lx\n", i, stack[i]);
356 }
357 }
358 #endif
359
360 // Debugging Read stack
361 ret = xxusb_stack_read(udev, 2, stack);
362 if (ret<0) {
363 printf("err on stack_read:%d\n", ret);
364 } else {
365 printf("Nbytes(ret) from stack_read:%d\n", ret);
366 for (i = 0; i < (ret/2); i++) {
367 if(0) printf("Rstack[%i]=0x%lx\n", i, stack[i]);
368 }
369 }
370
371 // Remove Inhibit
372 CAMAC_I(udev, FALSE);
373
374 // LAM mask from the Equipment
375 ret = CAMAC_write(udev, 25, 9, 16, LAM_SOURCE_STATION(equipment[0].info.source), &q, &x);
376
377 // delay LAM timeout[15..8], trigger delay[7..0]
378 d16 = ((tscc.lam_timeout & 0xFF) << 8) | (tscc.trig_delay & 0xFF);
379 printf ("lam, trigger delay : 0x%x\n", d16);
380 ret = CAMAC_write(udev, 25, 2, 16, d16, &q, &x);
381
382 // Enable LAM
383 // ret = CAMAC_read(udev, SLOT_TDC, 0, 26, &d24, &q, &x);
384 ret = CAMAC_read(udev, SLOT_ADC8, 0, 26, &d24, &q, &x);
385 //ret = CAMAC_read(udev, SLOT_ADCD, 0, 26, &d24, &q, &x);
386 // printf("ret:%d q:%d x:%d\n", ret, q, x);
387
388 // Opt in Global Mode register N(25) A(1) F(16)
389 // Buffer size
390 // 0:4096, 1:2048, 2:1024, 3:512, 4:256, 5:128, 6:64, 7:single event
391 ret = CAMAC_write(udev, 25, 1, 16, tscc.buffer_size, &q, &x);
392
393 // CAMAC_DGG creates a gate pulse with control of delay, width
394 // in 10ns increments.
395 // BUT range is limited to 16bit anyway annd only GG-A (0) provides
396 // the delay extension.
397 // Maximum delay 1e6 -> minimum frq 1KHz
398 // DGG_A Pulser NimO1 invert latch
399 ret = CAMAC_DGG(udev, 0, 7, 1, tscc.delay/10, tscc.width/10, 0, 0);
400
401 // First clear before first LAM/readout
402 ret = CAMAC_read(udev, SLOT_ADC8, 0, 9, &d24, &q, &x);
403 // ret = CAMAC_read(udev, SLOT_ADCD, 0, 9, &d24, &q, &x);
404 // ret = CAMAC_read(udev, SLOT_TDC, 0, 9, &d24, &q, &x);
405
406 // Start DAQ mode
407 ret = xxusb_register_write(udev, 1, 0x1);
408 //
409 // NO CAMAC calls ALLOWED beyond this point!!!!!!!!
410 // as the Module is in acquisition mode now
411 //
412
413 // Count total events in run.
414 EventsInRun = 0;
415 // Set value for deferred transition (to readout last events).
418
419 return SUCCESS;
420}
421
422/*-- End of Run ----------------------------------------------------*/
424{
425 // Stop DAQ mode
426 int ret = xxusb_register_write(udev, 1, 0x0);
427 printf("End of run Stop DAQ return:%d\n", ret);
428
429 // Set Inhibit
430 // CAMAC_I(udev, TRUE);
431
432 // Flush data.
433 // This shouldn't do anything, since we flushed all the events with deferred transition.
434 ret = ccUsbFlush();
435 if(ret > 0) cm_msg(MINFO, "ccusb", "Flushed %d events; surprising", ret);
436 EventsInRun += ret;
437 cm_msg(MINFO, "ccusb", "Total number of events read in this run: %i \n",EventsInRun);
438 return SUCCESS;
439}
440
441/*-- Pause Run -----------------------------------------------------*/
443{
444 // Stop DAQ mode
445 xxusb_register_write(udev, 1, 0x0);
446
447 // Set Inhibit
448 CAMAC_I(udev, TRUE);
449
450 // -PAA-
451 // flush data, these data are lost as the run is already closed.
452 // will implement deferred transition later to fix this issue
453 ccUsbFlush();
454 return SUCCESS;
455}
456
457/*-- Resume Run ----------------------------------------------------*/
459{
460 int q, x;
461 long d24;
462
463 // Clear module
464 CAMAC_read(udev, SLOT_ADC8, 0, 9, &d24, &q, &x);
465 //CAMAC_read(udev, SLOT_ADCD, 0, 9, &d24, &q, &x);
466 // CAMAC_read(udev, SLOT_TDC, 0, 9, &d24, &q, &x);
467
468 // Remove Inhibit
469 CAMAC_I(udev, FALSE);
470
471 // Start DAQ mode
472 xxusb_register_write(udev, 1, 0x1);
473
474 return SUCCESS;
475}
476
477/*-- Frontend Loop -------------------------------------------------*/
479{
480 /* if frontend_call_loop is true, this routine gets called when
481 the frontend is idle or once between every event */
482 return SUCCESS;
483}
484
485/*------------------------------------------------------------------*/
486
487/********************************************************************\
488
489 Readout routines for different events
490
491\********************************************************************/
492
493/*-- Trigger event routines ----------------------------------------*/
494extern "C" INT poll_event(INT source, INT count, BOOL test)
495/* Polling routine for events. Returns TRUE if event
496 is available. If test equals TRUE, don't return. The test
497 flag is used to time the polling */
498{
499 int i;
500 DWORD lam=0;
501
502 for (i = 0; i < count; i++) {
503 ss_sleep(100);
504 if (lam & LAM_SOURCE_STATION(source))
505 if (!test)
506 return lam;
507 }
508
509 return 0;
510}
511
512/*-- Interrupt configuration ---------------------------------------*/
513extern "C" INT interrupt_configure(INT cmd, INT source, POINTER_T adr)
514{
515 switch (cmd) {
517 break;
519 break;
521 break;
523 break;
524 }
525 return SUCCESS;
526}
527
528/*-- Event readout -------------------------------------------------*/
529INT read_trigger_event(char *pevent, INT off)
530{
531 WORD *pdata;
532 int ret, nd16=0;
533
536 }
537
538 /* init bank structure */
539 bk_init(pevent);
540
541 /* create Midas bank named ADC8 for ADC card in slot 8*/
542 bk_create(pevent, "ADC8", TID_WORD, (void **)&pdata);
543
544 /* create Midas bank named ADCD D=13 for ADC card in slot 13*/
545 //bk_create(pevent, "ADCD", TID_WORD, (void **)&pdata);
546
547 /* create Midas bank named ADTD */
548// bk_create(pevent, "ADTD", TID_WORD, (void **)&pdata);
549
550 // Read CC-USB buffer, returns nbytes, use for 32-bit data
551 ret = xxusb_bulk_read(udev, pdata, 8192, 500);
552 if (ret > 0) {
553 nd16 = ret / 2; // # of d16
554 int nevents = (pdata[0]& 0xfff); // # of LAM in the buffer
555 EventsInRun += nevents;
556 #if 0
557 int evtsize = (pdata[1] & 0xffff); // # of words per event
558 printf("Read data: ret:%d nd16:%d nevent:%d, evtsize:%d\n", ret, nd16, nevents, evtsize);
559#endif
560
561 // if (nevents & 0x8000) return 0; // Skip event
562 if(pdata[0] & 0x8000)cm_msg(MINFO, "read_trigger_event", "Readout last CAMAC event in run.");
563
564
565 if (nd16 > 0) {
566 // Adjust pointer (include nevents, evtsize)
567 pdata += nd16;
568 }
569
570 // Close bank
571 bk_close(pevent, pdata);
572
573 printf("readout non-zero bytes from CAMAC usb\n");
574 // Done with a valid event
575 return bk_size(pevent);
576
577 } else {
578 // printf("no read ret:%d\n", ret);
579
580 // we finished the deferred transition when we do a read of USB buffer
581 // and don't get any extra data.
584 }
585 return 0;
586 }
587}
#define CCUSB_SETTINGS_STR(_name)
Definition OdbCCusb.h:12
#define CD16
Command D16.
Definition ccusb.h:18
void StackCreate(long int *stack)
Definition ccusb.h:97
int StackFill(int mode, int n, int a, int f, int d, long int *stack)
Stack builder.
Definition ccusb.h:36
#define MRAD16
Multiple Read on A D16.
Definition ccusb.h:13
#define WMARKER
Marker.
Definition ccusb.h:19
void StackClose(long int *stack)
Definition ccusb.h:106
#define FALSE
Definition cfortran.h:309
INT transition(INT run_number, char *error)
Definition consume.cxx:35
BOOL frontend_call_loop
Definition feccusb.cxx:50
void seq_callback(INT hDB, INT hseq, void *info)
Definition feccusb.cxx:155
INT max_event_size
Definition feccusb.cxx:56
INT frontend_exit()
Frontend exit.
Definition feccusb.cxx:302
xxusb_device_type devices[10]
Definition feccusb.cxx:79
INT frontend_init()
Frontend initialization.
Definition feccusb.cxx:226
INT event_buffer_size
Definition feccusb.cxx:62
BOOL clear_buffer_events(int transition, BOOL first)
Definition feccusb.cxx:196
INT max_event_size_frag
Definition feccusb.cxx:59
int ccUsbFlush(void)
Definition feccusb.cxx:165
INT interrupt_configure(INT cmd, INT source, POINTER_T adr)
Definition feccusb.cxx:513
BOOL finished_clearing_buffer
Definition feccusb.cxx:191
#define SLOT_ADC8
Definition feccusb.cxx:74
CCUSB_SETTINGS tscc
Settings local structure (see OdbCCusb.h)
Definition feccusb.cxx:84
int EventsInRun
Definition feccusb.cxx:310
INT poll_event(INT source, INT count, BOOL test)
Definition feccusb.cxx:494
INT read_trigger_event(char *pevent, INT off)
Event readout.
Definition feccusb.cxx:529
EQUIPMENT equipment[]
Definition feccusb.cxx:103
char const * frontend_name
Definition feccusb.cxx:45
HNDLE hDB
main ODB handle
Definition feccusb.cxx:83
BOOL in_deferred_transition
Definition feccusb.cxx:190
INT display_period
Definition feccusb.cxx:53
int number_extra_reads
Definition feccusb.cxx:192
struct usb_device * dev
Definition feccusb.cxx:80
char const * frontend_file_name
Definition feccusb.cxx:47
INT begin_of_run(INT run_number, char *error)
Begin of Run.
Definition feccusb.cxx:314
INT frontend_loop()
Frontend loop.
Definition feccusb.cxx:478
INT end_of_run(INT run_number, char *error)
End of Run.
Definition feccusb.cxx:423
usb_dev_handle * udev
Definition feccusb.cxx:81
INT read_scaler_event(char *pevent, INT off)
Scaler event readout.
Definition ebfe.cxx:295
HNDLE hSetCC
Midas equipment/<name>/Settings info handles.
Definition feccusb.cxx:83
INT bk_close(void *event, void *pdata)
Definition midas.cxx:16780
void bk_init(void *event)
Definition midas.cxx:16406
void bk_create(void *event, const char *name, WORD type, void **pdata)
Definition midas.cxx:16561
INT bk_size(const void *event)
Definition midas.cxx:16495
INT cm_get_experiment_database(HNDLE *hDB, HNDLE *hKeyClient)
Definition midas.cxx:3011
INT cm_register_deferred_transition(INT transition, BOOL(*func)(INT, BOOL))
Definition midas.cxx:3837
#define CM_DB_ERROR
Definition midas.h:585
#define DB_SUCCESS
Definition midas.h:631
#define FE_ERR_ODB
Definition midas.h:718
#define CMD_INTERRUPT_ATTACH
Definition midas.h:822
#define FE_ERR_HW
Definition midas.h:719
#define CMD_INTERRUPT_DISABLE
Definition midas.h:821
#define CMD_INTERRUPT_ENABLE
Definition midas.h:820
#define CMD_INTERRUPT_DETACH
Definition midas.h:823
unsigned short int WORD
Definition mcstd.h:49
unsigned int DWORD
Definition mcstd.h:51
#define SUCCESS
Definition mcstd.h:54
#define EQ_PERIODIC
Definition midas.h:414
#define TID_WORD
Definition midas.h:332
#define MINFO
Definition midas.h:560
#define MERROR
Definition midas.h:559
#define MODE_READ
Definition midas.h:370
#define TR_STOP
Definition midas.h:406
#define RO_RUNNING
Definition midas.h:426
INT ss_sleep(INT millisec)
Definition system.cxx:3628
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_get_key(HNDLE hDB, HNDLE hKey, KEY *key)
Definition odb.cxx:6019
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
static std::string q(const char *s)
void ** info
Definition fesimdaq.cxx:41
INT run_number[2]
Definition mana.cxx:246
double count
Definition mdump.cxx:33
KEY key
Definition mdump.cxx:34
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 LAM_SOURCE(c, s)
Definition midas.h:469
#define TRUE
Definition midas.h:182
#define POINTER_T
Definition midas.h:166
#define LAM_SOURCE_STATION(s)
Definition midas.h:487
#define resume_run
#define pause_run
program test
Definition miniana.f:6
INT k
Definition odbhist.cxx:40
DWORD status
Definition odbhist.cxx:39
INT lam_timeout
Definition OdbCCusb.h:6
INT buffer_size
Definition OdbCCusb.h:5
Definition midas.h:1026
char name[NAME_LENGTH]
Definition midas.h:1029