]> sigrok.org Git - libsigrok.git/blob - sigrok.h
946c5470217387cf1bcc864e0b447d248dfc74f8
[libsigrok.git] / sigrok.h
1 /*
2  * This file is part of the sigrok project.
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 SIGROK_SIGROK_H
21 #define SIGROK_SIGROK_H
22
23 #include <stdio.h>
24 #include <sys/time.h>
25 #include <stdint.h>
26 #include <inttypes.h>
27 #include <glib.h>
28 #ifdef HAVE_LIBUSB_1_0
29 #include <libusb.h>
30 #endif
31
32 #ifdef __cplusplus
33 extern "C" {
34 #endif
35
36 /*
37  * Status/error codes returned by libsigrok functions.
38  *
39  * All possible return codes of libsigrok functions must be listed here.
40  * Functions should never return hardcoded numbers as status, but rather
41  * use these #defines instead. All error codes are negative numbers.
42  *
43  * The error codes are globally unique in libsigrok, i.e. if one of the
44  * libsigrok functions returns a "malloc error" it must be exactly the same
45  * return value as used by all other functions to indicate "malloc error".
46  * There must be no functions which indicate two different errors via the
47  * same return code.
48  *
49  * Also, for compatibility reasons, no defined return codes are ever removed
50  * or reused for different #defines later. You can only add new #defines and
51  * return codes, but never remove or redefine existing ones.
52  */
53 #define SR_OK                 0 /* No error */
54 #define SR_ERR               -1 /* Generic/unspecified error */
55 #define SR_ERR_MALLOC        -2 /* Malloc/calloc/realloc error */
56 #define SR_ERR_SAMPLERATE    -3 /* Incorrect samplerate */
57
58 #define SR_MAX_NUM_PROBES       64 /* Limited by uint64_t. */
59 #define SR_MAX_PROBENAME_LEN    32
60
61 /* Handy little macros */
62 #define SR_KHZ(n) ((n) * 1000)
63 #define SR_MHZ(n) ((n) * 1000000)
64 #define SR_GHZ(n) ((n) * 1000000000)
65
66 #define SR_HZ_TO_NS(n) (1000000000 / (n))
67
68 typedef int (*sr_receive_data_callback) (int fd, int revents, void *user_data);
69
70 /* Data types used by hardware plugins for set_configuration() */
71 enum {
72         SR_T_UINT64,
73         SR_T_CHAR,
74         SR_T_NULL,
75 };
76
77 enum {
78         SR_PROTO_RAW,
79 };
80
81 /* (Unused) protocol decoder stack entry */
82 struct sr_protocol {
83         char *name;
84         int id;
85         int stackindex;
86 };
87
88 /* sr_datafeed_packet.type values */
89 enum {
90         SR_DF_HEADER,
91         SR_DF_END,
92         SR_DF_TRIGGER,
93         SR_DF_LOGIC,
94         SR_DF_ANALOG,
95         SR_DF_PD,
96 };
97
98 struct sr_datafeed_packet {
99         uint16_t type;
100         uint64_t length;
101         uint16_t unitsize;
102         void *payload;
103 };
104
105 struct sr_datafeed_header {
106         int feed_version;
107         struct timeval starttime;
108         uint64_t samplerate;
109         int protocol_id;
110         int num_analog_probes;
111         int num_logic_probes;
112 };
113
114 struct sr_analog_probe {
115         uint8_t att;
116         uint8_t res;    /* Needs to be a power of 2, FIXME */
117         uint16_t val;   /* Max hardware ADC width is 16bits */
118 };
119
120 struct sr_analog_sample {
121         uint8_t num_probes; /* Max hardware probes is 256 */
122         struct sr_analog_probe probes[];
123 };
124
125 struct sr_input {
126         struct sr_input_format *format;
127         char *param;
128         struct sr_device *vdevice;
129 };
130
131 struct sr_input_format {
132         char *extension;
133         char *description;
134         int (*format_match) (const char *filename);
135         int (*init) (struct sr_input *in);
136         int (*loadfile) (struct sr_input *in, const char *filename);
137 };
138
139 struct sr_output {
140         struct sr_output_format *format;
141         struct sr_device *device;
142         char *param;
143         void *internal;
144 };
145
146 struct sr_output_format {
147         char *extension;
148         char *description;
149         int df_type;
150         int (*init) (struct sr_output *o);
151         int (*data) (struct sr_output *o, const char *data_in,
152                      uint64_t length_in, char **data_out, uint64_t *length_out);
153         int (*event) (struct sr_output *o, int event_type, char **data_out,
154                       uint64_t *length_out);
155 };
156
157 struct sr_analyzer {
158         char *name;
159         char *filename;
160         /*
161          * TODO: Parameters? If so, configured plugins need another struct.
162          * TODO: Input and output format?
163          */
164 };
165
166 /* Size of a chunk in units */
167 #define DATASTORE_CHUNKSIZE 512000
168
169 struct sr_datastore {
170         /* Size in bytes of the number of units stored in this datastore */
171         int ds_unitsize;
172         unsigned int num_units; /* TODO: uint64_t */
173         GSList *chunklist;
174 };
175
176 /*
177  * This represents a generic device connected to the system.
178  * For device-specific information, ask the plugin. The plugin_index refers
179  * to the device index within that plugin; it may be handling more than one
180  * device. All relevant plugin calls take a device_index parameter for this.
181  */
182 struct sr_device {
183         /* Which plugin handles this device */
184         struct sr_device_plugin *plugin;
185         /* A plugin may handle multiple devices of the same type */
186         int plugin_index;
187         /* List of struct sr_probe* */
188         GSList *probes;
189         /* Data acquired by this device, if any */
190         struct sr_datastore *datastore;
191 };
192
193 enum {
194         SR_PROBE_TYPE_LOGIC,
195         SR_PROBE_TYPE_ANALOG,
196 };
197
198 struct sr_probe {
199         int index;
200         int type;
201         gboolean enabled;
202         char *name;
203         char *trigger;
204 };
205
206 extern GSList *devices;
207
208 /* Hardware plugin capabilities */
209 enum {
210         SR_HWCAP_DUMMY,             /* Used to terminate lists */
211         /* device classes */
212         SR_HWCAP_LOGIC_ANALYZER,
213
214         /* device options */
215         SR_HWCAP_SAMPLERATE,        /* Change samplerate */
216         SR_HWCAP_PROBECONFIG,       /* Configure probe mask */
217         SR_HWCAP_CAPTURE_RATIO,     /* Set pre/post-trigger capture ratio */
218         SR_HWCAP_PATTERN_MODE,      /* Pattern generator mode */
219
220         /* special stuff */
221         SR_HWCAP_CAPTUREFILE,       /* capturefile to inject */
222         SR_HWCAP_CAPTURE_UNITSIZE,  /* unitsize of capturefile data */
223         SR_HWCAP_CAPTURE_NUM_PROBES,/* set number of probes */
224
225         /* acquisition modes */
226         SR_HWCAP_LIMIT_MSEC,        /* Set a time limit for sample acquisition */
227         SR_HWCAP_LIMIT_SAMPLES,     /* Set a limit on number of samples */
228         SR_HWCAP_CONTINUOUS,
229 };
230
231 struct sr_hwcap_option {
232         int capability;
233         int type;
234         char *description;
235         char *shortname;
236 };
237
238 struct sr_device_instance {
239         int index;
240         int status;
241         int instance_type;
242         char *vendor;
243         char *model;
244         char *version;
245         void *priv;
246         union {
247                 struct sr_usb_device_instance *usb;
248                 struct sr_serial_device_instance *serial;
249         };
250 };
251
252 /* sr_device_instance types */
253 enum {
254         SR_USB_INSTANCE,
255         SR_SERIAL_INSTANCE,
256 };
257
258 #ifdef HAVE_LIBUSB_1_0
259 struct sr_usb_device_instance {
260         uint8_t bus;
261         uint8_t address;
262         struct libusb_device_handle *devhdl;
263 };
264 #endif
265
266 struct sr_serial_device_instance {
267         char *port;
268         int fd;
269 };
270
271 /* Device instance status */
272 enum {
273         SR_ST_NOT_FOUND,
274         /* Found, but still booting */
275         SR_ST_INITIALIZING,
276         /* Live, but not in use */
277         SR_ST_INACTIVE,
278         /* Actively in use in a session */
279         SR_ST_ACTIVE,
280 };
281
282 /*
283  * TODO: This sucks, you just kinda have to "know" the returned type.
284  * TODO: Need a DI to return the number of trigger stages supported.
285  */
286
287 /* Device info IDs */
288 enum {
289         /* struct sr_device_instance for this specific device */
290         SR_DI_INSTANCE,
291         /* The number of probes connected to this device */
292         SR_DI_NUM_PROBES,
293         /* Samplerates supported by this device, (struct sr_samplerates) */
294         SR_DI_SAMPLERATES,
295         /* Types of trigger supported, out of "01crf" (char *) */
296         SR_DI_TRIGGER_TYPES,
297         /* The currently set samplerate in Hz (uint64_t) */
298         SR_DI_CUR_SAMPLERATE,
299         /* Supported pattern generator modes */
300         SR_DI_PATTERNMODES,
301 };
302
303 /*
304  * A device supports either a range of samplerates with steps of a given
305  * granularity, or is limited to a set of defined samplerates. Use either
306  * step or list, but not both.
307  */
308 struct sr_samplerates {
309         uint64_t low;
310         uint64_t high;
311         uint64_t step;
312         uint64_t *list;
313 };
314
315 struct sr_device_plugin {
316         /* Plugin-specific */
317         char *name;
318         char *longname;
319         int api_version;
320         int (*init) (const char *deviceinfo);
321         void (*cleanup) (void);
322
323         /* Device-specific */
324         int (*open) (int device_index);
325         void (*close) (int device_index);
326         void *(*get_device_info) (int device_index, int device_info_id);
327         int (*get_status) (int device_index);
328         int *(*get_capabilities) (void);
329         int (*set_configuration) (int device_index, int capability, void *value);
330         int (*start_acquisition) (int device_index, gpointer session_device_id);
331         void (*stop_acquisition) (int device_index, gpointer session_device_id);
332 };
333
334 struct sr_session {
335         /* List of struct sr_device* */
336         GSList *devices;
337         /* List of struct analyzer* */
338         GSList *analyzers;
339         /* list of sr_receive_data_callback */
340         GSList *datafeed_callbacks;
341         GTimeVal starttime;
342         gboolean running;
343 };
344
345 #include "sigrok-proto.h"
346
347 #ifdef __cplusplus
348 }
349 #endif
350
351 #endif