]> sigrok.org Git - libsigrok.git/blobdiff - session_driver.c
A few more random 'probe' to 'channel' changes.
[libsigrok.git] / session_driver.c
index 8090df9d84a427308bd3c7cc635899686c78862b..fe0db3e6e0acbbf0ad5b808e4321b11fe8a48d35 100644 (file)
 #include "libsigrok.h"
 #include "libsigrok-internal.h"
 
-/* Message logging helpers with subsystem-specific prefix string. */
-#define LOG_PREFIX "virtual-session: "
-#define sr_log(l, s, args...) sr_log(l, LOG_PREFIX s, ## args)
-#define sr_spew(s, args...) sr_spew(LOG_PREFIX s, ## args)
-#define sr_dbg(s, args...) sr_dbg(LOG_PREFIX s, ## args)
-#define sr_info(s, args...) sr_info(LOG_PREFIX s, ## args)
-#define sr_warn(s, args...) sr_warn(LOG_PREFIX s, ## args)
-#define sr_err(s, args...) sr_err(LOG_PREFIX s, ## args)
+#define LOG_PREFIX "virtual-session"
 
 /* size of payloads sent across the session bus */
 /** @cond PRIVATE */
@@ -48,15 +41,16 @@ struct session_vdev {
        int bytes_read;
        uint64_t samplerate;
        int unitsize;
-       int num_probes;
+       int num_channels;
        int cur_chunk;
+       gboolean finished;
 };
 
 static GSList *dev_insts = NULL;
 static const int hwcaps[] = {
        SR_CONF_CAPTUREFILE,
        SR_CONF_CAPTURE_UNITSIZE,
-       0,
+       SR_CONF_SAMPLERATE,
 };
 
 static int receive_data(int fd, int revents, void *cb_data)
@@ -77,15 +71,11 @@ static int receive_data(int fd, int revents, void *cb_data)
        got_data = FALSE;
        for (l = dev_insts; l; l = l->next) {
                sdi = l->data;
-               if (!(vdev = sdi->priv))
+               vdev = sdi->priv;
+               if (vdev->finished)
                        /* Already done with this instance. */
                        continue;
 
-               if (!(buf = g_try_malloc(CHUNKSIZE))) {
-                       sr_err("%s: buf malloc failed", __func__);
-                       return FALSE;
-               }
-
                if (!vdev->capfile) {
                        /* No capture file opened yet, or finished with the last
                         * chunked one. */
@@ -125,16 +115,23 @@ static int receive_data(int fd, int revents, void *cb_data)
                                        sr_dbg("Opened %s.", capturefile);
                                } else {
                                        /* We got all the chunks, finish up. */
-                                       g_free(vdev->capturefile);
-                                       g_free(vdev);
-                                       sdi->priv = NULL;
+                                       vdev->finished = TRUE;
                                        continue;
                                }
                        }
                }
 
-               ret = zip_fread(vdev->capfile, buf, CHUNKSIZE);
+               if (!(buf = g_try_malloc(CHUNKSIZE))) {
+                       sr_err("%s: buf malloc failed", __func__);
+                       return FALSE;
+               }
+
+               ret = zip_fread(vdev->capfile, buf,
+                               CHUNKSIZE / vdev->unitsize * vdev->unitsize);
                if (ret > 0) {
+                       if (ret % vdev->unitsize != 0)
+                               sr_warn("Read size %d not a multiple of the"
+                                       " unit size %d.", ret, vdev->unitsize);
                        got_data = TRUE;
                        packet.type = SR_DF_LOGIC;
                        packet.payload = &logic;
@@ -149,15 +146,15 @@ static int receive_data(int fd, int revents, void *cb_data)
                        vdev->capfile = NULL;
                        if (vdev->cur_chunk == 0) {
                                /* It was the only file. */
-                               g_free(vdev->capturefile);
-                               g_free(vdev);
-                               sdi->priv = NULL;
+                               vdev->finished = TRUE;
                        } else {
                                /* There might be more chunks, so don't fall through
                                 * to the SR_DF_END here. */
+                               g_free(buf);
                                return TRUE;
                        }
                }
+               g_free(buf);
        }
 
        if (!got_data) {
@@ -178,7 +175,7 @@ static int init(struct sr_context *sr_ctx)
        return SR_OK;
 }
 
-static int cleanup(void)
+static int dev_clear(void)
 {
        GSList *l;
 
@@ -192,20 +189,34 @@ static int cleanup(void)
 
 static int dev_open(struct sr_dev_inst *sdi)
 {
-       if (!(sdi->priv = g_try_malloc0(sizeof(struct session_vdev)))) {
-               sr_err("Device context malloc failed.");
-               return SR_ERR_MALLOC;
-       }
+       struct session_vdev *vdev;
 
+       vdev = g_try_malloc0(sizeof(struct session_vdev));
+       sdi->priv = vdev;
        dev_insts = g_slist_append(dev_insts, sdi);
 
        return SR_OK;
 }
 
-static int config_get(int id, GVariant **data, const struct sr_dev_inst *sdi)
+static int dev_close(struct sr_dev_inst *sdi)
+{
+       const struct session_vdev *const vdev = sdi->priv;
+       g_free(vdev->sessionfile);
+       g_free(vdev->capturefile);
+
+       g_free(sdi->priv);
+       sdi->priv = NULL;
+
+       return SR_OK;
+}
+
+static int config_get(int id, GVariant **data, const struct sr_dev_inst *sdi,
+               const struct sr_channel_group *cg)
 {
        struct session_vdev *vdev;
 
+       (void)cg;
+
        switch (id) {
        case SR_CONF_SAMPLERATE:
                if (sdi) {
@@ -221,10 +232,13 @@ static int config_get(int id, GVariant **data, const struct sr_dev_inst *sdi)
        return SR_OK;
 }
 
-static int config_set(int id, GVariant *data, const struct sr_dev_inst *sdi)
+static int config_set(int id, GVariant *data, const struct sr_dev_inst *sdi,
+               const struct sr_channel_group *cg)
 {
        struct session_vdev *vdev;
 
+       (void)cg;
+
        vdev = sdi->priv;
 
        switch (id) {
@@ -233,18 +247,20 @@ static int config_set(int id, GVariant *data, const struct sr_dev_inst *sdi)
                sr_info("Setting samplerate to %" PRIu64 ".", vdev->samplerate);
                break;
        case SR_CONF_SESSIONFILE:
+               g_free(vdev->sessionfile);
                vdev->sessionfile = g_strdup(g_variant_get_string(data, NULL));
                sr_info("Setting sessionfile to '%s'.", vdev->sessionfile);
                break;
        case SR_CONF_CAPTUREFILE:
+               g_free(vdev->capturefile);
                vdev->capturefile = g_strdup(g_variant_get_string(data, NULL));
                sr_info("Setting capturefile to '%s'.", vdev->capturefile);
                break;
        case SR_CONF_CAPTURE_UNITSIZE:
                vdev->unitsize = g_variant_get_uint64(data);
                break;
-       case SR_CONF_CAPTURE_NUM_PROBES:
-               vdev->num_probes = g_variant_get_uint64(data);
+       case SR_CONF_NUM_LOGIC_CHANNELS:
+               vdev->num_channels = g_variant_get_uint64(data);
                break;
        default:
                return SR_ERR_NA;
@@ -253,10 +269,11 @@ static int config_set(int id, GVariant *data, const struct sr_dev_inst *sdi)
        return SR_OK;
 }
 
-static int config_list(int key, GVariant **data, const struct sr_dev_inst *sdi)
+static int config_list(int key, GVariant **data, const struct sr_dev_inst *sdi,
+               const struct sr_channel_group *cg)
 {
-
        (void)sdi;
+       (void)cg;
 
        switch (key) {
        case SR_CONF_DEVICE_OPTIONS:
@@ -277,12 +294,16 @@ static int dev_acquisition_start(const struct sr_dev_inst *sdi, void *cb_data)
 
        vdev = sdi->priv;
 
+       vdev->bytes_read = 0;
+       vdev->cur_chunk = 0;
+       vdev->finished = FALSE;
+
        sr_info("Opening archive %s file %s", vdev->sessionfile,
                vdev->capturefile);
 
        if (!(vdev->archive = zip_open(vdev->sessionfile, 0, &ret))) {
                sr_err("Failed to open session file '%s': "
-                      "zip error %d\n", vdev->sessionfile, ret);
+                      "zip error %d.", vdev->sessionfile, ret);
                return SR_ERR;
        }
 
@@ -301,15 +322,15 @@ SR_PRIV struct sr_dev_driver session_driver = {
        .longname = "Session-emulating driver",
        .api_version = 1,
        .init = init,
-       .cleanup = cleanup,
+       .cleanup = dev_clear,
        .scan = NULL,
        .dev_list = NULL,
-       .dev_clear = NULL,
+       .dev_clear = dev_clear,
        .config_get = config_get,
        .config_set = config_set,
        .config_list = config_list,
        .dev_open = dev_open,
-       .dev_close = NULL,
+       .dev_close = dev_close,
        .dev_acquisition_start = dev_acquisition_start,
        .dev_acquisition_stop = NULL,
        .priv = NULL,