X-Git-Url: https://sigrok.org/gitweb/?a=blobdiff_plain;f=session_driver.c;h=69a53c6867102903fb22bee900b3eec652b348c9;hb=ecaa89af0e01f9c3f585e82eb849bf616bff22cf;hp=4c7082cac00b3de4257a7014b5008e1c84b091fa;hpb=016f2e005ddbc604594c863dca8a89212bf46a5c;p=libsigrok.git diff --git a/session_driver.c b/session_driver.c index 4c7082ca..69a53c68 100644 --- a/session_driver.c +++ b/session_driver.c @@ -26,14 +26,7 @@ #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 */ @@ -50,13 +43,14 @@ struct session_vdev { int unitsize; int num_probes; 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,7 +71,8 @@ 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; @@ -121,8 +116,7 @@ static int receive_data(int fd, int revents, void *cb_data) } else { /* We got all the chunks, finish up. */ g_free(vdev->capturefile); - g_free(vdev); - sdi->priv = NULL; + vdev->finished = TRUE; continue; } } @@ -133,8 +127,12 @@ static int receive_data(int fd, int revents, void *cb_data) return FALSE; } - ret = zip_fread(vdev->capfile, buf, CHUNKSIZE); + 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; @@ -150,8 +148,7 @@ static int receive_data(int fd, int revents, void *cb_data) 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. */ @@ -180,7 +177,7 @@ static int init(struct sr_context *sr_ctx) return SR_OK; } -static int cleanup(void) +static int dev_clear(void) { GSList *l; @@ -194,16 +191,23 @@ 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 dev_close(struct sr_dev_inst *sdi) +{ + 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_probe_group *probe_group) { @@ -251,7 +255,7 @@ static int config_set(int id, GVariant *data, const struct sr_dev_inst *sdi, case SR_CONF_CAPTURE_UNITSIZE: vdev->unitsize = g_variant_get_uint64(data); break; - case SR_CONF_CAPTURE_NUM_PROBES: + case SR_CONF_NUM_LOGIC_PROBES: vdev->num_probes = g_variant_get_uint64(data); break; default: @@ -291,7 +295,7 @@ static int dev_acquisition_start(const struct sr_dev_inst *sdi, void *cb_data) 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; } @@ -310,15 +314,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,