- analog = packet->payload;
- num_probes = g_slist_length(analog->probes);
- if (!(values = malloc(sizeof(value_t) * num_probes))) {
- ERROR("malloc() failed.");
- return;
- }
- for (s = 0; s < analog->num_samples; s++) {
- for (p = 0; p < num_probes; p++) {
- values[s + p].gauge = analog->data[s + p];
- }
- }
- vl.values = values;
- vl.values_len = num_probes;
- sstrncpy(vl.host, hostname_g, sizeof(vl.host));
- sstrncpy(vl.plugin, "sigrok", sizeof(vl.plugin));
- ssnprintf(vl.plugin_instance, sizeof(vl.plugin_instance),
- "%s", cfdev->name);
- sstrncpy(vl.type, "gauge", sizeof(vl.type));
- plugin_dispatch_values(&vl);
-
- cfdev->last_dispatch = cdtime();
+ if (packet->type != SR_DF_ANALOG)
+ return;
+
+ if ((cfdev->min_dispatch_interval != 0)
+ && ((cdtime() - cfdev->last_dispatch)
+ < cfdev->min_dispatch_interval))
+ return;
+
+ /* Ignore all but the first sample on the first probe. */
+ analog = packet->payload;
+ value.gauge = analog->data[0];
+ vl.values = &value;
+ vl.values_len = 1;
+ sstrncpy(vl.host, hostname_g, sizeof(vl.host));
+ sstrncpy(vl.plugin, "sigrok", sizeof(vl.plugin));
+ ssnprintf(vl.plugin_instance, sizeof(vl.plugin_instance),
+ "%s", cfdev->name);
+ sstrncpy(vl.type, sigrok_value_type(analog), sizeof(vl.type));
+
+ plugin_dispatch_values(&vl);
+ cfdev->last_dispatch = cdtime();
+}
+
+static void sigrok_free_drvopts(struct sr_config *src)
+{
+ g_variant_unref(src->data);
+ g_free(src);
+}
+
+static int sigrok_init_driver(struct config_device *cfdev,
+ struct sr_dev_driver *drv)
+{
+ struct sr_config *src;
+ GSList *devlist, *drvopts;
+ char hwident[512];
+
+ if (sr_driver_init(sr_ctx, drv) != SR_OK)
+ /* Error was logged by libsigrok. */
+ return -1;
+
+ drvopts = NULL;
+ if (cfdev->conn) {
+ if (!(src = malloc(sizeof(struct sr_config))))
+ return -1;
+ src->key = SR_CONF_CONN;
+ src->data = g_variant_new_string(cfdev->conn);
+ drvopts = g_slist_append(drvopts, src);
+ }
+ if (cfdev->serialcomm) {
+ if (!(src = malloc(sizeof(struct sr_config))))
+ return -1;
+ src->key = SR_CONF_SERIALCOMM;
+ src->data = g_variant_new_string(cfdev->serialcomm);
+ drvopts = g_slist_append(drvopts, src);
+ }
+ devlist = sr_driver_scan(drv, drvopts);
+ g_slist_free_full(drvopts, (GDestroyNotify)sigrok_free_drvopts);
+ if (!devlist) {
+ /* Not an error, but the user should know about it. */
+ WARNING("sigrok plugin: No device found for \"%s\".",
+ cfdev->name);
+ return 0;