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