add generic serial_device_instance and helper, add trigger DI
[sigrok:sigrok.git] / backend / hwplugin.h
1 /*
2  *   sigrok - hwplugin.h
3  *
4  *   Copyright (C) 2010 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 #ifndef HWPLUGIN_H_
21 #define HWPLUGIN_H_
22
23 #include <stdint.h>
24
25 #include "device.h"
26
27
28 /* hardware plugin capabilities */
29 enum {
30         HWCAP_DUMMY,
31         HWCAP_LOGIC_ANALYZER,
32         HWCAP_SAMPLERATE,
33         HWCAP_CAPTURE_RATIO,
34         HWCAP_LIMIT_SECONDS,
35         HWCAP_LIMIT_SAMPLES
36 };
37
38
39 struct hwcap_option {
40         int capability;
41         char *description;
42         char *shortname;
43 };
44
45 struct usb_device_instance {
46         int index;
47         int status;
48         uint8_t bus;
49         uint8_t address;
50         struct libusb_device_handle *devhdl;
51 };
52
53 struct serial_device_instance {
54         int index;
55         int status;
56         char *model;
57         char *port;
58         int fd;
59 };
60
61 /* device instance status */
62 enum {
63         ST_NOT_FOUND,
64         /* found, but still booting */
65         ST_INITIALIZING,
66         /* live, but not in use */
67         ST_INACTIVE,
68         /* actively in use in a session */
69         ST_ACTIVE
70 };
71
72 /* TODO: this sucks, you just kinda have to "know" the returned type */
73 /* device info IDs */
74 enum {
75         /* string identifying this specific device in the system */
76         DI_IDENTIFIER,
77         /* the number of probes connected to this device */
78         DI_NUM_PROBES,
79         /* the samples rates this device supports, as a 0-terminated array of float */
80         DI_SAMPLE_RATES,
81         /* types of trigger supported, out of "01crf" */
82         DI_TRIGGER_TYPES,
83 };
84
85 struct device_plugin {
86         /* plugin-specific */
87         char *name;
88         int api_version;
89         int (*init) (char *deviceinfo);
90         void (*cleanup) (void);
91
92         /* device-specific */
93         int (*open) (int device_index);
94         void (*close) (int device_index);
95         char *(*get_device_info) (int device_index, int device_info_id);
96         int (*get_status) (int device_index);
97         int *(*get_capabilities) (void);
98         int (*set_configuration) (int device_index, int capability, char *value);
99         int (*start_acquisition) (int device_index, gpointer session_device_id);
100         void (*stop_acquisition) (int device_index, gpointer session_device_id);
101 };
102
103
104 struct device_plugin_io {
105         int fd;
106         GFunc callback;
107         gpointer data;
108         unsigned int timeout_ms;
109 };
110
111
112 int load_hwplugins(void);
113 GSList *list_hwplugins(void);
114 struct usb_device_instance *usb_device_instance_new(int index, int status, uint8_t bus,
115                 uint8_t address, struct libusb_device_handle *hdl);
116 struct usb_device_instance *get_usb_device_instance(GSList *usb_devices, int device_index);
117 struct serial_device_instance *get_serial_device_instance(GSList *serial_devices, int device_index);
118 struct hwcap_option *find_hwcap_option(int hwcap);
119
120
121 #endif /* HWPLUGIN_H_ */