]> sigrok.org Git - libsigrok.git/blob - device.c
Adjust to GVariant-based sr_config_* functions
[libsigrok.git] / device.c
1 /*
2  * This file is part of the sigrok project.
3  *
4  * Copyright (C) 2013 Bert Vermeulen <bert@biot.com>
5  *
6  * This program is free software: you can redistribute it and/or modify
7  * it under the terms of the GNU General Public License as published by
8  * the Free Software Foundation, either version 3 of the License, or
9  * (at your option) any later version.
10  *
11  * This program is distributed in the hope that it will be useful,
12  * but WITHOUT ANY WARRANTY; without even the implied warranty of
13  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
14  * GNU General Public License for more details.
15  *
16  * You should have received a copy of the GNU General Public License
17  * along with this program.  If not, see <http://www.gnu.org/licenses/>.
18  */
19
20 #include <stdio.h>
21 #include <glib.h>
22 #include "config.h" /* Needed for HAVE_LIBUSB_1_0 and others. */
23 #include "libsigrok.h"
24 #include "libsigrok-internal.h"
25
26 /* Message logging helpers with driver-specific prefix string. */
27 #define DRIVER_LOG_DOMAIN "device: "
28 #define sr_log(l, s, args...) sr_log(l, DRIVER_LOG_DOMAIN s, ## args)
29 #define sr_spew(s, args...) sr_spew(DRIVER_LOG_DOMAIN s, ## args)
30 #define sr_dbg(s, args...) sr_dbg(DRIVER_LOG_DOMAIN s, ## args)
31 #define sr_info(s, args...) sr_info(DRIVER_LOG_DOMAIN s, ## args)
32 #define sr_warn(s, args...) sr_warn(DRIVER_LOG_DOMAIN s, ## args)
33 #define sr_err(s, args...) sr_err(DRIVER_LOG_DOMAIN s, ## args)
34
35 /**
36  * @file
37  *
38  * Device handling in libsigrok.
39  */
40
41 /**
42  * @defgroup grp_devices Devices
43  *
44  * Device handling in libsigrok.
45  *
46  * @{
47  */
48
49 /** @private */
50 SR_PRIV struct sr_probe *sr_probe_new(int index, int type,
51                 gboolean enabled, const char *name)
52 {
53         struct sr_probe *probe;
54
55         if (!(probe = g_try_malloc0(sizeof(struct sr_probe)))) {
56                 sr_err("Probe malloc failed.");
57                 return NULL;
58         }
59
60         probe->index = index;
61         probe->type = type;
62         probe->enabled = enabled;
63         if (name)
64                 probe->name = g_strdup(name);
65
66         return probe;
67 }
68
69 /**
70  * Set the name of the specified probe in the specified device.
71  *
72  * If the probe already has a different name assigned to it, it will be
73  * removed, and the new name will be saved instead.
74  *
75  * @param sdi The device instance the probe is connected to.
76  * @param probenum The number of the probe whose name to set.
77  *                 Note that the probe numbers start at 0.
78  * @param name The new name that the specified probe should get. A copy
79  *             of the string is made.
80  *
81  * @return SR_OK on success, or SR_ERR_ARG on invalid arguments.
82  */
83 SR_API int sr_dev_probe_name_set(const struct sr_dev_inst *sdi,
84                 int probenum, const char *name)
85 {
86         GSList *l;
87         struct sr_probe *probe;
88         int ret;
89
90         if (!sdi) {
91                 sr_err("%s: sdi was NULL", __func__);
92                 return SR_ERR_ARG;
93         }
94
95         ret = SR_ERR_ARG;
96         for (l = sdi->probes; l; l = l->next) {
97                 probe = l->data;
98                 if (probe->index == probenum) {
99                         g_free(probe->name);
100                         probe->name = g_strdup(name);
101                         ret = SR_OK;
102                         break;
103                 }
104         }
105
106         return ret;
107 }
108
109 /**
110  * Enable or disable a probe on the specified device.
111  *
112  * @param sdi The device instance the probe is connected to.
113  * @param probenum The probe number, starting from 0.
114  * @param state TRUE to enable the probe, FALSE to disable.
115  *
116  * @return SR_OK on success, or SR_ERR_ARG on invalid arguments.
117  */
118 SR_API int sr_dev_probe_enable(const struct sr_dev_inst *sdi, int probenum,
119                 gboolean state)
120 {
121         GSList *l;
122         struct sr_probe *probe;
123         int ret;
124
125         if (!sdi)
126                 return SR_ERR_ARG;
127
128         ret = SR_ERR_ARG;
129         for (l = sdi->probes; l; l = l->next) {
130                 probe = l->data;
131                 if (probe->index == probenum) {
132                         probe->enabled = state;
133                         ret = SR_OK;
134                         break;
135                 }
136         }
137
138         return ret;
139 }
140
141 /**
142  * Add a trigger to the specified device (and the specified probe).
143  *
144  * If the specified probe of this device already has a trigger, it will
145  * be silently replaced.
146  *
147  * @param sdi Must not be NULL.
148  * @param probenum The probe number, starting from 0.
149  * @param trigger Trigger string, in the format used by sigrok-cli
150  *
151  * @return SR_OK on success, or SR_ERR_ARG on invalid arguments.
152  */
153 SR_API int sr_dev_trigger_set(const struct sr_dev_inst *sdi, int probenum,
154                 const char *trigger)
155 {
156         GSList *l;
157         struct sr_probe *probe;
158         int ret;
159
160         if (!sdi)
161                 return SR_ERR_ARG;
162
163         ret = SR_ERR_ARG;
164         for (l = sdi->probes; l; l = l->next) {
165                 probe = l->data;
166                 if (probe->index == probenum) {
167                         /* If the probe already has a trigger, kill it first. */
168                         g_free(probe->trigger);
169                         probe->trigger = g_strdup(trigger);
170                         ret = SR_OK;
171                         break;
172                 }
173         }
174
175         return ret;
176 }
177
178 /**
179  * Determine whether the specified device instance has the specified
180  * capability.
181  *
182  * @param sdi Pointer to the device instance to be checked. Must not be NULL.
183  *            If the device's 'driver' field is NULL (virtual device), this
184  *            function will always return FALSE (virtual devices don't have
185  *            a hardware capabilities list).
186  * @param key The option that should be checked for support on the
187  *            specified device.
188  *
189  * @return TRUE if the device has the specified option, FALSE otherwise.
190  *         FALSE is also returned on invalid input parameters or other
191  *         error conditions.
192  */
193 SR_API gboolean sr_dev_has_option(const struct sr_dev_inst *sdi, int key)
194 {
195         GVariant *gvar;
196         const int *devopts;
197         gsize num_opts, i;
198         int ret;
199
200         if (!sdi || !sdi->driver || !sdi->driver->config_list)
201                 return FALSE;
202
203         if (sdi->driver->config_list(SR_CONF_DEVICE_OPTIONS, &gvar, NULL) != SR_OK)
204                 return FALSE;
205
206         ret = FALSE;
207         devopts = g_variant_get_fixed_array(gvar, &num_opts, sizeof(int32_t));
208         for (i = 0; i < num_opts; i++) {
209                 if (devopts[i] == key) {
210                         ret = TRUE;
211                         break;
212                 }
213         }
214         g_variant_unref(gvar);
215
216         return ret;
217 }
218
219 /** @private */
220 SR_PRIV struct sr_dev_inst *sr_dev_inst_new(int index, int status,
221                 const char *vendor, const char *model, const char *version)
222 {
223         struct sr_dev_inst *sdi;
224
225         if (!(sdi = g_try_malloc(sizeof(struct sr_dev_inst)))) {
226                 sr_err("Device instance malloc failed.");
227                 return NULL;
228         }
229
230         sdi->driver = NULL;
231         sdi->index = index;
232         sdi->status = status;
233         sdi->inst_type = -1;
234         sdi->vendor = vendor ? g_strdup(vendor) : NULL;
235         sdi->model = model ? g_strdup(model) : NULL;
236         sdi->version = version ? g_strdup(version) : NULL;
237         sdi->probes = NULL;
238         sdi->priv = NULL;
239
240         return sdi;
241 }
242
243 /** @private */
244 SR_PRIV void sr_dev_inst_free(struct sr_dev_inst *sdi)
245 {
246         struct sr_probe *probe;
247         GSList *l;
248
249         for (l = sdi->probes; l; l = l->next) {
250                 probe = l->data;
251                 g_free(probe->name);
252                 g_free(probe);
253         }
254
255         g_free(sdi->priv);
256         g_free(sdi->vendor);
257         g_free(sdi->model);
258         g_free(sdi->version);
259         g_free(sdi);
260
261 }
262
263 #ifdef HAVE_LIBUSB_1_0
264
265 /** @private */
266 SR_PRIV struct sr_usb_dev_inst *sr_usb_dev_inst_new(uint8_t bus,
267                         uint8_t address, struct libusb_device_handle *hdl)
268 {
269         struct sr_usb_dev_inst *udi;
270
271         if (!(udi = g_try_malloc(sizeof(struct sr_usb_dev_inst)))) {
272                 sr_err("USB device instance malloc failed.");
273                 return NULL;
274         }
275
276         udi->bus = bus;
277         udi->address = address;
278         udi->devhdl = hdl;
279
280         return udi;
281 }
282
283 /** @private */
284 SR_PRIV void sr_usb_dev_inst_free(struct sr_usb_dev_inst *usb)
285 {
286         (void)usb;
287
288         /* Nothing to do for this device instance type. */
289 }
290
291 #endif
292
293 /** @private
294  * @param pathname OS-specific serial port specification. Examples:
295  * "/dev/ttyUSB0", "/dev/ttyACM1", "/dev/tty.Modem-0", "COM1".
296  * @param serialcomm A serial communication parameters string, in the form
297  * of <speed>/<data bits><parity><stopbits>, for example "9600/8n1" or
298  * "600/7o2". This is an optional parameter; it may be filled in later.
299  * @return A pointer to a newly initialized struct sr_serial_dev_inst,
300  * or NULL on error.
301  *
302  * Both parameters are copied to newly allocated strings, and freed
303  * automatically by sr_serial_dev_inst_free().
304  */
305 SR_PRIV struct sr_serial_dev_inst *sr_serial_dev_inst_new(const char *port,
306                 const char *serialcomm)
307 {
308         struct sr_serial_dev_inst *serial;
309
310         if (!port) {
311                 sr_err("Serial port required.");
312                 return NULL;
313         }
314
315         if (!(serial = g_try_malloc0(sizeof(struct sr_serial_dev_inst)))) {
316                 sr_err("Serial device instance malloc failed.");
317                 return NULL;
318         }
319
320         serial->port = g_strdup(port);
321         if (serialcomm)
322                 serial->serialcomm = g_strdup(serialcomm);
323         serial->fd = -1;
324
325         return serial;
326 }
327
328 /** @private */
329 SR_PRIV void sr_serial_dev_inst_free(struct sr_serial_dev_inst *serial)
330 {
331         g_free(serial->port);
332         g_free(serial->serialcomm);
333         g_free(serial);
334 }
335
336 SR_API GSList *sr_dev_inst_list(const struct sr_dev_driver *driver)
337 {
338         if (driver && driver->dev_list)
339                 return driver->dev_list();
340         else
341                 return NULL;
342 }
343
344 SR_API int sr_dev_inst_clear(const struct sr_dev_driver *driver)
345 {
346         if (driver && driver->dev_clear)
347                 return driver->dev_clear();
348         else
349                 return SR_OK;
350 }
351
352 /** @} */