Index: /trunk/FACT++/src/EventBuilder.c
===================================================================
--- /trunk/FACT++/src/EventBuilder.c	(revision 11292)
+++ /trunk/FACT++/src/EventBuilder.c	(revision 11293)
@@ -71,4 +71,7 @@
  int gp_runStat ;
  int gw_runStat ;
+
+ int gi_memStat = +1 ;
+
  int32_t gi_myRun ;
 
@@ -307,6 +310,10 @@
 
    if ( gj.usdMem + needmem + headmem > g_maxMem) {
-        snprintf(str,MXSTR,"no memory left to keep event %d",evID) ;
-        factOut(kError,882, str ) ;
+        gj.maxMem = gj.usdMem + needmem + headmem ;
+        if (gi_memStat>0 ) {
+           gi_memStat = -99 ;
+           snprintf(str,MXSTR,"no memory left to keep event %d",evID) ;
+           factOut(kError,882, str ) ;
+        }
         return -11 ;
    }
@@ -353,4 +360,6 @@
    if (gj.usdMem > gj.maxMem ) gj.maxMem = gj.usdMem ; 
 
+   gj.rateNew++ ;
+
    //register event in 'active list (reading)'
 
@@ -360,7 +369,4 @@
    evtIdx[i] = evtCtrl.lastPtr ;
 
-   gj.readEvt++ ;           //#events read
-   gj.evtBuf++ ;
-
 
 snprintf(str,MXSTR,"%5d start new evt  %8d %8d %2d",evID,i,evtCtrl.lastPtr,0);
@@ -368,5 +374,4 @@
    evtCtrl.lastPtr++ ;
    if (evtCtrl.lastPtr == MAX_EVT*MAX_RUN ) evtCtrl.lastPtr = 0;
-
 
    gi.evtGet++ ;
@@ -426,5 +431,9 @@
 
    gj.usdMem = gj.usdMem - freemem - headmem;
-   gj.evtBuf-- ;
+
+   if (gi_memStat < 0 ) {
+      if (gj.usdMem <= 0.75 * gj.maxMem ) gi_memStat = +1 ;
+   }
+
 
    return 0 ;
@@ -479,7 +488,5 @@
   int actBoards = 0, minLen ;
   int32_t jrd ;
-  int64_t stat[9] ;
   int boardId, roi,drs,px,src,pixS,pixH,pixC,pixR,tmS ;
-  uint qtot = 0, qread = 0, qconn = 0 ;
 
   int goodhed = 0 ;
@@ -524,10 +531,16 @@
 
   resetEvtStat(); 
-  gj.usdMem = gj.maxMem = 0 ;
-  gj.evtBuf = 0 ;
+  gj.usdMem = gj.maxMem = gj.xxxMem = 0 ;
+  gj.totMem = g_maxMem ;
+  gj.bufNew = gj.bufEvt = 0 ;
+  gj.evtSkip= gj.evtWrite = gj.evtErr = 0 ;
 
   for (k=0; k<NBOARDS; k++) {
      gi_NumConnect[k]=0;
      gi.numConn[k]   =0;
+     gj.numConn[k]   =0;
+     gj.errConn[k]   =0;
+     gj.rateBytes[k] =0;
+     gj.totBytes[k]  =0;
   }
 
@@ -564,5 +577,4 @@
     gi_runStat = g_runStat;
     gj.readStat= g_runStat;
-    gj.totMem  = g_maxMem ;
 //  if (gi.totMem < 50000000 ) gi.totMem = 500000000 ;
 
@@ -575,4 +587,5 @@
           gi_NumConnect[ b ] = 0 ;                  //must close all connections
           gi.numConn[ b ] = 0; 
+          gj.numConn[ b ] = 0; 
           if (            sockDef[b] == 0) s0= 0 ;  //sockets to be defined and opened   
           else if (g_port[b].sockDef == 0) s0=-1 ;  //sockets to be destroyed
@@ -626,4 +639,5 @@
           gi_NumConnect[ b ]++ ;
           gi.numConn[ b ]++ ;
+          gj.numConn[ b ]++ ;
           snprintf(str,MXSTR,"+++connect %d %d",b,gi.numConn[ b ]);
           factOut(kInfo,-1, str ) ;
@@ -637,5 +651,4 @@
 
           if (jrd >0 ) {
-             qread+=jrd ;
              debugStream(i,&rd[i].rBuf->B[ rd[i].bufPos],jrd) ;
           }
@@ -648,4 +661,5 @@
              gi_NumConnect[ b ]-- ;
              gi.numConn[ b ]-- ;
+             gj.numConn[ b ]-- ;
 
           } else if ( jrd<0 ) {           //did not read anything
@@ -660,4 +674,5 @@
 
         gi.gotByte[ b ] += jrd ;
+        gj.rateBytes[b] += jrd ;
 
         if ( rd[i].bufTyp <0 ) { // we are skipping this board ...
@@ -690,5 +705,5 @@
              if (evID < 0) {
                 xwait.tv_sec = 0;
-                xwait.tv_nsec= 20000000 ;  // sleep for ~20 msec
+                xwait.tv_nsec= 10000000 ;  // sleep for ~10 msec
                 nanosleep( &xwait , NULL ) ;
                 goto EndBuf1 ; //hope there is free space next round
@@ -834,5 +849,4 @@
     gi.numRead[ numok ] ++ ;
 
-    int qwait=0, qdel=0, qskip=0 ;
     g_actTime = time(NULL) ;
     if ( g_actTime > gi_SecTime ) {
@@ -846,25 +860,23 @@
        if ( kd < 0 ) kd+= (MAX_EVT*MAX_RUN) ;
 
+       gj.bufNew = gj.bufEvt = 0 ;
        int k1=evtCtrl.frstPtr;
        for ( k=k1; k<(k1+kd); k++ ) {
           int k0 = k % (MAX_EVT*MAX_RUN) ;
 //would be better to use bitmaps for evtStat (allow '&' instead of multi-if)
+
           if (evtCtrl.evtStat[k0] > 0
            && evtCtrl.evtStat[k0] < 90 ) {
-
-           qwait++; 
-
-           if( evtCtrl.pcTime[k0] < g_actTime-10 ) {
-             int id =evtCtrl.evtBuf[k0] ;
-             snprintf(str,MXSTR,"%5d skip short evt %8d %8d %2d",mBuffer[id].evNum,evtCtrl.evtBuf[k0],k0 ,evtCtrl.evtStat[k0]);
-             factOut(kWarn,601, str ) ;
-             evtCtrl.evtStat[k0] = 91 ;      //timeout for incomplete events
-             gi.evtSkp++ ;
-             gi.evtTot++ ;    
-             gj.skipEvt++; 
-             qskip++; 
-           } 
-
-
+             gj.bufNew++ ;   //incomplete event in Buffer
+
+             if ( evtCtrl.pcTime[k0] < g_actTime-10 ) {
+                int id =evtCtrl.evtBuf[k0] ;
+                snprintf(str,MXSTR,"%5d skip short evt %8d %8d %2d",mBuffer[id].evNum,evtCtrl.evtBuf[k0],k0 ,evtCtrl.evtStat[k0]);
+                factOut(kWarn,601, str ) ;
+                evtCtrl.evtStat[k0] = 91 ;      //timeout for incomplete events
+                gi.evtSkp++ ;
+                gi.evtTot++ ;    
+                gj.evtSkip++; 
+             } 
           } else if (evtCtrl.evtStat[k0] >= 900 ) {
 
@@ -874,6 +886,8 @@
               mBufFree(id) ;               //event written--> free memory
               evtCtrl.evtStat[k0] = -1; 
-              qdel++; 
-              qtot++;
+              gj.evtWrite++ ;
+              gj.rateWrite++ ;
+          } else if (evtCtrl.evtStat[k0] >= 900 ) {
+             gj.bufEvt++ ;   //complete event in Buffer
           }
 
@@ -883,22 +897,17 @@
        }
 
-qconn=0 ;
-int ib ;
-for (ib=0; ib<NBOARDS; ib++) qconn+=gi_NumConnect[ib] ;
-        stat[0]= qwait;
-        stat[1]= qskip;
-        stat[2]= qdel ;
-        stat[3]= qtot ;
-        stat[4]= gj.usdMem ;
-        stat[5]= qread;
-        stat[6]= qconn;
-
-qread=0 ;
+
        gj.deltaT = 1000 ;   //temporary, must be improved
+
+       int b;
+       for ( b=0; b<NBOARDS; b++) gj.totBytes[k] +=gj.rateBytes[b] ;
+       gj.totMem  = g_maxMem ;
+       if (gj.maxMem >= gj.xxxMem) gj.xxxMem = gj.maxMem ;
 
        factStat(gj);
        factStatNew(gi) ;
 
-       gj.readEvt = gj.procEvt = gj.writEvt = gj.skipEvt = 0 ;
+       gj.rateNew = gj.rateWrite = 0 ;
+       for ( b=0; b<NBOARDS; b++) gj.rateBytes[k] =0 ;
     }
 
@@ -948,4 +957,5 @@
        gi_NumConnect[ i/7 ]-- ;
        gi.numConn[ i/7 ]-- ;
+       gj.numConn[ i/7 ]-- ;
     }
  }
@@ -1074,5 +1084,5 @@
 
            int i=eventCheck(mBuffer[id].FADhead,mBuffer[id].fEvent) ;
-           gj.procEvt++ ;
+//         gj.procEvt++ ;
            gi.procTot++ ;
            numProc++ ;
@@ -1259,5 +1269,5 @@
                  snprintf(str,MXSTR,"%5d successfully wrote for run %d id %5d",ievt,irun,k0);
                  factOut(kDebug,504, str ) ;
-                 gj.writEvt++ ;
+//               gj.writEvt++ ;
               } else {
                  snprintf(str,MXSTR,"W error writing event for run %d",irun) ;
@@ -1407,9 +1417,4 @@
    }
 
-   gj.evtBuf  =
-   gj.readEvt =
-   gj.procEvt =
-   gj.writEvt =
-   gj.skipEvt = 0 ;
 
 //start all threads (more to come) when we are allowed to ....
Index: /trunk/FACT++/src/FAD.h
===================================================================
--- /trunk/FACT++/src/FAD.h	(revision 11292)
+++ /trunk/FACT++/src/FAD.h	(revision 11293)
@@ -79,5 +79,5 @@
 uint16_t roi;
 uint16_t filling;
-uint16_t adc_data[];
+ int16_t adc_data[];
 } __attribute__((__packed__)) PCHANNEL;
 
@@ -287,16 +287,32 @@
    int32_t  writStat ;          //write thread
 
-  //info about some rates
+  //info about (current state of) the buffer 
+   int32_t  bufNew ;            //# incomplete events in buffer
+   int32_t  bufEvt ;            //# complete events in buffer
+   uint64_t totMem;             //# Bytes available in Buffer
+   uint64_t usdMem;             //# Bytes currently used
+   uint64_t xxxMem;             //max # Bytes ever used  **
+   uint64_t maxMem;             //max # Bytes used during past cycle
+
+  //counters
+   int32_t  evtSkip ;           //# incomplete Events skipped (timeout)
+   int32_t  evtWrite ;          //# Events written (or flushed if noWrite) 
+   int32_t  evtErr ;            //# Events with errors 
+
+  //rates
    int32_t  deltaT ;            //time in milli-seconds for rates
-   int32_t  readEvt ;           //#events read
-   int32_t  procEvt ;           //#events processed
-   int32_t  writEvt ;           //#events written
-   int32_t  skipEvt ;           //#events skipped
-
-  //some info about current state of event buffer (snapspot)
-    int32_t evtBuf;             //#Events currently waiting in Buffer
-   uint64_t totMem;             //#Bytes available in Buffer
-   uint64_t usdMem;             //#Bytes currently used
-   uint64_t maxMem;             //max #Bytes used during past Second
+   int32_t  rateNew ;           //#New start events recieved
+   int32_t  rateWrite ;         //#Complete events written (or flushed)
+
+  //connections
+   int8_t   numConn[NBOARDS] ;  //#connections per board (at the moment)
+   int32_t  errConn[NBOARDS] ;  //#I/O errors per board (counter)
+   int32_t  rateBytes[NBOARDS]; //#Bytes read this cycle  **
+   int64_t  totBytes[NBOARDS];  //#Bytes read (counter)
+
+
+  // ** // if counter and rates exist, do only update the rates in
+  // ** // real time; 
+  // ** // counters will be updated only once per cycle based on rates
 
 }  __attribute__((__packed__)) GUI_STAT ;         //EventBuilder Status
