X-Git-Url: https://sigrok.org/gitweb/?a=blobdiff_plain;f=src%2Finput%2Fsaleae.c;h=f63181b3716a12bc2523a00fd81342061751c469;hb=57140e5a804dd5b616120f05e38c3409241bb37c;hp=05de3e3ea5eddae271e6f86213392f5f79db9de9;hpb=d891892dc05df8ce33fcadf4a123a83e17b5d620;p=libsigrok.git diff --git a/src/input/saleae.c b/src/input/saleae.c index 05de3e3e..f63181b3 100644 --- a/src/input/saleae.c +++ b/src/input/saleae.c @@ -199,7 +199,7 @@ static int create_channels(struct sr_input *in) struct context *inc; int type; size_t count, idx; - char name[4]; + char name[24]; struct sr_channel *ch; inc = in->priv; @@ -813,11 +813,13 @@ static int parse_next_item(struct sr_input *in, diff_time /= inc->logic_state.l2d.sample_period; diff_time += 0.5; count = (uint64_t)diff_time; - digital = inc->feed.last.digital; - rc = addto_feed_buffer_logic(in, digital, count); - if (rc) - return rc; - inc->feed.last.time = next_time; + if (count) { + digital = inc->feed.last.digital; + rc = addto_feed_buffer_logic(in, digital, count); + if (rc) + return rc; + inc->feed.last.time = next_time; + } inc->feed.last.digital = 1 - inc->feed.last.digital; return SR_OK; case STAGE_L2A_FIRST_VALUE: @@ -883,11 +885,14 @@ static int format_match(GHashTable *metadata, unsigned int *confidence) static const char *zip_ext = ".sal"; static const char *bin_ext = ".bin"; + gboolean matched; const char *fn; size_t fn_len, ext_len; const char *ext_pos; GString *buf; + matched = FALSE; + /* Weak match on the filename (when available). */ fn = g_hash_table_lookup(metadata, GINT_TO_POINTER(SR_INPUT_META_FILENAME)); if (fn && *fn) { @@ -895,13 +900,16 @@ static int format_match(GHashTable *metadata, unsigned int *confidence) ext_len = strlen(zip_ext); ext_pos = &fn[fn_len - ext_len]; if (fn_len >= ext_len && g_ascii_strcasecmp(ext_pos, zip_ext) == 0) { - if (SALEAE_WITH_SAL_SUPPORT) + if (SALEAE_WITH_SAL_SUPPORT) { *confidence = 10; + matched = TRUE; + } } ext_len = strlen(bin_ext); ext_pos = &fn[fn_len - ext_len]; if (fn_len >= ext_len && g_ascii_strcasecmp(ext_pos, bin_ext) == 0) { *confidence = 50; + matched = TRUE; } } @@ -913,13 +921,14 @@ static int format_match(GHashTable *metadata, unsigned int *confidence) case FMT_LOGIC2_DIGITAL: case FMT_LOGIC2_ANALOG: *confidence = 1; + matched = TRUE; break; default: /* EMPTY */ break; } - return SR_OK; + return matched ? SR_OK : SR_ERR_DATA; } static int init(struct sr_input *in, GHashTable *options) @@ -1060,6 +1069,7 @@ static void cleanup(struct sr_input *in) { struct context *inc; struct context_options save_opts; + GSList *save_channels; if (!in) return; @@ -1077,8 +1087,10 @@ static void cleanup(struct sr_input *in) /* Clear internal state, but keep what .init() has provided. */ save_opts = inc->options; + save_channels = inc->module_state.prev_channels; memset(inc, 0, sizeof(*inc)); inc->options = save_opts; + inc->module_state.prev_channels = save_channels; } static int reset(struct sr_input *in) @@ -1097,6 +1109,7 @@ static int reset(struct sr_input *in) */ cleanup(in); in->sdi->channels = inc->module_state.prev_channels; + inc->module_state.prev_channels = NULL; inc->module_state.got_header = FALSE; inc->module_state.header_sent = FALSE;