Subversion Repositories f9daq

Rev

Blame | Last modification | View Log | RSS feed

#include <windows.h>
#include <userint.h>
#include <utility.h>
//#include <userint.h>
#include <stdlib.h>
//#include <formatio.h>
#include <ansi_c.h>
#include "usb.h"
#include "xxusbdll.h"
 #include "scaler.h"
#include <cvirte.h>    /* Needed if linking in external compiler; harmless otherwise */

extern int p4;
extern int daq_on;


#define NDIS 21
#define NSCA 22
#define NTGG 23



#define C_I CAMAC_I
#define C_Z CAMAC_Z
#define C_C CAMAC_C
//#define C_write        WUSBXX_CAMAC_write
//#define C_read             WUSBXX_CAMAC_read
#define C_write          CAMAC_write
#define C_read       CAMAC_read

//********************************************************************
usb_dev_handle *udev;
int Q;
int X;
static HINSTANCE DLLHandle;

int  WUSBXX_load (char *module_path) {


        if (module_path == NULL)
                DLLHandle = LoadLibrary("libxxusb.dll");
        else
                DLLHandle = LoadLibrary(module_path);

        if (!(xxusb_register_read_Ptr = (void *) GetProcAddress(DLLHandle,"xxusb_register_read"))) return __LINE__;
        if (!(xxusb_stack_read_Ptr = (void *) GetProcAddress(DLLHandle,"xxusb_stack_read"))) return __LINE__;
        if (!(xxusb_stack_write_Ptr = (void *) GetProcAddress(DLLHandle,"xxusb_stack_write"))) return __LINE__;
        if (!(xxusb_stack_execute_Ptr = (void *) GetProcAddress(DLLHandle,"xxusb_stack_execute"))) return __LINE__;
        if (!(xxusb_register_write_Ptr = (void *) GetProcAddress(DLLHandle,"xxusb_register_write"))) return __LINE__;
        if (!(xxusb_usbfifo_read_Ptr = (void *) GetProcAddress(DLLHandle,"xxusb_usbfifo_read"))) return __LINE__;
        if (!(xxusb_bulk_read_Ptr = (void *) GetProcAddress(DLLHandle,"xxusb_bulk_read"))) return __LINE__;
        if (!(xxusb_bulk_write_Ptr = (void *) GetProcAddress(DLLHandle,"xxusb_bulk_write"))) return __LINE__;
        if (!(xxusb_reset_toggle_Ptr = (void *) GetProcAddress(DLLHandle,"xxusb_reset_toggle"))) return __LINE__;

        if (!(xxusb_devices_find_Ptr = (void *) GetProcAddress(DLLHandle,"xxusb_devices_find"))) return __LINE__;
        if (!(xxusb_device_close_Ptr = (void *) GetProcAddress(DLLHandle,"xxusb_device_close"))) return __LINE__;
        if (!(xxusb_device_open_Ptr = (void *) GetProcAddress(DLLHandle,"xxusb_device_open"))) return __LINE__;
        if (!(xxusb_flash_program_Ptr = (void *) GetProcAddress(DLLHandle,"xxusb_flash_program"))) return __LINE__;
        if (!(xxusb_flashblock_program_Ptr = (void *) GetProcAddress(DLLHandle,"xxusb_flashblock_program"))) return __LINE__;
        if (!(xxusb_serial_open_Ptr = (void *) GetProcAddress(DLLHandle,"xxusb_serial_open"))) return __LINE__;

        if (!(VME_register_write_Ptr = (void *) GetProcAddress(DLLHandle,"VME_register_write"))) return __LINE__;
        if (!(VME_register_read_Ptr = (void *) GetProcAddress(DLLHandle,"VME_register_read"))) return __LINE__;
        if (!(VME_LED_settings_Ptr = (void *) GetProcAddress(DLLHandle,"VME_LED_settings"))) return __LINE__;
        if (!(VME_DGG_Ptr = (void *) GetProcAddress(DLLHandle,"VME_DGG"))) return __LINE__;
        if (!(VME_Output_settings_Ptr = (void *) GetProcAddress(DLLHandle,"VME_Output_settings"))) return __LINE__;
        if (!(VME_read_16_Ptr = (void *) GetProcAddress(DLLHandle,"VME_read_16"))) return __LINE__;
        if (!(VME_read_32_Ptr = (void *) GetProcAddress(DLLHandle,"VME_read_32"))) return __LINE__;
        if (!(VME_BLT_read_32_Ptr = (void *) GetProcAddress(DLLHandle,"VME_BLT_read_32"))) return __LINE__;
        if (!(VME_write_16_Ptr = (void *) GetProcAddress(DLLHandle,"VME_write_16"))) return __LINE__;
        if (!(VME_write_32_Ptr = (void *) GetProcAddress(DLLHandle,"VME_write_32"))) return __LINE__;

        if (!(CAMAC_DGG_Ptr = (void *) GetProcAddress(DLLHandle,"CAMAC_DGG"))) return __LINE__;
        if (!(CAMAC_register_read_Ptr = (void *) GetProcAddress(DLLHandle,"CAMAC_register_read"))) return __LINE__;
        if (!(CAMAC_register_write_Ptr = (void *) GetProcAddress(DLLHandle,"CAMAC_register_write"))) return __LINE__;
        if (!(CAMAC_LED_settings_Ptr = (void *) GetProcAddress(DLLHandle,"CAMAC_LED_settings"))) return __LINE__;
        if (!(CAMAC_Output_settings_Ptr = (void *) GetProcAddress(DLLHandle,"CAMAC_Output_settings"))) return __LINE__;
        if (!(CAMAC_read_LAM_mask_Ptr = (void *) GetProcAddress(DLLHandle,"CAMAC_read_LAM_mask"))) return __LINE__;
        if (!(CAMAC_write_LAM_mask_Ptr = (void *) GetProcAddress(DLLHandle,"CAMAC_write_LAM_mask"))) return __LINE__;
        if (!(CAMAC_write_Ptr = (void *) GetProcAddress(DLLHandle,"CAMAC_write"))) return __LINE__;
        if (!(CAMAC_read_Ptr = (void *) GetProcAddress(DLLHandle,"CAMAC_read"))) return __LINE__;
        if (!(CAMAC_Z_Ptr = (void *) GetProcAddress(DLLHandle,"CAMAC_Z"))) return __LINE__;
        if (!(CAMAC_C_Ptr = (void *) GetProcAddress(DLLHandle,"CAMAC_C"))) return __LINE__;
        if (!(CAMAC_I_Ptr = (void *) GetProcAddress(DLLHandle,"CAMAC_I"))) return __LINE__;
        return 0;
}


void  WUSBXX_open (char *serial) {
        if (serial != NULL)
                udev = xxusb_serial_open(serial);
        if (!udev)
                MessagePopup ("Error", "Cannot connect to USB. ! Check the connection!");
}

void  WUSBXX_close (void) {
        if (udev) xxusb_device_close(udev);
}

int WUSBXX_CAMAC_write( usb_dev_handle *udev, int N, int A, int F, long Data, int *Q, int *X);
int WUSBXX_CAMAC_read( usb_dev_handle *udev,int N, int A, int F, long *Data, int *Q, int *X);
int WUSBXX_CAMAC_Z( usb_dev_handle *udev );
int WUSBXX_CAMAC_C( usb_dev_handle *udev );
int WUSBXX_CAMAC_I(usb_dev_handle *udev, int inhibit);

int WUSBXX_CAMAC_write( usb_dev_handle *udev,int N, int A, int F, long Data, int *Q, int *X) {
        long intbuf[4];
        int ret=0;
// CAMAC direct write function
        intbuf[0]=1;
        intbuf[1]=(long)(F+A*32+N*512 + 0x4000);
        if ((F > 15) && (F < 24))  // orig controla
                //if ((F > 15) && (F < 28))  // orig controla
        {
                intbuf[0]=3;
                intbuf[2]=(Data & 0xffff);
                intbuf[3]=((Data >>16) & 255);
                ret = xxusb_stack_execute(udev, intbuf);
                *Q = (intbuf[0] & 1);
                *X = ((intbuf[0] >> 1) & 1);
        } else {
                printf("Error N%d A%d F%d",N,A,F);
        }
        return ret;
}

int WUSBXX_CAMAC_read( usb_dev_handle *udev,int N, int A, int F, long *Data, int *Q, int *X) {
        long intbuf[4];
        int ret;
        // CAMAC direct read function
        intbuf[0]=1;
        intbuf[1]=(long)(F+A*32+N*512 + 0x4000);
//    intbuf[1]=(long)(F+A*32+N*512);
        ret = xxusb_stack_execute(udev, intbuf);
//    printf ("ret = %d\n",ret);
        if (F < 16) { // orig controla
//      *Data = intbuf[0];   //16-bit word
                *Data = intbuf[0] + (intbuf[1] & 0xFF) * 0x10000;   //24-bit word
                *Q = ((intbuf[1] >> 8) & 1);
                *X = ((intbuf[1] >> 9) & 1);
        }
//    else {
//      printf("Error N%d A%d F%d",N,A,F);
//    }
        return ret;
}

int WUSBXX_CAMAC_Z(usb_dev_handle *udev) {
        long intbuf[4];
        int  ret;
//  CAMAC Z = N(28) A(8) F(29)
        intbuf[0]=1;
        intbuf[1]=(long)(29+8*32+28*512 + 0x4000);
        ret = xxusb_stack_execute(udev, intbuf);
        return ret;
}

int WUSBXX_CAMAC_C(usb_dev_handle *udev) {
        long intbuf[4];
        int ret;
//  CAMAC C = N(28) A(9) F(29)
        intbuf[0]=1;
        intbuf[1]=(long)(29+9*32+28*512 + 0x4000);
        ret = xxusb_stack_execute( udev, intbuf);
        return ret;
}

int WUSBXX_CAMAC_I(usb_dev_handle *udev, int inhibit) {
        long intbuf[4];
        int  ret;
//      Set Inhibit             = N(29) A(9) F(24)
//      Clear Inhibit   = N(29) A(9) F(26)
        intbuf[0]=1;
        if (inhibit) intbuf[1]=(long)(24+9*32+29*512 + 0x4000);
        else intbuf[1]=(long)(26+9*32+29*512 + 0x4000);
        ret = xxusb_stack_execute(udev, intbuf);
        return ret;
}

int init_CAMAC () {

        long dum;
        C_Z(udev);
        C_C(udev);
        C_I(udev,1);

        C_read ( udev,NTGG, 0 , 9, &dum,  &Q,&X); /* init TGG */
        C_write ( udev,NTGG, 0, 16, 1000,  &Q,&X); /* Set preset counting value */
        C_write ( udev,NTGG, 0 ,17, 0x2,  &Q,&X); /* Set Load&Clock Modes */
        C_write ( udev,NDIS, 0, 16, 0xffff,  &Q,&X); /* enable all ch. */
        C_read ( udev,NDIS, 0, 26, &dum, &Q, &X);

        C_I(udev, 0);

        return 0 ;
}



int scaler(int min, int max, int dx, int time_set, char *filename){
        FILE *fp ;
        if (filename!=NULL) {
                        fp = fopen ( filename, "w" );
        } else {
                        fp =stdout;
  }
       
        long val, dum;
        int thr_set;
        char str[0xFF];
  int n=(max-min)/dx;
        double *x= (double *) malloc(n*sizeof(double));
        double *y= (double *) malloc(n*sizeof(double));
       
       
       
        dum=WUSBXX_load (NULL);
        if (dum) printf("Error", "Cannot load dll!");
        WUSBXX_open ("CC0130");
       
        init_CAMAC ( );
       
        time_t mtime;
        time(&mtime);
        fprintf(fp, "#%s#gate(ms)=%d\n",ctime(&mtime),time_set);
        for (int i=0; i<n; i++) {
                int thr=min+i*dx;
                C_write ( udev, NDIS, 0, 17,  thr, &Q, &X);   /* set the threshold */
                C_write ( udev, NDIS, 1, 17, 0,  &Q,&X);         /*                                     */
               
          C_read ( udev, NSCA,0,9,&dum,  &Q,&X);
    C_write( udev, NTGG, 0, 16, time_set,  &Q,&X);
    C_read ( udev, NTGG, 0, 15, &dum,  &Q,&X);
   
       
                                       
                Delay(time_set*1e-3+0.01);
                int mych=2;
                val=0;
                for (int ch=1;ch<mych+1;ch++){
                C_read (  udev, NSCA, ch, 0, &val,  &Q,&X);
                  //printf("%d\t", val);
                  C_read (  udev, NSCA, ch, 0, &val,  &Q,&X);
                }
                val--;
          x[i]=thr;
                y[i]=val;
                static int plothandle=0;
                if (plothandle) DeleteGraphPlot (p4, SCALER_GRAPH, plothandle, VAL_IMMEDIATE_DRAW);
                plothandle = PlotXY (p4,SCALER_GRAPH, x, y, i+1, VAL_DOUBLE, VAL_DOUBLE, VAL_THIN_LINE, VAL_NO_POINT, VAL_SOLID, 1, VAL_BLUE);
                                                       
                sprintf ( str, "%d %d", thr, val) ;
                fprintf( fp, "%s\n", str);
                printf("scaler %s\n", str);
               
                C_I(udev, 0);
                if (!daq_on) break;
               
       
        }
        if (fp!=stdout) fclose ( fp ) ;
        printf("Threshold scan in the file %s\n", filename);
       
        WUSBXX_close ();
  return 0;
}

#ifdef MAIN
int main( int argc, char **argv){

       
                                               
        char filename[256]="tmp.txt" ;

       

        //ii=80000000/i-40;
        //if (ii<72) ii=72;
        //CAMAC_DGG(udev,0,7,0,ii,40,0,0);
        //CAMAC_DGG(udev,1,1,1,12,8,0,0);




        int min=0;
        int max=1000;
        int dx=10;
        int time_set=200;

        if (argc>1) min = atoi(argv[1]);
        if (argc>2) max = atoi(argv[2]);
        if (argc>3) dx  = atoi(argv[3]);
        if (argc>4) time_set = (int)(1000*atof(argv[4]));
        if (argc>5) sprintf(filename, "%s", argv[5]);
        scaler(min, max, dx, time_set, filename);
        return 0;
}      

#endif