diff options
-rw-r--r-- | instance.c | 17 | ||||
-rw-r--r-- | libsigrokdecode.h | 2 | ||||
-rw-r--r-- | session.c | 9 | ||||
-rw-r--r-- | tests/runtc.c | 7 |
4 files changed, 24 insertions, 11 deletions
@@ -224,19 +224,22 @@ static gint compare_probe_id(const struct srd_probe *a, const char *probe_id) * @param new_probes A GHashTable of probes to set. Key is probe name, value is * the probe number. Samples passed to this instance will be * arranged in this order. + * @param unit_size Number of bytes per sample in the data stream to be passed + * to the decoder. The highest probe index specified in the + * probe map must lie within a sample unit. * * @return SRD_OK upon success, a (negative) error code otherwise. * * @since 0.1.0 */ SRD_API int srd_inst_probe_set_all(struct srd_decoder_inst *di, - GHashTable *new_probes) + GHashTable *new_probes, int unit_size) { GVariant *probe_val; GList *l; GSList *sl; struct srd_probe *p; - int *new_probemap, new_probenum, num_required_probes, num_probes, i; + int *new_probemap, new_probenum, num_required_probes, i; char *probe_id; srd_dbg("set probes called for instance %s with list of %d probes", @@ -267,7 +270,6 @@ SRD_API int srd_inst_probe_set_all(struct srd_decoder_inst *di, for (i = 0; i < di->dec_num_probes; i++) new_probemap[i] = -1; - num_probes = 0; for (l = g_hash_table_get_keys(new_probes); l; l = l->next) { probe_id = l->data; probe_val = g_hash_table_lookup(new_probes, probe_id); @@ -279,6 +281,12 @@ SRD_API int srd_inst_probe_set_all(struct srd_decoder_inst *di, return SRD_ERR_ARG; } new_probenum = g_variant_get_int32(probe_val); + if (new_probenum >= 8 * unit_size) { + srd_err("Probe index %d not within data unit (%d bit).", + new_probenum, 8 * unit_size); + g_free(new_probemap); + return SRD_ERR_ARG; + } if (!(sl = g_slist_find_custom(di->decoder->probes, probe_id, (GCompareFunc)compare_probe_id))) { /* Fall back on optional probes. */ @@ -294,9 +302,8 @@ SRD_API int srd_inst_probe_set_all(struct srd_decoder_inst *di, new_probemap[p->order] = new_probenum; srd_dbg("Setting probe mapping: %s (index %d) = probe %d.", p->id, p->order, new_probenum); - num_probes++; } - di->data_unitsize = (num_probes + 7) / 8; + di->data_unitsize = unit_size; srd_dbg("Final probe map:"); num_required_probes = g_slist_length(di->decoder->probes); diff --git a/libsigrokdecode.h b/libsigrokdecode.h index 1603582..fdf6052 100644 --- a/libsigrokdecode.h +++ b/libsigrokdecode.h @@ -312,7 +312,7 @@ SRD_API int srd_decoder_unload_all(void); SRD_API int srd_inst_option_set(struct srd_decoder_inst *di, GHashTable *options); SRD_API int srd_inst_probe_set_all(struct srd_decoder_inst *di, - GHashTable *probes); + GHashTable *probes, int unit_size); SRD_API struct srd_decoder_inst *srd_inst_new(struct srd_session *sess, const char *id, GHashTable *options); SRD_API int srd_inst_stack(struct srd_session *sess, @@ -209,12 +209,13 @@ SRD_API int srd_session_metadata_set(struct srd_session *sess, int key, /** * Send a chunk of logic sample data to a running decoder session. * - * The logic samples must be arranged in probe order, in the least - * amount of space possible. If no probes were configured, the default + * If no probe map has been set up, the logic samples must be arranged + * in probe order, in the least amount of space possible. The default * probe set consists of all required probes + all optional probes. * - * The size of a sample in inbuf is the minimum number of bytes needed - * to store the configured (or default) probes. + * The size of a sample in inbuf is the unit size passed to + * srd_inst_probe_set_all(). If no probe map has been configured, it is + * the minimum number of bytes needed to store the default probes. * * @param sess The session to use. * @param start_samplenum The sample number of the first sample in this chunk. diff --git a/tests/runtc.c b/tests/runtc.c index ab1f5e9..b75e414 100644 --- a/tests/runtc.c +++ b/tests/runtc.c @@ -319,6 +319,7 @@ static int run_testcase(char *infile, GSList *pdlist, struct output *op) GHashTable *probes, *opts; GSList *pdl, *l; int idx; + int max_probe; char **decoder_class; if (op->outfile) { @@ -372,13 +373,17 @@ static int run_testcase(char *infile, GSList *pdlist, struct output *op) if (pd->probes) { probes = g_hash_table_new_full(g_str_hash, g_str_equal, NULL, (GDestroyNotify)g_variant_unref); + max_probe = 0; for (l = pd->probes; l; l = l->next) { probe = l->data; + if (probe->probe > max_probe) + max_probe = probe->probe; gvar = g_variant_new_int32(probe->probe); g_variant_ref_sink(gvar); g_hash_table_insert(probes, probe->name, gvar); } - if (srd_inst_probe_set_all(di, probes) != SRD_OK) + if (srd_inst_probe_set_all(di, probes, + (max_probe + 8) / 8) != SRD_OK) return FALSE; g_hash_table_destroy(probes); } |