#include <stdio.h>
 
#include <stdlib.h>
 
#include <string.h>
 
#include <unistd.h>
 
#include <sys/mman.h>
 
#include <sys/ioctl.h>
 
#include <errno.h>
 
#include <signal.h>
 
#include <ctype.h>
 
#include <time.h>
 
#include <sys/time.h>
 
 
 
#include "wusbxx_dll.h" /* the header of the shared library */
 
#include "daq.h"
 
 
 
#define DEVICE_NAME "/dev/cc32_1"
 
#define PRRES(X) printf(">>> %s -> %d\n",#X,(X))
 
 
 
 
 
 
 
/* definiram lokacije enot*/
 
//#define NTDC 23         /* TDC LeCroy 2277*/
 
#define NTDC 16         /* TDC LeCroy 2277*/
 
#define END_MARKER 0xFAF5
 
int ctrlc=0;
 
int timer_out=0;
 
 
 
void SigInt (int sig)
 
{
 
    ctrlc = 1;
 
    timer_out=1;
 
   
 
}
 
 
 
struct sigaction oact;
 
void timerast (int signumber)
 
{
 
    timer_out = 1;
 
}
 
 
 
void tmlnk (int tout)
 
{
 
    timer_out = 0;
 
    struct sigaction act;
 
    struct itimerval tdelay;
 
 
 
    act.sa_handler = timerast;
 
    sigemptyset (&act.sa_mask);
 
    act.sa_flags = 0;
 
 
 
    tdelay.it_value.tv_sec = tout / 100;
 
    tdelay.it_value.tv_usec = 10000 * (tout % 100);
 
    tdelay.it_interval.tv_sec = 0;
 
    tdelay.it_interval.tv_usec = 0;
 
 
 
    if (sigaction (SIGALRM, &act, &oact) < 0)
 
{
 
    }
 
    if (setitimer (ITIMER_REAL, &tdelay, NULL) < 0)
 
    {
 
    }
 
}
 
 
 
void tmulk ()
 
{
 
    struct itimerval tdelay;
 
 
 
    tdelay.it_value.tv_sec = 0;
 
    tdelay.it_value.tv_usec = 0;
 
    tdelay.it_interval.tv_sec = 0;
 
    tdelay.it_interval.tv_usec = 0;
 
 
 
    if (setitimer (ITIMER_REAL, &tdelay, NULL) < 0)
 
    {
 
    }
 
    if (sigaction (SIGALRM, &oact, NULL) < 0)
 
    {
 
    }
 
}
 
 
 
 
 
 
 
 
 
void CAMAC_status(void)
 
{
 
  unsigned short id,fpga,modid,inhibit,lam;
 
  unsigned short dum;
 
  
 
 
 
  long cres;
 
  int q,x;  
 
 
 
  CSSA_RQX(0,0,0,&cres,&q,&x);
 
  dum = cres;
 
  id   = (dum & 0xF000) >> 12;
 
  fpga = (dum & 0x0F00) >> 8;   
 
  modid =  (dum & 0x00F0) >> 4; 
 
  q      =  (dum & 0x0008) >> 3;
 
  x      =  (dum & 0x0004) >> 2;
 
  inhibit=  (dum & 0x0002) >> 1;
 
  lam    =  (dum & 0x0001);     
 
  printf ("CC32 CSR ID=%x FPGA=%x modID=%x Q=%d X=%d INHIBIT=%d LAM=%d \n",id
,fpga
,modid
, q
,x
,inhibit
,lam
);  
}
 
 
 
int daq::init(){
 
 
 
  printf("DAQ init at 0x%x\n",(unsigned int *) udev
);  
  if (udev == NULL) connect();
 
  if (udev 
== NULL
) printf("udev == NULL\n");  
  xxusb_register_write(udev,1,0x0); // Stop DAQ mode
 
  while (xxusb_usbfifo_read(udev, (int*) stackdump,BUFF_L,100)>0); 
 
  
 
  printf("DAQ init finished\n");  
  CCCZ;
 
  CCCC;
 
 
 
  CREM_I;
 
  long cres;
 
  int q,x;  
 
 
 
  // set status registerdevices_find
 
  //int tdcreg2277=0x8C00; // status register common start (green LED),Front panel timeout ,leading+trailing
 
  //  tdcreg2277= 0xC00;   //  status register common stop (red LED)                        ,leading + trailing edge recording
 
  int  tdcreg2277= 0xCC00; //  status register common start (green LED),8192 ns timeout     ,leading+trailing
 
  
 
 CSSA_WQX(NTDC,0,17,tdcreg2277,&q,&x);
 
 CSSA_RQX(NTDC,0,17,&cres,&q,&x);
 
  
 
  printf("LC2277 SetRegister 0x%04x GetRegister 0x%04x\n",tdcreg2277
,(unsigned int)cres
);  
  
 
  CAMAC_status();
 
 
 
  // listmode data -----------------------------------------------
 
 
 
    long k=1;
 
    
 
 
 
  /*
 
    stackwrite[k++]=(NAF(NTDC,0,8))| 0x8000 ; // test lam
 
    stackwrite[k++]=0x80 ; // wait for lam 
 
 
 
 
 
    stackwrite[k++]=(NAF(NTDC,1,27))| 0x8000;  // test buffering
 
    stackwrite[k++]=0x10 | 0x8000 ; //until Q=0
 
    stackwrite[k++]=0xF ; //max repetitions
 
 
 
    stackwrite[k++]=NAFS(0,0,16);
 
    stackwrite[k++]=0xbeef;
 
 
 
    stackwrite[k++]=(NAF(NTDC,9,27))| 0x8000;  // test buffering
 
    stackwrite[k++]=0x10 | 0x8000 ; //until Q=0
 
    stackwrite[k++]=0xFF ; //max repetitions
 
 
 
    stackwrite[k++]=NAFS(0,0,16);
 
    stackwrite[k++]=0xbeef;
 
*/
 
 
 
 
 
    stackwrite[k++]=(NAF(NTDC,0,0))| 0x8000;  // read TDC
 
    stackwrite[k++]=0x10 | 0x8000 ; //until Q=0
 
    stackwrite[k++]=0xF ; //max repetitions
 
   
 
    stackwrite[k++]=NAF(NTDC,0,9) ; // clear tdc
 
 
 
    stackwrite[k++]=NAF(NTDC,0,10) ; // clear lam
 
 
 
    
 
//    stackwrite[k++]=NAF(NTDC,0,1);  // read status register
 
    stackwrite[k++]=NAFS(0,0,16);
 
    stackwrite[k++]=END_MARKER;
 
    stackwrite[0]=k-1;
 
 
 
    for(unsigned int i
=0;i
<stackwrite
[0];i
++) printf("0x%04lx\n",stackwrite
[i
+1]);  
    
 
    CAMAC_LED_settings(udev, 1,1,0,0);
 
    xxusb_stack_write(udev,0x2,(long int *)stackwrite);
 
    PRRES(xxusb_stack_read(udev,0x2,(long int *) stackdata));
 
    for(int i
=0;i
<13;i
++) printf("0x%04lx\n",stackdata
[i
]);  
 
 
    PRRES(CAMAC_register_read(udev,0,&k));
 
    char tbline[300];
 
    sprintf(tbline
,"Firmware ID -> 0x%08lX",k
);  
   
 
    CAMAC_register_read(udev,1,&k);
 
    sprintf(tbline
,"Global Mode -> 0x%08lX",k
);  
    k=(k&0xF000)|0x0006;
 
    //                    k=0x0002;
 
    k=7;// Start DAQ mode Buffopt=7 single event
 
    CAMAC_register_write(udev,1,k);
 
    CAMAC_register_write(udev,2,0x80); // wait 0x80 us
 
    CAMAC_register_write(udev,3,0x0);
 
    CAMAC_register_write(udev,9,0x0);
 
    CAMAC_register_write(udev,14,0x0);
 
 
 
    return 0;
 
}
 
 
 
int daq::connect(){
 
/*xxusb_device_type devices[100];
 
struct usb_device *dev;
 
dev = devices[0].usbdev;
 
udev = xxusb_device_open(dev);*/
 
    WUSBXX_load (NULL);
 
//    WUSBXX_open ((char *)"CC0126");
 
    WUSBXX_open ((char *)"CC0130");
 
    return 0;
 
}
 
  
 
int daq::disconnect(){ 
 
  /* zakljuci */
 
  
 
   printf("daq::disconnect()\n");  
  return 0;
 
}
 
 
 
 
 
int daq::event(unsigned int *data, int maxn){
 
  
 
  //int events=0;  
 
 
 
  short ret;
 
 
 
  
 
 
 
  //while ((events==0)&&(!fStop)){ 
 
  int tout=100; /* 1/100 of a second */
 
  tmlnk (tout);
 
   
 
  ret=xxusb_usbfifo_read(udev,(int *) data,BUFF_L,500);
 
  tmulk(); 
 
   
 
 
 
  // printf("ret=%d,events=0x%08x\n",ret,data[0]);
 
  //}
 
  
 
  
 
  return ret*2;
 
}
 
 
 
 
 
 
 
daq::daq(){
 
// intercept routine
 
  if (signal 
(SIGINT
, SigInt
) == SIG_ERR
) perror ("sigignore");  
   
 
fStop=0;
 
connect();
 
init();
 
 xxusb_register_write(udev,1,0x1); // Start DAQ mode
 
}
 
 
 
daq::~daq(){
 
 xxusb_register_write(udev,1,0x0); // Stop DAQ mode
 
  while (xxusb_usbfifo_read(udev,(int *)stackdump,BUFF_L,30)>0);
 
 
 
disconnect();
 
}
 
 
 
#ifdef MAIN
 
 
 
 
 
 
 
int main (int argc, char **argv){
 
  
 
  int debug=0;
 
  int neve=1000000;
 
  char fname[0xFF];
 
  if (argc==1) {
 
    printf("Uporaba: %s stevilo_dogodkov ime_datoteke\n",argv
[0]);  
    printf("Meritev prekini s Ctrl-C, ce je nabranih dogodkov ze dovolj\n");  
  } 
 
  if (argc
>1) neve  
= atoi(argv
[1]);  
  if (argc
>2) sprintf(fname
,"%s", argv
[2]);  
  if (argc
>3) debug 
= atoi(argv
[3]);  
  
 
  
 
 
 
  // odpremo datoteko za pisanje
 
  FILE 
*fp
=fopen(fname
,"w"); 
  
 
  int hdr[4]={1};
 
  
 
  #define BSIZE 10000
 
  unsigned int data[BSIZE];
 
  daq *d= new daq();
 
  
 
  for (int ieve=0;ieve!=neve && !ctrlc ;ieve++){
 
    //int tout=100; /* 1/100 of a second */
 
    //tmlnk (tout);
 
    int nb=d->event(data,BSIZE);
 
    //tmulk();
 
    // zapis v datoteko   
 
    if (nb<0){
 
      ieve--; 
 
      continue;
 
    }
 
    hdr[1]=nb+4*sizeof(int);
 
    hdr[3]=ieve;
 
   
 
    fwrite(hdr
,   sizeof(int),4 , fp
);   
    fwrite(data
,   sizeof(int),nb
, fp
);  
//*****************
 
    int evsize=0;
 
    int events=0;  
 
    int ib=1,count=0;
 
    events = data[0];
 
    evsize = data[ib++]&0xffff;
 
    if (ieve 
%100 == 0) printf("nb=%d Event:%d events=%d EvSize:%d\n",nb
, ieve
,  events
, evsize
);  
    if (evsize<2) {
 
      ieve--;
 
      continue;
 
    }
 
    for (int i=0;i<evsize;i++)  {
 
       //if (debug) printf("%d\t%08x\n", ib, data[ib]);
 
       if (data[ib]== END_MARKER) break; 
 
       if (ib%2==0) {
 
          unsigned short word1 =data[ib  ]&0xFFFF;
 
          unsigned short word2 =data[ib+1]&0xFFFF;
 
          unsigned short tdc =  word1;                 
 
          unsigned short ch  =  (word2 >> 1 ) &0x1F;
 
          unsigned short edge =  word2   & 0x1;
 
          unsigned short q    = (word2 >> 8)  &0x1;
 
          unsigned short x    = (word2 >> 9)  &0x1;
 
          if (debug
) printf("%d. [ch=%2d] edge=%d data=%d q=%d x=%d\n",count
,ch
,edge
,tdc
, q
, x
);  
          count++;
 
       }
 
       ib++;
 
    }
 
    if (data
[evsize
+1]!=END_MARKER
) printf("Error! END_MARKER not found\n");  
//*****************   
 
 
 
 
 
  }
 
  printf("Podatki so v datoteki %s\n", fname
);  
 
 
  
 
  delete d;
 
 
 
  return 0;
 
}
 
#endif