Added comedi_set_filter() and comedi_set_routing() configuration
[comedilib.git] / lib / insn_config_wrappers.c
1 /*
2     lib/insn_config_wrappers.c
3     wrappers for various INSN_CONFIG instructions
4
5     COMEDILIB - Linux Control and Measurement Device Interface Library
6     Copyright (C) 1997-2001 David A. Schleef <ds@schleef.org>
7     Copyright (C) 2008 Frank Mori Hess <fmhess@users.sourceforge.net>
8
9     This library is free software; you can redistribute it and/or
10     modify it under the terms of the GNU Lesser General Public
11     License as published by the Free Software Foundation; either
12     version 2.1 of the License, or (at your option) any later version.
13
14     This library is distributed in the hope that it will be useful,
15     but WITHOUT ANY WARRANTY; without even the implied warranty of
16     MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
17     Lesser General Public License for more details.
18
19     You should have received a copy of the GNU Lesser General Public
20     License along with this library; if not, write to the Free Software
21     Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307
22     USA.
23 */
24
25 #include <string.h>
26
27 #include "libinternal.h"
28
29 EXPORT_ALIAS_DEFAULT(_comedi_reset,comedi_reset,0.9.0);
30 int _comedi_reset(comedi_t *device, unsigned subdevice)
31 {
32         comedi_insn insn;
33         lsampl_t data[1];
34
35         memset(&insn, 0, sizeof(comedi_insn));
36         insn.insn = INSN_CONFIG;
37         insn.subdev = subdevice;
38         insn.chanspec = 0;
39         insn.data = data;
40         insn.n = sizeof(data) / sizeof(data[0]);
41         data[0] = INSN_CONFIG_RESET;
42
43         if(comedi_do_insn(device, &insn) >= 0) return 0;
44         else return -1;
45 }
46
47 EXPORT_ALIAS_DEFAULT(_comedi_arm,comedi_arm,0.9.0);
48 int _comedi_arm(comedi_t *device, unsigned subdevice, unsigned target)
49 {
50         comedi_insn insn;
51         lsampl_t data[2];
52
53         memset(&insn, 0, sizeof(comedi_insn));
54         insn.insn = INSN_CONFIG;
55         insn.subdev = subdevice;
56         insn.chanspec = 0;
57         insn.data = data;
58         insn.n = sizeof(data) / sizeof(data[0]);
59         data[0] = INSN_CONFIG_ARM;
60         data[1] = target;
61
62         if(comedi_do_insn(device, &insn) >= 0) return 0;
63         else return -1;
64 }
65
66 EXPORT_ALIAS_DEFAULT(_comedi_set_counter_mode,comedi_set_counter_mode,0.9.0);
67 int _comedi_set_counter_mode(comedi_t *device, unsigned subdevice, unsigned mode_bits)
68 {
69         comedi_insn insn;
70         lsampl_t data[2];
71
72         memset(&insn, 0, sizeof(comedi_insn));
73         insn.insn = INSN_CONFIG;
74         insn.subdev = subdevice;
75         insn.chanspec = 0;
76         insn.data = data;
77         insn.n = sizeof(data) / sizeof(data[0]);
78         data[0] = INSN_CONFIG_SET_COUNTER_MODE;
79         data[1] = mode_bits;
80
81         if(comedi_do_insn(device, &insn) >= 0) return 0;
82         else return -1;
83 }
84
85 EXPORT_ALIAS_DEFAULT(_comedi_set_clock_source,comedi_set_clock_source,0.9.0);
86 int _comedi_set_clock_source(comedi_t *device, unsigned subdevice, unsigned clock, unsigned period_ns)
87 {
88         comedi_insn insn;
89         lsampl_t data[3];
90
91         memset(&insn, 0, sizeof(comedi_insn));
92         insn.insn = INSN_CONFIG;
93         insn.subdev = subdevice;
94         insn.chanspec = 0;
95         insn.data = data;
96         insn.n = sizeof(data) / sizeof(data[0]);
97         data[0] = INSN_CONFIG_SET_CLOCK_SRC;
98         data[1] = clock;
99         data[2] = period_ns;
100
101         if(comedi_do_insn(device, &insn) >= 0) return 0;
102         else return -1;
103 }
104
105 EXPORT_ALIAS_DEFAULT(_comedi_set_filter,comedi_set_filter,0.9.0);
106 int _comedi_set_filter(comedi_t *device, unsigned subdevice, unsigned channel, unsigned filter)
107 {
108         comedi_insn insn;
109         lsampl_t data[2];
110
111         memset(&insn, 0, sizeof(comedi_insn));
112         insn.insn = INSN_CONFIG;
113         insn.subdev = subdevice;
114         insn.chanspec = channel;
115         insn.data = data;
116         insn.n = sizeof(data) / sizeof(data[0]);
117         data[0] = INSN_CONFIG_FILTER;
118         data[1] = filter;
119
120         if(comedi_do_insn(device, &insn) >= 0) return 0;
121         else return -1;
122 }
123
124 EXPORT_ALIAS_DEFAULT(_comedi_set_gate_source,comedi_set_gate_source,0.9.0);
125 int _comedi_set_gate_source(comedi_t *device, unsigned subdevice, unsigned gate_index, unsigned gate_source)
126 {
127         comedi_insn insn;
128         lsampl_t data[3];
129
130         memset(&insn, 0, sizeof(comedi_insn));
131         insn.insn = INSN_CONFIG;
132         insn.subdev = subdevice;
133         insn.chanspec = 0;
134         insn.data = data;
135         insn.n = sizeof(data) / sizeof(data[0]);
136         data[0] = INSN_CONFIG_SET_GATE_SRC;
137         data[1] = gate_index;
138         data[2] = gate_source;
139
140         if(comedi_do_insn(device, &insn) >= 0) return 0;
141         else return -1;
142 }
143
144 EXPORT_ALIAS_DEFAULT(_comedi_internal_trigger,comedi_internal_trigger,0.9.0);
145 int comedi_internal_trigger(comedi_t *dev, unsigned subd, unsigned trignum)
146 {
147         comedi_insn insn;
148         lsampl_t data[1];
149
150         memset(&insn, 0, sizeof(comedi_insn));
151         insn.insn = INSN_INTTRIG;
152         insn.subdev = subd;
153         insn.data = data;
154         insn.n = 1;
155
156         data[0] = trignum;
157
158         if(comedi_do_insn(dev, &insn) >= 0) return 0;
159         else return -1;
160 }
161
162 EXPORT_ALIAS_DEFAULT(_comedi_set_other_source,comedi_set_other_source,0.9.0);
163 int _comedi_set_other_source(comedi_t *device, unsigned subdevice,
164         unsigned other, unsigned source)
165 {
166         comedi_insn insn;
167         lsampl_t data[3];
168         int retval;
169
170         memset(&insn, 0, sizeof(comedi_insn));
171         insn.insn = INSN_CONFIG;
172         insn.subdev = subdevice;
173         insn.chanspec = 0;
174         insn.data = data;
175         insn.n = sizeof(data) / sizeof(data[0]);
176         data[0] = INSN_CONFIG_SET_OTHER_SRC;
177         data[1] = other;
178         data[2] = source;
179
180         retval = comedi_do_insn(device, &insn);
181         if(retval < 0)
182         {
183                 fprintf(stderr, "%s: error:\n", __FUNCTION__);
184                 comedi_perror("comedi_do_insn");
185                 return retval;
186         }
187         if(comedi_do_insn(device, &insn) >= 0) return 0;
188         else return -1;
189 }
190
191 EXPORT_ALIAS_DEFAULT(_comedi_set_routing,comedi_set_routing,0.9.0);
192 int _comedi_set_routing(comedi_t *device, unsigned subdevice, unsigned channel, unsigned routing)
193 {
194         comedi_insn insn;
195         lsampl_t data[2];
196
197         memset(&insn, 0, sizeof(comedi_insn));
198         insn.insn = INSN_CONFIG;
199         insn.subdev = subdevice;
200         insn.chanspec = channel;
201         insn.data = data;
202         insn.n = sizeof(data) / sizeof(data[0]);
203         data[0] = INSN_CONFIG_SET_ROUTING;
204         data[1] = routing;
205
206         if(comedi_do_insn(device, &insn) >= 0) return 0;
207         else return -1;
208 }