]> sigrok.org Git - libsigrok.git/blobdiff - session_file.c
Doxygen: Initial groups and topic short descriptions.
[libsigrok.git] / session_file.c
index 0d455971fa4f1306310b6ceffe23e6f646eec397..b9c3ad8bfec4747a13a749f6e6e6a90d4c6d1ed4 100644 (file)
 #include "libsigrok.h"
 #include "libsigrok-internal.h"
 
+/**
+ * @ingroup grp_device
+ *
+ * @{
+ */
+
 extern struct sr_session *session;
 extern SR_PRIV struct sr_dev_driver session_driver;
 
@@ -48,9 +54,9 @@ SR_API int sr_session_load(const char *filename)
        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) {
@@ -65,16 +71,22 @@ SR_API int sr_session_load(const char *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) {
@@ -134,7 +146,7 @@ SR_API int sr_session_load(const char *filename)
                                        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);
@@ -144,13 +156,15 @@ SR_API int sr_session_load(const char *filename)
                                                continue;
                                        enabled_probes++;
                                        tmp_u64 = strtoul(keys[j]+5, NULL, 10);
-                                       sr_dev_probe_name_set(sdi, 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);
+                       /* Disable probes not specifically listed. */
                        for (p = enabled_probes; p < total_probes; p++)
                                sr_dev_probe_enable(sdi, p, FALSE);
                }
@@ -167,21 +181,22 @@ SR_API int sr_session_load(const char *filename)
  *
  * @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) {
@@ -212,66 +227,57 @@ int sr_session_save(const char *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)))
@@ -289,3 +295,5 @@ int sr_session_save(const char *filename)
 
        return SR_OK;
 }
+
+/** @} */