Main Page | Modules | Namespace List | Class Hierarchy | Alphabetical List | Class List | Directories | File List | Namespace Members | Class Members | File Members | Related Pages

bogus_dcs.c

Go to the documentation of this file.
00001 
00002 #include <stdio.h>
00003 /* #include <getopt.h> seems to be part of <unistd.h> */
00004 #include <unistd.h>
00005 /* stdlib.h:  malloc and atoi */
00006 #include <stdlib.h>
00007 /* string.h: strrchr */
00008 #include <string.h>
00009 
00010 #include "OnlineUtil/msgLogLib/msgLog.h"
00011 #include "OnlineUtil/rototalk.h"
00012 
00013 /* timeval, gettimeofday */
00014 #include <time.h>
00015 #include <sys/time.h>
00016 
00017 #include "OnlineUtil/rawBlockIds.h"
00018 #include "OnlineUtil/rdChecksum.h"
00019 #include "OnlineUtil/rotoMessages.h"
00020 
00021 /* forward declarations */
00022 int send_bogus_stuff(long* buffer, int bsize, int mxrec);
00023 int parse_detector(const char* detname);
00024 int config_autosave(const char* config);
00025 int config_compress(const char* config);
00026 int config_basketsize(const char* config);
00027 long build_dcs_blockid(int detector, int major, int version);
00028 
00029 long* append_dcs_header_block(long* buffer, long* toofar);
00030 long* append_dcs_monitor_block(long* buffer, long* toofar);
00031 long* append_dcs_alarm_block(long* buffer, long* toofar);
00032 
00033 /* (default) maximum buffer size for raw records (in bytes) */
00034 #define MAXBUFFER 8388608
00035 
00036 /* globals */
00037 int gDetector = kMdBlockSourceFarDetector; /* 1=Near, 2=Far, 4=CalDet */
00038 
00039 /*
00040  *=========================================================================
00041  * main(int argc, char **argv)
00042  * 
00043  * Purpose:
00044  *    Generate and send a series of fake DCS records to the Rotorooter
00045  *
00046  *   usage: bogus_dcs -i<hostname> -b<buffer size> 
00047  *           -w<whoami> -p<port #> 
00048  *           -c"autosave_configstring" 
00049  *           -C"compress_configstring" 
00050  *           -B"basketsize_configstring" 
00051  *
00052  *     -i: hostname where rotorooter is running
00053  *     -b: buffer size to use
00054  *     -d: detector ("near","far","caldet")
00055  *     -c: autosave config    "streamName,nrec,nsec[;streamName,nrec,nsec]" 
00056  *     -C: compression config "streamName,level[;streamName,level]"
00057  *     -B: basketsize config "streamName,size[;streamName,size]"
00058  *            both -c,-C,-B use "*" as streamName to set all legal streams
00059  *     -w: DCP or DCS
00060  *     -p: port number rotorooter is listening on
00061  *     -v: how verbose to be
00062  *     -n: maximum number of records from each file
00063  *     -h: print this message
00064  *
00065  * Return Value:
00066  *    non-zero indicates there was an error
00067  *=========================================================================
00068  */
00069 int main(int argc, char **argv)
00070 {
00071 
00072    /* this is C ... all declarations must come first */
00073    const char* iphost = "localhost";
00074    const char* default_producer = "DCS";       /* default producer */
00075    const int   default_port     = 9012;        /* default DCS port */
00076    const char* producer = default_producer;
00077    const char* autosave_config = 0;
00078    const char* compress_config = 0;
00079    const char* basketsize_config = 0;
00080    int port = default_port;
00081    int whoami = MINOS_ROOTER_DCS;       
00082    int bsize = MAXBUFFER;
00083    long* buffer = 0;
00084    int nerr = 0;
00085    int mxrec = 1000;  /* no input file, so limit how much stuff to send */
00086    int nodelay_flag = 1;  /* on by default */
00087    int echoMsgLog = 0;
00088    int copt;
00089 
00090 
00091    /*
00092     * parse the options and filenames
00093     */
00094    while ((copt = getopt(argc, argv, "i:b:d:c:C:B:w:p:ev:n:D:h")) != EOF) {
00095       switch (copt) {
00096       case 'i':  /* internet host */
00097          iphost = optarg;
00098          break;
00099       case 'b':  /* buffer size */
00100          bsize = atoi(optarg);
00101          break;
00102       case 'd':  /* detector */
00103          gDetector = parse_detector(optarg);
00104          break;
00105       case 'c':  /* autosave config string */
00106          autosave_config = optarg;
00107          break;
00108       case 'C':  /* compression config string */
00109          compress_config = optarg;
00110          break;
00111       case 'B':  /* basketsize config string */
00112          basketsize_config = optarg;
00113          break;
00114       case 'w':  /* whoami:  DCP, DCS, other */
00115          producer = optarg;
00116          break;
00117       case 'p':  /* port # */
00118          port = atoi(optarg);
00119          break;
00120       case 'e':  /* msgLog messages to stdout as well */
00121          echoMsgLog = 1;
00122          break;
00123       case 'v':  /* verbosity */
00124          roto_verbose = atoi(optarg);
00125          break;
00126       case 'n':  /* maximum number of records */
00127          mxrec = atoi(optarg);
00128          break;
00129       case 'D':  /* set nodelay_flag? */
00130          nodelay_flag = atoi(optarg);
00131          break;
00132       case 'h':  /* help */
00133          printf(" usage: %s -i<hostname> -b<buffer size> -w<whoami> -p<port #> <filenames..>\n", argv[0]);
00134          printf("   -i: hostname where rotorooter is running\n");
00135          printf("   -b: buffer size to use\n");
00136          printf("   -d: detector ('near','far','caldet')\n");
00137          printf("   -w: DCP, DCS or BeamMon\n");
00138          printf("   -p: port number rotorooter is listening on\n");
00139          printf("   -v: how verbose to be\n");
00140          printf("   -c: autosave config \"streamName,nrec,nsec[;streamName,nrec,nsec]\"\n");
00141          printf("   -C: compression config \"streamName,level[;streamName,level]\"\n");
00142          printf("   -B: basketsize config \"streamName,size[;streamName,size]\"\n");
00143 
00144          printf("   -n: maximum number of records from each file\n");
00145 
00146          printf("   -h: print this message\n");
00147          exit(1);
00148       default:
00149          printf(" unrecognized option '%c' ignored\n",(char)optopt);
00150          break;
00151       }
00152    }
00153 
00154    msgLogInit(argv[0]);
00155    msgLogNodeIdSet(whoami);
00156    msgLogLocalEchoSet(echoMsgLog);
00157    logDebugLevelSet(3);
00158    logNotice("starting %s",argv[0]);
00159 
00160    /* allocate a buffer to use */
00161    buffer = (long*) malloc(bsize);
00162    if (!buffer) {
00163       printf("failed to allocate buffer of size %d\n",bsize);
00164       exit(1);
00165    }
00166    if (roto_verbose>1) printf("allocated buffer of size %d\n",bsize);
00167 
00168    /* open a connection to the Rotorooter */
00169    if (0 == strcmp(producer,default_producer) && 
00170        port == default_port) {
00171       /* standard connection */
00172       if (roto_verbose>1) 
00173          printf("connect via roto_open_DCP_connection\n");
00174       nerr += roto_open_DCS_connection(iphost);
00175    } else {
00176       /* non-standard connection requested (either producer or port) */
00177       if (0 == strcmp(producer,"DCP")) {
00178          whoami  = MINOS_ROOTER_DCP;
00179       }
00180       else if (0 == strcmp(producer,"DCS")) {
00181          whoami = MINOS_ROOTER_DCS;
00182       }
00183       else if (0 == strcmp(producer,"BeamMon")) {
00184          whoami = MINOS_ROOTER_BEAMMON;
00185       }
00186       else 
00187          whoami = MINOS_ROOTER_UNIDENTIFIED_CLIENT;
00188 
00189       if (roto_verbose>1) 
00190          printf("connect via roto_open_connection: port %d, whoami %s (0x%2.2x)\n",port,producer,whoami);
00191       nerr += roto_open_connection(iphost,port,whoami);
00192    }
00193    if (nerr) exit(nerr);
00194    
00195    nerr += roto_set_connection_nodelay(nodelay_flag);
00196 
00197    if (autosave_config) nerr += config_autosave(autosave_config);
00198    if (compress_config) nerr += config_compress(compress_config);
00199    if (basketsize_config) nerr += config_basketsize(basketsize_config);
00200 
00201    nerr += send_bogus_stuff(buffer,bsize,mxrec);
00202 
00203    /* close the connection */
00204    nerr += roto_close_connection();
00205 
00206    /* set my buffer free */
00207    free(buffer);
00208 
00209    logNotice("stopping %s",argv[0]);
00210    msgLogCleanup();
00211 
00212    exit(nerr);
00213 }
00214 
00215 /*
00216  *=========================================================================
00217  * send_bogus_stuff(long* buffer, int bsize, int mxrec) 
00218  * 
00219  * Purpose:
00220  *    Send a series of bogus DCS records to the rotorooter
00221  *
00222  * Arguments:
00223  *    buffer:  ptr to pre-allocated buffer
00224  *    bsize:   buffer size (bytes)
00225  *    mxrec:   maximum number of records to send (0=all)
00226  *
00227  * Return Value:
00228  *    non-zero indicates there was an error
00229  *=========================================================================
00230  */
00231 int send_bogus_stuff(long* buffer, int bsize, int mxrec) 
00232 {
00233 
00234    int   nRecords=0;
00235    int   nbytes;
00236 
00237    long* current;
00238    long* endofbuf = buffer + bsize/sizeof(long);
00239 
00240    int nerr = 0;
00241 
00242    struct timeval now;
00243    gettimeofday(&now,0);
00244 
00245    nerr += roto_open_dcsfile(gDetector,now.tv_sec,now.tv_usec*1000);
00246    if (nerr) {
00247       printf("Rotorooter failed to open output file\n");
00248       return 1;
00249    }
00250 
00251    while (1) {
00252       if (mxrec>0 && nRecords==mxrec) break;
00253       nRecords++;
00254 
00255       /* 
00256        * fill a new record 
00257        */
00258 
00259       current = buffer; /* start at beginning of allocated buffer */
00260 
00261       /* all records start with a header block */
00262       current = append_dcs_header_block(current,endofbuf);
00263 
00264       /* 
00265        * add additional blocks
00266        * each function decides whether there is something to add
00267        */
00268       current = append_dcs_alarm_block(current,endofbuf);
00269       current = append_dcs_monitor_block(current,endofbuf);
00270 
00271       /* 
00272        * send the record
00273        */
00274       nbytes = (current-buffer)*sizeof(long); /* calc used size */
00275       nerr += roto_send_record(buffer,nbytes);
00276 
00277       logDebug(5,"sent record %d of length %d bytes",nRecords,nbytes);
00278 
00279    }
00280 
00281    nerr += roto_close_dcsfile();
00282    return nerr;
00283 }
00284 
00285 /*
00286  *=========================================================================
00287  * parse_detector(const char* detname)
00288  * 
00289  * Purpose:
00290  *    Turn detector name into detector source.
00291  *
00292  * Arguments:
00293  *    detname:  detector name should be one of 'near','far',caldet'
00294  * 
00295  * Return Value:
00296  *    detector enum value
00297  *=========================================================================
00298  */
00299 int parse_detector(const char* detname)
00300 {
00301 
00302   switch (detname[0]) {
00303   case 'n':
00304   case 'N':
00305   case '1':
00306     return kMdBlockSourceNearDetector;
00307     break;
00308   case 'f':
00309   case 'F':
00310   case '2':
00311     return kMdBlockSourceFarDetector;
00312     break;
00313   case 'c':
00314   case 'C':
00315   case '4':
00316     return kMdBlockSourceCalDetector;
00317     break;
00318   default:
00319     logWarn("parse_detector: could not decipher '%s', using value %d",
00320             detname,gDetector);
00321     return gDetector;
00322   }
00323 }
00324 
00325 /*
00326  *=========================================================================
00327  * config_autosave(const char* config)
00328  * 
00329  * Purpose:
00330  *    Send autosave config to the rotorooter, parsed from string
00331  *
00332  * Arguments:
00333  *    config:  configuration string of form:
00334  *             "streamName,nrec,nsec[;streamName,nrec,nsec]"
00335  *             use "*" as streamName to set all legal streams
00336  * 
00337  * Return Value:
00338  *    non-zero indicates there was an error
00339  *=========================================================================
00340  */
00341 int config_autosave(const char* config)
00342 {
00343    int nerr = 0;
00344    int len = strlen(config);
00345    char *wcopy = (char*)malloc(len+1);  /* a writable copy of config string */
00346    char stream[1024];
00347    const char *p1;
00348    char *p2;
00349    char achar;
00350    int nrec,nsec, nitems;
00351 
00352    /* make a copy, replacing all the commas with blanks*/
00353    p1 = config; p2 = wcopy;
00354    while (p2 < wcopy+len) {
00355       achar = *p1;
00356       if (achar != ',') *p2 = achar;
00357       else              *p2 = ' ';
00358       p1++; p2++;
00359    }
00360 
00361    p2 = wcopy;
00362    while (p2  < wcopy+len) {
00363       nitems = sscanf(p2,"%s %d %d",stream,&nrec,&nsec);
00364       if (nitems != 3) {
00365          logInfo("config_autosave: only %d items from \"%s\"\n",nitems,p2);
00366          nerr += rototalk_err_badconfig;
00367       }
00368       else 
00369          nerr += roto_send_autosave_config(stream,nrec,nsec);
00370 
00371       p2 = strchr(p2,';'); /* move to the semicolon         */
00372       if (!p2) break;      /* in case of no final semicolon */
00373       p2++;                /* start just beyond semicolon   */
00374    }
00375 
00376 
00377    free(wcopy);  /* return the allocated space */
00378    wcopy = 0;
00379 
00380    return nerr;
00381 }
00382 
00383 /*
00384  *=========================================================================
00385  * config_compress(const char* config)
00386  * 
00387  * Purpose:
00388  *    Send compression config to the rotorooter, parsed from string
00389  *
00390  * Arguments:
00391  *    config:  configuration string of form:
00392  *             "streamName,level[;streamName,level]"
00393  *             use "*" as streamName to set all legal streams
00394  * 
00395  * Return Value:
00396  *    non-zero indicates there was an error
00397  *=========================================================================
00398  */
00399 int config_compress(const char* config)
00400 {
00401    int nerr = 0;
00402    int len = strlen(config);
00403    char *wcopy = (char*)malloc(len+1);  /* a writable copy of config string */
00404    char stream[1024];
00405    const char *p1;
00406    char *p2;
00407    char achar;
00408    int level, nitems;
00409 
00410    /* make a copy, replacing all the commas with blanks*/
00411    p1 = config; p2 = wcopy;
00412    while (p2 < wcopy+len) {
00413       achar = *p1;
00414       if (achar != ',') *p2 = achar;
00415       else              *p2 = ' ';
00416       p1++; p2++;
00417    }
00418 
00419    p2 = wcopy;
00420    while (p2  < wcopy+len) {
00421       nitems = sscanf(p2,"%s %d",stream,&level);
00422       if (nitems != 2) {
00423          logInfo("config_compress: only %d items from \"%s\"\n",nitems,p2);
00424          nerr += rototalk_err_badconfig;
00425       }
00426       else 
00427          nerr += roto_send_compress_config(stream,level);
00428 
00429       p2 = strchr(p2,';'); /* move to the semicolon         */
00430       if (!p2) break;      /* in case of no final semicolon */
00431       p2++;                /* start just beyond semicolon   */
00432    }
00433 
00434 
00435    free(wcopy);  /* return the allocated space */
00436    wcopy = 0;
00437 
00438    return nerr;
00439 }
00440 
00441 /*
00442  *=========================================================================
00443  * config_basketsize(const char* config)
00444  * 
00445  * Purpose:
00446  *    Send basketsize config to the rotorooter, parsed from string
00447  *
00448  * Arguments:
00449  *    config:  configuration string of form:
00450  *             "streamName,bsize[;streamName,bsize]"
00451  *             use "*" as streamName to set all legal streams
00452  * 
00453  * Return Value:
00454  *    non-zero indicates there was an error
00455  *=========================================================================
00456  */
00457 int config_basketsize(const char* config)
00458 {
00459    int nerr = 0;
00460    int len = strlen(config);
00461    char *wcopy = (char*)malloc(len+1);  /* a writable copy of config string */
00462    char stream[1024];
00463    const char *p1;
00464    char *p2;
00465    char achar;
00466    int bsize, nitems;
00467 
00468    /* make a copy, replacing all the commas with blanks*/
00469    p1 = config; p2 = wcopy;
00470    while (p2 < wcopy+len) {
00471       achar = *p1;
00472       if (achar != ',') *p2 = achar;
00473       else              *p2 = ' ';
00474       p1++; p2++;
00475    }
00476 
00477    p2 = wcopy;
00478    while (p2  < wcopy+len) {
00479       nitems = sscanf(p2,"%s %d",stream,&bsize);
00480       if (nitems != 2) {
00481          logInfo("config_basketsize: only %d items from \"%s\"\n",nitems,p2);
00482          nerr += rototalk_err_badconfig;
00483       }
00484       else 
00485          nerr += roto_send_basketsize_config(stream,bsize);
00486 
00487       p2 = strchr(p2,';'); /* move to the semicolon         */
00488       if (!p2) break;      /* in case of no final semicolon */
00489       p2++;                /* start just beyond semicolon   */
00490    }
00491 
00492 
00493    free(wcopy);  /* return the allocated space */
00494    wcopy = 0;
00495 
00496    return nerr;
00497 }
00498 
00499 /*
00500  *=========================================================================
00501  * long build_dcs_blockid(int detector, int major, int version)
00502  * 
00503  * Purpose:
00504  *    Generate a block id  (force DCS, bogus simflag)
00505  *
00506  * Arguments:
00507  *    detector : 1=near, 2=far, 4=caldet
00508  *    major    : major block id
00509  *    version  : minor version #
00510  * 
00511  * Return Value:
00512  *    return constructed block id
00513  *
00514  * The details of the encoding of RawBlockId are here in RawBlockId.h;
00515  * this is so that the compiler can inline the code.
00516  * Users should NOT rely on intimate knowledge of these details.
00517  *
00518  *    MSB                          LSB
00519  *     3         2         1         0
00520  *    10987654321098765432109876543210
00521  *    --xxCFNSMMMMMMMMMMMMMMMMmmmmmmmm
00522  *
00523  *    88887777666655554444333322221111 
00524  *
00525  *         xx: compactSimFlag: {00=data, 01=fakedaqdata, 10=MC, 11=Reroot}
00526  *        CFN: DetectorType & 0x07 (CalDet,Far,Near bits)
00527  *          S: Source (0=DAQ, 1=DCS)
00528  *   MMMMMMMM: major block id
00529  *   mmmmmmmm: minor block id
00530  *
00531  *=========================================================================
00532  */
00533 long build_dcs_blockid(int detector, int major, int version)
00534 {
00535    const long  shiftRawBlkIdMinor    =  0;
00536    const long  shiftRawBlkIdMajor    =  8;
00537    const long  shiftRawBlkIdDetector = 25;
00538    const long  shiftRawBlkIdCSimFlag = 28;
00539    
00540    const long  maskRawBlkIdMinor     = 0x000000ff;
00541    const long  maskRawBlkIdMajor     = 0x00ffff00;
00542    const long  maskRawBlkIdIsDCS     = 0x01000000;
00543    const long  maskRawBlkIdDetector  = 0x0e000000;
00544    const long  maskRawBlkIdCSimFlag  = 0x30000000;
00545 
00546    int cmptSimFlag = 0;  /* compact simflag for real Data */
00547    int isDCS = 1;
00548 
00549    return
00550       ((cmptSimFlag << shiftRawBlkIdCSimFlag) & maskRawBlkIdCSimFlag) |
00551       ((   detector << shiftRawBlkIdDetector) & maskRawBlkIdDetector) |
00552       ((isDCS) ? maskRawBlkIdIsDCS : 0)                               |
00553       ((         major   << shiftRawBlkIdMajor) & maskRawBlkIdMajor)  |
00554       ((         version << shiftRawBlkIdMinor) & maskRawBlkIdMinor);
00555 
00556 }
00557 
00558 /*
00559  *=========================================================================
00560  * long* append_dcs_header_block(long* buffer, long* toofar)
00561  * 
00562  * Purpose:
00563  *    Append into buffer a DCS Header block
00564  *
00565  * Arguments:
00566  *    buffer   : pointer to start of where add data
00567  *    toofar   : pointer to position beyond end of buffer
00568  * 
00569  * Return Value:
00570  *    return starting position for new additional blocks
00571  *=========================================================================
00572  */
00573 long* append_dcs_header_block(long* buffer, long* toofar)
00574 {
00575   /*
00576    * 0 DcsHeaderBlock size
00577    * 1                checksum
00578    * 2                blockid
00579    * 3                sec
00580    * 4                ns
00581    */
00582 
00583   int  version = 0;
00584   long blksize = 5;
00585   struct timeval now;
00586 
00587   /* check that adding this won't overflow buffer */
00588   if (buffer+blksize > toofar) {
00589     logError("append_dcs_header_block: need %ld have %d",
00590              blksize,toofar-buffer);
00591     return buffer;
00592   }
00593 
00594   /* fill in the data */
00595 
00596   buffer[0] = blksize;
00597   /* skip checksum */
00598   buffer[2] = build_dcs_blockid(gDetector,kMdBlockDcsHeader,version);
00599 
00600   /* for now tag record with the current system time */
00601   gettimeofday(&now,0);
00602   buffer[3] = now.tv_sec;
00603   buffer[4] = now.tv_usec*1000;
00604 
00605   /* now fill in checksum */
00606   buffer[1] = rdxsum_calc(buffer+0,1);
00607 
00608   return buffer + buffer[0];
00609 }
00610 
00611 /*
00612  *=========================================================================
00613  * long* append_dcs_alarm_block(long* buffer, long* toofar)
00614  * 
00615  * Purpose:
00616  *    Append into buffer a (generic, ie. bogus) DCS Alarm block
00617  *
00618  * Arguments:
00619  *    buffer   : pointer to start of where add data
00620  *    toofar   : pointer to position beyond end of buffer
00621  * 
00622  * Return Value:
00623  *    return starting position for new additional blocks
00624  *=========================================================================
00625  */
00626 long* append_dcs_alarm_block(long* buffer, long* toofar)
00627 {
00628   /*
00629    * 0 DcsAlarmBlock  size
00630    * 1                checksum
00631    * 2                blockid
00632    * ...              <stuff>
00633    */
00634 
00635   int  version = 0;
00636   long blksize, payload, j;
00637 
00638   /* 
00639    * determine whether this block is to go out on this record
00640    */
00641 
00642   /* for this case pick a random frequency (see Linux "man -s 3 rand")*/
00643   /* here pick 10% chance of adding one */
00644   if ( rand()/(RAND_MAX+1.0) > 0.10 ) return buffer;
00645 
00646   /* 
00647    * determine how big this block is going to be when done
00648    */
00649 
00650   /* for this case pick a random size (1 to 30 words) for the data payload */
00651   payload = 1 + (int)(30.*rand()/(RAND_MAX+1.0));
00652   blksize = 3 + payload;
00653 
00654   /* check that adding this won't overflow buffer */
00655   if (buffer+blksize > toofar) { 
00656     logError("append_dcs_alarm_block: need %ld have %d",
00657              blksize,toofar-buffer);
00658     return buffer;
00659   }
00660 
00661   /* fill in the data */
00662 
00663   buffer[0] = blksize;
00664   /* skip checksum */
00665   buffer[2] = build_dcs_blockid(gDetector,kMdBlockDcsAlarm,version);
00666 
00667   /* payload of random numbers */
00668   for (j=0; j<payload; ++j) buffer[j+3] = rand();
00669 
00670   /* now fill in checksum */
00671   buffer[1] = rdxsum_calc(buffer+0,1);
00672 
00673   return buffer + buffer[0];
00674 }
00675 
00676 /*
00677  *=========================================================================
00678  * long* append_dcs_monitor_block(long* buffer, long* toofar)
00679  * 
00680  * Purpose:
00681  *    Append into buffer a (generic, ie. bogus) DCS Monitor block
00682  *
00683  * Arguments:
00684  *    buffer   : pointer to start of where add data
00685  *    toofar   : pointer to position beyond end of buffer
00686  * 
00687  * Return Value:
00688  *    return starting position for new additional blocks
00689  *=========================================================================
00690  */
00691 long* append_dcs_monitor_block(long* buffer, long* toofar)
00692 {
00693   /*
00694    * 0 DcsMonitorBlock  size
00695    * 1                checksum
00696    * 2                blockid
00697    * ...              <stuff>
00698    */
00699 
00700   int  version = 0;
00701   long blksize, payload, j;
00702 
00703   /* 
00704    * determine whether this block is to go out on this record
00705    */
00706 
00707   /* for this case pick a random frequency (see Linux "man -s 3 rand")*/
00708   /* here pick 90% chance of adding one */
00709   if ( rand()/(RAND_MAX+1.0) > 0.90 ) return buffer;
00710 
00711   /* 
00712    * determine how big this block is going to be when done
00713    */
00714 
00715   /* for this case pick a random size (30 to 300 words) for the data payload */
00716   payload = 30 + (int)(300.*rand()/(RAND_MAX+1.0));
00717   blksize = 3 + payload;
00718 
00719   /* check that adding this won't overflow buffer */
00720   if (buffer+blksize > toofar) { 
00721     logError("append_dcs_monitor_block: need %ld have %d",
00722              blksize,toofar-buffer);
00723     return buffer;
00724   }
00725 
00726   /* fill in the data */
00727 
00728   buffer[0] = blksize;
00729   /* skip checksum */
00730   buffer[2] = build_dcs_blockid(gDetector,kMdBlockDcsMonitor,version);
00731 
00732   /* payload of random numbers */
00733   for (j=0; j<payload; ++j) buffer[j+3] = rand();
00734 
00735   /* now fill in checksum */
00736   buffer[1] = rdxsum_calc(buffer+0,1);
00737 
00738   return buffer + buffer[0];
00739 }

Generated on Mon Feb 15 11:06:26 2010 for loon by  doxygen 1.3.9.1