#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 NTGG 23          /* CAEN C423 */
 
#define NSCA 22          /* CAEN C257 */
 
#define NDIS 21          /* Philips 7106 */
 
 
 
 
 
 
 
#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 ("CCUSB 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::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::start(int thr_set,int time_set){
 
      int q,x;
 
      // printf("Nastavljam  threshold na %d in cas meritve na %d ms\n",thr_set,time_set);
 
      long dum;
 
      /* postavimo zeljeni prag prozenja */ 
 
      CSSA_WQX(NDIS,0,17,thr_set,&q,&x);
 
      CSSA_WQX(NDIS,1,17,0,&q,&x);
 
        
 
      /* stevec postavim na nic */
 
      CSSA_RQX ( NSCA, 0, 9,&dum, &q,&x);
 
   
 
      /* nastavim dolzino signala */
 
      CSSA_WQX(NTGG,0,16,time_set,&q,&x);
 
      CSSA_RQX(NTGG,0,15,&dum,&q,&x);
 
        
 
      usleep(1000*time_set);
 
      return 0;
 
}
 
 
 
 
 
int daq::count(){
 
    int q,x;    
 
    /* prestejem sunke na posameznem kanalu */    
 
      for ( int ch=0 ; ch<16 ; ch ++ ) {
 
        long data=0;
 
        CSSA_RQX( NSCA, ch, 0, &data, &q,&x);
 
        CSSA_RQX( NSCA, ch, 0, &data, &q,&x);
 
                // CC USB ne precita v redu CAEN C257 scalerja, 
 
                // kanali so zamaknjeni za 1, ce je klic samo en
 
                // vrednost kanala 0 se pristeje h kanalom 8..16, zato ga ne uporabljamo. 
 
                // vajo izvedemo le s kanali 1..15.
 
        gData[ch]=data;
 
//        printf("Kanal:%d Stevilo sunkov: %d \n",ch,data );
 
      }
 
      for ( int ch=0 ; ch<16 ; ch ++ ) if (gData[ch]>0) gData[ch]--; 
 
     
 
return 0;
 
}    
 
 
 
 
 
int daq::save(){
 
    /* shrani */
 
    FILE *fp;
 
     int ch;
 
     if ( ( fp 
= fopen ( "scaler.txt", "w+" ) ) == NULL 
) printf ( "ERROR" ) ;  
      for ( ch=0; ch<16 ; ch++ ) {  
 
        fprintf ( fp
, "%d\t%d\n", ch
, gData
[ch
] ) ;  
      }
 
   return 0;
 
}
 
 
 
 
 
int daq::append(char *filename){        
 
        /* zapisi v tekstovno datoteko */                        
 
 
 
      FILE 
*fp
=fopen ( filename
, "a" ); 
       if ( fp!= NULL ){
 
         for ( int ch
=0; ch
<16 ; ch
++ ) fprintf ( fp
, "%d\t", gData
[ch
] ) ;  
           printf("Rezultati meritve so dodani v datoteko %s\n",filename
);  
       } else {
 
       }
 
      
 
     return 0;
 
}
 
    
 
int daq::init(){
 
  printf("DAQ init at 0x%x\n",(unsigned int *) udev
);  
  if (udev == NULL) connect();
 
  if (udev 
== NULL
) printf("udev == NULL\n");  
  CAMAC_status();
 
  CCCZ;
 
  CCCC;
 
 
 
  CSET_I;
 
 
 
  int q,x;  
 
  long dum;  
 
  printf("Pazi na cas meritve. Kaksen je obseg stevca?\n");  
  CSSA_RQX( NTGG, 0, 9, &dum,&q, &x);         /* init TGG */
 
  CSSA_WQX( NTGG, 0,16, 1000,&q, &x);  /* Set preset counting value   */
 
  CSSA_WQX( NTGG, 0,17, 0x2 ,&q, &x );  /* Set Load&Clock Modes */
 
  CSSA_WQX( NDIS, 0,16, 0xffff,&q, &x);/* enable all ch. */
 
  CSSA_RQX( NDIS, 0,26, &dum,&q, &x);
 
 
 
  CREM_I;
 
 
 
  return 0;
 
}
 
 
 
 
 
 
 
daq::daq(){
 
// intercept routine
 
  if (signal 
(SIGINT
, SigInt
) == SIG_ERR
) perror ("sigignore");  
   
 
connect();
 
init();
 
 
 
}
 
 
 
daq::~daq(){
 
 
 
disconnect();
 
}
 
 
 
#ifdef MAIN
 
int main (int argc, char **argv){
 
  int threshold=250;
 
  int time_set =1000; /* in ms */
 
  char filename[1024];
 
  if (argc
>1) threshold 
= atoi(argv
[1]);  
  if (argc
>2) sprintf(filename 
,"%s",argv
[2]);  
  if (argc
>3) time_set  
= atoi(argv
[3]);  
  daq *d= new daq();
 
  d->init();
 
  d->start(threshold, time_set); // threshold
 
 
 
  d->count();
 
  d->append(filename);
 
  delete d;
 
 
 
return 0;
 
}
 
#endif