RTXI 1.3
comedilib/lib/comedi.c
Go to the documentation of this file.
00001 /*
00002     lib/comedi.c
00003     generic functions
00004 
00005     COMEDILIB - Linux Control and Measurement Device Interface Library
00006     Copyright (C) 1997-2001 David A. Schleef <ds@schleef.org>
00007 
00008     This library is free software; you can redistribute it and/or
00009     modify it under the terms of the GNU Lesser General Public
00010     License as published by the Free Software Foundation, version 2.1
00011     of the License.
00012 
00013     This library is distributed in the hope that it will be useful,
00014     but WITHOUT ANY WARRANTY; without even the implied warranty of
00015     MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
00016     Lesser General Public License for more details.
00017 
00018     You should have received a copy of the GNU Lesser General Public
00019     License along with this library; if not, write to the Free Software
00020     Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307
00021     USA.
00022 */
00023 
00024 #include <stdio.h>
00025 #include <math.h>
00026 #include <stdlib.h>
00027 #include <sys/types.h>
00028 #include <sys/stat.h>
00029 #include <fcntl.h>
00030 #include <unistd.h>
00031 #include <sys/ioctl.h>
00032 #include <errno.h>
00033 #include <string.h>
00034 
00035 #include "libinternal.h"
00036 
00037 INTERNAL int __comedi_init=0;
00038 
00039 INTERNAL void initialize(void)
00040 {
00041         char *s;
00042 
00043         __comedi_init=1;
00044 
00045         if( (s=getenv("COMEDILIB_LOGLEVEL")) ){
00046                 __comedi_loglevel=strtol(s,NULL,0);
00047                 COMEDILIB_DEBUG(3,"setting loglevel to %d\n",__comedi_loglevel);
00048         }
00049 }
00050 
00051 EXPORT_ALIAS_DEFAULT(_comedi_open,comedi_open,0.7.18);
00052 comedi_t* _comedi_open(const char *fn)
00053 {
00054         comedi_t *it;
00055 
00056         if(!__comedi_init)
00057                 initialize();
00058 
00059         if(!(it=malloc(sizeof(comedi_t))))
00060                 goto cleanup;
00061         memset(it,0,sizeof(comedi_t));
00062 
00063         if((it->fd=open(fn,O_RDWR))<0){
00064                 libc_error();
00065                 goto cleanup;
00066         }
00067 
00068         if(comedi_ioctl(it->fd, COMEDI_DEVINFO, &it->devinfo) < 0)
00069                 goto cleanup;
00070 
00071         it->n_subdevices=it->devinfo.n_subdevs;
00072 
00073         if(get_subdevices(it) < 0)
00074                 goto cleanup;
00075 
00076         it->magic=COMEDILIB_MAGIC;
00077 
00078         return it;
00079 cleanup:
00080         if(it)
00081                 free(it);
00082 
00083         return NULL;
00084 }
00085 
00086 EXPORT_ALIAS_DEFAULT(_comedi_close,comedi_close,0.7.18);
00087 int _comedi_close(comedi_t *it)
00088 {
00089         subdevice *s;
00090         int i,j;
00091 
00092         if(!valid_dev(it))
00093                 return -1;
00094         it->magic=0;
00095 
00096         for(i=0;i<it->n_subdevices;i++){
00097                 s=it->subdevices+i;
00098                 if(s->type==COMEDI_SUBD_UNUSED)
00099                         continue;
00100 
00101                 if(s->subd_flags&SDF_FLAGS){
00102                         free(s->flags_list);
00103                 }
00104                 if(s->subd_flags&SDF_MAXDATA){
00105                         free(s->maxdata_list);
00106                 }
00107                 if(s->subd_flags&SDF_RANGETYPE){
00108                         free(s->range_type_list);
00109                         for(j=0;j<s->n_chan;j++)
00110                                 free(s->rangeinfo_list[j]);
00111                         free(s->rangeinfo_list);
00112                 }else{
00113                         free(s->rangeinfo);
00114                 }
00115                 if(s->cmd_mask)free(s->cmd_mask);
00116                 if(s->cmd_timed)free(s->cmd_timed);
00117         }
00118         if(it->subdevices){
00119                 free(it->subdevices);
00120         }
00121         close(it->fd);
00122         free(it);
00123         return 0;
00124 }
00125 
00126 EXPORT_ALIAS_DEFAULT(_comedi_cancel,comedi_cancel,0.7.18);
00127 int _comedi_cancel(comedi_t *it,unsigned int subdevice)
00128 {
00129         if(!valid_dev(it)) return -1;
00130         return comedi_ioctl(it->fd, COMEDI_CANCEL, (void*)(unsigned long)subdevice);
00131 }
00132 
00133 EXPORT_ALIAS_DEFAULT(_comedi_poll,comedi_poll,0.7.18);
00134 int _comedi_poll(comedi_t *it,unsigned int subdevice)
00135 {
00136         if(!valid_dev(it)) return -1;
00137         return comedi_ioctl(it->fd, COMEDI_POLL, (void*)(unsigned long)subdevice);
00138 }
00139 
00140 EXPORT_ALIAS_DEFAULT(_comedi_fileno,comedi_fileno,0.7.18);
00141 int _comedi_fileno(comedi_t *it)
00142 {
00143         if(!valid_dev(it)) return -1;
00144         return it->fd;
00145 }
00146 
00147 EXPORT_ALIAS_DEFAULT(_comedi_trigger,comedi_trigger,0.7.18);
00148 int _comedi_trigger(comedi_t *it,comedi_trig *t)
00149 {
00150         if(!valid_dev(it) || !t)
00151                 return -1;
00152 
00153         return comedi_ioctl(it->fd, COMEDI_TRIG, t);
00154 }
00155 
00156 EXPORT_ALIAS_DEFAULT(_comedi_command,comedi_command,0.7.18);
00157 int _comedi_command(comedi_t *it,comedi_cmd *t)
00158 {
00159         int ret;
00160         if(!valid_dev(it)) return -1;
00161         ret = comedi_ioctl(it->fd, COMEDI_CMD, t);
00162         __comedi_errno = errno;
00163         switch(__comedi_errno){
00164         case EIO:
00165                 __comedi_errno = ECMDNOTSUPP;
00166                 break;
00167         }
00168         return ret;
00169 }
00170 
00171 EXPORT_ALIAS_DEFAULT(_comedi_command_test,comedi_command_test,0.7.18);
00172 int _comedi_command_test(comedi_t *it,comedi_cmd *t)
00173 {
00174         int ret;
00175         if(!valid_dev(it)) return -1;
00176         ret = comedi_ioctl(it->fd, COMEDI_CMDTEST, t);
00177         __comedi_errno = errno;
00178         switch(__comedi_errno){
00179         case EIO:
00180                 __comedi_errno = ECMDNOTSUPP;
00181                 break;
00182         }
00183         return ret;
00184 }
00185 
00186 EXPORT_ALIAS_DEFAULT(_comedi_do_insnlist,comedi_do_insnlist,0.7.18);
00187 int _comedi_do_insnlist(comedi_t *it,comedi_insnlist *il)
00188 {
00189         int ret;
00190         if(!valid_dev(it)) return -1;
00191         ret = comedi_ioctl(it->fd, COMEDI_INSNLIST, il);
00192         __comedi_errno = errno;
00193         return ret;
00194 }
00195 
00196 EXPORT_ALIAS_DEFAULT(_comedi_do_insn,comedi_do_insn,0.7.18);
00197 int _comedi_do_insn(comedi_t *it,comedi_insn *insn)
00198 {
00199         if(!valid_dev(it)) return -1;
00200         if(it->has_insn_ioctl){
00201                 return comedi_ioctl(it->fd, COMEDI_INSN, insn);
00202         }else{
00203                 comedi_insnlist il;
00204                 int ret;
00205 
00206                 il.n_insns = 1;
00207                 il.insns = insn;
00208 
00209                 ret = comedi_ioctl(it->fd, COMEDI_INSNLIST, &il);
00210 
00211                 if(ret<0)return ret;
00212                 return insn->n;
00213         }
00214 }
00215 
00216 EXPORT_ALIAS_DEFAULT(_comedi_lock,comedi_lock,0.7.18);
00217 int _comedi_lock(comedi_t *it,unsigned int subdevice)
00218 {
00219         if(!valid_dev(it)) return -1;
00220         return comedi_ioctl(it->fd, COMEDI_LOCK, (void*)(unsigned long)subdevice);
00221 }
00222 
00223 EXPORT_ALIAS_DEFAULT(_comedi_unlock,comedi_unlock,0.7.18);
00224 int _comedi_unlock(comedi_t *it,unsigned int subdevice)
00225 {
00226         if(!valid_dev(it)) return -1;
00227         return comedi_ioctl(it->fd, COMEDI_UNLOCK, (void*)(unsigned long)subdevice);
00228 }
00229 
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Defines