Main Page   Modules   Alphabetical List   Data Structures   File List   Data Fields   Related Pages  

CNTcontrol.c

00001 /*E12count.c
00002 
00003 Nathan Z. Gustavson
00004 ngustavson@emacinc.com
00005 Emac.inc
00006 www.emacinc.com
00007 
00008 Description:
00009 A C program for controlling 
00010 the counters of the 37e12
00011 
00012 ex:
00013 setup command
00014 pcdcount c num trigger threshold
00015 
00016 read command
00017 pcdcount r num
00018 
00019 */
00020 
00021 #include <stdlib.h>
00022 #include <stdio.h>
00023 #include <string.h>
00024 #include <sys/ioctl.h>
00025 #include <unistd.h>
00026 #include <sys/types.h>
00027 #include <asm/types.h>
00028 #include <sys/stat.h>
00029 #include <fcntl.h>
00030 #include <signal.h>
00031 #include <sched.h>
00032 #include <sys/resource.h>
00033 #include <sys/io.h>
00034 #include <E12user.h>
00035 #include <packet.h>
00036 #include <coprocessor.h>
00037 #include <counter.h>
00038 
00039 #define COUNTERRESPONSE BITMASK(COUNTER)
00040 
00041 Cop_Data *Cop;
00042 int fd;
00043 
00044 #define OPENDEV(filed,dev){if((filed = open(dev, O_RDWR))<=0){printf("couldn't open %s\n",dev);return -1;}}
00045 
00046 static int help(void)
00047 {
00048 const char *help_table = "*********************************************************
00049 *E12count                                                *
00050 *Nathan Z. Gustavson                                     *
00051 *Emac.inc                                                * 
00052 *"__DATE__"                                             *   
00053 *usage:                                                  *
00054 *E12count /dev/37e12 mask flags rise/fall/both threshold *
00055 **********************************************************\n";
00056 
00057 
00058 
00059 printf("%s",help_table);
00060 
00061 
00062 return 0;
00063 }
00064 
00065 #define ARGCHECK(num){if(argc<num){printf("invalid number of arguements\n");help();return -1;}}
00066 
00067 
00068 /*CounterParser
00069 The 37e12's data ready signal handler.
00070 This only pays attention to data received from the counter devices
00071 */
00072 static void CounterParser(int signal){
00073 
00074 int rxnum =read(fd,buffer,sizeof(buffer));
00075 typemask = E12_Packet_Route(Cop, buffer, rxnum);
00076 
00077 }
00078 
00079 
00080 static __u16 get_trigger(char *string)
00081 {
00082 if(!strcmp(string,"rise"))
00083    return RISEE;
00084 if(!strcmp(string,"fall"))
00085    return FALLE;
00086 if(!strcmp(string,"both"))
00087    return ANYE;
00088 
00089    return NOE;
00090 
00091 }
00092 
00093 
00094 static __u16 get_command(char *string)
00095 {
00096 if(!strcmp(string,"start"))
00097    return ICSTART;
00098 if(!strcmp(string,"stop"))
00099    return ICSTOP;
00100 if(!strcmp(string,"signal"))
00101    return ICNOTIFYON;
00102 if(!strcmp(string,"nosig"))
00103    return ICNOTIFYOFF;
00104 
00105 
00106    return NULLCOMMAND;
00107 
00108 }
00109 
00110 
00111 
00112 
00113 
00114 int main(int argc,char **argv)
00115 {
00116 int counter,trigger,thresh,flags;
00117 char command;
00118 char *device;
00119 __u16 threshold;
00120 long oflags;
00121 __u8 buffer[100];
00122 struct sigaction zero_signal;
00123 
00124 
00125 
00126 ARGCHECK(3);
00127 device = argv[1];
00128 OPENDEV(fd,device);
00129 
00130 command = *argv[2];
00131 counter=strtoul(argv[3],NULL,0);
00132 
00133 Cop = CopDeviceCreate(0);
00134 
00135 if((counter>7)||(counter<0))
00136   {
00137 printf("invalid counter\n");
00138 return -1;
00139   }
00140 
00141 switch(command)
00142   {
00143   case 'r'://read command
00144     E12_CounterValueRQ(fd, counter)
00145     break;
00146 
00147 
00148   case 's'://setup command
00149   
00150   ARGCHECK(6);
00151 
00152    if(!(trigger=get_trigger(argv[4])))
00153     {
00154       printf("invalid trigger %s\n",argv[4]);
00155       return -1;
00156     }
00157 
00158  if((threshold=strtoul(argv[5],NULL,0)))
00159    flags = AUTOLOAD;
00160  else
00161    flags = 0;
00162 
00163 E12_CountConfig(fd, counter, trigger, thresh,flags);
00164 
00165    close(fd);
00166    break;
00167  
00168   case 'c'://control 
00169   ARGCHECK(5);
00170 
00171 
00172     ioctl(fd,get_command(argv[3]),NULL);
00173 
00174     close(fd);
00175 
00176     break;
00177 
00178 
00179   case 'l':
00180     ARGCHECK(4);
00181 sprintf(device,"/dev/count%x",counter);    
00182 
00183 if((fd = open(device, O_RDWR))<=0)
00184      {
00185        printf("couldn't open %s\n",device);
00186        return -1;
00187      }  
00188 
00189 threshold = (__u16)strtoul(argv[3],NULL,0);
00190 
00191 write(fd,&threshold,sizeof(threshold));
00192 
00193 close(fd);
00194 
00195 break;
00196 
00197   case 'z':
00198 
00199 //configure counter with asychronous notification flag
00200  ARGCHECK(5);
00201 
00202   config.counter = counter;
00203 
00204   if(!(config.trigger=get_trigger(argv[3])))
00205     {
00206       printf("invalid trigger %s\n",argv[4]);
00207       return -1;
00208     }
00209 
00210  if((config.threshold=strtoul(argv[4],NULL,0)))
00211    config.flags = AUTOLOAD|ANOTE;
00212  else
00213    config.flags = ANOTE;
00214  
00215 
00216 
00217    if((fd = open("/dev/dig1", O_RDWR))<=0)
00218      {
00219        printf("couldn't open /dev/dig1\n");
00220        return -1;
00221      }
00222   
00223    ioctl(fd,PCD_COUNT,&config);//pass counter configuration structure to digital port
00224 
00225 close(fd);
00226 
00227 sprintf(device,"/dev/count%x",counter);    
00228 
00229 if((fd = open(device, O_RDWR))<=0)
00230      {
00231        printf("couldn't open %s\n",device);
00232        return -1;
00233      }  
00234 
00235 printf("Initializing \n");
00236 
00237 sleep(2);//flush any pending signals
00238 
00239 zero_signal.sa_handler = zero_counter;
00240 
00241 sigaction(SIGIO, &zero_signal,NULL); //install signal handler
00242 fcntl(fd, F_SETOWN,getpid()); //set signal ownership
00243 oflags = fcntl(fd, F_GETFL); //get current flags
00244 fcntl(fd,F_SETFL, oflags|FASYNC);//add FASYNC flag to them
00245 
00246 
00247 printf("hit Cntrl-C to exit\n");
00248 
00249 ioctl(fd,ICSTART,NULL);//start counter
00250 
00251 
00252 while(1); //let signal handlers work;
00253 
00254 
00255     break;
00256 
00257   case 'd':
00258  ARGCHECK(5);
00259 
00260   config.counter = counter;
00261 
00262   if(!(config.trigger=get_trigger(argv[3])))
00263     {
00264       printf("invalid trigger %s\n",argv[4]);
00265       return -1;
00266     }
00267 
00268  if((config.threshold=strtoul(argv[4],NULL,0)))
00269    config.flags = AUTOLOAD|ANOTE|AUTOSTOP;
00270  else
00271    config.flags = ANOTE|AUTOSTOP;
00272  
00273 
00274 
00275    if((fd = open("/dev/dig1", O_RDWR))<=0)
00276      {
00277        printf("couldn't open /dev/dig1\n");
00278        return -1;
00279      }
00280   
00281    ioctl(fd,PCD_COUNT,&config);//pass counter configuration structure to digital port
00282 
00283 close(fd);
00284 
00285 sprintf(device,"/dev/count%x",counter);    
00286 
00287 if((fd = open(device, O_RDWR))<=0)
00288      {
00289        printf("couldn't open %s\n",device);
00290        return -1;
00291      }  
00292 
00293 printf("Initializing \n");
00294 
00295 sleep(2);//flush any pending signals
00296 
00297 zero_signal.sa_handler = terminate;
00298 
00299 sigaction(SIGIO, &zero_signal,NULL); //install signal handler
00300 fcntl(fd, F_SETOWN,getpid()); //set signal ownership
00301 oflags = fcntl(fd, F_GETFL); //get current flags
00302 fcntl(fd,F_SETFL, oflags|FASYNC);//add FASYNC flag to them
00303 
00304 
00305 
00306 //printf("hit Cntrl-C to exit\n");
00307 
00308 printf("starting counter\n");
00309 ioctl(fd,ICSTART,NULL);//start counter
00310 
00311 
00312 while(waiting); //let signal handlers work;
00313 
00314     break;
00315 
00316   }
00317 
00318   
00319 
00320 close(fd);
00321 
00322 return 0;
00323 }
00324 
00325 
00326 
00327 
00328 
00329 
00330 

Generated on Mon Dec 29 16:06:42 2003 for PCM-37e12 by doxygen1.2.15