82 lines
1.6 KiB
C
Executable File

// Wrapper for libComedi I/O.
// These functions provide and interface to libComedi limited to use in
// the real time lab.
//
// 2006, Martin Korsgaard
#include <comedilib.h>
#include "io.h"
#include "channels.h"
// Pointer to libComedi device.
static comedi_t *it_g = NULL;
int io_init()
{
int i, status = 0;
it_g = comedi_open("/dev/comedi0");
if (it_g == NULL)
return 0;
for (i = 0; i < 8; i++) {
// comedi_dio_config is supposed to return 1 on success and -1 on error,
// but seems to return 0 on success on newest versions. Anyway, do a
// bitwise or, so that a single -1 will result in final value of -1.
status |= comedi_dio_config(it_g, PORT1, i, COMEDI_INPUT);
status |= comedi_dio_config(it_g, PORT2, i, COMEDI_OUTPUT);
status |= comedi_dio_config(it_g, PORT3, i+8, COMEDI_OUTPUT);
status |= comedi_dio_config(it_g, PORT4, i+16, COMEDI_INPUT);
}
return (status != -1);
}
void io_set_bit(int channel)
{
comedi_dio_write(it_g, channel >> 8, channel & 0xff, 1);
}
void io_clear_bit(int channel)
{
comedi_dio_write(it_g, channel >> 8, channel & 0xff, 0);
}
void io_write_analog(int channel, int value)
{
comedi_data_write(it_g, channel>>8, channel&0xff, 0, AREF_GROUND, value);
}
int io_read_bit(int channel)
{
unsigned int data=0;
comedi_dio_read(it_g, channel>>8, channel&0xff, &data);
return (int)data;
}
int io_read_analog(int channel)
{
lsampl_t data = 0;
comedi_data_read(it_g, channel>>8, channel&0xff, 0, AREF_GROUND, &data);
return (int)data;
}