• Main Page
  • Related Pages
  • Namespaces
  • Data Structures
  • Files
  • File List
  • Globals

abbplugin/AbbTestApp.cxx (r4864/r4165)

Go to the documentation of this file.
00001 /*
00002  * @file AbbTestApp.cxx
00003  * @author Sergey Linev
00004  * @date 2010-03-30
00005  * @brief Tests the communication with the ROC board
00006  *
00007  */
00008 
00009 #include <stdio.h>
00010 #include <string.h>
00011 #include <stdlib.h>
00012 #include <iostream>
00013 #include <time.h>
00014 #include <unistd.h>
00015 
00016 #include "ABBdaemon.h"
00017 
00018 #include "sp605/Iterator.h"
00019 
00020 #define NUMBUFFERS 100
00021 #define BUFFERSIZE 65536
00022 #define MAXNUMROCS 10
00023 
00029 void printMessage(const char* prefix, uint8_t* buffer, const char* suffix = "")
00030 { 
00031     printf("%s: Msg: %02x-%02x-%02x-%02x-%02x-%02x-%02x-%02x%s\n", 
00032                 prefix, buffer[0], buffer[1], buffer[2], buffer[3],
00033                         buffer[4], buffer[5], buffer[6], buffer[7], suffix);
00034 }
00035 
00036 void usage() 
00037 {
00038    printf("abbtest program v 1.2\n");
00039    printf("Arguments:\n");
00040    printf("   -sfp0 | -sfp1 - run test via first or second port\n");
00041    printf("   -brdid addr   - specify board address (in decimal or 0x hexadecimal form) \n");
00042    printf("   -retid addr   - specify return (ABB) address, default 0x10 \n");
00043    printf("   -both         - run test with both connectors\n");
00044    printf("   -get addr     - get register from board(s)\n");
00045    printf("   -put addr val - set register on board(s)\n");
00046    printf("   -test N       - run specified test number (from 0 to 7, default 0)\n");
00047    printf("   -dlmN         - issue only DLM(N) and exit\n");
00048    printf("   -all          - run all tests from 0 to 7\n");
00049    printf("   -o | -v       - more output in tests 2, 3, 4, 7, 11\n");
00050    printf("   -reset        - only reset ROC board\n");
00051    printf("   -resetabb     - try to reset ABB from FFs state\n");
00052    printf("   -long         - make test 4 much longer\n");
00053    printf("   -nostop       - do not stop data taking in tests 4 & 7\n");
00054    printf("   -dlm          - use DLM 8/9 to start/stop DAQ in tests 4 and 7\n");
00055    printf("   -sleep        - do sleep(1) after each DLM\n");
00056    printf("   -fifo         - show only fifo and exit\n");
00057    printf("   -rocver       - show roc firmware version\n");
00058    printf("   -help | ?     - show this help\n");
00059 }
00060 
00061 
00062 int convert_to_int(const char* str)
00063 {
00064    if ((str==0) || (*str==0)) return 0;
00065 
00066    int base = 10;
00067    if ((strlen(str)>2) && (str[0]=='0') && ((str[1]=='x') || (str[1]=='X'))) {
00068       str+=2;
00069       base = 16;
00070    }
00071    char* endptr(0);
00072 
00073    return strtol(str, &endptr, base);
00074 }
00075 
00076 int main(int argc, char** argv) 
00077 {
00078    uint32_t RETID = 0x010;
00079    uint32_t ROCID[MAXNUMROCS]; // this is array used to specify all ROCs used in test
00080    
00081    uint32_t oper_addr(0), oper_arg(0), repeat_cnt(0);
00082    
00083    
00084    unsigned numrocs(0);
00085 
00086    if (argc==1) { usage(); return 0; }
00087 
00088    int testkind = 0;
00089 
00090    bool dooutput = false;
00091    bool doreset = false;
00092    bool doresetabb = false;
00093    int dodlm = -1;
00094    bool passed = false;
00095    bool usedlm = false;
00096    bool usesleep = false;
00097    bool dolong = false;
00098    bool nostop = false;
00099    bool onlyfifo = false;
00100    bool doget(false), doput(false);
00101 
00102    for (int n=1;n<argc;n++) {
00103       if (((strcmp(argv[n],"-rocid")==0) || (strcmp(argv[n],"-brdid")==0)) && (n<argc-1)) {
00104          ROCID[numrocs++] = convert_to_int(argv[++n]);
00105       } else
00106 
00107       if ((strcmp(argv[n],"-retid")==0) && (n<argc-1)) {
00108          RETID = convert_to_int(argv[++n]);
00109       } else
00110 
00111       if ((strcmp(argv[n],"-get")==0) && (n<argc-1)) {
00112          doget = true;
00113          oper_addr = convert_to_int(argv[++n]);
00114       } else
00115 
00116       if ((strcmp(argv[n],"-put")==0) && (n<argc-2)) {
00117          doput = true;
00118          oper_addr = convert_to_int(argv[++n]);
00119          oper_arg = convert_to_int(argv[++n]);
00120       } else
00121 
00122       if ((strcmp(argv[n],"-test")==0) && (n<argc-1)) {
00123          testkind = convert_to_int(argv[++n]);
00124       } else
00125 
00126       if ((strcmp(argv[n],"-num")==0) && (n<argc-1)) {
00127          repeat_cnt = convert_to_int(argv[++n]);
00128       } else
00129 
00130       if (strcmp(argv[n],"-all")==0) testkind = -1; else
00131 
00132       if (strcmp(argv[n],"-sfp0")==0) ROCID[numrocs++] = 0; else
00133 
00134       if (strcmp(argv[n],"-sfp1")==0) ROCID[numrocs++] = 0x20; else
00135 
00136       if (strcmp(argv[n],"-both")==0) {
00137         ROCID[numrocs++] = 0x00; 
00138         ROCID[numrocs++] = 0x20; 
00139       } else
00140 
00141       if (strcmp(argv[n],"-o")==0) dooutput = true; else
00142 
00143       if (strcmp(argv[n],"-v")==0) dooutput = true; else
00144 
00145       if (strcmp(argv[n],"-reset")==0) doreset = true; else
00146 
00147       if (strcmp(argv[n],"-resetabb")==0) doresetabb = true; else
00148 
00149       if (strcmp(argv[n],"-long")==0) dolong = true; else
00150 
00151       if (strcmp(argv[n],"-dlm")==0) usedlm = true; else
00152 
00153       if (strncmp(argv[n],"-dlm", 4)==0) dodlm = atoi(argv[n]+4); else
00154 
00155       if (strcmp(argv[n],"-nostop")==0) nostop = true; else
00156 
00157       if (strcmp(argv[n],"-sleep")==0) usesleep = true; else
00158 
00159       if (strcmp(argv[n],"-fifo")==0) onlyfifo = true; else
00160 
00161       if ((strcmp(argv[n],"-usage")==0) || (strcmp(argv[n],"-help")==0) || (strcmp(argv[n],"?")==0) || (strcmp(argv[n],"/?")==0)) usage();
00162 
00163    }
00164 
00165    abbdaemon::ABBdaemonClient daemon("mprace-0");
00166 
00167    if (doresetabb) {    
00168 #ifdef ABB_ETRA_FUNC
00169        printf("\nTrying to reset abb FFs problem!\n"); 
00170        daemon.setReg(0x1E, 0x0A);
00171        return 0;
00172 #else
00173        printf("\nERROR - standard daemon does not allow to access ABB registers!\n"); 
00174        return 1;
00175 #endif
00176    }
00177 
00178    uint32_t fifo0 = daemon.getFIFOStatus();
00179    if (onlyfifo) {
00180        printf("FIFO: 0x%x  Ctl: 0x%x\n", fifo0, daemon.getCTLStatus());
00181        return 0;
00182    }
00183 
00184 
00185    uint32_t value, res;
00186 
00187    if (dodlm>=0) {
00188       printf("Do DLM%d only\n", dodlm);
00189       res = daemon.submitPutDLM(dodlm);
00190       return res==0 ? 0 : 1;
00191    }
00192 
00193    if (numrocs==0) {
00194        printf("\nNo ROCs specified !!!\n"); 
00195        return 1;
00196    }
00197 
00198    if (dooutput) {
00199       uint32_t _ver(0), _major(0), _author(0), _minor(0);
00200       daemon.getDesignID(&_ver, &_major, &_author, &_minor);
00201       printf("ABB version: %u.%u.%u.%u (version, major, author, minor)\n", _ver, _major, _author, _minor);
00202    }
00203 
00204    printf("\nTest kind = %d RETID = 0x%03x", testkind, RETID);
00205    for (unsigned nr=0;nr<numrocs;nr++) printf(" BRDID[%u] = 0x%03x", nr, ROCID[nr]);
00206    printf("\n");
00207 
00208    if (doget) {
00209       for (unsigned nr=0;nr<numrocs;nr++) {
00210          oper_arg = 0;
00211          res = daemon.submitGet(ROCID[nr], RETID, oper_addr, &oper_arg);
00212          printf("BRD:0x%03x GET addr:0x%06x value:0x%08x res:%u\n", (unsigned)ROCID[nr], (unsigned) oper_addr, (unsigned) oper_arg, (unsigned) res);
00213       }
00214       return res==0 ? 0 : 1;
00215    }
00216 
00217    if (doput) {
00218       for (unsigned nr=0;nr<numrocs;nr++) {
00219          res = daemon.submitPut(ROCID[nr], RETID, oper_addr, oper_arg);
00220          printf("BRD:0x%03x PUT addr:0x%06x value:0x%08x res:%u\n", (unsigned)ROCID[nr], (unsigned) oper_addr, (unsigned) oper_arg, (unsigned) res);
00221       }
00222       return res==0 ? 0 : 1;
00223    }
00224 
00225 
00226    if (testkind!=8) daemon.submitReset();
00227 
00228    printf("FIFO before:0x%x and after 0x%x reset, Ctl: 0x%x\n", fifo0, daemon.getFIFOStatus(), daemon.getCTLStatus());
00229 
00230    if (doreset) {
00231       printf("Do board reset \n");
00232       for (unsigned nr=0;nr<numrocs;nr++)
00233          res = daemon.submitPut(ROCID[nr], RETID, 0x100, 1);
00234       return res==0 ? 0 : 1;
00235    }
00236    
00237    if ((testkind==0) || (testkind<0)) {
00238       printf("\nTEST0: Simple communication test, read main ROC hardware version\n");
00239 
00240       bool passed = true;
00241 
00242       for (unsigned nr=0;nr<numrocs;nr++) {
00243          value = 0;
00244          res = daemon.submitGet(ROCID[nr], RETID, 0x4, &value);
00245          printf("TEST0: ROCID 0x%03x  HWV = 0x%08x  res = %u\n", ROCID[nr], value, res);
00246          if ((value < 0x02000000) || (res != 0)) passed = false;
00247       }
00248 
00249       printf("TEST0: %s\n", (passed ? "PASS" : "FAIL"));
00250       if (testkind>=0) return passed ? 0 : 1;
00251    }
00252 
00253    if ((testkind==1) || (testkind<0)) {
00254       printf("\nTEST1: Simple communication test, read several registers with NOper\n");
00255 
00256       passed = true;
00257 
00258       for (unsigned nr=0;nr<numrocs;nr++) {
00259 
00260          uint32_t addrs[8], values[8], retvals[8];
00261          addrs[0] =   0x00; values[0] = 0; retvals[0] = 0;  // KIND
00262          addrs[1] =   0x04; values[1] = 0; retvals[1] = 0;  // VERSION
00263          addrs[2] =   0x10; values[2] = 0; retvals[2] = 0;  // ROCID
00264 
00265          res = daemon.submitNOper(ROCID[nr], RETID, 3, addrs, values, retvals);
00266 
00267          printf("TEST1: ROCID 0x%03x Noper with 3 Gets res = %u\n", ROCID[nr], res);
00268 
00269          if ((res != 0) || (values[0]==0) || (values[1]==0)) passed = false;
00270 
00271          for (int n=0; n<3; n++) {
00272             if (dooutput) printf("TEST1: Get 0x%02x = 0x%08x, ret = %u\n", addrs[n], values[n], retvals[n]);
00273             if (retvals[n] != 0) passed = false;
00274          }
00275       }
00276 
00277       printf("TEST1: %s\n", (passed ? "PASS" : "FAIL"));
00278       if (testkind>=0) return passed ? 0 : 1;
00279    }
00280 
00281 
00282    if ((testkind==2) || (testkind<0)) {
00283       printf("\nTEST2: Short NOper list with PUTs and GETs of ROC ID\n");
00284 
00285       passed = true;     
00286 
00287       for (unsigned nr=0;nr<numrocs;nr++) {
00288 
00289          uint32_t addrs[7], values[7], retvals[7];
00290          int n = 0;
00291          for (int loop=0;loop<3;loop++) {
00292             addrs[n] = 0x10 | 0x80000000; values[n] = loop; retvals[n] = 0; n++;  // Put ROCID
00293             addrs[n] = 0x10; values[n] = 0; retvals[n] = 0; n++;  // Put ROCID
00294          }
00295          addrs[n] = 0x10 | 0x80000000; values[n] = 0; retvals[n] = 0; n++;  // Put ROCID
00296         
00297          res = daemon.submitNOper(ROCID[nr], RETID, n, addrs, values, retvals);
00298 
00299          printf("TEST2: ROCID 0x%03x Noper with %d operations res = %u\n", ROCID[nr], n, res);
00300 
00301          if (res!=0) passed = false; 
00302          n = 0;
00303 
00304          for (int loop=0;loop<3;loop++) {
00305             if (dooutput)
00306               printf("TEST2: Put 0x%02x = 0x%02x, ret = %u\n", addrs[n] & 0xFF, values[n], retvals[n]);
00307             if (retvals[n] != 0) passed = false; 
00308             n++;
00309 
00310             if (dooutput)
00311                printf("TEST2: Get 0x%02x = 0x%02x, ret = %u\n", addrs[n], values[n], retvals[n]);
00312             if ((retvals[n] != 0) || (values[n]!=(uint32_t)loop)) passed = false; 
00313             n++;
00314          }
00315 
00316          if (dooutput)
00317             printf("TEST2: Put 0x%02x = 0x%02x, ret = %u\n", addrs[n] & 0xFF, values[n], retvals[n]);
00318          if (retvals[n] != 0) passed = false;
00319       }
00320 
00321       printf("TEST2: %s\n", (passed ? "PASS" : "FAIL"));
00322       if (testkind>=0) return passed ? 0 : 1;
00323    }
00324 
00325    if ((testkind==3) || (testkind<0)) {
00326       printf("\nTEST3: Long NOper list with PUTs and GETs of ROC ID\n");
00327 
00328       passed = true;     
00329 
00330       for (unsigned nr=0;nr<numrocs;nr++) {
00331 
00332          uint32_t addrs[129], values[129], retvals[129];
00333          int n = 0;
00334          for (int loop=0;loop<64;loop++) {
00335             addrs[n] = 0x10 | 0x80000000; values[n] = loop; retvals[n] = 0; n++;  // Put ROCID
00336             addrs[n] = 0x10; values[n] = 0; retvals[n] = 0; n++;  // Put ROCID
00337          }
00338          addrs[n] = 0x10 | 0x80000000; values[n] = 0; retvals[n] = 0; n++;  // Put ROCID
00339 
00340          res = daemon.submitNOper(ROCID[nr], RETID, n, addrs, values, retvals);
00341 
00342          printf("TEST3: ROCID 0x%03x Noper with %d operations res = %u\n", ROCID[nr], n, res);
00343 
00344          if (res!=0) passed = false; 
00345          n = 0;
00346 
00347          for (int loop=0;loop<64;loop++) {
00348             if (dooutput)
00349                printf("TEST3: Put 0x%02x = 0x%02x, ret = %u\n", addrs[n] & 0xFF, values[n], retvals[n]);
00350             if (retvals[n] != 0) passed = false; 
00351             n++;
00352 
00353             if (dooutput)
00354                printf("TEST3: Get 0x%02x = 0x%02x, ret = %u\n", addrs[n], values[n], retvals[n]);
00355             if ((retvals[n] != 0) || (values[n]!=(uint32_t)loop)) passed = false; 
00356             n++;
00357          }
00358 
00359          if (dooutput)
00360             printf("TEST3: Put 0x%02x = 0x%02x, ret = %u\n", addrs[n] & 0xFF, values[n], retvals[n]);
00361          if (retvals[n] != 0) passed = false;
00362       }
00363 
00364       printf("TEST3: %s\n", (passed ? "PASS" : "FAIL"));
00365       if (testkind>=0) return passed ? 0 : 1;
00366    }
00367 
00368 
00369    if ((testkind==4) || (testkind<0)) {
00370       printf("\nTEST4: Simple DAQ application with GPIO set (need NXYTER firmware) %s\n", (usedlm ? "with DML" : ""));
00371 
00372       passed = true;
00373 
00374       for (unsigned nr=0;nr<numrocs;nr++) {
00375 
00376          value = 0;
00377          res = daemon.submitGet(ROCID[nr], RETID, 0x0, &value);
00378          unsigned fetyp = (value >> 16);
00379          if ((res!=0) || ((fetyp != 1) && (fetyp != 4))) {
00380             printf("\nTEST4: Only nXYTER firmware can be used\n");
00381             passed = false;
00382             return 1;
00383          }
00384       }
00385 
00386       daemon.submitReset();
00387 
00388       void* bhandles[NUMBUFFERS];
00389       uint8_t* buffers[NUMBUFFERS];
00390       uint8_t* theBuffer = (uint8_t*) malloc(BUFFERSIZE*NUMBUFFERS);
00391       for (int n=0;n<NUMBUFFERS;n++) {
00392          buffers[n] = theBuffer+ n*BUFFERSIZE;
00393          if (buffers[n]==0) { printf("TEST4: Memory allocation failed - ABORT\n"); passed = false; return 1; }
00394          bhandles[n] = daemon.registerBuffer(BUFFERSIZE, buffers[n]);
00395          if (bhandles[n]==0) { printf("TEST4: Memory registering failed - ABORT\n"); passed = false; return 1; }
00396       }
00397 
00398       for (unsigned nr=0;nr<numrocs;nr++) {
00399 
00400          if (res!=0) { printf("TEST4: ROCID 0x%03x configure\n", ROCID[nr]); passed = false; }
00401 
00402          res = daemon.submitPut(ROCID[nr], RETID, 0x200104, 0); // stop DAQ
00403          if (res!=0) { printf("TEST4: Initial stop daq failed res = %u\n", res); passed = false; }
00404 
00405          res = daemon.submitPut(ROCID[nr], RETID, 0x010000, 0x9900); // set GPIO with SYNC0 and SYNC1 in self-loop
00406          if (res!=0) { printf("TEST4: Configure GPIO failed res = %u\n", res); passed = false; }
00407 
00408          res = daemon.submitPut(ROCID[nr], RETID, 0x10, (0x5 << nr)); // set ROC number
00409          if (res!=0) { printf("TEST4: Cannot configure ROC number %u = %u\n", (0x5 << nr), res); passed = false; }
00410 
00411          res = daemon.submitPut(ROCID[nr], RETID, 0x01010C, 0); // set sync scale down to 0
00412          if (res!=0) { printf("TEST4: Configure scale down failed res = %u\n", res); passed = false; }
00413 
00414          res = daemon.submitPut(ROCID[nr], RETID, 0x402500, 0); // disable all nxyters 
00415          if (res!=0) { printf("TEST4: Cannot disable nxyters = %u\n", res); passed = false; }
00416 
00417          res = daemon.submitPut(ROCID[nr], RETID, 0x400014, 1); // reset FIFO
00418          if (res!=0) { printf("TEST4: Reset FIFO failed res = %u\n", res); passed = false; }
00419 
00420          res = daemon.submitPut(ROCID[nr], RETID, 0x400014, 0); // reset FIFO
00421          if (res!=0) { printf("TEST4: Reset FIFO failed res = %u\n", res); passed = false; }
00422       }
00423 
00424       daemon.submitReset();
00425 
00426       if (usedlm) { 
00427          res = daemon.submitPutDLM(8); 
00428          if (res!=0) { printf("TEST4: DLM 8 failed res = %u\n", res); passed = false; }
00429          if (usesleep) sleep(1); 
00430       } else {
00431          for (unsigned nr=0;nr<numrocs;nr++) {
00432             res = daemon.submitPut(ROCID[nr], RETID, 0x200100, 0); // start DAQ
00433             if (res!=0) { printf("TEST4: Start daq failed res = %u\n", res); passed = false; }
00434          }
00435       }
00436 
00437       int maxloop = dolong ? 1000 : 20;
00438 
00439       printf("TEST4: starting DAQ\n"); 
00440 
00441       int msgkind[MAXNUMROCS];
00442       unsigned lastevnum0[MAXNUMROCS], lastevnum1[MAXNUMROCS], lastepoch[MAXNUMROCS];
00443       bool find_start[MAXNUMROCS], find_reset[MAXNUMROCS], find_stop[MAXNUMROCS];
00444 
00445       unsigned evnum(0);
00446 
00447       for (unsigned nr=0;nr<numrocs;nr++) {
00448          msgkind[nr] = 0x2;
00449          lastevnum0[nr] = 0;
00450          lastevnum1[nr] = 0;
00451          lastepoch[nr] = 0;
00452          find_start[nr] = false;
00453          find_reset[nr] = false; 
00454          find_stop[nr] = false;
00455       }
00456 
00457       char suffix[128];
00458 
00459       unsigned format_error(0);
00460 
00461       for (int loop = 0; loop<maxloop; loop++) {
00462          int waitcnt = 50000; // about 0.7 sec
00463 
00464          int bufid = loop % NUMBUFFERS;
00465 
00466          unsigned read_size = BUFFERSIZE / 4;
00467 
00468          while (daemon.getFIFOStatus() / 4 < read_size) {
00469             if (--waitcnt == 0) {
00470                read_size = daemon.getFIFOStatus() / 4;
00471                break;
00472             }
00473          }
00474 
00475          if (read_size==0) {
00476             if (loop==0) {
00477                printf("TEST4: No data to read, stop DAQ\n"); 
00478                passed = false;
00479             }
00480             break;
00481          }
00482 
00483          daemon.readDMAserialized(0x0, bhandles[bufid], read_size, 0, false, true, 0.);
00484 
00485          // submit stop daq in the middle of loop
00486          if (!nostop) {
00487             if ((loop == (maxloop - 18))) {
00488                if (usedlm) {
00489                   res = daemon.submitPutDLM(9);
00490                   if (res!=0) { printf("TEST4: Suspend daq DLM 9 failed res = %u\n", res); passed = false; }
00491                } else
00492                   for (unsigned nr=0;nr<numrocs;nr++) {
00493                      res = daemon.submitPut(ROCID[nr], RETID, 0x200104, 0); // stop DAQ
00494                      if (res!=0) { printf("TEST4: Stop daq failed res = %u\n", res); passed = false; }
00495                   }
00496             }
00497          }
00498 
00499          if (!dolong || ((loop % 100) == 0))
00500             printf("TEST4:  DMA operation %d read_size %d fifo %u\n", loop, read_size*4, daemon.getFIFOStatus());
00501 
00502          uint8_t* buffer = buffers[bufid];
00503 
00504          int pos(0), len(read_size*4);
00505 
00506          // check Epoch, Sync0, Sync1, StopDaq sequence
00507          while (pos<len) {
00508             unsigned rocid = buffer[pos] + buffer[pos+1]*256;
00509             unsigned nr=0;
00510             while ((rocid!=5) && (rocid!=0)) { nr++; rocid = rocid >> 1; }
00511             if (rocid!=5) {
00512                format_error |= 0x1;
00513                if (dooutput) printMessage("TEST4", buffer+pos, " <- wrong ROCID!");
00514                pos+=8;
00515                continue;
00516             }
00517 
00518             if ((buffer[pos+2]==0x7) && (buffer[pos+3]==0x1) && (buffer[pos+4]==0) &&  
00519                   (buffer[pos+5]==0) && (buffer[pos+6]==0) && (buffer[pos+7]==0)) {
00520                if (dooutput) printMessage("TEST4", buffer+pos, " <- start DAQ!");
00521                find_start[nr] = true;
00522                pos+=8; 
00523                continue;
00524             }
00525 
00526             if ((buffer[pos+2]==0x7) && (buffer[pos+3]==0x6) && (buffer[pos+4]==0) &&  
00527                   (buffer[pos+5]==0) && (buffer[pos+6]==0) && (buffer[pos+7]==0)) {
00528                find_reset[nr] = true;
00529                if (dooutput) printMessage("TEST4", buffer+pos, " <- reset FIFO!");
00530                pos+=8;
00531                continue;
00532             }
00533 
00534             if ((buffer[pos+2]!=0x7) && (buffer[pos+2] != msgkind[nr])) format_error |= 0x2;
00535             strcpy(suffix, "");
00536 
00537             switch (buffer[pos+2]) {
00538                case 0x02: // EPOCH
00539                   evnum = ((*((uint64_t*) (buffer+pos))) >> 24) & 0xffffffff;
00540                   if ((lastepoch[nr]!=0) && ((evnum - lastepoch[nr]) != 1)) {
00541                      format_error |= 0x20;
00542                      sprintf(suffix, " <- EPOCH 0x%08X  error prev:0x%08X", evnum, lastepoch[nr]);
00543                      lastepoch[nr]++;
00544                   } else {
00545                      sprintf(suffix, " <- EPOCH 0x%08X", evnum);
00546                      lastepoch[nr] = evnum;
00547                   }
00548                   msgkind[nr] = 0x03;
00549                   break;
00550                case 0x03:  // SYNC0
00551                   evnum = (*((uint32_t*) (buffer+pos+4)) >> 6) & 0xffffff;
00552                   if ((lastevnum0[nr]!=0) && (((evnum - lastevnum0[nr]) & 0xffffff) != 1)) {
00553                      format_error |= 0x8;
00554                      sprintf(suffix, " <- SYNC0   0x%06X error prev:0x%06X", evnum, lastevnum0[nr]);
00555                      lastevnum0[nr]++;
00556                   } else {
00557                      sprintf(suffix, " <- SYNC0   0x%06X", evnum);
00558                      lastevnum0[nr] = evnum;
00559                   }
00560                   msgkind[nr] = 0x43;
00561                   break;
00562                case 0x43:  // SYNC1
00563                   evnum = (*((uint32_t*) (buffer+pos+4)) >> 6) & 0xffffff;
00564                   if ((lastevnum1[nr]!=0) && (((evnum - lastevnum1[nr]) & 0xffffff) != 1)) {
00565                      format_error |= 0x10;
00566                      sprintf(suffix, " <- SYNC1   0x%06X error prev:0x%06X", evnum, lastevnum1[nr]);
00567                      lastevnum1[nr]++;
00568                   } else {
00569                      sprintf(suffix, " <- SYNC1   0x%06X", evnum);
00570                      lastevnum1[nr] = evnum;
00571                   }
00572                   msgkind[nr] = 0x02;
00573                   break;
00574                case 0x07: // SYSMSG
00575                   if ((buffer[pos+3]==0x2) && (buffer[pos+4]==0) && (buffer[pos+5]==0) && (buffer[pos+6]==0) && (buffer[pos+7]==0)) {
00576                      loop = maxloop-1;
00577                      find_stop[nr] = true;
00578                      msgkind[nr] = 0x0;
00579                      if ((pos != len-8) && (numrocs==1)) {
00580                         format_error |= 0x40;
00581                         strcpy(suffix, "  <- stopdaq not at the end");
00582                      } else
00583                         strcpy(suffix, "  <- stop DAQ!");
00584                   } else {
00585                      format_error |= 0x2;
00586                      strcpy(suffix, "  <- unexpected");
00587                   }
00588 
00589                   break;
00590 
00591                default:
00592                   format_error |= 0x4;
00593                   strcpy(suffix, "  <- unexpected");
00594                   break;
00595 
00596             }
00597 
00598             if (dooutput) printMessage("TEST4", buffer+pos, suffix);
00599 
00600             pos+=8;
00601          }
00602       }
00603 
00604 
00605       for (unsigned nr=0;nr<numrocs;nr++) {
00606          printf("TEST4:  Results for ROCID 0x%03x\n", ROCID[nr]);
00607 
00608          if (!find_start[nr]) {
00609             printf("TEST4:    Start DAQ message not found\n"); passed = false;
00610          } else
00611             printf("TEST4:    Start DAQ message found in the beginning\n");
00612 
00613          if (find_reset[nr]) {
00614             printf("TEST4:    Reset FIFO message found\n");
00615          } else {
00616             printf("TEST4:    Reset FIFO message not found\n"); passed = false;
00617          }
00618 
00619          if (!nostop) {
00620             if (!find_stop[nr]) {
00621                printf("TEST4:    Stop DAQ message not found\n");
00622                passed = false;
00623             } else {
00624                printf("TEST4:    Stop DAQ message found\n");
00625             }
00626          }
00627       }
00628 
00629       if (format_error!=0) {
00630          if (format_error & 0x1)  printf("TEST4:  ROC ID coded incorrectly into the messages\n");
00631          if (format_error & 0x2)  printf("TEST4:  Messages sequence are wrong\n");
00632          if (format_error & 0x4)  printf("TEST4:  Messages type are wrong\n");
00633          if (format_error & 0x8)  printf("TEST4:  SYNC0 sequence is wrong\n");
00634          if (format_error & 0x10) printf("TEST4:  SYNC1 sequence is wrong\n");
00635          if (format_error & 0x20) printf("TEST4:  EPOCH sequence is wrong\n");
00636          if (format_error & 0x40) printf("TEST4:  Stop DAQ message not in the end\n");
00637          passed = false;
00638       }
00639 
00640       if (!nostop) {
00641          if (usedlm) { 
00642             res = daemon.submitPutDLM(9);
00643             if (res!=0) { printf("TEST4: Stop daq DLM 9 failed res = %u\n", res); passed = false; }
00644             if (usesleep) sleep(1); 
00645          } else 
00646             for (unsigned nr=0;nr<numrocs;nr++) {
00647                res = daemon.submitPut(ROCID[nr], RETID, 0x200104, 0); // stop DAQ
00648                if (res!=0) { printf("TEST4: Stop daq failed res = %u\n", res); passed = false; }
00649             }
00650       }
00651 
00652       if (!nostop) 
00653          for (unsigned nr=0;nr<numrocs;nr++) {
00654             res = daemon.submitPut(ROCID[nr], RETID, 0x010000, 0x0); // disable all GPIO bits
00655             if (res!=0) { printf("TEST4: Reset GPIO failed res = %u\n", res); passed = false; }
00656          }
00657 
00658       for (int n=0;n<NUMBUFFERS;n++) {
00659          daemon.unregisterBuffer(bhandles[n]);
00660          //delete [] buffers[n];
00661       }
00662       free(theBuffer);
00663       printf("TEST4: %s\n", (passed ? "PASS" : "FAIL"));
00664       if (testkind>=0) return passed ? 0 : 1;
00665    }
00666 
00667 
00668    if ((testkind==5) || (testkind<0)) {
00669       printf("\nTEST5: Check access to wrong address with short NOper\n");
00670 
00671       passed = true;
00672 
00673       for (unsigned nr=0;nr<numrocs;nr++) {
00674 
00675          uint32_t addrs[7], values[7], retvals[7];
00676          for (int n=0;n<7;n++) {
00677             addrs[n] = 0x04;  values[n] = 0; retvals[n] = 0;  // VERSION
00678          }
00679 
00680          addrs[5] = 0x05;
00681 
00682          res = daemon.submitNOper(ROCID[nr], RETID, 7, addrs, values, retvals);
00683 
00684          printf("TEST5: ROCID 0x%03x Noper with 15 Gets res = %u\n", ROCID[nr], res);
00685 
00686          if (res==0) {
00687             printf("TEST5: res==0 when Noper failed to complete\n");
00688             passed = false;
00689          }
00690 
00691          for (int n=0; n<7; n++) {
00692             if (dooutput) printf("TEST5:   Get 0x%02x = 0x%08x, ret = %8x\n", addrs[n], values[n], retvals[n]);
00693             if ((n<5) && (retvals[n] != 0)) passed = false;
00694             if ((n==5) && (retvals[n] == 0)) passed = false;
00695          }
00696       }
00697 
00698       printf("TEST5: %s\n", (passed ? "PASS" : "FAIL"));
00699       if (testkind>=0) return passed ? 0 : 1;
00700    }
00701 
00702 
00703    if ((testkind==6) || (testkind<0)) {
00704       printf("\nTEST6: Check access to wrong address with long NOper\n");
00705  
00706       passed = true;
00707 
00708       for (unsigned nr=0;nr<numrocs;nr++) {
00709 
00710          uint32_t addrs[15], values[15], retvals[15];
00711          for (int n=0;n<15;n++) {
00712             addrs[n] = 0x04;  values[n] = 0; retvals[n] = 0;  // VERSION
00713          }
00714 
00715          addrs[13] = 0x05;
00716 
00717          res = daemon.submitNOper(ROCID[nr], RETID, 15, addrs, values, retvals);
00718 
00719          printf("TEST6: Noper ROCID 0x%03x with 15 Gets res = %u\n", ROCID[nr], res);
00720 
00721          if (res==0) {
00722             printf("TEST6: res==0 when Noper failed to complete\n");
00723             passed = false;
00724          }
00725 
00726 
00727          for (int n=0; n<15; n++) {
00728             if (dooutput) printf("TEST6:   Get 0x%02x = 0x%08x, ret = %8x\n", addrs[n], values[n], retvals[n]);
00729             if ((n<13) && (retvals[n] != 0)) passed = false;
00730             if ((n==13) && (retvals[n] == 0)) passed = false;
00731          }
00732       }
00733 
00734       printf("TEST6: %s\n", (passed ? "PASS" : "FAIL"));
00735       if (testkind>=0) return passed ? 0 : 1;
00736    }
00737 
00738 
00739    if ((testkind==7) || (testkind<0)) {
00740       printf("\nTEST7: Simple DAQ application with optics-datagen %s\n", (usedlm ? "with DML" : ""));
00741 
00742       passed = true;
00743 
00744       int frontend[MAXNUMROCS], backend[MAXNUMROCS];
00745 
00746       for (unsigned nr=0;nr<numrocs;nr++) {
00747          value = 0;
00748          res = daemon.submitGet(ROCID[nr], RETID, 0x0, &value);
00749 
00750          frontend[nr] = (value >> 16) & 0xFFFF;
00751          backend[nr]  =  value        & 0xFFFF;
00752 
00753          if ((res!=0) || (backend[nr] != 1)) {
00754             printf("\nTEST7: Only Optics firmware can be used\n");
00755             passed = false;
00756             return 1;
00757          }
00758       }
00759 
00760       void* bhandles[NUMBUFFERS];
00761       uint8_t* buffers[NUMBUFFERS];
00762 
00763       for (int n=0;n<NUMBUFFERS;n++) {
00764          buffers[n] = new uint8_t[BUFFERSIZE];
00765          if (buffers[n]==0) { printf("TEST7: Memory allocation failed - ABORT\n"); passed = false; return 1; }
00766          bhandles[n] = daemon.registerBuffer(BUFFERSIZE, buffers[n]);
00767          if (bhandles[n]==0) { printf("TEST7: Memory registering failed - ABORT\n"); passed = false; return 1; }
00768       }
00769 
00770 
00771       for (unsigned nr=0;nr<numrocs;nr++) {
00772          res = daemon.submitPut(ROCID[nr], RETID, 0x200300, 0); // disable optics datagen 
00773          if (res!=0) { printf("TEST7: Datagen failed res = %u\n", res); passed = false; }
00774 
00775          res = daemon.submitPut(ROCID[nr], RETID, 0x200104, 0); // stop DAQ
00776          if (res!=0) { printf("TEST7: Initial stop daq failed res = %u\n", res); passed = false; }
00777       }
00778 
00779       daemon.submitReset();
00780 
00781 
00782       for (unsigned nr=0;nr<numrocs;nr++) {
00783 
00784          res = daemon.submitPut(ROCID[nr], RETID, 0x10, 0x5); // set ROC number
00785          if (res!=0) { printf("TEST7: Cannot configure ROC number 5 = %u\n", res); passed = false; }
00786 
00787          res = daemon.submitPut(ROCID[nr], RETID, 0x200300, 1); // enable optics datagen 
00788          if (res!=0) { printf("TEST7: Datagen failed res = %u\n", res); passed = false; }
00789 
00790          if ((frontend[nr]==1) || (frontend[nr]==4)) { // NXYTER && newNX
00791             res = daemon.submitPut(ROCID[nr], RETID, 0x400014, 1); // reset FIFO
00792             if (res!=0) { printf("TEST7: Reset FIFO failed res = %u\n", res); passed = false; }
00793             res = daemon.submitPut(ROCID[nr], RETID, 0x400014, 0); // reset FIFO
00794             if (res!=0) { printf("TEST7: Reset FIFO failed res = %u\n", res); passed = false; }
00795          } else 
00796          if (frontend[nr]==2){ //FEET
00797             res = daemon.submitPut(ROCID[nr], RETID, 0x500014, 1); // reset FIFO
00798             if (res!=0) { printf("TEST7: Reset FIFO failed res = %u\n", res); passed = false; }
00799             res = daemon.submitPut(ROCID[nr], RETID, 0x500014, 0); // reset FIFO
00800             if (res!=0) { printf("TEST7: Reset FIFO failed res = %u\n", res); passed = false; }
00801          }
00802       }
00803 
00804       daemon.submitReset();
00805 
00806       if (usedlm)
00807       { res = daemon.submitPutDLM(8); if (usesleep) sleep(1); }
00808       else 
00809          for (unsigned nr=0;nr<numrocs;nr++) 
00810             res = daemon.submitPut(ROCID[nr], RETID, 0x200100, 0); // start DAQ
00811       if (res!=0) { printf("TEST7: Start daq failed res = %u\n", res); passed = false; }
00812 
00813       //      sleep(1);
00814 
00815       int maxloop = 100;
00816 
00817       printf("TEST7: starting DAQ\n"); 
00818 
00819       int msgkind = 0x2;
00820 
00821       bool find_start(false), find_stop(false);
00822       unsigned format_error(0);
00823 
00824       for (int loop = 0; loop<maxloop; loop++) {
00825          int waitcnt = 10000; // about 0.7 sec
00826 
00827          int bufid = loop % NUMBUFFERS;
00828 
00829          unsigned read_size = BUFFERSIZE / 4;
00830 
00831          while (daemon.getFIFOStatus() / 4 < read_size) {
00832             if (--waitcnt == 0) {
00833                read_size = daemon.getFIFOStatus() / 4;
00834                break;
00835             }
00836          }
00837 
00838          if (read_size==0) {
00839             if (loop==0) {
00840                printf("TEST7: No data to read, stop DAQ\n"); 
00841                passed = false;
00842             }
00843             break;
00844          }
00845 
00846          daemon.readDMAserialized(0x0, bhandles[bufid], read_size, 0, false, true, 0.);
00847 
00848          // submit stop daq in the beginning
00849          if ((loop == 10) && !nostop)  {
00850             if (!usedlm) {
00851                for (unsigned nr=0;nr<numrocs;nr++)
00852                   res = daemon.submitPut(ROCID[nr], RETID, 0x200104, 0); // stop DAQ
00853             } else {
00854                res = daemon.submitPutDLM(9); if (usesleep) sleep(1);
00855             }
00856             if (res!=0) { printf("TEST7: Stop daq failed res = %u\n", res); passed = false; }
00857          }
00858 
00859          printf("TEST7:  DMA operation %d read_size %d fifo %u\n", loop, read_size*4, daemon.getFIFOStatus());
00860 
00861          int pos(0), len(read_size*4);
00862 
00863          uint8_t* buffer = buffers[bufid];
00864 
00865          if (loop==0) {
00866             if ((buffer[pos+2]==0x7) && (buffer[pos+3]==0x1) && (buffer[pos+4]==0) &&  
00867                   (buffer[pos+5]==0) && (buffer[pos+6]==0) && (buffer[pos+7]==0)) {
00868                printf("TEST7:  Start DAQ message found in the beginning\n");
00869                find_start = true;
00870                pos+=8; 
00871             }
00872 
00873             if ((buffer[pos+2]==0x7) && (buffer[pos+3]==0x6) && (buffer[pos+4]==0) &&  
00874                   (buffer[pos+5]==0) && (buffer[pos+6]==0) && (buffer[pos+7]==0)) {
00875                printf("TEST7:  Reset FIFO message found\n");
00876                pos+=8;
00877             }
00878          }
00879 
00880 
00881          if (dooutput) 
00882             for (unsigned n=0;n<read_size*4;n+=8)
00883                printf("TEST7: Msg: %02x%02x-%02x%02x-%02x%02x-%02x%02x\n", 
00884                      buffer[n+0], buffer[n+1], buffer[n+2], buffer[n+3],
00885                      buffer[n+4], buffer[n+5], buffer[n+6], buffer[n+7]);
00886 
00887          //         if (loop >= maxloop/2) {
00888          if ((buffer[len-6]==0x7) && (buffer[len-5]==0x2) && (buffer[len-4]==0) &&
00889                (buffer[len-3]==0) && (buffer[len-2]==0) && (buffer[len-1]==0)) {
00890             printf("TEST7:  Stop DAQ message found at the end\n");
00891             loop = maxloop-1;
00892             len -= 8;
00893             find_stop = true;
00894             break;
00895             //               passed = false;
00896          }
00897          //         }
00898 
00899          // check values 
00900          msgkind=(buffer[pos+6]<<8)+buffer[pos+7];
00901          while (pos<len) {
00902             if ((buffer[pos]!=5) || (buffer[pos+1]!=0)) format_error |= 0x1;
00903             if ( (buffer[pos+6]<<8)+buffer[pos+7] != ((msgkind  )&0xFFFF)) {
00904                format_error |= 0x2;
00905                //printf("Wrong value! Received: %x, expected %x\n",(buffer[pos+6]<<8)+buffer[pos+7], msgkind);
00906             }
00907             if ( (buffer[pos+4]<<8)+buffer[pos+5] != ((msgkind+1)&0xFFFF)) {
00908                format_error |= 0x2;
00909                //printf("Wrong value! Received: %x, expected %x\n",(buffer[pos+4]<<8)+buffer[pos+5], msgkind+1);
00910             }
00911             if ( (buffer[pos+2]<<8)+buffer[pos+3] != ((msgkind+2)&0xFFFF)) {
00912                format_error |= 0x2;
00913                //printf("Wrong value! Received: %x, expected %x\n",(buffer[pos+2]<<8)+buffer[pos+3], msgkind+2);
00914             }
00915             msgkind=(msgkind+3)&0xFFFF;
00916             pos+=8;
00917          }
00918       }
00919 
00920       if (!find_start) {
00921          printf("TEST7:  Start DAQ message not found\n"); passed = false;
00922       }
00923 
00924       if (!find_stop && !nostop) {
00925          printf("TEST7:  Stop DAQ message not found\n"); passed = false;
00926       }
00927 
00928       if (format_error!=0) {
00929          if (format_error & 0x1) printf("TEST7:  ROC ID coded incorrectly into the messages\n");
00930          if (format_error & 0x2) printf("TEST7:  Messages sequence are wrong\n");
00931          if (format_error & 0x4) printf("TEST7:  Messages type are wrong\n");
00932          passed = false;
00933       }
00934 
00935 
00936       if (!nostop) {
00937          if (usedlm) { 
00938             res = daemon.submitPutDLM(9); if (usesleep) sleep(1);
00939          } else {
00940             for (unsigned nr=0;nr<numrocs;nr++) 
00941                res = daemon.submitPut(ROCID[nr], RETID, 0x200104, 0); // stop DAQ
00942          }
00943          if (res!=0) { printf("TEST7: Stop daq failed res = %u\n", res); passed = false; }
00944       }
00945 
00946       if (!nostop) {
00947          for (unsigned nr=0;nr<numrocs;nr++) 
00948             res = daemon.submitPut(ROCID[nr], RETID, 0x200300, 0); // disable optics datagen 
00949          if (res!=0) { printf("TEST7: Disable Datagen failed res = %u\n", res); passed = false; }
00950       }
00951 
00952       for (int n=0;n<NUMBUFFERS;n++) {
00953          daemon.unregisterBuffer(bhandles[n]);
00954          delete [] buffers[n];
00955       }
00956 
00957       printf("TEST7: %s\n", (passed ? "PASS" : "FAIL"));
00958       if (testkind>=0) return passed ? 0 : 1;
00959    }
00960 
00961 
00962    if (testkind==8) {
00963       printf("\nTEST8: read data from FIFO on maximum speed\n");
00964 
00965       void* bhandle;
00966       uint8_t* buffer;
00967 
00968       buffer = new uint8_t[BUFFERSIZE];
00969       bhandle = daemon.registerBuffer(BUFFERSIZE, buffer);
00970       if (bhandle==0) { printf("TEST8: Memory registering failed - ABORT\n"); passed = false; return 1; }
00971 
00972       int maxloop = 10000;
00973       unsigned long total = 0;
00974 
00975       printf("TEST8: start reading fifo = 0x%x\n", daemon.getFIFOStatus()); 
00976 
00977       clock_t t1 = clock();
00978       
00979       for (int loop = 0; loop<maxloop; loop++) {
00980          unsigned read_size = BUFFERSIZE / 4;
00981          uint32_t fifo_size = daemon.getFIFOStatus() / 4;
00982          if (fifo_size < read_size) read_size = fifo_size;
00983          if (read_size==0) break;
00984          daemon.readDMAserialized(0x0, bhandle, read_size, 0, false, true, 0.);
00985          total += read_size;
00986       }
00987 
00988       clock_t t2 = clock();
00989       
00990       double tm = (t2-t1)*1./CLOCKS_PER_SEC;
00991       
00992       double sz_mb = total/1024./256.;
00993 
00994       daemon.unregisterBuffer(bhandle);
00995       delete [] buffer;
00996       
00997       printf("TEST8: stop reading fifo = 0x%x total read = %3.1f MB\n", daemon.getFIFOStatus(), sz_mb); 
00998       printf("TEST8: time = %3.1f s  rate = %3.1f MB/s  clocks_pre_sec %ld\n", tm, (tm>0. ? sz_mb/tm : 0.), CLOCKS_PER_SEC);
00999       
01000       if (testkind>=0) return passed ? 0 : 1;
01001    }
01002 
01003 
01004    if (testkind==9) {
01005       printf("\nTEST9: Test DLMs\n");
01006 
01007       passed = true;
01008 
01009       int frontend, backend;
01010       
01011       value = 0;
01012       res = daemon.submitGet(ROCID[0], RETID, 0x0, &value);
01013 
01014       frontend = (value >> 16) & 0xFFFF;
01015       backend  =  value        & 0xFFFF;
01016 
01017       if ((res!=0) || (backend != 1)) {
01018          printf("\nTEST9: Only Optics firmware can be used\n");
01019          passed = false;
01020          return 1;
01021       }
01022 
01023      res = daemon.submitGet(ROCID[0], RETID, 0x200000, &value);
01024      if ((res!=0) || value < 0x2000104 ) {
01025          printf("\nTEST9: Only Optics firmware version 2.0.1.4 or higher can be used\n");
01026          passed = false;
01027          return 1;
01028       }
01029 
01030       int maxloop = 10000;
01031       unsigned int dlm_rec, last_dlm_rec, dlm_send;
01032 
01033       printf("TEST9: start testing ...\n"); 
01034 
01035       res = daemon.submitPutDLM(0); if (usesleep) sleep(1);
01036       res = daemon.submitPutDLM(0); if (usesleep) sleep(1);
01037       res = daemon.submitPutDLM(0); if (usesleep) sleep(1);
01038 
01039       for (int loop = 1; loop<maxloop; loop++) {
01040                         dlm_send      = loop & 0xF;
01041 
01042                         res = daemon.submitPutDLM(dlm_send); if (usesleep) sleep(1);
01043 
01044                         res = daemon.submitGet(ROCID[0], RETID, 0x201004, &value);
01045                         last_dlm_rec = (value >> 4) & 0xF;
01046                         dlm_rec      =  value       & 0xF;
01047 
01048                         if (dlm_send != dlm_rec) {
01049                                 printf("TEST9: Wrong DLM received in loop %d. Received: 0x%x , Send: 0x%x\n", loop, dlm_rec, dlm_send);
01050                                 passed = false;
01051                                 break;
01052                         }
01053                         if ( ((dlm_rec-last_dlm_rec)&0xF) != 1 ) {
01054                                 printf("TEST9: Wrong history in loop %d. Most recent DLM: 0x%x , Second most recent DLM: 0x%x\n", loop, dlm_rec, last_dlm_rec);
01055                                 passed = false;
01056                                 break;
01057                         }
01058       }
01059 
01060                 
01061       printf("TEST9: DLM history: 0x%08x\n", value);
01062       printf("TEST9: %s\n", (passed ? "PASS" : "FAIL"));
01063       if (testkind>=0) return passed ? 0 : 1;
01064    }
01065 
01066    if ((testkind==10) || (testkind<0)) {
01067       printf("\nTEST10: Check ROC firmware versions\n");
01068 
01069       bool passed = true;
01070 
01071       for (unsigned nr=0;nr<numrocs;nr++) {
01072          value = 0;
01073          res = daemon.submitGet(ROCID[nr], RETID, 0x4, &value);
01074          printf("TEST10: ROCID 0x%03x  HWV =    %u.%u.%u.%u 0x%08x  res = %u\n", ROCID[nr], value >> 24, (value >> 16) & 0xff, (value >> 8) & 0xff, value & 0xff, value, res);
01075          if ((value < 0x02000000) || (res != 0)) passed = false;
01076          value = 0;
01077          res = daemon.submitGet(ROCID[nr], RETID, 0x200000, &value);
01078          printf("TEST10: ROCID 0x%03x  OPTIC =  %u.%u.%u.%u 0x%08x  res = %u\n", ROCID[nr], value >> 24, (value >> 16) & 0xff, (value >> 8) & 0xff, value & 0xff, value, res);
01079          if ((value < 0x02000000) || (res != 0)) passed = false;
01080          value = 0;
01081          res = daemon.submitGet(ROCID[nr], RETID, 0x400000, &value);
01082          if (res==0) 
01083             printf("TEST10: ROCID 0x%03x  nXYTER = %u.%u.%u.%u 0x%08x  res = %u\n", ROCID[nr], value >> 24, (value >> 16) & 0xff, (value >> 8) & 0xff, value & 0xff, value, res);
01084          value = 0;
01085          res = daemon.submitGet(ROCID[nr], RETID, 0x500000, &value);
01086          if (res==0) 
01087             printf("TEST10: ROCID 0x%03x  FEET =   %u.%u.%u.%u 0x%08x  res = %u\n", ROCID[nr], value >> 24, (value >> 16) & 0xff, (value >> 8) & 0xff, value & 0xff, value, res);
01088       }
01089 
01090       printf("TEST10: %s\n", (passed ? "PASS" : "FAIL"));
01091       if (testkind>=0) return passed ? 0 : 1;
01092    }
01093 
01094    if (testkind==11) {
01095 
01096       printf("TEST11: simple DAQ test for SP605/SPADIC\n"); 
01097       
01098       // ======= any kind of SPADIC configuration ====================
01099       // for (unsigned nr=0;nr<numbrds;nr++) 
01100       //    res = daemon.submitPut(ROCID[nr], RETID, 0x200300, 0); 
01101 
01102       // ======= GPIO config ====================
01103       for (unsigned nr=0;nr<numrocs;nr++) {
01104          res = daemon.submitPut(ROCID[nr], RETID, 0x010000,  0x900); // GPIO: SYNC_S1 in loop back mode
01105          res = daemon.submitPut(ROCID[nr], RETID, 0x01010C,  1);     // GPIO: scale down - 1
01106          res = daemon.submitPut(ROCID[nr], RETID, 0x200100,  1);     // ROC_OPTICS_START_DAQ
01107 //         res = daemon.submitPut(ROCID[nr], RETID, 0x200300,  1);     // ROC_OPTICS_DATAGEN
01108          
01109       }
01110 
01111       
01112       printf("TEST11: issue DLM8\n"); 
01113       res = daemon.submitPutDLM(8); 
01114 
01115       void* bhandle;
01116       uint8_t* buffer;
01117 
01118       buffer = new uint8_t[BUFFERSIZE];
01119       bhandle = daemon.registerBuffer(BUFFERSIZE, buffer);
01120       if (bhandle==0) { printf("TEST11: Memory registering failed - ABORT\n"); passed = false; return 1; }
01121 
01122       int maxloop = repeat_cnt > 0 ? repeat_cnt : 1000;
01123       unsigned long total = 0;
01124 
01125       printf("TEST11: start reading fifo = 0x%x maxloop = %d\n", daemon.getFIFOStatus(), maxloop); 
01126 
01127       clock_t t1 = clock();
01128       
01129       int outcnt(0);
01130       
01131       for (int loop = 0; loop<maxloop; loop++) {
01132 
01133          res = daemon.submitPutDLM(11);
01134          
01135          // res = daemon.submitPut(ROCID[0], RETID, 0x2f0040, loop); 
01136          // res = daemon.submitPut(ROCID[0], RETID, 0x200, loop); // ROC_ADDSYSMSG - generates SYS message
01137          
01138 
01139          unsigned read_size = BUFFERSIZE / 4;
01140          uint32_t fifo_size = daemon.getFIFOStatus() / 4;
01141          if (fifo_size < read_size) read_size = fifo_size;
01142          
01143          // always read only even number of 4-bytes words - to be able process it correctly
01144          read_size = (read_size / 2) * 2;
01145          if (read_size==0) { 
01146             usleep(10000); 
01147             continue; 
01148          }
01149          daemon.readDMAserialized(0x0, bhandle, read_size, 0, false, true, 0.);
01150          total += read_size;
01151 
01152          if (dooutput) {
01153             uint64_t* p = (uint64_t*)  buffer;
01154             for (unsigned n=0;n<read_size/2;n++) {
01155                printf(" %16lx", (long unsigned) p[n]);
01156                if (n % 4 == 3) printf("\n");
01157             }
01158             if (read_size % 8 != 0) printf("\n");
01159 
01160             sp605::Iterator iter;
01161             iter.assign(buffer, read_size*4);
01162 
01163             while (iter.next())
01164                iter.printMessage();
01165 
01166          }
01167 
01168 
01169 
01170 /*         if (dooutput) {
01171             uint32_t* p = (uint32_t*)  buffer;
01172             for (unsigned n=0;n<read_size;n+=2) {
01173                printf(" %08x %08x", (unsigned) p[n], (unsigned) p[n+1]);
01174                if (++outcnt % 4 == 0) printf("\n");
01175             }
01176          }
01177 */
01178  
01179 /*         if (dooutput) {
01180             uint16_t* p = (uint16_t*)  buffer;
01181             for (unsigned n=0;n<read_size*2;n++) {
01182                printf(" %04x", (unsigned) p[n]);
01183                if (++outcnt % 16 == 0) printf("\n");
01184             }
01185          }
01186 */
01187       }
01188  
01189       if (outcnt % 16 != 0) printf("\n");
01190 
01191       clock_t t2 = clock();
01192       
01193       double tm = (t2-t1)*1./CLOCKS_PER_SEC;
01194       
01195       double sz_mb = total/1024./256.;
01196 
01197       daemon.unregisterBuffer(bhandle);
01198       delete [] buffer;
01199       
01200       printf("TEST11: issue DLM9\n"); 
01201       res = daemon.submitPutDLM(9); 
01202 
01203       for (unsigned nr=0;nr<numrocs;nr++) {
01204          res = daemon.submitPut(ROCID[nr], RETID, 0x200104,  1);     // ROC_OPTICS_STOP_DAQ
01205       }
01206 
01207 
01208       printf("TEST11: stop reading fifo = 0x%x total read = %3.1f MB\n", daemon.getFIFOStatus(), sz_mb); 
01209       printf("TEST11: time = %3.1f s  rate = %3.1f MB/s\n", tm, (tm>0. ? sz_mb/tm : 0.));
01210 
01211       return 0;
01212    }
01213 
01214 
01215 
01216   return 0;
01217 }

Generated on Tue Dec 10 2013 04:52:16 for ROCsoft by  doxygen 1.7.1