midas.h

Go to the documentation of this file.
00001 /********************************************************************\
00002 
00003   Name:         MIDAS.H
00004   Created by:   Stefan Ritt
00005 
00006   Contents:     Type definitions and function declarations needed
00007                 for MIDAS applications
00008 
00009 
00010   $Log: midas.h,v $
00011   Revision 1.148  2005/01/14 08:08:54  midas
00012   Defined cut_book()
00013 
00014   Revision 1.147  2004/12/23 09:36:25  midas
00015   Implemented NaNs
00016 
00017   Revision 1.146  2004/10/07 00:54:02  midas
00018   Implemented templates for histo booking from John O'Donnell
00019 
00020   Revision 1.145  2004/10/06 22:35:37  midas
00021   Added CM_TOO_MANY_REQUESTS
00022 
00023   Revision 1.144  2004/10/04 23:54:39  midas
00024   Implemented ODB version
00025 
00026   Revision 1.143  2004/10/01 23:36:11  midas
00027   Removed PRE/POST transitions and implemented sequence order of transitions
00028 
00029   Revision 1.142  2004/10/01 15:38:18  midas
00030   Added previous_count to tests
00031 
00032   Revision 1.141  2004/09/29 17:57:22  midas
00033   Added large file (>2GB) support for linux
00034 
00035   Revision 1.140  2004/09/29 16:45:06  midas
00036   Added get_frontend_index()
00037 
00038   Revision 1.139  2004/09/29 00:58:35  midas
00039   Increased various constants
00040 
00041   Revision 1.138  2004/09/28 23:57:08  midas
00042   Added EQ_EB flag for event building
00043 
00044   Revision 1.137  2004/09/28 20:05:47  midas
00045   Revised debug logging for mserver
00046 
00047   Revision 1.136  2004/09/28 18:30:12  midas
00048   Changed rpc_debug_print arguments
00049 
00050   Revision 1.135  2004/09/28 17:13:32  midas
00051   Added startup debug code for mserver
00052 
00053   Revision 1.134  2004/09/23 19:22:04  midas
00054   Added histo booking funcitons
00055 
00056   Revision 1.133  2004/09/17 16:10:11  midas
00057   Added new timeout errors
00058 
00059   Revision 1.132  2004/07/21 06:54:03  pierre
00060   fix dox doc
00061 
00062   Revision 1.131  2004/07/21 05:43:32  pierre
00063   fix dox doc
00064 
00065   Revision 1.130  2004/07/09 11:27:57  midas
00066   Version 1.9.4
00067 
00068   Revision 1.129  2004/05/07 19:40:11  midas
00069   Replaced min/max by MIN/MAX macros
00070 
00071   Revision 1.128  2004/05/03 11:30:37  midas
00072   Implemented cm_query_transition()
00073 
00074   Revision 1.127  2004/01/19 16:53:35  olchansk
00075   add midas_thread_t
00076 
00077   Revision 1.126  2004/01/17 05:35:53  olchansk
00078   replace #define ALIGN() with ALIGN8() to dodge namespace pollution under macosx
00079   hide strlcpy() & co #ifdef HAVE_STRLCPY (macosx already has strlcpy())
00080   correct inconsistent prototype of dbg_malloc() and dbg_calloc()
00081 
00082   Revision 1.125  2004/01/13 00:51:04  pierre
00083   fix dox comment for vxworks
00084 
00085   Revision 1.124  2004/01/08 08:40:09  midas
00086   Implemented standard indentation
00087 
00088   Revision 1.123  2004/01/08 06:29:07  pierre
00089   Doxygen the file
00090 
00091   Revision 1.122  2003/11/24 08:22:45  midas
00092   Changed timeouts from INT to DWORD, added ignore_timeout to cm_cleanup, adde '-f' flag to ODBEdit 'cleanup'
00093 
00094   Revision 1.121  2003/11/20 11:28:47  midas
00095   Added db_check_record
00096 
00097   Revision 1.120  2003/06/12 18:34:37  pierre
00098   add ss_tape_get_blockn
00099 
00100   Revision 1.119  2003/05/09 07:40:04  midas
00101   Added extra parameter to cm_get_environment
00102 
00103   Revision 1.118  2003/05/08 19:36:24  midas
00104   Changed size_t into INT
00105 
00106   Revision 1.117  2003/05/07 10:55:47  midas
00107   Export strlcpy
00108 
00109   Revision 1.116  2003/05/02 09:04:50  midas
00110   Version 1.9.3
00111 
00112   Revision 1.115  2003/05/02 09:03:01  midas
00113   Fixed buffer overflows by strlcpy()
00114 
00115   Revision 1.114  2003/04/22 15:14:09  midas
00116   Added #undef GetCurrentTime
00117 
00118   Revision 1.113  2003/04/22 12:00:56  midas
00119   Added rpc_client_check
00120 
00121   Revision 1.112  2003/04/22 10:09:21  midas
00122   Added RPC_NODELAY option
00123 
00124   Revision 1.111  2003/04/15 10:50:00  midas
00125   Removed unnecessary elements in KEY structure
00126 
00127   Revision 1.110  2003/04/15 08:16:48  midas
00128   Increased default ODB size to 1M
00129 
00130   Revision 1.109  2003/04/14 12:58:16  midas
00131   Added event_descrip to equipment
00132 
00133   Revision 1.108  2003/04/09 13:48:18  midas
00134   Added ROOT format
00135 
00136   Revision 1.107  2003/03/26 21:09:46  midas
00137   Corrected version string
00138 
00139   Revision 1.106  2003/03/22 06:56:12  olchansk
00140   add DB_CORRUPTED error code
00141 
00142   Revision 1.105  2003/03/17 06:36:55  olchansk
00143   really remove Windows-style "\r" characters
00144 
00145   Revision 1.104  2002/10/22 03:46:33  pierre
00146   add SS_NO_TAPE
00147 
00148   Revision 1.103  2002/09/19 17:50:22  pierre
00149   remove ^m
00150 
00151   Revision 1.102  2002/09/18 16:36:24  pierre
00152   add bk_list()
00153 
00154   Revision 1.101  2002/09/13 07:32:36  midas
00155   Added client name to cm_cleanup()
00156 
00157   Revision 1.100  2002/06/10 07:06:55  midas
00158   Added 'lock' parameter to db_remove_open_record() to work also remotely
00159 
00160   Revision 1.99  2002/06/06 07:49:46  midas
00161   Added DF_xxx flags for device drivers
00162 
00163   Revision 1.98  2002/06/06 07:15:03  midas
00164   Added demand_priority for SC FE
00165 
00166   Revision 1.97  2002/05/22 22:10:03  midas
00167   Version 1.9.1
00168 
00169   Revision 1.96  2002/05/22 05:43:32  midas
00170   Added extra variables to hs_enum_vars for mhist to display array size
00171 
00172   Revision 1.95  2002/05/16 18:01:13  midas
00173   Added subdir creation in logger and improved program restart scheme
00174 
00175   Revision 1.94  2002/05/15 23:44:47  midas
00176   Added EVENTID_FRAG for fragmented events
00177 
00178   Revision 1.93  2002/05/13 20:36:43  midas
00179   Changed type_t to unsigned int for malloc/free
00180 
00181   Revision 1.92  2002/05/13 17:56:36  midas
00182   Added improved malloc/free functions
00183 
00184   Revision 1.91  2002/05/10 01:41:19  midas
00185   Added optional debug output to cm_transition
00186 
00187   Revision 1.90  2002/05/09 18:16:55  midas
00188   Version 1.9.0
00189 
00190   Revision 1.89  2002/05/08 19:54:40  midas
00191   Added extra parameter to function db_get_value()
00192 
00193   Revision 1.88  2002/03/19 22:15:40  pierre
00194   Added  ~defined (OS_IRIX)
00195 
00196   Revision 1.87  2002/03/13 08:39:01  midas
00197   Added periodic alarms
00198 
00199   Revision 1.86  2001/10/03 08:36:02  midas
00200   Added DB_INVALID_LINK
00201 
00202   Revision 1.85  2001/08/22 13:51:14  midas
00203   Reorganized directio functions
00204 
00205   Revision 1.84  2001/08/08 11:44:59  midas
00206   Release 1.8.3
00207 
00208   Revision 1.83  2001/06/27 12:16:30  midas
00209   Added OS_IRIX
00210 
00211   Revision 1.82  2001/04/05 05:51:03  midas
00212   Added CMD_NAME
00213 
00214   Revision 1.81  2001/04/04 04:12:08  midas
00215   changed slow control commands
00216 
00217   Revision 1.80  2001/02/26 11:57:46  midas
00218   Added CMD_READ and CMD_WRITE
00219 
00220   Revision 1.79  2001/01/29 09:51:54  midas
00221   Put if defined(__linux__) under #if !defined(OS_LINUX)
00222 
00223   Revision 1.78  2001/01/22 08:26:58  midas
00224   Added evaluation of __linux__
00225 
00226   Revision 1.77  2001/01/04 11:27:37  midas
00227   Added bus driver commands and structures
00228 
00229   Revision 1.76  2000/11/20 12:23:17  midas
00230   Version 1.8.2
00231 
00232   Revision 1.75  2000/11/20 11:26:52  midas
00233   Added "use tests" in analyzer request
00234 
00235   Revision 1.74  2000/11/14 08:17:04  midas
00236   Added number of messages for cm_msg_retrieve and in odbedit "old" command
00237 
00238   Revision 1.73  2000/10/23 14:19:05  midas
00239   Added idle period for slow control equipment
00240 
00241   Revision 1.72  2000/09/29 13:31:10  midas
00242   ODBEdit cleanup now deletes open record with no client attached to
00243 
00244   Revision 1.71  2000/09/28 13:01:25  midas
00245   Added manual triggered events
00246 
00247   Revision 1.70  2000/08/21 14:19:11  midas
00248   bk_close return bank size
00249 
00250   Revision 1.69  2000/08/11 11:43:50  midas
00251   Added cm_msg1 to produce messages which go to a differnt logging file
00252 
00253   Revision 1.68  2000/06/07 10:49:07  midas
00254   Release 1.8.1
00255 
00256   Revision 1.67  2000/06/06 13:45:11  midas
00257   Added locking of histos
00258 
00259   Revision 1.66  2000/05/08 14:29:37  midas
00260   Added delete option in ELog
00261 
00262   Revision 1.65  2000/04/26 20:23:47  pierre
00263   - Moved doc++ comments for functions to midas.c (macros still in there)
00264 
00265   Revision 1.64  2000/04/17 17:07:05  pierre
00266   - new arg in hs_dump and hs_fdump (for mhist)
00267   - first round of doc++ comments
00268 
00269   Revision 1.63  2000/03/08 17:35:56  midas
00270   Version 1.8.0
00271 
00272   Revision 1.62  2000/03/02 21:57:31  midas
00273   Added new slow control commands
00274 
00275   Revision 1.61  2000/03/01 00:52:34  midas
00276   Added num_subevents into equipment, made events_sent a double
00277 
00278   Revision 1.60  2000/02/29 02:09:33  midas
00279   Added cm_is_ctrlc_pressed and cm_ack_ctrlc_pressed
00280 
00281   Revision 1.59  2000/02/25 22:22:45  midas
00282   Added abort feature in db_scan_tree
00283 
00284   Revision 1.58  2000/02/25 20:22:23  midas
00285   Added super-event scheme
00286 
00287   Revision 1.57  2000/02/24 22:33:16  midas
00288   Added deferred transitions
00289 
00290   Revision 1.56  2000/02/15 11:07:50  midas
00291   Changed GET_xxx to bit flags
00292 
00293   Revision 1.55  2000/02/09 08:03:27  midas
00294   Changed version to 1.7.1
00295 
00296   Revision 1.54  1999/12/08 00:29:34  pierre
00297   - Add CM_SET_LABEL for cd_gen/dd_epca (chn_acc)
00298 
00299   Revision 1.53  1999/11/19 09:49:36  midas
00300   Added watchdog_timeout to cm_set_client_info
00301 
00302   Revision 1.52  1999/11/09 13:17:00  midas
00303   Changed shared memory function names to ss_shm_xxx instead ss_xxx_shm
00304 
00305   Revision 1.51  1999/11/08 13:55:54  midas
00306   Added AT_xxx
00307 
00308   Revision 1.50  1999/11/04 15:53:54  midas
00309   Added some slow control commands
00310 
00311   Revision 1.49  1999/10/18 14:41:50  midas
00312   Use /programs/<name>/Watchdog timeout in all programs as timeout value. The
00313   default value can be submitted by calling cm_connect_experiment1(..., timeout)
00314 
00315   Revision 1.48  1999/10/08 15:07:04  midas
00316   Program check creates new internal alarm when triggered
00317 
00318   Revision 1.47  1999/10/07 13:17:34  midas
00319   Put a few EXPRT im msystem.h to make NT happy, updated NT makefile
00320 
00321   Revision 1.46  1999/10/06 08:56:33  midas
00322   Added /programs/xxx/required flag
00323 
00324   Revision 1.45  1999/09/27 13:49:03  midas
00325   Added bUnique parameter to cm_shutdown
00326 
00327   Revision 1.44  1999/09/27 12:54:55  midas
00328   Finished alarm system
00329 
00330   Revision 1.43  1999/09/23 12:45:48  midas
00331   Added 32 bit banks
00332 
00333   Revision 1.42  1999/09/22 15:39:36  midas
00334   Logger won't start run if disk file already exists
00335 
00336   Revision 1.41  1999/09/21 13:49:02  midas
00337   Added PROGRAM_INFO
00338 
00339   Revision 1.40  1999/09/17 15:06:46  midas
00340   Moved al_check into cm_yield() and rpc_server_thread
00341 
00342   Revision 1.39  1999/09/17 11:54:43  midas
00343   OS_LINUX & co automatically define OS_UNIX
00344 
00345   Revision 1.38  1999/09/17 11:48:04  midas
00346   Alarm system half finished
00347 
00348   Revision 1.37  1999/09/15 13:33:32  midas
00349   Added remote el_submit functionality
00350 
00351   Revision 1.36  1999/09/14 15:15:43  midas
00352   Moved el_xxx funtions into midas.c
00353 
00354   Revision 1.35  1999/09/14 11:46:04  midas
00355   Added EL_FIRST_MESSAGE
00356 
00357   Revision 1.34  1999/08/31 15:12:34  midas
00358   Added EL_LAST_MSG
00359 
00360   Revision 1.33  1999/08/26 15:18:22  midas
00361   Added EL_xxx codes
00362 
00363   Revision 1.32  1999/08/20 13:31:18  midas
00364   Analyzer saves and reloads online histos
00365 
00366   Revision 1.31  1999/08/03 11:15:07  midas
00367   Added bm_skip_event
00368 
00369   Revision 1.30  1999/07/15 07:35:12  midas
00370   Added ss_ctrlc_handler
00371 
00372   Revision 1.29  1999/07/13 08:24:27  midas
00373   Added ANA_TEST
00374 
00375   Revision 1.28  1999/06/28 12:01:33  midas
00376   Added hs_fdump
00377 
00378   Revision 1.27  1999/06/25 12:02:12  midas
00379   Added bk_delete function
00380 
00381   Revision 1.26  1999/06/23 09:58:28  midas
00382   Fixed typo
00383 
00384   Revision 1.25  1999/05/05 12:01:42  midas
00385   Added and modified hs_xxx functions
00386 
00387   Revision 1.24  1999/04/30 10:58:20  midas
00388   Added mode to rpc_set_debug
00389 
00390   Revision 1.23  1999/04/27 11:11:39  midas
00391   Added rpc_register_client
00392 
00393   Revision 1.22  1999/04/23 11:43:15  midas
00394   Increased version to 1.7.0
00395 
00396   Revision 1.21  1999/04/19 07:46:43  midas
00397   Added cm_msg_retrieve
00398 
00399   Revision 1.20  1999/04/15 09:59:09  midas
00400   Added key name to db_get_key_info
00401 
00402   Revision 1.19  1999/04/13 12:20:42  midas
00403   Added db_get_data1 (for Java)
00404 
00405   Revision 1.18  1999/04/08 15:23:46  midas
00406   Added CF_ASCII and db_get_key_info
00407 
00408   Revision 1.17  1999/03/02 10:00:07  midas
00409   Added ANA_CONTINUE and ANA_SKIP
00410 
00411   Revision 1.16  1999/02/18 13:06:27  midas
00412   Release 1.6.3
00413 
00414   Revision 1.15  1999/02/18 11:20:39  midas
00415   Added "level" parameter to db_scan_tree and db_scan_tree_link
00416 
00417   Revision 1.14  1999/02/11 13:20:29  midas
00418   Changed cm_msg from void to INT
00419 
00420   Revision 1.13  1999/02/09 14:38:54  midas
00421   Added debug logging facility
00422 
00423   Revision 1.12  1999/01/20 09:03:38  midas
00424   Added LAM_SOURCE_CRATE and LAM_SOURCE_STATION macros
00425 
00426   Revision 1.11  1999/01/19 10:26:39  midas
00427   Changed CRATE and STATION macros to LAM_SOURCE and LAM_STATION
00428 
00429   Revision 1.10  1999/01/13 09:40:48  midas
00430   Added db_set_data_index2 function
00431 
00432   Revision 1.9  1998/12/11 11:23:17  midas
00433   Release 1.6.2
00434 
00435   Revision 1.8  1998/12/10 10:18:38  midas
00436   Added SS_END_OF_FILE
00437 
00438   Revision 1.7  1998/10/29 15:58:05  midas
00439   Release 1.6.1
00440 
00441   Revision 1.6  1998/10/23 14:35:16  midas
00442   Added version comment
00443 
00444   Revision 1.5  1998/10/23 14:21:35  midas
00445   - Modified version scheme from 1.06 to 1.6.0
00446   - cm_get_version() now returns versino as string
00447 
00448   Revision 1.4  1998/10/23 13:11:13  midas
00449   Modified release number to 1.6
00450 
00451   Revision 1.3  1998/10/22 12:40:20  midas
00452   Added "oflag" to ss_tape_open()
00453 
00454   Revision 1.2  1998/10/12 12:18:59  midas
00455   Added Log tag in header
00456 
00457 
00458   Previous Revision history
00459   ------------------------------------------------------------------
00460   date         by    modification
00461   ---------    ---   ------------------------------------------------
00462   11-NOV-95    SR    created
00463   03-JUN-97    SR    increased number of clients to 32
00464 
00465 \********************************************************************/
00466 
00467 #ifndef _MIDAS_H_
00468 #define _MIDAS_H_
00469 
00470 /*------------------------------------------------------------------*/
00471 
00472 /* MIDAS library version number. This value is returned by 
00473    cm_get_version and will be incremented whenever changes are done
00474    to the MIDAS library. First digit is major release, second
00475    digit is minor release, third digit is patch level */
00476 
00477 /**dox***************************************************************/
00478 /** @file midas.h
00479 The main include file
00480 */
00481 
00482 /** @defgroup midasincludecode The midas.h & midas.c
00483  */
00484 /** @defgroup mdefineh Midas Define 
00485  */
00486 /** @defgroup mmacroh Midas Macros
00487  */
00488 /** @defgroup mdeferrorh Midas Error definition
00489  */
00490 /** @defgroup msectionh Midas Structure Declaration
00491  */
00492 
00493 /**dox***************************************************************/
00494 /** @addtogroup midasincludecode
00495  *  
00496  *  @{  */
00497 
00498 #define MIDAS_VERSION "1.9.5"
00499 #define DATABASE_VERSION 2   /* has to be changed whenenver binary ODB format changes*/
00500 
00501 /**dox***************************************************************/
00502 #ifndef DOXYGEN_SHOULD_SKIP_THIS
00503 
00504 /*------------------------------------------------------------------*/
00505 
00506 /* find out on which operating system we are running */
00507 
00508 #if defined( VAX ) || defined( __VMS )
00509 #define OS_VMS
00510 #endif
00511 
00512 #if defined( _MSC_VER )
00513 #define OS_WINNT
00514 #endif
00515 
00516 #if defined( __MSDOS__ )
00517 #define OS_MSDOS
00518 #endif
00519 
00520 #if defined ( vxw )
00521 #define OS_VXWORKS
00522 #undef OS_UNIX
00523 #endif
00524 
00525 #if !defined(OS_LINUX)
00526 #if defined ( __linux__ )
00527 #define OS_LINUX
00528 #endif
00529 #endif
00530 
00531 #if defined(OS_LINUX) || defined(OS_OSF1) || defined(OS_ULTRIX) || defined(OS_FREEBSD) || defined(OS_SOLARIS) || defined(OS_IRIX) || defined(OS_DARWIN)
00532 #define OS_UNIX
00533 #endif
00534 
00535 #if !defined(OS_IRIX) && !defined(OS_VMS) && !defined(OS_MSDOS) && !defined(OS_UNIX) && !defined(OS_VXWORKS) && !defined(OS_WINNT)
00536 #error MIDAS cannot be used on this operating system
00537 #endif
00538 
00539 /*------------------------------------------------------------------*/
00540 
00541 #ifdef USE_ROOT
00542 #include <TObjArray.h>
00543 #include <TFolder.h>
00544 #include <TCutG.h>
00545 #endif
00546 
00547 /* Define basic data types */
00548 
00549 #ifndef MIDAS_TYPE_DEFINED
00550 #define MIDAS_TYPE_DEFINED
00551 
00552 typedef unsigned char BYTE;
00553 typedef unsigned short int WORD;
00554 
00555 #ifdef __alpha
00556 typedef unsigned int DWORD;
00557 #else
00558 typedef unsigned long int DWORD;
00559 #endif
00560 
00561 #ifndef OS_WINNT
00562 #ifndef OS_VXWORKS
00563 typedef DWORD BOOL;
00564 #endif
00565 #endif
00566 
00567 #endif                          /* MIDAS_TYPE_DEFINED */
00568 
00569 /*
00570   Definitions depending on integer types:
00571 
00572   Note that the alpha chip uses 32 bit integers by default.
00573   Therefore always use 'INT' instead 'int'.
00574 */
00575 #if defined(OS_MSDOS)
00576 typedef long int INT;
00577 #elif defined( OS_WINNT )
00578 
00579 /* INT predefined in windows.h */
00580 #ifndef _INC_WINDOWS
00581 #include <windows.h>
00582 #endif
00583 
00584 #else
00585 typedef int INT;
00586 #endif
00587 
00588 typedef INT HNDLE;
00589 
00590 /* Include vxWorks for BOOL definition */
00591 #ifdef OS_VXWORKS
00592 #ifndef __INCvxWorksh
00593 #include <vxWorks.h>
00594 #endif
00595 #endif
00596 
00597 /*
00598   Definitions depending on pointer types:
00599 
00600   Note that the alpha chip uses 64 bit pointers by default.
00601   Therefore, when converting pointer to integers, always
00602   use the (PTYPE) cast.
00603 */
00604 #ifdef __alpha
00605 #define PTYPE              long int
00606 #else
00607 #define PTYPE              int
00608 #endif
00609 
00610 /* need system-dependant thread type */
00611 #if defined(OS_WINNT)
00612 typedef HANDLE midas_thread_t;
00613 #elif defined(OS_UNIX)
00614 #include <pthread.h>
00615 typedef pthread_t midas_thread_t;
00616 #else
00617 typedef INT midas_thread_t;
00618 #endif
00619 
00620 #define TRUE  1
00621 #define FALSE 0
00622 
00623 /* directory separator */
00624 #if defined(OS_MSDOS) || defined(OS_WINNT)
00625 #define DIR_SEPARATOR     '\\'
00626 #define DIR_SEPARATOR_STR "\\"
00627 #elif defined(OS_VMS)
00628 #define DIR_SEPARATOR     ']'
00629 #define DIR_SEPARATOR_STR "]"
00630 #else
00631 #define DIR_SEPARATOR     '/'
00632 #define DIR_SEPARATOR_STR "/"
00633 #endif
00634 
00635 /* inline functions */
00636 #if defined( _MSC_VER )
00637 #define INLINE __inline
00638 #elif defined(__GNUC__)
00639 #define INLINE __inline__
00640 #else
00641 #define INLINE
00642 #endif
00643 
00644 /* large file (>2GB) support */
00645 #ifndef _LARGEFILE64_SOURCE
00646 #define O_LARGEFILE 0
00647 #endif
00648 
00649 /**dox***************************************************************/
00650 #endif                          /* DOXYGEN_SHOULD_SKIP_THIS */
00651 
00652 /*------------------------------------------------------------------*/
00653 
00654 /* Definition of implementation specific constants */
00655 
00656 /* all buffer sizes must be multiples of 4 ! */
00657 
00658 #ifdef OS_WINNT
00659 #define TAPE_BUFFER_SIZE       0x100000      /**< buffer size for taping data */
00660 #else
00661 #define TAPE_BUFFER_SIZE       0x8000        /**< buffer size for taping data */
00662 #endif
00663 #define NET_TCP_SIZE           0xFFFF        /**< maximum TCP transfer        */
00664 #define OPT_TCP_SIZE           8192          /**< optimal TCP buffer size     */
00665 #define NET_UDP_SIZE           8192          /**< maximum UDP transfer        */
00666 
00667 #define EVENT_BUFFER_SIZE      0x100000      /**< buffer used for events      */
00668 #define EVENT_BUFFER_NAME      "SYSTEM"      /**< buffer name for commands    */
00669 #define MAX_EVENT_SIZE         0x80000       /**< maximum event size 512k     */
00670 #define DEFAULT_EVENT_BUFFER_SIZE 0x200000;  /**< 2M                          */
00671 #define DEFAULT_ODB_SIZE       0x100000      /**< online database 1M          */
00672 
00673 #define NAME_LENGTH            32            /**< length of names, mult.of 8! */
00674 #define HOST_NAME_LENGTH       256           /**< length of TCP/IP names      */
00675 #define MAX_CLIENTS            64            /**< client processes per buf/db */
00676 #define MAX_EVENT_REQUESTS     10            /**< event requests per client   */
00677 #define MAX_OPEN_RECORDS       256           /**< number of open DB records   */
00678 #define MAX_ODB_PATH           256           /**< length of path in ODB       */
00679 #define MAX_EXPERIMENT         32            /**< number of different exp.    */
00680 #define BANKLIST_MAX           64            /**< max # of banks in event     */
00681 #define STRING_BANKLIST_MAX    BANKLIST_MAX * 4   /**< for bk_list()          */
00682 
00683 
00684 #define MIDAS_TCP_PORT 1175     /* port under which server is listening */
00685 
00686 /**
00687 Timeouts [ms] */
00688 #define DEFAULT_RPC_TIMEOUT    10000
00689 #define WATCHDOG_INTERVAL      1000
00690 
00691 #define DEFAULT_WATCHDOG_TIMEOUT 10000    /**< Watchdog */
00692 
00693 /*------------------------------------------------------------------*/
00694 
00695 /* Enumeration definitions */
00696 
00697 /**dox***************************************************************/
00698 /** @addtogroup mdefineh
00699  *  
00700  *  @{  */
00701 
00702 /**
00703 System states */
00704 #define STATE_STOPPED 1      /**< MIDAS run stopped                  */
00705 #define STATE_PAUSED  2      /**< MIDAS run paused                   */
00706 #define STATE_RUNNING 3      /**< MIDAS run running                  */
00707 
00708 /**
00709 Data format */
00710 #define FORMAT_MIDAS  1       /**< MIDAS banks                        */
00711 #define FORMAT_YBOS   2       /**< YBOS  banks                        */
00712 #define FORMAT_ASCII  3       /**< ASCII format                       */
00713 #define FORMAT_FIXED  4       /**< Fixed length binary records        */
00714 #define FORMAT_DUMP   5       /**< Dump (detailed ASCII) format       */
00715 #define FORMAT_HBOOK  6       /**< CERN hbook (rz) format             */
00716 #define FORMAT_ROOT   7       /**< CERN ROOT format                   */
00717 
00718 /**
00719 Event Sampling type */
00720 #define GET_ALL   (1<<0)      /**< get all events (consume)           */
00721 #define GET_SOME  (1<<1)      /**< get as much as possible (sampling) */
00722 #define GET_FARM  (1<<2)      /**< distribute events over several
00723                                  clients (farming)                  */
00724 
00725 /**
00726 Data types Definition                         min      max    */
00727 #define TID_BYTE      1       /**< unsigned byte         0       255    */
00728 #define TID_SBYTE     2       /**< signed byte         -128      127    */
00729 #define TID_CHAR      3       /**< single character      0       255    */
00730 #define TID_WORD      4       /**< two bytes             0      65535   */
00731 #define TID_SHORT     5       /**< signed word        -32768    32767   */
00732 #define TID_DWORD     6       /**< four bytes            0      2^32-1  */
00733 #define TID_INT       7       /**< signed dword        -2^31    2^31-1  */
00734 #define TID_BOOL      8       /**< four bytes bool       0        1     */
00735 #define TID_FLOAT     9       /**< 4 Byte float format                  */
00736 #define TID_DOUBLE   10       /**< 8 Byte float format                  */
00737 #define TID_BITFIELD 11       /**< 32 Bits Bitfield      0  111... (32) */
00738 #define TID_STRING   12       /**< zero terminated string               */
00739 #define TID_ARRAY    13       /**< array with unknown contents          */
00740 #define TID_STRUCT   14       /**< structure with fixed length          */
00741 #define TID_KEY      15       /**< key in online database               */
00742 #define TID_LINK     16       /**< link in online database              */
00743 #define TID_LAST     17       /**< end of TID list indicator            */
00744 
00745 /**
00746 Synchronous / Asynchronous flags */
00747 #define SYNC          0
00748 #define ASYNC         1
00749 
00750 /**
00751 Access modes */
00752 #define MODE_READ      (1<<0)
00753 #define MODE_WRITE     (1<<1)
00754 #define MODE_DELETE    (1<<2)
00755 #define MODE_EXCLUSIVE (1<<3)
00756 #define MODE_ALLOC     (1<<7)
00757 
00758 /**
00759 RPC options */
00760 #define RPC_OTIMEOUT       1
00761 #define RPC_OTRANSPORT     2
00762 #define RPC_OCONVERT_FLAG  3
00763 #define RPC_OHW_TYPE       4
00764 #define RPC_OSERVER_TYPE   5
00765 #define RPC_OSERVER_NAME   6
00766 #define RPC_CONVERT_FLAGS  7
00767 #define RPC_ODB_HANDLE     8
00768 #define RPC_CLIENT_HANDLE  9
00769 #define RPC_SEND_SOCK      10
00770 #define RPC_WATCHDOG_TIMEOUT 11
00771 #define RPC_NODELAY        12
00772 
00773 #define RPC_TCP            0
00774 #define RPC_FTCP           1
00775 
00776 /**
00777 Watchdog flags */
00778 #define WF_WATCH_ME   (1<<0)    /* see cm_set_watchdog_flags   */
00779 #define WF_CALL_WD    (1<<1)
00780 
00781 /**
00782 Transitions values */
00783 #define TR_START      (1<<0)  /**< Start transition  */
00784 #define TR_STOP       (1<<1)  /**< Stop transition  */
00785 #define TR_PAUSE      (1<<2)  /**< Pause transition */
00786 #define TR_RESUME     (1<<3)  /**< Resume transition  */
00787 #define TR_DEFERRED   (1<<12)
00788 
00789 /** 
00790 Equipment types */
00791 #define EQ_PERIODIC   (1<<0)   /**< Periodic Event */
00792 #define EQ_POLLED     (1<<1)   /**< Polling Event */
00793 #define EQ_INTERRUPT  (1<<2)   /**< Interrupt Event */
00794 #define EQ_SLOW       (1<<3)   /**< Slow Control Event */
00795 #define EQ_MANUAL_TRIG (1<<4)  /**< Manual triggered Event */
00796 #define EQ_FRAGMENTED (1<<5)   /**< Fragmented Event */
00797 #define EQ_EB         (1<<6)   /**< Event run through the event builder */
00798 
00799 
00800 /** 
00801 Read - On flags */
00802 #define RO_RUNNING    (1<<0)   /**< While running */
00803 #define RO_STOPPED    (1<<1)   /**< Before stopping the run */
00804 #define RO_PAUSED     (1<<2)   /**< ??? */
00805 #define RO_BOR        (1<<3)   /**< At the Begin of run */
00806 #define RO_EOR        (1<<4)   /**< At the End of run */
00807 #define RO_PAUSE      (1<<5)   /**< Before pausing the run */
00808 #define RO_RESUME     (1<<6)   /**< Before resuming the run */
00809 
00810 #define RO_TRANSITIONS (RO_BOR|RO_EOR|RO_PAUSE|RO_RESUME)      /**< At all transitions */
00811 #define RO_ALWAYS      (0xFF)      /**<  Always (independent of the run status) */
00812 
00813 #define RO_ODB        (1<<8)   /**< Submit data to ODB only */
00814 
00815 /**dox***************************************************************/
00816 /** @} */ /* end of mdefineh */
00817 
00818 /**
00819 special characters */
00820 #define CH_BS             8
00821 #define CH_TAB            9
00822 #define CH_CR            13
00823 
00824 #define CH_EXT 0x100
00825 
00826 #define CH_HOME   (CH_EXT+0)
00827 #define CH_INSERT (CH_EXT+1)
00828 #define CH_DELETE (CH_EXT+2)
00829 #define CH_END    (CH_EXT+3)
00830 #define CH_PUP    (CH_EXT+4)
00831 #define CH_PDOWN  (CH_EXT+5)
00832 #define CH_UP     (CH_EXT+6)
00833 #define CH_DOWN   (CH_EXT+7)
00834 #define CH_RIGHT  (CH_EXT+8)
00835 #define CH_LEFT   (CH_EXT+9)
00836 
00837 /* event sources in equipment */
00838 /**
00839 Code the LAM crate and LAM station into a bitwise register.
00840 @param c Crate number
00841 @param s Slot number
00842 */
00843 #define LAM_SOURCE(c, s)         (c<<24 | ((s) & 0xFFFFFF))
00844 
00845 /** 
00846 Code the Station number bitwise for the LAM source.
00847 @param s Slot number
00848 */
00849 #define LAM_STATION(s)           (1<<(s-1))
00850 
00851 /** 
00852 Convert the coded LAM crate to Crate number.
00853 @param c coded crate
00854 */
00855 #define LAM_SOURCE_CRATE(c)      (c>>24)
00856 
00857 /** 
00858 Convert the coded LAM station to Station number.
00859 @param s Slot number
00860 */
00861 #define LAM_SOURCE_STATION(s)    ((s) & 0xFFFFFF)
00862 
00863 /**
00864 CNAF commands */
00865 #define CNAF        0x1         /* normal read/write                */
00866 #define CNAF_nQ     0x2         /* Repeat read until noQ            */
00867 
00868 #define CNAF_INHIBIT_SET         0x100
00869 #define CNAF_INHIBIT_CLEAR       0x101
00870 #define CNAF_CRATE_CLEAR         0x102
00871 #define CNAF_CRATE_ZINIT         0x103
00872 #define CNAF_TEST                0x110
00873 
00874 /**dox***************************************************************/
00875 /** @addtogroup mmacroh
00876  *  
00877  *  @{
00878  */
00879 
00880 /**
00881 MAX */
00882 #ifndef MAX
00883 #define MAX(a,b)            (((a) > (b)) ? (a) : (b))
00884 #endif
00885 
00886 /**
00887 MIN */
00888 #ifndef MIN
00889 #define MIN(a,b)            (((a) < (b)) ? (a) : (b))
00890 #endif
00891 
00892 /*------------------------------------------------------------------*/
00893 
00894 /**
00895 Align macro for data alignment on 8-byte boundary */
00896 #define ALIGN8(x)  (((x)+7) & ~7)
00897 
00898 /**
00899 Align macro for variable data alignment */
00900 #define VALIGN(adr,align)  (((PTYPE) (adr)+align-1) & ~(align-1))
00901 
00902 /**dox***************************************************************/
00903 /** @} */ /* end of mmacroh */
00904  
00905 /**dox***************************************************************/
00906 /** @addtogroup mdefineh
00907  *  
00908  *  @{  */
00909 /*
00910 * Bit flags */
00911 #define EVENTID_ALL        -1   /* any event id                   */
00912 #define TRIGGER_ALL        -1   /* any type of trigger            */
00913 
00914 /**
00915 System message types */
00916 #define MT_ERROR           (1<<0)     /**< - */
00917 #define MT_INFO            (1<<1)     /**< - */
00918 #define MT_DEBUG           (1<<2)     /**< - */
00919 #define MT_USER            (1<<3)     /**< - */
00920 #define MT_LOG             (1<<4)     /**< - */
00921 #define MT_TALK            (1<<5)     /**< - */
00922 #define MT_CALL            (1<<6)     /**< - */
00923 #define MT_ALL              0xFF      /**< - */
00924 
00925 #define MERROR             MT_ERROR, __FILE__, __LINE__ /**< - */
00926 #define MINFO              MT_INFO,  __FILE__, __LINE__ /**< - */
00927 #define MDEBUG             MT_DEBUG, __FILE__, __LINE__ /**< - */
00928 #define MUSER              MT_USER,  __FILE__, __LINE__ /**< produced by interactive user */
00929 #define MLOG               MT_LOG,   __FILE__, __LINE__ /**< info message which is only logged */
00930 #define MTALK              MT_TALK,  __FILE__, __LINE__ /**< info message for speech system */
00931 #define MCALL              MT_CALL,  __FILE__, __LINE__ /**< info message for telephone call */
00932 
00933 /**dox***************************************************************/
00934 /** @} */ /* end of mdefineh */
00935 
00936 
00937 /**dox***************************************************************/
00938 /** @addtogroup mdeferrorh
00939  *  
00940  *  @{
00941  */
00942 
00943 /**dox***************************************************************/
00944 /**
00945  @defgroup err21 Status and error codes
00946  @{ */
00947 #define SUCCESS                       1 /**< Success */
00948 #define CM_SUCCESS                    1 /**< Same  */
00949 #define CM_SET_ERROR                102 /**< set  */
00950 #define CM_NO_CLIENT                103 /**< nobody */
00951 #define CM_DB_ERROR                 104 /**< db access error */
00952 #define CM_UNDEF_EXP                105 /**< - */
00953 #define CM_VERSION_MISMATCH         106 /**< - */
00954 #define CM_SHUTDOWN                 107 /**< - */
00955 #define CM_WRONG_PASSWORD           108 /**< - */
00956 #define CM_UNDEF_ENVIRON            109 /**< - */
00957 #define CM_DEFERRED_TRANSITION      110 /**< - */
00958 #define CM_TRANSITION_IN_PROGRESS   111 /**< - */
00959 #define CM_TIMEOUT                  112 /**< - */
00960 #define CM_INVALID_TRANSITION       113 /**< - */
00961 #define CM_TOO_MANY_REQUESTS        114 /**< - */
00962 /**dox***************************************************************/
00963 /** @} */ /* end of err21 */
00964 
00965 /**dox***************************************************************/
00966 /**
00967  @defgroup err22 Buffer Manager error codes
00968  @{ */
00969 #define BM_SUCCESS                    1   /**< - */
00970 #define BM_CREATED                  202   /**< - */
00971 #define BM_NO_MEMORY                203   /**< - */
00972 #define BM_INVALID_NAME             204   /**< - */
00973 #define BM_INVALID_HANDLE           205   /**< - */
00974 #define BM_NO_SLOT                  206   /**< - */
00975 #define BM_NO_MUTEX                 207   /**< - */
00976 #define BM_NOT_FOUND                208   /**< - */
00977 #define BM_ASYNC_RETURN             209   /**< - */
00978 #define BM_TRUNCATED                210   /**< - */
00979 #define BM_MULTIPLE_HOSTS           211   /**< - */
00980 #define BM_MEMSIZE_MISMATCH         212   /**< - */
00981 #define BM_CONFLICT                 213   /**< - */
00982 #define BM_EXIT                     214   /**< - */
00983 #define BM_INVALID_PARAM            215   /**< - */
00984 #define BM_MORE_EVENTS              216   /**< - */
00985 #define BM_INVALID_MIXING           217   /**< - */
00986 #define BM_NO_SHM                   218   /**< - */
00987 /**dox***************************************************************/
00988 /** @} */ /* end of group 22 */
00989 
00990 /**dox***************************************************************/
00991 /**  @defgroup err23 Online Database error codes 
00992 @{ */
00993 #define DB_SUCCESS                    1   /**< - */
00994 #define DB_CREATED                  302   /**< - */
00995 #define DB_NO_MEMORY                303   /**< - */
00996 #define DB_INVALID_NAME             304   /**< - */
00997 #define DB_INVALID_HANDLE           305   /**< - */
00998 #define DB_NO_SLOT                  306   /**< - */
00999 #define DB_NO_MUTEX                 307   /**< - */
01000 #define DB_MEMSIZE_MISMATCH         308   /**< - */
01001 #define DB_INVALID_PARAM            309   /**< - */
01002 #define DB_FULL                     310   /**< - */
01003 #define DB_KEY_EXIST                311   /**< - */
01004 #define DB_NO_KEY                   312   /**< - */
01005 #define DB_KEY_CREATED              313   /**< - */
01006 #define DB_TRUNCATED                314   /**< - */
01007 #define DB_TYPE_MISMATCH            315   /**< - */
01008 #define DB_NO_MORE_SUBKEYS          316   /**< - */
01009 #define DB_FILE_ERROR               317   /**< - */
01010 #define DB_NO_ACCESS                318   /**< - */
01011 #define DB_STRUCT_SIZE_MISMATCH     319   /**< - */
01012 #define DB_OPEN_RECORD              320   /**< - */
01013 #define DB_OUT_OF_RANGE             321   /**< - */
01014 #define DB_INVALID_LINK             322   /**< - */
01015 #define DB_CORRUPTED                323   /**< - */
01016 #define DB_STRUCT_MISMATCH          324   /**< - */
01017 #define DB_TIMEOUT                  325   /**< - */
01018 #define DB_VERSION_MISMATCH         326   /**< - */
01019 /**dox***************************************************************/
01020 /** @} */ /* end of group 23 */
01021 
01022 /**dox***************************************************************/
01023 /**  @defgroup err24 System Services error code
01024 @{ */
01025 #define SS_SUCCESS                    1   /**< - */
01026 #define SS_CREATED                  402   /**< - */
01027 #define SS_NO_MEMORY                403   /**< - */
01028 #define SS_INVALID_NAME             404   /**< - */
01029 #define SS_INVALID_HANDLE           405   /**< - */
01030 #define SS_INVALID_ADDRESS          406   /**< - */
01031 #define SS_FILE_ERROR               407   /**< - */
01032 #define SS_NO_MUTEX                 408   /**< - */
01033 #define SS_NO_PROCESS               409   /**< - */
01034 #define SS_NO_THREAD                410   /**< - */
01035 #define SS_SOCKET_ERROR             411   /**< - */
01036 #define SS_TIMEOUT                  412   /**< - */
01037 #define SS_SERVER_RECV              413   /**< - */
01038 #define SS_CLIENT_RECV              414   /**< - */
01039 #define SS_ABORT                    415   /**< - */
01040 #define SS_EXIT                     416   /**< - */
01041 #define SS_NO_TAPE                  417   /**< - */
01042 #define SS_DEV_BUSY                 418   /**< - */
01043 #define SS_IO_ERROR                 419   /**< - */
01044 #define SS_TAPE_ERROR               420   /**< - */
01045 #define SS_NO_DRIVER                421   /**< - */
01046 #define SS_END_OF_TAPE              422   /**< - */
01047 #define SS_END_OF_FILE              423   /**< - */
01048 #define SS_FILE_EXISTS              424   /**< - */
01049 #define SS_NO_SPACE                 425   /**< - */
01050 #define SS_INVALID_FORMAT           426   /**< - */
01051 #define SS_NO_ROOT                  427   /**< - */
01052 /**dox***************************************************************/
01053 /** @} */ /* end of group 24 */
01054 
01055 /**dox***************************************************************/
01056 /**  @defgroup err25 Remote Procedure Calls error codes
01057 @{ */
01058 #define RPC_SUCCESS                   1   /**< - */
01059 #define RPC_ABORT              SS_ABORT   /**< - */
01060 #define RPC_NO_CONNECTION           502   /**< - */
01061 #define RPC_NET_ERROR               503   /**< - */
01062 #define RPC_TIMEOUT                 504   /**< - */
01063 #define RPC_EXCEED_BUFFER           505   /**< - */
01064 #define RPC_NOT_REGISTERED          506   /**< - */
01065 #define RPC_CONNCLOSED              507   /**< - */
01066 #define RPC_INVALID_ID              508   /**< - */
01067 #define RPC_SHUTDOWN                509   /**< - */
01068 #define RPC_NO_MEMORY               510   /**< - */
01069 #define RPC_DOUBLE_DEFINED          511   /**< - */
01070 /**dox***************************************************************/
01071 /** @} */ /* end of group 25 */
01072 
01073 /**dox***************************************************************/
01074 /**  @defgroup err26 Other errors
01075 @{ */
01076 #define FE_SUCCESS                    1   /**< - */
01077 #define FE_ERR_ODB                  602   /**< - */
01078 #define FE_ERR_HW                   603   /**< - */
01079 #define FE_ERR_DISABLED             604   /**< - */
01080 #define FE_ERR_DRIVER               605   /**< - */
01081 
01082 /** 
01083 History error code */
01084 #define HS_SUCCESS                    1   /**< - */
01085 #define HS_FILE_ERROR               702   /**< - */
01086 #define HS_NO_MEMORY                703   /**< - */
01087 #define HS_TRUNCATED                704   /**< - */
01088 #define HS_WRONG_INDEX              705   /**< - */
01089 #define HS_UNDEFINED_EVENT          706   /**< - */
01090 #define HS_UNDEFINED_VAR            707   /**< - */
01091 
01092 /** 
01093 FTP error code */
01094 #define FTP_SUCCESS                   1   /**< - */
01095 #define FTP_NET_ERROR               802   /**< - */
01096 #define FTP_FILE_ERROR              803   /**< - */
01097 #define FTP_RESPONSE_ERROR          804   /**< - */
01098 #define FTP_INVALID_ARG             805   /**< - */
01099 
01100 /** 
01101 ELog error code */
01102 #define EL_SUCCESS                    1   /**< - */
01103 #define EL_FILE_ERROR               902   /**< - */
01104 #define EL_NO_MESSAGE               903   /**< - */
01105 #define EL_TRUNCATED                904   /**< - */
01106 #define EL_FIRST_MSG                905   /**< - */
01107 #define EL_LAST_MSG                 906   /**< - */
01108 
01109 /** 
01110 Alarm error code */
01111 #define AL_SUCCESS                    1   /**< - */
01112 #define AL_INVALID_NAME            1002   /**< - */
01113 #define AL_ERROR_ODB               1003   /**< - */
01114 #define AL_RESET                   1004   /**< - */
01115 
01116 /** 
01117 Slow control commands error code */
01118 #define CMD_INIT                    (1<<0)
01119 #define CMD_EXIT                    (1<<1)
01120 #define CMD_IDLE                    (1<<2)
01121 #define CMD_SET                     (1<<3)
01122 #define CMD_SET_ALL                 (1<<4)
01123 #define CMD_GET                     (1<<5)
01124 #define CMD_GET_ALL                 (1<<6)
01125 #define CMD_GET_CURRENT             (1<<7)
01126 #define CMD_GET_CURRENT_ALL         (1<<8)
01127 #define CMD_SET_CURRENT_LIMIT       (1<<9)
01128 #define CMD_SET_CURRENT_LIMIT_ALL  (1<<10)
01129 #define CMD_GET_DEMAND             (1<<11)
01130 #define CMD_GET_DEFAULT_NAME       (1<<12)
01131 #define CMD_GET_DEFAULT_THRESHOLD  (1<<13)
01132 #define CMD_SET_LABEL              (1<<14)
01133 #define CMD_ENABLE_COMMAND         (1<<15)
01134 #define CMD_DISABLE_COMMAND        (1<<16)
01135 
01136 /** 
01137 Bus driver commands */
01138 #define CMD_WRITE                   100
01139 #define CMD_READ                    101
01140 #define CMD_PUTS                    102
01141 #define CMD_GETS                    103
01142 #define CMD_DEBUG                   104
01143 #define CMD_NAME                    105
01144 
01145 /** 
01146 Commands for interrupt events error code */
01147 #define CMD_INTERRUPT_ENABLE        100
01148 #define CMD_INTERRUPT_DISABLE       101
01149 #define CMD_INTERRUPT_ATTACH        102
01150 #define CMD_INTERRUPT_DETACH        103
01151 
01152 /**
01153 macros for bus driver access */
01154 #define BD_GETS(s,z,p,t)   info->bd(CMD_GETS, info->bd_info, s, z, p, t)
01155 #define BD_READS(s,z,p,t)  info->bd(CMD_READ, info->bd_info, s, z, p, t)
01156 #define BD_PUTS(s)         info->bd(CMD_PUTS, info->bd_info, s)
01157 #define BD_WRITES(s)       info->bd(CMD_WRITE, info->bd_info, s)
01158 
01159 /**dox***************************************************************/
01160 /** @} */ /* end of 26 */
01161 
01162 /**dox***************************************************************/
01163 /** @} */ /* end of mdeferrorh */
01164 
01165 
01166 #define ANA_CONTINUE                  1
01167 #define ANA_SKIP                      0
01168 
01169 
01170 /*---- Buffer manager structures -----------------------------------*/
01171 
01172 /**dox***************************************************************/
01173 /** @addtogroup msectionh
01174  *  
01175  *  @{  */
01176 
01177 /**dox***************************************************************/
01178 /** @defgroup mbufferh Buffer Section
01179  *  @{  */
01180 /**
01181 Event header */
01182 typedef struct {
01183    short int event_id;           /**< event ID starting from one      */
01184    short int trigger_mask;       /**< hardware trigger mask           */
01185    DWORD serial_number;          /**< serial number starting from one */
01186    DWORD time_stamp;             /**< time of production of event     */
01187    DWORD data_size;              /**< size of event in bytes w/o header */
01188 } EVENT_HEADER;
01189 
01190 /**
01191 TRIGGER_MASK
01192 Extract or set the trigger mask field pointed by the argument.
01193 @param e pointer to the midas event (pevent)
01194 */
01195 #define TRIGGER_MASK(e)    ((((EVENT_HEADER *) e)-1)->trigger_mask)
01196 
01197 /**
01198 EVENT_ID
01199 Extract or set the event ID field pointed by the argument..
01200 @param e pointer to the midas event (pevent)
01201 */
01202 #define EVENT_ID(e)        ((((EVENT_HEADER *) e)-1)->event_id)
01203 
01204 /**
01205 SERIAL_NUMBER
01206 Extract or set/reset the serial number field pointed by the argument.
01207 @param e pointer to the midas event (pevent)
01208 */
01209 #define SERIAL_NUMBER(e)   ((((EVENT_HEADER *) e)-1)->serial_number)
01210 
01211 /**
01212 TIME_STAMP
01213 Extract or set/reset the time stamp field pointed by the argument.
01214 @param e pointer to the midas event (pevent)
01215 */
01216 #define TIME_STAMP(e)      ((((EVENT_HEADER *) e)-1)->time_stamp)
01217 #define EVENT_SOURCE(e,o)  (* (INT*) (e+o))
01218 
01219 /**
01220 system event IDs */
01221 #define EVENTID_BOR      ((short int) 0x8000)  /**< Begin-of-run      */
01222 #define EVENTID_EOR      ((short int) 0x8001)  /**< End-of-run        */
01223 #define EVENTID_MESSAGE  ((short int) 0x8002)  /**< Message events    */
01224 
01225 /**
01226 fragmented events */
01227 #define EVENTID_FRAG1    ((unsigned short) 0xC000)      /* first fragment */
01228 #define EVENTID_FRAG     ((unsigned short) 0xD000)      /* added to real event-id */
01229 
01230 /**
01231 magic number used in trigger_mask for BOR event */
01232 #define MIDAS_MAGIC      0x494d            /**< 'MI' */
01233 
01234 
01235 /**
01236 Buffer structure */
01237 typedef struct {
01238    INT id;                       /**< request id                      */
01239    BOOL valid;                   /**< indicating a valid entry        */
01240    short int event_id;           /**< event ID                        */
01241    short int trigger_mask;       /**< trigger mask                    */
01242    INT sampling_type;            /**< GET_ALL, GET_SOME, GET_FARM     */
01243                                  /**< dispatch function */
01244    void (*dispatch) (HNDLE, HNDLE, EVENT_HEADER *, void *);
01245 } EVENT_REQUEST;
01246 
01247 typedef struct {
01248    char name[NAME_LENGTH];            /**< name of client             */
01249    INT pid;                           /**< process ID                 */
01250    INT tid;                           /**< thread ID                  */
01251    INT thandle;                       /**< thread handle              */
01252    INT port;                          /**< UDP port for wake up       */
01253    INT read_pointer;                  /**< read pointer to buffer     */
01254    INT max_request_index;             /**< index of last request      */
01255    INT num_received_events;           /**< no of received events      */
01256    INT num_sent_events;               /**< no of sent events          */
01257    INT num_waiting_events;            /**< no of waiting events       */
01258    float data_rate;                   /**< data rate in kB/sec        */
01259    BOOL read_wait;                    /**< wait for read - flag       */
01260    INT write_wait;                    /**< wait for write # bytes     */
01261    BOOL wake_up;                      /**< client got a wake-up msg   */
01262    BOOL all_flag;                     /**< at least one GET_ALL request */
01263    DWORD last_activity;               /**< time of last activity      */
01264    DWORD watchdog_timeout;            /**< timeout in ms              */
01265 
01266    EVENT_REQUEST event_request[MAX_EVENT_REQUESTS];
01267 
01268 } BUFFER_CLIENT;
01269 
01270 typedef struct {
01271    char name[NAME_LENGTH];            /**< name of buffer             */
01272    INT num_clients;                   /**< no of active clients       */
01273    INT max_client_index;              /**< index of last client       */
01274    INT size;                          /**< size of data area in bytes */
01275    INT read_pointer;                  /**< read pointer               */
01276    INT write_pointer;                 /**< read pointer               */
01277    INT num_in_events;                 /**< no of received events      */
01278    INT num_out_events;                /**< no of distributed events   */
01279 
01280    BUFFER_CLIENT client[MAX_CLIENTS]; /**< entries for clients        */
01281 
01282 } BUFFER_HEADER;
01283 
01284 /* Per-process buffer access structure (descriptor) */
01285 
01286 typedef struct {
01287    BOOL attached;                   /**< TRUE if buffer is attached   */
01288    INT client_index;                /**< index to CLIENT str. in buf. */
01289    BUFFER_HEADER *buffer_header;    /**< pointer to buffer header     */
01290    void *buffer_data;               /**< pointer to buffer data       */
01291    char *read_cache;                /**< cache for burst read         */
01292    INT read_cache_size;             /**< cache size in bytes          */
01293    INT read_cache_rp;               /**< cache read pointer           */
01294    INT read_cache_wp;               /**< cache write pointer          */
01295    char *write_cache;               /**< cache for burst read         */
01296    INT write_cache_size;            /**< cache size in bytes          */
01297    INT write_cache_rp;              /**< cache read pointer           */
01298    INT write_cache_wp;              /**< cache write pointer          */
01299    HNDLE mutex;                     /**< mutex/semaphore handle       */
01300    INT shm_handle;                  /**< handle to shared memory      */
01301    INT index;                       /**< connection index / tid       */
01302    BOOL callback;                   /**< callback defined for this buffer */
01303 
01304 } BUFFER;
01305 
01306 typedef struct {
01307    DWORD type;                        /**< TID_xxx type                      */
01308    INT num_values;                    /**< number of values                  */
01309    char name[NAME_LENGTH];            /**< name of variable                  */
01310    INT data;                          /**< Address of variable (offset)      */
01311    INT total_size;                    /**< Total size of data block          */
01312    INT item_size;                     /**< Size of single data item          */
01313    WORD access_mode;                  /**< Access mode                       */
01314    WORD notify_count;                 /**< Notify counter                    */
01315    INT next_key;                      /**< Address of next key               */
01316    INT parent_keylist;                /**< keylist to which this key belongs */
01317    INT last_written;                  /**< Time of last write action  */
01318 } KEY;
01319 
01320 typedef struct {
01321    INT parent;                        /**< Address of parent key      */
01322    INT num_keys;                      /**< number of keys             */
01323    INT first_key;                     /**< Address of first key       */
01324 } KEYLIST;
01325 
01326 /**dox***************************************************************/
01327 /** @} */ /* end of msectionh */
01328 
01329 /*---- Equipment ---------------------------------------------------*/
01330 
01331 /**dox***************************************************************/
01332 /** @defgroup mequipment Equipment related
01333  *  @{  */
01334 
01335 #define DF_INPUT       (1<<0)         /**< channel is input           */
01336 #define DF_OUTPUT      (1<<1)         /**< channel is output          */
01337 #define DF_PRIO_DEVICE (1<<2)         /**< get demand values from device instead of ODB */
01338 #define DF_READ_ONLY   (1<<3)         /**< never write demand values to device */
01339 
01340 typedef struct {
01341    char name[NAME_LENGTH];            /**< Driver name                       */
01342     INT(*bd) (INT cmd, ...);          /**< Device driver entry point         */
01343    void *bd_info;                     /**< Private info for bus driver       */
01344 } BUS_DRIVER;
01345 
01346 typedef struct {
01347    char name[NAME_LENGTH];            /**< Driver name                       */
01348     INT(*dd) (INT cmd, ...);          /**< Device driver entry point         */
01349    INT channels;                      /**< Number of channels                */
01350     INT(*bd) (INT cmd, ...);          /**< Bus driver entry point            */
01351    DWORD flags;                       /**< Combination of DF_xx              */
01352    void *dd_info;                     /**< Private info for device driver    */
01353 } DEVICE_DRIVER;
01354 
01355 typedef struct {
01356    WORD event_id;                     /**< Event ID associated with equipm.  */
01357    WORD trigger_mask;                 /**< Trigger mask                      */
01358    char buffer[NAME_LENGTH];          /**< Event buffer to send events into  */
01359    INT eq_type;                       /**< One of EQ_xxx                     */
01360    INT source;                        /**< Event source (LAM/IRQ)            */
01361    char format[8];                    /**< Data format to produce            */
01362    BOOL enabled;                      /**< Enable flag                       */
01363    INT read_on;                       /**< Combination of Read-On flags RO_xxx */
01364    INT period;                        /**< Readout interval/Polling time in ms */
01365    double event_limit;                /**< Stop run when limit is reached    */
01366    DWORD num_subevents;               /**< Number of events in super event */
01367    INT history;                       /**< Log history                       */
01368    char frontend_host[NAME_LENGTH];   /**< Host on which FE is running       */
01369    char frontend_name[NAME_LENGTH];   /**< Frontend name                     */
01370    char frontend_file_name[256];      /**< Source file used for user FE      */
01371 } EQUIPMENT_INFO;
01372 
01373 typedef struct {
01374    double events_sent;
01375    double events_per_sec;
01376    double kbytes_per_sec;
01377 } EQUIPMENT_STATS;
01378 
01379 typedef struct eqpmnt *PEQUIPMENT;
01380 
01381 typedef struct eqpmnt {
01382    char name[NAME_LENGTH];              /**< Equipment name                            */
01383    EQUIPMENT_INFO info;                 /**< From above                                */
01384     INT(*readout) (char *, INT);        /**< Pointer to user readout routine           */
01385     INT(*cd) (INT cmd, PEQUIPMENT);     /**< Class driver routine                      */
01386    DEVICE_DRIVER *driver;               /**< Device driver list                        */
01387    void *event_descrip;                 /**< Init string for fixed events or bank list */
01388    void *cd_info;                       /**< private data for class driver             */
01389    INT status;                          /**< One of FE_xxx                             */
01390    DWORD last_called;                   /**< Last time event was read                  */
01391    DWORD last_idle;                     /**< Last time idle func was called            */
01392    DWORD poll_count;                    /**< Needed to poll 'period'                   */
01393    INT format;                          /**< FORMAT_xxx                                */
01394    HNDLE buffer_handle;                 /**< MIDAS buffer handle                       */
01395    HNDLE hkey_variables;                /**< Key to variables subtree in ODB           */
01396    DWORD serial_number;                 /**< event serial number                       */
01397    DWORD subevent_number;               /**< subevent number                           */
01398    DWORD odb_out;                       /**< # updates FE -> ODB                       */
01399    DWORD odb_in;                        /**< # updated ODB -> FE                       */
01400    DWORD bytes_sent;                    /**< number of bytes sent                      */
01401    DWORD events_sent;                   /**< number of events sent                     */
01402    EQUIPMENT_STATS stats;
01403 } EQUIPMENT;
01404 /**dox***************************************************************/
01405 /** @} */ /* end of mequipmenth */
01406 
01407 /*---- Banks -------------------------------------------------------*/
01408 
01409 /**dox***************************************************************/
01410 /** @defgroup mbank Bank related
01411  *  @{  */
01412 
01413 #define BANK_FORMAT_VERSION     1      /**< - */
01414 #define BANK_FORMAT_32BIT   (1<<4)     /**< - */
01415 
01416 typedef struct {
01417    DWORD data_size;                    /**< Size in bytes */
01418    DWORD flags;                        /**< internal flag */
01419 } BANK_HEADER;
01420 
01421 typedef struct {
01422    char name[4];                       /**< - */
01423    WORD type;                          /**< - */
01424    WORD data_size;                     /**< - */
01425 } BANK;
01426 
01427 typedef struct {
01428    char name[4];                       /**< - */
01429    DWORD type;                         /**< - */
01430    DWORD data_size;                    /**< - */
01431 } BANK32;
01432 
01433 typedef struct {
01434    char name[NAME_LENGTH];             /**< - */
01435    DWORD type;                         /**< - */
01436    DWORD n_data;                       /**< - */
01437 } TAG;
01438 
01439 typedef struct {
01440    char name[9];                       /**< - */
01441    WORD type;                          /**< - */
01442    DWORD size;                         /**< - */
01443    char **init_str;                    /**< - */
01444    BOOL output_flag;                   /**< - */
01445    void *addr;                         /**< - */
01446    DWORD n_data;                       /**< - */
01447    HNDLE def_key;                      /**< - */
01448 } BANK_LIST;
01449 /**dox***************************************************************/
01450 /** @} */ /* end of mbank */
01451 
01452 /*---- Analyzer request --------------------------------------------*/
01453 /**dox***************************************************************/
01454 /** @defgroup manalyzer Analyzer related
01455  *  @{  */
01456 
01457 typedef struct {
01458    char name[NAME_LENGTH];            /**< Module name                       */
01459    char author[NAME_LENGTH];          /**< Author                            */
01460     INT(*analyzer) (EVENT_HEADER *, void *);
01461                                            /**< Pointer to user analyzer routine  */
01462     INT(*bor) (INT run_number);       /**< Pointer to begin-of-run routine   */
01463     INT(*eor) (INT run_number);       /**< Pointer to end-of-run routine     */
01464     INT(*init) ();                    /**< Pointer to init routine           */
01465     INT(*exit) ();                    /**< Pointer to exit routine           */
01466    void *parameters;                  /**< Pointer to parameter structure    */
01467    INT param_size;                    /**< Size of parameter structure       */
01468    char **init_str;                   /**< Parameter init string             */
01469    BOOL enabled;                      /**< Enabled flag                      */
01470    void *histo_folder;
01471 } ANA_MODULE;
01472 
01473 typedef struct {
01474    INT event_id;                      /**< Event ID associated with equipm.  */
01475    INT trigger_mask;                  /**< Trigger mask                      */
01476    INT sampling_type;                 /**< GET_ALL/GET_SOME                  */
01477    char buffer[NAME_LENGTH];          /**< Event buffer to send events into  */
01478    BOOL enabled;                      /**< Enable flag                       */
01479    char client_name[NAME_LENGTH];     /**< Analyzer name                     */
01480    char host[NAME_LENGTH];            /**< Host on which analyzer is running */
01481 } AR_INFO;
01482 
01483 typedef struct {
01484    double events_received;
01485    double events_per_sec;
01486    double events_written;
01487 } AR_STATS;
01488 
01489 typedef struct {
01490    char event_name[NAME_LENGTH];      /**< Event name                        */
01491    AR_INFO ar_info;                   /**< From above                        */
01492    INT(*analyzer) (EVENT_HEADER *, void *); /**< Pointer to user analyzer routine  */
01493    ANA_MODULE **ana_module;           /**< List of analyzer modules          */
01494    BANK_LIST *bank_list;              /**< List of banks for event           */
01495    INT rwnt_buffer_size;              /**< Size in events of RW N-tuple buf  */
01496    BOOL use_tests;                    /**< Use tests for this event          */
01497    char **init_string;
01498    INT status;                        /**< One of FE_xxx                     */
01499    HNDLE buffer_handle;               /**< MIDAS buffer handle               */
01500    HNDLE request_id;                  /**< Event request handle              */
01501    HNDLE hkey_variables;              /**< Key to variables subtree in ODB   */
01502    HNDLE hkey_common;                 /**< Key to common subtree             */
01503    void *addr;                        /**< Buffer for CWNT filling           */
01504    struct {                          
01505       DWORD run;
01506       DWORD serial;
01507       DWORD time;
01508    } number;                          /**< Buffer for event number for CWNT  */    
01509    DWORD events_received;             /**< number of events sent             */
01510    DWORD events_written;              /**< number of events written          */
01511    AR_STATS ar_stats;
01512 
01513 } ANALYZE_REQUEST;
01514 
01515 /*---- Tests -------------------------------------------------------*/
01516 
01517 typedef struct {
01518    char name[80];
01519    BOOL registered;
01520    DWORD count;
01521    DWORD previous_count;
01522    BOOL value;
01523 } ANA_TEST;
01524 
01525 #define SET_TEST(t, v) { if (!t.registered) test_register(&t); t.value = (v); }
01526 #define TEST(t) (t.value)
01527 
01528 #ifdef DEFINE_TESTS
01529 #define DEF_TEST(t) ANA_TEST t = { #t, 0, 0, FALSE };
01530 #else
01531 #define DEF_TEST(t) extern ANA_TEST t;
01532 #endif
01533 /**dox***************************************************************/
01534 /** @} */ /* end of mbank */
01535 
01536 /*---- History structures ------------------------------------------*/
01537 
01538 /**dox***************************************************************/
01539 /** @defgroup mhistoryh History related
01540  *  @{  */
01541 
01542 #define RT_DATA (*((DWORD *) "HSDA"))
01543 #define RT_DEF  (*((DWORD *) "HSDF"))
01544 
01545 typedef struct {
01546    DWORD record_type;           /* RT_DATA or RT_DEF */
01547    DWORD event_id;
01548    DWORD time;
01549    DWORD def_offset;            /* place of definition */
01550    DWORD data_size;             /* data following this header in bytes */
01551 } HIST_RECORD;
01552 
01553 typedef struct {
01554    DWORD event_id;
01555    char event_name[NAME_LENGTH];
01556    DWORD def_offset;
01557 } DEF_RECORD;
01558 
01559 typedef struct {
01560    DWORD event_id;
01561    DWORD time;
01562    DWORD offset;
01563 } INDEX_RECORD;
01564 
01565 typedef struct {
01566    DWORD event_id;
01567    char event_name[NAME_LENGTH];
01568    DWORD n_tag;
01569    TAG *tag;
01570    DWORD hist_fh;
01571    DWORD index_fh;
01572    DWORD def_fh;
01573    DWORD base_time;
01574    DWORD def_offset;
01575 } HISTORY;
01576 /**dox***************************************************************/
01577 /** @} */ /* end of mhistory */
01578 
01579 /*---- ODB runinfo -------------------------------------------------*/
01580 
01581 /**dox***************************************************************/
01582 /** @defgroup modbh ODB runinfo related
01583  *  @{  */
01584 /** Contains the main parameters regarding the run status.
01585     The containt reflects the current system ONLY if Midas clients
01586     are connected. Otherwise the status is erroneous.
01587 */
01588 typedef struct {
01589    INT state;                         /**< Current run condition  */
01590    INT online_mode;                   /**< Mode of operation online/offline */
01591    INT run_number;                    /**< Current processing run number      */
01592    INT transition_in_progress;        /**< Intermediate state during transition */
01593    INT requested_transition;          /**< Deferred transition request */
01594    char start_time[32];               /**< ASCII of the last start time */
01595    DWORD start_time_binary;           /**< Bin of the last start time */
01596    char stop_time[32];                /**< ASCII of the last stop time */
01597    DWORD stop_time_binary;            /**< ASCII of the last stop time */
01598 } RUNINFO;
01599 
01600 #define RUNINFO_STR(_name) char *_name[] = {\
01601 "[.]",\
01602 "State = INT : 1",\
01603 "Online Mode = INT : 1",\
01604 "Run number = INT : 0",\
01605 "Transition in progress = INT : 0",\
01606 "Requested transition = INT : 0",\
01607 "Start time = STRING : [32] Tue Sep 09 15:04:42 1997",\
01608 "Start time binary = DWORD : 0",\
01609 "Stop time = STRING : [32] Tue Sep 09 15:04:42 1997",\
01610 "Stop time binary = DWORD : 0",\
01611 "",\
01612 NULL }
01613 /**dox***************************************************************/
01614 /** @} */ /* end of mhistory */
01615 
01616 /*---- Alarm system ------------------------------------------------*/
01617 /**dox***************************************************************/
01618 /** @defgroup malarmh Alarm related
01619  * Alarm structre. 
01620  *  @{  */
01621 
01622 /********************************************************************/
01623 /**
01624 Program information structure */
01625 typedef struct {
01626    BOOL required;
01627    INT watchdog_timeout;
01628    DWORD check_interval;
01629    char start_command[256];
01630    BOOL auto_start;
01631    BOOL auto_stop;
01632    BOOL auto_restart;
01633    char alarm_class[32];
01634    DWORD first_failed;
01635 } PROGRAM_INFO;
01636 
01637 #define AT_INTERNAL   1 /**< - */
01638 #define AT_PROGRAM    2 /**< - */
01639 #define AT_EVALUATED  3 /**< - */
01640 #define AT_PERIODIC   4 /**< - */
01641 #define AT_LAST       4 /**< - */
01642 
01643 #define PROGRAM_INFO_STR(_name) char *_name[] = {\
01644 "[.]",\
01645 "Required = BOOL : n",\
01646 "Watchdog timeout = INT : 10000",\
01647 "Check interval = DWORD : 180000",\
01648 "Start command = STRING : [256] ",\
01649 "Auto start = BOOL : n",\
01650 "Auto stop = BOOL : n",\
01651 "Auto restart = BOOL : n",\
01652 "Alarm class = STRING : [32] ",\
01653 "First failed = DWORD : 0",\
01654 "",\
01655 NULL }
01656 
01657 /**
01658 Alarm class structure */
01659 typedef struct {
01660    BOOL write_system_message;
01661    BOOL write_elog_message;
01662    INT system_message_interval;
01663    DWORD system_message_last;
01664    char execute_command[256];
01665    INT execute_interval;
01666    DWORD execute_last;
01667    BOOL stop_run;
01668    char display_bgcolor[32];
01669    char display_fgcolor[32];
01670 } ALARM_CLASS;
01671 
01672 #define ALARM_CLASS_STR(_name) char *_name[] = {\
01673 "[.]",\
01674 "Write system message = BOOL : y",\
01675 "Write Elog message = BOOL : n",\
01676 "System message interval = INT : 60",\
01677 "System message last = DWORD : 0",\
01678 "Execute command = STRING : [256] ",\
01679 "Execute interval = INT : 0",\
01680 "Execute last = DWORD : 0",\
01681 "Stop run = BOOL : n",\
01682 "Display BGColor = STRING : [32] red",\
01683 "Display FGColor = STRING : [32] black",\
01684 "",\
01685 NULL }
01686 
01687 /**
01688 Alarm structure */
01689 typedef struct {
01690    BOOL active;
01691    INT triggered;
01692    INT type;
01693    INT check_interval;
01694    DWORD checked_last;
01695    char time_triggered_first[32];
01696    char time_triggered_last[32];
01697    char condition[256];
01698    char alarm_class[32];
01699    char alarm_message[80];
01700 } ALARM;
01701 
01702 #define ALARM_ODB_STR(_name) char *_name[] = {\
01703 "[.]",\
01704 "Active = BOOL : n",\
01705 "Triggered = INT : 0",\
01706 "Type = INT : 3",\
01707 "Check interval = INT : 60",\
01708 "Checked last = DWORD : 0",\
01709 "Time triggered first = STRING : [32] ",\
01710 "Time triggered last = STRING : [32] ",\
01711 "Condition = STRING : [256] /Runinfo/Run number > 100",\
01712 "Alarm Class = STRING : [32] Alarm",\
01713 "Alarm Message = STRING : [80] Run number became too large",\
01714 "",\
01715 NULL }
01716 
01717 #define ALARM_PERIODIC_STR(_name) char *_name[] = {\
01718 "[.]",\
01719 "Active = BOOL : n",\
01720 "Triggered = INT : 0",\
01721 "Type = INT : 4",\
01722 "Check interval = INT : 28800",\
01723 "Checked last = DWORD : 0",\
01724 "Time triggered first = STRING : [32] ",\
01725 "Time triggered last = STRING : [32] ",\
01726 "Condition = STRING : [256] ",\
01727 "Alarm Class = STRING : [32] Warning",\
01728 "Alarm Message = STRING : [80] Please do your shift checks",\
01729 "",\
01730 NULL }
01731 
01732 /**dox***************************************************************/
01733 /** @} */ /* end of malarmh */
01734 
01735 /**dox***************************************************************/
01736 #ifndef DOXYGEN_SHOULD_SKIP_THIS
01737 
01738 /*---- malloc/free routines for debugging --------------------------*/
01739 
01740 #ifdef _MEM_DBG
01741 #define M_MALLOC(x)   dbg_malloc((x), __FILE__, __LINE__)
01742 #define M_CALLOC(x,y) dbg_calloc((x), (y), __FILE__, __LINE__)
01743 #define M_FREE(x)     dbg_free  ((x), __FILE__, __LINE__)
01744 #else
01745 #define M_MALLOC(x) malloc(x)
01746 #define M_CALLOC(x,y) calloc(x,y)
01747 #define M_FREE(x) free(x)
01748 #endif
01749 
01750 void *dbg_malloc(unsigned int size, char *file, int line);
01751 void *dbg_calloc(unsigned int size, unsigned int count, char *file, int line);
01752 void dbg_free(void *adr, char *file, int line);
01753 
01754 /*---- CERN libray -------------------------------------------------*/
01755 
01756 #ifdef extname
01757 #define PAWC_NAME pawc_
01758 #else
01759 #define PAWC_NAME PAWC
01760 #endif
01761 
01762 #define PAWC_DEFINE(size) \
01763 INT PAWC_NAME[size/4];    \
01764 INT pawc_size = size
01765 
01766 /* bug in ROOT include files */
01767 #undef GetCurrentTime
01768 
01769 /*---- RPC ---------------------------------------------------------*/
01770 
01771 /**
01772 flags */
01773 #define RPC_IN       (1 << 0)
01774 #define RPC_OUT      (1 << 1)
01775 #define RPC_POINTER  (1 << 2)
01776 #define RPC_FIXARRAY (1 << 3)
01777 #define RPC_VARARRAY (1 << 4)
01778 #define RPC_OUTGOING (1 << 5)
01779 
01780 /**
01781 Server types */
01782 #define ST_NONE            0
01783 #define ST_SINGLE          1
01784 #define ST_MTHREAD         2
01785 #define ST_MPROCESS        3
01786 #define ST_SUBPROCESS      4
01787 #define ST_REMOTE          5
01788 
01789 /**
01790 function list */
01791 typedef struct {
01792    WORD tid;
01793    WORD flags;
01794    INT n;
01795 } RPC_PARAM;
01796 
01797 typedef struct {
01798    INT id;
01799    char *name;
01800    RPC_PARAM param[20];
01801     INT(*dispatch) (INT, void **);
01802 } RPC_LIST;
01803 
01804 /**
01805 IDs allow for users */
01806 #define RPC_MIN_ID    1
01807 #define RPC_MAX_ID 9999
01808 
01809 /**
01810 Data conversion flags */
01811 #define CF_ENDIAN          (1<<0)
01812 #define CF_IEEE2VAX        (1<<1)
01813 #define CF_VAX2IEEE        (1<<2)
01814 #define CF_ASCII           (1<<3)
01815 
01816 #define CBYTE(_i)        (* ((BYTE *)       prpc_param[_i]))
01817 #define CPBYTE(_i)       (  ((BYTE *)       prpc_param[_i]))
01818 
01819 #define CSHORT(_i)       (* ((short *)      prpc_param[_i]))
01820 #define CPSHORT(_i)      (  ((short *)      prpc_param[_i]))
01821 
01822 #define CINT(_i)         (* ((INT *)        prpc_param[_i]))
01823 #define CPINT(_i)        (  ((INT *)        prpc_param[_i]))
01824 
01825 #define CWORD(_i)        (* ((WORD *)       prpc_param[_i]))
01826 #define CPWORD(_i)       (  ((WORD *)       prpc_param[_i]))
01827 
01828 #define CLONG(_i)        (* ((long *)       prpc_param[_i]))
01829 #define CPLONG(_i)       (  ((long *)       prpc_param[_i]))
01830 
01831 #define CDWORD(_i)       (* ((DWORD *)      prpc_param[_i]))
01832 #define CPDWORD(_i)      (  ((DWORD *)      prpc_param[_i]))
01833 
01834 #define CHNDLE(_i)       (* ((HNDLE *)      prpc_param[_i]))
01835 #define CPHNDLE(_i)      (  ((HNDLE *)      prpc_param[_i]))
01836 
01837 #define CBOOL(_i)        (* ((BOOL *)       prpc_param[_i]))
01838 #define CPBOOL(_i)       (  ((BOOL *)       prpc_param[_i]))
01839 
01840 #define CFLOAT(_i)       (* ((float *)      prpc_param[_i]))
01841 #define CPFLOAT(_i)      (  ((float *)      prpc_param[_i]))
01842 
01843 #define CDOUBLE(_i)      (* ((double *)     prpc_param[_i]))
01844 #define CPDOUBLE(_i)     (  ((double *)     prpc_param[_i]))
01845 
01846 #define CSTRING(_i)      (  ((char *)       prpc_param[_i]))
01847 #define CARRAY(_i)       (  ((void *)       prpc_param[_i]))
01848 
01849 #define CBYTE(_i)        (* ((BYTE *)       prpc_param[_i]))
01850 #define CPBYTE(_i)       (  ((BYTE *)       prpc_param[_i]))
01851 
01852 #define CSHORT(_i)       (* ((short *)      prpc_param[_i]))
01853 #define CPSHORT(_i)      (  ((short *)      prpc_param[_i]))
01854 
01855 #define CINT(_i)         (* ((INT *)        prpc_param[_i]))
01856 #define CPINT(_i)        (  ((INT *)        prpc_param[_i]))
01857 
01858 #define CWORD(_i)        (* ((WORD *)       prpc_param[_i]))
01859 #define CPWORD(_i)       (  ((WORD *)       prpc_param[_i]))
01860 
01861 #define CLONG(_i)        (* ((long *)       prpc_param[_i]))
01862 #define CPLONG(_i)       (  ((long *)       prpc_param[_i]))
01863 
01864 #define CDWORD(_i)       (* ((DWORD *)      prpc_param[_i]))
01865 #define CPDWORD(_i)      (  ((DWORD *)      prpc_param[_i]))
01866 
01867 #define CHNDLE(_i)       (* ((HNDLE *)      prpc_param[_i]))
01868 #define CPHNDLE(_i)      (  ((HNDLE *)      prpc_param[_i]))
01869 
01870 #define CBOOL(_i)        (* ((BOOL *)       prpc_param[_i]))
01871 #define CPBOOL(_i)       (  ((BOOL *)       prpc_param[_i]))
01872 
01873 #define CFLOAT(_i)       (* ((float *)      prpc_param[_i]))
01874 #define CPFLOAT(_i)      (  ((float *)      prpc_param[_i]))
01875 
01876 #define CDOUBLE(_i)      (* ((double *)     prpc_param[_i]))
01877 #define CPDOUBLE(_i)     (  ((double *)     prpc_param[_i]))
01878 
01879 #define CSTRING(_i)      (  ((char *)       prpc_param[_i]))
01880 #define CARRAY(_i)       (  ((void *)       prpc_param[_i]))
01881 
01882 
01883 
01884 #define cBYTE            (* ((BYTE *)       prpc_param[--n_param]))
01885 #define cPBYTE           (  ((BYTE *)       prpc_param[--n_param]))
01886 
01887 #define cSHORT           (* ((short *)      prpc_param[--n_param]))
01888 #define cPSHORT          (  ((short *)      prpc_param[--n_param]))
01889 
01890 #define cINT             (* ((INT *)        prpc_param[--n_param]))
01891 #define cPINT            (  ((INT *)        prpc_param[--n_param]))
01892 
01893 #define cWORD            (* ((WORD *)       prpc_param[--n_param]))
01894 #define cPWORD           (  ((WORD *)       prpc_param[--n_param]))
01895 
01896 #define cLONG            (* ((long *)       prpc_param[--n_param]))
01897 #define cPLONG           (  ((long *)       prpc_param[--n_param]))
01898 
01899 #define cDWORD           (* ((DWORD *)      prpc_param[--n_param]))
01900 #define cPDWORD          (  ((DWORD *)      prpc_param[--n_param]))
01901 
01902 #define cHNDLE           (* ((HNDLE *)      prpc_param[--n_param]))
01903 #define cPHNDLE          (  ((HNDLE *)      prpc_param[--n_param]))
01904 
01905 #define cBOOL            (* ((BOOL *)       prpc_param[--n_param]))
01906 #define cPBOOL           (  ((BOOL *)       prpc_param[--n_param]))
01907 
01908 #define cFLOAT           (* ((float *)      prpc_param[--n_param]))
01909 #define cPFLOAT          (  ((float *)      prpc_param[--n_param]))
01910 
01911 #define cDOUBLE          (* ((double *)     prpc_param[--n_param]))
01912 #define cPDOUBLE         (  ((double *)     prpc_param[--n_param]))
01913 
01914 #define cSTRING          (  ((char *)       prpc_param[--n_param]))
01915 #define cARRAY           (  ((void *)       prpc_param[--n_param]))
01916 
01917 /*---- Function declarations ---------------------------------------*/
01918 
01919 /* make functions callable from a C++ program */
01920 #ifdef __cplusplus
01921 extern "C" {
01922 #endif
01923 
01924 /* make functions under WinNT dll exportable */
01925 #if defined(OS_WINNT) && defined(MIDAS_DLL)
01926 #define EXPRT __declspec(dllexport)
01927 #else
01928 #define EXPRT
01929 #endif
01930 
01931    /*---- common routines ----*/
01932    INT EXPRT cm_get_error(INT code, char *string);
01933    char EXPRT *cm_get_version(void);
01934    INT EXPRT cm_get_environment(char *host_name, int host_name_size,
01935                                 char *exp_name, int exp_name_size);
01936    INT EXPRT cm_list_experiments(char *host_name,
01937                                  char exp_name[MAX_EXPERIMENT][NAME_LENGTH]);
01938    INT EXPRT cm_select_experiment(char *host_name, char *exp_name);
01939    INT EXPRT cm_connect_experiment(char *host_name, char *exp_name,
01940                                    char *client_name, void (*func) (char *));
01941    INT EXPRT cm_connect_experiment1(char *host_name, char *exp_name,
01942                                     char *client_name,
01943                                     void (*func) (char *), INT odb_size,
01944                                     DWORD watchdog_timeout);
01945    INT EXPRT cm_disconnect_experiment(void);
01946    INT EXPRT cm_register_transition(INT transition, INT(*func) (INT, char *), int sequence_number);
01947    INT EXPRT cm_set_transition_sequence(INT transition, INT sequence_number);
01948    INT EXPRT cm_query_transition(int *transition, int *run_number, int *trans_time);
01949    INT EXPRT cm_register_deferred_transition(INT transition, BOOL(*func) (INT, BOOL));
01950    INT EXPRT cm_check_deferred_transition(void);
01951    INT EXPRT cm_transition(INT transition, INT run_number, char *error,
01952                            INT strsize, INT async_flag, INT debug_flag);
01953    INT EXPRT cm_register_server(void);
01954    INT EXPRT cm_register_function(INT id, INT(*func) (INT, void **));
01955    INT EXPRT cm_connect_client(char *client_name, HNDLE * hConn);
01956    INT EXPRT cm_disconnect_client(HNDLE hConn, BOOL bShutdown);
01957    INT EXPRT cm_set_experiment_database(HNDLE hDB, HNDLE hKeyClient);
01958    INT EXPRT cm_get_experiment_database(HNDLE * hDB, HNDLE * hKeyClient);
01959    INT EXPRT cm_set_experiment_mutex(INT mutex_alarm, INT mutex_elog);
01960    INT EXPRT cm_get_experiment_mutex(INT * mutex_alarm, INT * mutex_elog);
01961    INT EXPRT cm_set_client_info(HNDLE hDB, HNDLE * hKeyClient,
01962                                 char *host_name, char *client_name,
01963                                 INT computer_id, char *password, DWORD watchdog_timeout);
01964    INT EXPRT cm_get_client_info(char *client_name);
01965    INT EXPRT cm_set_watchdog_params(BOOL call_watchdog, DWORD timeout);
01966    INT EXPRT cm_get_watchdog_params(BOOL * call_watchdog, DWORD * timeout);
01967    INT EXPRT cm_get_watchdog_info(HNDLE hDB, char *client_name,
01968                                   DWORD * timeout, DWORD * last);
01969    INT EXPRT cm_enable_watchdog(BOOL flag);
01970    void EXPRT cm_watchdog(int);
01971    INT EXPRT cm_shutdown(char *name, BOOL bUnique);
01972    INT EXPRT cm_exist(char *name, BOOL bUnique);
01973    INT EXPRT cm_cleanup(char *client_name, BOOL ignore_timeout);
01974    INT EXPRT cm_yield(INT millisec);
01975    INT EXPRT cm_execute(char *command, char *result, INT buf_size);
01976    INT EXPRT cm_synchronize(DWORD * sec);
01977    INT EXPRT cm_asctime(char *str, INT buf_size);
01978    INT EXPRT cm_time(DWORD * time);
01979    BOOL EXPRT cm_is_ctrlc_pressed();
01980    void EXPRT cm_ack_ctrlc_pressed();
01981 
01982    INT EXPRT cm_set_msg_print(INT system_mask, INT user_mask, int (*func) (const char *));
01983    INT EXPRT cm_msg(INT message_type, char *filename, INT line,
01984                     const char *routine, const char *format, ...);
01985    INT EXPRT cm_msg1(INT message_type, char *filename, INT line,
01986                      const char *facility, const char *routine, const char *format, ...);
01987    INT EXPRT cm_msg_register(void (*func)
01988                               (HNDLE, HNDLE, EVENT_HEADER *, void *));
01989    INT EXPRT cm_msg_retrieve(INT n_message, char *message, INT * buf_size);
01990 
01991    BOOL EXPRT equal_ustring(char *str1, char *str2);
01992 #ifndef HAVE_STRLCPY
01993    INT EXPRT strlcpy(char *dst, const char *src, INT size);
01994    INT EXPRT strlcat(char *dst, const char *src, INT size);
01995 #endif
01996 
01997    /*---- buffer manager ----*/
01998    INT EXPRT bm_open_buffer(char *buffer_name, INT buffer_size, INT * buffer_handle);
01999    INT EXPRT bm_close_buffer(INT buffer_handle);
02000    INT EXPRT bm_close_all_buffers(void);
02001    INT EXPRT bm_init_buffer_counters(INT buffer_handle);
02002    INT EXPRT bm_get_buffer_info(INT buffer_handle, BUFFER_HEADER * buffer_header);
02003    INT EXPRT bm_get_buffer_level(INT buffer_handle, INT * n_bytes);
02004    INT EXPRT bm_set_cache_size(INT buffer_handle, INT read_size, INT write_size);
02005    INT EXPRT bm_compose_event(EVENT_HEADER * event_header,
02006                               short int event_id, short int trigger_mask,
02007                               DWORD size, DWORD serial);
02008    INT EXPRT bm_request_event(INT buffer_handle, short int event_id,
02009                               short int trigger_mask, INT sampling_type,
02010                               INT * request_id, void (*func) (HNDLE, HNDLE,
02011                                                               EVENT_HEADER *, void *));
02012    INT EXPRT bm_add_event_request(INT buffer_handle, short int event_id,
02013                                   short int trigger_mask,
02014                                   INT sampling_type, void (*func) (HNDLE,
02015                                                                    HNDLE,
02016                                                                    EVENT_HEADER
02017                                                                    *,
02018                                                                    void *),
02019                                   INT request_id);
02020    INT EXPRT bm_delete_request(INT request_id);
02021    INT EXPRT bm_send_event(INT buffer_handle, void *event, INT buf_size, INT async_flag);
02022    INT EXPRT bm_receive_event(INT buffer_handle, void *destination,
02023                               INT * buf_size, INT async_flag);
02024    INT EXPRT bm_skip_event(INT buffer_handle);
02025    INT EXPRT bm_flush_cache(INT buffer_handle, INT async_flag);
02026    INT EXPRT bm_poll_event(INT flag);
02027    INT EXPRT bm_empty_buffers(void);
02028 
02029    /*---- online database functions -----*/
02030    INT EXPRT db_open_database(char *database_name, INT database_size,
02031                               HNDLE * hdb, char *client_name);
02032    INT EXPRT db_close_database(HNDLE database_handle);
02033    INT EXPRT db_close_all_databases(void);
02034    INT EXPRT db_protect_database(HNDLE database_handle);
02035 
02036    INT EXPRT db_create_key(HNDLE hdb, HNDLE key_handle, char *key_name, DWORD type);
02037    INT EXPRT db_create_link(HNDLE hdb, HNDLE key_handle, char *link_name,
02038                             char *destination);
02039    INT EXPRT db_set_value(HNDLE hdb, HNDLE hKeyRoot, char *key_name,
02040                           void *data, INT size, INT num_values, DWORD type);
02041    INT EXPRT db_get_value(HNDLE hdb, HNDLE hKeyRoot, char *key_name,
02042                           void *data, INT * size, DWORD type, BOOL create);
02043    INT EXPRT db_find_key(HNDLE hdb, HNDLE hkey, char *name, HNDLE * hsubkey);
02044    INT EXPRT db_find_link(HNDLE hDB, HNDLE hKey, char *key_name, HNDLE * subhKey);
02045    INT EXPRT db_find_key1(HNDLE hdb, HNDLE hkey, char *name, HNDLE * hsubkey);
02046    INT EXPRT db_find_link1(HNDLE hDB, HNDLE hKey, char *key_name, HNDLE * subhKey);
02047    INT EXPRT db_scan_tree(HNDLE hDB, HNDLE hKey, int level,
02048                           INT(*callback) (HNDLE, HNDLE, KEY *, INT, void *), void *info);
02049    INT EXPRT db_scan_tree_link(HNDLE hDB, HNDLE hKey, int level,
02050                                void (*callback) (HNDLE, HNDLE, KEY *, INT,
02051                                                  void *), void *info);
02052    INT EXPRT db_get_path(HNDLE hDB, HNDLE hKey, char *path, INT buf_size);
02053    INT EXPRT db_delete_key(HNDLE database_handle, HNDLE key_handle, BOOL follow_links);
02054    INT EXPRT db_enum_key(HNDLE hdb, HNDLE key_handle, INT index, HNDLE * subkey_handle);
02055    INT EXPRT db_enum_link(HNDLE hdb, HNDLE key_handle, INT index, HNDLE * subkey_handle);
02056    INT EXPRT db_get_next_link(HNDLE hdb, HNDLE key_handle, HNDLE * subkey_handle);
02057    INT EXPRT db_get_key(HNDLE hdb, HNDLE key_handle, KEY * key);
02058    INT EXPRT db_get_key_info(HNDLE hDB, HNDLE hKey, char *name,
02059                              INT name_size, INT * type, INT * num_values,
02060                              INT * item_size);
02061    INT EXPRT db_get_key_time(HNDLE hdb, HNDLE key_handle, DWORD * delta);
02062    INT EXPRT db_rename_key(HNDLE hDB, HNDLE hKey, char *name);
02063    INT EXPRT db_reorder_key(HNDLE hDB, HNDLE hKey, INT index);
02064    INT EXPRT db_get_data(HNDLE hdb, HNDLE key_handle, void *data,
02065                          INT * buf_size, DWORD type);
02066    INT EXPRT db_get_data1(HNDLE hDB, HNDLE hKey, void *data,
02067                           INT * buf_size, DWORD type, INT * num_values);
02068    INT EXPRT db_get_data_index(HNDLE hDB, HNDLE hKey, void *data,
02069                                INT * buf_size, INT index, DWORD type);
02070    INT EXPRT db_set_data(HNDLE hdb, HNDLE hKey, void *data, INT buf_size,
02071                          INT num_values, DWORD type);
02072    INT EXPRT db_set_data_index(HNDLE hDB, HNDLE hKey, void *data, INT size,
02073                                INT index, DWORD type);
02074    INT EXPRT db_set_data_index2(HNDLE hDB, HNDLE hKey, void *data,
02075                                 INT size, INT index, DWORD type, BOOL bNotify);
02076    INT EXPRT db_set_num_values(HNDLE hDB, HNDLE hKey, INT num_values);
02077    INT EXPRT db_merge_data(HNDLE hDB, HNDLE hKeyRoot, char *name,
02078                            void *data, INT data_size, INT num_values, INT type);
02079    INT EXPRT db_set_mode(HNDLE hdb, HNDLE key_handle, WORD mode, BOOL recurse);
02080    INT EXPRT db_create_record(HNDLE hdb, HNDLE hkey, char *name, char *init_str);
02081    INT EXPRT db_check_record(HNDLE hDB, HNDLE hKey, char *key_name,
02082                              char *rec_str, BOOL correct);
02083    INT EXPRT db_open_record(HNDLE hdb, HNDLE hkey, void *ptr, INT rec_size,
02084                             WORD access, void (*dispatcher) (INT, INT,
02085                                                              void *), void *info);
02086    INT EXPRT db_close_record(HNDLE hdb, HNDLE hkey);
02087    INT EXPRT db_get_record(HNDLE hdb, HNDLE hKey, void *data, INT * buf_size, INT align);
02088    INT EXPRT db_get_record_size(HNDLE hdb, HNDLE hKey, INT align, INT * buf_size);
02089    INT EXPRT db_set_record(HNDLE hdb, HNDLE hKey, void *data, INT buf_size, INT align);
02090    INT EXPRT db_send_changed_records(void);
02091    INT EXPRT db_get_open_records(HNDLE hDB, HNDLE hKey, char *str,
02092                                  INT buf_size, BOOL fix);
02093 
02094    INT EXPRT db_add_open_record(HNDLE hDB, HNDLE hKey, WORD access_mode);
02095    INT EXPRT db_remove_open_record(HNDLE hDB, HNDLE hKey, BOOL lock);
02096 
02097    INT EXPRT db_load(HNDLE hdb, HNDLE key_handle, char *filename, BOOL bRemote);
02098    INT EXPRT db_save(HNDLE hdb, HNDLE key_handle, char *filename, BOOL bRemote);
02099    INT EXPRT db_copy(HNDLE hDB, HNDLE hKey, char *buffer, INT * buffer_size, char *path);
02100    INT EXPRT db_paste(HNDLE hDB, HNDLE hKeyRoot, char *buffer);
02101    INT EXPRT db_save_struct(HNDLE hDB, HNDLE hKey, char *file_name,
02102                             char *struct_name, BOOL append);
02103    INT EXPRT db_save_string(HNDLE hDB, HNDLE hKey, char *file_name,
02104                             char *string_name, BOOL append);
02105    INT EXPRT db_save_xml(HNDLE hDB, HNDLE hKey, char *file_name);
02106 
02107    INT EXPRT db_sprintf(char *string, void *data, INT data_size, INT index, DWORD type);
02108    INT EXPRT db_sprintfh(char *string, void *data, INT data_size, INT index, DWORD type);
02109    INT EXPRT db_sscanf(char *string, void *data, INT * data_size, INT index, DWORD type);
02110    char EXPRT *strcomb(char **list);
02111 
02112    /*---- Bank routines ----*/
02113    void EXPRT bk_init(void *pbh);
02114    void EXPRT bk_init32(void *event);
02115    BOOL EXPRT bk_is32(void *event);
02116    INT EXPRT bk_size(void *pbh);
02117    void EXPRT bk_create(void *pbh, const char *name, WORD type, void *pdata);
02118    INT EXPRT bk_delete(void *event, const char *name);
02119    INT EXPRT bk_close(void *pbh, void *pdata);
02120    INT EXPRT bk_list(void *pbh, char *bklist);
02121    INT EXPRT bk_locate(void *pbh, const char *name, void *pdata);
02122    INT EXPRT bk_iterate(void *pbh, BANK ** pbk, void *pdata);
02123    INT EXPRT bk_iterate32(void *pbh, BANK32 ** pbk, void *pdata);
02124    INT EXPRT bk_swap(void *event, BOOL force);
02125    INT EXPRT bk_find(BANK_HEADER * pbkh, const char *name, DWORD * bklen,
02126                      DWORD * bktype, void **pdata);
02127 
02128    /*---- RPC routines ----*/
02129    INT EXPRT rpc_register_functions(RPC_LIST * new_list, INT(*func) (INT, void **));
02130    INT EXPRT rpc_register_function(INT id, INT(*func) (INT, void **));
02131    INT EXPRT rpc_get_option(HNDLE hConn, INT item);
02132    INT EXPRT rpc_set_option(HNDLE hConn, INT item, INT value);
02133    INT EXPRT rpc_set_name(char *name);
02134    INT EXPRT rpc_get_name(char *name);
02135    INT EXPRT rpc_is_remote(void);
02136    INT EXPRT rpc_set_debug(void (*func) (char *), INT mode);
02137    void EXPRT rpc_debug_printf(char *format, ...);
02138 
02139    INT EXPRT rpc_register_server(INT server_type, char *name, INT * port,
02140                                  INT(*func) (INT, void **));
02141    INT EXPRT rpc_register_client(char *name, RPC_LIST * list);
02142    INT EXPRT rpc_server_thread(void *pointer);
02143    INT EXPRT rpc_server_shutdown(void);
02144    INT EXPRT rpc_client_call(HNDLE hConn, const INT routine_id, ...);
02145    INT EXPRT rpc_call(const INT routine_id, ...);
02146    INT EXPRT rpc_tid_size(INT id);
02147    char EXPRT *rpc_tid_name(INT id);
02148    INT EXPRT rpc_server_connect(char *host_name, char *exp_name);
02149    INT EXPRT rpc_client_connect(char *host_name, INT midas_port,
02150                                 char *client_name, HNDLE * hConnection);
02151    INT EXPRT rpc_client_disconnect(HNDLE hConn, BOOL bShutdown);
02152 
02153    INT EXPRT rpc_send_event(INT buffer_handle, void *source, INT buf_size,
02154                             INT async_flag);
02155    INT EXPRT rpc_flush_event(void);
02156 
02157    void EXPRT rpc_get_convert_flags(INT * convert_flags);
02158    void EXPRT rpc_convert_single(void *data, INT tid, INT flags, INT convert_flags);
02159    void EXPRT rpc_convert_data(void *data, INT tid, INT flags, INT size,
02160                                INT convert_flags);
02161 
02162    /*---- system services ----*/
02163    DWORD EXPRT ss_millitime(void);
02164    DWORD EXPRT ss_time(void);
02165    DWORD EXPRT ss_settime(DWORD seconds);
02166    char EXPRT *ss_asctime(void);
02167    INT EXPRT ss_sleep(INT millisec);
02168    BOOL EXPRT ss_kbhit(void);
02169 
02170    double EXPRT ss_nan(void);
02171    int ss_isnan(double x);
02172 
02173    void EXPRT ss_clear_screen(void);
02174    void EXPRT ss_printf(INT x, INT y, const char *format, ...);
02175    void ss_set_screen_size(int x, int y);
02176 
02177    char EXPRT *ss_getpass(char *prompt);
02178    INT EXPRT ss_getchar(BOOL reset);
02179    char EXPRT *ss_crypt(char *key, char *salt);
02180    char EXPRT *ss_gets(char *string, int size);
02181 
02182    void EXPRT *ss_ctrlc_handler(void (*func) (int));
02183 
02184    /*---- direct io routines ----*/
02185    INT EXPRT ss_directio_give_port(INT start, INT end);
02186    INT EXPRT ss_directio_lock_port(INT start, INT end);
02187 
02188    /*---- tape routines ----*/
02189    INT EXPRT ss_tape_open(char *path, INT oflag, INT * channel);
02190    INT EXPRT ss_tape_close(INT channel);
02191    INT EXPRT ss_tape_status(char *path);
02192    INT EXPRT ss_tape_read(INT channel, void *pdata, INT * count);
02193    INT EXPRT ss_tape_write(INT channel, void *pdata, INT count);
02194    INT EXPRT ss_tape_write_eof(INT channel);
02195    INT EXPRT ss_tape_fskip(INT channel, INT count);
02196    INT EXPRT ss_tape_rskip(INT channel, INT count);
02197    INT EXPRT ss_tape_rewind(INT channel);
02198    INT EXPRT ss_tape_spool(INT channel);
02199    INT EXPRT ss_tape_mount(INT channel);
02200    INT EXPRT ss_tape_unmount(INT channel);
02201    INT EXPRT ss_tape_get_blockn(INT channel);
02202 
02203    /*---- disk routines ----*/
02204    double EXPRT ss_disk_free(char *path);
02205    double EXPRT ss_file_size(char *path);
02206    INT EXPRT ss_file_remove(char *path);
02207    INT EXPRT ss_file_find(char *path, char *pattern, char **plist);
02208    double EXPRT ss_disk_size(char *path);
02209 
02210    /*---- history routines ----*/
02211    INT EXPRT hs_set_path(char *path);
02212    INT EXPRT hs_define_event(DWORD event_id, char *name, TAG * tag, DWORD size);
02213    INT EXPRT hs_write_event(DWORD event_id, void *data, DWORD size);
02214    INT EXPRT hs_count_events(DWORD ltime, DWORD * count);
02215    INT EXPRT hs_enum_events(DWORD ltime, char *event_name,
02216                             DWORD * name_size, INT event_id[], DWORD * id_size);
02217    INT EXPRT hs_count_vars(DWORD ltime, DWORD event_id, DWORD * count);
02218    INT EXPRT hs_enum_vars(DWORD ltime, DWORD event_id, char *var_name,
02219                           DWORD * size, DWORD * var_n, DWORD * n_size);
02220    INT EXPRT hs_get_var(DWORD ltime, DWORD event_id, char *var_name,
02221                         DWORD * type, INT * n_data);
02222    INT EXPRT hs_get_event_id(DWORD ltime, char *name, DWORD * id);
02223    INT EXPRT hs_read(DWORD event_id, DWORD start_time, DWORD end_time,
02224                      DWORD interval, char *tag_name, DWORD var_index,
02225                      DWORD * time_buffer, DWORD * tbsize,
02226                      void *data_buffer, DWORD * dbsize, DWORD * type, DWORD * n);
02227    INT EXPRT hs_dump(DWORD event_id, DWORD start_time, DWORD end_time,
02228                      DWORD interval, BOOL binary_time);
02229    INT EXPRT hs_fdump(char *file_name, DWORD id, BOOL binary_time);
02230 
02231    /*---- ELog functions ----*/
02232    INT EXPRT el_retrieve(char *tag, char *date, int *run, char *author,
02233                          char *type, char *system, char *subject,
02234                          char *text, int *textsize, char *orig_tag,
02235                          char *reply_tag, char *attachment1,
02236                          char *attachment2, char *attachment3, char *encoding);
02237    INT EXPRT el_submit(int run, char *author, char *type, char *system,
02238                        char *subject, char *text, char *reply_to,
02239                        char *encoding, char *afilename1, char *buffer1,
02240                        INT buffer_size1, char *afilename2, char *buffer2,
02241                        INT buffer_size2, char *afilename3, char *buffer3,
02242                        INT buffer_size3, char *tag, INT tag_size);
02243    INT EXPRT el_search_message(char *tag, int *fh, BOOL walk);
02244    INT EXPRT el_search_run(int run, char *return_tag);
02245    INT EXPRT el_delete_message(char *tag);
02246 
02247    /*---- alarm functions ----*/
02248    INT EXPRT al_check();
02249    INT EXPRT al_trigger_alarm(char *alarm_name, char *alarm_message,
02250                               char *default_class, char *cond_str, INT type);
02251    INT EXPRT al_trigger_class(char *alarm_class, char *alarm_message, BOOL first);
02252    INT EXPRT al_reset_alarm(char *alarm_name);
02253    BOOL EXPRT al_evaluate_condition(char *condition, char *value);
02254 
02255    /*---- frontend functions ----*/
02256    INT get_frontend_index();
02257 
02258    /*---- analyzer functions ----*/
02259    void EXPRT test_register(ANA_TEST * t);
02260    void EXPRT add_data_dir(char *result, char *file);
02261    void EXPRT lock_histo(INT id);
02262 
02263    void EXPRT open_subfolder(char *name);
02264    void EXPRT close_subfolder();
02265 #ifdef __cplusplus
02266 }
02267 
02268 #ifdef USE_ROOT
02269    /* root functions really are C++ functions */
02270    extern TFolder *gManaHistosFolder;
02271    extern TObjArray *gHistoFolderStack;
02272 
02273    // book functions put a root object in a suitable folder
02274    // for histos, there are a lot of types, so we use templates.
02275    // for other objects we have one function per object
02276    template<typename TH1X>
02277    TH1X EXPRT *h1_book(const char *name, const char *title,
02278                        int bins, double min, double max)
02279    {
02280       TH1X *hist;
02281 
02282       /* check if histo already exists */
02283       if (!gHistoFolderStack->Last())
02284          hist = (TH1X *) gManaHistosFolder->FindObjectAny(name);
02285       else
02286          hist = (TH1X *) ((TFolder *)gHistoFolderStack->Last())->FindObjectAny(name);
02287 
02288       if (hist == NULL) {
02289          hist = new TH1X(name, title, bins, min, max);
02290          if (!gHistoFolderStack->Last())
02291             gManaHistosFolder->Add(hist);
02292          else
02293             ((TFolder *)gHistoFolderStack->Last())->Add(hist);
02294       }
02295 
02296       return hist;
02297    }
02298 
02299    template<typename TH1X>
02300    TH1X EXPRT *h1_book(const char *name, const char *title,
02301                        int bins, double edges[])
02302    {
02303       TH1X *hist;
02304 
02305       /* check if histo already exists */
02306       if (!gHistoFolderStack->Last())
02307          hist = (TH1X *) gManaHistosFolder->FindObjectAny(name);
02308       else
02309          hist = (TH1X *) ((TFolder *)gHistoFolderStack->Last())->FindObjectAny(name);
02310 
02311       if (hist == NULL) {
02312          hist = new TH1X(name, title, bins, edges);
02313          if (!gHistoFolderStack->Last())
02314             gManaHistosFolder->Add(hist);
02315          else
02316             ((TFolder *)gHistoFolderStack->Last())->Add(hist);
02317       }
02318 
02319       return hist;
02320    }
02321 
02322    template<typename TH2X>
02323    TH2X EXPRT *h2_book(const char *name, const char *title,
02324                        int xbins, double xmin, double xmax,
02325                        int ybins, double ymin, double ymax)
02326    {
02327       TH2X *hist;
02328 
02329       /* check if histo already exists */
02330       if (!gHistoFolderStack->Last())
02331          hist = (TH2X *) gManaHistosFolder->FindObjectAny(name);
02332       else
02333          hist = (TH2X *) ((TFolder *)gHistoFolderStack->Last())->FindObjectAny(name);
02334 
02335       if (hist == NULL) {
02336          hist = new TH2X(name, title, xbins, xmin, xmax, ybins, ymin, ymax);
02337          if (!gHistoFolderStack->Last())
02338             gManaHistosFolder->Add(hist);
02339          else
02340             ((TFolder *)gHistoFolderStack->Last())->Add(hist);
02341       }
02342 
02343       return hist;
02344    }
02345 
02346    template<typename TH2X>
02347    TH2X EXPRT *h2_book(const char *name, const char *title,
02348                        int xbins, double xmin, double xmax,
02349                        int ybins, double yedges[])
02350    {
02351       TH2X *hist;
02352 
02353       /* check if histo already exists */
02354       if (!gHistoFolderStack->Last())
02355          hist = (TH2X *) gManaHistosFolder->FindObjectAny(name);
02356       else
02357          hist = (TH2X *) ((TFolder *)gHistoFolderStack->Last())->FindObjectAny(name);
02358 
02359       if (hist == NULL) {
02360          hist = new TH2X(name, title, xbins, xmin, xmax, ybins, yedges);
02361          if (!gHistoFolderStack->Last())
02362             gManaHistosFolder->Add(hist);
02363          else
02364             ((TFolder *)gHistoFolderStack->Last())->Add(hist);
02365       }
02366 
02367       return hist;
02368    }
02369 
02370    template<typename TH2X>
02371    TH2X EXPRT *h2_book(const char *name, const char *title,
02372                        int xbins, double xedges[],
02373                        int ybins, double ymin, double ymax)
02374    {
02375       TH2X *hist;
02376 
02377       /* check if histo already exists */
02378       if (!gHistoFolderStack->Last())
02379          hist = (TH2X *) gManaHistosFolder->FindObjectAny(name);
02380       else
02381          hist = (TH2X *) ((TFolder *)gHistoFolderStack->Last())->FindObjectAny(name);
02382 
02383       if (hist == NULL) {
02384          hist = new TH2X(name, title, xbins, xedges, ybins, ymin, ymax);
02385          if (!gHistoFolderStack->Last())
02386             gManaHistosFolder->Add(hist);
02387          else
02388             ((TFolder *)gHistoFolderStack->Last())->Add(hist);
02389       }
02390 
02391       return hist;
02392    }
02393 
02394    template<typename TH2X>
02395    TH2X EXPRT *h2_book(const char *name, const char *title,
02396                        int xbins, double xedges[],
02397                        int ybins, double yedges[])
02398    {
02399       TH2X *hist;
02400 
02401       /* check if histo already exists */
02402       if (!gHistoFolderStack->Last())
02403          hist = (TH2X *) gManaHistosFolder->FindObjectAny(name);
02404       else
02405          hist = (TH2X *) ((TFolder *)gHistoFolderStack->Last())->FindObjectAny(name);
02406 
02407       if (hist == NULL) {
02408          hist = new TH2X(name, title, xbins, xedges, ybins, yedges);
02409          if (!gHistoFolderStack->Last())
02410             gManaHistosFolder->Add(hist);
02411          else
02412             ((TFolder *)gHistoFolderStack->Last())->Add(hist);
02413       }
02414 
02415       return hist;
02416    }
02417 
02418    /*
02419     * the following two macros allow for simple fortran like usage
02420     * for the most common histo types
02421     */
02422    #define H1_BOOK(n,t,b,min,max) (h1_book<TH1F>(n,t,b,min,max))
02423    #define H2_BOOK(n,t,xb,xmin,xmax,yb,ymin,ymax) (h2_book<TH2F>(n,t,xb,xmin,xmax,yb,ymin,ymax))
02424 
02425    TCutG *cut_book( const char *name);
02426 #endif /* USE_ROOT */
02427 
02428 #endif
02429 #endif                          /* _MIDAS_H */
02430 /**dox***************************************************************/
02431 #endif                          /* DOXYGEN_SHOULD_SKIP_THIS */
02432 
02433 /**dox***************************************************************/
02434 /** @} */ /* end of midasincludecode */

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