00001
00002 #include <stdio.h>
00003
00004 #include <unistd.h>
00005
00006 #include <stdlib.h>
00007
00008 #include <string.h>
00009
00010 #include "OnlineUtil/msgLogLib/msgLog.h"
00011 #include "OnlineUtil/rototalk.h"
00012
00013
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
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
00034 #define MAXBUFFER 8388608
00035
00036
00037 int gDetector = kMdBlockSourceFarDetector;
00038
00039
00040
00041
00042
00043
00044
00045
00046
00047
00048
00049
00050
00051
00052
00053
00054
00055
00056
00057
00058
00059
00060
00061
00062
00063
00064
00065
00066
00067
00068
00069 int main(int argc, char **argv)
00070 {
00071
00072
00073 const char* iphost = "localhost";
00074 const char* default_producer = "DCS";
00075 const int default_port = 9012;
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;
00086 int nodelay_flag = 1;
00087 int echoMsgLog = 0;
00088 int copt;
00089
00090
00091
00092
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':
00097 iphost = optarg;
00098 break;
00099 case 'b':
00100 bsize = atoi(optarg);
00101 break;
00102 case 'd':
00103 gDetector = parse_detector(optarg);
00104 break;
00105 case 'c':
00106 autosave_config = optarg;
00107 break;
00108 case 'C':
00109 compress_config = optarg;
00110 break;
00111 case 'B':
00112 basketsize_config = optarg;
00113 break;
00114 case 'w':
00115 producer = optarg;
00116 break;
00117 case 'p':
00118 port = atoi(optarg);
00119 break;
00120 case 'e':
00121 echoMsgLog = 1;
00122 break;
00123 case 'v':
00124 roto_verbose = atoi(optarg);
00125 break;
00126 case 'n':
00127 mxrec = atoi(optarg);
00128 break;
00129 case 'D':
00130 nodelay_flag = atoi(optarg);
00131 break;
00132 case 'h':
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
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
00169 if (0 == strcmp(producer,default_producer) &&
00170 port == default_port) {
00171
00172 if (roto_verbose>1)
00173 printf("connect via roto_open_DCP_connection\n");
00174 nerr += roto_open_DCS_connection(iphost);
00175 } else {
00176
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
00204 nerr += roto_close_connection();
00205
00206
00207 free(buffer);
00208
00209 logNotice("stopping %s",argv[0]);
00210 msgLogCleanup();
00211
00212 exit(nerr);
00213 }
00214
00215
00216
00217
00218
00219
00220
00221
00222
00223
00224
00225
00226
00227
00228
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
00257
00258
00259 current = buffer;
00260
00261
00262 current = append_dcs_header_block(current,endofbuf);
00263
00264
00265
00266
00267
00268 current = append_dcs_alarm_block(current,endofbuf);
00269 current = append_dcs_monitor_block(current,endofbuf);
00270
00271
00272
00273
00274 nbytes = (current-buffer)*sizeof(long);
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
00288
00289
00290
00291
00292
00293
00294
00295
00296
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
00328
00329
00330
00331
00332
00333
00334
00335
00336
00337
00338
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);
00346 char stream[1024];
00347 const char *p1;
00348 char *p2;
00349 char achar;
00350 int nrec,nsec, nitems;
00351
00352
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,';');
00372 if (!p2) break;
00373 p2++;
00374 }
00375
00376
00377 free(wcopy);
00378 wcopy = 0;
00379
00380 return nerr;
00381 }
00382
00383
00384
00385
00386
00387
00388
00389
00390
00391
00392
00393
00394
00395
00396
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);
00404 char stream[1024];
00405 const char *p1;
00406 char *p2;
00407 char achar;
00408 int level, nitems;
00409
00410
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,';');
00430 if (!p2) break;
00431 p2++;
00432 }
00433
00434
00435 free(wcopy);
00436 wcopy = 0;
00437
00438 return nerr;
00439 }
00440
00441
00442
00443
00444
00445
00446
00447
00448
00449
00450
00451
00452
00453
00454
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);
00462 char stream[1024];
00463 const char *p1;
00464 char *p2;
00465 char achar;
00466 int bsize, nitems;
00467
00468
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,';');
00488 if (!p2) break;
00489 p2++;
00490 }
00491
00492
00493 free(wcopy);
00494 wcopy = 0;
00495
00496 return nerr;
00497 }
00498
00499
00500
00501
00502
00503
00504
00505
00506
00507
00508
00509
00510
00511
00512
00513
00514
00515
00516
00517
00518
00519
00520
00521
00522
00523
00524
00525
00526
00527
00528
00529
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;
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
00561
00562
00563
00564
00565
00566
00567
00568
00569
00570
00571
00572
00573 long* append_dcs_header_block(long* buffer, long* toofar)
00574 {
00575
00576
00577
00578
00579
00580
00581
00582
00583 int version = 0;
00584 long blksize = 5;
00585 struct timeval now;
00586
00587
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
00595
00596 buffer[0] = blksize;
00597
00598 buffer[2] = build_dcs_blockid(gDetector,kMdBlockDcsHeader,version);
00599
00600
00601 gettimeofday(&now,0);
00602 buffer[3] = now.tv_sec;
00603 buffer[4] = now.tv_usec*1000;
00604
00605
00606 buffer[1] = rdxsum_calc(buffer+0,1);
00607
00608 return buffer + buffer[0];
00609 }
00610
00611
00612
00613
00614
00615
00616
00617
00618
00619
00620
00621
00622
00623
00624
00625
00626 long* append_dcs_alarm_block(long* buffer, long* toofar)
00627 {
00628
00629
00630
00631
00632
00633
00634
00635 int version = 0;
00636 long blksize, payload, j;
00637
00638
00639
00640
00641
00642
00643
00644 if ( rand()/(RAND_MAX+1.0) > 0.10 ) return buffer;
00645
00646
00647
00648
00649
00650
00651 payload = 1 + (int)(30.*rand()/(RAND_MAX+1.0));
00652 blksize = 3 + payload;
00653
00654
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
00662
00663 buffer[0] = blksize;
00664
00665 buffer[2] = build_dcs_blockid(gDetector,kMdBlockDcsAlarm,version);
00666
00667
00668 for (j=0; j<payload; ++j) buffer[j+3] = rand();
00669
00670
00671 buffer[1] = rdxsum_calc(buffer+0,1);
00672
00673 return buffer + buffer[0];
00674 }
00675
00676
00677
00678
00679
00680
00681
00682
00683
00684
00685
00686
00687
00688
00689
00690
00691 long* append_dcs_monitor_block(long* buffer, long* toofar)
00692 {
00693
00694
00695
00696
00697
00698
00699
00700 int version = 0;
00701 long blksize, payload, j;
00702
00703
00704
00705
00706
00707
00708
00709 if ( rand()/(RAND_MAX+1.0) > 0.90 ) return buffer;
00710
00711
00712
00713
00714
00715
00716 payload = 30 + (int)(300.*rand()/(RAND_MAX+1.0));
00717 blksize = 3 + payload;
00718
00719
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
00727
00728 buffer[0] = blksize;
00729
00730 buffer[2] = build_dcs_blockid(gDetector,kMdBlockDcsMonitor,version);
00731
00732
00733 for (j=0; j<payload; ++j) buffer[j+3] = rand();
00734
00735
00736 buffer[1] = rdxsum_calc(buffer+0,1);
00737
00738 return buffer + buffer[0];
00739 }