Added const qualifiers to some char* return values. Added new
authorFrank Mori Hess <fmhess@speakeasy.net>
Tue, 17 Oct 2006 18:19:29 +0000 (18:19 +0000)
committerFrank Mori Hess <fmhess@speakeasy.net>
Tue, 17 Oct 2006 18:19:29 +0000 (18:19 +0000)
experimental comedi_dio_bitfield2() function which works with
> 32 channels.  Only works properly with ni_65xx currently.
Will post a request for review by any interested
parties to list before I bother making the rest of the drivers
work with it.

doc/funcref
include/comedilib.h
lib/calib.c
lib/dio.c
lib/get.c
lib/version_script

index 7c49f00161148a92cf0ed47c94a0f325ca24305c..e00fbba52f20c9ec9a69dcf2eee73f5ee05447e2 100644 (file)
@@ -804,18 +804,38 @@ Param: comedi_t * device
 Param: unsigned int subdevice
 Param: unsigned int write_mask
 Param: unsigned int * bits
+Status: deprecated
+Description:
+ This function is deprecated.  Use comedi_dio_bitfield2() instead.
+
+Function: comedi_dio_bitfield2 -- read/write multiple digital channels
+Retval: int
+Param: comedi_t * device
+Param: unsigned int subdevice
+Param: unsigned int write_mask
+Param: unsigned int * bits
+Param: unsigned int base_channel
 Description:
- The function comedi_dio_bitfield() allows multiple channels to
- be read simultaneously from a digital input or digital I/O device.
- The parameter write_mask and the value pointed to by bits
+ The function comedi_dio_bitfield2() allows multiple channels to
+ be read or written together on a digital input, output,
+ or configurable digital I/O device.
+ The parameter <parameter>write_mask</parameter>
+ and the value pointed to by <parameter>bits</parameter>
  are interpreted as bit fields, with the least significant bit
- representing channel 0.  For each bit in write_mask that is
- set to 1, the cooresponding bit in *bits is written to the digital
+ representing channel <parameter>base_channel</parameter>.
+ For each bit in <parameter>write_mask</parameter> that is
+ set to 1, the cooresponding bit in <parameter>*bits</parameter>
+ is written to the digital
  output channel.  After writing all the output channels, each
  channel is read, and the result placed in the approprate bits in
- *bits.  The result of reading an output channel is undefined.
- It is not possible to access channels greater than 31 using this
- function.
+ <parameter>*bits</parameter>.  The result of
+ reading an output channel is the last
+ value written to the output channel.
+
+ All the channels may not be read or written at the exact same time.
+ For example, the driver may need to sequentially write to
+ several ports in order to set all the digital channels specified
+ by the <parameter>write_mask</parameter>.
 
 Function: comedi_sv_init -- slowly-varying inputs
 Retval: int
index 37dda01f738ac8f4878393ac87213cd22b2d87b1..f58292bd0f90edba1a4609e90a90799bc520d370 100644 (file)
@@ -82,8 +82,8 @@ enum comedi_oor_behavior comedi_set_global_oor_behavior(enum comedi_oor_behavior
 int comedi_get_n_subdevices(comedi_t *it);
 #define COMEDI_VERSION_CODE(a,b,c) (((a)<<16) | ((b)<<8) | (c))
 int comedi_get_version_code(comedi_t *it);
-char *comedi_get_driver_name(comedi_t *it);
-char *comedi_get_board_name(comedi_t *it);
+const char *comedi_get_driver_name(comedi_t *it);
+const char *comedi_get_board_name(comedi_t *it);
 int comedi_get_read_subdevice(comedi_t *dev);
 int comedi_get_write_subdevice(comedi_t *dev);
 
@@ -147,8 +147,8 @@ int comedi_dio_read(comedi_t *it,unsigned int subd,unsigned int chan,
        unsigned int *bit);
 int comedi_dio_write(comedi_t *it,unsigned int subd,unsigned int chan,
        unsigned int bit);
-int comedi_dio_bitfield(comedi_t *it,unsigned int subd,
-       unsigned int write_mask, unsigned int *bits);
+int comedi_dio_bitfield2(comedi_t *it,unsigned int subd,
+       unsigned int write_mask, unsigned int *bits, unsigned int base_channel);
 
 /* slowly varying stuff */
 int comedi_sv_init(comedi_sv_t *it,comedi_t *dev,unsigned int subd,unsigned int chan);
@@ -188,6 +188,8 @@ int comedi_timed_1chan(comedi_t *it,unsigned int subdev,unsigned int chan,
        unsigned int n_samples,double *data);
 int comedi_get_rangetype(comedi_t *it,unsigned int subdevice,
        unsigned int chan);
+int comedi_dio_bitfield(comedi_t *it,unsigned int subd,
+       unsigned int write_mask, unsigned int *bits);
 #endif
 
 
index c43d672c19770c47f8825e8b5cc8a883cff54664..52d281ec8c1af13ff8c82716304d022bf272c186 100644 (file)
@@ -181,8 +181,9 @@ char* _comedi_get_default_calibration_path( comedi_t *dev )
 {
        struct stat file_stats;
        char *file_path;
-       char *board_name, *temp;
-       char *driver_name;
+       const char *temp;
+       char *board_name;
+       const char *driver_name;
 
        if( fstat( comedi_fileno( dev ), &file_stats ) < 0 )
        {
index def2aba1f79db96a903719638e2dca5b5c8cbcc5..874ab6e1cd310b769f1d8c139e1f726faba3682a 100644 (file)
--- a/lib/dio.c
+++ b/lib/dio.c
@@ -41,7 +41,7 @@ int _comedi_dio_config(comedi_t *it,unsigned int subdev,unsigned int chan,unsign
 
        if(!valid_chan(it,subdev,chan))
                return -1;
-       
+
        s=it->subdevices+subdev;
        if(s->type!=COMEDI_SUBD_DIO)
                return -1;
@@ -52,7 +52,7 @@ int _comedi_dio_config(comedi_t *it,unsigned int subdev,unsigned int chan,unsign
        if(it->has_insnlist_ioctl){
                comedi_insn insn;
                lsampl_t data;
-               
+
                memset(&insn,0,sizeof(insn));
                insn.insn = INSN_CONFIG;
                insn.n = 1;
@@ -86,17 +86,17 @@ int _comedi_dio_get_config(comedi_t *it,unsigned int subdev, unsigned int chan,
        comedi_insn insn;
        lsampl_t data[2];
        int retval;
-       
+
        if(!valid_chan(it,subdev,chan))
                return -1;
-       
+
        s=it->subdevices+subdev;
        if(s->type!=COMEDI_SUBD_DIO)
                return -1;
 
        if(it->has_insnlist_ioctl == 0)
                return -1;
-       
+
        memset(&insn,0,sizeof(insn));
        insn.insn = INSN_CONFIG;
        insn.n = sizeof(data) / sizeof(data[0]);
@@ -130,7 +130,7 @@ int _comedi_dio_read(comedi_t *it,unsigned int subdev,unsigned int chan,
        if(it->has_insnlist_ioctl){
                comedi_insn insn;
                lsampl_t data;
-               
+
                memset(&insn,0,sizeof(insn));
                insn.insn = INSN_READ;
                insn.n = 1;
@@ -170,7 +170,7 @@ int _comedi_dio_write(comedi_t *it,unsigned int subdev,unsigned int chan,
 
        if(!valid_chan(it,subdev,chan))
                return -1;
-       
+
        s = it->subdevices+subdev;
        if(s->type!=COMEDI_SUBD_DIO &&
           s->type!=COMEDI_SUBD_DO)
@@ -179,7 +179,7 @@ int _comedi_dio_write(comedi_t *it,unsigned int subdev,unsigned int chan,
        if(it->has_insnlist_ioctl){
                comedi_insn insn;
                lsampl_t data;
-               
+
                memset(&insn,0,sizeof(insn));
                insn.insn = INSN_WRITE;
                insn.n = 1;
@@ -208,60 +208,67 @@ int _comedi_dio_write(comedi_t *it,unsigned int subdev,unsigned int chan,
        }
 }
 
-EXPORT_ALIAS_DEFAULT(_comedi_dio_bitfield,comedi_dio_bitfield,0.7.18);
-int _comedi_dio_bitfield(comedi_t *it,unsigned int subdev,unsigned int mask,unsigned int *bits)
+EXPORT_ALIAS_DEFAULT(_comedi_dio_bitfield2,comedi_dio_bitfield2,0.7.23);
+int _comedi_dio_bitfield2(comedi_t *it, unsigned int subdev, unsigned int mask, unsigned int *bits, unsigned base_channel)
 {
        int ret;
        unsigned int m,bit;
        subdevice *s;
 
-       if(!valid_subd(it,subdev))
+       if(!valid_subd(it, subdev))
                return -1;
 
-       s=it->subdevices+subdev;
+       s = it->subdevices + subdev;
 
-       if(s->type!=COMEDI_SUBD_DIO && s->type!=COMEDI_SUBD_DO &&
-          s->type!=COMEDI_SUBD_DI)
+       if(s->type != COMEDI_SUBD_DIO && s->type != COMEDI_SUBD_DO &&
+               s->type != COMEDI_SUBD_DI)
                return -1;
 
-       if(s->has_insn_bits){
+       if(s->has_insn_bits)
+       {
                comedi_insn insn;
                lsampl_t data[2];
-               
+
                memset(&insn,0,sizeof(insn));
 
                insn.insn = INSN_BITS;
+               insn.chanspec = base_channel;
                insn.n = 2;
                insn.data = data;
                insn.subdev = subdev;
 
-               data[0]=mask;
-               data[1]=*bits;
+               data[0] = mask;
+               data[1] = *bits;
 
-               ret = comedi_do_insn(it,&insn);
+               ret = comedi_do_insn(it, &insn);
 
-               if(ret<0)return ret;
+               if(ret < 0) return ret;
 
                *bits = data[1];
 
                return 0;
        }else{
-               unsigned int i,n_chan;
-
-               n_chan=comedi_get_n_channels(it,subdev);
-               if(n_chan>32)n_chan=32;
-               for(i=0,m=1;i<n_chan;i++,m<<=1){
-                       if(mask&m){
-                               bit=(*bits&m)?1:0;
-                               ret=comedi_dio_write(it,subdev,i,bit);
+               unsigned i;
+               for(i = 0, m = 1; i < 32; ++i, m <<= 1)
+               {
+                       if(mask & m)
+                       {
+                               bit = (*bits & m) ? 1 : 0;
+                               ret = comedi_dio_write(it, subdev, base_channel + i, bit);
                        }else{
-                               ret=comedi_dio_read(it,subdev,i,&bit);
-                               if(bit) *bits|=m;
-                               else (*bits)&=~m;
+                               ret = comedi_dio_read(it, subdev, base_channel + i, &bit);
+                               if(bit) *bits |= m;
+                               else (*bits) &= ~m;
                        }
-                       if(ret<0)return ret;
+                       if(ret < 0) return ret;
                }
-               return (int)n_chan;
+               return 0;
        }
 }
 
+EXPORT_ALIAS_DEFAULT(_comedi_dio_bitfield,comedi_dio_bitfield,0.7.18);
+int _comedi_dio_bitfield(comedi_t *it, unsigned int subdev, unsigned int mask, unsigned int *bits)
+{
+       return _comedi_dio_bitfield2(it, subdev, mask, bits, 0);
+}
+
index 88ccd031005d44786354de0c04b14146745d8a64..36409adb9745caeb0ee44aba5da2519c93ca7a54 100644 (file)
--- a/lib/get.c
+++ b/lib/get.c
@@ -54,7 +54,7 @@ int _comedi_get_version_code(comedi_t *it)
 }
 
 EXPORT_ALIAS_DEFAULT(_comedi_get_driver_name,comedi_get_driver_name,0.7.18);
-char* _comedi_get_driver_name(comedi_t *it)
+const char* _comedi_get_driver_name(comedi_t *it)
 {
        if(!valid_dev(it))
                return NULL;
@@ -63,7 +63,7 @@ char* _comedi_get_driver_name(comedi_t *it)
 }
 
 EXPORT_ALIAS_DEFAULT(_comedi_get_board_name,comedi_get_board_name,0.7.18);
-char* _comedi_get_board_name(comedi_t *it)
+const char* _comedi_get_board_name(comedi_t *it)
 {
        if(!valid_dev(it))
                return NULL;
@@ -88,13 +88,13 @@ int _comedi_get_subdevice_flags(comedi_t *it,unsigned int subd)
        if(!valid_dev(it))
                return -1;
        s = malloc(sizeof(comedi_subdinfo) * it->n_subdevices);
-       if(s == NULL) 
+       if(s == NULL)
        {
                __comedi_errno = errno;
                return -1;
        }
        ret = comedi_ioctl(it->fd, COMEDI_SUBDINFO, (unsigned long)s);
-       if(ret < 0) 
+       if(ret < 0)
        {
                free(s);
                return -1;
index 84755e56180006bc448e439d6e894e70f1eb75dd..3b238cc4d0fcb49714aa995cc2abb121fd05639c 100644 (file)
@@ -84,6 +84,7 @@ v0.7.20 {
 v0.7.23 {
        global:
                comedi_from_physical;
+               comedi_dio_bitfield2;
                comedi_dio_get_config;
                comedi_get_hardcal_converter;
                comedi_get_softcal_converter;