]> sigrok.org Git - libsigrok.git/blob - device.c
sr/cli/gtk/qt: s/get_dev_info/dev_info_get/.
[libsigrok.git] / device.c
1 /*
2  * This file is part of the sigrok project.
3  *
4  * Copyright (C) 2010-2012 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 "sigrok.h"
23 #include "sigrok-internal.h"
24
25 static GSList *devs = NULL;
26
27 /**
28  * Scan the system for attached logic analyzers / devices.
29  *
30  * This will try to autodetect all supported logic analyzer devices:
31  *
32  *  - Those attached via USB (can be reliably detected via USB VID/PID).
33  *
34  *  - Those using a (real or virtual) serial port (detected by sending
35  *    device-specific commands to all OS-specific serial port devices such
36  *    as /dev/ttyS*, /dev/ttyUSB*, /dev/ttyACM*, and others).
37  *    The autodetection for this kind of devices can potentially be unreliable.
38  *
39  *    Also, sending various bytes/commands to (all!) devices which happen to
40  *    be attached to the system via a (real or virtual) serial port can be
41  *    problematic. There is no way for libsigrok to know how unknown devices
42  *    react to the bytes libsigrok sends. Potentially they could lead to the
43  *    device getting into invalid/error states, losing/overwriting data, or...
44  *
45  * In addition to the detection, the devices that are found are also
46  * initialized automatically. On some devices, this involves a firmware upload,
47  * or other such measures.
48  *
49  * The order in which the system is scanned for devices is not specified. The
50  * caller should not assume or rely on any specific order.
51  *
52  * After the system has been scanned for devices, the list of detected (and
53  * supported) devices can be acquired via sr_dev_list().
54  *
55  * TODO: Error checks?
56  * TODO: Option to only scan for specific devices or device classes.
57  *
58  * @return SR_OK upon success, SR_ERR upon errors.
59  */
60 SR_API int sr_dev_scan(void)
61 {
62         GSList *plugins, *l;
63         struct sr_dev_plugin *plugin;
64
65         if (!(plugins = sr_hw_list())) {
66                 sr_err("dev: %s: no supported devices/hwplugins", __func__);
67                 return SR_ERR; /* TODO: More specific error? */
68         }
69
70         /*
71          * Initialize all plugins first. Since the init() call may involve
72          * a firmware upload and associated delay, we may as well get all
73          * of these out of the way first.
74          */
75         for (l = plugins; l; l = l->next) {
76                 plugin = l->data;
77                 /* TODO: Handle 'plugin' being NULL. */
78                 sr_hw_init(plugin);
79         }
80
81         return SR_OK;
82 }
83
84 /**
85  * Return the list of logic analyzer devices libsigrok has detected.
86  *
87  * If the libsigrok-internal device list is empty, a scan for attached
88  * devices -- via a call to sr_dev_scan() -- is performed first.
89  *
90  * TODO: Error handling?
91  *
92  * @return The list (GSList) of detected devices, or NULL if none were found.
93  */
94 SR_API GSList *sr_dev_list(void)
95 {
96         if (!devs)
97                 sr_dev_scan();
98
99         return devs;
100 }
101
102 /**
103  * Create a new device.
104  *
105  * The device is added to the (libsigrok-internal) list of devices, but
106  * additionally a pointer to the newly created device is also returned.
107  *
108  * The device has no probes attached to it yet after this call. You can
109  * use sr_dev_probe_add() to add one or more probes.
110  *
111  * TODO: Should return int, so that we can return SR_OK, SR_ERR_* etc.
112  *
113  * It is the caller's responsibility to g_free() the allocated memory when
114  * no longer needed. TODO: Using which API function?
115  *
116  * @param plugin TODO.
117  *               If 'plugin' is NULL, the created device is a "virtual" one.
118  * @param plugin_index TODO
119  *
120  * @return Pointer to the newly allocated device, or NULL upon errors.
121  */
122 SR_API struct sr_dev *sr_dev_new(const struct sr_dev_plugin *plugin,
123                                  int plugin_index)
124 {
125         struct sr_dev *dev;
126
127         /* TODO: Check if plugin_index valid? */
128
129         if (!(dev = g_try_malloc0(sizeof(struct sr_dev)))) {
130                 sr_err("dev: %s: dev malloc failed", __func__);
131                 return NULL;
132         }
133
134         dev->plugin = (struct sr_dev_plugin *)plugin;
135         dev->plugin_index = plugin_index;
136         devs = g_slist_append(devs, dev);
137
138         return dev;
139 }
140
141 /**
142  * Add a probe with the specified name to the specified device.
143  *
144  * The added probe is automatically enabled (the 'enabled' field is TRUE).
145  *
146  * The 'trigger' field of the added probe is set to NULL. A trigger can be
147  * added via sr_dev_trigger_set().
148  *
149  * TODO: Are duplicate names allowed?
150  * TODO: Do we enforce a maximum probe number for a device?
151  * TODO: Error if the max. probe number for the specific LA is reached, e.g.
152  *       if the caller tries to add more probes than the device actually has.
153  *
154  * @param dev The device to which to add a probe with the specified name.
155  *            Must not be NULL.
156  * @param name The name of the probe to add to this device. Must not be NULL.
157  *             TODO: Maximum length, allowed characters, etc.
158  *
159  * @return SR_OK upon success, SR_ERR_MALLOC upon memory allocation errors,
160  *         or SR_ERR_ARG upon invalid arguments.
161  *         If something other than SR_OK is returned, 'dev' is unchanged.
162  */
163 SR_API int sr_dev_probe_add(struct sr_dev *dev, const char *name)
164 {
165         struct sr_probe *p;
166         int probenum;
167
168         if (!dev) {
169                 sr_err("dev: %s: dev was NULL", __func__);
170                 return SR_ERR_ARG;
171         }
172
173         if (!name) {
174                 sr_err("dev: %s: name was NULL", __func__);
175                 return SR_ERR_ARG;
176         }
177
178         /* TODO: Further checks to ensure name is valid. */
179
180         probenum = g_slist_length(dev->probes) + 1;
181
182         if (!(p = g_try_malloc0(sizeof(struct sr_probe)))) {
183                 sr_err("dev: %s: p malloc failed", __func__);
184                 return SR_ERR_MALLOC;
185         }
186
187         p->index = probenum;
188         p->enabled = TRUE;
189         p->name = g_strdup(name);
190         p->trigger = NULL;
191         dev->probes = g_slist_append(dev->probes, p);
192
193         return SR_OK;
194 }
195
196 /**
197  * Find the probe with the specified number in the specified device.
198  *
199  * TODO
200  *
201  * @param dev TODO. Must not be NULL.
202  * @param probenum The number of the probe whose 'struct sr_probe' we want.
203  *                 Note that the probe numbers start at 1 (not 0!).
204  *
205  * TODO: Should return int.
206  * TODO: probenum should be unsigned.
207  *
208  * @return A pointer to the requested probe's 'struct sr_probe', or NULL
209  *         if the probe could not be found.
210  */
211 SR_API struct sr_probe *sr_dev_probe_find(const struct sr_dev *dev,
212                                           int probenum)
213 {
214         GSList *l;
215         struct sr_probe *p, *found_probe;
216
217         if (!dev) {
218                 sr_err("dev: %s: dev was NULL", __func__);
219                 return NULL; /* TODO: SR_ERR_ARG */
220         }
221
222         /* TODO: Sanity check on probenum. */
223
224         found_probe = NULL;
225         for (l = dev->probes; l; l = l->next) {
226                 p = l->data;
227                 /* TODO: Check for p != NULL. */
228                 if (p->index == probenum) {
229                         found_probe = p;
230                         break;
231                 }
232         }
233
234         return found_probe;
235 }
236
237 /**
238  * Set the name of the specified probe in the specified device.
239  *
240  * If the probe already has a different name assigned to it, it will be
241  * removed, and the new name will be saved instead.
242  *
243  * TODO: Rename to sr_dev_probe_name_set().
244  *
245  * @param dev TODO
246  * @param probenum The number of the probe whose name to set.
247  *                 Note that the probe numbers start at 1 (not 0!).
248  * @param name The new name that the specified probe should get.
249  *
250  * @return SR_OK upon success, SR_ERR_ARG upon invalid arguments, or SR_ERR
251  *         upon other errors.
252  *         If something other than SR_OK is returned, 'dev' is unchanged.
253  */
254 SR_API int sr_dev_probe_name(struct sr_dev *dev, int probenum,
255                              const char *name)
256 {
257         struct sr_probe *p;
258
259         if (!dev) {
260                 sr_err("dev: %s: dev was NULL", __func__);
261                 return SR_ERR_ARG;
262         }
263
264         p = sr_dev_probe_find(dev, probenum);
265         if (!p) {
266                 sr_err("dev: %s: probe %d not found", __func__, probenum);
267                 return SR_ERR; /* TODO: More specific error? */
268         }
269
270         /* TODO: Sanity check on 'name'. */
271
272         /* If the probe already has a name, kill it first. */
273         g_free(p->name);
274
275         p->name = g_strdup(name);
276
277         return SR_OK;
278 }
279
280 /**
281  * Remove all triggers set up for the specified device.
282  *
283  * TODO: Better description.
284  *
285  * @param dev TODO
286  *
287  * @return SR_OK upon success, SR_ERR_ARG upon invalid arguments.
288  *         If something other than SR_OK is returned, 'dev' is unchanged.
289  */
290 SR_API int sr_dev_trigger_clear(struct sr_dev *dev)
291 {
292         struct sr_probe *p;
293         unsigned int pnum; /* TODO: uint16_t? */
294
295         if (!dev) {
296                 sr_err("dev: %s: dev was NULL", __func__);
297                 return SR_ERR_ARG;
298         }
299
300         if (!dev->probes) {
301                 sr_err("dev: %s: dev->probes was NULL", __func__);
302                 return SR_ERR_ARG;
303         }
304
305         for (pnum = 1; pnum <= g_slist_length(dev->probes); pnum++) {
306                 p = sr_dev_probe_find(dev, pnum);
307                 /* TODO: Silently ignore probes which cannot be found? */
308                 if (p) {
309                         g_free(p->trigger);
310                         p->trigger = NULL;
311                 }
312         }
313
314         return SR_OK;
315 }
316
317 /**
318  * Add a trigger to the specified device.
319  *
320  * TODO: Better description.
321  * TODO: Describe valid format of the 'trigger' string.
322  *
323  * @param dev TODO. Must not be NULL.
324  * @param probenum The number of the probe. TODO.
325  *                 Note that the probe numbers start at 1 (not 0!).
326  * @param trigger TODO.
327  *                TODO: Is NULL allowed?
328  *
329  * @return SR_OK upon success, SR_ERR_ARG upon invalid arguments, or SR_ERR
330  *         upon other errors.
331  *         If something other than SR_OK is returned, 'dev' is unchanged.
332  */
333 SR_API int sr_dev_trigger_set(struct sr_dev *dev, int probenum,
334                               const char *trigger)
335 {
336         struct sr_probe *p;
337
338         if (!dev) {
339                 sr_err("dev: %s: dev was NULL", __func__);
340                 return SR_ERR_ARG;
341         }
342
343         /* TODO: Sanity check on 'probenum'. */
344
345         /* TODO: Sanity check on 'trigger'. */
346
347         p = sr_dev_probe_find(dev, probenum);
348         if (!p) {
349                 sr_err("dev: %s: probe %d not found", __func__, probenum);
350                 return SR_ERR; /* TODO: More specific error? */
351         }
352
353         /* If the probe already has a trigger, kill it first. */
354         g_free(p->trigger);
355
356         p->trigger = g_strdup(trigger);
357
358         return SR_OK;
359 }
360
361 /**
362  * Determine whether the specified device has the specified capability.
363  *
364  * TODO: Should return int?
365  *
366  * @param dev Pointer to the device to be checked. Must not be NULL.
367  *            The device's 'plugin' field must not be NULL either.
368  * @param hwcap The capability that should be checked (whether it's supported
369  *              by the specified device).
370  *
371  * @return TRUE, if the device has the specified capability, FALSE otherwise.
372  *         FALSE is also returned upon invalid input parameters or other
373  *         error conditions.
374  */
375 SR_API gboolean sr_dev_has_hwcap(const struct sr_dev *dev, int hwcap)
376 {
377         int *hwcaps, i;
378
379         if (!dev) {
380                 sr_err("dev: %s: dev was NULL", __func__);
381                 return FALSE; /* TODO: SR_ERR_ARG. */
382         }
383
384         if (!dev->plugin) {
385                 sr_err("dev: %s: dev->plugin was NULL", __func__);
386                 return FALSE; /* TODO: SR_ERR_ARG. */
387         }
388
389         /* TODO: Sanity check on 'hwcap'. */
390
391         if (!(hwcaps = dev->plugin->hwcap_get_all())) {
392                 sr_err("dev: %s: dev has no capabilities", __func__);
393                 return FALSE; /* TODO: SR_ERR*. */
394         }
395
396         for (i = 0; hwcaps[i]; i++) {
397                 if (hwcaps[i] != hwcap)
398                         continue;
399                 sr_spew("dev: %s: found hwcap %d", __func__, hwcap);
400                 return TRUE;
401         }
402
403         sr_spew("dev: %s: hwcap %d not found", __func__, hwcap);
404
405         return FALSE;
406 }
407
408 /**
409  * Returns information about the given device.
410  *
411  * @param dev Pointer to the device to be checked. Must not be NULL.
412  *            The device's 'plugin' field must not be NULL either.
413  * @param id The type of information.
414  * @param data The return value. Must not be NULL.
415  *
416  * @return SR_OK upon success, SR_ERR_ARG upon invalid arguments, or SR_ERR
417  *         upon other errors.
418  */
419 SR_API int sr_dev_info_get(const struct sr_dev *dev, int id, const void **data)
420 {
421         if ((dev == NULL) || (dev->plugin == NULL))
422                 return SR_ERR_ARG;
423
424         if (data == NULL)
425                 return SR_ERR_ARG;
426
427         *data = dev->plugin->dev_info_get(dev->plugin_index, id);
428
429         if (*data == NULL)
430                 return SR_ERR;
431
432         return SR_OK;
433 }