moved SWIG code from python directory to new swig directory. Added

beginnings of support for ruby swig binding
This commit is contained in:
Frank Mori Hess 2004-01-04 16:56:35 +00:00
parent 56027b2154
commit bc7a0262b2
16 changed files with 892 additions and 7500 deletions

View file

@ -1,5 +1,5 @@
SUBDIRS = lib comedi_calibrate comedi_config man testing demo doc python \
SUBDIRS = lib comedi_calibrate comedi_config man testing demo doc swig \
include etc
#pkgconfigdir = $(libdir)/pkgconfig

View file

@ -28,6 +28,11 @@ COMEDILIB_LIBS="$COMEDILIB_LIBS \$(top_builddir)/lib/libcomedi.la -lm"
AC_SUBST(COMEDILIB_CFLAGS)
AC_SUBST(COMEDILIB_LIBS)
AC_PATH_PROG(SWIG, swig, no)
if test x$SWIG = xno ; then
AC_MSG_WARN([swig not found, will not be able to regenerate code for swig bindings])
fi
AM_PATH_PYTHON
AM_CHECK_PYTHON_HEADERS(HAVE_PYTHON=yes,[HAVE_PYTHON=no;AC_MSG_WARN([python headers not found, disabling python binding])])
AM_CONDITIONAL(HAVE_PYTHON, [test "x$HAVE_PYTHON" = xyes])
@ -36,21 +41,27 @@ AS_COMPILER_FLAG([-fno-strict-aliasing],[PYTHON_QUIET="$PYTHON_QUIET -fno-strict
AS_COMPILER_FLAG([-Wno-unused-function],[PYTHON_QUIET="$PYTHON_QUIET -Wno-unused-function"], true )
AC_SUBST(PYTHON_QUIET)
AC_PATH_PROG(RUBY, ruby, no)
if test x$RUBY = xno ; then
AC_MSG_WARN([ruby not found, disabling ruby binding])
fi
AM_CONDITIONAL(HAVE_RUBY, [test "x$RUBY" != xno])
AC_PATH_PROG(DOCBOOK2MAN, docbook2man, no)
if test x$DOCBOOK2MAN = xno ; then
AC_MSG_WARN([docbook2man not found, disabling documentation])
AC_MSG_WARN([docbook2man not found, will not be able to rebuild man pages])
fi
AM_CONDITIONAL(HAVE_DOCBOOK2MAN, [test "x$DOCBOOK2MAN" != xno])
AC_PATH_PROG(DOCBOOK2PDF, docbook2pdf, no)
if test x$DOCBOOK2PDF = xno ; then
AC_MSG_WARN([docbook2pdf not found, disabling documentation])
AC_MSG_WARN([docbook2pdf not found, will not be able to rebuild pdf documentation])
fi
AM_CONDITIONAL(HAVE_DOCBOOK2PDF, [test "x$DOCBOOK2PDF" != xno])
AC_PATH_PROG(DOCBOOK2HTML, docbook2html, no)
if test x$DOCBOOK2HTML = xno ; then
AC_MSG_WARN([docbook2html not found, disabling documentation])
AC_MSG_WARN([docbook2html not found, will not be able to rebuild html documentation])
fi
AM_CONDITIONAL(HAVE_DOCBOOK2HTML, [test "x$DOCBOOK2HTML" != xno])
@ -61,7 +72,7 @@ AC_SUBST(pcmciadir)
#the hotplug expects the device dependent scripts here:
usbhotplugdir="/etc/hotplug/usb"
AC_SUBST(usbhotplugdir)
#firmware for the hotplug script
#see: http://linux-hotplug.sourceforge.net/
usbfirmwaredir="/usr/share/usb"
@ -81,7 +92,9 @@ demo/Makefile
include/Makefile
lib/Makefile
man/Makefile
python/Makefile
swig/Makefile
swig/python/Makefile
swig/ruby/Makefile
testing/Makefile
comedilib.spec
)

View file

@ -1,40 +0,0 @@
** General info on the swig-generated wrappers for Comedilib **
1) Regenerating the wrappers
The wrapper were made using swig-1.3.19. Any of the swig-1.3.x seris should work
N.B. the default swig on redhat systems is version 1.1. Upgrade to v-1.3.19. It's better!
run $> swig -python comedi.i
2) Building the module
i) edit the setup.py file so that the include and lib paths are correct for your system
ii) run $> python setup.py build
3) Installing the module
i) Manual installation I'm afraid. Copy comedi.py and _comedi.pyd files to somewhere in your PYTHONPATH
4) Using the module
All the comedilib functions are translated directly to python function. The various comedi structs
are now available as python classes (e.g. comedi_cmd_struct). The members of each struct are now
attributes of the class and can be set and retrieved in the usual way. Comedilib Functions which
take a pointer to a comedilib struct as an argument (in C) now, in python, accept the appropriate
struct python object.
For a multichannel acquisition, a C-array containing the channel list, gains and referencing is
required. This can be created using a swig-generated helper class: chanlist(n). This creates a C-array
of length n and type Unsigned Int. Individual members of the array can be accessed/set using
pythons indexing syntax:
mylist = chanlist(3) #creates a chanlist array of length 3
mylist[0] = 100 #set some values
mylist[1] = 200
mylist[2] = 300
The chanlist object can then be passed to a comedi_cmd_struct object, for example. N.B. The
chanlist object contains *no* length-checking or other error protection so use with care! Don't
try to get/set indexes outside the array bounds.
All the comedilib macros (e.g. CR_PACK) are now available as python functions.
check out the example test_comedi.py to clarify the above.

View file

@ -1,40 +0,0 @@
/***********************************************************
* Interface file for wrapping Comedilib
* author: Bryan Cole email: bryan.cole@teraview.co.uk
*
* This file was created with Python wrappers in mind but wil
* probably work for other swig-supported script languages
*
* to regenerate the wrappers run:
* swig -python comedi.i
*
***********************************************************/
%module comedi
%{
#include "../include/comedi.h"
#include "../include/comedilib.h"
%}
%include "carrays.i"
%inline %{
static unsigned int cr_pack(unsigned int chan, unsigned int rng, unsigned int aref){
return CR_PACK(chan,rng,aref);
}
static unsigned int cr_pack_flags(unsigned int chan, unsigned int rng, unsigned int aref, unsigned int flags){
return CR_PACK_FLAGS(chan,rng,aref, flags);
}
static unsigned int cr_chan(unsigned int a){
return CR_CHAN(a);
}
static unsigned int cr_range(unsigned int a){
return CR_RANGE(a);
}
static unsigned int cr_aref(unsigned int a){
return CR_AREF(a);
}
%}
%array_class(unsigned int, chanlist);
%include "../include/comedi.h"
%include "../include/comedilib.h"

File diff suppressed because it is too large Load diff

5
swig/Makefile.am Normal file
View file

@ -0,0 +1,5 @@
SUBDIRS = python ruby
EXTRA_DIST = comedi.i

567
swig/comedi.i Normal file
View file

@ -0,0 +1,567 @@
/***********************************************************
Interface file for wrapping Comedilib
Copyright (C) 2003 Bryan Cole <bryan.cole@teraview.co.uk>
Copyright (C) 1998-2002 David A. Schleef <ds@schleef.org>
Copyright (C) 2003,2004 Frank Mori Hess <fmhess@users.sourceforge.net>
Copyright (C) 2003 Steven Jenkins <steven.jenkins@ieee.org>
This program is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation; either version 2 of the License, or
(at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with this program; if not, write to the Free Software
Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
***********************************************************
*
* This file was created with Python wrappers in mind but wil
* probably work for other swig-supported script languages
*
* to regenerate the wrappers run:
* swig -python comedi.i
*
***********************************************************/
%module comedi
%{
#include "comedilib.h"
%}
%include "carrays.i"
%inline %{
static unsigned int cr_pack(unsigned int chan, unsigned int rng, unsigned int aref){
return CR_PACK(chan,rng,aref);
}
static unsigned int cr_pack_flags(unsigned int chan, unsigned int rng, unsigned int aref, unsigned int flags){
return CR_PACK_FLAGS(chan,rng,aref, flags);
}
static unsigned int cr_chan(unsigned int a){
return CR_CHAN(a);
}
static unsigned int cr_range(unsigned int a){
return CR_RANGE(a);
}
static unsigned int cr_aref(unsigned int a){
return CR_AREF(a);
}
%}
%array_class(unsigned int, chanlist);
/* below are (modified) copies of comedi.h and comedilib.h */
/* comedi.h */
typedef unsigned int lsampl_t;
typedef unsigned short sampl_t;
#define CR_FLAGS_MASK 0xfc000000
#define CR_ALT_FILTER (1<<26)
#define CR_DITHER CR_ALT_FILTER
#define CR_DEGLITCH CR_ALT_FILTER
#define CR_ALT_SOURCE (1<<27)
#define CR_EDGE (1<<30)
#define CR_INVERT (1<<31)
#define AREF_GROUND 0x00 /* analog ref = analog ground */
#define AREF_COMMON 0x01 /* analog ref = analog common */
#define AREF_DIFF 0x02 /* analog ref = differential */
#define AREF_OTHER 0x03 /* analog ref = other (undefined) */
/* counters -- these are arbitrary values */
#define GPCT_RESET 0x0001
#define GPCT_SET_SOURCE 0x0002
#define GPCT_SET_GATE 0x0004
#define GPCT_SET_DIRECTION 0x0008
#define GPCT_SET_OPERATION 0x0010
#define GPCT_ARM 0x0020
#define GPCT_DISARM 0x0040
#define GPCT_GET_INT_CLK_FRQ 0x0080
#define GPCT_INT_CLOCK 0x0001
#define GPCT_EXT_PIN 0x0002
#define GPCT_NO_GATE 0x0004
#define GPCT_UP 0x0008
#define GPCT_DOWN 0x0010
#define GPCT_HWUD 0x0020
#define GPCT_SIMPLE_EVENT 0x0040
#define GPCT_SINGLE_PERIOD 0x0080
#define GPCT_SINGLE_PW 0x0100
#define GPCT_CONT_PULSE_OUT 0x0200
#define GPCT_SINGLE_PULSE_OUT 0x0400
/* instructions */
#define INSN_MASK_WRITE 0x8000000
#define INSN_MASK_READ 0x4000000
#define INSN_MASK_SPECIAL 0x2000000
#define INSN_READ ( 0 | INSN_MASK_READ)
#define INSN_WRITE ( 1 | INSN_MASK_WRITE)
#define INSN_BITS ( 2 | INSN_MASK_READ|INSN_MASK_WRITE)
#define INSN_CONFIG ( 3 | INSN_MASK_READ|INSN_MASK_WRITE)
#define INSN_GTOD ( 4 | INSN_MASK_READ|INSN_MASK_SPECIAL)
#define INSN_WAIT ( 5 | INSN_MASK_WRITE|INSN_MASK_SPECIAL)
#define INSN_INTTRIG ( 6 | INSN_MASK_WRITE|INSN_MASK_SPECIAL)
/* trigger flags */
/* These flags are used in comedi_trig structures */
#define TRIG_BOGUS 0x0001 /* do the motions */
#define TRIG_DITHER 0x0002 /* enable dithering */
#define TRIG_DEGLITCH 0x0004 /* enable deglitching */
//#define TRIG_RT 0x0008 /* perform op in real time */
#define TRIG_CONFIG 0x0010 /* perform configuration, not triggering */
//#define TRIG_WAKE_EOS 0x0020 /* wake up on end-of-scan events */
//#define TRIG_WRITE 0x0040 /* write to bidirectional devices */
/* command flags */
/* These flags are used in comedi_cmd structures */
#define CMDF_PRIORITY 0x00000008 /* try to use a real-time interrupt while performing command */
#define TRIG_RT CMDF_PRIORITY /* compatibility definition */
#define TRIG_WAKE_EOS 0x00000020 /* legacy definition for COMEDI_EV_SCAN_END */
#define CMDF_WRITE 0x00000040
#define TRIG_WRITE CMDF_WRITE /* compatibility definition */
#define CMDF_RAWDATA 0x00000080
#define COMEDI_EV_START 0x00040000
#define COMEDI_EV_SCAN_BEGIN 0x00080000
#define COMEDI_EV_CONVERT 0x00100000
#define COMEDI_EV_SCAN_END 0x00200000
#define COMEDI_EV_STOP 0x00400000
#define TRIG_ROUND_MASK 0x00030000
#define TRIG_ROUND_NEAREST 0x00000000
#define TRIG_ROUND_DOWN 0x00010000
#define TRIG_ROUND_UP 0x00020000
#define TRIG_ROUND_UP_NEXT 0x00030000
/* trigger sources */
#define TRIG_ANY 0xffffffff
#define TRIG_INVALID 0x00000000
#define TRIG_NONE 0x00000001 /* never trigger */
#define TRIG_NOW 0x00000002 /* trigger now + N ns */
#define TRIG_FOLLOW 0x00000004 /* trigger on next lower level trig */
#define TRIG_TIME 0x00000008 /* trigger at time N ns */
#define TRIG_TIMER 0x00000010 /* trigger at rate N ns */
#define TRIG_COUNT 0x00000020 /* trigger when count reaches N */
#define TRIG_EXT 0x00000040 /* trigger on external signal N */
#define TRIG_INT 0x00000080 /* trigger on comedi-internal signal N */
#define TRIG_OTHER 0x00000100 /* driver defined */
/* subdevice flags */
#define SDF_BUSY 0x0001 /* device is busy */
#define SDF_BUSY_OWNER 0x0002 /* device is busy with your job */
#define SDF_LOCKED 0x0004 /* subdevice is locked */
#define SDF_LOCK_OWNER 0x0008 /* you own lock */
#define SDF_MAXDATA 0x0010 /* maxdata depends on channel */
#define SDF_FLAGS 0x0020 /* flags depend on channel */
#define SDF_RANGETYPE 0x0040 /* range type depends on channel */
#define SDF_MODE0 0x0080 /* can do mode 0 */
#define SDF_MODE1 0x0100 /* can do mode 1 */
#define SDF_MODE2 0x0200 /* can do mode 2 */
#define SDF_MODE3 0x0400 /* can do mode 3 */
#define SDF_MODE4 0x0800 /* can do mode 4 */
#define SDF_CMD 0x1000 /* can do commands */
#define SDF_READABLE 0x00010000 /* subdevice can be read (e.g. analog input) */
#define SDF_WRITABLE 0x00020000 /* subdevice can be written (e.g. analog output) */
#define SDF_WRITEABLE SDF_WRITABLE /* spelling error in API */
#define SDF_INTERNAL 0x00040000 /* subdevice does not have externally visible lines */
#define SDF_RT 0x00080000 /* DEPRECATED: subdevice is RT capable */
#define SDF_GROUND 0x00100000 /* can do aref=ground */
#define SDF_COMMON 0x00200000 /* can do aref=common */
#define SDF_DIFF 0x00400000 /* can do aref=diff */
#define SDF_OTHER 0x00800000 /* can do aref=other */
#define SDF_DITHER 0x01000000 /* can do dithering */
#define SDF_DEGLITCH 0x02000000 /* can do deglitching */
#define SDF_MMAP 0x04000000 /* can do mmap() */
#define SDF_RUNNING 0x08000000 /* subdevice is acquiring data */
#define SDF_LSAMPL 0x10000000 /* subdevice uses 32-bit samples */
#define SDF_PACKED 0x20000000 /* subdevice can do packed DIO */
/* subdevice types */
#define COMEDI_SUBD_UNUSED 0 /* unused */
#define COMEDI_SUBD_AI 1 /* analog input */
#define COMEDI_SUBD_AO 2 /* analog output */
#define COMEDI_SUBD_DI 3 /* digital input */
#define COMEDI_SUBD_DO 4 /* digital output */
#define COMEDI_SUBD_DIO 5 /* digital input/output */
#define COMEDI_SUBD_COUNTER 6 /* counter */
#define COMEDI_SUBD_TIMER 7 /* timer */
#define COMEDI_SUBD_MEMORY 8 /* memory, EEPROM, DPRAM */
#define COMEDI_SUBD_CALIB 9 /* calibration DACs */
#define COMEDI_SUBD_PROC 10 /* processor, DSP */
/* configuration instructions */
#define COMEDI_INPUT 0
#define COMEDI_OUTPUT 1
#define COMEDI_OPENDRAIN 2
#define INSN_CONFIG_ANALOG_TRIG 0x10
//#define INSN_CONFIG_WAVEFORM 0x11
//#define INSN_CONFIG_TRIG 0x12
//#define INSN_CONFIG_COUNTER 0x13
#define INSN_CONFIG_ALT_SOURCE 0x14
#define INSN_CONFIG_DIGITAL_TRIG 0x15
#define INSN_CONFIG_BLOCK_SIZE 0x16
#define INSN_CONFIG_TIMER_1 0x17
#define INSN_CONFIG_FILTER 0x18
#define INSN_CONFIG_CHANGE_NOTIFY 0x19
/* structures */
typedef struct comedi_trig_struct comedi_trig;
typedef struct comedi_cmd_struct comedi_cmd;
typedef struct comedi_insn_struct comedi_insn;
typedef struct comedi_insnlist_struct comedi_insnlist;
typedef struct comedi_chaninfo_struct comedi_chaninfo;
typedef struct comedi_subdinfo_struct comedi_subdinfo;
typedef struct comedi_devinfo_struct comedi_devinfo;
typedef struct comedi_devconfig_struct comedi_devconfig;
typedef struct comedi_rangeinfo_struct comedi_rangeinfo;
typedef struct comedi_krange_struct comedi_krange;
typedef struct comedi_bufconfig_struct comedi_bufconfig;
typedef struct comedi_bufinfo_struct comedi_bufinfo;
struct comedi_trig_struct{
unsigned int subdev; /* subdevice */
unsigned int mode; /* mode */
unsigned int flags;
unsigned int n_chan; /* number of channels */
unsigned int *chanlist; /* channel/range list */
sampl_t *data; /* data list, size depends on subd flags */
unsigned int n; /* number of scans */
unsigned int trigsrc;
unsigned int trigvar;
unsigned int trigvar1;
unsigned int data_len;
unsigned int unused[3];
};
struct comedi_insn_struct{
unsigned int insn;
unsigned int n;
lsampl_t *data;
unsigned int subdev;
unsigned int chanspec;
unsigned int unused[3];
};
struct comedi_insnlist_struct{
unsigned int n_insns;
comedi_insn *insns;
};
struct comedi_cmd_struct{
unsigned int subdev;
unsigned int flags;
unsigned int start_src;
unsigned int start_arg;
unsigned int scan_begin_src;
unsigned int scan_begin_arg;
unsigned int convert_src;
unsigned int convert_arg;
unsigned int scan_end_src;
unsigned int scan_end_arg;
unsigned int stop_src;
unsigned int stop_arg;
unsigned int *chanlist; /* channel/range list */
unsigned int chanlist_len;
sampl_t *data; /* data list, size depends on subd flags */
unsigned int data_len;
};
struct comedi_chaninfo_struct{
unsigned int subdev;
lsampl_t *maxdata_list;
unsigned int *flaglist;
unsigned int *rangelist;
unsigned int unused[4];
};
struct comedi_rangeinfo_struct{
unsigned int range_type;
void *range_ptr;
};
struct comedi_krange_struct{
int min; /* fixed point, multiply by 1e-6 */
int max; /* fixed point, multiply by 1e-6 */
unsigned int flags;
};
struct comedi_subdinfo_struct{
unsigned int type;
unsigned int n_chan;
unsigned int subd_flags;
unsigned int timer_type;
unsigned int len_chanlist;
lsampl_t maxdata;
unsigned int flags; /* channel flags */
unsigned int range_type; /* lookup in kernel */
unsigned int settling_time_0;
unsigned int unused[9];
};
struct comedi_devinfo_struct{
unsigned int version_code;
unsigned int n_subdevs;
char driver_name[COMEDI_NAMELEN];
char board_name[COMEDI_NAMELEN];
int read_subdevice;
int write_subdevice;
int unused[30];
};
struct comedi_devconfig_struct{
char board_name[COMEDI_NAMELEN];
int options[COMEDI_NDEVCONFOPTS];
};
struct comedi_bufconfig_struct{
unsigned int subdevice;
unsigned int flags;
unsigned int maximum_size;
unsigned int size;
unsigned int unused[4];
};
struct comedi_bufinfo_struct{
unsigned int subdevice;
unsigned int bytes_read;
unsigned int buf_int_ptr;
unsigned int buf_user_ptr;
unsigned int buf_int_count;
unsigned int buf_user_count;
unsigned int bytes_written;
unsigned int unused[4];
};
/* range stuff */
#define __RANGE(a,b) ((((a)&0xffff)<<16)|((b)&0xffff))
#define RANGE_OFFSET(a) (((a)>>16)&0xffff)
#define RANGE_LENGTH(b) ((b)&0xffff)
#define RF_UNIT(flags) ((flags)&0xff)
#define RF_EXTERNAL (1<<8)
#define UNIT_volt 0
#define UNIT_mA 1
#define UNIT_none 2
#define COMEDI_MIN_SPEED ((unsigned int)0xffffffff)
/* callback stuff */
/* only relevant to kernel modules. */
#define COMEDI_CB_EOS 1 /* end of scan */
#define COMEDI_CB_EOA 2 /* end of acquisition */
#define COMEDI_CB_BLOCK 4 /* DEPRECATED: convenient block size */
#define COMEDI_CB_EOBUF 8 /* DEPRECATED: end of buffer */
#define COMEDI_CB_ERROR 16 /* card error during acquisition */
#define COMEDI_CB_OVERFLOW 32 /* buffer overflow/underflow */
/* comedilib.h */
typedef void comedi_t;
typedef struct{
double min;
double max;
unsigned int unit;
}comedi_range;
typedef struct comedi_sv_struct{
comedi_t *dev;
unsigned int subdevice;
unsigned int chan;
/* range policy */
int range;
int aref;
/* number of measurements to average (for ai) */
int n;
lsampl_t maxdata;
}comedi_sv_t;
enum comedi_oor_behavior {
COMEDI_OOR_NUMBER = 0,
COMEDI_OOR_NAN
};
comedi_t *comedi_open(const char *fn);
int comedi_close(comedi_t *it);
/* logging */
int comedi_loglevel(int loglevel);
void comedi_perror(const char *s);
char *comedi_strerror(int errnum);
int comedi_errno(void);
int comedi_fileno(comedi_t *it);
/* global behavior */
enum comedi_oor_behavior comedi_set_global_oor_behavior(enum comedi_oor_behavior behavior);
/* device queries */
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);
int comedi_get_read_subdevice(comedi_t *dev);
int comedi_get_write_subdevice(comedi_t *dev);
/* subdevice queries */
int comedi_get_subdevice_type(comedi_t *it,unsigned int subdevice);
int comedi_find_subdevice_by_type(comedi_t *it,int type,unsigned int subd);
int comedi_get_subdevice_flags(comedi_t *it,unsigned int subdevice);
int comedi_get_n_channels(comedi_t *it,unsigned int subdevice);
int comedi_range_is_chan_specific(comedi_t *it,unsigned int subdevice);
int comedi_maxdata_is_chan_specific(comedi_t *it,unsigned int subdevice);
/* channel queries */
lsampl_t comedi_get_maxdata(comedi_t *it,unsigned int subdevice,
unsigned int chan);
int comedi_get_n_ranges(comedi_t *it,unsigned int subdevice,
unsigned int chan);
comedi_range * comedi_get_range(comedi_t *it,unsigned int subdevice,
unsigned int chan,unsigned int range);
int comedi_find_range(comedi_t *it,unsigned int subd,unsigned int chan,
unsigned int unit,double min,double max);
/* buffer queries */
int comedi_get_buffer_size(comedi_t *it,unsigned int subdevice);
int comedi_get_max_buffer_size(comedi_t *it,unsigned int subdevice);
int comedi_set_buffer_size(comedi_t *it,unsigned int subdevice,
unsigned int len);
/* low-level stuff */
int comedi_do_insnlist(comedi_t *it,comedi_insnlist *il);
int comedi_do_insn(comedi_t *it,comedi_insn *insn);
int comedi_lock(comedi_t *it,unsigned int subdevice);
int comedi_unlock(comedi_t *it,unsigned int subdevice);
/* physical units */
double comedi_to_phys(lsampl_t data,comedi_range *rng,lsampl_t maxdata);
lsampl_t comedi_from_phys(double data,comedi_range *rng,lsampl_t maxdata);
int comedi_sampl_to_phys(double *dest, int dst_stride, sampl_t *src,
int src_stride, comedi_range *rng, lsampl_t maxdata, int n);
int comedi_sampl_from_phys(sampl_t *dest,int dst_stride,double *src,
int src_stride, comedi_range *rng, lsampl_t maxdata, int n);
/* syncronous stuff */
int comedi_data_read(comedi_t *it,unsigned int subd,unsigned int chan,
unsigned int range,unsigned int aref,lsampl_t *OUTPUT);
int comedi_data_read_n(comedi_t *it,unsigned int subd,unsigned int chan,
unsigned int range,unsigned int aref,lsampl_t *OUTPUT, unsigned int n);
int comedi_data_read_hint(comedi_t *it,unsigned int subd,unsigned int chan,
unsigned int range,unsigned int aref);
int comedi_data_read_delayed(comedi_t *it,unsigned int subd,unsigned int chan,
unsigned int range,unsigned int aref,lsampl_t *OUTPUT, unsigned int nano_sec);
int comedi_data_write(comedi_t *it,unsigned int subd,unsigned int chan,
unsigned int range,unsigned int aref,lsampl_t data);
int comedi_dio_config(comedi_t *it,unsigned int subd,unsigned int chan,
unsigned int dir);
int comedi_dio_read(comedi_t *it,unsigned int subd,unsigned int chan,
unsigned int *OUTPUT);
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 *BOTH);
/* slowly varying stuff */
int comedi_sv_init(comedi_sv_t *it,comedi_t *dev,unsigned int subd,unsigned int chan);
int comedi_sv_update(comedi_sv_t *it);
int comedi_sv_measure(comedi_sv_t *it,double *data);
/* streaming I/O (commands) */
int comedi_get_cmd_src_mask(comedi_t *dev,unsigned int subdevice,
comedi_cmd *BOTH);
int comedi_get_cmd_generic_timed(comedi_t *dev,unsigned int subdevice,
comedi_cmd *BOTH,unsigned int ns);
int comedi_cancel(comedi_t *it,unsigned int subdevice);
int comedi_command(comedi_t *it,comedi_cmd *BOTH);
int comedi_command_test(comedi_t *it,comedi_cmd *BOTH);
int comedi_poll(comedi_t *dev,unsigned int subdevice);
/* buffer control */
int comedi_set_max_buffer_size(comedi_t *it, unsigned int subdev,
unsigned int max_size);
int comedi_get_buffer_contents(comedi_t *it, unsigned int subdev);
int comedi_mark_buffer_read(comedi_t *it, unsigned int subdev,
unsigned int bytes);
int comedi_get_buffer_offset(comedi_t *it, unsigned int subdev);
/* structs and functions used for parsing calibration files */
typedef struct
{
unsigned int subdevice;
unsigned int channel;
unsigned int value;
} comedi_caldac_t;
#define CS_MAX_AREFS_LENGTH 4
typedef struct
{
unsigned int subdevice;
unsigned int *channels;
unsigned int num_channels;
unsigned int *ranges;
unsigned int num_ranges;
unsigned int arefs[ CS_MAX_AREFS_LENGTH ];
unsigned int num_arefs;
comedi_caldac_t *caldacs;
unsigned int num_caldacs;
} comedi_calibration_setting_t;
typedef struct
{
char *driver_name;
char *board_name;
comedi_calibration_setting_t *settings;
unsigned int num_settings;
} comedi_calibration_t;
comedi_calibration_t* comedi_parse_calibration_file( const char *cal_file_path );
int comedi_apply_parsed_calibration( comedi_t *dev, unsigned int subdev, unsigned int channel,
unsigned int range, unsigned int aref, const comedi_calibration_t *calibration );
char* comedi_get_default_calibration_path( comedi_t *dev );
void comedi_cleanup_calibration( comedi_calibration_t *calibration );
int comedi_apply_calibration( comedi_t *dev, unsigned int subdev, unsigned int channel,
unsigned int range, unsigned int aref, const char *cal_file_path);

View file

@ -5,11 +5,16 @@ else
pyexec_LTLIBRARIES =
endif
_comedi_la_SOURCES = comedi_wrap.c
_comedi_la_SOURCES = comedi_python_wrap.c
_comedi_la_CFLAGS = $(COMEDILIB_CFLAGS) $(PYTHON_INCLUDES) $(PYTHON_QUIET)
_comedi_la_LDFLAGS = -module -avoid-version $(COMEDILIB_LIBS)
pyexec_SCRIPTS = comedi.py
EXTRA_DIST = comedi.i README.txt comedi.py setup.py test_comedi.py
BUILT_SOURCES = comedi_python_wrap.c
EXTRA_DIST = README.txt comedi.py setup.py test_comedi.py
comedi_pythong_wrap.c: ../comedi.i
$(SWIG) -python -o ./comedi_python_wrap.c ../comedi.i

View file

@ -66,10 +66,6 @@ _comedi.chanlist_swigregister(chanlistPtr)
chanlist_frompointer = _comedi.chanlist_frompointer
COMEDI_MAJOR = _comedi.COMEDI_MAJOR
COMEDI_NDEVICES = _comedi.COMEDI_NDEVICES
COMEDI_NDEVCONFOPTS = _comedi.COMEDI_NDEVCONFOPTS
COMEDI_NAMELEN = _comedi.COMEDI_NAMELEN
CR_FLAGS_MASK = _comedi.CR_FLAGS_MASK
CR_ALT_FILTER = _comedi.CR_ALT_FILTER
CR_DITHER = _comedi.CR_DITHER
@ -188,7 +184,8 @@ INSN_CONFIG_ALT_SOURCE = _comedi.INSN_CONFIG_ALT_SOURCE
INSN_CONFIG_DIGITAL_TRIG = _comedi.INSN_CONFIG_DIGITAL_TRIG
INSN_CONFIG_BLOCK_SIZE = _comedi.INSN_CONFIG_BLOCK_SIZE
INSN_CONFIG_TIMER_1 = _comedi.INSN_CONFIG_TIMER_1
CIO = _comedi.CIO
INSN_CONFIG_FILTER = _comedi.INSN_CONFIG_FILTER
INSN_CONFIG_CHANGE_NOTIFY = _comedi.INSN_CONFIG_CHANGE_NOTIFY
class comedi_trig_struct(_object):
__swig_setmethods__ = {}
__setattr__ = lambda self, name, value: _swig_setattr(self, comedi_trig_struct, name, value)

8
swig/ruby/Makefile.am Normal file
View file

@ -0,0 +1,8 @@
EXTRA_DIST = examples
BUILT_SOURCES = comedi_ruby_wrap.c
comedi_ruby_wrap.c: ../comedi.i
$(SWIG) -ruby -o ./comedi_ruby_wrap.c ../comedi.i

91
swig/ruby/examples/cmd Executable file
View file

@ -0,0 +1,91 @@
#!/usr/bin/env ruby
require 'comedi'
require 'getoptlong'
require 'common'
include Comedi
cmdtest_messages = [ "success", "invalid source", "source conflict",
"invalid argument", "argument conflict",
"invalid chanlist" ]
class Comedi_t
def prepare_cmd_lib(subdevice, freq, cmd)
ret, cmd = get_cmd_generic_timed(subdevice, cmd,
1000000000.0 / freq)
if ret < 0
printf("comedi_get_cmd_generic_timed failed\n")
return ret, cmd
end
cmd.chanlist = $chanlist
cmd.chanlist_len = $n_chan
cmd.scan_end_arg = $n_chan
cmd.stop_arg = $n_scan if cmd.stop_src == TRIG_COUNT
return 0, cmd
end
end
parse_options($ARGV)
begin
dev = Comedi_t.new($filename)
rescue
comedi_perror($filename)
exit 1
end
$chanlist = Chanlist.new($n_chan)
0.upto($n_chan - 1) do |i|
$chanlist[i] = cr_pack($channel + i, $range, $aref)
end
ret, cmd = dev.prepare_cmd_lib($subdevice, $freq, Comedi_cmd_struct.new)
$stderr.printf("command before testing:\n")
dump_cmd($stderr, cmd)
ret, cmd = dev.command_test(cmd)
if ret < 0
comedi_perror("comedi_command_test")
exit 1
end
$stderr.printf("first test returned %d (%s)\n", ret, cmdtest_messages[ret])
dump_cmd($stderr, cmd)
ret, cmd = dev.command_test(cmd)
if ret < 0
comedi_perror("comedi_command_test")
exit 1
end
$stderr.printf("second test returned %d (%s)\n", ret, cmdtest_messages[ret])
dump_cmd($stderr, cmd)
tstart = Time.new
$stderr.printf("start time: %d.%06d\n", tstart.tv_sec, tstart.tv_usec)
ret = dev.command(cmd)
if ret < 0
comedi_perror("comedi_command")
exit 1
end
while line = dev.ios.read(2 * $n_chan)
data = line.unpack('S*')
data.each do |d|
printf("%d ", d)
end
puts
end
tend = Time.new
$stderr.printf("end time: %d.%06d\n", tend.tv_sec, tend.tv_usec)
tdiff = tend - tstart
$stderr.printf("time: %.6f\n", tdiff)

102
swig/ruby/examples/common Normal file
View file

@ -0,0 +1,102 @@
def parse_options(argv)
$filename = "/dev/comedi0"
$subdevice = 0
$channel = 0
$range = 0
$aref = AREF_GROUND
$n_chan = 4
$n_scan = 1000
$freq = 1000.0
opts = GetoptLong.new(
[ "--filename", "-f", GetoptLong::REQUIRED_ARGUMENT ],
[ "--subdevice", "-s", GetoptLong::REQUIRED_ARGUMENT ],
[ "--channel", "-c", GetoptLong::REQUIRED_ARGUMENT ],
[ "--aref", "-a", GetoptLong::REQUIRED_ARGUMENT ],
[ "--range", "-r", GetoptLong::REQUIRED_ARGUMENT ],
[ "--n_chan", "-n", GetoptLong::REQUIRED_ARGUMENT ],
[ "--n_scan", "-N", GetoptLong::REQUIRED_ARGUMENT ],
[ "--freq", "-F", GetoptLong::REQUIRED_ARGUMENT ],
[ "--verbose", "-v", GetoptLong::NO_ARGUMENT ],
[ "--diff", "-d", GetoptLong::NO_ARGUMENT ],
[ "--ground", "-g", GetoptLong::NO_ARGUMENT ],
[ "--other", "-o", GetoptLong::NO_ARGUMENT ],
[ "--common", "-m", GetoptLong::NO_ARGUMENT ]
)
opts.each do |opt, arg|
case opt
when "--filename"
$filename = arg.to_s
when "--subdevice"
$subdevice = arg.to_i
when "--channel"
$channel = arg.to_i
when "--range"
$range = arg.to_i
when "--n_chan"
$n_chan = arg.to_i
when "--n_scan"
$n_scan = arg.to_i
when "--freq"
$freq = arg.to_i
when "--diff"
$aref = AREF_DIFF
when "--ground"
$aref = AREF_GROUND
when "--other"
$aref = AREF_OTHER
when "--common"
$aref = AREF_COMMON
when "--help"
usage
exit 0
end
end
end
def cmd_src(src)
buf = ""
buf << "none|" if src & TRIG_NONE > 0
buf << "now|" if src & TRIG_NOW > 0
buf << "follow|" if src & TRIG_FOLLOW > 0
buf << "time|" if src & TRIG_TIME > 0
buf << "timer|" if src & TRIG_TIMER > 0
buf << "count|" if src & TRIG_COUNT > 0
buf << "ext|" if src & TRIG_EXT > 0
buf << "int|" if src & TRIG_INT > 0
buf << "other|" if src & TRIG_OTHER > 0
if buf == ""
buf = "unknown(0x%08x)" % src
else
buf.sub!(/\|\z/, '')
end
return buf
end
def dump_cmd(out, cmd)
out.printf("start: %-8s %d\n",
cmd_src(cmd.start_src),
cmd.start_arg)
out.printf("scan_begin: %-8s %d\n",
cmd_src(cmd.scan_begin_src),
cmd.scan_begin_arg)
out.printf("convert: %-8s %d\n",
cmd_src(cmd.convert_src),
cmd.convert_arg)
out.printf("scan_end: %-8s %d\n",
cmd_src(cmd.scan_end_src),
cmd.scan_end_arg)
out.printf("stop: %-8s %d\n",
cmd_src(cmd.stop_src),
cmd.stop_arg)
end

91
swig/ruby/syntax_sugar Normal file
View file

@ -0,0 +1,91 @@
require 'comedi.so'
include Comedi
include SWIG
module Comedi
class Comedi_t
def initialize(name)
@pointer = Comedi::open(name)
raise if @pointer.nil?
@ios = IO.new(fileno, "r")
raise if @ios.nil?
end
attr_reader :pointer, :ios
end
private
def wrap_function(mod, name)
defn = %Q{ def #{name}(*args)
comedi_#{name}(*args)
end
}
mod.module_eval defn
end
def wrap_function_with_receiver(mod, name)
defn = %Q{ def #{name}(*args)
comedi_#{name}(self, *args)
end
}
mod.module_eval defn
end
def wrap_function_with_pointer(mod, name)
defn = %Q{ def #{name}(*args)
comedi_#{name}(self.pointer, *args)
end
}
mod.module_eval defn
end
# Comedi module methods
names = %w{ open loglevel perror strerrno errno to_phys from_phys
set_global_oor_behavior parse_calibration_file }
names.each do |name|
wrap_function(Comedi, name)
end
# Comedi_t instance methods
names = %w{ close fileno get_n_subdevices get_version_code
get_driver_name get_board_name get_subdevice_type
find_subdevice_by_type get_read_subdevice get_write_device
get_subdevice_flags get_n_channels range_is_chan_specific
maxdata_is_chan_specific get_maxdata get_n_ranges
get_range find_range get_buffer size
get_max_buffer_size set_buffer_size trigger
do_insnlist do_insn lock unlock data_read
data_read_delayed data_read_hint data_write dio_config
dio_read dio_write dio_bitfield get_cmd_src_mask
get_cmd_generic_timed cancel command command_test poll
set_max_buffer_size get_buffer_contents
mark_buffer_read get_buffer_offset apply_calibration
apply_parsed_calibration get_default_calibration_path }
names.each do |name|
wrap_function_with_pointer(Comedi_t, name)
end
# Comedi_sv_t instance methods
names = %w{ sv_init sv_update sv_measure }
names.each do |name|
wrap_function_with_receiver(Comedi_sv_t, name)
end
# Comedi_calibration_t instance methods
names = %w{ cleanup_calibration_file }
names.each do |name|
wrap_function_with_receiver(Comedi_calibration_t, name)
end
end