00001
00002
00003
00004
00005 #include <stdio.h>
00006 #include <comedilib.h>
00007 #include <fcntl.h>
00008 #include <unistd.h>
00009 #include <errno.h>
00010 #include <getopt.h>
00011 #include <ctype.h>
00012 #include <malloc.h>
00013 #include <string.h>
00014 #include <stdlib.h>
00015 #include "comedi_common.h"
00016
00017 #if OROCOS_TARGET == lxrt
00018 void comedi_perror(const char *s)
00019 {
00020 if(!s)s="comedilib";
00021 fprintf(stderr,"comedi error in %s\n",s);
00022 }
00023 #endif
00024
00025
00026 int arm(comedi_t *device, unsigned subdevice, lsampl_t source)
00027 {
00028 comedi_insn insn;
00029 lsampl_t data[2];
00030 int retval;
00031
00032 memset(&insn, 0, sizeof(comedi_insn));
00033 insn.insn = INSN_CONFIG;
00034 insn.subdev = subdevice;
00035 insn.chanspec = 0;
00036 insn.data = data;
00037 insn.n = sizeof(data) / sizeof(data[0]);
00038 data[0] = INSN_CONFIG_ARM;
00039 data[1] = source;
00040
00041 retval = comedi_do_insn(device, &insn);
00042 if(retval < 0)
00043 {
00044 fprintf(stderr, "%s: error:\n", __FUNCTION__);
00045 comedi_perror("comedi_do_insn");
00046 return retval;
00047 }
00048 return 0;
00049 }
00050
00051 int disarm(comedi_t *device, unsigned subdevice)
00052 {
00053 comedi_insn insn;
00054 lsampl_t data[1];
00055 int retval;
00056
00057 memset(&insn, 0, sizeof(comedi_insn));
00058 insn.insn = INSN_CONFIG;
00059 insn.subdev = subdevice;
00060 insn.chanspec = 0;
00061 insn.data = data;
00062 insn.n = sizeof(data) / sizeof(data[0]);
00063 data[0] = INSN_CONFIG_DISARM;
00064
00065 retval = comedi_do_insn(device, &insn);
00066 if(retval < 0)
00067 {
00068 fprintf(stderr, "%s: error:\n", __FUNCTION__);
00069 comedi_perror("comedi_do_insn");
00070 return retval;
00071 }
00072 return 0;
00073 }
00074
00075
00076
00077 int reset_counter(comedi_t *device, unsigned subdevice)
00078 {
00079 comedi_insn insn;
00080 lsampl_t data[1];
00081 int retval;
00082
00083 memset(&insn, 0, sizeof(comedi_insn));
00084 insn.insn = INSN_CONFIG;
00085 insn.subdev = subdevice;
00086 insn.chanspec = 0;
00087 insn.data = data;
00088 insn.n = sizeof(data) / sizeof(data[0]);
00089 data[0] = INSN_CONFIG_RESET;
00090
00091 retval = comedi_do_insn(device, &insn);
00092 if(retval < 0)
00093 {
00094 fprintf(stderr, "%s: error:\n", __FUNCTION__);
00095 comedi_perror("comedi_do_insn");
00096 return retval;
00097 }
00098 return 0;
00099 }
00100
00101 int set_counter_mode(comedi_t *device, unsigned subdevice, lsampl_t mode_bits)
00102 {
00103 comedi_insn insn;
00104 lsampl_t data[2];
00105 int retval;
00106
00107 memset(&insn, 0, sizeof(comedi_insn));
00108 insn.insn = INSN_CONFIG;
00109 insn.subdev = subdevice;
00110 insn.chanspec = 0;
00111 insn.data = data;
00112 insn.n = sizeof(data) / sizeof(data[0]);
00113 data[0] = INSN_CONFIG_SET_COUNTER_MODE;
00114 data[1] = mode_bits;
00115
00116 retval = comedi_do_insn(device, &insn);
00117 if(retval < 0)
00118 {
00119 fprintf(stderr, "%s: error:\n", __FUNCTION__);
00120 comedi_perror("comedi_do_insn");
00121 return retval;
00122 }
00123 return 0;
00124 }
00125
00126 int set_clock_source(comedi_t *device, unsigned subdevice, lsampl_t clock, lsampl_t period_ns)
00127 {
00128 comedi_insn insn;
00129 lsampl_t data[3];
00130 int retval;
00131
00132 memset(&insn, 0, sizeof(comedi_insn));
00133 insn.insn = INSN_CONFIG;
00134 insn.subdev = subdevice;
00135 insn.chanspec = 0;
00136 insn.data = data;
00137 insn.n = sizeof(data) / sizeof(data[0]);
00138 data[0] = INSN_CONFIG_SET_CLOCK_SRC;
00139 data[1] = clock;
00140 data[2] = period_ns;
00141
00142 retval = comedi_do_insn(device, &insn);
00143 if(retval < 0)
00144 {
00145 fprintf(stderr, "%s: error:\n", __FUNCTION__);
00146 comedi_perror("comedi_do_insn");
00147 return retval;
00148 }
00149 return 0;
00150 }
00151
00152 int set_gate_source(comedi_t *device, unsigned subdevice, lsampl_t gate_index, lsampl_t gate_source)
00153 {
00154 comedi_insn insn;
00155 lsampl_t data[3];
00156 int retval;
00157
00158 memset(&insn, 0, sizeof(comedi_insn));
00159 insn.insn = INSN_CONFIG;
00160 insn.subdev = subdevice;
00161 insn.chanspec = 0;
00162 insn.data = data;
00163 insn.n = sizeof(data) / sizeof(data[0]);
00164 data[0] = INSN_CONFIG_SET_GATE_SRC;
00165 data[1] = gate_index;
00166 data[2] = gate_source;
00167
00168 retval = comedi_do_insn(device, &insn);
00169 if(retval < 0)
00170 {
00171 fprintf(stderr, "%s: error:\n", __FUNCTION__);
00172 comedi_perror("comedi_do_insn");
00173 return retval;
00174 }
00175 return 0;
00176 }
00177
00178 int comedi_internal_trigger(comedi_t *dev, unsigned int subd, unsigned int trignum)
00179 {
00180 comedi_insn insn;
00181 lsampl_t data[1];
00182
00183 memset(&insn, 0, sizeof(comedi_insn));
00184 insn.insn = INSN_INTTRIG;
00185 insn.subdev = subd;
00186 insn.data = data;
00187 insn.n = 1;
00188
00189 data[0] = trignum;
00190
00191 return comedi_do_insn(dev, &insn);
00192 }