summaryrefslogtreecommitdiff
path: root/sigrokdecode.h
blob: 8266fb50d20ea57ded0dd276022f3ed682797dcb (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
/*
 * This file is part of the sigrok project.
 *
 * Copyright (C) 2010 Uwe Hermann <uwe@hermann-uwe.de>
 *
 * This program is free software; you can redistribute it and/or modify
 * it under the terms of the GNU General Public License as published by
 * the Free Software Foundation; either version 2 of the License, or
 * (at your option) any later version.
 *
 * This program is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 * GNU General Public License for more details.
 *
 * You should have received a copy of the GNU General Public License
 * along with this program; if not, write to the Free Software
 * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301 USA
 */

#ifndef SIGROKDECODE_SIGROKDECODE_H
#define SIGROKDECODE_SIGROKDECODE_H

#include <Python.h> /* First, so we avoid a _POSIX_C_SOURCE warning. */
#include <stdint.h>
#include <glib.h>

#ifdef __cplusplus
extern "C" {
#endif

/*
 * Status/error codes returned by libsigrokdecode functions.
 *
 * All possible return codes of libsigrokdecode functions must be listed here.
 * Functions should never return hardcoded numbers as status, but rather
 * use these #defines instead. All error codes are negative numbers.
 *
 * The error codes are globally unique in libsigrokdecode, i.e. if one of the
 * libsigrokdecode functions returns a "malloc error" it must be exactly the
 * same return value as used by all other functions to indicate "malloc error".
 * There must be no functions which indicate two different errors via the
 * same return code.
 *
 * Also, for compatibility reasons, no defined return codes are ever removed
 * or reused for different #defines later. You can only add new #defines and
 * return codes, but never remove or redefine existing ones.
 */
#define SRD_OK			 0 /**< No error */
#define SRD_ERR			-1 /**< Generic/unspecified error */
#define SRD_ERR_MALLOC		-2 /**< Malloc/calloc/realloc error */
#define SRD_ERR_ARG		-3 /**< Function argument error */
#define SRD_ERR_PYTHON		-4 /**< Python C API error */
#define SRD_ERR_DECODERS_DIR	-5 /**< Protocol decoder path invalid */

/* libsigrokdecode loglevels. */
#define SRD_LOG_NONE	0 /**< Output no messages at all. */
#define SRD_LOG_ERR	1 /**< Output error messages. */
#define SRD_LOG_WARN	2 /**< Output warnings. */
#define SRD_LOG_INFO	3 /**< Output informational messages. */
#define SRD_LOG_DBG	4 /**< Output debug messages. */
#define SRD_LOG_SPEW	5 /**< Output very noisy debug messages. */

enum {
	SRD_OUTPUT_LOGIC = 1,
	SRD_OUTPUT_ANNOTATION,
	SRD_OUTPUT_PROTOCOL,
};

/* TODO: Documentation. */
struct srd_decoder {
	/** The decoder ID. Must be non-NULL and unique for all decoders. */
	char *id;

	/** The (short) decoder name. */
	char *name;

	/** The (long) decoder name. May be NULL. */
	char *longname;

	/** A (short, one-line) description of the decoder. */
	char *desc;

	/** A (long, multi-line) description of the decoder. May be NULL. */
	char *longdesc;

	/** The author of the decoder. May be NULL. */
	char *author;

	/** An email address of the decoder's author. May be NULL. */
	char *email;

	/** The license of the decoder. Valid values: "gplv2+", "gplv3+". */
	char *license;

	/** TODO */
	char *func;

	/** TODO */
	GSList *inputformats;

	/** TODO */
	GSList *outputformats;

	/** TODO */
	PyObject *py_mod;

	/** Python object that performs the decoding */
	PyObject *py_decobj;
};

struct srd_decoder_instance {
	struct srd_decoder *decoder;
	PyObject *py_instance;
	GSList *pd_output;
};

struct srd_pd_output {
	int pdo_id;
	int output_type;
	char *protocol_id;
	char *description;
};

/*--- controller.c ----------------------------------------------------------*/

int srd_init(void);
int srd_exit(void);
int set_modulepath(void);
struct srd_decoder_instance *srd_instance_new(const char *id);
int srd_instance_set_probe(struct srd_decoder_instance *di,
				const char *probename, int num);
int srd_instance_start(struct srd_decoder_instance *di,
			const char *driver, int unitsize, uint64_t starttime);
int srd_session_start(const char *driver, int unitsize, uint64_t starttime,
		uint64_t samplerate);
int srd_run_decoder(uint64_t timeoffset, uint64_t duration,
		struct srd_decoder_instance *dec, uint8_t *inbuf, uint64_t inbuflen);
int srd_session_feed(uint64_t timeoffset, uint64_t duration, uint8_t *inbuf,
		uint64_t inbuflen);
int pd_output_new(struct srd_decoder_instance *di, int output_type,
		char *output_id, char *description);

/*--- decoder.c -------------------------------------------------------------*/

GSList *srd_list_decoders(void);
struct srd_decoder *srd_get_decoder_by_id(const char *id);
int srd_load_decoder(const char *name, struct srd_decoder **dec);
int srd_unload_decoder(struct srd_decoder *dec);
int srd_load_all_decoders(void);
int srd_unload_all_decoders(void);

/*--- util.c ----------------------------------------------------------------*/
int h_str(PyObject *py_res, const char *key, char **outstr);

/*--- log.c -----------------------------------------------------------------*/

int srd_set_loglevel(int loglevel);
int srd_get_loglevel(void);

#ifdef __cplusplus
}
#endif

#endif