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

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