struct signal_group_desc *desc;
desc = g_malloc0(sizeof(*desc));
- if (!desc)
- return NULL;
- if (name) {
+ if (name)
desc->name = g_strdup(name);
- if (!desc->name) {
- g_free(desc);
- return NULL;
- }
- }
return desc;
}
struct sr_channel_group *cg;
cg = g_malloc0(sizeof(*cg));
- if (!cg)
- return NULL;
- if (name && *name) {
+ if (name && *name)
cg->name = g_strdup(name);
- if (!cg->name) {
- g_free(cg);
- return NULL;
- }
- }
cg->priv = priv;
return cg;
{
char *name, *wires;
struct signal_group_desc *desc;
- uint64_t bit_tmpl, bit_mask;
+ uint64_t bit_mask;
char *p, *endp;
size_t idx;
return SR_ERR_MALLOC;
inc->signal_groups = g_slist_append(inc->signal_groups, desc);
- /*
- * Determine the bit mask of the group's signals' indices.
- *
- * Implementation note: Use a "template" for a single bit, to
- * avoid portability issues with upper bits. Without this 64bit
- * intermediate variable, I would not know how to phrase e.g.
- * (1ULL << 33) in portable, robust, and easy to maintain ways
- * on all platforms that are supported by sigrok.
- */
- bit_tmpl = 1UL << 0;
+ /* Determine the bit mask of the group's signals' indices. */
bit_mask = 0;
p = wires;
while (p && *p) {
p++;
if (idx >= MAX_CHANNELS)
return SR_ERR_DATA;
- bit_mask = bit_tmpl << idx;
+ bit_mask = UINT64_C(1) << idx;
if (inc->wires_grouped & bit_mask) {
sr_warn("Not adding signal at index %zu to group %s (multiple assignments)",
idx, name);
if (count != inc->channel_count)
return SR_ERR_DATA;
bits = 0;
- mask = 1UL << 0;
+ mask = UINT64_C(1);
for (idx = 0; idx < inc->channel_count; idx++, mask <<= 1) {
if (strcmp(flags[idx], "True") == 0)
bits |= mask;
if (count != inc->channel_count)
return SR_ERR_DATA;
bits = 0;
- mask = 1UL << 0;
+ mask = UINT64_C(1);
for (idx = 0; idx < inc->channel_count; idx++, mask <<= 1) {
if (strcmp(flags[idx], "True") == 0)
bits |= mask;
return SR_ERR_DATA;
entry = &inc->sample_data_queue[inc->sample_lines_read];
entry->bits = 0;
- mask = 1UL << 0;
+ mask = UINT64_C(1);
for (idx = 0; idx < inc->channel_count; idx++, mask <<= 1) {
if (strcmp(values[idx], "1") == 0)
entry->bits |= mask;
return SR_OK;
}
-/* Create sigrok channels and groups. Allocate the session feed buffer. */
-static int create_channels_groups_buffer(struct sr_input *in)
+/* Create sigrok channels and groups. */
+static int create_channels_groups(struct sr_input *in)
{
struct context *inc;
uint64_t mask;
inc = in->priv;
- mask = 1UL << 0;
+ if (inc->channels)
+ return SR_OK;
+
+ mask = UINT64_C(1);
for (idx = 0; idx < inc->channel_count; idx++, mask <<= 1) {
name = inc->signal_names[idx];
if (!name || !*name)
if (!cg)
return SR_ERR_MALLOC;
sdi->channel_groups = g_slist_append(sdi->channel_groups, cg);
- mask = 1UL << 0;
+ mask = UINT64_C(1);
for (idx = 0; idx < inc->channel_count; idx++, mask <<= 1) {
if (!(desc->mask & mask))
continue;
}
}
+ return SR_OK;
+}
+
+/* Allocate the session feed buffer. */
+static int create_feed_buffer(struct sr_input *in)
+{
+ struct context *inc;
+
+ inc = in->priv;
+
inc->unitsize = (inc->channel_count + 7) / 8;
inc->samples_per_chunk = CHUNK_SIZE / inc->unitsize;
inc->samples_in_buffer = 0;
* - If there are any signal groups, put all signals into
* an anonymous group that are not part of another group.
*/
- inc->wires_all_mask = 1UL << 0;
+ inc->wires_all_mask = UINT64_C(1);
inc->wires_all_mask <<= inc->channel_count;
inc->wires_all_mask--;
sr_dbg("all wires mask: 0x%" PRIx64 ".", inc->wires_all_mask);
* header to the session. Optionally send the sample
* rate before sample data will be sent.
*/
- rc = create_channels_groups_buffer(in);
+ rc = create_channels_groups(in);
+ if (rc)
+ return rc;
+ rc = create_feed_buffer(in);
if (rc)
return rc;
return SR_OK;
}
-static int format_match(GHashTable *metadata)
+static int format_match(GHashTable *metadata, unsigned int *confidence)
{
GString *buf, *tmpbuf;
int rc;
if (rc == SR_OK && version && build) {
sr_dbg("Looks like a LogicProbe project, version %s, build %s.",
version, build);
+ *confidence = 1;
}
g_string_free(tmpbuf, TRUE);
(void)options;
in->sdi = g_malloc0(sizeof(*in->sdi));
-
inc = g_malloc0(sizeof(*inc));
- if (!inc)
- return SR_ERR_MALLOC;
in->priv = inc;
return SR_OK;
* and scalars, so that re-runs start out fresh again.
*/
g_free(inc->sw_version);
- g_string_free(inc->cont_buff, TRUE);
+ if (inc->cont_buff)
+ g_string_free(inc->cont_buff, TRUE);
g_free(inc->sample_data_queue);
for (idx = 0; idx < inc->channel_count; idx++)
g_free(inc->wire_names[idx]);
static int reset(struct sr_input *in)
{
struct context *inc;
+ GSList *channels;
inc = in->priv;
+
+ /*
+ * The input module's .reset() routine clears the 'inc' context,
+ * but 'in' is kept which contains channel groups which reference
+ * channels. Since we cannot re-create the channels (applications
+ * don't expect us to, see bug #1215), make sure to keep the
+ * channels across the reset operation.
+ */
+ channels = inc->channels;
+ inc->channels = NULL;
cleanup(in);
- inc->ch_feed_prep = FALSE;
- inc->header_sent = FALSE;
- inc->rate_sent = FALSE;
- g_string_truncate(in->buf, 0);
+ inc->channels = channels;
return SR_OK;
}