Go to most recent revision | Details | Last modification | View Log | RSS feed
| Rev | Author | Line No. | Line |
|---|---|---|---|
| 111 | f9daq | 1 | #include <stdio.h> |
| 2 | #include <stdlib.h> |
||
| 3 | #include <string.h> |
||
| 4 | #include <unistd.h> |
||
| 5 | #include <sys/mman.h> |
||
| 6 | #include <sys/ioctl.h> |
||
| 7 | #include <errno.h> |
||
| 8 | #include <signal.h> |
||
| 9 | #include <ctype.h> |
||
| 10 | #include <time.h> |
||
| 11 | #include <sys/time.h> |
||
| 12 | |||
| 13 | #include "wusbxx_dll.h" /* the header of the shared library */ |
||
| 14 | #include "daq.h" |
||
| 15 | |||
| 16 | #define DEVICE_NAME "/dev/cc32_1" |
||
| 17 | #define PRRES(X) printf(">>> %s -> %d\n",#X,(X)) |
||
| 18 | |||
| 19 | |||
| 20 | |||
| 21 | /* definiram lokacije enot*/ |
||
| 22 | //#define NTDC 23 /* TDC LeCroy 2277*/ |
||
| 23 | #define NTGG 23 /* CAEN C423 */ |
||
| 24 | #define NSCA 22 /* CAEN C257 */ |
||
| 25 | #define NDIS 21 /* Philips 7106 */ |
||
| 26 | |||
| 27 | |||
| 28 | |||
| 29 | #define END_MARKER 0xFAF5 |
||
| 30 | int ctrlc=0; |
||
| 31 | int timer_out=0; |
||
| 32 | |||
| 33 | void SigInt (int sig) |
||
| 34 | { |
||
| 35 | ctrlc = 1; |
||
| 36 | timer_out=1; |
||
| 37 | |||
| 38 | } |
||
| 39 | |||
| 40 | struct sigaction oact; |
||
| 41 | void timerast (int signumber) |
||
| 42 | { |
||
| 43 | timer_out = 1; |
||
| 44 | printf("->>> TIMEOUT !!!\n"); |
||
| 45 | } |
||
| 46 | |||
| 47 | void tmlnk (int tout) |
||
| 48 | { |
||
| 49 | timer_out = 0; |
||
| 50 | struct sigaction act; |
||
| 51 | struct itimerval tdelay; |
||
| 52 | |||
| 53 | act.sa_handler = timerast; |
||
| 54 | sigemptyset (&act.sa_mask); |
||
| 55 | act.sa_flags = 0; |
||
| 56 | |||
| 57 | tdelay.it_value.tv_sec = tout / 100; |
||
| 58 | tdelay.it_value.tv_usec = 10000 * (tout % 100); |
||
| 59 | tdelay.it_interval.tv_sec = 0; |
||
| 60 | tdelay.it_interval.tv_usec = 0; |
||
| 61 | |||
| 62 | if (sigaction (SIGALRM, &act, &oact) < 0) |
||
| 63 | { |
||
| 64 | perror ("sigaction(tmlnk)"); |
||
| 65 | exit (EXIT_FAILURE); |
||
| 66 | } |
||
| 67 | if (setitimer (ITIMER_REAL, &tdelay, NULL) < 0) |
||
| 68 | { |
||
| 69 | perror ("setitimer(tmlnk)"); |
||
| 70 | exit (EXIT_FAILURE); |
||
| 71 | } |
||
| 72 | } |
||
| 73 | |||
| 74 | void tmulk () |
||
| 75 | { |
||
| 76 | struct itimerval tdelay; |
||
| 77 | |||
| 78 | tdelay.it_value.tv_sec = 0; |
||
| 79 | tdelay.it_value.tv_usec = 0; |
||
| 80 | tdelay.it_interval.tv_sec = 0; |
||
| 81 | tdelay.it_interval.tv_usec = 0; |
||
| 82 | |||
| 83 | if (setitimer (ITIMER_REAL, &tdelay, NULL) < 0) |
||
| 84 | { |
||
| 85 | perror ("setitimer(tmulk)"); |
||
| 86 | exit (EXIT_FAILURE); |
||
| 87 | } |
||
| 88 | if (sigaction (SIGALRM, &oact, NULL) < 0) |
||
| 89 | { |
||
| 90 | perror ("sigaction(tmulk)"); |
||
| 91 | exit (EXIT_FAILURE); |
||
| 92 | } |
||
| 93 | } |
||
| 94 | |||
| 95 | |||
| 96 | |||
| 97 | |||
| 98 | void CAMAC_status(void) |
||
| 99 | { |
||
| 100 | unsigned short id,fpga,modid,inhibit,lam; |
||
| 101 | unsigned short dum; |
||
| 102 | |||
| 103 | |||
| 104 | long cres; |
||
| 105 | int q,x; |
||
| 106 | |||
| 107 | CSSA_RQX(0,0,0,&cres,&q,&x); |
||
| 108 | dum = cres; |
||
| 109 | id = (dum & 0xF000) >> 12; |
||
| 110 | fpga = (dum & 0x0F00) >> 8; |
||
| 111 | modid = (dum & 0x00F0) >> 4; |
||
| 112 | q = (dum & 0x0008) >> 3; |
||
| 113 | x = (dum & 0x0004) >> 2; |
||
| 114 | inhibit= (dum & 0x0002) >> 1; |
||
| 115 | lam = (dum & 0x0001); |
||
| 116 | 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); |
||
| 117 | } |
||
| 118 | |||
| 119 | int daq::connect(){ |
||
| 120 | /*xxusb_device_type devices[100]; |
||
| 121 | struct usb_device *dev; |
||
| 122 | dev = devices[0].usbdev; |
||
| 123 | udev = xxusb_device_open(dev);*/ |
||
| 124 | WUSBXX_load (NULL); |
||
| 125 | // WUSBXX_open ((char *)"CC0126"); |
||
| 126 | WUSBXX_open ((char *)"CC0130"); |
||
| 127 | printf("daq::connect()\n"); |
||
| 128 | return 0; |
||
| 129 | } |
||
| 130 | |||
| 131 | int daq::disconnect(){ |
||
| 132 | /* zakljuci */ |
||
| 133 | |||
| 134 | printf("daq::disconnect()\n"); |
||
| 135 | return 0; |
||
| 136 | } |
||
| 137 | |||
| 138 | int daq::start(int thr_set,int time_set){ |
||
| 139 | int q,x; |
||
| 140 | // printf("Nastavljam threshold na %d in cas meritve na %d ms\n",thr_set,time_set); |
||
| 141 | long dum; |
||
| 142 | /* postavimo zeljeni prag prozenja */ |
||
| 143 | CSSA_WQX(NDIS,0,17,thr_set,&q,&x); |
||
| 144 | CSSA_WQX(NDIS,1,17,0,&q,&x); |
||
| 145 | |||
| 146 | /* stevec postavim na nic */ |
||
| 147 | CSSA_RQX ( NSCA, 0, 9,&dum, &q,&x); |
||
| 148 | |||
| 149 | /* nastavim dolzino signala */ |
||
| 150 | CSSA_WQX(NTGG,0,16,time_set,&q,&x); |
||
| 151 | CSSA_RQX(NTGG,0,15,&dum,&q,&x); |
||
| 152 | |||
| 153 | usleep(1000*time_set); |
||
| 154 | return 0; |
||
| 155 | } |
||
| 156 | |||
| 157 | |||
| 158 | int daq::count(){ |
||
| 159 | int q,x; |
||
| 160 | /* prestejem sunke na posameznem kanalu */ |
||
| 161 | for ( int ch=0 ; ch<16 ; ch ++ ) { |
||
| 162 | long data=0; |
||
| 163 | CSSA_RQX( NSCA, ch, 0, &data, &q,&x); |
||
| 164 | CSSA_RQX( NSCA, ch, 0, &data, &q,&x); |
||
| 165 | // CC USB ne precita v redu CAEN C257 scalerja, |
||
| 166 | // kanali so zamaknjeni za 1, ce je klic samo en |
||
| 167 | // vrednost kanala 0 se pristeje h kanalom 8..16, zato ga ne uporabljamo. |
||
| 168 | // vajo izvedemo le s kanali 1..15. |
||
| 169 | gData[ch]=data; |
||
| 170 | // printf("Kanal:%d Stevilo sunkov: %d \n",ch,data ); |
||
| 171 | } |
||
| 172 | for ( int ch=0 ; ch<16 ; ch ++ ) if (gData[ch]>0) gData[ch]--; |
||
| 173 | |||
| 174 | return 0; |
||
| 175 | } |
||
| 176 | |||
| 177 | |||
| 178 | int daq::save(){ |
||
| 179 | /* shrani */ |
||
| 180 | FILE *fp; |
||
| 181 | int ch; |
||
| 182 | if ( ( fp = fopen ( "scaler.txt", "w+" ) ) == NULL ) printf ( "ERROR" ) ; |
||
| 183 | for ( ch=0; ch<16 ; ch++ ) { |
||
| 184 | fprintf ( fp, "%d\t%d\n", ch, gData[ch] ) ; |
||
| 185 | } |
||
| 186 | fclose ( fp ) ; |
||
| 187 | return 0; |
||
| 188 | } |
||
| 189 | |||
| 190 | |||
| 191 | int daq::append(char *filename){ |
||
| 192 | /* zapisi v tekstovno datoteko */ |
||
| 193 | |||
| 194 | FILE *fp=fopen ( filename, "a" ); |
||
| 195 | if ( fp!= NULL ){ |
||
| 196 | for ( int ch=0; ch<16 ; ch++ ) fprintf ( fp, "%d\t", gData[ch] ) ; |
||
| 197 | fprintf ( fp, "\n" ) ; |
||
| 198 | fclose ( fp ) ; |
||
| 199 | printf("Rezultati meritve so dodani v datoteko %s\n",filename); |
||
| 200 | } else { |
||
| 201 | printf ( "ERROR" ) ; |
||
| 202 | } |
||
| 203 | |||
| 204 | return 0; |
||
| 205 | } |
||
| 206 | |||
| 207 | int daq::init(){ |
||
| 208 | printf("DAQ init at 0x%x\n",(unsigned int *) udev); |
||
| 209 | if (udev == NULL) connect(); |
||
| 210 | if (udev == NULL) printf("udev == NULL\n"); |
||
| 211 | CAMAC_status(); |
||
| 212 | CCCZ; |
||
| 213 | CCCC; |
||
| 214 | |||
| 215 | CSET_I; |
||
| 216 | |||
| 217 | int q,x; |
||
| 218 | long dum; |
||
| 219 | printf("Pazi na cas meritve. Kaksen je obseg stevca?\n"); |
||
| 220 | CSSA_RQX( NTGG, 0, 9, &dum,&q, &x); /* init TGG */ |
||
| 221 | CSSA_WQX( NTGG, 0,16, 1000,&q, &x); /* Set preset counting value */ |
||
| 222 | CSSA_WQX( NTGG, 0,17, 0x2 ,&q, &x ); /* Set Load&Clock Modes */ |
||
| 223 | CSSA_WQX( NDIS, 0,16, 0xffff,&q, &x);/* enable all ch. */ |
||
| 224 | CSSA_RQX( NDIS, 0,26, &dum,&q, &x); |
||
| 225 | |||
| 226 | CREM_I; |
||
| 227 | |||
| 228 | return 0; |
||
| 229 | } |
||
| 230 | |||
| 231 | |||
| 232 | |||
| 233 | daq::daq(){ |
||
| 234 | // intercept routine |
||
| 235 | if (signal (SIGINT, SigInt) == SIG_ERR) perror ("sigignore"); |
||
| 236 | |||
| 237 | connect(); |
||
| 238 | init(); |
||
| 239 | |||
| 240 | } |
||
| 241 | |||
| 242 | daq::~daq(){ |
||
| 243 | |||
| 244 | disconnect(); |
||
| 245 | } |
||
| 246 | |||
| 247 | #ifdef MAIN |
||
| 248 | int main (int argc, char **argv){ |
||
| 249 | int threshold=250; |
||
| 250 | int time_set =1000; /* in ms */ |
||
| 251 | char filename[1024]; |
||
| 252 | sprintf(filename,"output.txt"); |
||
| 253 | if (argc>1) threshold = atoi(argv[1]); |
||
| 254 | if (argc>2) sprintf(filename ,"%s",argv[2]); |
||
| 255 | if (argc>3) time_set = atoi(argv[3]); |
||
| 256 | daq *d= new daq(); |
||
| 257 | d->init(); |
||
| 258 | d->start(threshold, time_set); // threshold |
||
| 259 | |||
| 260 | d->count(); |
||
| 261 | d->append(filename); |
||
| 262 | delete d; |
||
| 263 | |||
| 264 | return 0; |
||
| 265 | } |
||
| 266 | #endif |