comedilib/perl/Comedi.xs
2000-02-02 05:14:23 +00:00

621 lines
11 KiB
Text

/*
* Copyright (c) 1999 Joseph E. Smith <jes@presto.med.upenn.edu>
*
* All rights reserved. This program is free software. You may
* redistribute it and/or modify it under the same terms as Perl itself.
*/
#ifdef __cplusplus
extern "C" {
#endif
#include "EXTERN.h"
#include "perl.h"
#include "XSUB.h"
#ifdef __cplusplus
}
#endif
#include <comedi.h>
static int
not_here(s)
char *s;
{
croak("%s not implemented on this architecture", s);
return -1;
}
static double
constant(name, arg)
char *name;
int arg;
{
errno = 0;
switch (*name) {
case 'A':
if (strEQ(name, "AREF_COMMON"))
#ifdef AREF_COMMON
return AREF_COMMON;
#else
goto not_there;
#endif
if (strEQ(name, "AREF_DIFF"))
#ifdef AREF_DIFF
return AREF_DIFF;
#else
goto not_there;
#endif
if (strEQ(name, "AREF_GROUND"))
#ifdef AREF_GROUND
return AREF_GROUND;
#else
goto not_there;
#endif
if (strEQ(name, "AREF_OTHER"))
#ifdef AREF_OTHER
return AREF_OTHER;
#else
goto not_there;
#endif
break;
case 'B':
break;
case 'C':
if (strEQ(name, "CIO"))
#ifdef CIO
return CIO;
#else
goto not_there;
#endif
if (strEQ(name, "COMEDI_CANCEL"))
#ifdef COMEDI_CANCEL
return COMEDI_CANCEL;
#else
goto not_there;
#endif
if (strEQ(name, "COMEDI_CB_BLOCK"))
#ifdef COMEDI_CB_BLOCK
return COMEDI_CB_BLOCK;
#else
goto not_there;
#endif
if (strEQ(name, "COMEDI_CB_EOA"))
#ifdef COMEDI_CB_EOA
return COMEDI_CB_EOA;
#else
goto not_there;
#endif
if (strEQ(name, "COMEDI_CB_EOBUF"))
#ifdef COMEDI_CB_EOBUF
return COMEDI_CB_EOBUF;
#else
goto not_there;
#endif
if (strEQ(name, "COMEDI_CB_EOS"))
#ifdef COMEDI_CB_EOS
return COMEDI_CB_EOS;
#else
goto not_there;
#endif
if (strEQ(name, "COMEDI_CHANINFO"))
#ifdef COMEDI_CHANINFO
return COMEDI_CHANINFO;
#else
goto not_there;
#endif
if (strEQ(name, "COMEDI_CMD"))
#ifdef COMEDI_CMD
return COMEDI_CMD;
#else
goto not_there;
#endif
if (strEQ(name, "COMEDI_DEVCONFIG"))
#ifdef COMEDI_DEVCONFIG
return COMEDI_DEVCONFIG;
#else
goto not_there;
#endif
if (strEQ(name, "COMEDI_DEVINFO"))
#ifdef COMEDI_DEVINFO
return COMEDI_DEVINFO;
#else
goto not_there;
#endif
if (strEQ(name, "COMEDI_INPUT"))
#ifdef COMEDI_INPUT
return COMEDI_INPUT;
#else
goto not_there;
#endif
if (strEQ(name, "COMEDI_LOCK"))
#ifdef COMEDI_LOCK
return COMEDI_LOCK;
#else
goto not_there;
#endif
if (strEQ(name, "COMEDI_MAJOR"))
#ifdef COMEDI_MAJOR
return COMEDI_MAJOR;
#else
goto not_there;
#endif
if (strEQ(name, "COMEDI_NAMELEN"))
#ifdef COMEDI_NAMELEN
return COMEDI_NAMELEN;
#else
goto not_there;
#endif
if (strEQ(name, "COMEDI_NDEVCONFOPTS"))
#ifdef COMEDI_NDEVCONFOPTS
return COMEDI_NDEVCONFOPTS;
#else
goto not_there;
#endif
if (strEQ(name, "COMEDI_NDEVICES"))
#ifdef COMEDI_NDEVICES
return COMEDI_NDEVICES;
#else
goto not_there;
#endif
if (strEQ(name, "COMEDI_OUTPUT"))
#ifdef COMEDI_OUTPUT
return COMEDI_OUTPUT;
#else
goto not_there;
#endif
if (strEQ(name, "COMEDI_RANGEINFO"))
#ifdef COMEDI_RANGEINFO
return COMEDI_RANGEINFO;
#else
goto not_there;
#endif
if (strEQ(name, "COMEDI_SUBDINFO"))
#ifdef COMEDI_SUBDINFO
return COMEDI_SUBDINFO;
#else
goto not_there;
#endif
if (strEQ(name, "COMEDI_SUBD_AI"))
#ifdef COMEDI_SUBD_AI
return COMEDI_SUBD_AI;
#else
goto not_there;
#endif
if (strEQ(name, "COMEDI_SUBD_AO"))
#ifdef COMEDI_SUBD_AO
return COMEDI_SUBD_AO;
#else
goto not_there;
#endif
if (strEQ(name, "COMEDI_SUBD_CALIB"))
#ifdef COMEDI_SUBD_CALIB
return COMEDI_SUBD_CALIB;
#else
goto not_there;
#endif
if (strEQ(name, "COMEDI_SUBD_COUNTER"))
#ifdef COMEDI_SUBD_COUNTER
return COMEDI_SUBD_COUNTER;
#else
goto not_there;
#endif
if (strEQ(name, "COMEDI_SUBD_DI"))
#ifdef COMEDI_SUBD_DI
return COMEDI_SUBD_DI;
#else
goto not_there;
#endif
if (strEQ(name, "COMEDI_SUBD_DIO"))
#ifdef COMEDI_SUBD_DIO
return COMEDI_SUBD_DIO;
#else
goto not_there;
#endif
if (strEQ(name, "COMEDI_SUBD_DO"))
#ifdef COMEDI_SUBD_DO
return COMEDI_SUBD_DO;
#else
goto not_there;
#endif
if (strEQ(name, "COMEDI_SUBD_MEMORY"))
#ifdef COMEDI_SUBD_MEMORY
return COMEDI_SUBD_MEMORY;
#else
goto not_there;
#endif
if (strEQ(name, "COMEDI_SUBD_PROC"))
#ifdef COMEDI_SUBD_PROC
return COMEDI_SUBD_PROC;
#else
goto not_there;
#endif
if (strEQ(name, "COMEDI_SUBD_TIMER"))
#ifdef COMEDI_SUBD_TIMER
return COMEDI_SUBD_TIMER;
#else
goto not_there;
#endif
if (strEQ(name, "COMEDI_SUBD_UNUSED"))
#ifdef COMEDI_SUBD_UNUSED
return COMEDI_SUBD_UNUSED;
#else
goto not_there;
#endif
if (strEQ(name, "COMEDI_TRIG"))
#ifdef COMEDI_TRIG
return COMEDI_TRIG;
#else
goto not_there;
#endif
if (strEQ(name, "COMEDI_UNLOCK"))
#ifdef COMEDI_UNLOCK
return COMEDI_UNLOCK;
#else
goto not_there;
#endif
break;
case 'D':
break;
case 'E':
break;
case 'F':
break;
case 'G':
break;
case 'H':
break;
case 'I':
break;
case 'J':
break;
case 'K':
break;
case 'L':
break;
case 'M':
break;
case 'N':
break;
case 'O':
break;
case 'P':
break;
case 'Q':
break;
case 'R':
if (strEQ(name, "RF_EXTERNAL"))
#ifdef RF_EXTERNAL
return RF_EXTERNAL;
#else
goto not_there;
#endif
break;
case 'S':
if (strEQ(name, "SDF_BUSY"))
#ifdef SDF_BUSY
return SDF_BUSY;
#else
goto not_there;
#endif
if (strEQ(name, "SDF_BUSY_OWNER"))
#ifdef SDF_BUSY_OWNER
return SDF_BUSY_OWNER;
#else
goto not_there;
#endif
if (strEQ(name, "SDF_COMMON"))
#ifdef SDF_COMMON
return SDF_COMMON;
#else
goto not_there;
#endif
if (strEQ(name, "SDF_DEGLITCH"))
#ifdef SDF_DEGLITCH
return SDF_DEGLITCH;
#else
goto not_there;
#endif
if (strEQ(name, "SDF_DIFF"))
#ifdef SDF_DIFF
return SDF_DIFF;
#else
goto not_there;
#endif
if (strEQ(name, "SDF_DITHER"))
#ifdef SDF_DITHER
return SDF_DITHER;
#else
goto not_there;
#endif
if (strEQ(name, "SDF_FLAGS"))
#ifdef SDF_FLAGS
return SDF_FLAGS;
#else
goto not_there;
#endif
if (strEQ(name, "SDF_GROUND"))
#ifdef SDF_GROUND
return SDF_GROUND;
#else
goto not_there;
#endif
if (strEQ(name, "SDF_INTERNAL"))
#ifdef SDF_INTERNAL
return SDF_INTERNAL;
#else
goto not_there;
#endif
if (strEQ(name, "SDF_LOCKED"))
#ifdef SDF_LOCKED
return SDF_LOCKED;
#else
goto not_there;
#endif
if (strEQ(name, "SDF_LOCK_OWNER"))
#ifdef SDF_LOCK_OWNER
return SDF_LOCK_OWNER;
#else
goto not_there;
#endif
if (strEQ(name, "SDF_LSAMPL"))
#ifdef SDF_LSAMPL
return SDF_LSAMPL;
#else
goto not_there;
#endif
if (strEQ(name, "SDF_MAXDATA"))
#ifdef SDF_MAXDATA
return SDF_MAXDATA;
#else
goto not_there;
#endif
if (strEQ(name, "SDF_MMAP"))
#ifdef SDF_MMAP
return SDF_MMAP;
#else
goto not_there;
#endif
if (strEQ(name, "SDF_MODE0"))
#ifdef SDF_MODE0
return SDF_MODE0;
#else
goto not_there;
#endif
if (strEQ(name, "SDF_MODE1"))
#ifdef SDF_MODE1
return SDF_MODE1;
#else
goto not_there;
#endif
if (strEQ(name, "SDF_MODE2"))
#ifdef SDF_MODE2
return SDF_MODE2;
#else
goto not_there;
#endif
if (strEQ(name, "SDF_MODE3"))
#ifdef SDF_MODE3
return SDF_MODE3;
#else
goto not_there;
#endif
if (strEQ(name, "SDF_MODE4"))
#ifdef SDF_MODE4
return SDF_MODE4;
#else
goto not_there;
#endif
if (strEQ(name, "SDF_OTHER"))
#ifdef SDF_OTHER
return SDF_OTHER;
#else
goto not_there;
#endif
if (strEQ(name, "SDF_RANGETYPE"))
#ifdef SDF_RANGETYPE
return SDF_RANGETYPE;
#else
goto not_there;
#endif
if (strEQ(name, "SDF_READABLE"))
#ifdef SDF_READABLE
return SDF_READABLE;
#else
goto not_there;
#endif
if (strEQ(name, "SDF_RT"))
#ifdef SDF_RT
return SDF_RT;
#else
goto not_there;
#endif
if (strEQ(name, "SDF_RUNNING"))
#ifdef SDF_RUNNING
return SDF_RUNNING;
#else
goto not_there;
#endif
if (strEQ(name, "SDF_WRITEABLE"))
#ifdef SDF_WRITEABLE
return SDF_WRITEABLE;
#else
goto not_there;
#endif
break;
case 'T':
if (strEQ(name, "TRIG_ANY"))
#ifdef TRIG_ANY
return TRIG_ANY;
#else
goto not_there;
#endif
if (strEQ(name, "TRIG_BOGUS"))
#ifdef TRIG_BOGUS
return TRIG_BOGUS;
#else
goto not_there;
#endif
if (strEQ(name, "TRIG_CONFIG"))
#ifdef TRIG_CONFIG
return TRIG_CONFIG;
#else
goto not_there;
#endif
if (strEQ(name, "TRIG_COUNT"))
#ifdef TRIG_COUNT
return TRIG_COUNT;
#else
goto not_there;
#endif
if (strEQ(name, "TRIG_DEGLITCH"))
#ifdef TRIG_DEGLITCH
return TRIG_DEGLITCH;
#else
goto not_there;
#endif
if (strEQ(name, "TRIG_DITHER"))
#ifdef TRIG_DITHER
return TRIG_DITHER;
#else
goto not_there;
#endif
if (strEQ(name, "TRIG_EXT"))
#ifdef TRIG_EXT
return TRIG_EXT;
#else
goto not_there;
#endif
if (strEQ(name, "TRIG_FOLLOW"))
#ifdef TRIG_FOLLOW
return TRIG_FOLLOW;
#else
goto not_there;
#endif
if (strEQ(name, "TRIG_INT"))
#ifdef TRIG_INT
return TRIG_INT;
#else
goto not_there;
#endif
if (strEQ(name, "TRIG_NONE"))
#ifdef TRIG_NONE
return TRIG_NONE;
#else
goto not_there;
#endif
if (strEQ(name, "TRIG_NOW"))
#ifdef TRIG_NOW
return TRIG_NOW;
#else
goto not_there;
#endif
if (strEQ(name, "TRIG_RT"))
#ifdef TRIG_RT
return TRIG_RT;
#else
goto not_there;
#endif
if (strEQ(name, "TRIG_TIME"))
#ifdef TRIG_TIME
return TRIG_TIME;
#else
goto not_there;
#endif
if (strEQ(name, "TRIG_TIMER"))
#ifdef TRIG_TIMER
return TRIG_TIMER;
#else
goto not_there;
#endif
if (strEQ(name, "TRIG_WAKE_EOS"))
#ifdef TRIG_WAKE_EOS
return TRIG_WAKE_EOS;
#else
goto not_there;
#endif
if (strEQ(name, "TRIG_WRITE"))
#ifdef TRIG_WRITE
return TRIG_WRITE;
#else
goto not_there;
#endif
break;
case 'U':
if (strEQ(name, "UNIT_mA"))
#ifdef UNIT_mA
return UNIT_mA;
#else
goto not_there;
#endif
if (strEQ(name, "UNIT_none"))
#ifdef UNIT_none
return UNIT_none;
#else
goto not_there;
#endif
if (strEQ(name, "UNIT_volt"))
#ifdef UNIT_volt
return UNIT_volt;
#else
goto not_there;
#endif
break;
case 'V':
break;
case 'W':
break;
case 'X':
break;
case 'Y':
break;
case 'Z':
break;
}
errno = EINVAL;
return 0;
not_there:
errno = ENOENT;
return 0;
}
typedef struct comedi_trig_struct Trigger;
MODULE = Comedi PACKAGE = Comedi
double
constant(name,arg)
char * name
int arg
MODULE = Comedi PACKAGE = TriggerPtr PREFIX = tptr_
# create a new trigger
#
Trigger *
tptr_new(CLASS, subd, n)
char *CLASS
int subd
int n
CODE:
RETVAL = (Trigger *) malloc(sizeof(Trigger));
RETVAL->subdev = subd;
RETVAL->n = n;
fprintf(stderr, "new Trigger at 0x%08x: sub=%d, n=%d\n", RETVAL, RETVAL->subdev, RETVAL->n);
OUTPUT:
RETVAL
# destruct a trigger
#
void
tptr_DESTROY(self)
Trigger *self
CODE:
fprintf(stderr, "destroy Trigger at 0x%08x\n", self);
free((void *) self);