struct zip_stat zs;
struct sr_dev_inst *sdi;
struct sr_probe *probe;
- int ret, probenum, devcnt, i, j;
+ int ret, probenum, devcnt, version, i, j;
uint64_t tmp_u64, total_probes, enabled_probes, p;
- char **sections, **keys, *metafile, *val, c;
+ char **sections, **keys, *metafile, *val, s[11];
char probename[SR_MAX_PROBENAME_LEN + 1];
if (!filename) {
}
/* check "version" */
+ version = 0;
if (!(zf = zip_fopen(archive, "version", 0))) {
sr_dbg("session file: Not a sigrok session file.");
return SR_ERR;
}
- ret = zip_fread(zf, &c, 1);
- if (ret != 1 || c != '1') {
+ if ((ret = zip_fread(zf, s, 10)) == -1) {
sr_dbg("session file: Not a valid sigrok session file.");
return SR_ERR;
}
zip_fclose(zf);
+ s[ret] = 0;
+ version = strtoull(s, NULL, 10);
+ if (version != 1) {
+ sr_dbg("session file: Not a valid sigrok session file version.");
+ return SR_ERR;
+ }
/* read "metadata" */
if (zip_stat(archive, "metadata", 0, &zs) == -1) {
sdi->driver->dev_config_set(sdi, SR_HWCAP_CAPTURE_NUM_PROBES, &total_probes);
for (p = 0; p < total_probes; p++) {
snprintf(probename, SR_MAX_PROBENAME_LEN, "%" PRIu64, p);
- if (!(probe = sr_probe_new(j, SR_PROBE_LOGIC, TRUE,
+ if (!(probe = sr_probe_new(p, SR_PROBE_LOGIC, TRUE,
probename)))
return SR_ERR;
sdi->probes = g_slist_append(sdi->probes, probe);
continue;
enabled_probes++;
tmp_u64 = strtoul(keys[j]+5, NULL, 10);
- sr_dev_probe_name_set(dev, tmp_u64, val);
+ /* sr_session_save() */
+ sr_dev_probe_name_set(sdi, tmp_u64 - 1, val);
} else if (!strncmp(keys[j], "trigger", 7)) {
probenum = strtoul(keys[j]+7, NULL, 10);
sr_dev_trigger_set(sdi, probenum, val);
}
}
g_strfreev(keys);
- for (p = enabled_probes; p < total_probes; p++) {
- probe = g_slist_nth_data(dev->probes, p);
- probe->enabled = FALSE;
- }
+ /* Disable probes not specifically listed. */
+ for (p = enabled_probes; p < total_probes; p++)
+ sr_dev_probe_enable(sdi, p, FALSE);
}
devcnt++;
}
*
* @param filename The name of the file where to save the current session.
* Must not be NULL.
+ * @param sdi The device instance from which the data was captured.
+ * @param ds The datastore where the session's captured data was stored.
*
* @return SR_OK upon success, SR_ERR_ARG upon invalid arguments, or SR_ERR
* upon other errors.
*/
-int sr_session_save(const char *filename)
+SR_API int sr_session_save(const char *filename,
+ const struct sr_dev_inst *sdi, struct sr_datastore *ds)
{
- GSList *l, *p, *d;
+ GSList *l, *d;
FILE *meta;
- struct sr_dev_inst *sdi;
struct sr_probe *probe;
- struct sr_datastore *ds;
struct zip *zipfile;
struct zip_source *versrc, *metasrc, *logicsrc;
- int bufcnt, devcnt, tmpfile, ret, probecnt;
- uint64_t samplerate;
+ int bufcnt, tmpfile, ret, probecnt;
+ uint64_t *samplerate;
char version[1], rawname[16], metafile[32], *buf, *s;
if (!filename) {
meta = g_fopen(metafile, "wb");
fprintf(meta, "[global]\n");
fprintf(meta, "sigrok version = %s\n", PACKAGE_VERSION);
- /* TODO: save protocol decoders used */
- /* all datastores in all devices */
- devcnt = 1;
- for (l = session->devs; l; l = l->next) {
- dev = l->data;
- /* metadata */
- fprintf(meta, "[device %d]\n", devcnt);
- if (dev->driver)
- fprintf(meta, "driver = %s\n", dev->driver->name);
+ /* metadata */
+ fprintf(meta, "[device 1]\n");
+ if (sdi->driver)
+ fprintf(meta, "driver = %s\n", sdi->driver->name);
- ds = dev->datastore;
- if (ds) {
- /* metadata */
- fprintf(meta, "capturefile = logic-%d\n", devcnt);
- fprintf(meta, "unitsize = %d\n", ds->ds_unitsize);
- fprintf(meta, "total probes = %d\n", g_slist_length(dev->probes));
- if (sr_dev_has_hwcap(dev, SR_HWCAP_SAMPLERATE)) {
- samplerate = *((uint64_t *) dev->driver->dev_info_get(
- dev->driver_index, SR_DI_CUR_SAMPLERATE));
- s = sr_samplerate_string(samplerate);
- fprintf(meta, "samplerate = %s\n", s);
- g_free(s);
- }
- probecnt = 1;
- for (p = dev->probes; p; p = p->next) {
- probe = p->data;
- if (probe->enabled) {
- if (probe->name)
- fprintf(meta, "probe%d = %s\n", probecnt, probe->name);
- if (probe->trigger)
- fprintf(meta, " trigger%d = %s\n", probecnt, probe->trigger);
- probecnt++;
- }
- }
+ /* metadata */
+ fprintf(meta, "capturefile = logic-1\n");
+ fprintf(meta, "unitsize = %d\n", ds->ds_unitsize);
+ fprintf(meta, "total probes = %d\n", g_slist_length(sdi->probes));
+ if (sr_dev_has_hwcap(sdi, SR_HWCAP_SAMPLERATE)) {
+ if (sr_info_get(sdi->driver, SR_DI_CUR_SAMPLERATE,
+ (const void **)&samplerate, sdi) == SR_OK) {
+ s = sr_samplerate_string(*samplerate);
+ fprintf(meta, "samplerate = %s\n", s);
+ g_free(s);
+ }
+ }
+ probecnt = 1;
+ for (l = sdi->probes; l; l = l->next) {
+ probe = l->data;
+ if (probe->enabled) {
+ if (probe->name)
+ fprintf(meta, "probe%d = %s\n", probecnt, probe->name);
+ if (probe->trigger)
+ fprintf(meta, " trigger%d = %s\n", probecnt, probe->trigger);
+ probecnt++;
+ }
+ }
- /* dump datastore into logic-n */
- buf = g_try_malloc(ds->num_units * ds->ds_unitsize +
- DATASTORE_CHUNKSIZE);
- if (!buf) {
- sr_err("session file: %s: buf malloc failed",
- __func__);
- return SR_ERR_MALLOC;
- }
+ /* dump datastore into logic-n */
+ buf = g_try_malloc(ds->num_units * ds->ds_unitsize +
+ DATASTORE_CHUNKSIZE);
+ if (!buf) {
+ sr_err("session file: %s: buf malloc failed",
+ __func__);
+ return SR_ERR_MALLOC;
+ }
- bufcnt = 0;
- for (d = ds->chunklist; d; d = d->next) {
- memcpy(buf + bufcnt, d->data,
- DATASTORE_CHUNKSIZE);
- bufcnt += DATASTORE_CHUNKSIZE;
- }
- if (!(logicsrc = zip_source_buffer(zipfile, buf,
- ds->num_units * ds->ds_unitsize, TRUE)))
- return SR_ERR;
- snprintf(rawname, 15, "logic-%d", devcnt);
- if (zip_add(zipfile, rawname, logicsrc) == -1)
- return SR_ERR;
- }
- devcnt++;
+ bufcnt = 0;
+ for (d = ds->chunklist; d; d = d->next) {
+ memcpy(buf + bufcnt, d->data,
+ DATASTORE_CHUNKSIZE);
+ bufcnt += DATASTORE_CHUNKSIZE;
}
+ if (!(logicsrc = zip_source_buffer(zipfile, buf,
+ ds->num_units * ds->ds_unitsize, TRUE)))
+ return SR_ERR;
+ snprintf(rawname, 15, "logic-1");
+ if (zip_add(zipfile, rawname, logicsrc) == -1)
+ return SR_ERR;
fclose(meta);
if (!(metasrc = zip_source_file(zipfile, metafile, 0, -1)))