X-Git-Url: https://sigrok.org/gitweb/?p=libsigrokdecode.git;a=blobdiff_plain;f=libsigrokdecode.h;h=84c80e4195641fcdfea2656a558f672ba057ff9e;hp=ae96d950e5f009f79bb4dd7d845ceb5e4faa0dea;hb=HEAD;hpb=cdb49509e85443129f2d60180eb818813030901e diff --git a/libsigrokdecode.h b/libsigrokdecode.h index ae96d95..ea17cb8 100644 --- a/libsigrokdecode.h +++ b/libsigrokdecode.h @@ -71,6 +71,7 @@ enum srd_error_code { SRD_ERR_BUG = -4, /**< Errors hinting at internal bugs */ SRD_ERR_PYTHON = -5, /**< Python C API error */ SRD_ERR_DECODERS_DIR = -6, /**< Protocol decoder path invalid */ + SRD_ERR_TERM_REQ = -7, /**< Termination requested */ /* * Note: When adding entries here, don't forget to also update the @@ -105,29 +106,34 @@ enum srd_loglevel { */ /* Marks public libsigrokdecode API symbols. */ -#ifndef _WIN32 -#define SRD_API __attribute__((visibility("default"))) +#if defined _WIN32 +# if defined DLL_EXPORT +# define SRD_API __declspec(dllexport) +# else +# define SRD_API extern +# endif #else -#define SRD_API +# define SRD_API __attribute__((visibility("default"))) #endif /* Marks private, non-public libsigrokdecode symbols (not part of the API). */ -#ifndef _WIN32 -#define SRD_PRIV __attribute__((visibility("hidden"))) +#if defined _WIN32 +# define SRD_PRIV /* EMPTY */ #else -#define SRD_PRIV +# define SRD_PRIV __attribute__((visibility("hidden"))) #endif /* * When adding an output type, don't forget to... - * - expose it to PDs in controller.c:PyInit_sigrokdecode() - * - add a check in module_sigrokdecode.c:Decoder_put() - * - add a debug string in type_decoder.c:OUTPUT_TYPES + * - expose it to PDs in module_sigrokdecode.c:PyInit_sigrokdecode() + * - add a check in type_decoder.c:Decoder_put() + * - add a debug string in type_decoder.c:output_type_name() */ enum srd_output_type { SRD_OUTPUT_ANN, SRD_OUTPUT_PYTHON, SRD_OUTPUT_BINARY, + SRD_OUTPUT_LOGIC, SRD_OUTPUT_META, }; @@ -154,6 +160,15 @@ struct srd_decoder { */ char *license; + /** List of possible decoder input IDs. */ + GSList *inputs; + + /** List of possible decoder output IDs. */ + GSList *outputs; + + /** List of tags associated with this decoder. */ + GSList *tags; + /** List of channels required by this decoder. */ GSList *channels; @@ -161,8 +176,8 @@ struct srd_decoder { GSList *opt_channels; /** - * List of NULL-terminated char[], containing descriptions of the - * supported annotation output. + * List of annotation classes. Each list item is a GSList itself, with + * two NUL-terminated strings: name and description. */ GSList *annotations; @@ -173,11 +188,16 @@ struct srd_decoder { GSList *annotation_rows; /** - * List of NULL-terminated char[], containing descriptions of the - * supported binary output. + * List of binary classes. Each list item is a GSList itself, with + * two NUL-terminated strings: name and description. */ GSList *binary; + /** + * List of logic output channels (item: id, description). + */ + GSList *logic_output_channels; + /** List of decoder options. */ GSList *options; @@ -188,6 +208,12 @@ struct srd_decoder { void *py_dec; }; +enum srd_initial_pin { + SRD_INITIAL_PIN_LOW, + SRD_INITIAL_PIN_HIGH, + SRD_INITIAL_PIN_SAME_AS_SAMPLE0, +}; + /** * Structure which contains information about one protocol decoder channel. * For example, I2C has two channels, SDA and SCL. @@ -216,6 +242,11 @@ struct srd_decoder_annotation_row { GSList *ann_classes; }; +struct srd_decoder_logic_output_channel { + char *id; + char *desc; +}; + struct srd_decoder_inst { struct srd_decoder *decoder; struct srd_session *sess; @@ -264,6 +295,12 @@ struct srd_decoder_inst { /** Requests termination of wait() and decode(). */ gboolean want_wait_terminate; + /** Requests that .wait() terminates a Python iteration. */ + gboolean communicate_eof; + + /** Indicates the current state of the decoder stack. */ + int decoder_state; + GCond got_new_samples_cond; GCond handled_all_samples_cond; GMutex data_mutex; @@ -287,13 +324,18 @@ struct srd_proto_data { void *data; }; struct srd_proto_data_annotation { - int ann_class; + int ann_class; /* Index into "struct srd_decoder"->annotations. */ char **ann_text; }; struct srd_proto_data_binary { - int bin_class; + int bin_class; /* Index into "struct srd_decoder"->binary. */ uint64_t size; - const unsigned char *data; + const uint8_t *data; +}; +struct srd_proto_data_logic { + int logic_group; + uint64_t repeat_count; /* Number of times the value in data was repeated. */ + const uint8_t *data; /* Bitfield containing the states of the logic outputs */ }; typedef void (*srd_pd_output_callback)(struct srd_proto_data *pdata, @@ -308,6 +350,7 @@ struct srd_pd_callback { /* srd.c */ SRD_API int srd_init(const char *path); SRD_API int srd_exit(void); +SRD_API GSList *srd_searchpaths_get(void); /* session.c */ SRD_API int srd_session_new(struct srd_session **sess); @@ -317,6 +360,8 @@ SRD_API int srd_session_metadata_set(struct srd_session *sess, int key, SRD_API int srd_session_send(struct srd_session *sess, uint64_t abs_start_samplenum, uint64_t abs_end_samplenum, const uint8_t *inbuf, uint64_t inbuflen, uint64_t unitsize); +SRD_API int srd_session_send_eof(struct srd_session *sess); +SRD_API int srd_session_terminate_reset(struct srd_session *sess); SRD_API int srd_session_destroy(struct srd_session *sess); SRD_API int srd_pd_output_callback_add(struct srd_session *sess, int output_type, srd_pd_output_callback cb, void *cb_data); @@ -341,12 +386,15 @@ SRD_API int srd_inst_stack(struct srd_session *sess, struct srd_decoder_inst *di_from, struct srd_decoder_inst *di_to); SRD_API struct srd_decoder_inst *srd_inst_find_by_id(struct srd_session *sess, const char *inst_id); +SRD_API int srd_inst_initial_pins_set_all(struct srd_decoder_inst *di, + GArray *initial_pins); /* log.c */ typedef int (*srd_log_callback)(void *cb_data, int loglevel, const char *format, va_list args); SRD_API int srd_log_loglevel_set(int loglevel); SRD_API int srd_log_loglevel_get(void); +SRD_API int srd_log_callback_get(srd_log_callback *cb, void **cb_data); SRD_API int srd_log_callback_set(srd_log_callback cb, void *cb_data); SRD_API int srd_log_callback_set_default(void);