]> sigrok.org Git - libsigrok.git/blob - sigrok.h
Add sr_ prefix to input/output structs.
[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 #include <libusb.h>
29
30 #ifdef __cplusplus
31 extern "C" {
32 #endif
33
34 /*
35  * Status/error codes returned by libsigrok functions.
36  *
37  * All possible return codes of libsigrok functions must be listed here.
38  * Functions should never return hardcoded numbers as status, but rather
39  * use these #defines instead. All error codes are negative numbers.
40  *
41  * The error codes are globally unique in libsigrok, i.e. if one of the
42  * libsigrok functions returns a "malloc error" it must be exactly the same
43  * return value as used by all other functions to indicate "malloc error".
44  * There must be no functions which indicate two different errors via the
45  * same return code.
46  *
47  * Also, for compatibility reasons, no defined return codes are ever removed
48  * or reused for different #defines later. You can only add new #defines and
49  * return codes, but never remove or redefine existing ones.
50  */
51 #define SR_OK                 0 /* No error */
52 #define SR_ERR               -1 /* Generic/unspecified error */
53 #define SR_ERR_MALLOC        -2 /* Malloc/calloc/realloc error */
54 #define SR_ERR_SAMPLERATE    -3 /* Incorrect samplerate */
55
56 /* limited by uint64_t */
57 #define MAX_NUM_PROBES 64
58 #define MAX_PROBENAME_LEN 32
59
60 /* Handy little macros */
61 #define KHZ(n) ((n) * 1000)
62 #define MHZ(n) ((n) * 1000000)
63 #define GHZ(n) ((n) * 1000000000)
64
65 #define HZ_TO_NS(n) (1000000000 / (n))
66
67 #ifndef ARRAY_SIZE
68 #define ARRAY_SIZE(a) (sizeof(a) / sizeof((a)[0]))
69 #endif
70
71 #ifndef ARRAY_AND_SIZE
72 #define ARRAY_AND_SIZE(a) (a), ARRAY_SIZE(a)
73 #endif
74
75 typedef int (*receive_data_callback) (int fd, int revents, void *user_data);
76
77 /* Data types used by hardware plugins for set_configuration() */
78 enum {
79         T_UINT64,
80         T_CHAR,
81         T_NULL,
82 };
83
84 enum {
85         PROTO_RAW,
86 };
87
88 /* (Unused) protocol decoder stack entry */
89 struct protocol {
90         char *name;
91         int id;
92         int stackindex;
93 };
94
95 /* datafeed_packet.type values */
96 enum {
97         DF_HEADER,
98         DF_END,
99         DF_TRIGGER,
100         DF_LOGIC,
101         DF_ANALOG,
102         DF_PD,
103 };
104
105 struct datafeed_packet {
106         uint16_t type;
107         uint64_t length;
108         uint16_t unitsize;
109         void *payload;
110 };
111
112 struct datafeed_header {
113         int feed_version;
114         struct timeval starttime;
115         uint64_t samplerate;
116         int protocol_id;
117         int num_analog_probes;
118         int num_logic_probes;
119 };
120
121 struct analog_probe {
122         uint8_t att;
123         uint8_t res;    /* Needs to be a power of 2, FIXME */
124         uint16_t val;   /* Max hardware ADC width is 16bits */
125 };
126
127 struct analog_sample {
128         uint8_t num_probes; /* Max hardware probes is 256 */
129         struct analog_probe probes[];
130 };
131
132 struct sr_input {
133         struct sr_input_format *format;
134         char *param;
135         struct device *vdevice;
136 };
137
138 struct sr_input_format {
139         char *extension;
140         char *description;
141         int (*format_match) (const char *filename);
142         int (*init) (struct sr_input *in);
143         int (*loadfile) (struct sr_input *in, const char *filename);
144 };
145
146 struct sr_output {
147         struct sr_output_format *format;
148         struct device *device;
149         char *param;
150         void *internal;
151 };
152
153 struct sr_output_format {
154         char *extension;
155         char *description;
156         int df_type;
157         int (*init) (struct sr_output *o);
158         int (*data) (struct sr_output *o, char *data_in, uint64_t length_in,
159                      char **data_out, uint64_t *length_out);
160         int (*event) (struct sr_output *o, int event_type, char **data_out,
161                       uint64_t *length_out);
162 };
163
164 struct analyzer {
165         char *name;
166         char *filename;
167         /*
168          * TODO: Parameters? If so, configured plugins need another struct.
169          * TODO: Input and output format?
170          */
171 };
172
173 /* Size of a chunk in units */
174 #define DATASTORE_CHUNKSIZE 512000
175
176 struct datastore {
177         /* Size in bytes of the number of units stored in this datastore */
178         int ds_unitsize;
179         unsigned int num_units; /* TODO: uint64_t */
180         GSList *chunklist;
181 };
182
183 /*
184  * This represents a generic device connected to the system.
185  * For device-specific information, ask the plugin. The plugin_index refers
186  * to the device index within that plugin; it may be handling more than one
187  * device. All relevant plugin calls take a device_index parameter for this.
188  */
189 struct device {
190         /* Which plugin handles this device */
191         struct device_plugin *plugin;
192         /* A plugin may handle multiple devices of the same type */
193         int plugin_index;
194         /* List of struct probe* */
195         GSList *probes;
196         /* Data acquired by this device, if any */
197         struct datastore *datastore;
198 };
199
200 enum {
201         PROBE_TYPE_LOGIC,
202         PROBE_TYPE_ANALOG,
203 };
204
205 struct probe {
206         int index;
207         int type;
208         gboolean enabled;
209         char *name;
210         char *trigger;
211 };
212
213 extern GSList *devices;
214
215 /* Hardware plugin capabilities */
216 enum {
217         HWCAP_DUMMY,             /* Used to terminate lists */
218         /* device classes */
219         HWCAP_LOGIC_ANALYZER,
220
221         /* device options */
222         HWCAP_SAMPLERATE,        /* Change samplerate */
223         HWCAP_PROBECONFIG,       /* Configure probe mask */
224         HWCAP_CAPTURE_RATIO,     /* Set pre/post-trigger capture ratio */
225         HWCAP_PATTERN_MODE,      /* Pattern generator mode */
226
227         /* acquisition modes */
228         HWCAP_LIMIT_MSEC,        /* Set a time limit for sample acquisition */
229         HWCAP_LIMIT_SAMPLES,     /* Set a limit on number of samples */
230         HWCAP_CONTINUOUS,
231 };
232
233 struct hwcap_option {
234         int capability;
235         int type;
236         char *description;
237         char *shortname;
238 };
239
240 struct sigrok_device_instance {
241         int index;
242         int status;
243         int instance_type;
244         char *vendor;
245         char *model;
246         char *version;
247         void *priv;
248         union {
249                 struct usb_device_instance *usb;
250                 struct serial_device_instance *serial;
251         };
252 };
253
254 /* sigrok_device_instance types */
255 enum {
256         USB_INSTANCE,
257         SERIAL_INSTANCE,
258 };
259
260 struct usb_device_instance {
261         uint8_t bus;
262         uint8_t address;
263         struct libusb_device_handle *devhdl;
264 };
265
266 struct serial_device_instance {
267         char *port;
268         int fd;
269 };
270
271 /* Device instance status */
272 enum {
273         ST_NOT_FOUND,
274         /* Found, but still booting */
275         ST_INITIALIZING,
276         /* Live, but not in use */
277         ST_INACTIVE,
278         /* Actively in use in a session */
279         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 sigrok_device_instance for this specific device */
290         DI_INSTANCE,
291         /* The number of probes connected to this device */
292         DI_NUM_PROBES,
293         /* Samplerates supported by this device, (struct samplerates) */
294         DI_SAMPLERATES,
295         /* Types of trigger supported, out of "01crf" (char *) */
296         DI_TRIGGER_TYPES,
297         /* The currently set samplerate in Hz (uint64_t) */
298         DI_CUR_SAMPLERATE,
299         /* Supported pattern generator modes */
300         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 samplerates {
309         uint64_t low;
310         uint64_t high;
311         uint64_t step;
312         uint64_t *list;
313 };
314
315 struct device_plugin {
316         /* Plugin-specific */
317         char *name;
318         int api_version;
319         int (*init) (char *deviceinfo);
320         void (*cleanup) (void);
321
322         /* Device-specific */
323         int (*open) (int device_index);
324         void (*close) (int device_index);
325         void *(*get_device_info) (int device_index, int device_info_id);
326         int (*get_status) (int device_index);
327         int *(*get_capabilities) (void);
328         int (*set_configuration) (int device_index, int capability, void *value);
329         int (*start_acquisition) (int device_index, gpointer session_device_id);
330         void (*stop_acquisition) (int device_index, gpointer session_device_id);
331 };
332
333 struct gsource_fd {
334         GSource source;
335         GPollFD gpfd;
336         /* Not really using this */
337         GSource *timeout_source;
338 };
339
340 struct session {
341         /* List of struct device* */
342         GSList *devices;
343         /* List of struct analyzer* */
344         GSList *analyzers;
345         /* list of receive_data_callback */
346         GSList *datafeed_callbacks;
347         GTimeVal starttime;
348         gboolean running;
349 };
350
351 #include "sigrok-proto.h"
352
353 #ifdef __cplusplus
354 }
355 #endif
356
357 #endif