summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--instance.c17
-rw-r--r--libsigrokdecode.h2
-rw-r--r--session.c9
-rw-r--r--tests/runtc.c7
4 files changed, 24 insertions, 11 deletions
diff --git a/instance.c b/instance.c
index 594f144..0a930bf 100644
--- a/instance.c
+++ b/instance.c
@@ -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,
diff --git a/session.c b/session.c
index c073c80..8df7157 100644
--- a/session.c
+++ b/session.c
@@ -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);
}