X-Git-Url: https://sigrok.org/gitweb/?p=libsigrokdecode.git;a=blobdiff_plain;f=controller.c;h=fc303d5e40f9cbe4b3169f348349815fb46bc9fe;hp=0d914c9f7590e48509824fc8cf7a83a54c5835a7;hb=31e615a50b34f67bdf5562ad887415b2ec8796c8;hpb=29590b14fc508a0b951ea0b87e98f7741808bab0 diff --git a/controller.c b/controller.c index 0d914c9..fc303d5 100644 --- a/controller.c +++ b/controller.c @@ -25,6 +25,67 @@ #include #include +/** + * @mainpage libsigrokdecode API + * + * @section sec_intro Introduction + * + * The sigrok project aims at creating a + * portable, cross-platform, Free/Libre/Open-Source signal analysis software + * suite that supports various device types (such as logic analyzers, + * oscilloscopes, multimeters, and more). + * + * libsigrokdecode is a + * shared library written in C which provides the basic API for (streaming) + * protocol decoding functionality. + * + * The protocol decoders + * are written in Python (>= 3.0). + * + * @section sec_api API reference + * + * See the "Modules" page for an introduction to various libsigrokdecode + * related topics and the detailed API documentation of the respective + * functions. + * + * You can also browse the API documentation by file, or review all + * data structures. + * + * @section sec_mailinglists Mailing lists + * + * There are two mailing lists for sigrok/libsigrokdecode: sigrok-devel and sigrok-commits. + * + * @section sec_irc IRC + * + * You can find the sigrok developers in the + * \#sigrok + * IRC channel on Freenode. + * + * @section sec_website Website + * + * sigrok.org/wiki/Libsigrokdecode + */ + +/** + * @file + * + * Initializing and shutting down libsigrokdecode. + */ + +/** + * @defgroup grp_init Initialization + * + * Initializing and shutting down libsigrokdecode. + * + * Before using any of the libsigrokdecode functionality, srd_init() must + * be called to initialize the library. + * + * When libsigrokdecode functionality is no longer needed, srd_exit() should + * be called. + * + * @{ + */ + /* List of decoder instances. */ static GSList *di_list = NULL; @@ -344,6 +405,7 @@ SRD_API int srd_inst_probe_set_all(struct srd_decoder_inst *di, struct srd_probe *p; int *new_probemap, new_probenum; char *probe_id, *probenum_str; + int i, num_required_probes; srd_dbg("set probes called for instance %s with list of %d probes", di->inst_id, g_hash_table_size(new_probes)); @@ -366,6 +428,13 @@ SRD_API int srd_inst_probe_set_all(struct srd_decoder_inst *di, return SRD_ERR_MALLOC; } + /* + * For now, map all indexes to probe -1 (can be overridden later). + * This -1 is interpreted as an unspecified probe later. + */ + for (i = 0; i < di->dec_num_probes; i++) + new_probemap[i] = -1; + for (l = g_hash_table_get_keys(new_probes); l; l = l->next) { probe_id = l->data; probenum_str = g_hash_table_lookup(new_probes, probe_id); @@ -390,9 +459,17 @@ SRD_API int srd_inst_probe_set_all(struct srd_decoder_inst *di, } p = sl->data; new_probemap[p->order] = new_probenum; - srd_dbg("setting probe mapping for %d = probe %d", p->order, - new_probenum); + srd_dbg("Setting probe mapping: %s (index %d) = probe %d.", + p->id, p->order, new_probenum); + } + + srd_dbg("Final probe map:"); + num_required_probes = g_slist_length(di->decoder->probes); + for (i = 0; i < di->dec_num_probes; i++) { + srd_dbg(" - index %d = probe %d (%s)", i, new_probemap[i], + (i < num_required_probes) ? "required" : "optional"); } + g_free(di->dec_probemap); di->dec_probemap = new_probemap; @@ -404,7 +481,7 @@ SRD_API int srd_inst_probe_set_all(struct srd_decoder_inst *di, * * @param decoder_id Decoder 'id' field. * @param options GHashtable of options which override the defaults set in - * the decoder class. + * the decoder class. May be NULL. * * @return Pointer to a newly allocated struct srd_decoder_inst, or * NULL in case of failure. @@ -429,10 +506,13 @@ SRD_API struct srd_decoder_inst *srd_inst_new(const char *decoder_id, return NULL; } - inst_id = g_hash_table_lookup(options, "id"); di->decoder = dec; - di->inst_id = g_strdup(inst_id ? inst_id : decoder_id); - g_hash_table_remove(options, "id"); + if (options) { + inst_id = g_hash_table_lookup(options, "id"); + di->inst_id = g_strdup(inst_id ? inst_id : decoder_id); + g_hash_table_remove(options, "id"); + } else + di->inst_id = g_strdup(decoder_id); /* * Prepare a default probe map, where samples come in the @@ -461,7 +541,7 @@ SRD_API struct srd_decoder_inst *srd_inst_new(const char *decoder_id, return NULL; } - if (srd_inst_option_set(di, options) != SRD_OK) { + if (options && srd_inst_option_set(di, options) != SRD_OK) { g_free(di->dec_probemap); g_free(di); return NULL; @@ -717,6 +797,8 @@ SRD_API int srd_session_start(int num_probes, int unitsize, uint64_t samplerate) struct srd_decoder_inst *di; int ret; + ret = SRD_OK; + srd_dbg("Calling start() on all instances with %d probes, " "unitsize %d samplerate %d.", num_probes, unitsize, samplerate); @@ -845,3 +927,5 @@ SRD_PRIV int srd_inst_pd_output_add(struct srd_decoder_inst *di, return pdo->pdo_id; } + +/** @} */